The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
Changes 2364
MANIFEST 028
META.yml 23
Makefile.PL 02
README 5760
arg_files/exif2iptc.args 15
arg_files/exif2xmp.args 17
arg_files/gps2xmp.args 15
arg_files/iptc2exif.args 04
arg_files/iptc2xmp.args 15
arg_files/pdf2xmp.args 04
arg_files/xmp2exif.args 17
arg_files/xmp2gps.args 15
arg_files/xmp2iptc.args 114
arg_files/xmp2pdf.args 04
config_files/ExifTool_config 646
exiftool 329458
fmt_files/gpx.fmt 02
fmt_files/gpx_wpt.fmt 02
fmt_files/kml.fmt 02
html/ExifTool.html 264300
html/Shift.html 11
html/TagNames/AFCP.html 15
html/TagNames/APE.html 22
html/TagNames/ASF.html 188179
html/TagNames/Apple.html 069
html/TagNames/Canon.html 59335
html/TagNames/Composite.html 1125
html/TagNames/DNG.html 511
html/TagNames/DPX.html 0190
html/TagNames/DarwinCore.html 175215
html/TagNames/DjVu.html 23
html/TagNames/EXIF.html 132148
html/TagNames/Extra.html 1733
html/TagNames/FLIR.html 18639
html/TagNames/FujiFilm.html 1295
html/TagNames/GPS.html 58
html/TagNames/GeoTiff.html 3037
html/TagNames/H264.html 3844
html/TagNames/ID3.html 1963
html/TagNames/IPTC.html 33
html/TagNames/JFIF.html 55
html/TagNames/JPEG.html 36112
html/TagNames/Jpeg2000.html 33
html/TagNames/MWG.html 452
html/TagNames/MXF.html 22
html/TagNames/Microsoft.html 33
html/TagNames/Minolta.html 2950
html/TagNames/Nikon.html 71119
html/TagNames/Olympus.html 229310
html/TagNames/PDF.html 66
html/TagNames/PNG.html 3245
html/TagNames/Panasonic.html 62305
html/TagNames/PanasonicRaw.html 162
html/TagNames/Pentax.html 206406
html/TagNames/Photoshop.html 297
html/TagNames/QuickTime.html 73544
html/TagNames/RIFF.html 1320
html/TagNames/Ricoh.html 7306
html/TagNames/Samsung.html 473
html/TagNames/Scalado.html 045
html/TagNames/Shortcuts.html 619
html/TagNames/Sony.html 4242146
html/TagNames/Torrent.html 0187
html/TagNames/XMP.html 3861151
html/TagNames/index.html 1830
html/ancient_history.html 1402
html/config.html 60100
html/data_members.html 111
html/exiftool_pod.html 136191
html/faq.html 2984
html/filename.html 1124
html/geotag.html 917
html/history.html 324320
html/htmldump.html 67
html/idiosyncracies.html 3042
html/index.html 241270
html/install.html 28
html/metafiles.html 4884
html/standards.html 17
html/under.html 39
lib/File/RandomAccess.pm 11
lib/File/RandomAccess.pod 22
lib/Image/ExifTool/AES.pm 11
lib/Image/ExifTool/AFCP.pm 1620
lib/Image/ExifTool/AIFF.pm 1818
lib/Image/ExifTool/APE.pm 2020
lib/Image/ExifTool/APP12.pm 2222
lib/Image/ExifTool/ASF.pm 91104
lib/Image/ExifTool/Apple.pm 0113
lib/Image/ExifTool/BMP.pm 55
lib/Image/ExifTool/BZZ.pm 11
lib/Image/ExifTool/BigTIFF.pm 3737
lib/Image/ExifTool/BuildTagLookup.pm 4384
lib/Image/ExifTool/Canon.pm 112398
lib/Image/ExifTool/CanonCustom.pm 3838
lib/Image/ExifTool/CanonRaw.pm 3131
lib/Image/ExifTool/CanonVRD.pm 7676
lib/Image/ExifTool/CaptureOne.pm 1919
lib/Image/ExifTool/Casio.pm 22
lib/Image/ExifTool/Charset.pm 1414
lib/Image/ExifTool/DICOM.pm 1958
lib/Image/ExifTool/DNG.pm 8787
lib/Image/ExifTool/DPX.pm 0151
lib/Image/ExifTool/DV.pm 77
lib/Image/ExifTool/DarwinCore.pm 712
lib/Image/ExifTool/DjVu.pm 1619
lib/Image/ExifTool/EXE.pm 4848
lib/Image/ExifTool/Exif.pm 140216
lib/Image/ExifTool/FLAC.pm 1515
lib/Image/ExifTool/FLIR.pm 83862
lib/Image/ExifTool/Fixup.pm 11
lib/Image/ExifTool/Flash.pm 4343
lib/Image/ExifTool/FlashPix.pm 9898
lib/Image/ExifTool/Font.pm 4747
lib/Image/ExifTool/FotoStation.pm 2122
lib/Image/ExifTool/FujiFilm.pm 57127
lib/Image/ExifTool/GE.pm 11
lib/Image/ExifTool/GIF.pm 3333
lib/Image/ExifTool/GIMP.pm 1212
lib/Image/ExifTool/GPS.pm 47
lib/Image/ExifTool/GeoTiff.pm 2540
lib/Image/ExifTool/Geotag.pm 6972
lib/Image/ExifTool/H264.pm 4862
lib/Image/ExifTool/HP.pm 1010
lib/Image/ExifTool/HTML.pm 1818
lib/Image/ExifTool/HtmlDump.pm 1111
lib/Image/ExifTool/ICC_Profile.pm 4949
lib/Image/ExifTool/ID3.pm 96142
lib/Image/ExifTool/IPTC.pm 4041
lib/Image/ExifTool/ITC.pm 1212
lib/Image/ExifTool/Import.pm 27
lib/Image/ExifTool/InDesign.pm 1919
lib/Image/ExifTool/JPEG.pm 7376
lib/Image/ExifTool/JPEGDigest.pm 66
lib/Image/ExifTool/JVC.pm 99
lib/Image/ExifTool/Jpeg2000.pm 5951
lib/Image/ExifTool/Kodak.pm 1616
lib/Image/ExifTool/KyoceraRaw.pm 55
lib/Image/ExifTool/LNK.pm 2525
lib/Image/ExifTool/Lang/cs.pm 11
lib/Image/ExifTool/Lang/de.pm 11
lib/Image/ExifTool/Lang/en_ca.pm 11
lib/Image/ExifTool/Lang/en_gb.pm 11
lib/Image/ExifTool/Lang/es.pm 12
lib/Image/ExifTool/Lang/fi.pm 11
lib/Image/ExifTool/Lang/fr.pm 321
lib/Image/ExifTool/Lang/it.pm 12
lib/Image/ExifTool/Lang/ja.pm 11
lib/Image/ExifTool/Lang/ko.pm 11
lib/Image/ExifTool/Lang/nl.pm 1212
lib/Image/ExifTool/Lang/pl.pm 230
lib/Image/ExifTool/Lang/ru.pm 11
lib/Image/ExifTool/Lang/sv.pm 11
lib/Image/ExifTool/Lang/tr.pm 11
lib/Image/ExifTool/Lang/zh_cn.pm 11
lib/Image/ExifTool/Lang/zh_tw.pm 11
lib/Image/ExifTool/Leaf.pm 1212
lib/Image/ExifTool/M2TS.pm 6157
lib/Image/ExifTool/MIE.pm 9898
lib/Image/ExifTool/MIEUnits.pod 11
lib/Image/ExifTool/MIFF.pm 1818
lib/Image/ExifTool/MNG.pm 11
lib/Image/ExifTool/MPC.pm 1212
lib/Image/ExifTool/MPEG.pm 2929
lib/Image/ExifTool/MPF.pm 2326
lib/Image/ExifTool/MWG.pm 3749
lib/Image/ExifTool/MXF.pm 4848
lib/Image/ExifTool/MakerNotes.pm 72138
lib/Image/ExifTool/Matroska.pm 2828
lib/Image/ExifTool/Microsoft.pm 1212
lib/Image/ExifTool/Minolta.pm 5097
lib/Image/ExifTool/MinoltaRaw.pm 1818
lib/Image/ExifTool/Nikon.pm 75119
lib/Image/ExifTool/NikonCapture.pm 3030
lib/Image/ExifTool/NikonCustom.pm 11
lib/Image/ExifTool/OOXML.pm 2121
lib/Image/ExifTool/Ogg.pm 2020
lib/Image/ExifTool/Olympus.pm 13113
lib/Image/ExifTool/OpenEXR.pm 1717
lib/Image/ExifTool/PDF.pm 134134
lib/Image/ExifTool/PGF.pm 88
lib/Image/ExifTool/PICT.pm 1919
lib/Image/ExifTool/PLIST.pm 4347
lib/Image/ExifTool/PNG.pm 104166
lib/Image/ExifTool/PPM.pm 1212
lib/Image/ExifTool/PSP.pm 1515
lib/Image/ExifTool/Panasonic.pm 68354
lib/Image/ExifTool/PanasonicRaw.pm 4480
lib/Image/ExifTool/Pentax.pm 95402
lib/Image/ExifTool/PhaseOne.pm 3737
lib/Image/ExifTool/PhotoCD.pm 55
lib/Image/ExifTool/PhotoMechanic.pm 1313
lib/Image/ExifTool/Photoshop.pm 3567
lib/Image/ExifTool/PostScript.pm 3838
lib/Image/ExifTool/PrintIM.pm 1111
lib/Image/ExifTool/Qualcomm.pm 66
lib/Image/ExifTool/QuickTime.pm 308911
lib/Image/ExifTool/README 3443
lib/Image/ExifTool/RIFF.pm 3343
lib/Image/ExifTool/RSRC.pm 1616
lib/Image/ExifTool/RTF.pm 1616
lib/Image/ExifTool/Radiance.pm 1010
lib/Image/ExifTool/Rawzor.pm 2121
lib/Image/ExifTool/Real.pm 4444
lib/Image/ExifTool/Reconyx.pm 11
lib/Image/ExifTool/Ricoh.pm 36335
lib/Image/ExifTool/Samsung.pm 1899
lib/Image/ExifTool/Sanyo.pm 11
lib/Image/ExifTool/Scalado.pm 0141
lib/Image/ExifTool/Shift.pl 11
lib/Image/ExifTool/Shortcuts.pm 723
lib/Image/ExifTool/Sigma.pm 11
lib/Image/ExifTool/SigmaRaw.pm 5757
lib/Image/ExifTool/Sony.pm 4622212
lib/Image/ExifTool/SonyIDC.pm 1010
lib/Image/ExifTool/Stim.pm 11
lib/Image/ExifTool/TagInfoXML.pm 79
lib/Image/ExifTool/TagLookup.pm 37604265
lib/Image/ExifTool/TagNames.pod 57127071
lib/Image/ExifTool/Theora.pm 11
lib/Image/ExifTool/Torrent.pm 0317
lib/Image/ExifTool/Unknown.pm 11
lib/Image/ExifTool/Vorbis.pm 66
lib/Image/ExifTool/WriteCanonRaw.pl 5252
lib/Image/ExifTool/WriteExif.pl 297356
lib/Image/ExifTool/WriteIPTC.pl 5050
lib/Image/ExifTool/WritePDF.pl 4046
lib/Image/ExifTool/WritePNG.pl 4389
lib/Image/ExifTool/WritePhotoshop.pl 2828
lib/Image/ExifTool/WritePostScript.pl 4848
lib/Image/ExifTool/WriteQuickTime.pl 0344
lib/Image/ExifTool/WriteXMP.pl 125126
lib/Image/ExifTool/Writer.pl 404531
lib/Image/ExifTool/XMP.pm 134361
lib/Image/ExifTool/XMP2.pl 714
lib/Image/ExifTool/XMPStruct.pl 5354
lib/Image/ExifTool/ZIP.pm 5555
lib/Image/ExifTool/iWork.pm 1919
lib/Image/ExifTool.pm 578728
lib/Image/ExifTool.pod 140197
perl-Image-ExifTool.spec 4143
t/ASF_2.out 39
t/CanonRaw_4.out 78
t/CanonRaw_7.out 67
t/CanonVRD_5.out 11
t/CanonVRD_9.out 11
t/Canon_2.out 34
t/DPX.t 028
t/DPX_2.out 035
t/ExifTool_2.out 621
t/ExifTool_25.out 01
t/FLIR_2.out 415
t/FLIR_3.out 55
t/FujiFilm_4.out 13
t/GeoTiff.t 118
t/GeoTiff_4.out 011
t/Geotag.t 118
t/Geotag_9.out 07
t/M2TS_2.out 55
t/MWG.t 321
t/MWG_3.out 03
t/MWG_4.out 02
t/MWG_5.out 23
t/MWG_6.out 02
t/Nikon_4.out 67
t/Olympus_4.out 44
t/Olympus_5.out 55
t/PNG.t 131
t/PNG_5.out 017
t/Panasonic_4.out 315
t/Panasonic_5.out 1717
t/Pentax_2.out 45
t/Pentax_3.out 56
t/Pentax_4.out 37
t/Photoshop_3.out 77
t/QuickTime.t 124
t/QuickTime_2.out 811
t/QuickTime_3.out 811
t/QuickTime_4.out 016
t/QuickTime_5.out 012
t/Torrent.t 028
t/Torrent_2.out 031
t/Writer.t 2103
t/Writer_10.out 79
t/Writer_46.out 68
t/Writer_51.out 0401
t/Writer_52.out 022
t/Writer_53.out 033
t/Writer_54.out 02
t/Writer_55.out 07
t/Writer_56.out 04
t/Writer_9.out 67
t/XMP_21.out 12
t/XMP_22.out 12
t/XMP_41.out 611
t/images/DPX.dpx --
t/images/ExifTool.jpg --
t/images/Geotag.kml 055
t/images/QuickTime.m4a --
t/images/QuickTime.mov --
t/images/RIFF.wav --
t/images/Torrent.torrent 01
303 files changed (This is a version diff) 2003237053
@@ -4,9 +4,370 @@ ExifTool Version History
 
 RSS feed: http://owl.phy.queensu.ca/~phil/exiftool/rss.xml
 
-Note: The most recent production release is Version 9.27. (Other versions are
+Note: The most recent production release is Version 9.53. (Other versions are
 considered development releases, and are not uploaded to CPAN.)
 
+Feb. 22, 2014 - Version 9.53 (production release)
+
+  - Added user-defined file types feature
+  - Added support for a few more XMP-expressionmedia tags
+  - Decode CameraTemperature from a few new Canon models
+  - Decode another Sony tag (thanks Jos Roost)
+  - Recognize the JXR extension
+  - Changed wording of IPTC "Unrecognized data" warning
+  - Patched round-off error problem in seconds of some date/time values
+  - Fixed problem creating EXV files with the -o option
+  - Fixed problem conditionally replacing Extra block-type tags
+
+Feb. 17, 2014 - Version 9.52
+
+  - Fixed bug introduced in 9.44 which resulted in incorrect maker note offsets
+    when copying maker notes from DNG images of some Pentax models
+
+Feb. 15, 2014 - Version 9.51
+
+  - Added a number of new CanonModelID values
+  - Added a new Sony/Minolta LensType (thanks Jos Roost)
+  - Added a new Panasonic BurstMode
+  - Added a new Pentax LensType
+  - Added new ColorSpaceTags shortcut
+  - Decode a number of new PanasonicRaw tags (thanks LibRaw)
+  - Decode ColorData tags for the new Canon EOS 1200D
+  - Improved Sony maker note decoding for some newer models (thanks Jos Roost)
+  - Fixed conversion of XMP:LensID for Pentax lenses on Ricoh-branded cameras
+
+Feb. 8, 2014 - Version 9.50
+
+  - Added support for Exiv2 EXV metadata files
+  - Added ability to read/write/copy GeoTiff tags as a block
+  - Added ability to combine -b with -j to write base64-encoded binary data in
+    JSON output format
+  - Added a new Nikon LensID
+  - Added a new Sony/Minolta LensType (thanks Jos Roost)
+  - Added new Extra ProcessingTime tag
+  - Added a new Olympus CameraType
+  - Added header signature to .EXIF files
+  - Decode a new Olympus tag (thanks LibRaw)
+  - Improved conversion of some Canon RecordMode values
+  - Improved decoding of tags for Hasselblad Stellar (thanks Jos Roost)
+  - Fixed -htmlDump offsets for information extracted from some embedded images
+  - Fixed hemisphere problem in Composite GPS tags derived from
+    QuickTime:LocationInformation
+  - API Changes:
+      - Option names are now case insensitive
+
+Feb. 1, 2014 - Version 9.49
+
+  - Added new Olympus and Samsung LensType values, and fixed an Olympus lens
+    name (thanks Niels Kristian Bech Jensen)
+  - Added another Polish tag translation (thanks Kacper Perschke)
+  - Added a new Panasonic ColorEffect value
+  - Decode a new FujiFilm tag (thanks LibRaw)
+  - Adjusted scaling factor for H264 ExposureTime values (thanks Francois)
+
+Jan. 25, 2014 - Version 9.48
+
+  - Added a new GeoTiff tag
+  - Added a couple of new Canon LensType values
+  - Added a few new XMP DarwinCore tags
+  - Updated Sony MakerNotes for the ILCE-5000 (thanks Jos Roost)
+  - Improved Polish translations (thanks Kacper Perschke)
+  - Fixed problem writing RicohSubdirIFD in GR images
+  - Fixed runtime error when writing PNG image with a TIFF-format EXIF profile
+
+Jan. 18, 2014 - Version 9.47
+
+  - Added read support for JPEG-HDR APP11 information
+  - Added read support for Media Jukebox APP9 information
+  - Added a new Olympus LensType (thanks Niels Kristian Bech Jensen)
+  - Added a few new Nikon LensID's (thanks Robert Rottmerhusen)
+  - Added a new Minolta/Sony LensType and fixed some Tamron lens names (thanks
+    Jos Roost)
+  - Decode more FLIR tags (thanks Tomas)
+  - Patched for quirk in Kodak PixPro AZ362 maker notes
+
+Jan. 11, 2014 - Version 9.46 (production release)
+
+  - Added a few Nikon lenses (thanks Niels for two)
+  - Added a few new XMP-xmpDM tags (thanks Mats Peterson)
+  - Added a new Pentax DriveMode (thanks Doug O'Brien)
+  - Added a new Olympus lens (thanks Niels Kristian Bech Jensen)
+  - Decode a number of new QuickTime tags
+  - Decode a few new Canon filter tags
+  - Improved -d option to properly handle time zones with %s and %z
+  - Improved conversions for Panasonic Composite AdvancedSceneMode
+  - Changed a few Tamron lens strings (thanks Niels Kristian Bech Jensen)
+  - Patched to avoid round-off errors in seconds of filesystem time tags
+  - Fixed extraction of CompressorID for some MOV videos
+
+Dec. 21, 2013 - Version 9.45
+
+  - Added details about movie data offset in MOV verbose dump
+  - Added a new Pentax WhiteBalance value
+  - Added a new Sony/Minolta LensType (thanks Jos Roost)
+  - Decode a new QuickTime tag
+  - Prevent illegal tag names to be generated from user-defined XMP tags
+  - Patched to allow reading some improperly formatted EXIF UserComment values
+  - Fixed problem where reading some large M2TS files could take a loooong time
+
+Dec. 11, 2013 - Version 9.44
+
+  - Added a new Pentax WhiteBalance value
+  - Added back the K-3 SRResult tag, but make it Unknown and with no print
+    conversion
+  - Fixed problem copying the maker notes of some recent Pentax models
+
+Dec. 8, 2013 - Version 9.43
+
+  - Added a new Olympus CameraType
+  - Added new Canon and Pentax LensType values
+  - Added a new Panasonic ShootingMode
+  - Added a new CanonModelID
+  - Decode a number of new Sony Tags (thanks Jos Roost)
+  - Decode a new Pentax tag
+  - Fixed decoding of a few Pentax tags for newer models
+  - Fixed decoding of CameraTemperature for Olympus Stylus 1
+  - Fixed bug when writing QuickTime date/time tags with QuickTimeUTC option set
+
+Dec. 1, 2013 - Version 9.42
+
+  - Added a new Canon LensType (thanks Norbert Wasser)
+  - Added a new Pentax LensType (thanks Louis Granboulan)
+  - Added a new Sony LensType (thanks Fredrik Agert)
+  - Added a new Nikon LensID (thanks LibRaw)
+  - Added a new Olympus CameraType
+  - Decode a number of new Sony tags (thanks Jos Roost)
+  - Decode a number of new Panasonic tags (thanks Thomas Modes)
+  - Decode a few new Pentax tags (thanks Klaus Homeister and others)
+  - Improved Olympus SensorTemperature calibration (thanks Eric Sibert)
+  - Patched decoding of EXIF:UserComment to tolerate invalid character code
+    written by Canon Zoombrowser EX 4.5
+  - Patched to allow GPS information to be extracted from incorrectly formatted
+    EXIF written by Windows Phone OS 7.5 (observed in some HTC and Nokia phones)
+  - Fixed runtime warnings which could occur when -j or -php combined with -f
+
+Nov. 16, 2013 - Version 9.41
+
+  - Added the ability to use multiple group qualifiers on tag names when writing
+    and copying (ie. "-QuickTime:Time:All=now")
+  - Added ability to geotag from Google Location Services KML files
+  - Added a new Pentax LensType (thanks Louis Granboulan)
+  - Added a new Canon LensType (thanks David Monro)
+  - Added a new Sony LensType2 (thanks Jos Roost)
+  - Decode a bunch more Nikon, Canon, Sony and FujiFilm WhiteBalance tags
+    (thanks LibRaw)
+  - Extract information from the new Pentax APP7 segment
+
+Nov. 8, 2013 - Version 9.40 - "Write QuickTime"
+
+  - Added ability to write XMP and edit date/time tags in QuickTime-format files
+    (ie. MOV, MP4)
+  - Added -api option to allow API options to be set via the command line
+  - Added ability to specify family 2 group name when writing
+  - Added write support for a number of new XMP tags
+  - Added a new Nikon LensID
+  - Added new Canon and Minolta/Sony LensType values (thanks Jos Roost)
+  - Added a few of the new values defined in the DICOM 2011 specification
+  - Add standard XMP to a PNG image when writing, even if XMP already exists in
+    another non-standard chunk
+  - Decode a few more Sony tags (thanks Jos Roost)
+  - Decode a few more QuickTime tags
+  - Decode a few more Panasonic tags (thanks Thomas Modes)
+  - Extract EXIF information from WEBP images
+  - Extract a few more unknown tags in Samsung MP4 videos
+  - Extract ProfileName from the PNG iCCP chunk
+  - Improved error message if no matches found when writing to tag(s) specified
+    by wildcards
+  - Improved XML output so EXIF tags now report a count (if constant, and > 1)
+  - Avoid writing a few XMP-crs tags which have XMP-exifEX equivalents unless
+    specified explicitly
+  - Patched POD documentation in MIE.pm to remove non-ASCII characters
+  - Fixed bug adding back XMP tags in PDF files after deleting all in the same
+    command (also made XMP the preferred group when writing PDF files)
+  - Fixed bug extracting some font information from QuickTime videos
+  - Fixed inconsistencies in behaviour when extracting XML as a block from
+    JPEG2000 images
+  - Fixed problem where FileName was changed when using -srcfile option and
+    writing only the Directory
+  - API Changes:
+      - Added the PNGEarlyXMP option
+  - Internal Changes:
+      - Changed all "$exifTool" variable names to "$et" throughout -- my
+        apologies to the diff engines
+
+Oct. 19, 2013 - Version 9.39
+
+  - Added a new PentaxCameraID and some new LensTypes (thanks Louis Granboulan)
+  - Added a new Nikon LensID
+  - Added a new Panasonic ShutterType
+  - Additions and improvements to Pentax makernote decoding for K-3
+  - Decode a number of new tags including purchase information from MP4 videos
+  - Decode FLIR information acquired by Extech MeterLink meters (thanks Tomas)
+  - Decode more Sony tags (thanks Jos Roost)
+  - Patched to suppress the run-time "No such file or directory" error that has
+    been seen when using the -csv option on Windows systems
+
+Oct. 7, 2013 - Version 9.38
+
+  - Added read support for DPX images
+  - Added a new Pentax LensType
+  - Added a few new CanonModelID values
+  - Added a new XMP-apple-fi tag
+  - Decode a few more Canon tags (thanks Tomasz Kawecki)
+  - Decode a few more Sony tags (thanks Jos Roost)
+  - Improved the names of a few Apple tags (thanks Neal Krawetz) and added new
+    Composite tag
+  - Tolerate NMEA sentences with missing degrees written by some crappy software
+  - Changed Duration conversion to print number of days if more than 24 hours
+
+Sept. 14, 2013 - Version 9.37
+
+  - Added support for maker notes from Apple iPhone5 iOS 7
+  - Added two more Torrent tags
+  - Added a new Pentax DigitalFilter
+  - Added new Olympus CameraType and LensType values
+  - Decode a couple more Olympus tags
+  - More improvements to Sony decoding (thanks Jos Roost)
+  - Improved decoding of Scalado JPEG APP4 information
+  - Fixed problem where a PreviewImage could be reported in either the File or
+    Composite group, depending on the details of the command
+
+Sept. 7, 2013 - Version 9.36
+
+  - Added read support for BitTorrent description files (bencode format)
+  - Added a couple of new Nikon LensID's (thanks Jurgen Sahlberg)
+  - Added support for PNG 8bim raw profile
+  - Added or fixed a few Pentax LensType values (thanks Louis Granboulan)
+  - Added ability to delete DNGAdobeData and DNGPrivateData
+  - Decode more Sony tags and improved decoding of others (thanks Jos Roost)
+  - Decode a number of new FujiFilm tags and fixed 2 incorrect Saturation values
+  - Decode a number of Canon CameraInfo tags for the 70D (thanks Tomasz Kawecki)
+  - Patched to issue minor warning and extract only the first 1000 values from
+    XMP list-type tags containing more than 1000 items (all values may be
+    extracted by ignoring this warning with the -m option)
+  - Patched decoding of PNG IPTC raw profile to allow either IIM or IRB data
+  - Flagged ImageSourceData as "unsafe" (avoids excessive memory usage when
+    copying all tags because this data may be larger than the image itself for
+    Photoshop TIFF images)
+  - Disabled feature introduced in version 9.14 which allowed multiple tags
+    (specified by wildcards) to be copied into a single list.  This feature had
+    the unintended side-effect of generating duplicate list items when copying
+    list-type tags if there were multiple source tags with the same name.  If
+    necessary, -addTagsFromFile may still be used to copy the values of multiple
+    tags into a single list.
+
+Aug. 17, 2013 - Version 9.35
+
+  - Added a new Canon LensType (thanks Oliver)
+  - Added two new Olympus CameraType values
+  - Added some new Pentax LensType values (thanks Louis Granboulan)
+  - Added a new RIFF StreamType value
+  - Decode a number of new Sony tags (thanks Jos Roost)
+  - Decode CameraTemperature from more Canon models
+  - Extract thumbnail information from Leica X VARIO MP4 videos
+  - Improved decoding of Pentax LensData (thanks Louis Granboulan)
+  - Patched to avoid a warning for the messed-up Leica M maker notes
+  - Changed a few Pentax Samsung/Schneider lens names for consistency
+  - Changed "Can't delete" message to indicate if the tag is Permanent
+  - Fixed the case of a few tag names (thanks Romain)
+
+July 27, 2013 - Version 9.34
+
+  - Added support for Ricoh GR maker notes (in MOV videos too)
+  - Added a new Olympus LensType (thanks Niels Kristian Bech Jensen)
+  - Added a new Canon LensType (thanks Norbert Wasser)
+  - Added support for Sony DSC-TF1 maker notes (thanks Jos Roost)
+  - Added patch for messed up Leica M (Typ 240) MakerNote trailer
+  - Added a few new CanonModelID's and a few new PentaxModelID's
+  - Added some new XMP-crs tags written by LR5
+  - Added a few new Nikon LensID's
+  - Decode a number of new Ricoh GR tags (thanks Tim Gray)
+  - Recognize the Nikon SB-700 external flash
+  - Updated MWG location tags to conform with the MWG 2.0 specification (but
+    continue writing legacy IPTC Core location tags)
+  - Removed "[Minor]" designation from "excessive count" warning if count is
+    greater than 2M
+  - Avoid processing multiple EXIF IFD's if only one should exist
+
+July 13, 2013 - Version 9.33
+
+  - Added support for EXIF UTF-16 Unicode text (previously treated as UCS-2)
+  - Added support for Leica X Vario maker notes
+  - Added a couple of new SonyModelID values (thanks Jos Roost)
+  - Added a new CanonModelID and a new Olympus CameraType
+  - Added a new Canon LensType
+  - Added a new Olympus LensType (thanks Niels Kristian Bech Jensen)
+  - Decode some new Panasonic tags and added values for others (thanks Thomas)
+  - Improved decoding of Olympus RawDevArtFilter
+  - Improved decoding of some Sony tags for the RX100M2
+  - Changed application to always return an error status when exiting if an
+    error was encountered when extracting information
+
+June 22, 2013 - Version 9.32
+
+  - Added support for "Exif 2.3 for XMP" tags
+  - Added a few new Olympus LensTypes (thanks Niels Kristian Bech Jensen)
+  - Added a few new PentaxModelID's
+  - Added two new Samsung LensType values (thanks Pascal de Bruijn)
+  - Decode a new Olympus tag
+  - Fixed problem extracting audio comments from Ricoh G700SE images
+  - Fixed a non-conforming CanonModelID string
+
+June 8, 2013 - Version 9.31
+
+  - Added a number of new Photoshop tags (but marked as Unknown)
+  - Added a few new values for some Olympus tags
+  - Added conversion for Olympus SensorTemperature
+  - Added two new CanonModelID's
+  - Added support for Reconyx firmware 4.0.0
+  - Decode a number of new QuickTime and FLIR tags in MP4 videos
+  - Decode more Sony tags (thanks Jos Roost)
+  - Decode a new Olympus tag
+  - The API List option may now be used in the config file for the same effect
+    as -sep when combined with the -X, -j or -php option on the command line
+  - Fixed problem where some QuickTime string values could have terminating NULL
+    characters, which caused problems when renaming files using these tags
+
+May 25, 2013 - Version 9.30
+
+  - Added a new Canon LensType
+  - Decode many Canon 700D CameraInfo tags
+  - Also delete null characters with the default advanced formatting filter
+  - Tolerate leading whitespace in HTML files
+  - Fixed decoding of Canon 650D CameraInfo FocalLength
+  - Fixed bug in new advanced formatting feature which gave incorrect
+    output when used in the -p option for processing multiple files
+
+May 18, 2013 - Version 9.29
+
+  - Added another H264 Model value (thanks Rob Lewis)
+  - Added support for Canon 5DmkIII firmware version 1.2.1
+  - Added recognition of IBM AVC video files
+  - Added a new CanonModelID
+  - Decode more FLIR tags (thanks Tomas)
+  - Decode H264 MDPM TimeCode
+  - More improvements to Sony LensType decoding (thanks Jos Roost)
+  - Extract information from the ASF Metadata Library in WMV files
+  - Extract ColorBalanceVersion for unknown Nikon ColorBalance information
+  - Updated some ID3 Genre names (thanks Mats Peterson)
+  - Fixed warning when using -p with a string containing a newline
+  - Fixed some incorrect Pentax Q LensType values
+
+Apr. 21, 2013 - Version 9.28
+
+  - Added the ability to delete unknown JPEG APP segments by segment name
+  - Added a bunch of new ID3 Genre values (thanks Mats Peterson)
+  - Decode a few more Sony tags (thanks Jos Roost)
+  - Decode a few more tricky FLIR tags (thanks Tomas)
+  - Improved Dutch language translation (thanks Peter van der Laan)
+  - Patched to avoid warning in images where the AFMicroAdj data has been
+    truncated by Canon DPP
+  - Fixed -tagsFromFile and -v so they may now be used when writing via pipes
+  - Fixed writing of Panasonic LensType tags that were broken in the 9.15 update
+  - Fixed incorrect case for list type of XMP DocumentAncestors and TextLayers
+  - API Changes:
+      - Allow a File::RandomAccess reference as an input to WriteInfo()
+
 Apr. 15, 2013 - Version 9.27 (production release)
 
   - Fixed "ARRAY ref" runtime error introduced in 9.25 that could occur when
@@ -784,6 +1145,7 @@ Nov. 9, 2011 - Version 8.69
   - Added ability to specify internal encoding of EXIF "ASCII" strings and
     QuickTime strings
   - Added a new DigiKam XMP tag
+  - Documented -echo option (has been an undocumented feature since 6.86)
   - Decode a number of new Sony tags
   - Decode a few new Pentax tags and added a few new values
   - Decode a few new QuickTime and ID3 tags
@@ -2349,7 +2711,7 @@ Feb. 3, 2009 - Version 7.64 - "Babel fish"
       - ch_s  (thanks Haibing Zhong) [renamed 'zh_cn' in 7.75]
       - cz    (thanks Petr Michalek) [renamed 'cs' in 7.68]
       - de    (thanks Jens Duttke)
-      - en_ca (for those of us who like to see "colour" to be spelled properly)
+      - en_ca (for those of us who like to see "colour" spelled properly)
       - en_gb (correct "colour" plus a few other quirks)
       - es    (thanks Santiago del Brio Gonzalez)
       - fr    (thanks Bernard Guillotin)
@@ -28,6 +28,7 @@ html/TagNames/AIFF.html
 html/TagNames/APE.html
 html/TagNames/APP12.html
 html/TagNames/ASF.html
+html/TagNames/Apple.html
 html/TagNames/BMP.html
 html/TagNames/Canon.html
 html/TagNames/CanonCustom.html
@@ -37,6 +38,7 @@ html/TagNames/Casio.html
 html/TagNames/Composite.html
 html/TagNames/DICOM.html
 html/TagNames/DNG.html
+html/TagNames/DPX.html
 html/TagNames/DV.html
 html/TagNames/DarwinCore.html
 html/TagNames/DjVu.html
@@ -117,6 +119,7 @@ html/TagNames/Reconyx.html
 html/TagNames/Ricoh.html
 html/TagNames/Samsung.html
 html/TagNames/Sanyo.html
+html/TagNames/Scalado.html
 html/TagNames/Shortcuts.html
 html/TagNames/Sigma.html
 html/TagNames/SigmaRaw.html
@@ -124,6 +127,7 @@ html/TagNames/Sony.html
 html/TagNames/SonyIDC.html
 html/TagNames/Stim.html
 html/TagNames/Theora.html
+html/TagNames/Torrent.html
 html/TagNames/Unknown.html
 html/TagNames/Vorbis.html
 html/TagNames/XMP.html
@@ -163,6 +167,7 @@ lib/Image/ExifTool/AIFF.pm
 lib/Image/ExifTool/APE.pm
 lib/Image/ExifTool/APP12.pm
 lib/Image/ExifTool/ASF.pm
+lib/Image/ExifTool/Apple.pm
 lib/Image/ExifTool/BMP.pm
 lib/Image/ExifTool/BZZ.pm
 lib/Image/ExifTool/BigTIFF.pm
@@ -206,6 +211,7 @@ lib/Image/ExifTool/Charset/Turkish.pm
 lib/Image/ExifTool/Charset/Vietnam.pm
 lib/Image/ExifTool/DICOM.pm
 lib/Image/ExifTool/DNG.pm
+lib/Image/ExifTool/DPX.pm
 lib/Image/ExifTool/DV.pm
 lib/Image/ExifTool/DarwinCore.pm
 lib/Image/ExifTool/DjVu.pm
@@ -311,6 +317,7 @@ lib/Image/ExifTool/Reconyx.pm
 lib/Image/ExifTool/Ricoh.pm
 lib/Image/ExifTool/Samsung.pm
 lib/Image/ExifTool/Sanyo.pm
+lib/Image/ExifTool/Scalado.pm
 lib/Image/ExifTool/Shift.pl
 lib/Image/ExifTool/Shortcuts.pm
 lib/Image/ExifTool/Sigma.pm
@@ -322,6 +329,7 @@ lib/Image/ExifTool/TagInfoXML.pm
 lib/Image/ExifTool/TagLookup.pm
 lib/Image/ExifTool/TagNames.pod
 lib/Image/ExifTool/Theora.pm
+lib/Image/ExifTool/Torrent.pm
 lib/Image/ExifTool/Unknown.pm
 lib/Image/ExifTool/Vorbis.pm
 lib/Image/ExifTool/WriteCanonRaw.pl
@@ -331,6 +339,7 @@ lib/Image/ExifTool/WritePDF.pl
 lib/Image/ExifTool/WritePNG.pl
 lib/Image/ExifTool/WritePhotoshop.pl
 lib/Image/ExifTool/WritePostScript.pl
+lib/Image/ExifTool/WriteQuickTime.pl
 lib/Image/ExifTool/WriteXMP.pl
 lib/Image/ExifTool/Writer.pl
 lib/Image/ExifTool/XMP.pm
@@ -384,6 +393,8 @@ t/DICOM_2.out
 t/DNG.t
 t/DNG_2.out
 t/DNG_3.out
+t/DPX.t
+t/DPX_2.out
 t/DV.t
 t/DV_2.out
 t/DjVu.t
@@ -451,6 +462,7 @@ t/GPS_3.out
 t/GeoTiff.t
 t/GeoTiff_2.out
 t/GeoTiff_3.out
+t/GeoTiff_4.out
 t/Geotag.t
 t/Geotag_2.out
 t/Geotag_3.out
@@ -458,6 +470,7 @@ t/Geotag_5.out
 t/Geotag_6.out
 t/Geotag_7.out
 t/Geotag_8.out
+t/Geotag_9.out
 t/HTML.t
 t/HTML_2.out
 t/IPTC.t
@@ -522,6 +535,7 @@ t/MWG_2.out
 t/MWG_3.out
 t/MWG_4.out
 t/MWG_5.out
+t/MWG_6.out
 t/MXF.t
 t/MXF_2.out
 t/Matroska.t
@@ -576,6 +590,7 @@ t/PNG.t
 t/PNG_2.out
 t/PNG_3.out
 t/PNG_4.out
+t/PNG_5.out
 t/PPM.t
 t/PPM_2.out
 t/PPM_3.out
@@ -604,6 +619,8 @@ t/PostScript_3.out
 t/QuickTime.t
 t/QuickTime_2.out
 t/QuickTime_3.out
+t/QuickTime_4.out
+t/QuickTime_5.out
 t/RIFF.t
 t/RIFF_2.out
 t/RIFF_3.out
@@ -633,6 +650,8 @@ t/Sony_2.out
 t/Sony_3.out
 t/Sony_5.out
 t/TestLib.pm
+t/Torrent.t
+t/Torrent_2.out
 t/Unknown.t
 t/Unknown_2.out
 t/Unknown_3.out
@@ -677,6 +696,12 @@ t/Writer_46.out
 t/Writer_47.out
 t/Writer_48.out
 t/Writer_50.out
+t/Writer_51.out
+t/Writer_52.out
+t/Writer_53.out
+t/Writer_54.out
+t/Writer_55.out
+t/Writer_56.out
 t/Writer_6.out
 t/Writer_7.out
 t/Writer_9.out
@@ -742,6 +767,7 @@ t/images/Casio2.jpg
 t/images/CasioQVCI.jpg
 t/images/DICOM.dcm
 t/images/DNG.dng
+t/images/DPX.dpx
 t/images/DV.dv
 t/images/DjVu.djvu
 t/images/EXE.elf
@@ -773,6 +799,7 @@ t/images/GPS.jpg
 t/images/GeoTiff.tif
 t/images/Geotag.gpx
 t/images/Geotag.igc
+t/images/Geotag.kml
 t/images/Geotag.log
 t/images/Geotag.xml
 t/images/Geotag2.log
@@ -841,6 +868,7 @@ t/images/Sigma.x3f
 t/images/SigmaDP2.x3f
 t/images/Sony.jpg
 t/images/Sony.pmp
+t/images/Torrent.torrent
 t/images/Unknown.jpg
 t/images/Vorbis.ogg
 t/images/Writer.jpg
@@ -1,6 +1,6 @@
 --- #YAML:1.0
 name:               Image-ExifTool
-version:            9.27
+version:            9.53
 abstract:           Read and write meta information
 author:
     - Phil Harvey (phil@owl.phy.queensu.ca)
@@ -10,7 +10,8 @@ configure_requires:
     ExtUtils::MakeMaker:  0
 build_requires:
     ExtUtils::MakeMaker:  0
-requires:  {}
+requires:
+    perl:  5.004
 no_index:
     directory:
         - t
@@ -36,4 +36,6 @@ WriteMakefile(
         ) : ()),
     (($ExtUtils::MakeMaker::VERSION gt '6.30') ?
         (LICENSE => 'perl') : ()),    
+    (($ExtUtils::MakeMaker::VERSION ge '6.47') ?
+        (MIN_PERL_VERSION => '5.004') : ()),    
 );
@@ -14,37 +14,38 @@ supported by ExifTool (r = read, w = write, c = create):
 
   File Types
   ------------+-------------+-------------+-------------+------------
-  3FR   r     | EIP   r     | LA    r     | ORF   r/w   | RSRC  r
-  3G2   r     | EPS   r/w   | LNK   r     | OTF   r     | RTF   r
-  3GP   r     | ERF   r/w   | M2TS  r     | PAC   r     | RW2   r/w
-  ACR   r     | EXE   r     | M4A/V r     | PAGES r     | RWL   r/w
-  AFM   r     | EXIF  r/w/c | MEF   r/w   | PBM   r/w   | RWZ   r
-  AI    r/w   | EXR   r     | MIE   r/w/c | PCD   r     | RM    r
-  AIFF  r     | F4A/V r     | MIFF  r     | PDF   r/w   | SO    r
-  APE   r     | FFF   r/w   | MKA   r     | PEF   r/w   | SR2   r/w
-  ARW   r/w   | FLA   r     | MKS   r     | PFA   r     | SRF   r
-  ASF   r     | FLAC  r     | MKV   r     | PFB   r     | SRW   r/w
-  AVI   r     | FLV   r     | MNG   r/w   | PFM   r     | SVG   r
-  BMP   r     | FPF   r     | MODD  r     | PGF   r     | SWF   r
-  BTF   r     | FPX   r     | MOS   r/w   | PGM   r/w   | THM   r/w
-  CHM   r     | GIF   r/w   | MOV   r     | PLIST r     | TIFF  r/w
-  COS   r     | GZ    r     | MP3   r     | PICT  r     | TTC   r
-  CR2   r/w   | HDP   r/w   | MP4   r     | PMP   r     | TTF   r
-  CRW   r/w   | HDR   r     | MPC   r     | PNG   r/w   | VRD   r/w/c
-  CS1   r/w   | HTML  r     | MPG   r     | PPM   r/w   | VSD   r
-  DCM   r     | ICC   r/w/c | MPO   r/w   | PPT   r     | WAV   r
-  DCP   r/w   | IDML  r     | MQV   r     | PPTX  r     | WDP   r/w
-  DCR   r     | IIQ   r/w   | MRW   r/w   | PS    r/w   | WEBP  r
-  DFONT r     | IND   r/w   | MXF   r     | PSB   r/w   | WEBM  r
-  DIVX  r     | INX   r     | NEF   r/w   | PSD   r/w   | WMA   r
-  DJVU  r     | ITC   r     | NRW   r/w   | PSP   r     | WMV   r
-  DLL   r     | J2C   r     | NUMBERS r   | QTIF  r     | WV    r
-  DNG   r/w   | JNG   r/w   | ODP   r     | RA    r     | X3F   r/w
-  DOC   r     | JP2   r/w   | ODS   r     | RAF   r/w   | XCF   r
-  DOCX  r     | JPEG  r/w   | ODT   r     | RAM   r     | XLS   r
-  DV    r     | K25   r     | OFR   r     | RAR   r     | XLSX  r
-  DVB   r     | KDC   r     | OGG   r     | RAW   r/w   | XMP   r/w/c
-  DYLIB r     | KEY   r     | OGV   r     | RIFF  r     | ZIP   r
+  3FR   r     | EIP   r     | LA    r     | OTF   r     | RW2   r/w
+  3G2   r/w   | EPS   r/w   | LNK   r     | PAC   r     | RWL   r/w
+  3GP   r/w   | ERF   r/w   | M2TS  r     | PAGES r     | RWZ   r
+  ACR   r     | EXE   r     | M4A/V r/w   | PBM   r/w   | RM    r
+  AFM   r     | EXIF  r/w/c | MEF   r/w   | PCD   r     | SO    r
+  AI    r/w   | EXR   r     | MIE   r/w/c | PDF   r/w   | SR2   r/w
+  AIFF  r     | EXV   r/w/c | MIFF  r     | PEF   r/w   | SRF   r
+  APE   r     | F4A/V r/w   | MKA   r     | PFA   r     | SRW   r/w
+  ARW   r/w   | FFF   r/w   | MKS   r     | PFB   r     | SVG   r
+  ASF   r     | FLA   r     | MKV   r     | PFM   r     | SWF   r
+  AVI   r     | FLAC  r     | MNG   r/w   | PGF   r     | THM   r/w
+  BMP   r     | FLV   r     | MODD  r     | PGM   r/w   | TIFF  r/w
+  BTF   r     | FPF   r     | MOS   r/w   | PLIST r     | TORRENT r
+  CHM   r     | FPX   r     | MOV   r/w   | PICT  r     | TTC   r
+  COS   r     | GIF   r/w   | MP3   r     | PMP   r     | TTF   r
+  CR2   r/w   | GZ    r     | MP4   r/w   | PNG   r/w   | VRD   r/w/c
+  CRW   r/w   | HDP   r/w   | MPC   r     | PPM   r/w   | VSD   r
+  CS1   r/w   | HDR   r     | MPG   r     | PPT   r     | WAV   r
+  DCM   r     | HTML  r     | MPO   r/w   | PPTX  r     | WDP   r/w
+  DCP   r/w   | ICC   r/w/c | MQV   r/w   | PS    r/w   | WEBP  r
+  DCR   r     | IDML  r     | MRW   r/w   | PSB   r/w   | WEBM  r
+  DFONT r     | IIQ   r/w   | MXF   r     | PSD   r/w   | WMA   r
+  DIVX  r     | IND   r/w   | NEF   r/w   | PSP   r     | WMV   r
+  DJVU  r     | INX   r     | NRW   r/w   | QTIF  r/w   | WV    r
+  DLL   r     | ITC   r     | NUMBERS r   | RA    r     | X3F   r/w
+  DNG   r/w   | J2C   r     | ODP   r     | RAF   r/w   | XCF   r
+  DOC   r     | JNG   r/w   | ODS   r     | RAM   r     | XLS   r
+  DOCX  r     | JP2   r/w   | ODT   r     | RAR   r     | XLSX  r
+  DPX   r     | JPEG  r/w   | OFR   r     | RAW   r/w   | XMP   r/w/c
+  DV    r     | K25   r     | OGG   r     | RIFF  r     | ZIP   r
+  DVB   r/w   | KDC   r     | OGV   r     | RSRC  r     |
+  DYLIB r     | KEY   r     | ORF   r/w   | RTF   r     |
 
   Meta Information
   ----------------------+----------------------+---------------------
@@ -53,15 +54,16 @@ supported by ExifTool (r = read, w = write, c = create):
   IPTC           r/w/c  |  Kodak Meta     r/w  |  Adobe APP14    r
   XMP            r/w/c  |  FotoStation    r/w  |  MPF            r
   MakerNotes     r/w/c  |  PhotoMechanic  r/w  |  Stim           r
-  Photoshop IRB  r/w/c  |  JPEG 2000      r    |  APE            r
-  ICC Profile    r/w/c  |  DICOM          r    |  Vorbis         r
-  MIE            r/w/c  |  Flash          r    |  SPIFF          r
-  JFIF           r/w/c  |  FlashPix       r    |  DjVu           r
-  Ducky APP12    r/w/c  |  QuickTime      r    |  M2TS           r
-  PDF            r/w/c  |  Matroska       r    |  PE/COFF        r
-  PNG            r/w/c  |  GeoTIFF        r    |  AVCHD          r
-  Canon VRD      r/w/c  |  PrintIM        r    |  ZIP            r
-  Nikon Capture  r/w/c  |  ID3            r    |  (and more)
+  Photoshop IRB  r/w/c  |  JPEG 2000      r    |  DPX            r
+  ICC Profile    r/w/c  |  DICOM          r    |  APE            r
+  MIE            r/w/c  |  Flash          r    |  Vorbis         r
+  JFIF           r/w/c  |  FlashPix       r    |  SPIFF          r
+  Ducky APP12    r/w/c  |  QuickTime      r    |  DjVu           r
+  PDF            r/w/c  |  Matroska       r    |  M2TS           r
+  PNG            r/w/c  |  MXF            r    |  PE/COFF        r
+  Canon VRD      r/w/c  |  PrintIM        r    |  AVCHD          r
+  Nikon Capture  r/w/c  |  FLAC           r    |  ZIP            r
+  GeoTIFF        r/w/c  |  ID3            r    |  (and more)
 
 See html/index.html for more details about ExifTool features.
 
@@ -147,10 +149,11 @@ for calculating digest values for some information types:
   Digest::SHA          (PDF with AES-256 encryption)
   IO::Compress::Bzip2  (RWZ files)
   Win32API::File::Time (enables writing of FileCreateDate in Windows)
+  Time::HiRes          (allows generation of ProcessingTime tag)
 
 COPYRIGHT AND LICENSE
 
-Copyright 2003-2013, Phil Harvey
+Copyright 2003-2014, Phil Harvey
 
 This is free software; you can redistribute it and/or modify it under the
 same terms as Perl itself.
@@ -161,30 +164,30 @@ Below is a list of the files/directories included in the full ExifTool
 distribution package:
 
   Changes                   - Revision history
-  ExifTool_config           - Sample run-time configuration file
   MANIFEST                  - Full list of distribution files
   META.yml                  - Standard CPAN dependency file
   Makefile.PL               - Makefile for installation
   README                    - This file
   arg_files/                - Argument files to convert metadata formats:
-    exif2iptc.args          - Arguments for converting EXIF to IPTC
-    exif2xmp.args           - Arguments for converting EXIF to XMP
-    gps2xmp.args            - Arguments for converting GPS to XMP
-    iptc2exif.args          - Arguments for converting IPTC to EXIF
-    iptc2xmp.args           - Arguments for converting IPTC to XMP
-    iptcCore.args           - Complete list of IPTC Core XMP tags
-    pdf2xmp.args            - Arguments for converting PDF to XMP
-    xmp2exif.args           - Arguments for converting XMP to EXIF
-    xmp2gps.args            - Arguments for converting XMP to GPS
-    xmp2iptc.args           - Arguments for converting XMP to IPTC
-    xmp2pdf.args            - Arguments for converting XMP to PDF
+    exif2iptc.args            - Arguments for converting EXIF to IPTC
+    exif2xmp.args             - Arguments for converting EXIF to XMP
+    gps2xmp.args              - Arguments for converting GPS to XMP
+    iptc2exif.args            - Arguments for converting IPTC to EXIF
+    iptc2xmp.args             - Arguments for converting IPTC to XMP
+    iptcCore.args             - Complete list of IPTC Core XMP tags
+    pdf2xmp.args              - Arguments for converting PDF to XMP
+    xmp2exif.args             - Arguments for converting XMP to EXIF
+    xmp2gps.args              - Arguments for converting XMP to GPS
+    xmp2iptc.args             - Arguments for converting XMP to IPTC
+    xmp2pdf.args              - Arguments for converting XMP to PDF
   config_files/             - Sample ExifTool configuration files:
-    convert_regions.config  - Config file for converting face regions
+    ExifTool_config           - General example showing basic features
+    convert_regions.config    - Config file for converting face regions
   exiftool                  - The exiftool application (Perl script)
   fmt_files/                - Output formatting example files:
-    gpx.fmt                 - Format file for creating GPX track
-    gpx_wpt.fmt             - Format file for creating GPX waypoints
-    kml.fmt                 - Format file for creating KML output files
+    gpx.fmt                   - Format file for creating GPX track
+    gpx_wpt.fmt               - Format file for creating GPX waypoints
+    kml.fmt                   - Format file for creating KML output files
   html/                     - HTML documentation
   html/TagNames/            - HTML tag name documentation
   lib/                      - ExifTool Perl library modules
@@ -9,8 +9,12 @@
 #
 # Revisions:    2011/09/13 - P. Harvey Created
 #
-# Notes:        IPTC requires a timezone but EXIF does not support one, so
+# Notes:     1) IPTC requires a timezone but EXIF does not support one, so
 #               the local timezone is assumed when writing the IPTC times
+#
+#            2) These arguments will not delete IPTC tags which are missing
+#               from the EXIF.  The IPTC tags should be deleted beforehand if
+#               required.
 #------------------------------------------------------------------------------
 -IPTC:By-line < EXIF:Artist
 -IPTC:CopyrightNotice < EXIF:Copyright
@@ -9,12 +9,17 @@
 #
 # Revisions:    2009/01/20 - P. Harvey Created
 #               2011/06/22 - PH Copy flash information via Composite:Flash
+#               2013/06/12 - PH Additions for the Exif 2.3 for XMP spec
 #
 # References:   http://www.metadataworkinggroup.org/specs/
 #
-# Notes:        The first argument copies most of the EXIF and GPS tags to
+# Notes:     1) The first argument copies most of the EXIF and GPS tags to
 #               XMP-exif/XMP-tiff, and the remaining arguments handle tags
 #               which have different names and/or formats in EXIF and XMP.
+#
+#            2) These arguments will not delete XMP tags which are missing
+#               from the EXIF.  The XMP tags should be deleted beforehand if
+#               required.
 #------------------------------------------------------------------------------
 -XMP:all < EXIF:all
 -XMP-dc:Description < EXIF:ImageDescription
@@ -25,6 +30,7 @@
 -XMP-xmp:CreateDate < Composite:SubSecCreateDate
 #-XMP-xmp:ModifyDate < EXIF:ModifyDate (handled by the mass copy)
 -XMP-xmp:ModifyDate < Composite:SubSecModifyDate
+-XMP-xmp:CreatorTool < EXIF:Software
 -XMP-dc:Rights < EXIF:Copyright
 -XMP-dc:Creator < EXIF:Artist
 # XMP flash information is translated by the Composite Flash tag
@@ -9,9 +9,13 @@
 #
 # Revisions:    2009/01/09 - P. Harvey Created
 #
-# Notes:        Most of the GPS tags are copied by the first argument, but
+# Notes:     1) Most of the GPS tags are copied by the first argument, but
 #               the XMP GPS coordinate and date/time tags are composites of
 #               more than one EXIF GPS tag, so they are handled separately.
+#
+#            2) These arguments will not delete XMP tags which are missing
+#               from the GPS.  The XMP tags should be deleted beforehand if
+#               required.
 #------------------------------------------------------------------------------
 -XMP:all < GPS:all
 -XMP:GPSLatitude < Composite:GPSLatitude
@@ -8,6 +8,10 @@
 # Requires:     ExifTool version 7.98 or later
 #
 # Revisions:    2011/09/13 - P. Harvey Created
+#
+# Notes:        These arguments will not delete EXIF tags which are missing
+#               from the IPTC.  The EXIF tags should be deleted beforehand if
+#               required.
 #------------------------------------------------------------------------------
 -EXIF:Artist < IPTC:By-line
 -EXIF:Copyright < IPTC:CopyrightNotice
@@ -19,7 +19,11 @@
 #               http://www.adobe.com/products/xmp/pdfs/xmpspec.pdf
 #               http://www.metadataworkinggroup.org/specs/
 #
-# Notes:        Also updates Photoshop:IPTCDigest as per MWG recommendation.
+# Notes:     1) Also updates Photoshop:IPTCDigest as per MWG recommendation.
+#
+#            2) These arguments will not delete XMP tags which are missing
+#               from the IPTC.  The XMP tags should be deleted beforehand if
+#               required.
 #------------------------------------------------------------------------------
 -XMP-dc:Creator < IPTC:By-line
 -XMP-dc:Description < IPTC:Caption-Abstract
@@ -10,6 +10,10 @@
 # Revisions:    2011/01/23 - P. Harvey Created
 #
 # References:   http://www.adobe.com/devnet/xmp/
+#
+# Notes:        These arguments will not delete XMP tags which are missing
+#               from the PDF.  The XMP tags should be deleted beforehand if
+#               required.
 #------------------------------------------------------------------------------
 -XMP-dc:Title < PDF:Title
 -XMP-dc:Creator < PDF:Author
@@ -9,12 +9,17 @@
 #
 # Revisions:    2009/01/20 - P. Harvey Created
 #               2011/06/22 - PH Copy flash information via Composite:Flash
+#               2013/06/12 - PH Additions for the Exif 2.3 for XMP spec
 #
 # References:   http://www.metadataworkinggroup.org/specs/
 #
-# Notes:        The first argument copies the bulk of the EXIF and GPS
+# Notes:     1) The first argument copies the bulk of the EXIF and GPS
 #               information, and the remaining arguments handle the tags
 #               which have different names and/or formats in XMP and EXIF.
+#
+#            2) These arguments will not delete EXIF tags which are missing
+#               from the XMP.  The EXIF tags should be deleted beforehand if
+#               required.
 #------------------------------------------------------------------------------
 -EXIF:all < XMP:all
 -EXIF:ImageDescription < XMP-dc:Description
@@ -25,6 +30,7 @@
 -EXIF:SubSecTimeDigitized < XMP-xmp:CreateDate
 #-EXIF:ModifyDate < XMP-xmp:ModifyDate (handled by mass copy)
 -EXIF:SubSecTime < XMP-xmp:ModifyDate
+-EXIF:Software < -XMP-xmp:CreatorTool
 -EXIF:Copyright < XMP-dc:Rights
 -EXIF:Artist < XMP-dc:Creator
 # XMP flash information is translated by the Composite Flash tag
@@ -9,12 +9,16 @@
 #
 # Revisions:    2009/01/09 - P. Harvey Created
 #
-# Notes:        Most of the GPS tags are copied by the first argument, but
+# Notes:     1) Most of the GPS tags are copied by the first argument, but
 #               the coordinate references and date/time values are stored
 #               separately in EXIF, so they must be handled separately.
 #               A bit of magic is employed by ExifTool to extract the date
 #               and time parts respectively when writing date-only and
 #               time-only tags with a date/time value.
+#
+#            2) These arguments will not delete GPS tags which are missing
+#               from the XMP.  The GPS tags should be deleted beforehand if
+#               required.
 #------------------------------------------------------------------------------
 -GPS:all < XMP-exif:all
 -GPS:GPSLatitudeRef < Composite:GPSLatitudeRef
@@ -19,7 +19,20 @@
 #               http://www.adobe.com/products/xmp/pdfs/xmpspec.pdf
 #               http://www.metadataworkinggroup.org/specs/
 #
-# Notes:        Also updates Photoshop:IPTCDigest as per MWG recommendation.
+# Notes:     1) Also updates Photoshop:IPTCDigest as per MWG recommendation.
+#
+#            2) For special characters in the XMP to be preserved, the IPTC
+#               encoding must be UTF-8:  Either IPTC:CodedCharacterSet must
+#               already be "UTF8", or it must be set to "UTF8" when copying the
+#               XMP.  This is not done automatically by this argfile because it
+#               could invalidate the encoding of existing IPTC if there were
+#               any values containing special characters.  See FAQ number 10
+#               for more information about converting the IPTC encoding:
+#               http://owl.phy.queensu.ca/~phil/exiftool/faq.html#Q10
+#
+#            3) These arguments will not delete IPTC tags which are missing
+#               from the XMP.  The IPTC tags should be deleted beforehand if
+#               required.
 #------------------------------------------------------------------------------
 -IPTC:By-line < XMP-dc:Creator
 -IPTC:Caption-Abstract < XMP-dc:Description
@@ -10,6 +10,10 @@
 # Revisions:    2011/01/23 - P. Harvey Created
 #
 # References:   http://www.adobe.com/devnet/xmp/
+#
+# Notes:        These arguments will not delete PDF tags which are missing
+#               from the XMP.  The PDF tags should be deleted beforehand if
+#               required.
 #------------------------------------------------------------------------------
 -PDF:Title < XMP-dc:Title
 -PDF:Author < XMP-dc:Creator
@@ -5,8 +5,8 @@
 #
 # Notes:        This example file shows how to define your own shortcuts and
 #               add new EXIF, IPTC, XMP, PNG, MIE and Composite tags, as well
-#               as how to specify preferred lenses for the LensID tag and
-#               define default values for ExifTool options.
+#               as how to specify preferred lenses for the LensID tag, and
+#               define new file types and default ExifTool option values.
 #
 #               Note that unknown tags may be extracted even if they aren't
 #               defined, but tags must be defined to be written.  Also note
@@ -22,10 +22,10 @@
 #               run.  Your home directory is determined by the first defined of
 #               the following environment variables:
 #
-#                   1. EXIFTOOL_HOME
-#                   2. HOME
-#                   3. HOMEDRIVE + HOMEPATH
-#                   4. (the current directory)
+#                   1.  EXIFTOOL_HOME
+#                   2.  HOME
+#                   3.  HOMEDRIVE + HOMEPATH
+#                   4.  (the current directory)
 #
 #               Alternatively, the -config option of the exiftool application
 #               may be used to load a specific configuration file (note that
@@ -73,6 +73,7 @@
     # All EXIF tags are added to the Main table, and WriteGroup is used to
     # specify where the tag is written (default is ExifIFD if not specified):
     'Image::ExifTool::Exif::Main' => {
+        # Example 1.  EXIF:NewEXIFTag
         0xd000 => {
             Name => 'NewEXIFTag',
             Writable => 'int16u',
@@ -82,10 +83,12 @@
     },
     # the Geotag feature writes these additional GPS tags if available:
     'Image::ExifTool::GPS::Main' => {
+        # Example 2.  GPS:GPSPitch
         0xd000 => {
             Name => 'GPSPitch',
             Writable => 'rational64s',
         },
+        # Example 3.  GPS:GPSRoll
         0xd001 => {
             Name => 'GPSRoll',
             Writable => 'rational64s',
@@ -94,6 +97,7 @@
     # IPTC tags are added to a specific record type (ie. application record):
     # (Note: IPTC tag ID's are limited to the range 0-255)
     'Image::ExifTool::IPTC::ApplicationRecord' => {
+        # Example 4.  IPTC:NewIPTCTag
         160 => {
             Name => 'NewIPTCTag',
             Format => 'string[0,16]',
@@ -102,16 +106,20 @@
     },
     # XMP tags may be added to existing namespaces:
     'Image::ExifTool::XMP::xmp' => {
+        # Example 5.  XMP-xmp:NewXMPxmpTag
         NewXMPxmpTag => { Groups => { 2 => 'Author' } },
         # add more user-defined XMP-xmp tags here...
     },
     # special Geotag tags for XMP-exif:
     'Image::ExifTool::XMP::exif' => {
+        # Example 6.  XMP-exif:GPSPitch
         GPSPitch => { Writable => 'rational', Groups => { 2 => 'Location' } },
+        # Example 7.  XMP-exif:GPSRoll
         GPSRoll  => { Writable => 'rational', Groups => { 2 => 'Location' } },
     },
     # new XMP namespaces (ie. xxx) must be added to the Main XMP table:
     'Image::ExifTool::XMP::Main' => {
+        # namespace definition for examples 8 to 11
         xxx => { # <-- must be the same as the NAMESPACE prefix
             SubDirectory => {
                 TagTable => 'Image::ExifTool::UserDefined::xxx',
@@ -122,17 +130,22 @@
     },
     # new PNG tags are added to the PNG::TextualData table:
     'Image::ExifTool::PNG::TextualData' => {
+        # Example 12.  PNG:NewPngTag1
         NewPngTag1 => { },
+        # Example 13.  PNG:NewPngTag2
         NewPngTag2 => { },
+        # Example 14.  PNG:NewPngTag3
         NewPngTag3 => { },
     },
     # add a new MIE tag (NewMieTag1) and group (MIE-Test) to MIE-Meta
     # (Note: MIE group names must NOT end with a number)
     'Image::ExifTool::MIE::Meta' => {
+        # Example 15.  MIE-Meta:NewMieTag1
         NewMieTag1 => {
             Writable => 'rational64u',
             Units => [ 'cm', 'in' ],
         },
+        # new MIE "Test" group for example 16
         Test => {
             SubDirectory => {
                 TagTable => 'Image::ExifTool::UserDefined::MIETest',
@@ -231,12 +244,16 @@
     NAMESPACE     => { 'xxx' => 'http://ns.myname.com/xxx/1.0/' },
     WRITABLE      => 'string',
     # replace "NewXMPxxxTag1" with your own tag name (ie. "MyTag")
+    # Example 8.  XMP-xxx:NewXMPxxxTag1
     NewXMPxxxTag1 => { Writable => 'lang-alt' },
+    # Example 9.  XMP-xxx:NewXMPxxxTag2
     NewXMPxxxTag2 => { Groups => { 2 => 'Author' } },
+    # Example 10.  XMP-xxx:NewXMPxxxTag3
     NewXMPxxxTag3 => { List => 'Bag' },
     # example structured XMP tag
     NewXMPxxxStruct => {
         # the "Struct" entry defines the structure fields
+        # Example 11.  XMP-xxx:NewXMPxxxStruct
         Struct => {
             # optional namespace prefix and URI for structure fields
             # (required only if different than NAMESPACE above)
@@ -277,6 +294,7 @@ use Image::ExifTool::MIE;
     %Image::ExifTool::MIE::tableDefaults,   # default MIE table entries
     GROUPS      => { 0 => 'MIE', 1 => 'MIE-Test', 2 => 'Document' },
     WRITE_GROUP => 'MIE-Test',
+    # Example 16.  MIE-Test:NewMieTag2
     NewMieTag2  => { },     # new user-defined tag in MIE-Test group
 );
 
@@ -287,6 +305,28 @@ use Image::ExifTool::MIE;
     'Tokina AF193-2 19-35mm f/3.5-4.5',
 );
 
+# User-defined file types to recognize
+%Image::ExifTool::UserDefined::FileTypes = (
+    XXX => { # <-- the extension of the new file type
+        # BaseType specifies the format upon which this file is based.
+        # If BaseType is defined, then the file will be fully supported,
+        # and in this case the Magic pattern should not be defined
+        BaseType => 'TIFF',
+        MIMEType => 'image/x-xxx',  # (defaults to 'application/unknown')
+        Description => 'My XXX file type',
+    },
+    YYY => {
+        # without BaseType, the file will be recognized but not supported
+        Magic => '0123abcd',    # regular expression to match at start of file
+        MIMEType => 'application/test',
+        Description => 'Test imaginary file type',
+    },
+    ZZZ => {
+        # if neither BaseType nor Magic are defined, the file will be
+        # recognized by extension only
+    },
+);
+
 # Specify default ExifTool option values
 # (see the Options function documentation for available options)
 %Image::ExifTool::UserDefined::Options = (
@@ -12,7 +12,7 @@
 use strict;
 require 5.004;
 
-my $version = '9.27';
+my $version = '9.53';
 
 # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
 my $exeDir;
@@ -43,6 +43,7 @@ sub FormatJSON($$$);
 sub PrintCSV();
 sub ConvertBinary($);
 sub IsEqual($$);
+sub Infile($;$);
 sub AddSetTagsFile($;$);
 sub DoSetFromFile($$$);
 sub CleanFilename($);
@@ -136,17 +137,18 @@ my $joinLists;      # flag set to join list values into a single string
 my $json;           # flag for JSON/PHP output format (1=JSON, 2=PHP)
 my $listItem;       # item number for extracting single item from a list
 my $listSep;        # list item separator (', ' by default)
-my $mainTool;       # main ExifTool object
+my $mt;             # main ExifTool object
 my $multiFile;      # non-zero if we are scanning multiple files
 my $outFormat;      # -1=Canon format, 0=same-line, 1=tag names, 2=values only
 my $outOpt;         # output file or directory name
 my $overwriteOrig;  # flag to overwrite original file (1=overwrite, 2=in place)
 my $pause;          # pause before returning
 my $preserveTime;   # flag to preserve times of updated files
-my $progress;       # progress cound
+my $progress;       # progress count
 my $progressMax;    # total number of files to process
 my $progStr;        # progress message string
 my $quiet;          # flag to disable printing of informational messages / warnings
+my $rafStdin;       # File::RandomAccess for stdin (if necessary to rewind)
 my $recurse;        # recurse into subdirectories
 my $rtnVal;         # command return value (0=success)
 my $saveCount;      # count the number of times we will/did call SaveNewValues()
@@ -166,6 +168,7 @@ my $tmpText;        # temporary text file
 my $utf8;           # flag set if we are using UTF-8 encoding
 my $validFile;      # flag indicating we processed a valid file
 my $verbose;        # verbose setting
+my $vout;           # verbose output file reference (\*STDOUT or \*STDERR)
 my $xml;            # flag for XML-formatted output
 
 # flag to keep the input -@ argfile open:
@@ -234,7 +237,14 @@ sub Exit {
     exit shift;
 }
 # my warning and error routines (NEVER say "die"!)
-sub Warn  { warn(@_) if $quiet < 2 or $_[0] =~ /^Error/; }
+sub Warn  {
+    if ($quiet < 2 or $_[0] =~ /^Error/) {
+        my $oldWarn = $SIG{'__WARN__'};
+        delete $SIG{'__WARN__'};
+        warn(@_);
+        $SIG{'__WARN__'} = $oldWarn if defined $oldWarn;
+    }
+}
 sub Error { Warn @_; $rtnVal = 1; }
 sub WarnOnce($) {
     Warn(@_) and $warnedOnce{$_[0]} = 1 unless $warnedOnce{$_[0]};
@@ -281,6 +291,9 @@ Command: for (;;) {
 @echo3 and print STDOUT join("\n", @echo3), "\n";
 @echo4 and print STDERR join("\n", @echo4), "\n";
 
+$rafStdin->Close() if $rafStdin;
+undef $rafStdin;
+
 # exit Command loop now if we are all done processing commands
 last unless @ARGV or not defined $rtnVal or $stayOpen >= 2 or @commonArgs;
 
@@ -309,7 +322,7 @@ $rtnVal = 0 unless defined $rtnVal;
 
 # initialize necessary static file-scope variables
 # (not done: @commonArgs, @moreArgs, $critical, $binaryStdout, $helped,
-#  $interrupted, $mainTool, $pause, $rtnVal, $stayOpen, $stayOpenBuff, $stayOpenFile)
+#  $interrupted, $mt, $pause, $rtnVal, $stayOpen, $stayOpenBuff, $stayOpenFile)
 undef @csvFiles;
 undef @csvTags;
 undef @delFiles;
@@ -397,6 +410,7 @@ $saveCount = 0;
 $seqFileNum = 0;
 $tabFormat = 0;
 $utf8 = 1;
+$vout = \*STDOUT;
 $xml = 0;
 
 # define local variables used only in this command loop
@@ -408,6 +422,7 @@ my $doGlob;         # flag set to do filename wildcard expansion
 my $escapeXML;      # flag to escape printed values for xml
 my $setTagsFile;    # filename for last TagsFromFile option
 my $sortOpt;        # sort option is used
+my $srcStdin;       # one of the source files is STDIN
 my $useMWG;         # flag set if we are using any MWG tag
 
 my ($argsLeft, @nextPass, $badCmd);
@@ -420,12 +435,15 @@ if ($^O eq 'MSWin32' and eval 'require File::Glob') {
     $doGlob = 1;
 }
 
-$mainTool = new Image::ExifTool;        # create ExifTool object
+$mt = new Image::ExifTool;      # create ExifTool object
 
 # don't extract duplicates by default unless set by UserDefined::Options
-$mainTool->Options(Duplicates => 0) unless %Image::ExifTool::UserDefined::Options
+$mt->Options(Duplicates => 0) unless %Image::ExifTool::UserDefined::Options
     and defined $Image::ExifTool::UserDefined::Options{Duplicates};
 
+# default is to join lists if the List option was set in the config file
+$joinLists = 1 if defined $mt->Options('List') and not $mt->Options('List');
+
 # parse command-line options in 2 passes...
 # pass 1: set all of our ExifTool options
 # pass 2: print all of our help and informational output (-list, -ver, etc)
@@ -608,13 +626,20 @@ for (;;) {
         unshift @ARGV, @newArgs;
         next;
     }
-    /^(-?)(a|duplicates)$/i and $mainTool->Options(Duplicates => ($1 ? 0 : 1)), next;
+    /^(-?)(a|duplicates)$/i and $mt->Options(Duplicates => ($1 ? 0 : 1)), next;
+    if ($a eq 'api') {
+        my $opt = shift;
+        defined $opt or Error("Expected OPT[=VAL] argument for -api option\n"), $badCmd=1, next;
+        my $val = ($opt =~ s/=(.*)//s) ? $1 : 1;
+        $mt->Options($opt => (length($val) ? $val : undef));
+        next;
+    }
     /^arg(s|format)$/i and $argFormat = 1, next;
-    /^b(inary)?$/i and $mainTool->Options(Binary => 1), $binaryOutput = 1, next;
+    /^b(inary)?$/i and $mt->Options(Binary => 1), $binaryOutput = 1, next;
     if (/^c(oordFormat)?$/i) {
         my $fmt = shift;
         $fmt or Error("Expecting coordinate format for -c option\n"), $badCmd=1, next;
-        $mainTool->Options('CoordFormat', $fmt);
+        $mt->Options('CoordFormat', $fmt);
         next;
     }
     if ($a eq 'charset') {
@@ -626,14 +651,14 @@ for (;;) {
             PrintTagList('Available character sets', sort keys %charsets);
             $helped = 1;
         } elsif ($charset !~ s/^(\w+)=// or lc($1) eq 'exiftool') {
-            $mainTool->Options(Charset => $charset);
-            $utf8 = ($mainTool->Options('Charset') eq 'UTF8');
+            $mt->Options(Charset => $charset);
+            $utf8 = ($mt->Options('Charset') eq 'UTF8');
         } else {
             # set internal encoding of specified metadata type
             my $type = { id3 => 'ID3', iptc => 'IPTC', exif => 'EXIF',
                          photoshop => 'Photoshop', quicktime => 'QuickTime' }->{lc $1};
             $type or Warn("Unknown type for -charset option: $1\n"), next;
-            $mainTool->Options("Charset$type" => $charset);
+            $mt->Options("Charset$type" => $charset);
         }
         next;
     }
@@ -652,7 +677,8 @@ for (;;) {
         if ($csvFile) {
             $csvFile =~ s/^(\+?=)//;
             $csvAdd = 2 if $1 eq '+=';
-            $verbose and print "Reading CSV file $csvFile\n";
+            $vout = \*STDERR if $srcStdin;
+            $verbose and print $vout "Reading CSV file $csvFile\n";
             require Image::ExifTool::Import;
             my $msg = Image::ExifTool::Import::ReadCSV($csvFile, \%database, $forcePrint);
             $msg and Warn("$msg\n");
@@ -664,13 +690,13 @@ for (;;) {
     if (/^d$/ or $a eq 'dateformat') {
         my $fmt = shift;
         $fmt or Error("Expecting date format for -d option\n"), $badCmd=1, next;
-        $mainTool->Options('DateFormat', $fmt);
+        $mt->Options('DateFormat', $fmt);
         next;
     }
     (/^D$/ or $a eq 'decimal') and $showTagID = 'D', next;
     /^delete_original(!?)$/i and $deleteOrig = ($1 ? 2 : 1), next;
-    (/^e$/ or $a eq '-composite') and $mainTool->Options(Composite => 0), next;
-    (/^-e$/ or $a eq 'composite') and $mainTool->Options(Composite => 1), next;
+    (/^e$/ or $a eq '-composite') and $mt->Options(Composite => 0), next;
+    (/^-e$/ or $a eq 'composite') and $mt->Options(Composite => 1), next;
     (/^E$/ or $a eq 'escapehtml') and require Image::ExifTool::HTML and $escapeHTML = 1, next;
     ($a eq 'ex' or $a eq 'escapexml') and $escapeXML = 1, next;
     if (/^echo(\d)?$/i) {
@@ -687,8 +713,8 @@ for (;;) {
         next;
     }
     if (/^(ee|extractembedded)$/i) {
-        $mainTool->Options(ExtractEmbedded => 1);
-        $mainTool->Options(Duplicates => 1);
+        $mt->Options(ExtractEmbedded => 1);
+        $mt->Options(Duplicates => 1);
         next;
     }
     # (-execute handled at top of loop)
@@ -702,30 +728,30 @@ for (;;) {
         next;
     }
     if (/^f$/ or $a eq 'forceprint') {
-        $forcePrint = $mainTool->Options('MissingTagValue');
+        $forcePrint = $mt->Options('MissingTagValue');
         unless (defined $forcePrint) {
             $forcePrint = '-';
-            $mainTool->Options(MissingTagValue => '-');
+            $mt->Options(MissingTagValue => '-');
         }
         next;
     }
     if (/^F([-+]?\d*)$/ or /^fixbase([-+]?\d*)$/i) {
-        $mainTool->Options(FixBase => $1);
+        $mt->Options(FixBase => $1);
         next;
     }
     if (/^fast(\d*)$/i) {
-        $mainTool->Options(FastScan => (length $1 ? $1 : 1));
+        $mt->Options(FastScan => (length $1 ? $1 : 1));
         next;
     }
     if ($a eq 'fileorder') {
         push @fileOrder, shift if @ARGV;
         next;
     }
-    $a eq 'globaltimeshift' and $mainTool->Options(GlobalTimeShift => shift), next;
+    $a eq 'globaltimeshift' and $mt->Options(GlobalTimeShift => shift), next;
     if (/^(g)(roupHeadings|roupNames)?([\d:]*)$/i) {
         $showGroup = $3 || 0;
         $allGroup = ($2 ? lc($2) eq 'roupnames' : $1 eq 'G');
-        $mainTool->Options(SavePath => 1) if $showGroup =~ /\b5\b/;
+        $mt->Options(SavePath => 1) if $showGroup =~ /\b5\b/;
         next;
     }
     if ($a eq 'geotag') {
@@ -752,7 +778,7 @@ for (;;) {
     if (/^htmldump([-+]?\d+)?$/i) {
         $verbose = ($verbose || 0) + 1;
         $html = 2;
-        $mainTool->Options(HtmlDumpBase => $1) if defined $1;
+        $mt->Options(HtmlDumpBase => $1) if defined $1;
         next;
     }
     if (/^i(gnore)?$/i) {
@@ -784,8 +810,9 @@ for (;;) {
             my $jsonFile = $2;
             $jsonFile =~ s/^(\+?=)//;
             $csvAdd = 2 if $1 eq '+=';
-            $verbose and print "Reading JSON file $jsonFile\n";
-            my $chset = $mainTool->Options('Charset');
+            $vout = \*STDERR if $srcStdin;
+            $verbose and print $vout "Reading JSON file $jsonFile\n";
+            my $chset = $mt->Options('Charset');
             require Image::ExifTool::Import;
             my $msg = Image::ExifTool::Import::ReadJSON($jsonFile, \%database, $forcePrint, $chset);
             $msg and Warn("$msg\n");
@@ -794,28 +821,28 @@ for (;;) {
         } else {
             $json = 1;
             $html = $xml = 0;
-            $mainTool->Options(Duplicates => 1);
+            $mt->Options(Duplicates => 1);
             require Image::ExifTool::XMP;   # for FixUTF8()
         }
         next;
     }
     /^(k|pause)$/i and $pause = 1, next;
     (/^l$/ or $a eq 'long') and --$outFormat, next;
-    (/^L$/ or $a eq 'latin') and $utf8 = 0, $mainTool->Options(Charset => 'Latin'), next;
+    (/^L$/ or $a eq 'latin') and $utf8 = 0, $mt->Options(Charset => 'Latin'), next;
     if ($a eq 'lang') {
         my $lang = (@ARGV and $ARGV[0] !~ /^-/) ? shift : undef;
         if ($lang) {
             # make lower case and use underline as a separator (ie. 'en_ca')
             $lang =~ tr/-A-Z/_a-z/;
-            $mainTool->Options(Lang => $lang);
-            next if $lang eq $mainTool->Options('Lang');
+            $mt->Options(Lang => $lang);
+            next if $lang eq $mt->Options('Lang');
         } else {
             $pass or push(@nextPass, '-lang'), next;
         }
         my $langs = "Available languages:\n";
         $langs .= "  $_ - $Image::ExifTool::langName{$_}\n" foreach @Image::ExifTool::langs;
         $langs =~ tr/_/-/;  # display dashes instead of underlines in language codes
-        $langs = $mainTool->Decode($langs, 'UTF8');
+        $langs = $mt->Decode($langs, 'UTF8');
         $langs = Image::ExifTool::HTML::EscapeHTML($langs) if $escapeHTML;
         $lang and Error("Invalid or unsupported language '$lang'.\n$langs"), $badCmd=1, next;
         print $langs;
@@ -827,20 +854,22 @@ for (;;) {
         defined $listItem or Warn("Expecting index for -listItem option\n");
         next;
     }
-    /^(m|ignoreminorerrors)$/i and $mainTool->Options(IgnoreMinorErrors => 1), next;
-    /^(n|-printconv)$/i and $mainTool->Options(PrintConv => 0), next;
-    /^(-n|printconv)$/i and $mainTool->Options(PrintConv => 1), next;
+    /^(m|ignoreminorerrors)$/i and $mt->Options(IgnoreMinorErrors => 1), next;
+    /^(n|-printconv)$/i and $mt->Options(PrintConv => 0), next;
+    /^(-n|printconv)$/i and $mt->Options(PrintConv => 1), next;
     if (/^o(ut)?$/i) {
         $outOpt = shift;
         defined $outOpt or Error("Expected output file or directory name for -o option\n"), $badCmd=1, next;
         CleanFilename($outOpt);
+        # verbose messages go to STDERR of output is to console
+        $vout = \*STDERR if $vout =~ /^-(\.\w+)?$/;
         next;
     }
     /^overwrite_original$/i and $overwriteOrig = 1, next;
     /^overwrite_original_in_place$/i and $overwriteOrig = 2, next;
     (/^p$/ or $a eq 'printformat') and LoadPrintFormat(shift), next;
     (/^P$/ or $a eq 'preserve') and $preserveTime = 1, next;
-    /^password$/i and $mainTool->Options(Password => shift), next;
+    /^password$/i and $mt->Options(Password => shift), next;
     if ($a eq 'progress') {
         $progress = 0;
         $verbose = 0 unless defined $verbose;
@@ -864,11 +893,11 @@ for (;;) {
     /^restore_original$/i and $deleteOrig = 0, next;
     (/^S$/ or $a eq 'veryshort') and $outFormat+=2, next;
     /^s(hort)?(\d*)$/i and $outFormat = $2 eq '' ? $outFormat + 1 : $2, next;
-    /^scanforxmp$/i and $mainTool->Options(ScanForXMP => 1), next;
+    /^scanforxmp$/i and $mt->Options(ScanForXMP => 1), next;
     if (/^sep(arator)?$/i) {
         $listSep = shift;
         defined $listSep or Error("Expecting list item separator for -sep option\n"), $badCmd=1, next;
-        $mainTool->Options(ListSep => $listSep);
+        $mt->Options(ListSep => $listSep);
         $joinLists = 1;
         # also split when writing values
         my $listSplit = quotemeta $listSep;
@@ -876,7 +905,7 @@ for (;;) {
         $listSplit =~ s/(\\ )+/\\s\*/g;
         # but a single space alone matches one or more whitespace characters
         $listSplit = '\\s+' if $listSplit eq '\\s*';
-        $mainTool->Options(ListSplit => $listSplit);
+        $mt->Options(ListSplit => $listSplit);
         next;
     }
     /^sort$/i and $sortOpt = 1, next;
@@ -913,7 +942,7 @@ for (;;) {
     }
     if (/^(-)?struct$/i) {
         $structOpt = $1 ? 0 : 1;
-        $mainTool->Options(Struct => $structOpt);
+        $mt->Options(Struct => $structOpt);
         # require XMPStruct in case we need to serialize a structure
         require 'Image/ExifTool/XMPStruct.pl' if $structOpt;
         next;
@@ -921,16 +950,16 @@ for (;;) {
     /^t(ab)?$/  and $tabFormat = 1, next;
     if (/^T$/ or $a eq 'table') {
         $tabFormat = 1; $outFormat+=2; ++$quiet;
-        $forcePrint = $mainTool->Options('MissingTagValue');
+        $forcePrint = $mt->Options('MissingTagValue');
         unless (defined $forcePrint) {
             $forcePrint = '-';
-            $mainTool->Options(MissingTagValue => '-');
+            $mt->Options(MissingTagValue => '-');
         }
         next;
     }
     if (/^(u)(nknown(2)?)?$/i) {
         my $inc = ($3 or (not $2 and $1 eq 'U')) ? 2 : 1;
-        $mainTool->Options(Unknown => $mainTool->Options('Unknown') + $inc);
+        $mt->Options(Unknown => $mt->Options('Unknown') + $inc);
         next;
     }
     if ($a eq 'use') {
@@ -942,7 +971,6 @@ for (;;) {
                 eval "require $module" or
                 eval "require '$module'")
         {
-            delete $SIG{'__WARN__'};
             Error("Error using module $module\n");
             $badCmd = 1;
         }
@@ -980,7 +1008,7 @@ for (;;) {
         my $wm = shift;
         defined $wm or Error("Expecting argument for -$_ option\n"), $badCmd=1, next;
         $wm =~ /^[wcg]*$/i or Error("Invalid argument for -$_ option\n"), $badCmd=1, next;
-        $mainTool->Options(WriteMode => $wm);
+        $mt->Options(WriteMode => $wm);
         next;
     }
     if (/^x$/ or $a eq 'exclude') {
@@ -994,15 +1022,15 @@ for (;;) {
         }
         next;
     }
-    (/^X$/ or $a eq 'xmlformat') and $xml = 1, $html = $json = 0, $mainTool->Options(Duplicates => 1), next;
+    (/^X$/ or $a eq 'xmlformat') and $xml = 1, $html = $json = 0, $mt->Options(Duplicates => 1), next;
     if (/^php$/i) {
         $json = 2;
         $html = $xml = 0;
-        $mainTool->Options(Duplicates=>1);
+        $mt->Options(Duplicates=>1);
         next;
     }
-    /^z(ip)?$/i and $doUnzip = 1, $mainTool->Options(Compress => 1, Compact => 1), next;
-    $_ eq '' and push(@files, '-'), next;   # read STDIN
+    /^z(ip)?$/i and $doUnzip = 1, $mt->Options(Compress => 1, Compact => 1), next;
+    $_ eq '' and push(@files, '-'), $srcStdin = 1, next;   # read STDIN
     length $_ eq 1 and $_ ne '*' and Error("Unknown option -$_\n"), $badCmd=1, next;
     if (/^[^<]+(<?)=(.*)/s) {
         my $val = $2;
@@ -1057,12 +1085,17 @@ for (;;) {
     $doGlob = 2;
   } else {
     push @files, $_;
+    $srcStdin = 1 if $_ eq '-';
   }
 }
 
+# set verbose output to STDERR if output could be to console
+$vout = \*STDERR if $srcStdin and ($isWriting or @newValues);
+$mt->Options(TextOut => $vout) if $vout eq \*STDERR;
+
 # change default EXIF string encoding if MWG used
-if ($useMWG and not defined $mainTool->Options('CharsetEXIF')) {
-    $mainTool->Options(CharsetEXIF => 'UTF8');
+if ($useMWG and not defined $mt->Options('CharsetEXIF')) {
+    $mt->Options(CharsetEXIF => 'UTF8');
 }
 
 # print help
@@ -1132,24 +1165,24 @@ if ($textOut and $csv and $csv eq 'CSV' and not $isWriting) {
 
 if ($escapeHTML or $json) {
     # must be UTF8 for HTML conversion and JSON output
-    $mainTool->Options(Charset => 'UTF8');
+    $mt->Options(Charset => 'UTF8');
     # use Escape option to do our HTML escaping unless XML output
-    $mainTool->Options(Escape => 'HTML') if $escapeHTML and not $xml;
+    $mt->Options(Escape => 'HTML') if $escapeHTML and not $xml;
 } elsif ($escapeXML and not $xml) {
-    $mainTool->Options(Escape => 'XML');
+    $mt->Options(Escape => 'XML');
 }
 
 # set sort option
 if ($sortOpt) {
     # (note that -csv sorts alphabetically by default anyway if more than 1 file)
     my $sort = ($outFormat > 0 or $xml or $json or $csv) ? 'Tag' : 'Descr';
-    $mainTool->Options(Sort => $sort, Sort2 => $sort);
+    $mt->Options(Sort => $sort, Sort2 => $sort);
 }
 
 # set up for RDF/XML, JSON and PHP output formats
 if ($xml) {
     require Image::ExifTool::XMP;   # for EscapeXML()
-    my $charset = $mainTool->Options('Charset');
+    my $charset = $mt->Options('Charset');
     # standard XML encoding names for supported Charset settings
     # (ref http://www.iana.org/assignments/character-sets)
     my %encoding = (
@@ -1168,7 +1201,7 @@ if ($xml) {
     # switch to UTF-8 if we don't have a standard encoding name
     unless ($encoding{$charset}) {
         $charset = 'UTF8';
-        $mainTool->Options(Charset => $charset);
+        $mt->Options(Charset => $charset);
     }
     # set file header/trailer for XML output
     $fileHeader = "<?xml version='1.0' encoding='$encoding{$charset}'?>\n" .
@@ -1176,7 +1209,7 @@ if ($xml) {
     $fileTrailer = "</rdf:RDF>\n";
     # extract as a list unless short output format
     $joinLists = 1 if $outFormat > 0;
-    $mainTool->Options(List => 1) unless $joinLists;
+    $mt->Options(List => 1) unless $joinLists;
     $showGroup = $allGroup = 1;         # always show group 1
     # set binaryOutput flag to 0 or undef (0 = output encoded binary in XML)
     $binaryOutput = ($outFormat > 0 ? undef : 0) if $binaryOutput;
@@ -1185,20 +1218,22 @@ if ($xml) {
     if ($json == 1) { # JSON
         $fileHeader = '[';
         $fileTrailer = "]\n";
-        undef $binaryOutput; # can't currently use -b with -json
     } else { # PHP
         $fileHeader = 'Array(';
         $fileTrailer = ");\n";
-        # allow binary output in a text-mode file when -php and -b used together
-        # (this works because PHP strings are simple arrays of bytes, and CR/LF
-        #  won't be messed up in the text mode output because they are converted
-        #  to escape sequences in the strings)
-        $binaryOutput = 0 if $binaryOutput;
     }
-    $mainTool->Options(List => 1) unless $joinLists;
-    $mainTool->Options(Duplicates => 0) unless defined $showGroup;
+    # allow binary output in a text-mode file when -php/-json and -b used together
+    # (this works because PHP strings are simple arrays of bytes, and CR/LF
+    #  won't be messed up in the text mode output because they are converted
+    #  to escape sequences in the strings)
+    if ($binaryOutput) {
+        $binaryOutput = 0;
+        require Image::ExifTool::XMP if $json == 1;  # (for EncodeBase64)
+    }
+    $mt->Options(List => 1) unless $joinLists;
+    $mt->Options(Duplicates => 0) unless defined $showGroup;
 } elsif ($structOpt) {
-    $mainTool->Options(List => 1);
+    $mt->Options(List => 1);
 } else {
     $joinLists = 1;     # join lists for all other unstructured output formats
 }
@@ -1229,9 +1264,9 @@ if ($verbose) {
     undef $binaryOutput unless $tagOut;    # disable conflicting option
     if ($html) {
         $html = 2;    # flag for html dump
-        $mainTool->Options(HtmlDump => $verbose);
+        $mt->Options(HtmlDump => $verbose);
     } else {
-        $mainTool->Options(Verbose => $verbose) unless $tagOut;
+        $mt->Options(Verbose => $verbose) unless $tagOut;
     }
 } elsif (defined $verbose) {
     # auto-flush output when -v0 is used
@@ -1247,7 +1282,7 @@ if (@newValues) {
     if ($addGeotime) {
         AddSetTagsFile($setTagsFile = '@') unless $setTagsFile and $setTagsFile eq '@';
         push @{$setTags{$setTagsFile}}, $addGeotime;
-        $verbose and print qq{Argument "-$addGeotime" is assumed\n};
+        $verbose and print $vout qq{Argument "-$addGeotime" is assumed\n};
     }
     my %setTagsIndex;
     # add/delete option lookup
@@ -1257,7 +1292,7 @@ if (@newValues) {
         if (ref $_ eq 'HASH') {
             # save new values now if we stored a "SaveCount" marker
             if ($$_{SaveCount}) {
-                $saveCount = $mainTool->SaveNewValues();
+                $saveCount = $mt->SaveNewValues();
                 $needSave = 0;
                 # insert marker to load values from CSV file now if this was the CSV file
                 push @dynamicFiles, \$csv if $$_{SaveCount} == $csvSaveCount;
@@ -1275,7 +1310,7 @@ if (@newValues) {
                 push @dynamicFiles, $newVal;
                 next;   # set tags from dynamic file later
             }
-            unless (-e $newVal) {
+            unless (-e $newVal or $newVal eq '-') {
                 Warn "File '$newVal' does not exist for -tagsFromFile option\n";
                 $rtnVal = 1;
                 next Command;
@@ -1289,7 +1324,7 @@ if (@newValues) {
                 $setTags = $setTagsList{$newVal}[$i] if $setTagsList{$newVal}[$i];
             }
             # set specified tags from this file
-            unless (DoSetFromFile($mainTool, $newVal, $setTags)) {
+            unless (DoSetFromFile($mt, $newVal, $setTags)) {
                 $rtnVal = 1;
                 next Command;
             }
@@ -1325,14 +1360,14 @@ if (@newValues) {
             # set $newVal to '' if deleting nothing
             $newVal = '' if $1 eq '-' and not defined $newVal;
         }
-        my ($rtn, $wrn) = $mainTool->SetNewValue($tag, $newVal, %opts);
+        my ($rtn, $wrn) = $mt->SetNewValue($tag, $newVal, %opts);
         $needSave = 1;
         ++$isWriting if $rtn;
         $wrn and Warn "Warning: $wrn\n";
     }
     # exclude specified tags
     foreach (@exclude) {
-        $mainTool->SetNewValue($_, undef, Replace => 2);
+        $mt->SetNewValue($_, undef, Replace => 2);
         $needSave = 1;
     }
     unless ($isWriting or $outOpt or @tags) {
@@ -1351,19 +1386,20 @@ if ($isWriting and @tags and not $outOpt) {
 }
 # save current state of new values if setting values from target file
 # or if we may be translating to a different format
-$mainTool->SaveNewValues() if $outOpt or (@dynamicFiles and $needSave);
+$mt->SaveNewValues() if $outOpt or (@dynamicFiles and $needSave);
 
 $multiFile = 1 if @files > 1;
-@exclude and $mainTool->Options(Exclude => \@exclude);
+@exclude and $mt->Options(Exclude => \@exclude);
 
 undef $binaryOutput if $html;
 
 if ($binaryOutput) {
     $outFormat = 99;    # shortest possible output format
-    $mainTool->Options(PrintConv => 0);
+    $mt->Options(PrintConv => 0);
     unless ($textOut or $binaryStdout) {
         binmode(STDOUT);
         $binaryStdout = 1;
+        $mt->Options(TextOut => ($vout = \*STDERR));
     }
     # disable conflicting options
     undef $showGroup;
@@ -1371,7 +1407,7 @@ if ($binaryOutput) {
 
 # sort by groups to look nicer depending on options
 if (defined $showGroup and not (@tags and $allGroup)) {
-    $mainTool->Options(Sort => "Group$showGroup");
+    $mt->Options(Sort => "Group$showGroup");
 }
 
 if (defined $textOut) {
@@ -1399,21 +1435,21 @@ if ($outOpt) {
 }
 
 # set flag to fix description lengths if necessary
-$fixLen = ($utf8 and $mainTool->Options('Lang') ne 'en' and eval 'require Encode');
+$fixLen = ($utf8 and $mt->Options('Lang') ne 'en' and eval 'require Encode');
 
 # sort input files if specified
 if (@fileOrder) {
     my @allFiles;
     ProcessFiles(undef, \@allFiles);
     my $sortTool = new Image::ExifTool;
-    $sortTool->Options(PrintConv => $mainTool->Options('PrintConv'));
+    $sortTool->Options(PrintConv => $mt->Options('PrintConv'));
     $sortTool->Options(Duplicates => 0);
     my (%sortBy, %isFloat, @rev, $file);
     # save reverse sort flags
     push @rev, (s/^-// ? 1 : 0) foreach @fileOrder;
     foreach $file (@allFiles) {
         my @tags;
-        my $info = $sortTool->ImageInfo($file, @fileOrder, \@tags);
+        my $info = $sortTool->ImageInfo(Infile($file,1), @fileOrder, \@tags);
         # get values of all tags (or '~' to sort last if not defined)
         foreach (@tags) {
             $_ = $$info{$_};
@@ -1448,22 +1484,24 @@ if (@fileOrder) {
 # set file count for progress message
 $progressMax = scalar @files if defined $progress;
 
-# store duplicate database information under canonical filenames
+# store duplicate database information under absolute path
 my @dbKeys = keys %database;
 if (@dbKeys and require Cwd) {
+    undef $evalWarning;
+    local $SIG{'__WARN__'} = sub { $evalWarning = $_[0] };
     foreach (@dbKeys) {
-        my $canonFile = Cwd::abs_path($_);
-        if (defined $canonFile) {
-            $database{$canonFile} = $database{$_} unless $database{$canonFile};
+        my $absFile = Cwd::abs_path($_);
+        if (defined $absFile) {
+            $database{$absFile} = $database{$_} unless $database{$absFile};
         } else {
             # (may happen on Mac if the filename encoding is incorrect in the database)
-            Warn "Error generating canonical filename for $_\n";
+            Warn "Error generating absolute path for $_\n";
         }
     }
 }
 
 # process all specified files
-ProcessFiles($mainTool);
+ProcessFiles($mt);
 
 if ($filtered and not $validFile) {
     Warn "No file with specified extension\n";
@@ -1510,14 +1548,14 @@ if (defined $deleteOrig) {
         printf "%5d files not restored due to errors\n", $countBad if $countBad;
     }
 
-} elsif (not $binaryStdout and not $quiet) {
+} elsif ((not $binaryStdout or $verbose) and not $quiet) {
 
     # print summary
     my $tot = $count + $countBad;
     my $totWr = $countGoodWr + $countBadWr + $countSameWr + $countCopyWr +
                 $countGoodCr + $countBadCr;
     if ($countDir or $totWr or $countFailed or $tot > 1 or $textOut) {
-        my $o = (($html or $json or $xml or %printFmt or $csv) and not $textOut) ? \*STDERR : \*STDOUT;
+        my $o = (($html or $json or $xml or %printFmt or $csv) and not $textOut) ? \*STDERR : $vout;
         printf($o "%5d directories scanned\n", $countDir) if $countDir;
         printf($o "%5d directories created\n", $countNewDir) if $countNewDir;
         printf($o "%5d files failed condition\n", $countFailed) if $countFailed;
@@ -1552,7 +1590,7 @@ Exit $rtnVal;   # all done
 # Inputs: 0) ExifTool object reference, 1) file name
 sub GetImageInfo($$)
 {
-    my ($exifTool, $orig) = @_;
+    my ($et, $orig) = @_;
     my (@foundTags, $info, $file, $ind);
 
     # determine the name of the source file based on the original input file name
@@ -1562,7 +1600,7 @@ sub GetImageInfo($$)
             $file = $fmt eq '@' ? $orig : FilenameSPrintf($fmt, $orig);
             # use this file if it exists
             -e $file and undef($first), last;
-            $verbose and print "Source file $file does not exist\n";
+            $verbose and print $vout "Source file $file does not exist\n";
             $first = $file unless defined $first;
         }
         $file = $first if defined $first;
@@ -1596,8 +1634,8 @@ sub GetImageInfo($$)
         # return all tags but explicitly mention tags on command line so
         # requested images will generate the appropriate warnings
         @foundTags = ('*', @tags) if @tags;
-        $info = $exifTool->ImageInfo($pipe, \@foundTags, $opts);
-        my $cond = $exifTool->InsertTagValues(\@foundTags, $condition, \%info);
+        $info = $et->ImageInfo(Infile($pipe,$isWriting), \@foundTags, $opts);
+        my $cond = $et->InsertTagValues(\@foundTags, $condition, \%info);
 
         #### eval "-if" condition (%info)
         my $result = eval $cond;
@@ -1609,12 +1647,11 @@ sub GetImageInfo($$)
             if ($verbose) {
                 chomp $evalWarning;
                 $evalWarning =~ s/ at \(eval .*//s;
-                delete $SIG{'__WARN__'};
                 Warn "Condition: $evalWarning - $file\n";
             }
         }
         unless ($result) {
-            $verbose and print "-------- $file (failed condition)$progStr\n";
+            $verbose and print $vout "-------- $file (failed condition)$progStr\n";
             ++$countFailed;
             return;
         }
@@ -1623,15 +1660,15 @@ sub GetImageInfo($$)
         undef $info if $verbose;
     }
     if (defined $deleteOrig) {
-        print "======== $file$progStr\n" if defined $verbose;
+        print $vout "======== $file$progStr\n" if defined $verbose;
         ++$count;
         my $original = "${file}_original";
         -e $original or return;
         if ($deleteOrig) {
-            $verbose and print "Scheduled for deletion: $original\n";
+            $verbose and print $vout "Scheduled for deletion: $original\n";
             push @delFiles, $original;
         } elsif (rename $original, $file) {
-            $verbose and print "Restored from $original\n";
+            $verbose and print $vout "Restored from $original\n";
             ++$countGoodWr;
         } else {
             Warn "Error renaming $original\n";
@@ -1646,19 +1683,19 @@ sub GetImageInfo($$)
         $fp or ++$countBad, return;
         # delete file if we exit prematurely (unless appending)
         $tmpText = $outfile unless $append;
-        $exifTool->Options(TextOut => $fp);
+        $et->Options(TextOut => $fp);
     }
 
     if ($isWriting) {
-        print "======== $file$progStr\n" if defined $verbose;
-        SetImageInfo($exifTool, $file, $orig);
-        $info = $exifTool->GetInfo('Warning', 'Error');
-        PrintErrors($exifTool, $info, $file);
+        print $vout "======== $file$progStr\n" if defined $verbose;
+        SetImageInfo($et, $file, $orig);
+        $info = $et->GetInfo('Warning', 'Error');
+        PrintErrors($et, $info, $file);
         # close output text file if necessary
         if ($outfile) {
             undef $tmpText;
             close($fp);
-            $exifTool->Options(TextOut => \*STDOUT);
+            $et->Options(TextOut => $vout);
             if ($info->{Error}) {
                 unlink $outfile;    # erase bad file
             } elsif ($append) {
@@ -1694,25 +1731,25 @@ sub GetImageInfo($$)
         # get the information we wanted
         if (@tags and not %printFmt) {
             @foundTags = @tags;
-            $info = $exifTool->GetInfo(\@foundTags);
+            $info = $et->GetInfo(\@foundTags);
         }
     } else {
         # request specified tags unless using print format option
-        my $oldDups = $exifTool->Options('Duplicates');
+        my $oldDups = $et->Options('Duplicates');
         if (%printFmt) {
-            $exifTool->Options(Duplicates => 1);
-            $exifTool->Options(RequestAll => 1);
+            $et->Options(Duplicates => 1);
+            $et->Options(RequestAll => 1);
         } else {
             @foundTags = @tags;
         }
         # extract the information
-        $info = $exifTool->ImageInfo($pipe, \@foundTags);
-        $exifTool->Options(Duplicates => $oldDups);
+        $info = $et->ImageInfo(Infile($pipe), \@foundTags);
+        $et->Options(Duplicates => $oldDups);
     }
     # all done now if we already wrote output text file (ie. verbose option)
     if ($fp) {
         if ($outfile) {
-            $exifTool->Options(TextOut => \*STDOUT);
+            $et->Options(TextOut => \*STDOUT);
             undef $tmpText;
             if ($info->{Error}) {
                 close($fp);
@@ -1732,8 +1769,10 @@ sub GetImageInfo($$)
     # (because we are likely ignoring them and piping stdout to file)
     # or if there is none of the requested information available
     if ($binaryOutput or not %$info) {
-        my $errs = $exifTool->GetInfo('Warning', 'Error');
-        PrintErrors($exifTool, $errs, $file);
+        my $errs = $et->GetInfo('Warning', 'Error');
+        PrintErrors($et, $errs, $file) and $rtnVal = 1;
+    } elsif ($et->GetValue('Error')) {
+        $rtnVal = 1;
     }
 
     # open output file (or stdout if no output file) if not done already
@@ -1749,7 +1788,7 @@ sub GetImageInfo($$)
         my ($type, $doc, $grp);
         undef $fileTrailer;
         # repeat for each embedded document if necessary
-        my $lastDoc = $exifTool->Options('ExtractEmbedded') ? $exifTool->{DOC_COUNT} : 0;
+        my $lastDoc = $et->Options('ExtractEmbedded') ? $$et{DOC_COUNT} : 0;
         foreach $type ('HEAD', 'BODY', 'TAIL') {
             my $prf = $printFmt{$type} or next;
             for ($doc=0; $doc<=$lastDoc; ++$doc) {
@@ -1767,7 +1806,7 @@ sub GetImageInfo($$)
                 }
                 my @lines;
                 foreach (@$prf) {
-                    my $line = $exifTool->InsertTagValues(\@foundTags, $_, 'Warn');
+                    my $line = $et->InsertTagValues(\@foundTags, $_, 'Warn');
                     push @lines, $line if defined $line;
                 }
                 $lineCount += scalar @lines;
@@ -1780,8 +1819,8 @@ sub GetImageInfo($$)
             }
         }
         delete $printFmt{HEAD} unless $outfile; # print header only once per output file
-        my $errs = $exifTool->GetInfo('Warning', 'Error');
-        PrintErrors($exifTool, $errs, $file);
+        my $errs = $et->GetInfo('Warning', 'Error');
+        PrintErrors($et, $errs, $file);
     } elsif (not $disableOutput) {
         my ($tag, $line, %noDups, %csvInfo, $bra, $ket, $sep);
         if ($fp) {
@@ -1801,7 +1840,7 @@ sub GetImageInfo($$)
                 # define namespaces for all tag groups
                 my %groups;
                 foreach $tag (@foundTags) {
-                    my ($grp, $grp1) = $exifTool->GetGroup($tag);
+                    my ($grp, $grp1) = $et->GetGroup($tag);
                     unless ($grp1) {
                         next unless defined $forcePrint;
                         $grp = $grp1 = 'Unknown';
@@ -1830,7 +1869,7 @@ sub GetImageInfo($$)
         }
         # suppress duplicates manually in JSON and short XML output
         my $noDups = ($json or ($xml and $outFormat > 0));
-        my $printConv = $mainTool->Options('PrintConv');
+        my $printConv = $mt->Options('PrintConv');
         my $lastGroup = '';
 TAG:    foreach $tag (@foundTags) {
             my $tagName = GetTagName($tag);
@@ -1840,7 +1879,7 @@ TAG:    foreach $tag (@foundTags) {
             if (ref $val) {
                 if (defined $binaryOutput and not $binaryOutput) { # happens with -X -b or -php -b
                     # avoid extracting Protected binary tags (ie. data blocks) [insider information]
-                    next if $exifTool->{TAG_INFO}{$tag}{Protected};
+                    next if $$et{TAG_INFO}{$tag}{Protected};
                 }
                 $val = ConvertBinary($val); # convert SCALAR references
                 if ($structOpt) {
@@ -1873,11 +1912,11 @@ TAG:    foreach $tag (@foundTags) {
                 }
             }
             if (defined $showGroup) {
-                $group = $exifTool->GetGroup($tag, $showGroup);
+                $group = $et->GetGroup($tag, $showGroup);
                 # look ahead to see if this tag may suppress a priority tag in
                 # the same group, and if so suppress this tag instead
                 next if $noDups and $tag =~ /^(.*?) ?\(/ and defined $$info{$1} and
-                        $group eq $exifTool->GetGroup($1, $showGroup);
+                        $group eq $et->GetGroup($1, $showGroup);
                 $group = 'Unknown' if not $group and ($xml or $json);
                 if ($fp and not ($allGroup or $csv)) {
                     if ($lastGroup ne $group) {
@@ -1907,14 +1946,14 @@ TAG:    foreach $tag (@foundTags) {
             for (;;) {
                 if ($tagOut) {
                     # determine suggested extension for output file
-                    my $ext = SuggestedExtension($exifTool, \$val, $tagName);
+                    my $ext = SuggestedExtension($et, \$val, $tagName);
                     if (%wext and ($wext{$ext} || $wext{'*'} || -1) < 0) {
                         if ($verbose and $verbose > 1) {
-                            print "Not writing $ext output file for $tagName\n";
+                            print $vout "Not writing $ext output file for $tagName\n";
                         }
                         next TAG;
                     }
-                    my @groups = $mainTool->GetGroup($tag);
+                    my @groups = $mt->GetGroup($tag);
                     $outfile and close($fp), undef($tmpText); # (shouldn't happen)
                     ($fp, $outfile, $append) = OpenOutputFile($orig, $tagName, \@groups, $ext);
                     $fp or ++$countBad, next TAG;
@@ -1931,7 +1970,7 @@ TAG:    foreach $tag (@foundTags) {
                         }
                         close($fp);
                         undef $tmpText;
-                        $verbose and print "Wrote $tagName to $outfile\n";
+                        $verbose and print $vout "Wrote $tagName to $outfile\n";
                         undef $outfile;
                         undef $fp;
                         next TAG unless $valList and @$valList;
@@ -1969,7 +2008,7 @@ TAG:    foreach $tag (@foundTags) {
             }
 
             # get description if we need it (use tag name if $outFormat > 0)
-            my $desc = $outFormat > 0 ? $tagName : $exifTool->GetDescription($tag);
+            my $desc = $outFormat > 0 ? $tagName : $et->GetDescription($tag);
 
             if ($xml) {
                 # RDF/XML output format
@@ -1997,7 +2036,7 @@ TAG:    foreach $tag (@foundTags) {
                 }
                 my ($xtra, $valNum, $descClose);
                 if ($showTagID) {
-                    my ($id, $lang) = $exifTool->GetTagID($tag);
+                    my ($id, $lang) = $et->GetTagID($tag);
                     if ($id =~ /^\d+$/) {
                         $id = sprintf("0x%.4x", $id) if $showTagID eq 'H';
                     } else {
@@ -2009,8 +2048,8 @@ TAG:    foreach $tag (@foundTags) {
                     $xtra = '';
                 }
                 if ($tabFormat) {
-                    my $table = $exifTool->GetTableName($tag);
-                    my $index = $exifTool->GetTagIndex($tag);
+                    my $table = $et->GetTableName($tag);
+                    my $index = $et->GetTagIndex($tag);
                     $xtra .= " et:table='$table'";
                     $xtra .= " et:index='$index'" if defined $index;
                 }
@@ -2037,7 +2076,7 @@ TAG:    foreach $tag (@foundTags) {
                         if ($printConv) {
                             # print PrintConv value
                             print $fp "\n   <et:prt$val</et:prt>";
-                            $val = $exifTool->GetValue($tag, 'ValueConv');
+                            $val = $et->GetValue($tag, 'ValueConv');
                             $val = '' unless defined $val;
                             # go back to print ValueConv value only if different
                             next unless IsEqual($val, $lastVal);
@@ -2063,15 +2102,15 @@ TAG:    foreach $tag (@foundTags) {
                 if ($showTagID or $outFormat < 0) {
                     $val = { val => $val };
                     if ($showTagID) {
-                        my $id = $exifTool->GetTagID($tag);
+                        my $id = $et->GetTagID($tag);
                         $id = sprintf('0x%.4x', $id) if $showTagID eq 'H' and $id =~ /^\d+$/;
                         $$val{id} = $id;
                     }
                     if ($outFormat < 0) {
                         $$val{desc} = $desc;
                         if ($printConv) {
-                            my $num = $exifTool->GetValue($tag, 'ValueConv');
-                            $$val{num} = $num unless IsEqual($num, $$val{val});
+                            my $num = $et->GetValue($tag, 'ValueConv');
+                            $$val{num} = $num if defined $num and not IsEqual($num, $$val{val});
                         }
                     }
                 }
@@ -2081,7 +2120,7 @@ TAG:    foreach $tag (@foundTags) {
             }
             my $id;
             if ($showTagID) {
-                $id = $exifTool->GetTagID($tag);
+                $id = $et->GetTagID($tag);
                 if ($id =~ /^(\d+)(\.\d+)?$/) { # only print numeric ID's
                     $id = sprintf("0x%.4x", $1) if $showTagID eq 'H';
                 } else {
@@ -2160,7 +2199,7 @@ TAG:    foreach $tag (@foundTags) {
                 }
                 close($fp);
                 undef $tmpText;
-                $verbose and print "Wrote $tagName to $outfile\n";
+                $verbose and print $vout "Wrote $tagName to $outfile\n";
                 undef $outfile;
                 undef $fp;
             }
@@ -2205,15 +2244,15 @@ TAG:    foreach $tag (@foundTags) {
 # Returns: true on success
 sub SetImageInfo($$$)
 {
-    my ($exifTool, $file, $orig) = @_;
+    my ($et, $file, $orig) = @_;
     my ($outfile, $restored, $isTemporary, $isStdout, $outType, $tagsFromSrc);
     my $infile = $file;    # save infile in case we change it again
 
     undef $tmpFile; # make sure this isn't defined
 
     # clear any existing errors or warnings since we check these on return
-    delete $exifTool->{VALUE}->{Error};
-    delete $exifTool->{VALUE}->{Warning};
+    delete $$et{VALUE}{Error};
+    delete $$et{VALUE}{Warning};
 
     # first, try to determine our output file name so we can return quickly
     # if it already exists (note: this test must be delayed until after we
@@ -2235,7 +2274,7 @@ sub SetImageInfo($$$)
         if (not $isStdout and (-d $outfile or $outfile =~ /\/$/)) {
             $outfile .= '/' unless $outfile =~ /\/$/;
             my $name = $file;
-            $name =~ s/.*\///;  # remove directory name
+            $name =~ s/^.*\///s;    # remove directory name
             $outfile .= $name;
         } else {
             my $srcType = GetFileType($file) || '';
@@ -2249,7 +2288,7 @@ sub SetImageInfo($$$)
                 }
                 if ($file ne '') {
                     # restore previous new values unless done already
-                    $exifTool->RestoreNewValues() unless $restored;
+                    $et->RestoreNewValues() unless $restored;
                     $restored = 1;
                     # translate to this type by setting specified tags from file
                     my @setTags = @tags;
@@ -2265,7 +2304,7 @@ sub SetImageInfo($$$)
                     # assume "-tagsFromFile @" unless -tagsFromFile already specified
                     # (%setTags won't be empty if -tagsFromFile used)
                     if (not %setTags or (@setTags and not $setTags{'@'})) {
-                        return 0 unless DoSetFromFile($exifTool, $file, \@setTags);
+                        return 0 unless DoSetFromFile($et, $file, \@setTags);
                     } elsif (@setTags) {
                         # add orphaned tags to existing "-tagsFromFile @" for this file only
                         push @setTags, @{$setTags{'@'}};
@@ -2290,7 +2329,7 @@ sub SetImageInfo($$$)
     # set tags from destination file if required
     if (@dynamicFiles) {
         # restore previous values if necessary
-        $exifTool->RestoreNewValues() unless $restored;
+        $et->RestoreNewValues() unless $restored;
         my ($dyFile, %setTagsIndex);
         foreach $dyFile (@dynamicFiles) {
             if (not ref $dyFile) {
@@ -2311,37 +2350,40 @@ sub SetImageInfo($$$)
                     $setTags = $setTagsList{$dyFile}[$i] if $setTagsList{$dyFile}[$i];
                 }
                 # set new values values from file
-                return 0 unless DoSetFromFile($exifTool, $fromFile, $setTags);
+                return 0 unless DoSetFromFile($et, $fromFile, $setTags);
             } elsif (ref $dyFile eq 'ARRAY') {
                 # a dynamic file containing a simple tag value
                 my $fname = FilenameSPrintf($$dyFile[1], $orig);
                 my ($buff, $rtn, $wrn);
                 my $opts = $$dyFile[2];
                 if (defined $fname and SlurpFile($fname, \$buff)) {
-                    $verbose and print "Reading $$dyFile[0] from $fname\n";
-                    ($rtn, $wrn) = $mainTool->SetNewValue($$dyFile[0], $buff, %$opts);
+                    $verbose and print $vout "Reading $$dyFile[0] from $fname\n";
+                    ($rtn, $wrn) = $mt->SetNewValue($$dyFile[0], $buff, %$opts);
                     $wrn and Warn "$wrn\n";
                 }
                 # remove this tag if we couldn't set it properly
-                $rtn or $mainTool->SetNewValue($$dyFile[0], undef, Replace => 2,
-                                               ProtectSaved => $$opts{ProtectSaved});
+                $rtn or $mt->SetNewValue($$dyFile[0], undef, Replace => 2,
+                                         ProtectSaved => $$opts{ProtectSaved});
                 next;
             } elsif (ref $dyFile eq 'SCALAR') {
                 # set new values from CSV database
                 my ($f, $found, $tag);
+                undef $evalWarning;
+                local $SIG{'__WARN__'} = sub { $evalWarning = $_[0] };
                 # read tags for SourceFile '*' plus the specific file
                 foreach $f ('*', $file) {
                     my $csvInfo = $database{$f};
                     unless ($csvInfo) {
                         next if $f eq '*' or not require Cwd;
-                        # check canonical file name
-                        $csvInfo = $database{Cwd::abs_path($f)} or next;
+                        # check absolute path
+                        my $absPath = Cwd::abs_path($f);
+                        next unless defined $absPath and $csvInfo = $database{$absPath};
                     }
                     $found = 1;
-                    $verbose and print "Setting new values from $csv database\n";
+                    $verbose and print $vout "Setting new values from $csv database\n";
                     foreach $tag (sort keys %$csvInfo) {
                         next if $tag =~ /\b(SourceFile|Directory|FileName)$/i; # don't write these
-                        my ($rtn, $wrn) = $mainTool->SetNewValue($tag, $$csvInfo{$tag},
+                        my ($rtn, $wrn) = $mt->SetNewValue($tag, $$csvInfo{$tag},
                                           Protected => 1, AddValue => $csvAdd,
                                           ProtectSaved => $csvSaveCount);
                         $wrn and Warn "$wrn\n" if $verbose;
@@ -2350,8 +2392,8 @@ sub SetImageInfo($$$)
                 unless ($found) {
                     Warn("No SourceFile '$file' in imported $csv database\n");
                     if (require Cwd) {
-                        my $cFile = Cwd::abs_path($file);
-                        Warn("(canonical path: '$cFile')\n");
+                        my $absFile = Cwd::abs_path($file);
+                        Warn("(absolute path: '$absFile')\n") if defined $absFile;
                     }
                     return 0;
                 }
@@ -2367,21 +2409,21 @@ sub SetImageInfo($$$)
         }
     } else {
         # determine what our output file name should be
-        my $newFileName = $exifTool->GetNewValues('FileName');
-        my $newDir = $exifTool->GetNewValues('Directory');
+        my $newFileName = $et->GetNewValues('FileName');
+        my $newDir = $et->GetNewValues('Directory');
         if (defined $newFileName or defined $newDir or ($doSetFileName and defined $outfile)) {
             if ($newFileName) {
                 $newFileName = FilenameSPrintf($newFileName, $orig);
                 if (defined $outfile) {
-                    $outfile = Image::ExifTool::GetNewFileName($orig, $outfile) if $orig ne '';
+                    $outfile = Image::ExifTool::GetNewFileName($file, $outfile) if $file ne '';
                     $outfile = Image::ExifTool::GetNewFileName($outfile, $newFileName);
-                } elsif ($orig ne '') {
-                    $outfile = Image::ExifTool::GetNewFileName($orig, $newFileName);
+                } elsif ($file ne '') {
+                    $outfile = Image::ExifTool::GetNewFileName($file, $newFileName);
                 }
             }
             if ($newDir) {
                 $newDir = FilenameSPrintf($newDir, $orig);
-                $outfile = Image::ExifTool::GetNewFileName(defined $outfile ? $outfile : $orig, $newDir);
+                $outfile = Image::ExifTool::GetNewFileName(defined $outfile ? $outfile : $file, $newDir);
             }
             $outfile = NextUnusedFilename($outfile, $infile);
             if (-e $outfile) {
@@ -2394,7 +2436,7 @@ sub SetImageInfo($$$)
             }
         }
         if (defined $outfile) {
-            $verbose and print "'$infile' --> '$outfile'\n";
+            $verbose and print $vout "'$infile' --> '$outfile'\n";
             # create output directory if necessary
             CreateDirectory($outfile);
             # set temporary file (automatically erased on abnormal exit)
@@ -2402,11 +2444,11 @@ sub SetImageInfo($$$)
         }
         unless (defined $tmpFile) {
             # count the number of tags and pseudo-tags we are writing
-            my ($numSet, $numPseudo) = $exifTool->CountNewValues();
+            my ($numSet, $numPseudo) = $et->CountNewValues();
             if (-e $file) {
                 unless ($numSet) {
                     # no need to write if no tags set
-                    print "Nothing changed in $file\n" if defined $verbose;
+                    print $vout "Nothing changed in $file\n" if defined $verbose;
                     ++$countSameWr;
                     return 1;
                 }
@@ -2430,10 +2472,10 @@ sub SetImageInfo($$$)
             }
             # quickly rename file and/or set file date if this is all we are doing
             if ($numSet == $numPseudo) {
-                my $r1 = $exifTool->SetFileModifyDate($file,undef,'FileCreateDate');
-                my $r2 = $exifTool->SetFileModifyDate($file);
+                my $r1 = $et->SetFileModifyDate($file,undef,'FileCreateDate');
+                my $r2 = $et->SetFileModifyDate($file);
                 my $r3 = 0;
-                $r3 = $exifTool->SetFileName($file, $outfile) if defined $outfile;
+                $r3 = $et->SetFileName($file, $outfile) if defined $outfile;
                 if ($r1 > 0 or $r2 > 0 or $r3 > 0) {
                     ++$countGoodWr;
                 } elsif ($r1 < 0 or $r2 < 0 or $r3 < 0) {
@@ -2459,7 +2501,7 @@ sub SetImageInfo($$$)
         }
     }
     # rewrite the file
-    my $success = $exifTool->WriteInfo($file, $outfile, $outType);
+    my $success = $et->WriteInfo(Infile($file), $outfile, $outType);
 
     # get file time if preserving it
     my ($aTime, $mTime, $cTime);
@@ -2577,7 +2619,7 @@ sub SetImageInfo($$$)
             }
             ++$countCopyWr;
         }
-        print "Nothing changed in $file\n" if defined $verbose;
+        print $vout "Nothing changed in $file\n" if defined $verbose;
     } else {
         unlink $tmpFile if defined $tmpFile;
         ++$countBadWr;
@@ -2783,12 +2825,18 @@ sub ConvertBinary($)
             $val = ConvertBinary($val) if ref $val;
         }
     } elsif (ref $obj eq 'SCALAR') {
-        # (binaryOutput flag is set to 0 for binary mode of XML/PHP output formats)
+        # (binaryOutput flag is set to 0 for binary mode of XML/PHP/JSON output formats)
         if (defined $binaryOutput) {
             $obj = $$obj;
+            # encode in base64 if necessary
+            if ($json == 1 and ($obj =~ /[^\x09\x0a\x0d\x20-\x7e\x80-\xf7]/ or 
+                                Image::ExifTool::XMP::IsUTF8(\$obj) < 0))
+            {
+                $obj = 'base64:' . Image::ExifTool::XMP::EncodeBase64($obj, 1);
+            }
         } else {
-            # (-b is not valid for JSON or HTML output)
-            my $bOpt = ($json==1 or $html) ? '' : ', use -b option to extract';
+            # (-b is not valid for HTML output)
+            my $bOpt = $html ? '' : ', use -b option to extract';
             if ($$obj =~ /^Binary data/) {
                 $obj = "($$obj$bOpt)";
             } else {
@@ -2841,15 +2889,34 @@ sub AddSetTagsFile($;$)
 }
 
 #------------------------------------------------------------------------------
+# Get input file name or reference for calls to the ExifTool API
+# Inputs: 0) file name ('-' for STDIN), 1) flag to buffer STDIN
+# Returns: file name, or RAF reference for buffering STDIN
+sub Infile($;$)
+{
+    my ($file, $bufferStdin) = @_;
+    if ($file eq '-' and ($bufferStdin or $rafStdin)) {
+        if ($rafStdin) {
+            $rafStdin->Seek(0); # rewind
+        } elsif (open RAF_STDIN, '-') {
+            $rafStdin = new File::RandomAccess(\*RAF_STDIN);
+            $rafStdin->BinMode();
+        }
+        return $rafStdin if $rafStdin;
+    }
+    return $file;
+}
+
+#------------------------------------------------------------------------------
 # Set new values from file
 # Inputs: 0) exiftool ref, 1) filename, 2) reference to list of values to set
 # Returns: 0 on error (and increments $countBadWr)
 sub DoSetFromFile($$$)
 {
     local $_;
-    my ($exifTool, $file, $setTags) = @_;
-    $verbose and print "Setting new values from $file\n";
-    my $info = $exifTool->SetNewValuesFromFile($file, @$setTags);
+    my ($et, $file, $setTags) = @_;
+    $verbose and print $vout "Setting new values from $file\n";
+    my $info = $et->SetNewValuesFromFile(Infile($file,1), @$setTags);
     my $numSet = scalar(keys %$info);
     if ($$info{Error}) {
         # delete all error and warning tags
@@ -2866,8 +2933,7 @@ sub DoSetFromFile($$$)
         ++$warns while $$info{"Warning ($warns)"};
         $numSet -= $warns;
     }
-    PrintErrors($exifTool, $info, $file);
-    $$info{Error} and ++$countBadWr, return 0;
+    PrintErrors($et, $info, $file) and ++$countBadWr, return 0;
     Warn "Warning: No writable tags set from $file\n" unless $numSet;
     return 1;
 }
@@ -2887,7 +2953,7 @@ sub CleanFilename($)
 # Notes: arg 0 is not used if arg 1 is defined
 sub ProcessFiles($;$)
 {
-    my ($exifTool, $list) = @_;
+    my ($et, $list) = @_;
     my $file;
     foreach $file (@files) {
         if (defined $progressMax) {
@@ -2896,11 +2962,11 @@ sub ProcessFiles($;$)
         }
         if (-d $file) {
             $multiFile = $validFile = 1;
-            ScanDir($mainTool, $file, $list);
+            ScanDir($mt, $file, $list);
         } elsif ($filterFlag and not AcceptFile($file)) {
             if (-e $file) {
                 $filtered = 1;
-                $verbose and print "-------- $file (wrong extension)$progStr\n";
+                $verbose and print $vout "-------- $file (wrong extension)$progStr\n";
             } else {
                 Warn "File not found: $file\n";
                 $rtnVal = 1;
@@ -2908,7 +2974,7 @@ sub ProcessFiles($;$)
         } else {
             $validFile = 1;
             $list and push(@$list, $file), next;
-            GetImageInfo($exifTool, $file);
+            GetImageInfo($et, $file);
         }
     }
 }
@@ -2918,7 +2984,7 @@ sub ProcessFiles($;$)
 # Inputs: 0) ExifTool ref, 1) directory name, 2) list ref to return file names
 sub ScanDir($$;$)
 {
-    my ($exifTool, $dir, $list) = @_;
+    my ($et, $dir, $list) = @_;
     opendir(DIR_HANDLE, $dir) or Warn("Error opening directory $dir\n"), return;
     my @fileList = readdir(DIR_HANDLE);
     closedir(DIR_HANDLE);
@@ -2930,7 +2996,7 @@ sub ScanDir($$;$)
         if (-d $path) {
             next unless $recurse and $file !~ /^\./; # ignore dirs starting with "."
             next if $ignore{$file} or ($ignore{SYMLINKS} and -l $path);
-            ScanDir($exifTool, $path, $list);
+            ScanDir($et, $path, $list);
             next;
         }
         # apply rules from -ext options
@@ -2955,7 +3021,7 @@ sub ScanDir($$;$)
             }
         }
         $list and push(@$list, $path), next;
-        GetImageInfo($exifTool, $path);
+        GetImageInfo($et, $path);
     }
     ++$countDir;
 }
@@ -3013,7 +3079,7 @@ sub AddPrintFormat($)
 # Returns: file extension (lower case), or 'dat' if unknown
 sub SuggestedExtension($$$)
 {
-    my ($exifTool, $valPt, $tag) = @_;
+    my ($et, $valPt, $tag) = @_;
     my $ext;
     if (not $binaryOutput) {
         $ext = 'txt';
@@ -3032,9 +3098,9 @@ sub SuggestedExtension($$$)
     } elsif ($$valPt =~ /^RIFF....WAVE/s) {
         $ext = 'wav';
     } elsif ($tag eq 'OriginalRawFileData' and
-        defined($ext = $exifTool->GetValue('OriginalRawFileName')))
+        defined($ext = $et->GetValue('OriginalRawFileName')))
     {
-        $ext =~ s/.*\.//;
+        $ext =~ s/^.*\.//s;
         $ext = $ext ? lc($ext) : 'raw';
     } elsif ($tag eq 'EXIF') {
         $ext = 'exif';
@@ -3060,7 +3126,7 @@ sub LoadPrintFormat($)
     my $arg = shift;
     if (not defined $arg) {
         Error "Must specify file or expression for -p option\n";
-    } elsif (-f $arg and Open(\*FMT_FILE, $arg)) {
+    } elsif ($arg !~ /\n/ and -f $arg and Open(\*FMT_FILE, $arg)) {
         foreach (<FMT_FILE>) {
             AddPrintFormat($_);
         }
@@ -3208,7 +3274,7 @@ sub CreateDirectory($)
             {
                 # create directory since it doesn't exist
                 mkdir($dir, 0777) or Error("Error creating directory $dir\n"), return 0;
-                $verbose and print "Created directory $dir\n";
+                $verbose and print $vout "Created directory $dir\n";
                 $created = 1;
             }
             $dir .= '/';
@@ -3272,7 +3338,7 @@ sub OpenOutputFile($;@)
 sub AcceptFile($)
 {
     my $file = shift;
-    my $ext = ($file =~ /.*\.(.+)$/) ? uc($1) : '';
+    my $ext = ($file =~ /^.*\.(.+)$/s) ? uc($1) : '';
     return $filterExt{$ext} if defined $filterExt{$ext};
     return $filterExt{'*'} if defined $filterExt{'*'};
     return 0 if $filterFlag & 0x02; # reject if accepting specific extensions
@@ -3422,18 +3488,20 @@ sub PrintTagList($@)
 #------------------------------------------------------------------------------
 # Print warnings and errors from info hash
 # Inputs: 0) ExifTool object ref, 1) info hash, 2) file name
+# Returns: true if there was an Error
 sub PrintErrors($$$)
 {
-    my ($exifTool, $info, $file) = @_;
+    my ($et, $info, $file) = @_;
     my ($tag, $key);
     foreach $tag (qw(Warning Error)) {
         next unless $$info{$tag};
         my @keys = ( $tag );
-        push @keys, sort(grep /^$tag /, keys %$info) if $exifTool->Options('Duplicates');
+        push @keys, sort(grep /^$tag /, keys %$info) if $et->Options('Duplicates');
         foreach $key (@keys) {
             Warn "$tag: $info->{$key} - $file\n";
         }
     }
+    return $$info{Error};
 }
 
 __END__
@@ -3468,12 +3536,12 @@ when one is expected.
 A command-line interface to L<Image::ExifTool|Image::ExifTool>, used for
 reading and writing meta information in a variety of file types.  I<FILE> is
 one or more source file names, directory names, or C<-> for the standard
-input.  Information is read from source files and printed in readable form
+input.  Metadata is read from source files and printed in readable form
 to the console (or written to output text files with B<-w>).
 
-To write or delete information, tag values are assigned using the
+To write or delete metadata, tag values are assigned using the
 -I<TAG>=[I<VALUE>] syntax, or the B<-geotag> option.  To copy or move
-information, the B<-tagsFromFile> feature is used.  By default the original
+metadata, the B<-tagsFromFile> feature is used.  By default the original
 files are preserved with C<_original> appended to their names -- be sure to
 verify that the new files are OK before erasing the originals.  Once in
 write mode, exiftool will ignore any read-specific options.
@@ -3488,37 +3556,38 @@ supported by ExifTool (r = read, w = write, c = create):
 
   File Types
   ------------+-------------+-------------+-------------+------------
-  3FR   r     | EIP   r     | LA    r     | ORF   r/w   | RSRC  r
-  3G2   r     | EPS   r/w   | LNK   r     | OTF   r     | RTF   r
-  3GP   r     | ERF   r/w   | M2TS  r     | PAC   r     | RW2   r/w
-  ACR   r     | EXE   r     | M4A/V r     | PAGES r     | RWL   r/w
-  AFM   r     | EXIF  r/w/c | MEF   r/w   | PBM   r/w   | RWZ   r
-  AI    r/w   | EXR   r     | MIE   r/w/c | PCD   r     | RM    r
-  AIFF  r     | F4A/V r     | MIFF  r     | PDF   r/w   | SO    r
-  APE   r     | FFF   r/w   | MKA   r     | PEF   r/w   | SR2   r/w
-  ARW   r/w   | FLA   r     | MKS   r     | PFA   r     | SRF   r
-  ASF   r     | FLAC  r     | MKV   r     | PFB   r     | SRW   r/w
-  AVI   r     | FLV   r     | MNG   r/w   | PFM   r     | SVG   r
-  BMP   r     | FPF   r     | MODD  r     | PGF   r     | SWF   r
-  BTF   r     | FPX   r     | MOS   r/w   | PGM   r/w   | THM   r/w
-  CHM   r     | GIF   r/w   | MOV   r     | PLIST r     | TIFF  r/w
-  COS   r     | GZ    r     | MP3   r     | PICT  r     | TTC   r
-  CR2   r/w   | HDP   r/w   | MP4   r     | PMP   r     | TTF   r
-  CRW   r/w   | HDR   r     | MPC   r     | PNG   r/w   | VRD   r/w/c
-  CS1   r/w   | HTML  r     | MPG   r     | PPM   r/w   | VSD   r
-  DCM   r     | ICC   r/w/c | MPO   r/w   | PPT   r     | WAV   r
-  DCP   r/w   | IDML  r     | MQV   r     | PPTX  r     | WDP   r/w
-  DCR   r     | IIQ   r/w   | MRW   r/w   | PS    r/w   | WEBP  r
-  DFONT r     | IND   r/w   | MXF   r     | PSB   r/w   | WEBM  r
-  DIVX  r     | INX   r     | NEF   r/w   | PSD   r/w   | WMA   r
-  DJVU  r     | ITC   r     | NRW   r/w   | PSP   r     | WMV   r
-  DLL   r     | J2C   r     | NUMBERS r   | QTIF  r     | WV    r
-  DNG   r/w   | JNG   r/w   | ODP   r     | RA    r     | X3F   r/w
-  DOC   r     | JP2   r/w   | ODS   r     | RAF   r/w   | XCF   r
-  DOCX  r     | JPEG  r/w   | ODT   r     | RAM   r     | XLS   r
-  DV    r     | K25   r     | OFR   r     | RAR   r     | XLSX  r
-  DVB   r     | KDC   r     | OGG   r     | RAW   r/w   | XMP   r/w/c
-  DYLIB r     | KEY   r     | OGV   r     | RIFF  r     | ZIP   r
+  3FR   r     | EIP   r     | LA    r     | OTF   r     | RW2   r/w
+  3G2   r/w   | EPS   r/w   | LNK   r     | PAC   r     | RWL   r/w
+  3GP   r/w   | ERF   r/w   | M2TS  r     | PAGES r     | RWZ   r
+  ACR   r     | EXE   r     | M4A/V r/w   | PBM   r/w   | RM    r
+  AFM   r     | EXIF  r/w/c | MEF   r/w   | PCD   r     | SO    r
+  AI    r/w   | EXR   r     | MIE   r/w/c | PDF   r/w   | SR2   r/w
+  AIFF  r     | EXV   r/w/c | MIFF  r     | PEF   r/w   | SRF   r
+  APE   r     | F4A/V r/w   | MKA   r     | PFA   r     | SRW   r/w
+  ARW   r/w   | FFF   r/w   | MKS   r     | PFB   r     | SVG   r
+  ASF   r     | FLA   r     | MKV   r     | PFM   r     | SWF   r
+  AVI   r     | FLAC  r     | MNG   r/w   | PGF   r     | THM   r/w
+  BMP   r     | FLV   r     | MODD  r     | PGM   r/w   | TIFF  r/w
+  BTF   r     | FPF   r     | MOS   r/w   | PLIST r     | TORRENT r
+  CHM   r     | FPX   r     | MOV   r/w   | PICT  r     | TTC   r
+  COS   r     | GIF   r/w   | MP3   r     | PMP   r     | TTF   r
+  CR2   r/w   | GZ    r     | MP4   r/w   | PNG   r/w   | VRD   r/w/c
+  CRW   r/w   | HDP   r/w   | MPC   r     | PPM   r/w   | VSD   r
+  CS1   r/w   | HDR   r     | MPG   r     | PPT   r     | WAV   r
+  DCM   r     | HTML  r     | MPO   r/w   | PPTX  r     | WDP   r/w
+  DCP   r/w   | ICC   r/w/c | MQV   r/w   | PS    r/w   | WEBP  r
+  DCR   r     | IDML  r     | MRW   r/w   | PSB   r/w   | WEBM  r
+  DFONT r     | IIQ   r/w   | MXF   r     | PSD   r/w   | WMA   r
+  DIVX  r     | IND   r/w   | NEF   r/w   | PSP   r     | WMV   r
+  DJVU  r     | INX   r     | NRW   r/w   | QTIF  r/w   | WV    r
+  DLL   r     | ITC   r     | NUMBERS r   | RA    r     | X3F   r/w
+  DNG   r/w   | J2C   r     | ODP   r     | RAF   r/w   | XCF   r
+  DOC   r     | JNG   r/w   | ODS   r     | RAM   r     | XLS   r
+  DOCX  r     | JP2   r/w   | ODT   r     | RAR   r     | XLSX  r
+  DPX   r     | JPEG  r/w   | OFR   r     | RAW   r/w   | XMP   r/w/c
+  DV    r     | K25   r     | OGG   r     | RIFF  r     | ZIP   r
+  DVB   r/w   | KDC   r     | OGV   r     | RSRC  r     |
+  DYLIB r     | KEY   r     | ORF   r/w   | RTF   r     |
 
   Meta Information
   ----------------------+----------------------+---------------------
@@ -3527,15 +3596,16 @@ supported by ExifTool (r = read, w = write, c = create):
   IPTC           r/w/c  |  Kodak Meta     r/w  |  Adobe APP14    r
   XMP            r/w/c  |  FotoStation    r/w  |  MPF            r
   MakerNotes     r/w/c  |  PhotoMechanic  r/w  |  Stim           r
-  Photoshop IRB  r/w/c  |  JPEG 2000      r    |  APE            r
-  ICC Profile    r/w/c  |  DICOM          r    |  Vorbis         r
-  MIE            r/w/c  |  Flash          r    |  SPIFF          r
-  JFIF           r/w/c  |  FlashPix       r    |  DjVu           r
-  Ducky APP12    r/w/c  |  QuickTime      r    |  M2TS           r
-  PDF            r/w/c  |  Matroska       r    |  PE/COFF        r
-  PNG            r/w/c  |  GeoTIFF        r    |  AVCHD          r
-  Canon VRD      r/w/c  |  PrintIM        r    |  ZIP            r
-  Nikon Capture  r/w/c  |  ID3            r    |  (and more)
+  Photoshop IRB  r/w/c  |  JPEG 2000      r    |  DPX            r
+  ICC Profile    r/w/c  |  DICOM          r    |  APE            r
+  MIE            r/w/c  |  Flash          r    |  Vorbis         r
+  JFIF           r/w/c  |  FlashPix       r    |  SPIFF          r
+  Ducky APP12    r/w/c  |  QuickTime      r    |  DjVu           r
+  PDF            r/w/c  |  Matroska       r    |  M2TS           r
+  PNG            r/w/c  |  MXF            r    |  PE/COFF        r
+  Canon VRD      r/w/c  |  PrintIM        r    |  AVCHD          r
+  Nikon Capture  r/w/c  |  FLAC           r    |  ZIP            r
+  GeoTIFF        r/w/c  |  ID3            r    |  (and more)
 
 =head1 OPTIONS
 
@@ -3543,10 +3613,10 @@ Case is not significant for any command-line option (including tag and group
 names), except for single-character options when the corresponding
 upper-case option exists.  Many single-character options have equivalent
 long-name versions (shown in brackets), and some options have inverses which
-are invoked with a leading double-dash.  Note that multiple single-character
-options may NOT be combined into one argument because this would be
-interpreted as a tag name.  Contrary to standard practice, options may
-appear after source file names on the exiftool command line.
+are invoked with a leading double-dash.  Unrecognized options are
+interpreted as tag names (for this reason, multiple single-character options
+may NOT be combined into one argument).  Contrary to standard practice,
+options may appear after source file names on the exiftool command line.
 
 =head2 Option Summary
 
@@ -3643,6 +3713,7 @@ L<Other options|/Other options>
 
 L<Advanced options|/Advanced options>
 
+  -api OPT[=VAL]                   Set ExifTool API option
   -common_args                     Define common arguments
   -config CFGFILE                  Specify configuration file name
   -echo[NUM] TEXT                  Echo text to stdout or stderr
@@ -3658,8 +3729,9 @@ L<Advanced options|/Advanced options>
 
 =item B<->I<TAG>
 
-Extract information for specified tag (ie. C<-CreateDate>).  A tag name
-is the handle by which a piece of information is referenced.  See
+Extract information for the specified tag (ie. C<-CreateDate>).  Multiple
+tags may be specified in a single command.  A tag name is the handle by
+which a piece of information is referenced.  See
 L<Image::ExifTool::TagNames|Image::ExifTool::TagNames> for documentation on
 available tag names.  A tag name may include leading group names separated
 by colons (ie. C<-EXIF:CreateDate>, or C<-Doc1:XMP:Creator>), and each group
@@ -3693,40 +3765,46 @@ information.  Use the B<-s> option to see the tag names instead.
 Exclude specified tag from extracted information.  Same as the B<-x> option.
 Once excluded from the output, a tag may not be re-included by a subsequent
 option.  May also be used following a B<-tagsFromFile> option to exclude
-tags from being copied, or to exclude groups from being deleted when
+tags from being copied (when redirecting to another tag, it is the source
+tag that should be excluded), or to exclude groups from being deleted when
 deleting all information (ie. C<-all= --exif:all> deletes all but EXIF
 information).  But note that this will not exclude individual tags from a
-group delete. Instead, individual tags may be recovered using the
-B<-tagsFromFile> option (ie. C<-all= -tagsfromfile @ -artist>).  Wildcards
-are permitted as described above for B<-TAG>.
+group delete (unless a family 2 group is specified, see note 4 below). 
+Instead, individual tags may be recovered using the B<-tagsFromFile> option
+(ie. C<-all= -tagsfromfile @ -artist>). Wildcards are permitted as described
+above for B<-TAG>.
 
 =item B<->I<TAG>[+-]B<=>[I<VALUE>]
 
 Write a new value for the specified tag (ie. C<-comment=wow>), or delete the
-tag if no I<VALUE> is given (ie. C<-comment=>). C<+=> and C<-=> are used to
+tag if no I<VALUE> is given (ie. C<-comment=>).  C<+=> and C<-=> are used to
 add or remove existing entries from a list, or to shift date/time values
 (see L<Image::ExifTool::Shift.pl|Image::ExifTool::Shift.pl> for details).
 C<+=> may also be used to increment numerical values, and C<-=> may be used
 to conditionally delete or replace a tag (see L</WRITING EXAMPLES> for
 examples).
 
-I<TAG> may contain a leading family 0 or 1 group name separated by a colon.
-If no group name is specified, the tag is created in the preferred group,
-and updated in any other location where a same-named tag already exists. 
-The preferred group is the first group in the following list where I<TAG> is
-valid: 1) EXIF, 2) IPTC, 3) XMP.
+I<TAG> may contain one or more leading family 0, 1 or 2 group names,
+prefixed by optional family numbers, and separated colons.  If no group name
+is specified, the tag is created in the preferred group, and updated in any
+other location where a same-named tag already exists.  The preferred group
+is the first group in the following list where I<TAG> is valid: 1) EXIF, 2)
+IPTC, 3) XMP.
 
 The wildcards C<*> and C<?> may be used in tag names to assign the same
 value to multiple tags.  When specified with wildcards, "unsafe" tags are
 not written.  A tag name of C<All> is eqivalent to C<*> (except that it
 doesn't require quoting, while arguments with wildcards do on systems with
 shell globbing), and is often used when deleting all metadata (ie. C<-All=>)
-or an entire group (ie. C<-GROUP:All=>).  Note that not all groups are
-deletable, and that the JPEG APP14 "Adobe" group is not removed by default
-with C<-All=> because it may affect the appearance of the image.  Use the
-B<-listd> option for a complete list of deletable groups. Also, within an
-image some groups may be contained within others, and these groups are
-removed if the containing group is deleted:
+or an entire group (ie. C<-GROUP:All=>, see note 4 below).  Note that not
+all groups are deletable, and that the JPEG APP14 "Adobe" group is not
+removed by default with C<-All=> because it may affect the appearance of the
+image.  However, this will remove color space information, so the colors may
+be affected (but this may be avoided by copying back the tags defined by the
+ColorSpaceTags shortcut).  Use the B<-listd> option for a complete list of
+deletable groups, and see note 5 below regarding the "APP" groups.  Also,
+within an image some groups may be contained within others, and these groups
+are removed if the containing group is deleted:
 
   JPEG Image:
   - Deleting EXIF or IFD0 also deletes ExifIFD, GlobParamIFD,
@@ -3740,15 +3818,34 @@ removed if the containing group is deleted:
 
 Notes:
 
-1) MakerNotes tags may be edited, but not created or deleted individually. 
-This avoids many potential problems including the inevitable compatibility
-problems with OEM software which may be very inflexible about the
-information it expects to find in the maker notes.
+1) B<Many tag values may be assigned in a single command>.  If two
+assignments affect the same tag, the latter takes precedence (except for
+list-type tags, where both values are written).
+
+2) In general, MakerNotes tags are considered "Permanent", and may be edited
+but not created or deleted individually.  This avoids many potential
+problems including the inevitable compatibility problems with OEM software
+which may be very inflexible about the information it expects to find in the
+maker notes.
 
-2) Changes to PDF files are reversible because the original information is
+3) Changes to PDF files are reversible because the original information is
 never actually deleted from the file.  So ExifTool alone may not be used to
 securely edit metadata in PDF files.
 
+4) Specifying C<-GROUP:all=> deletes the entire group as a block only if a
+single family 0 or 1 group is specified.  Otherwise all deletable tags in
+the specified group(s) are removed individually, and in this case is it
+possible to exclude individual tags from a mass delete.  For example,
+C<-time:all --Exif:Time:All> removes all deletable Time tags except those in
+the EXIF.  This difference also applies if family 2 is specified when
+deleting all groups. For example, C<-2all:all=> deletes tags individually,
+while C<-all:all=> deletes entire blocks.
+
+5) The "APP" group names ("APP0" through "APP15") are used to delete JPEG
+application segments which are not associated with another deletable group. 
+For example, specifying C<-APP14:All=> will NOT delete the APP14 "Adobe"
+segment because this is accomplished with C<-Adobe:All>.
+
 Special feature:  Integer values may be specified in hexadecimal with a
 leading C<0x>, and simple rational values may be specified as fractions.
 
@@ -3772,15 +3869,16 @@ same-named tags in the preferred location of the output file (the same as
 specifying C<-all>).  More than one B<-tagsFromFile> option may be used to
 copy tags from multiple files.
 
-By default, this option will commute information between same-named tags in
-different groups and write each tag to the preferred group.  This allows
-some information to be automatically translated when copying between images
-of different formats.  However, if a group name is specified for a tag then
-the information is written to this group (unless redirected to another
-group, see below).  If C<All> is used as a group name, then the information
-is written to the same family 1 group in the destination file.  In this way,
-C<-All:All> is used to copy all information while preserving the family 1
-group (ie. the specific location in the metadata) of each tag.
+By default, this option will update any existing and writable same-named
+tags in the output I<FILE>, but will create new tags only in their preferred
+groups.  This allows some information to be automatically transferred to the
+appropriate group when copying between images of different formats. However,
+if a group name is specified for a tag then the information is written only
+to this group (unless redirected to another group, see below).  If C<All> is
+used as a group name, then each tag is written to the same family 1 group it
+had in the source file (ie. the same specific location in the metadata), but
+a different family may be specified by adding a leading family number to the
+group name (ie. C<-0All:all>).
 
 I<SRCFILE> may be the same as I<FILE> to move information around within a
 single file.  In this case, C<@> may be used to represent the source file
@@ -3910,8 +4008,8 @@ descriptions.  This option is mainly used for extracting embedded images or
 other binary data, but it may also be useful for some text strings since
 control characters (such as newlines) are not replaced by '.' as they are in
 the default output.  List items are separated by a newline when extracted
-with the B<-b> option.  May be combined with C<-php> or C<-X> to extract
-binary data in PHP or XML format.
+with the B<-b> option.  May be combined with C<-j>, C<-php> or C<-X> to
+extract binary data in JSON, PHP or XML format.
 
 =item B<-c> I<FMT> (B<-coordFormat>)
 
@@ -3987,7 +4085,7 @@ information about coded character sets.
 
 =item B<-csv>[=I<CSVFILE>]
 
-Export information in as a CSV file, or import information if I<CSVFILE> is
+Export information in CSV format, or import information if I<CSVFILE> is
 specified.  When importing, the CSV file must be in exactly the same format
 as the exported file.  The first row of the I<CSVFILE> must be the ExifTool
 tag names (with optional group names) for each column of the file, and
@@ -4002,12 +4100,24 @@ examples demonstrate basic use of this option:
     # update metadata for all images in a directory from CSV file
     exiftool -csv=a.csv dir
 
-Empty values are ignored when importing.  To force a tag to be deleted, use
-the B<-f> option and set the value to "-" in the CSV file (or to the
-MissingTagValue if this API option was used).  May be combined with the
-B<-g> or B<-G> option to add group names to the tags.  Note that list-type
-tags are stored as simple strings in a CSV file, but the B<-sep> option may
-be used to split them back into separate items when importing.
+Empty values are ignored when importing.  Also, FileName and Directory
+columns are ignored if they exist (ie. ExifTool will not attempt to write
+these tags with a CSV import).  To force a tag to be deleted, use the B<-f>
+option and set the value to "-" in the CSV file (or to the MissingTagValue
+if this API option was used).  Multiple databases may be imported in a
+single command.
+
+When exporting a CSV file, the B<-g> or B<-G> option to add group names to
+the tag headings.  If the B<-a> option is used to allow duplicate tag names,
+the duplicate tags are only included in the CSV output if the column
+headings are unique.  Adding the B<-G4> option ensures a unique column
+heading for each tag.  When exporting specific tags, the CSV columns are
+arranged in the same order as the specified tags provided the column
+headings exactly match the specified tag names, otherwise the columns are
+sorted in alphabetical order.
+
+List-type tags are stored as simple strings in a CSV file, but the B<-sep>
+option may be used to split them back into separate items when importing.
 
 Special feature:  B<-csv>+=I<CSVFILE> may be used to add items to existing
 lists. This affects only list-type tags.  Also applies to the B<-j> option.
@@ -4103,8 +4213,10 @@ simple strings).  The B<-a> option is implied if the B<-g> or B<-G> options
 are used, otherwise it is ignored and duplicate tags are suppressed.  Adding
 the B<-D> or B<-H> option changes tag values to JSON objects with "val" and
 "id" fields, and adding B<-l> adds a "desc" field, and a "num" field if the
-numerical value is different from the converted "val".  The B<-b>, B<-L> and
-B<-charset> options have no effect on the JSON output.
+numerical value is different from the converted "val".  The B<-b> option may
+be added to output binary data, encoded in base64 if necessary (indicated by
+"base64:" as the first 7 bytes of the value).  The B<-L> and B<-charset>
+options have no effect on the JSON output.
 
 If I<JSONFILE> is specified, the file is imported and the tag definitions
 from the file are used to set tag values on a per-file basis.  The special
@@ -4118,8 +4230,8 @@ may be suffixed with a C<#> to disable print conversion.
 =item B<-l> (B<-long>)
 
 Use long 2-line Canon-style output format.  Adds a description and
-unconverted value to the XML, JSON or PHP output when B<-X>, B<-j> or
-B<-php> is used.
+unconverted value (if it is different from the converted value) to the XML,
+JSON or PHP output when B<-X>, B<-j> or B<-php> is used.
 
 =item B<-L> (B<-latin>)
 
@@ -4182,7 +4294,7 @@ when writing.  For example, the following commands all have the same effect:
 
 Print output in the format specified by the given file or string (and ignore
 other format options).  Tag names in the format file or string begin with a
-C<$> symbol and may contain a leading group name and/or a trailing C<#>. 
+C<$> symbol and may contain a leading group names and/or a trailing C<#>. 
 Case is not significant.  Braces C<{}> may be used around the tag name to
 separate it from subsequent text.  Use C<$$> to represent a C<$> symbol, and
 C<$/> for a newline.  Multiple B<-p> options may be used, each contributing
@@ -4204,7 +4316,7 @@ with this command:
 
 produces output like this:
 
-    -- Generated by ExifTool 9.27 --
+    -- Generated by ExifTool 9.53 --
     File: a.jpg - 2003:10:31 15:44:19
     (f/5.6, 1/60s, ISO 100)
     File: b.jpg - 2006:05:23 11:57:38
@@ -4232,16 +4344,17 @@ and multiple consecutive underlines replaced by a single underline:
 
     exiftool -p '${make;tr/ /_/;s/__+/_/g}' image.jpg
 
-A default expression of C<tr(/\\?*:|"E<lt>E<gt>)()d> is assumed if the
-expression is empty, and removes the characters / \ ? * : | E<lt> and E<gt>
-from the printed value.
+A default expression of C<tr(/\\?*:|"E<lt>E<gt>\0)()d> is assumed if the
+expression is empty, which removes the characters / \ ? * : | E<lt> E<gt>
+and null from the printed value.
 
 =item B<-php>
 
 Format output as a PHP Array.  The B<-g>, B<-G>, B<-D>, B<-H>, B<-l>,
-B<-sep> and B<-struct> options combine with B<-php> in the same way as with
-B<-json>. As well, the B<-b> option may be added to output binary data. 
-Here is a simple example showing how this could be used in a PHP script:
+B<-sep> and B<-struct> options combine with B<-php>, and duplicate tags are
+handled in the same way as with the B<-json> option.  As well, the B<-b>
+option may be added to output binary data.  Here is a simple example showing
+how this could be used in a PHP script:
 
     <?php
     eval('$array=' . `exiftool -php -q image.jpg`);
@@ -4273,6 +4386,10 @@ values assigned to list-type tags to be split into individual items at each
 substring matching I<STR> (otherwise they are not split by default).  Space
 characters in I<STR> match zero or more whitespace characters in the value.
 
+Note that an empty separator ("") is allowed, and will join items with no
+separator when reading, or split the value into individual characters when
+writing.
+
 =item B<-sort>
 
 Sort output by tag description, or by tag name if the B<-s> option is used.
@@ -4396,8 +4513,9 @@ used as in the last example above.)
 For %c, these modifiers have a different effects.  If a field width is
 given, the copy number is padded with zeros to the specified width.  A
 leading '-' adds a dash before the copy number, and a '+' adds an underline.
-By default, a copy number of zero is omitted, but this can be changed by
-adding a decimal point to the modifier.  For example:
+By default, the copy number is omitted from the first file of a given name,
+but this can be changed by adding a decimal point to the modifier.  For
+example:
 
     -w A%-cZ.txt      # AZ.txt, A-1Z.txt, A-2Z.txt ...
     -w B%5c.txt       # B.txt, B00001.txt, B00002.txt ...
@@ -4435,7 +4553,7 @@ although %c is only valid for output file names.
 
 This enhanced version of the B<-w> option allows a separate output file to
 be created for each extracted tag.  The differences between B<-W> and B<-w>
-are listed below:
+are as follows:
 
 1) With B<-W>, a new output file is created for each extracted tag.
 
@@ -4453,7 +4571,9 @@ append feature, provides a method to write metadata from multiple source
 files to a single output file without the need for shell redirection.
 
 4) Adding the B<-v> option to B<-W> generates a list of the tags and output
-file names instead of giving a verbose dump of the entire file.
+file names instead of giving a verbose dump of the entire file.  (Unless
+appending all output to one file for each source file by using B<-W+> with
+an output file I<FMT> that does not contain %t, $g or %s.)
 
 5) Individual list items are stored in separate files when B<-W> is combined
 with B<-b>, but note that for separate files to be created %c must be used
@@ -4590,16 +4710,16 @@ is used.
 =item B<-if> I<EXPR>
 
 Specify a condition to be evaluated before processing each I<FILE>.  I<EXPR>
-is a Perl-like expression containing tag names prefixed by C<$> symbols.  It
-is evaluated with the tags from each I<FILE> in turn, and the file is
-processed only if the expression returns true.  Unlike Perl variable names,
-tag names are not case sensitive and may contain a hyphen.  As well, tag
-names may have a leading group name separated by a colon, and/or a trailing
-C<#> character to disable print conversion.  The expression C<$GROUP:all>
-evaluates to 1 if any tag exists in the specified C<GROUP>, or 0 otherwise
-(see note 2 below).  When multiple B<-if> options are used, all conditions
-must be satisfied to process the file.  Returns an exit status of 1 if all
-files fail the condition.  Below are a few examples:
+is a Perl-like logic expression containing tag names prefixed by C<$>
+symbols.  It is evaluated with the tags from each I<FILE> in turn, and the
+file is processed only if the expression returns true.  Unlike Perl variable
+names, tag names are not case sensitive and may contain a hyphen.  As well,
+tag names may have a leading group names separated by colons, and/or a
+trailing C<#> character to disable print conversion.  The expression
+C<$GROUP:all> evaluates to 1 if any tag exists in the specified C<GROUP>, or
+0 otherwise (see note 2 below).  When multiple B<-if> options are used, all
+conditions must be satisfied to process the file.  Returns an exit status of
+1 if all files fail the condition.  Below are a few examples:
 
     # extract shutterspeed from all Canon images in a directory
     exiftool -shutterspeed -if '$make eq "Canon"' dir
@@ -4633,9 +4753,8 @@ process one file based on tags from another, two steps are required.  For
 example, to process XMP sidecar files in directory C<DIR> based on tags from
 the associated NEF:
 
- a) exiftool -if EXPR -p '$directory/$filename' -ext nef DIR > nef.txt
-
- b) exiftool -@ nef.txt -srcfile %d%f.xmp ...
+    exiftool -if EXPR -p '$directory/$filename' -ext nef DIR > nef.txt
+    exiftool -@ nef.txt -srcfile %d%f.xmp ...
 
 =item B<-m> (B<-ignoreMinorErrors>)
 
@@ -4697,12 +4816,12 @@ file was successfully written (ie. the file is moved instead of copied).
 Similar to B<-overwrite_original> except that an extra step is added to
 allow the original file attributes to be preserved.  For example, on a Mac
 this causes the original file creation date, type, creator, label color,
-icon and hard links to the file to be preserved (but note that the Mac OS
-resource fork is always preserved unless specifically deleted with
-C<-rsrc:all=>).  This is implemented by opening the original file in update
-mode and replacing its data with a copy of a temporary file before deleting
-the temporary.  The extra step results in slower performance, so the
-B<-overwrite_original> option should be used instead unless necessary.
+icon, Finder tags and hard links to the file to be preserved (but note that
+the Mac OS resource fork is always preserved unless specifically deleted
+with C<-rsrc:all=>).  This is implemented by opening the original file in
+update mode and replacing its data with a copy of a temporary file before
+deleting the temporary.  The extra step results in slower performance, so
+the B<-overwrite_original> option should be used instead unless necessary.
 
 =item B<-P> (B<-preserve>)
 
@@ -4869,8 +4988,8 @@ read/write support for tags as recommended by the Metadata Working Group.
 To save typing, C<-use MWG> is assumed if the C<MWG> group is specified for
 any tag on the command line.  See the
 L<MWG Tags documentation|Image::ExifTool::TagNames/MWG Tags> for more
-details.  (Note that this option is not reversible, and remains in effect
-until the application terminates, even across the C<-execute> option.)
+details.  Note that this option is not reversible, and remains in effect
+until the application terminates, even across the C<-execute> option.
 
 =back
 
@@ -4937,7 +5056,7 @@ application.
 B<-listg>[I<NUM>], B<-listd>, B<-listx>
 
 Print a list of all valid tag names (B<-list>), all writable tag names
-(B<-listw>), all supported file extensions (B<-listff>), all recognized file
+(B<-listw>), all supported file extensions (B<-listf>), all recognized file
 extensions (B<-listr>), all writable file extensions (B<-listwf>), all tag
 groups [in a specified family] (B<-listg>[I<NUM>]), all deletable tag groups
 (B<-listd>), or an XML database of tag details including language
@@ -4988,6 +5107,13 @@ load exiftool for each invocation.
 
 =over 5
 
+=item B<-api> I<OPT[=VAL]>
+
+Set ExifTool API option.  I<OPT> is an API option name.  The option value is
+set to 1 if I<=VAL> is omitted.  See
+L<Image::ExifTool Options|Image::ExifTool/Options> for a list of available
+API options.  This overrides API options set via the config file.
+
 =item B<-common_args>
 
 Specifies that all arguments following this option are common to all
@@ -5027,15 +5153,16 @@ original I<FILE>.  This may be useful in some special situations for
 processing related preview images or sidecar files.  See the B<-w> option
 for a description of the I<FMT> syntax.  Note that file name I<FMT> strings
 for all options are based on the original I<FILE> specified from the command
-line, not the name of the source file specified by B<-srcfile>.  A I<FMT> of
-C<@> may be used to represent the original I<FILE>, and may be useful when
-specifying multiple B<-srcfile> options (ie. to fall back to processing the
-original I<FILE> if no sidecar exists).
+line, not the name of the source file specified by B<-srcfile>.
 
 If than one B<-srcfile> option is specified, the files are tested in order
 and the first existing source file is processed.  If none of the source
 files already exist, then exiftool uses the first B<-srcfile> specified.
 
+A I<FMT> of C<@> may be used to represent the original I<FILE>, which may be
+useful when specifying multiple B<-srcfile> options (ie. to fall back to
+processing the original I<FILE> if no sidecar exists).
+
 =item B<-stay_open> I<FLAG>
 
 If I<FLAG> is C<1> or C<True>, causes exiftool keep reading from the B<-@>
@@ -5103,7 +5230,9 @@ tags, sorted by group (for family 1).
 
 =item exiftool -common dir
 
-Print common meta information for all images in C<dir>.
+Print common meta information for all images in C<dir>.  C<-common> is a
+L<shortcut tag|Image::ExifTool::Shortcuts> representing common EXIF meta
+information.
 
 =item exiftool -T -createdate -aperture -shutterspeed -iso dir > out.txt
 
@@ -5615,11 +5744,11 @@ Extract information from an embedded thumbnail image.
 
 Add an IPTC keyword in a pipeline, saving output to a new file.
 
-=item wget -qO - http://a.domain.com/bigfile.jpg | exiftool -fast -
+=item curl -s http://a.domain.com/bigfile.jpg | exiftool -fast -
 
-Extract information from an image over the internet using the GNU wget
-utility.  The B<-fast> option prevents exiftool from scanning for trailer
-information, so only the meta information header is transferred.
+Extract information from an image over the internet using the cURL utility. 
+The B<-fast> option prevents exiftool from scanning for trailer information,
+so only the meta information header is transferred.
 
 =item exiftool a.jpg -thumbnailimage -b | exiftool -comment=wow - |
 exiftool a.jpg -thumbnailimage'<=-'
@@ -5637,7 +5766,7 @@ error occured or if all files failed the B<-if> condition.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey
+Copyright 2003-2014, Phil Harvey
 
 This is free software; you can redistribute it and/or modify it under the
 same terms as Perl itself.
@@ -5,6 +5,8 @@
 #
 # Usage:        exiftool -p gpx.fmt -d %Y-%m-%dT%H:%M:%SZ FILE [...] > out.gpx
 #
+# Requires:     ExifTool version 8.10 or later
+#
 # Revisions:    2010/02/05 - P. Harvey created
 #
 # Notes:     1) All input files must contain GPSLatitude and GPSLongitude.
@@ -6,6 +6,8 @@
 #
 # Usage:        exiftool -p gpx_wpt.fmt -d %Y-%m-%dT%H:%M:%SZ FILE [...] > out.gpx
 #
+# Requires:     ExifTool version 8.10 or later
+#
 # Revisons:     2010/03/13 - Peter Grimm created
 #
 # Notes:     1) All input files must contain GPSLatitude and GPSLongitude.
@@ -6,6 +6,8 @@
 #
 # Usage:        exiftool -p kml.fmt FILE [...] > out.kml
 #
+# Requires:     ExifTool version 8.10 or later
+#
 # Revisions:    2010/02/05 - P. Harvey created
 #               2013/02/05 - PH Fixed camera icon to work with new Google Earth
 #
@@ -16,9 +16,9 @@ ul   { margin-top: 0 }
 
 <h2>Description</h2>
 
-<p>The Image::ExifTool library provides an extensible set of Perl modules to
-read and write meta information in a wide variety of image, audio, video and
-document files.</p>
+<p>The Image::ExifTool library provides a set of Perl modules to read and
+write meta information in a wide variety of image, audio, video and document
+files.</p>
 
 <hr><h2><a name="Methods">Methods</a></h2>
 
@@ -163,12 +163,12 @@ list.</p>
 
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>ImageInfo($;@)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> [<i>optional</i>] ExifTool object reference
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> [<i>optional</i>] ExifTool object reference
     <br><b>1)</b> File name, file reference or scalar reference
     <br><b>2-N)</b> [<i>optional</i>] list of tag names to find (or tag list reference or
     options reference, see below)
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>Reference to hash of tag key/value pairs</td></tr>
+<tr><td valign=top><b>Returns</b></td><td>Reference to hash of tag key/value pairs</td></tr>
 </table></blockquote>
 
 <p><b>Examples:</b></p>
@@ -225,13 +225,13 @@ earlier in the argument list.</p>
 function arguments are interpreted.</p>
 
 <blockquote><table class='norm'>
-<tr><td valign='top'><b>ExifTool&nbsp;ref</b></td><td>
+<tr><td valign=top><b>ExifTool&nbsp;ref</b></td><td>
 <a href="#ImageInfo">ImageInfo</a> may be called with an ExifTool object if
 desired.  Advantages of using the object-oriented form are that options may be
 set before calling <a href="#ImageInfo">ImageInfo</a>, and the object may be
 used afterward to access member functions.  Must be the first argument if used.
 
-</td></tr><tr><td valign='top'><b>SCALAR</b></td><td>
+</td></tr><tr><td valign=top><b>SCALAR</b></td><td>
 The first scalar argument is taken to be the file name unless an earlier
 argument specified the image data via a file reference (file ref) or data
 reference (SCALAR ref).  The remaining scalar arguments are names of tags for
@@ -260,7 +260,7 @@ the returned tag list when accessing the tag values.
 See the <a href="TagNames/index.html">TagNames</a> documentation for a
 complete list of ExifTool tag names.
 
-</td></tr><tr><td valign='top'><b>File&nbsp;ref</b></td><td>
+</td></tr><tr><td valign=top><b>File&nbsp;ref</b></td><td>
 A reference to an open image file.  If you use this method (or a SCALAR
 reference) to access information in an image, the FileName and Directory tags
 will not be returned.  (Also, the FileSize, FileModifyDate and FilePermissions
@@ -276,10 +276,10 @@ File::RandomAccess object, then pass this object to
 the file if necessary, and may be used to re-read the file after
 <a href="#ImageInfo">ImageInfo</a> returns.]
 
-</td></tr><tr><td valign='top'><b>SCALAR&nbsp;ref</b></td><td>
+</td></tr><tr><td valign=top><b>SCALAR&nbsp;ref</b></td><td>
 A reference to image data in memory.
 
-</td></tr><tr><td valign='top'><b>ARRAY&nbsp;ref</b></td><td>
+</td></tr><tr><td valign=top><b>ARRAY&nbsp;ref</b></td><td>
 Reference to a list of tag names.  On entry, any elements in the list are added
 to the list of requested tags.  On return, this list is updated to contain an
 ordered list of tag keys for the returned information.
@@ -291,7 +291,7 @@ tag keys only if the <a href="#Duplicates">Duplicates</a> option is 0 and
 returned list of tag keys, and with other <a href="#Sort">Sort</a> settings the
 entries may not be in the same order as requested.)
 
-</td></tr><tr><td valign='top'><b>HASH&nbsp;ref</b></td><td>
+</td></tr><tr><td valign=top><b>HASH&nbsp;ref</b></td><td>
 Reference to a hash containing the options settings.  See
 <a href="#Options">Options</a> documentation below for a list of available
 options. Options specified as arguments to <a href="#ImageInfo">ImageInfo</a>
@@ -394,19 +394,19 @@ The following functions require an ExifTool object as the first argument
 <p>Get/set ExifTool options.  This function can be called to set the default
 options for an ExifTool object.  Options set this way are in effect for
 all function calls but may be overridden by options passed as arguments
-to some functions.</p>
+to some functions.  Option names are not case sensitive.</p>
 <p>The default option values may be changed by defining a
 %Image::ExifTool::UserDefined::Options hash.  See the
 <a href="config.html">ExifTool_config file</a> in the full ExifTool
 distribution for examples.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>Options($$;@)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
-    <br><b>1)</b> Parameter name (see table below)
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
+    <br><b>1)</b> Parameter name (case-insensitive, see table below)
     <br><b>2)</b> [<i>optional</i>] Option value if specified (may be undef to clear option)
     <br><b>3-N)</b> [<i>optional</i>] Additional parameter/value pairs
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>Previous value of last specified parameter</td></tr>
+<tr><td valign=top><b>Returns</b></td><td>Previous value of last specified parameter</td></tr>
 </table></blockquote>
 
 <p><b>Available options:</b></p>
@@ -418,40 +418,40 @@ distribution for examples.</p>
     Tag values representing large binary data blocks (ie. ThumbnailImage)
     are not necessarily extracted unless this option is set or the tag is
     specifically requested by name.</td>
-    <td align='center'>0 or 1</td><td align=center>0</td></tr>
+    <td align=center>0 or 1</td><td align=center>0</td></tr>
 <tr><td>ByteOrder</td><td><a name="ByteOrder"></a>The byte order for newly created EXIF segments when
     writing.  Note that if EXIF information already exists, the existing order is
     maintained.  If ByteOrder is not defined, then the order of the maker notes is
     used (if they are being copied), otherwise big-endian ('MM') order is assumed.
-    This can also be set via the ExifByteOrder tag, but the ByteOrder option takes
-    precedence if both are set.</td>
-    <td align='center'>'MM','II' or undef</td><td align=center>undef</td></tr>
+    This can also be set via the <a href="TagNames/Extra.html">ExifByteOrder tag</a>,
+    but the ByteOrder option takes precedence if both are set.</td>
+    <td align=center>'MM','II' or undef</td><td align=center>undef</td></tr>
 <tr><td>Charset</td><td>Character set for encoding character
     strings passed to/from ExifTool containing code points above U+007F.  Note
     that this option affects some types of information when reading/writing the
     file and other types when getting/setting tag values, so it must be defined
     for both types of access. Charset values listed to the right have aliases
     which are given in brackets. Case is not significant.</td>
-    <td align='center'><a name="Charset"></a><table class='clear'>
-    <tr><td valign='top' align=right>UTF8</td><td>(cp65001, UTF-8)</td></tr>
-    <tr><td valign='top' align=right>Latin</td><td>(cp1252, Latin1)</td></tr>
-    <tr><td valign='top' align=right>Latin2</td><td>(cp1250)</td></tr>
-    <tr><td valign='top' align=right>Cyrillic</td><td>(cp1251, Russian)</td></tr>
-    <tr><td valign='top' align=right>Greek</td><td>(cp1253)</td></tr>
-    <tr><td valign='top' align=right>Turkish</td><td>(cp1254)</td></tr>
-    <tr><td valign='top' align=right>Hebrew</td><td>(cp1255)</td></tr>
-    <tr><td valign='top' align=right>Arabic</td><td>(cp1256)</td></tr>
-    <tr><td valign='top' align=right>Baltic</td><td>(cp1257)</td></tr>
-    <tr><td valign='top' align=right>Vietnam</td><td>(cp1258)</td></tr>
-    <tr><td valign='top' align=right>Thai</td><td>(cp874)</td></tr>
-    <tr><td valign='top' align=right>MacRoman</td><td>(cp10000, Mac, Roman)</td></tr>
-    <tr><td valign='top' align=right>MacLatin2</td><td>(cp10029)</td></tr>
-    <tr><td valign='top' align=right>MacCyrillic</td><td>(cp10007)</td></tr>
-    <tr><td valign='top' align=right>MacGreek</td><td>(cp10006)</td></tr>
-    <tr><td valign='top' align=right>MacTurkish</td><td>(cp10081)</td></tr>
-    <tr><td valign='top' align=right>MacRomanian</td><td>(cp10010)</td></tr>
-    <tr><td valign='top' align=right>MacIceland</td><td>(cp10079)</td></tr>
-    <tr><td valign='top' align=right>MacCroatian</td><td>(cp10082)</td></tr>
+    <td align=center><a name="Charset"></a><table class='clear'>
+    <tr><td valign=top align=right>UTF8</td><td>(cp65001, UTF-8)</td></tr>
+    <tr><td valign=top align=right>Latin</td><td>(cp1252, Latin1)</td></tr>
+    <tr><td valign=top align=right>Latin2</td><td>(cp1250)</td></tr>
+    <tr><td valign=top align=right>Cyrillic</td><td>(cp1251, Russian)</td></tr>
+    <tr><td valign=top align=right>Greek</td><td>(cp1253)</td></tr>
+    <tr><td valign=top align=right>Turkish</td><td>(cp1254)</td></tr>
+    <tr><td valign=top align=right>Hebrew</td><td>(cp1255)</td></tr>
+    <tr><td valign=top align=right>Arabic</td><td>(cp1256)</td></tr>
+    <tr><td valign=top align=right>Baltic</td><td>(cp1257)</td></tr>
+    <tr><td valign=top align=right>Vietnam</td><td>(cp1258)</td></tr>
+    <tr><td valign=top align=right>Thai</td><td>(cp874)</td></tr>
+    <tr><td valign=top align=right>MacRoman</td><td>(cp10000, Mac, Roman)</td></tr>
+    <tr><td valign=top align=right>MacLatin2</td><td>(cp10029)</td></tr>
+    <tr><td valign=top align=right>MacCyrillic</td><td>(cp10007)</td></tr>
+    <tr><td valign=top align=right>MacGreek</td><td>(cp10006)</td></tr>
+    <tr><td valign=top align=right>MacTurkish</td><td>(cp10081)</td></tr>
+    <tr><td valign=top align=right>MacRomanian</td><td>(cp10010)</td></tr>
+    <tr><td valign=top align=right>MacIceland</td><td>(cp10079)</td></tr>
+    <tr><td valign=top align=right>MacCroatian</td><td>(cp10082)</td></tr>
     </table></td><td align=center>'UTF8'</td></tr>
 <tr><td>CharsetEXIF</td><td><a name="CharsetEXIF"></a>Internal encoding to use for stored
     EXIF "ASCII" string values.  Unlike other Charset options, CharsetEXIF may also be set
@@ -474,12 +474,12 @@ distribution for examples.</p>
     that the data be padded with blanks to allow in-place editing.  With this
     flag set the 2kB of padding is not written.  Note that this only effects
     embedded XMP since padding is never written for stand-alone XMP files.</td>
-    <td align='center'>0 or 1</td><td align=center>0</td></tr>
+    <td align=center>0 or 1</td><td align=center>0</td></tr>
 <tr><td>Composite</td><td><a name="Composite"></a>Flag to generate Composite tags when extracting information.</td>
-    <td align='center'>0 or 1</td><td align=center>1</td></tr>
+    <td align=center>0 or 1</td><td align=center>1</td></tr>
 <tr><td>Compress</td><td><a name="Compress"></a>Flag to write new values in compressed format if possible.
     Has no effect unless Compress::Zlib is installed.</td>
-    <td align='center'>0 or 1</td><td align=center>0</td></tr>
+    <td align=center>0 or 1</td><td align=center>0</td></tr>
 <tr><td>CoordFormat</td><td><a name="CoordFormat"></a>Specify output format for GPS coordinates.</td>
     <td>A printf-style format string with specifiers for degrees, minutes and
     seconds in that order, however minutes and seconds may be omitted.  If the
@@ -499,25 +499,25 @@ distribution for examples.</p>
     <td align=center>undef</td></tr>
 <tr><td>Duplicates</td><td><a name="Duplicates"></a>Flag to return values from
     tags with duplicate names when extracting information.</td>
-    <td align='center'>0 or 1</td><td align=center>1</td></tr>
+    <td align=center>0 or 1</td><td align=center>1</td></tr>
 <tr><td>Escape</td>
     <td><a name="Escape"></a>Escape special characters in extracted values for
     HTML or XML.  Also unescapes HTML or XML character entities in input values
     passed to <a href="#SetNewValue">SetNewValue</a>.</td> <td
-    align='center'>HTML, XML or undef</td>
-    <td align='center'>undef</td></tr>
+    align=center>HTML, XML or undef</td>
+    <td align=center>undef</td></tr>
 <tr><td>Exclude</td>
     <td>Exclude specified tags when extracting information.</td>
     <td><a name="Exclude"></a>Tag name or reference to a list of tag names to
     exclude.  Case is not significant. Tags may also be excluded by preceding
     their name with a '-' in the arguments to ImageInfo.</td>
-    <td align='center'>undef</td></tr>
+    <td align=center>undef</td></tr>
 <tr><td>ExtractEmbedded</td>
     <td><a name="Embedded"></a>Flag to extract information from embedded
     documents in EPS files, embedded EPS information and JPEG and Jpeg2000
     images in PDF files, embedded MPF images in JPEG and MPO files, streaming
     metadata in AVCHD videos, and the resource fork of Mac OS files.</td>
-    <td align='center'>0 or 1</td><td align=center>0</td></tr>
+    <td align=center>0 or 1</td><td align=center>0</td></tr>
 <tr><td>FastScan</td>
     <td><a name="FastScan"></a>Flag to increase speed of extracting information
     from JPEG images.  With this option set to 1, ExifTool will not scan to the
@@ -528,14 +528,14 @@ distribution for examples.</p>
     by some utilities) may be missed.  When combined with the ScanForXMP option,
     prevents scanning for XMP in recognized file types.  With a value of 2,
     ExifTool will also avoid extracting any EXIF MakerNote information.</td>
-    <td align='center'>0, 1 or 2</td><td align='center'>0</td></tr>
+    <td align=center>0, 1 or 2</td><td align=center>0</td></tr>
 <tr><td>FixBase</td>
     <td>Fix maker notes base offset.  Allows values to be extracted from maker notes
     which have been corrupted by editing with 3rd party software.</td>
     <td><a name="FixBase"></a>An integer specifying a value to be added to the
     maker notes base offset, or the empty string ('') for ExifTool to take its
     best guess at the correct base.</td>
-    <td align='center'>undef</td></tr>
+    <td align=center>undef</td></tr>
 <tr><td>GeoMaxIntSecs</td>
     <td><a name="GeoMaxIntSecs"></a>Maximum interpolation time in seconds for
     geotagging.  Geotagging is treated as an extrapolation if the Geotime value
@@ -545,56 +545,57 @@ distribution for examples.</p>
     value.  Set to 0 to disable interpolation and use the coordinates of the
     nearest fix instead (provided it is within GeoMaxExtSecs, otherwise
     geotagging fails).</td>
-    <td align='center'>A floating point number</td>
-    <td align='center'>1800</td></tr>
+    <td align=center>A floating point number</td>
+    <td align=center>1800</td></tr>
 <tr><td>GeoMaxExtSecs</td>
     <td><a name="GeoMaxExtSecs"></a>Maximum extrapolation time in seconds for
     geotagging.  Geotagging fails if the Geotime value lies outside a GPS track
     by a number of seconds greater than this.  Otherwise, the coordinates of the
     nearest fix are taken.</td>
-    <td align='center'>A floating point number</td>
-    <td align='center'>1800</td></tr>
+    <td align=center>A floating point number</td>
+    <td align=center>1800</td></tr>
 <tr><td>GeoMaxHDOP</td>
     <td><a name="GeoMaxHDOP"></a>Maximum Horizontal (2D) Dilution Of Precision
     for geotagging.  GPS fixes are ignored if the HDOP is greater than this.</td>
-    <td align='center'>A floating point number, or undef</td>
-    <td align='center'>undef</td></tr>
+    <td align=center>A floating point number, or undef</td>
+    <td align=center>undef</td></tr>
 <tr><td>GeoMaxPDOP</td>
     <td><a name="GeoMaxPDOP"></a>Maximum Position (3D) Dilution Of Precision for
     geotagging.  GPS fixes are ignored if the PDOP is greater than this.</td>
-    <td align='center'>A floating point number, or undef</td>
-    <td align='center'>undef</td></tr>
+    <td align=center>A floating point number, or undef</td>
+    <td align=center>undef</td></tr>
 <tr><td>GeoMinSats</td>
     <td><a name="GeoMinSats"></a>Minimum number of satellites for geotagging. 
     GPS fixes are ignored if the number of acquired satellites is less than this.</td>
-    <td align='center'>A positive integer, or undef</td>
-    <td align='center'>undef</td></tr>
+    <td align=center>A positive integer, or undef</td>
+    <td align=center>undef</td></tr>
 <tr><td>GlobalTimeShift</td>
     <td><a name="GlobalTimeShift"></a>Time shift to apply to all extracted
     date/time PrintConv values.  Does not affect ValueConv values.</td>
-    <td align='center'>Date/time shift string with leading '-' for negative shifts<br>(see <a href="Shift.html">Image::ExifTool::Shift.pl</a>)</td>
-    <td align='center'>undef</td></tr>
-<tr><td>Group#</td><td>Extract tags for specified groups.</td>
+    <td align=center>Date/time shift string with leading '-' for negative shifts<br>(see <a href="Shift.html">Image::ExifTool::Shift.pl</a>)</td>
+    <td align=center>undef</td></tr>
+<tr><td>Group#</td><td>Extract tags only for specified groups in family #
+    (Group0 assumed if # not given).</td>
     <td><a name="Group"></a>Group name or reference to list of group names.
     Group name may begin with '-' to exclude a group.  Case IS significant.
     See <a href="#GetGroup">GetGroup</a> for a description of group families,
     and <a href="#GetAllGroups">GetAllGroups</a> for a list of available groups.</td>
-    <td align='center'>undef</td></tr>
+    <td align=center>undef</td></tr>
 <tr><td>HtmlDump</td><td>Dump information in hex to a dynamic HTML web page.
     Option value sets a limit on the maximum block size.  Output file is
     specified by the TextOut option.</td>
     <td><a name="HtmlDump"></a><table class='clear'>
-    <tr><td valign='top' align=center><b>0</b>&nbsp;=</td><td>No HTML dump</td></tr>
-    <tr><td valign='top' align=center><b>1</b>&nbsp;=</td><td>1 KB size limit</td></tr>
-    <tr><td valign='top' align=center><b>2</b>&nbsp;=</td><td>16 KB size limit</td></tr>
-    <tr><td valign='top' align=center><b>3</b>&nbsp;=</td><td>Full dump</td></tr>
+    <tr><td valign=top align=center><b>0</b>&nbsp;=</td><td>No HTML dump</td></tr>
+    <tr><td valign=top align=center><b>1</b>&nbsp;=</td><td>1 KB size limit</td></tr>
+    <tr><td valign=top align=center><b>2</b>&nbsp;=</td><td>16 KB size limit</td></tr>
+    <tr><td valign=top align=center><b>3</b>&nbsp;=</td><td>Full dump</td></tr>
     </table></td><td align=center>0</td></tr>
 <tr><td>HtmlDumpBase</td><td><a name="HtmlDumpBase"></a>Base for HTML dump
     offsets.  If not defined, the EXIF/TIFF base offset is used.</td>
     <td><table class='clear'>
-    <tr><td valign='top' align=right><b>0</b>&nbsp;=</td><td>Absolute offsets</td></tr>
-    <tr><td valign='top' align=right><b><i>non&#8209;zero</i></b>&nbsp;=</td><td>Relative offsets</td></tr>
-    <tr><td valign='top' align=right><b>undef</b>&nbsp;=</td><td>EXIF/TIFF offsets</td></tr>
+    <tr><td valign=top align=right><b>0</b>&nbsp;=</td><td>Absolute offsets</td></tr>
+    <tr><td valign=top align=right><b><i>non&#8209;zero</i></b>&nbsp;=</td><td>Relative offsets</td></tr>
+    <tr><td valign=top align=right><b>undef</b>&nbsp;=</td><td>EXIF/TIFF offsets</td></tr>
     </table></td><td align=center>undef</td></tr>
 <tr><td>IgnoreMinorErrors</td><td><a name="IgnoreMinorErrors"></a>Flag to ignore minor errors.  Causes minor
     errors to be downgraded to warnings, and minor warnings to be ignored.  This
@@ -605,54 +606,71 @@ distribution for examples.</p>
     Minor errors/warnings are denoted by "[minor]" at the start of the message,
     or "[Minor]" (with a capital "M") for warnings that affect processing when
     ignored.</td>
-    <td align='center'>0 or 1</td><td align='center'>0</td></tr>
+    <td align=center>0 or 1</td><td align=center>0</td></tr>
 <tr><td>Lang</td><td><a name="Lang"></a>Localized language for exiftool tag descriptions, etc.  If the
     specified language isn't available, the option is not changed.  May be set to
     undef to select the built-in default language.</td>
-    <td align='left'>Image::ExifTool::Lang module name (ie. 'fr', 'zh_cn'), or 'en' or undef for the default language.</td>
-    <td align='center'>'en'</td></tr>
+    <td align=left>Image::ExifTool::Lang module name (ie. 'fr', 'zh_cn'), or 'en' or undef for the default language.</td>
+    <td align=center>'en'</td></tr>
 <tr><td>LargeFileSupport</td><td><a name="LargeFileSupport"></a>Flag to indicate that 64-bit file offsets are supported on this system.</td>
-    <td align='center'>0 or 1</td><td align='center'>0</td></tr>
+    <td align=center>0 or 1</td><td align=center>0</td></tr>
 <tr><td>List</td><td><a name="List"></a>Flag to extract lists of PrintConv values into arrays instead of combining
-    them into a string of values.</td><td align='center'>0 or 1</td><td align='center'>0</td></tr>
+    them into a string of values.</td><td align=center>0 or 1</td><td align=center>0</td></tr>
 <tr><td>ListSep</td><td><a name="ListSep"></a>Separator string used to join lists of PrintConv values when
-    List option is not set.</td><td align='center'>Any string</td><td align='center'>', '</td></tr>
+    List option is not set.</td><td align=center>Any string</td><td align=center>', '</td></tr>
 <tr><td>ListSplit</td><td><a name="ListSplit"></a>Regular expression used to split values of list-type tags
     into individual items when writing.  (ie. use ',\\s*' to split a comma-separated list)</td>
-    <td align='center'>A regular expression pattern</td><td align='center'>undef</td></tr>
+    <td align=center>A regular expression pattern</td><td align=center>undef</td></tr>
 <tr><td>MakerNotes</td><td><a name="MakerNotes"></a>Option to extract MakerNotes and other writable
     subdirectories (such as PrintIM) as a data block.  Normally when the MakerNotes
     are extracted they are rebuilt to include data outside the boundaries of the
     original maker note data block, but a value of 2 disables this feature.</td>
     <td><table class='clear'>
-    <tr><td valign='top' align=center><b>0</b>&nbsp;=</td><td>Don't extract writable subdirectories</td></tr>
-    <tr><td valign='top' align=center><b>1</b>&nbsp;=</td><td>Extract and rebuild makernotes into self-contained block</td></tr>
-    <tr><td valign='top' align=center><b>2</b>&nbsp;=</td><td>Extract without rebuilding makernotes</td></tr>
+    <tr><td valign=top align=center><b>0</b>&nbsp;=</td><td>Don't extract writable subdirectories</td></tr>
+    <tr><td valign=top align=center><b>1</b>&nbsp;=</td><td>Extract and rebuild makernotes into self-contained block</td></tr>
+    <tr><td valign=top align=center><b>2</b>&nbsp;=</td><td>Extract without rebuilding makernotes</td></tr>
     </table></td><td align=center>0</td></tr>
 <tr><td>MissingTagValue</td><td><a name="MissingTagValue"></a>Value for missing tags in
     expressions evaluated by <a href="#SetNewValuesFromFile">SetNewValuesFromFile</a>.
     If not set, a minor error is issued for missing values, or the value
     is set to '' if IgnoreMinorErrors is set.</td>
-    <td align='center'>Any string, or undef</td><td align='center'>undef</td></tr>
+    <td align=center>Any string, or undef</td><td align=center>undef</td></tr>
 <tr><td>Password</td><td><a name="Password"></a><a name="Passwd"></a>Password for reading/writing
     password-protected PDF documents. Ignored if a password is not required. Character encoding of
     the password is determined by the value of the Charset option at processing time.</td>
-    <td align='center'>Any string</td><td align=center>undef</td></tr>
+    <td align=center>Any string</td><td align=center>undef</td></tr>
+<tr><td>PNGEarlyXMP</td><td><a name="PNGEarlyXMP"></a>Flag to write XMP in PNG
+    images before the IDAT (image data) chunk.  By default, ExifTool adds new
+    XMP to the end of a PNG file (just before IEND). This is allowed by the PNG
+    and XMP specifications, but some utilities seem to ignore XMP if it comes
+    after the image data.  The PNGEarlyXMP option causes ExifTool to instead add
+    new XMP before the PNG IDAT chunk.  However, since ExifTool uses a
+    single-pass writing algorithm, it has no way to tell if XMP already exists
+    later in the file before writing the new XMP in this location.  If this
+    happens, a minor error is issued when the extra XMP is encountered, and the
+    file is not written.  Adding the <a href="#IgnoreMinorErrors">IgnoreMinorErrors</a>
+    option causes the XMP after IDAT to be deleted, thus resolving the conflict
+    (at the expense of possible metadata loss), and allowing the file to be
+    written. The PNGEarlyXMP option is applied automatically when deleting all
+    XMP and writing new XMP back in one step.  When reading, this option causes
+    a warning to be issued if standard XMP is found after the IDAT chunk.</td>
+    <td align=center>0 or 1</td><td align=center>0</td></tr>
 <tr><td>PrintConv</td><td><a name="PrintConv"></a>Flag to enable print conversion.  Also enables inverse print
-    conversion for writing.</td><td align='center'>0 or 1</td><td align=center>1</td></tr>
+    conversion for writing.</td><td align=center>0 or 1</td><td align=center>1</td></tr>
 <tr><td>QuickTimeUTC</td><td><a name="QuickTimeUTC"></a>Flag set to assume that QuickTime
     date/time values are stored as UTC, causing conversion to local time when they are
     extracted. According to the QuickTime specification date/time values should be UTC,
     but many digital cameras store local time instead (presumably because they don't know
-    the time zone).</td><td align='center'>0 or 1</td><td align=center>0</td></tr>
+    the time zone).</td><td align=center>0 or 1</td><td align=center>0</td></tr>
 <tr><td>RequestAll</td><td><a name="RequestAll"></a>Flag to request all tags to be extracted.
     This causes some tags to be generated which normally would not be unless specifically
-    requested (by passing the tag name to ImageInfo or ExtractInfo).
-    </td><td align='center'>0 or 1</td><td align=center>0</td></tr>
+    requested (by passing the tag name to ImageInfo or ExtractInfo).  Note that this flag is set
+    automatically during a call to <a href="#SetNewValuesFromFile">SetNewValuesFromFile</a> to
+    make all tags available for copying.</td><td align=center>0 or 1</td><td align=center>0</td></tr>
 <tr><td>ScanForXMP</td><td><a name="ScanForXMP"></a>Flag for scan all files (even unrecognized
     formats) for XMP information unless XMP was already found in the file.  When combined with
     the FastScan option, only unrecognized file types are scanned for XMP.  
-    </td><td align='center'>0 or 1</td><td align=center>0</td></tr>
+    </td><td align=center>0 or 1</td><td align=center>0</td></tr>
 <tr><td>Sort</td><td>Specifies order to sort tags in the returned tag list.</td>
     <td><a name="Sort"></a><table class='clear'>
     <tr><td valign=top align=right><b>Input</b>&nbsp;=</td><td>Sort in same order as input tag arguments</td></tr>
@@ -672,51 +690,51 @@ distribution for examples.</p>
     </table></td><td align=center>'File'</td></tr>
 <tr><td>StrictDate</td><td><a name="StrictDate"></a>Flag to return undefined value for any date which can't be
     converted when the DateFormat option is used.</td>
-    <td align='center'>0 or 1</td><td align=center>0</td></tr>
+    <td align=center>0 or 1</td><td align=center>0</td></tr>
 <tr><td>Struct</td><td>Flag to return XMP structures as HASH references
     instead of flattening into individual tags.  This setting has no effect
     when writing since both flattened or structured tags may always be written.
     See the <a href="struct.html">Structured Information documentation</a> for
     more details about structured information.</td>
     <td><a name="Struct"></a><table class='clear'>
-    <tr><td valign='top' align=right><b>undef</b>&nbsp;=</td><td>Same as 0 for reading and 2 for copying</td></tr>
-    <tr><td valign='top' align=right><b>0</b>&nbsp;=</td><td>Read/copy flattened tags</td></tr>
-    <tr><td valign='top' align=right><b>1</b>&nbsp;=</td><td>Read/copy structures</td></tr>
-    <tr><td valign='top' align=right><b>2</b>&nbsp;=</td><td>Read/copy both flattened and structured tags,
+    <tr><td valign=top align=right><b>undef</b>&nbsp;=</td><td>Same as 0 for reading and 2 for copying</td></tr>
+    <tr><td valign=top align=right><b>0</b>&nbsp;=</td><td>Read/copy flattened tags</td></tr>
+    <tr><td valign=top align=right><b>1</b>&nbsp;=</td><td>Read/copy structures</td></tr>
+    <tr><td valign=top align=right><b>2</b>&nbsp;=</td><td>Read/copy both flattened and structured tags,
     but flag flattened tags as "unsafe" for copying</td></tr>
     </table></td><td align=center>undef</td></tr>
 <tr><td>TextOut</td><td><a name="TextOut"></a>Output file for Verbose and HtmlDump options.</td>
-    <td align='center'>File reference</td><td align=center>\*STDOUT</td></tr>
+    <td align=center>File reference</td><td align=center>\*STDOUT</td></tr>
 <tr><td>Unknown</td><td><a name="Unknown"></a>Control extraction of unknown tags.</td>
     <td><table class='clear'>
-    <tr><td valign='top' align=center><b>0</b>&nbsp;=</td><td>Unknown tags not extracted</td></tr>
-    <tr><td valign='top' align=center><b>1</b>&nbsp;=</td><td>Unknown tags are extracted from EXIF
+    <tr><td valign=top align=center><b>0</b>&nbsp;=</td><td>Unknown tags not extracted</td></tr>
+    <tr><td valign=top align=center><b>1</b>&nbsp;=</td><td>Unknown tags are extracted from EXIF
         (and other tagged-format) directories</td></tr>
-    <tr><td valign='top' align=center><b>2</b>&nbsp;=</td><td>Unknown tags also extracted from binary data blocks</td></tr>
+    <tr><td valign=top align=center><b>2</b>&nbsp;=</td><td>Unknown tags also extracted from binary data blocks</td></tr>
     </table></td><td align=center>0</td></tr>
 <tr><td>Verbose</td><td>Print verbose messages to file specified by TextOut option.
     <a href="verbose.html">Click here</a> for example outputs.</td>
     <td><a name="Verbose"></a><table class='clear'>
-    <tr><td valign='top' align=center><b>0</b>&nbsp;=</td><td>No verbose messages</td></tr>
-    <tr><td valign='top' align=center><b>1</b>&nbsp;=</td><td>Print tag names and raw values</td></tr>
-    <tr><td valign='top' align=center><b>2</b>&nbsp;=</td><td>Add additional tag details</td></tr>
-    <tr><td valign='top' align=center><b>3</b>&nbsp;=</td><td>Add hex dump of tag data (with length limits)</td></tr>
-    <tr><td valign='top' align=center><b>4</b>&nbsp;=</td><td>Remove length limit on dump of tag values</td></tr>
-    <tr><td valign='top' align=center><b>5</b>&nbsp;=</td><td>Remove length limit on dump of JPEG segments</td></tr>
+    <tr><td valign=top align=center><b>0</b>&nbsp;=</td><td>No verbose messages</td></tr>
+    <tr><td valign=top align=center><b>1</b>&nbsp;=</td><td>Print tag names and raw values</td></tr>
+    <tr><td valign=top align=center><b>2</b>&nbsp;=</td><td>Add additional tag details</td></tr>
+    <tr><td valign=top align=center><b>3</b>&nbsp;=</td><td>Add hex dump of tag data (with length limits)</td></tr>
+    <tr><td valign=top align=center><b>4</b>&nbsp;=</td><td>Remove length limit on dump of tag values</td></tr>
+    <tr><td valign=top align=center><b>5</b>&nbsp;=</td><td>Remove length limit on dump of JPEG segments</td></tr>
     </table></td><td align=center>0</td></tr>
 <tr><td>WriteMode</td><td>Set tag write/create mode.</td>
     <td><a name="WriteMode"></a>A string with one or more of these characters:<table class='clear'>
-    <tr><td valign='top' align=center><b>w</b>&nbsp;=</td><td><b>W</b>rite existing tags</td></tr>
-    <tr><td valign='top' align=center><b>c</b>&nbsp;=</td><td><b>C</b>reate new tags</td></tr>
-    <tr><td valign='top' align=center><b>g</b>&nbsp;=</td><td>Create new <b>g</b>roups <sup>&dagger;</sup></td></tr>
+    <tr><td valign=top align=center><b>w</b>&nbsp;=</td><td><b>W</b>rite existing tags</td></tr>
+    <tr><td valign=top align=center><b>c</b>&nbsp;=</td><td><b>C</b>reate new tags</td></tr>
+    <tr><td valign=top align=center><b>g</b>&nbsp;=</td><td>Create new <b>g</b>roups <sup>&dagger;</sup></td></tr>
     </table></td><td align=center>'wcg'</td></tr>
-<tr><td>XMPAutoConv</td><td><a name="DisableXMPAutoConv"></a>Flag to enable automatic
-    conversion for unknown XMP tags with values that look like rational numbers or dates.</td>
+<tr><td>XMPAutoConv</td><td><a name="XMPAutoConv"></a>Flag to enable automatic conversion
+    for unknown XMP tags with values that look like rational numbers or dates.</td>
     <td align=center>0 or 1</td>
     <td align=center>1</td></tr>
 </table></blockquote>
 
-<blockquote><table><tr><td valign="top"><sup>&dagger;</sup></td><td>The level of
+<blockquote><table><tr><td valign=top><sup>&dagger;</sup></td><td>The level of
 the group is the SubDirectory level in the metadata structure.  For XMP or IPTC
 this is the full XMP/IPTC block (the family 0 group), but for EXIF this is the
 individual IFD (the family 1 group).</td></tr></table></blockquote>
@@ -763,7 +781,7 @@ option values from the %Image::ExifTool::UserDefined::Options hash in
 the .ExifTool_config file if it exists.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>ClearOptions()</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
 </td></tr>
 </table></blockquote>
 
@@ -771,11 +789,11 @@ the .ExifTool_config file if it exists.</p>
 <p>Extract all meta information from an image.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>ExtractInfo($;@)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
     <br><b>1-N)</b> Same as <a href="#ImageInfo">ImageInfo</a> except that a list of tag
     keys is not returned if an ARRAY reference is given.
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>1 if this was a recognized file format, 0 otherwise</td></tr>
+<tr><td valign=top><b>Returns</b></td><td>1 if this was a recognized file format, 0 otherwise</td></tr>
 </table></blockquote>
 <p><b>Example:</b></p>
 <blockquote><table class='box'><tr><td><pre>
@@ -797,11 +815,11 @@ This function may be called repeatedly after a single call to
 <a href="#ExtractInfo">ExtractInfo</a> or <a href="#ImageInfo">ImageInfo</a>.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>GetInfo($;@)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
     <br><b>1-N)</b> Same as <a href="#ImageInfo">ImageInfo</a> except that an image
     can not be specified
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>Reference to information hash, the same as with
+<tr><td valign=top><b>Returns</b></td><td>Reference to information hash, the same as with
     <a href="#ImageInfo">ImageInfo</a></td></tr>
 </table></blockquote>
 <p><b>Examples:</b></p>
@@ -834,22 +852,25 @@ again.</p>
 
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>WriteInfo($$;$$)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
     <br><b>1)</b> Source file name, file reference, scalar reference, or undef to
-    create a file from scratch
+    create a file from scratch.  A reference to a File::RandomAccess object is
+    also allowed as a source, but in this case the destination is not optional.
     <br><b>2)</b> [<i>optional</i>] Destination file name, file reference, scalar
-    reference, or undef to overwrite the original file
-    <br><b>3)</b> [<i>optional</i>] Destination file type
+    reference, or undef to overwrite the original file.  May be '-' to write to
+    stdout.
+    <br><b>3)</b> [<i>optional</i>] Destination file type.  Ignored if a source
+    is defined.
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>1 if file was written OK, 2 if file was written
+<tr><td valign=top><b>Returns</b></td><td>1 if file was written OK, 2 if file was written
 but no changes made, 0 on file write error.
 </td></tr>
 </table></blockquote>
 <p>The source file name may be undefined to create a file from scratch
-(currently only XMP, MIE, ICC, VRD and EXIF files can be created in this way --
-see <a href="#CanCreate">CanCreate</a> for details). 
+(currently only XMP, MIE, ICC, VRD, EXV and EXIF files can be created in this
+way -- see <a href="#CanCreate">CanCreate</a> for details).
 If undefined, the destination file type is required unless the type can be
-determined from the destination file name.</p>
+determined from the extension of the destination file name.</p>
 <p>If a destination file name is given, the specified file must not exist
 because an existing destination file will not be overwritten.  The destination
 file name may be undefined to overwrite the original file (make sure you have
@@ -858,7 +879,6 @@ created and renamed to replace the source file if no errors occurred while
 writing. Otherwise, if a source file reference or scalar reference is used, the
 image is first written to memory then copied back to replace the original if
 there were no errors.</p>
-<p>The destination file type is only used if the source file is undefined.</p>
 <p>On Mac OS systems, the file resource fork is preserved if this routine
 is called with a source file name.</p>
 <p><b>Examples:</b></p>
@@ -897,12 +917,12 @@ IgnoreMinorErrors and Verbose.
 <p>Get a sorted list of tags from the specified information hash or tag list.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>GetTagList($;$$$)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
     <br><b>1)</b> [<i>optional</i>] Reference to info hash or tag list
     <br><b>2)</b> [<i>optional</i>] Sort order ('Input', 'File', 'Tag', 'Descr' or 'Group#')
     <br><b>3)</b> [<i>optional</i>] Secondary sort order ('File', 'Tag' or 'Descr')
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>List of tag keys in specified order</td></tr>
+<tr><td valign=top><b>Returns</b></td><td>List of tag keys in specified order</td></tr>
 </table></blockquote>
 <p><b>Example:</b></p>
 <blockquote><table class='box'><tr><td><pre>
@@ -922,11 +942,11 @@ tags for the information obtained from the most recent call to
 or <a href="#GetInfo">GetInfo</a> for this object.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>GetFoundTags($;$$)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
     <br><b>1)</b> [<i>optional</i>] Sort order ('Input', 'File', 'Tag', 'Descr' or 'Group#')
     <br><b>2)</b> [<i>optional</i>] Secondary sort order ('File', 'Tag' or 'Descr')
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>List of tag keys in the specified order</td></tr>
+<tr><td valign=top><b>Returns</b></td><td>List of tag keys in the specified order</td></tr>
 </table></blockquote>
 <p><b>Example:</b></p>
 <blockquote><table class='box'><tr><td><pre>
@@ -942,9 +962,9 @@ in the same order that they were specified.  Shortcut tags are expanded
 in the list.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>GetRequestedTags($)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>List of tag keys for requested tags
+<tr><td valign=top><b>Returns</b></td><td>List of tag keys for requested tags
 (empty if no tags specifically requested)</td></tr>
 </table></blockquote>
 <p><b>Example:</b></p>
@@ -972,7 +992,7 @@ as an argument. To retrieve tag information based on a case-insensitive tag name
 instead.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>GetValue($$;$)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
     <br><b>1)</b> Tag key
     <br><b>2)</b> [<i>optional</i>] Value type, 'PrintConv', 'ValueConv', 'Both',
     'Raw' or 'Rational'
@@ -981,7 +1001,7 @@ instead.</p>
     returns both ValueConv and PrintConv values as a list.  'Rational' returns
     the raw rational value as a string fraction for rational types.
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>
+<tr><td valign=top><b>Returns</b></td><td>
 The value of the specified tag.  If the tag represents a list of values and
 the List option is disabled then PrintConv returns a string of values,
 otherwise a reference to the list is returned in scalar context.  The list
@@ -1036,28 +1056,32 @@ the new values to an image.</p>
 the same tag name for each value, or call with a reference to the list of values.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>SetNewValue($;$$%)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
  <br><b>1)</b> [<i>optional</i>] Tag key or tag name, or undef to clear all new
-    values.  The tag name may be prefixed by group name, separated by a colon
-    (ie. '<code>EXIF:Artist</code>'), which is equivalent to using a Group
-    option argument. Also, a '<code>#</code>' may be appended to the tag name
-    (ie. '<code>EXIF:Orientation#</code>'), with the same effect as setting Type
-    to 'ValueConv'.  Wildcards ('<code>*</code>' and '<code>?</code>') may be
-    used in the tag name to assign multiple tags simultaneously A tag name of
-    '<code>*</code>' is special when deleting information, and will delete an
-    entire group even if some individual tags in the group are not writable.
-    See the <a href="TagNames/index.html">TagNames documentation</a> for a
-    complete list of ExifTool tag names.
- <br><b>2)</b> [<i>optional</i>] New value for tag.  Undefined to delete tag from file.
-     May be a scalar, scalar reference, list reference to set a list of values, or
-     hash reference for a structure. Integer values may be specified as a
-     hexadecimal string (with a leading '0x'), and simple rational values may be
-     specified in fractional form (ie. '4/10'). Structure tags may be specified
-     either as a hash reference or a serialized string (see the last two
-     examples below).
+    values.  The tag name may be prefixed one or more family 0, 1 or 2 group
+    names with optional leading family numbers, separated by colons (ie.
+    '<code>EXIF:Artist</code>', '<code>XMP:Time:*</code>'), which is equivalent
+    to using a Group option argument.  Also, a '<code>#</code>' may be appended
+    to the tag name (ie. '<code>EXIF:Orientation#</code>'), with the same effect
+    as setting Type to 'ValueConv'.  Wildcards ('<code>*</code>' and
+    '<code>?</code>') may be used in the tag name to assign multiple tags
+    simultaneously A tag name of '<code>*</code>' is special when deleting
+    information, and will delete an entire group even if some individual tags in
+    the group are not writable, but only if a single family 0 or 1 group name is
+    specified (otherwise, the tags are deleted individually).  Use
+    <a href="#GetDeleteGroups">GetDeleteGroups</a> to get a list of deletable group
+    names, and see the <a href="TagNames/index.html">TagNames documentation</a>
+    for a complete list of ExifTool tag names.
+ <br><b>2)</b> [<i>optional</i>] New value for tag.  Undefined to delete tag
+     from file. May be a scalar, scalar reference, list reference to set a list
+     of values, or hash reference for a structure. Integer values may be
+     specified as a hexadecimal string (with a leading '0x'), and simple
+     rational values may be specified in fractional form (ie. '4/10'). Structure
+     tags may be specified either as a hash reference or a serialized string
+     (see the last two examples below).
  <br><b>3-N)</b> [<i>optional</i>] SetNewValue option/value pairs (see below).
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>Scalar context: The number of tags set, and
+<tr><td valign=top><b>Returns</b></td><td>Scalar context: The number of tags set, and
 errors are printed to STDERR.
 <br>List context: The number of tags set, and the error string (undefined if no error).
 </td></tr>
@@ -1067,9 +1091,9 @@ errors are printed to STDERR.
 <tr><th>Option</th><th>Description</th><th width='30%'>Values</th><th>Default</th></tr>
 <tr><td>AddValue</td><td>Add value to existing list in a file rather than overwriting</td>
     <td><table class='clear'>
-    <tr><td valign='top' align=center><b>0</b>&nbsp;=</td><td>Overwrite existing value(s)</td></tr>
-    <tr><td valign='top' align=center><b>1</b>&nbsp;=</td><td>Add to existing list, or warn for non-list tags</td></tr>
-    <tr><td valign='top' align=center><b>2</b>&nbsp;=</td><td>Add to existing list, or overwrite non-list tags</td></tr>
+    <tr><td valign=top align=center><b>0</b>&nbsp;=</td><td>Overwrite existing value(s)</td></tr>
+    <tr><td valign=top align=center><b>1</b>&nbsp;=</td><td>Add to existing list, or warn for non-list tags</td></tr>
+    <tr><td valign=top align=center><b>2</b>&nbsp;=</td><td>Add to existing list, or overwrite non-list tags</td></tr>
     </table></td><td align=center>0</td></tr>
 <tr><td>DelValue</td><td>Delete existing tag from a file if it has the specified value</td>
     <td align=center>0 or 1</td><td align=center>0</td></tr>
@@ -1082,17 +1106,18 @@ errors are printed to STDERR.
 <tr><td>Group</td><td>Specifies group name where tag should be written.
     If not specified, tag is written to highest priority group as specified
     by <a href="#SetNewGroups">SetNewGroups</a>.  Case is not significant</td>
-    <td align=center>Any family 0 or 1 group name</td><td align=center>undef</td></tr>
+    <td align=center>One or more family 0, 1 or 2 groups with optional leading
+    family number, separated by colons</td><td align=center>undef</td></tr>
 <tr><td>NoFlat</td><td>Treat flattened tags as 'unsafe'</td><td align=center>0 or 1</td><td align=center>0</td></tr>
 <tr><td>NoShortcut</td><td>Disables default behaviour of looking up tag in
     shortcuts if not found otherwise.</td><td align=center>0 or 1</td><td align=center>0</td></tr>
 <tr><td>Protected</td><td>Allow protected tags to be written</td>
     <td>Bitmask of tag protection levels to write:
     <table class='clear'>
-    <tr><td valign='top' align=center><b>0x01</b>&nbsp;=</td>
+    <tr><td valign=top align=center><b>0x01</b>&nbsp;=</td>
     <td>Write '<a href="TagNames/index.html">unsafe</a>' tags (ie. tags not copied
         automatically via <a href="#SetNewValuesFromFile">SetNewValuesFromFile</a>)</td></tr>
-    <tr><td valign='top' align=center><b>0x02</b>&nbsp;=</td>
+    <tr><td valign=top align=center><b>0x02</b>&nbsp;=</td>
     <td>Write '<a href="TagNames/index.html">protected</a>' tags (internal use only)</td></tr>
     </table></td><td align=center>0</td></tr>
 <tr><td>ProtectSaved</td><td>Avoid setting new values which were saved after the Nth
@@ -1102,21 +1127,21 @@ errors are printed to STDERR.
     set in previous calls to <a href="#SetNewValue">SetNewValue</a>). This option
     is most commonly used to replace previously-set new values for list-type tags.</td>
     <td><table class='clear'>
-    <tr><td valign='top' align=center><b>0</b>&nbsp;=</td><td>Set new value normally</td></tr>
-    <tr><td valign='top' align=center><b>1</b>&nbsp;=</td><td>Reset previous new values and replace with the specifed new value</td></tr>
-    <tr><td valign='top' align=center><b>2</b>&nbsp;=</td><td>Reset previous new values only</td></tr>
+    <tr><td valign=top align=center><b>0</b>&nbsp;=</td><td>Set new value normally</td></tr>
+    <tr><td valign=top align=center><b>1</b>&nbsp;=</td><td>Reset previous new values and replace with the specifed new value</td></tr>
+    <tr><td valign=top align=center><b>2</b>&nbsp;=</td><td>Reset previous new values only</td></tr>
     </table></td><td align=center>0</td></tr>
 <tr><td>Shift</td><td>Shift the tag by the specified value.  Currently only date/time tags
     and tags with numerical values may be shifted.  Value is added if Shift is 1, or subtracted
     if Shift is -1.  See <a href="Shift.html">Image::ExifTool::Shift.pl</a> for details time shift formats.</td>
     <td><table class='clear'>
-    <tr><td valign='top' align=left colspan=2><b>undef</b>&nbsp;= No shift</td></tr>
-    <tr><td valign='top' align=right><b>0</b>&nbsp;=</td><td>Shift if shiftable:<br>
+    <tr><td valign=top align=left colspan=2><b>undef</b>&nbsp;= No shift</td></tr>
+    <tr><td valign=top align=right><b>0</b>&nbsp;=</td><td>Shift if shiftable:<br>
     Positive if AddValue set, or<br>
     Negative if DelValue set and<br>
     tag is date/time</td></tr>
-    <tr><td valign='top' align=right><b>1</b>&nbsp;=</td><td>Positive shift</td></tr>
-    <tr><td valign='top' align=right><b>-1</b>&nbsp;=</td><td>Negative shift</td></tr>
+    <tr><td valign=top align=right><b>1</b>&nbsp;=</td><td>Positive shift</td></tr>
+    <tr><td valign=top align=right><b>-1</b>&nbsp;=</td><td>Negative shift</td></tr>
     </table></td><td align=center>undef</td></tr>
 <tr><td>Type</td><td>The type of value being set</td>
     <td>PrintConv, ValueConv or Raw (default depends on <a href="#PrintConv">PrintConv</a> Option)</td>
@@ -1206,7 +1231,8 @@ description of the structure serialization technique)</blockquote>
 <p><b>Notes:</b></p>
 <p>When deleting groups of tags, the Replace option may be used as in the last
 example above to exclude specific groups from a mass delete. However, this
-technique may not be used to exclude individual tags.  Instead, use
+technique may not be used to exclude individual tags from a group delete (unless
+a family 2 group was specified in the delete).  Instead, use
 <a href="#SetNewValuesFromFile">SetNewValuesFromFile</a> to recover the values
 of individual tags after deleting a group.</p>
 <p>When deleting all tags from a JPEG image, the APP14 "Adobe" information is
@@ -1225,23 +1251,24 @@ and WriteMode.
 in a specified file.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>SetNewValuesFromFile($$;@)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
  <br><b>1)</b> File name, file reference, or scalar reference
  <br><b>2-N)</b> [<i>optional</i>] List of tag names to set or options hash
  references.  All writable tags are set if none are specified.  The tag names
- are not case sensitive, and may be prefixed by an optional family 0 or 1 group
- name, separated by a colon (ie. '<code>exif:iso</code>').  A leading
- '<code>-</code>' indicates tags to be excluded (ie. '<code>-comment</code>'),
- or a trailing '<code>#</code>' causes the ValueConv value to be copied (same as
- setting the Type option to 'ValueConv' for this tag only).  Wildcards
- ('<code>*</code>' and '<code>?</code>') may be used in the tag name.  A tag
- name of '<code>*</code>' is commonly used when a group is specified to copy all
- tags in the group (ie. '<code>XMP:*</code>').<br>&nbsp;<br> A special feature
- allows tag names of the form '<code>DSTTAG&lt;SRCTAG</code>' (or
- '<code>SRCTAG&gt;DSTTAG</code>') to be specified to copy information to a tag
- with a different name or a specified group.  Both '<code>SRCTAG</code>' and
- '<code>DSTTAG</code>' may contain wildcards and/or be prefixed by a group name
- (ie. '<code>fileModifyDate&lt;modifyDate</code>' or '<code>xmp:*&lt;*</code>'),
+ are not case sensitive, and may be prefixed by one or more family 0, 1 or 2
+ group names with optional leading family numbers, separated by colons (ie.
+ '<code>exif:iso</code>').  A leading '<code>-</code>' indicates tags to be
+ excluded (ie. '<code>-comment</code>'), or a trailing '<code>#</code>' causes
+ the ValueConv value to be copied (same as setting the Type option to
+ 'ValueConv' for this tag only).  Wildcards ('<code>*</code>' and
+ '<code>?</code>') may be used in the tag name.  A tag name of '<code>*</code>'
+ is commonly used when a group is specified to copy all tags in the group (ie.
+ '<code>XMP:*</code>').<br>&nbsp;<br> A special feature allows tag names of the
+ form '<code>DSTTAG&lt;SRCTAG</code>' (or '<code>SRCTAG&gt;DSTTAG</code>') to be
+ specified to copy information to a tag with a different name or a specified
+ group.  Both '<code>SRCTAG</code>' and '<code>DSTTAG</code>' may contain
+ wildcards and/or be prefixed by a group name (ie.
+ '<code>fileModifyDate&lt;modifyDate</code>' or '<code>xmp:*&lt;*</code>'),
  and/or suffixed by a '<code>#</code>' to disable print conversion.  Copied tags
  may also be added or deleted from a list with arguments of the form
  '<code>DSTTAG+&lt;SRCTAG</code>' or '<code>DSTTAG-&lt;SRCTAG</code>'.  Tags are
@@ -1251,8 +1278,8 @@ in a specified file.</p>
  '<code>Comment&lt;the file is $filename</code>'). Braces '<code>{}</code>' may
  be used around the tag name to separate it from subsequent text, and a
  '<code>$$</code>' is used to to represent a '<code>$</code>' symbol.  The
- behaviour for missing tags in expressions is defined by the
- <a href="#MissingTagValue">MissingTagValue</a> option.  The tag value may be
+ behaviour for missing tags in expressions is defined by the <a
+ href="#MissingTagValue">MissingTagValue</a> option.  The tag value may be
  modified via changes to the default input variable (<code>$_</code>) in Perl
  expressions placed inside the braces and after a semicolon following the tag
  name.  Braces within the expression must be balanced.
@@ -1260,7 +1287,7 @@ in a specified file.</p>
  Multiple options hash references may be passed to set different options for
  different tags.  Options apply to subsequent tags in the argument list. 
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>A hash of information that was set
+<tr><td valign=top><b>Returns</b></td><td>A hash of information that was set
 successfully.  May include Warning or Error entries if there were problems
 reading the input file.
 </td></tr>
@@ -1270,9 +1297,11 @@ different groups, allowing information to be translated between images with
 different formats.  This behaviour may be modified by specifying a group name
 for extracted tags (even if '<code>*</code>' is used as a group name), in which
 case the information is written to the original group, unless redirected to a
-different group.  When '<code>*</code>' is used for a group name, the family 1
-group of the original tag is preserved.  (For example, specifying '<code>*:*</code>'
-copies all information while preserving the original family 1 groups.)</p>
+different group.  When '<code>*</code>' is used for a group name, by default the
+family 1 group of the original tag is preserved, but a different family may be
+specified with a leading family number.  (For example, specifying
+'<code>*:*</code>' copies all information while preserving the original family 1
+groups, while '<code>0*:*</code>' preserves the family 0 group.)</p>
 <p><b>SetNewValuesFromFile Options:</b></p>
 <p>The options are the same was for <a href="#SetNewValue">SetNewValue</a>, and
 are passed directly to <a href="#SetNewValue">SetNewValue</a> internally,
@@ -1365,10 +1394,10 @@ will be written to file.  Most tags return only a single value, but List-type
 tags may return multiple values.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>GetNewValues($$)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
  <br><b>1)</b> Tag name (case sensitive, may be prefixed by family 0 or 1 group name)
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>List of new Raw tag values, or first value in
+<tr><td valign=top><b>Returns</b></td><td>List of new Raw tag values, or first value in
 list when called in scalar context. The list may be empty either if the tag
 isn't being written, or if it is being deleted (ie. if
 <a href="#SetNewValue">SetNewValue</a> was called without a value).
@@ -1387,9 +1416,9 @@ my @rawVals = $exifTool-&gt;<b>GetNewValues</b>($tag);
 <p>Return the total number of new values set.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>CountNewValues($)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>In scalar context, returns the total number
+<tr><td valign=top><b>Returns</b></td><td>In scalar context, returns the total number
 of tags with new values set.  In list context, also returns the number of
 "pseudo" tag values which have been set.  "Pseudo" tags are tags like FileName
 and FileModifyDate which are not contained within the file and can be changed
@@ -1408,9 +1437,9 @@ my ($numSet, $numPseudo) = $exifTool-&gt;<b>CountNewValues</b>();
 <p>Save state of new values to be later restored by <a href="#RestoreNewValues">RestoreNewValues</a>.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>SaveNewValues($)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>Count of the number of times this routine has
+<tr><td valign=top><b>Returns</b></td><td>Count of the number of times this routine has
 been called (N) since the last time the new values were reset.</td></tr>
 </table></blockquote>
 <p><b>Example:</b></p>
@@ -1429,7 +1458,7 @@ repeatedly after a single call to <a href="#SaveNewValues">SaveNewValues</a>.
 See <a href="#SaveNewValues">SaveNewValues</a> above for an example.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>RestoreNewValues($)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
 </td></tr>
 </table></blockquote>
 
@@ -1438,12 +1467,12 @@ See <a href="#SaveNewValues">SaveNewValues</a> above for an example.</p>
 FileModifyDate or FileCreateDate tag.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>SetFileModifyDate($$;$$)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
  <br><b>1)</b> File name
  <br><b>2)</b> [<i>optional</i>] Base time if applying shift (in days before $^T)
  <br><b>3)</b> [<i>optional</i>] Tag to write: 'FileModifyDate' (default), or 'FileCreateDate'
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>1 if the time was changed, 0 if nothing was
+<tr><td valign=top><b>Returns</b></td><td>1 if the time was changed, 0 if nothing was
 done, or -1 if there was an error setting the time.
 </td></tr>
 </table></blockquote>
@@ -1457,7 +1486,8 @@ my $result = $exifTool-&gt;<b>SetFileModifyDate</b>($file);
 when only the FileModifyDate or FileCreateDate tag has been set.  If a timezone is not
 specified, local time is assumed.  When shifting, the time of the original
 file is used unless the optional base time is specified.</p>
-<p>The ability to write FileCreateDate is currently restricted to Windows systems only.</p>
+<p>The ability to write FileCreateDate is currently restricted to Windows systems only,
+and requires Win32API::File::Time to be installed.</p>
 
 <hr><h2><a name="SetFileName">SetFileName</a></h2>
 <p>Set the file name and directory.  If not specified, the new file name is
@@ -1468,11 +1498,11 @@ the file is moved into the new directory.  The new value for the Directory tag
 takes precedence over any directory specified in FileName.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>SetFileName($$;$)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
  <br><b>1)</b> Current file name
  <br><b>2)</b> [<i>optional</i>] New file name
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>1 if the file name or directory was changed,
+<tr><td valign=top><b>Returns</b></td><td>1 if the file name or directory was changed,
 0 if nothing was done, or -1 if there was an error renaming the file.
 </td></tr>
 </table></blockquote>
@@ -1498,7 +1528,7 @@ than one group.  The default order is EXIF, IPTC then XMP.  Any family 0
 group name may be used.  Case is not significant.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>SetNewGroups($;@)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
 <br><b>1-N)</b> Groups in order of priority.  If no groups are specified, the
 priorities are reset to the defaults.
 </td></tr>
@@ -1512,9 +1542,9 @@ $exifTool-&gt;<b>SetNewGroups</b>('XMP','EXIF','IPTC');
 <p>Get current group priority list.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>GetNewGroups($)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>List of group names in order of write
+<tr><td valign=top><b>Returns</b></td><td>List of group names in order of write
 priority.  Highest priority first.
 </td></tr>
 </table></blockquote>
@@ -1532,10 +1562,10 @@ the tag if available and different from the default language (ie. with
 alternate language entries for XMP "lang-alt" tags).</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>GetTagID($$)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
     <br><b>1)</b> Tag key
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>In scalar context, returns the tag ID or '' if
+<tr><td valign=top><b>Returns</b></td><td>In scalar context, returns the tag ID or '' if
 there is no ID for this tag.<br>In list context, returns the tag ID (or '') and the
 language code (or undef).</td></tr>
 </table></blockquote>
@@ -1553,22 +1583,22 @@ value.  In the case where the description doesn't exist, one is generated from
 the tag name.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>GetDescription($$)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
     <br><b>1)</b> Tag key
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>Tag description</td></tr>
+<tr><td valign=top><b>Returns</b></td><td>Tag description</td></tr>
 </table></blockquote>
 
 <hr><h2><a name="GetGroup">GetGroup</a></h2>
 <p>Get group name(s) for a specified tag.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>GetGroup($$;$)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
     <br><b>1)</b> Tag key
     <br><b>2)</b> [<i>optional</i>] Group family number, or string of numbers
     separated by colons
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>Group name (or '' if tag has no
+<tr><td valign=top><b>Returns</b></td><td>Group name (or '' if tag has no
 group). If no group family is specified, returns the name of group in family 0
 when called in scalar context, or the names of groups for all families in list
 context. Returns a string of group names separated by colons if the input group
@@ -1579,11 +1609,11 @@ and adjacent identical group names unless the family string begins with a colon.
 <p>The following families of groups are available:</p>
 <blockquote><table class='norm'>
 <tr><th>Family</th><th>Description</th><th>Examples</th></tr>
-<tr><td align='center'>0</td><td>Information Type</td> <td>EXIF, XMP, IPTC</td></tr>
-<tr><td align='center'>1</td><td>Specific Location</td><td>IFD0, XMP-dc</td></tr>
-<tr><td align='center'>2</td><td>Category</td> <td>Author, Time</td></tr>
-<tr><td align='center'>3</td><td>Document Number</td> <td>Main, Doc1, Doc3-2</td></tr>
-<tr><td align='center'>4</td><td>Instance Number</td> <td>Copy1, Copy2, Copy3...</td></tr>
+<tr><td align=center>0</td><td>Information Type</td> <td>EXIF, XMP, IPTC</td></tr>
+<tr><td align=center>1</td><td>Specific Location</td><td>IFD0, XMP-dc</td></tr>
+<tr><td align=center>2</td><td>Category</td> <td>Author, Time</td></tr>
+<tr><td align=center>3</td><td>Document Number</td> <td>Main, Doc1, Doc3-2</td></tr>
+<tr><td align=center>4</td><td>Instance Number</td> <td>Copy1, Copy2, Copy3...</td></tr>
 </table></blockquote>
 
 <p>Families 0 and 1 are based on the file structure, and are similar except that
@@ -1642,11 +1672,11 @@ $group = $exifTool-&gt;<b>GetGroup</b>($tag, '3:1:2');
 <p>Get list of group names for all tags in specified information hash.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>GetGroups($;$$)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
     <br><b>1)</b> [<i>optional</i>] Information hash reference (default is all extracted info)
     <br><b>2)</b> [<i>optional</i>] Group family number (default 0)
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>
+<tr><td valign=top><b>Returns</b></td><td>
 List of group names in alphabetical order.
 If information hash is not specified, the group names are returned for
 all extracted information.  See <a href="#GetAllGroups">GetAllGroups</a> for
@@ -1680,9 +1710,9 @@ tags which are derived from the values of other tags.  This routine is called
 automatically by <a href="#ImageInfo">ImageInfo</a> if the Composite option is set.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>BuildCompositeTags($)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> ExifTool object reference
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>(none)</td></tr>
+<tr><td valign=top><b>Returns</b></td><td>(none)</td></tr>
 </table></blockquote>
 <p><b>Notes:</b></p>
 <ol>
@@ -1718,9 +1748,9 @@ $tagName = <a href="#GetTagName">GetTagName</a>($tag);
 strips the embedded instance number, if it exists, from the tag key.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>GetTagName($)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> Tag key
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> Tag key
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>Tag name</td></tr>
+<tr><td valign=top><b>Returns</b></td><td>Tag name</td></tr>
 </table></blockquote>
 <p><b>Example:</b></p>
 <blockquote><table class='box'><tr><td><pre>
@@ -1731,19 +1761,19 @@ $tagName = Image::ExifTool::<b>GetTagName</b>($tag);
 <p>Get list of tag shortcut names.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>GetShortcuts()</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td>(none)
+<tr><td valign=top><b>Inputs</b></td><td>(none)
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>List of shortcuts</td></tr>
+<tr><td valign=top><b>Returns</b></td><td>List of shortcuts</td></tr>
 </table></blockquote>
 
 <hr><h2><a name="GetAllTags">GetAllTags</a></h2>
 <p>Get list of all available tag names.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>GetAllTags(;$)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> [<i>optional</i>] Group name,
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> [<i>optional</i>] Group name,
 or string of group names separated by colons
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>A list of all available tags in alphabetical
+<tr><td valign=top><b>Returns</b></td><td>A list of all available tags in alphabetical
 order, or all tags in a specified group or intersection of groups.  The
 group name is case insensitive, and any group in families 0-2 may be used
 except for EXIF family 1 groups (ie. the specific IFD).
@@ -1754,10 +1784,10 @@ except for EXIF family 1 groups (ie. the specific IFD).
 <p>Get list of all writable tag names.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>GetWritableTags(;$)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> [<i>optional</i>] Group name,
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> [<i>optional</i>] Group name,
 or string of group names separated by colons
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>A list of all writable tags in alphabetical
+<tr><td valign=top><b>Returns</b></td><td>A list of all writable tags in alphabetical
 order. These are the tags for which values may be set through
 <a href="#SetNewValue">SetNewValue</a>. If a group name is given, returns
 only writable tags in specified group(s). The group name is case insensitive,
@@ -1770,24 +1800,24 @@ the specific IFD).
 <p>Get list of all group names in specified family.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>GetAllGroups($)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> Group family number (0-4)
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> Group family number (0-4)
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td>
+<tr><td valign=top><b>Returns</b></td>
 <td>A list of all groups in the specified family in alphabetical order</td></tr>
 </table></blockquote>
 <p>Here is a complete list of groups for each family:</p>
 <blockquote><table class='norm'>
 <tr><th>Family</th><th>Group Names</th></tr>
 <tr><td><b>0 (Information&nbsp;Type)</b></td>
-<td>AFCP, AIFF, APE, APP0, APP1, APP12, APP13, APP14, APP15, APP4, APP5, APP6,
-APP8, ASF, CanonVRD, Composite, DICOM, DNG, DV, DjVu, Ducky, EXE, EXIF,
-ExifTool, FLAC, FLIR, File, Flash, FlashPix, Font, FotoStation, GIF, GIMP,
-GeoTiff, H264, HTML, ICC_Profile, ID3, IPTC, ITC, JFIF, JPEG, Jpeg2000, LNK,
-Leaf, M2TS, MIE, MIFF, MNG, MPC, MPEG, MPF, MXF, MakerNotes, Matroska, Meta,
-Ogg, OpenEXR, PDF, PICT, PLIST, PNG, PSP, PanasonicRaw, PhotoCD,
-PhotoMechanic, Photoshop, PostScript, PrintIM, QuickTime, RAF, RIFF, RSRC,
-RTF, Radiance, Rawzor, Real, SVG, SigmaRaw, Stim, Theora, Vorbis, XML, XMP,
-ZIP
+<td>AFCP, AIFF, APE, APP0, APP1, APP11, APP12, APP13, APP14, APP15, APP4, APP5,
+APP6, APP8, ASF, CanonVRD, Composite, DICOM, DNG, DV, DjVu, Ducky, EXE,
+EXIF, ExifTool, FLAC, FLIR, File, Flash, FlashPix, Font, FotoStation, GIF,
+GIMP, GeoTiff, H264, HTML, ICC_Profile, ID3, IPTC, ITC, JFIF, JPEG,
+Jpeg2000, LNK, Leaf, M2TS, MIE, MIFF, MNG, MPC, MPEG, MPF, MXF, MakerNotes,
+Matroska, Meta, Ogg, OpenEXR, PDF, PICT, PLIST, PNG, PSP, PanasonicRaw,
+PhotoCD, PhotoMechanic, Photoshop, PostScript, PrintIM, QuickTime, RAF,
+RIFF, RSRC, RTF, Radiance, Rawzor, Real, SVG, SigmaRaw, Stim, Theora,
+Torrent, Vorbis, XML, XMP, ZIP
 </td></tr>
 <tr><td><b>1&nbsp;(Specific&nbsp;Location)</b></td>
 <td>AC3, AFCP, AIFF, APE, ASF, AVI1, Adobe, AdobeCM, AdobeDNG, CIFF, Canon,
@@ -1798,22 +1828,23 @@ GPS, GeoTiff, GlobParamIFD, GraphConv, H264, HP, HTML, HTML-dc, HTML-ncc,
 HTML-office, HTML-prod, HTML-vw96, HTTP-equiv, ICC-chrm, ICC-clrt,
 ICC-header, ICC-meas, ICC-meta, ICC-view, ICC_Profile, ICC_Profile#, ID3,
 ID3v1, ID3v1_Enh, ID3v2_2, ID3v2_3, ID3v2_4, IFD0, IFD1, IPTC, IPTC#, ITC,
-InteropIFD, JFIF, JPEG, JVC, Jpeg2000, KDC_IFD, Kodak, KodakBordersIFD,
-KodakEffectsIFD, KodakIFD, KyoceraRaw, LNK, Leaf, LeafSubIFD, Leica, M2TS,
-MAC, MIE-Audio, MIE-Camera, MIE-Canon, MIE-Doc, MIE-Extender, MIE-Flash,
-MIE-GPS, MIE-Geo, MIE-Image, MIE-Lens, MIE-Main, MIE-MakerNotes, MIE-Meta,
-MIE-Orient, MIE-Preview, MIE-Thumbnail, MIE-UTM, MIE-Unknown, MIE-Video,
-MIFF, MNG, MPC, MPEG, MPF0, MPImage, MXF, MakerNotes, MakerUnknown,
-Matroska, MetaIFD, Microsoft, Minolta, MinoltaRaw, NITF, Nikon,
-NikonCapture, NikonCustom, NikonScan, Ocad, Ogg, Olympus, OpenEXR, PDF,
-PICT, PLIST, PNG, PSP, Panasonic, PanasonicRaw, Pentax, PhaseOne, PhotoCD,
-PhotoMechanic, Photoshop, PictureInfo, PostScript, PreviewIFD, PrintIM,
-ProfileIFD, Qualcomm, QuickTime, RAF, RAF2, RIFF, RMETA, RSRC, RTF,
-Radiance, Rawzor, Real, Real-CONT, Real-MDPR, Real-PROP, Real-RA3, Real-RA4,
-Real-RA5, Real-RJMD, Reconyx, Ricoh, SPIFF, SR2, SR2DataIFD, SR2SubIFD,
-SRF#, SVG, Samsung, Sanyo, Scalado, Sigma, SigmaRaw, Sony, SonyIDC, Stim,
-SubIFD, System, Theora, Track#, Version0, Vorbis, XML, XMP, XMP-DICOM,
-XMP-GPano, XMP-MP, XMP-MP1, XMP-PixelLive, XMP-aas, XMP-acdsee, XMP-album,
+InteropIFD, JFIF, JPEG, JPEG-HDR, JVC, Jpeg2000, KDC_IFD, Kodak,
+KodakBordersIFD, KodakEffectsIFD, KodakIFD, KyoceraRaw, LNK, Leaf,
+LeafSubIFD, Leica, M2TS, MAC, MIE-Audio, MIE-Camera, MIE-Canon, MIE-Doc,
+MIE-Extender, MIE-Flash, MIE-GPS, MIE-Geo, MIE-Image, MIE-Lens, MIE-Main,
+MIE-MakerNotes, MIE-Meta, MIE-Orient, MIE-Preview, MIE-Thumbnail, MIE-UTM,
+MIE-Unknown, MIE-Video, MIFF, MNG, MPC, MPEG, MPF0, MPImage, MXF,
+MakerNotes, MakerUnknown, Matroska, MediaJukebox, MetaIFD, Microsoft,
+Minolta, MinoltaRaw, NITF, Nikon, NikonCapture, NikonCustom, NikonScan,
+Ocad, Ogg, Olympus, OpenEXR, PDF, PICT, PLIST, PNG, PSP, Panasonic,
+PanasonicRaw, Pentax, PhaseOne, PhotoCD, PhotoMechanic, Photoshop,
+PictureInfo, PostScript, PreviewIFD, PrintIM, ProfileIFD, Qualcomm,
+QuickTime, RAF, RAF2, RIFF, RMETA, RSRC, RTF, Radiance, Rawzor, Real,
+Real-CONT, Real-MDPR, Real-PROP, Real-RA3, Real-RA4, Real-RA5, Real-RJMD,
+Reconyx, Ricoh, SPIFF, SR2, SR2DataIFD, SR2SubIFD, SRF#, SVG, Samsung,
+Sanyo, Scalado, Sigma, SigmaRaw, Sony, SonyIDC, Stim, SubIFD, System,
+Theora, Torrent, Track#, Version0, Vorbis, XML, XMP, XMP-DICOM, XMP-GPano,
+XMP-MP, XMP-MP1, XMP-PixelLive, XMP-aas, XMP-acdsee, XMP-album,
 XMP-apple-fi, XMP-aux, XMP-cc, XMP-cell, XMP-crs, XMP-dc, XMP-dex,
 XMP-digiKam, XMP-dwc, XMP-exif, XMP-expressionmedia, XMP-extensis, XMP-fpv,
 XMP-ics, XMP-iptcCore, XMP-iptcExt, XMP-lr, XMP-mediapro, XMP-microsoft,
@@ -1842,10 +1873,10 @@ Time, Unknown, Video
 <p>Get list of all deletable group names.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>GetDelGroups()</td></tr>
-<tr><td valign='top'><b>Inputs</b></td>
+<tr><td valign=top><b>Inputs</b></td>
 <td>None
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>A list of deletable group names in
+<tr><td valign=top><b>Returns</b></td><td>A list of deletable group names in
 alphabetical order.
 </td></tr>
 </table></blockquote>
@@ -1855,11 +1886,16 @@ are either family 0 or family 1 group names, with the exception of
 to be deleted at once, including unknown trailers.  To schedule a group for
 deletion, call <a href="#SetNewValue">SetNewValue</a> with an undefined value
 and a tag name like '<code>Trailer:*</code>'.</p>
-<blockquote>AFCP, CIFF, CanonVRD, EXIF, ExifIFD, Ducky, File, FlashPix,
-FotoStation, GlobParamIFD, GPS, IFD0, IFD1, InteropIFD, ICC_Profile, IPTC,
-JFIF, MakerNotes, Meta, MetaIFD, MIE, PhotoMechanic, Photoshop, PNG,
-PrintIM, RMETA, SubIFD, Trailer, XMP
-</blockquote>
+<blockquote>AFCP, APP0, APP1, APP10, APP11, APP12, APP13, APP14, APP15, APP2, APP3,
+APP4, APP5, APP6, APP7, APP8, APP9, Adobe, CIFF, CanonVRD, Ducky, EXIF,
+ExifIFD, File, FlashPix, FotoStation, GPS, GlobParamIFD, ICC_Profile, IFD0,
+IFD1, IPTC, InteropIFD, JFIF, Jpeg2000, MIE, MPF, MakerNotes, Meta, MetaIFD,
+NikonCapture, PDF, PDF-update, PNG, PhotoMechanic, Photoshop, PrintIM,
+RMETA, RSRC, SubIFD, Trailer, XML, XML-*, XMP, XMP-*</blockquote>
+<p>Note that the JPEG "APP" groups are special, and are used only to delete
+application segments which are not associated with another deletable group.  For
+example, deleting '<code>APP14:*</code>' will delete other APP14 segments, but
+not the APP14 "Adobe" segment.</p>
 <p><b>Example:</b></p>
 <blockquote><table class='box'><tr><td><pre>
 my @delGroups = Image::ExifTool::<b>GetDelGroups</b>();
@@ -1869,13 +1905,13 @@ my @delGroups = Image::ExifTool::<b>GetDelGroups</b>();
 <p>Get type of file given file name.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>GetFileType(;$$)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td>
+<tr><td valign=top><b>Inputs</b></td>
 <td><b>0)</b> [<i>optional</i>] File name or extension
 <br><b>1)</b> [<i>optional</i>] Flag to return a description instead of a type.
 Set to 0 to return type for recognized but unsupported files (otherwise the
 return value for unsupported files is undef).
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>A string, based on the file extension, which
+<tr><td valign=top><b>Returns</b></td><td>A string, based on the file extension, which
 indicates the basic format of the file.  Note that some files may be based on
 other formats (like many RAW image formats are based on TIFF).  In array
 context, may return more than one file type if the file may be based on
@@ -1895,9 +1931,9 @@ my $desc = Image::ExifTool::<b>GetFileType</b>($filename, 1);
 <p>Can the specified file be written?</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>CanWrite($)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td>
+<tr><td valign=top><b>Inputs</b></td>
 <td><b>0)</b> File name or extension</td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>True if ExifTool supports writing files of
+<tr><td valign=top><b>Returns</b></td><td>True if ExifTool supports writing files of
 this type (based on the file extension).</td></tr>
 </table></blockquote>
 <p><b>Example:</b></p>
@@ -1909,11 +1945,11 @@ my $writable = Image::ExifTool::<b>CanWrite</b>($filename);
 <p>Can the specified file be created?</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>CanCreate($)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td>
+<tr><td valign=top><b>Inputs</b></td>
 <td><b>0)</b> File name or extension</td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>True if ExifTool can create files with this
+<tr><td valign=top><b>Returns</b></td><td>True if ExifTool can create files with this
 extension from scratch.<br>Currently, this can only be done with XMP, MIE, ICC,
-VRD and EXIF files.</td></tr>
+VRD, EXV and EXIF files.</td></tr>
 </table></blockquote>
 <p><b>Example:</b></p>
 <blockquote><table class='box'><tr><td><pre>
@@ -1928,10 +1964,10 @@ the usual technique of creating user-defined tags via the
 after the tag table has been initialized.</p>
 <blockquote><table class='norm'>
 <tr><td><b>Prototype</b></td><td>AddUserDefinedTags($%)</td></tr>
-<tr><td valign='top'><b>Inputs</b></td><td><b>0)</b> Destination tag table name
+<tr><td valign=top><b>Inputs</b></td><td><b>0)</b> Destination tag table name
 <br><b>1-N)</b> Pairs of tag ID / tag information hash references for the new tags
 </td></tr>
-<tr><td valign='top'><b>Returns</b></td><td>The number of tags added</td></tr>
+<tr><td valign=top><b>Returns</b></td><td>The number of tags added</td></tr>
 </table></blockquote>
 <p><b>Example:</b></p>
 <blockquote><table class='box'><tr><td><pre>
@@ -154,7 +154,7 @@ limited to the range 1970 to 2038.</p>
 </p>
 <hr />
 <h1><a name="author">AUTHOR</a></h1>
-<p>Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)</p>
+<p>Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)</p>
 <p>This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.</p>
 <p>
@@ -14,6 +14,10 @@ incompatible with some file formats.</p>
 
 <p>ExifTool will read and write (but not create) AFCP IPTC information in JPEG
 and TIFF images.</p>
+
+<p>See
+<a href="http://web.archive.org/web/20080828211305/http://www.tocarte.com/media/axs_afcp_spec.pdf">http://web.archive.org/web/20080828211305/http://www.tocarte.com/media/axs_afcp_spec.pdf</a>
+for the AFCP specification.</p>
 <blockquote>
 <table class=frame><tr><td>
 <table class=inner cellspacing=1>
@@ -43,7 +47,7 @@ and TIFF images.</p>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Dec 9, 2008</i>
+<br><i>Last revised Jul 3, 2013</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -10,7 +10,7 @@
 <p>Tags found in Monkey&#39;s Audio (APE) information.  Only a few common tags are
 listed below, but ExifTool will extract any tag found.  ExifTool supports
 APEv1 and APEv2 tags, as well as ID3 information in APE files, and will also
-read APE metadata from MP3 files.</p>
+read APE metadata from MP3 and MPC files.</p>
 <blockquote>
 <table class=frame><tr><td>
 <table class=inner cellspacing=1>
@@ -143,7 +143,7 @@ read APE metadata from MP3 files.</p>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Nov 6, 2012</i>
+<br><i>Last revised Feb 3, 2014</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -161,7 +161,7 @@ formatting of this table.</p>
 <tr>
 <td>MetadataLibrary</td>
 <td class=c>-</td>
-<td>--&gt; <a href='ASF.html#Metadata'>ASF Metadata Tags</a></td></tr>
+<td>--&gt; <a href='ASF.html#ExtendedDescr'>ASF ExtendedDescr Tags</a></td></tr>
 <tr class=b>
 <td>TimecodeIndexParms</td>
 <td class=c>N</td>
@@ -189,7 +189,7 @@ formatting of this table.</p>
 <tr class=b>
 <td>Metadata</td>
 <td class=c>-</td>
-<td>--&gt; <a href='ASF.html#Metadata'>ASF Metadata Tags</a></td></tr>
+<td>--&gt; <a href='ASF.html#ExtendedDescr'>ASF ExtendedDescr Tags</a></td></tr>
 <tr>
 <td>GroupMutualExclusion</td>
 <td class=c>N</td>
@@ -204,191 +204,6 @@ formatting of this table.</p>
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
-<h2><a name='Metadata'>ASF Metadata Tags</a></h2>
-<blockquote>
-<table class=frame><tr><td>
-<table class=inner cellspacing=1>
-<tr class=h><th>Tag Name</th>
-<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
-<tr><td colspan=3 class=c><i>[no tags known]</i></td></tr>
-</table></td></tr></table></blockquote>
-
-<h2><a name='ContentDescr'>ASF ContentDescr Tags</a></h2>
-<blockquote>
-<table class=frame><tr><td>
-<table class=inner cellspacing=1>
-<tr class=h><th>Tag Name</th>
-<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
-<tr>
-<td>Title</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-<tr class=b>
-<td>Author</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-<tr>
-<td>Copyright</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-<tr class=b>
-<td>Description</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-<tr>
-<td>Rating</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-</table></td></tr></table></blockquote>
-
-<h2><a name='CodecList'>ASF CodecList Tags</a></h2>
-<blockquote>
-<table class=frame><tr><td>
-<table class=inner cellspacing=1>
-<tr class=h><th>Tag Name</th>
-<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
-<tr>
-<td>AudioCodecDescription</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-<tr class=b>
-<td>AudioCodecName</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-<tr>
-<td>OtherCodecDescription</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-<tr class=b>
-<td>OtherCodecName</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-<tr>
-<td>VideoCodecDescription</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-<tr class=b>
-<td>VideoCodecName</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-</table></td></tr></table></blockquote>
-
-<h2><a name='FileProperties'>ASF FileProperties Tags</a></h2>
-<blockquote>
-<table class=frame><tr><td>
-<table class=inner cellspacing=1>
-<tr class=h><th>Index1</th><th>Tag Name</th>
-<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
-<tr>
-<td class=r title='0 = 0x0'>0</td>
-<td>FileID</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-<tr class=b>
-<td class=r title='16 = 0x10'>16</td>
-<td>FileLength</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-<tr>
-<td class=r title='24 = 0x18'>24</td>
-<td>CreationDate</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-<tr class=b>
-<td class=r title='32 = 0x20'>32</td>
-<td>DataPackets</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-<tr>
-<td class=r title='40 = 0x28'>40</td>
-<td>PlayDuration</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-<tr class=b>
-<td class=r title='48 = 0x30'>48</td>
-<td>SendDuration</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-<tr>
-<td class=r title='56 = 0x38'>56</td>
-<td>Preroll</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-<tr class=b>
-<td class=r title='64 = 0x40'>64</td>
-<td>Flags</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-<tr>
-<td class=r title='68 = 0x44'>68</td>
-<td>MinPacketSize</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-<tr class=b>
-<td class=r title='72 = 0x48'>72</td>
-<td>MaxPacketSize</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-<tr>
-<td class=r title='76 = 0x4c'>76</td>
-<td>MaxBitrate</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-</table></td></tr></table></blockquote>
-
-<h2><a name='StreamProperties'>ASF StreamProperties Tags</a></h2>
-<p>Tags with index 54 and greater are conditional based on the StreamType.</p>
-<blockquote>
-<table class=frame><tr><td>
-<table class=inner cellspacing=1>
-<tr class=h><th>Index1</th><th>Tag Name</th>
-<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
-<tr>
-<td class=r title='0 = 0x0'>0</td>
-<td>StreamType</td>
-<td class=c>N</td>
-<td><span class=s>&#39;35907DE0-E415-11CF-A917-00805F5C442B&#39; = Degradable JPEG
-  <br>&#39;3AFB65E2-47EF-40F2-AC2C-70A90D71D343&#39; = Binary
-  <br>&#39;59DACFC0-59E6-11D0-A3AC-00A0C90348F6&#39; = Command
-  <br>&#39;91BD222C-F21C-497A-8B6D-5AA86BFC0185&#39; = File Transfer
-  <br>&#39;B61BE100-5B4E-11CF-A8FD-00805F5C442B&#39; = JFIF
-  <br>&#39;BC19EFC0-5B4D-11CF-A8FD-00805F5C442B&#39; = Video
-  <br>&#39;F8699E40-5B4D-11CF-A8FD-00805F5C442B&#39; = Audio</span></td></tr>
-<tr class=b>
-<td class=r title='16 = 0x10'>16</td>
-<td>ErrorCorrectionType</td>
-<td class=c>N</td>
-<td><span class=s>&#39;20FB5700-5B55-11CF-A8FD-00805F5C442B&#39; = No Error Correction
-  <br>&#39;BFC3CD50-618F-11CF-8BB2-00AA00B4E220&#39; = Audio Spread</span></td></tr>
-<tr>
-<td class=r title='32 = 0x20'>32</td>
-<td>TimeOffset</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-<tr class=b>
-<td class=r title='48 = 0x30'>48</td>
-<td>StreamNumber</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-<tr>
-<td class=r title='54 = 0x36'>54</td>
-<td>AudioCodecID
-  <br>ImageWidth</td>
-<td class=c>N<br>N</td>
-<td>--&gt; <a href='RIFF.html#AudioEncoding'>RIFF AudioEncoding Values</a></td></tr>
-<tr class=b>
-<td class=r title='56 = 0x38'>56</td>
-<td>AudioChannels</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-<tr>
-<td class=r title='58 = 0x3a'>58</td>
-<td>AudioSampleRate
-  <br>ImageHeight</td>
-<td class=c>N<br>N</td>
-<td>&nbsp;</td></tr>
-</table></td></tr></table></blockquote>
-
 <h2><a name='ExtendedDescr'>ASF ExtendedDescr Tags</a></h2>
 <blockquote>
 <table class=frame><tr><td>
@@ -1067,9 +882,185 @@ formatting of this table.</p>
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
+<h2><a name='ContentDescr'>ASF ContentDescr Tags</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td>Title</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>Author</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>Copyright</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>Description</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>Rating</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='CodecList'>ASF CodecList Tags</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td>AudioCodecDescription</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>AudioCodecName</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>OtherCodecDescription</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>OtherCodecName</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>VideoCodecDescription</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>VideoCodecName</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='FileProperties'>ASF FileProperties Tags</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index1</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='0 = 0x0'>0</td>
+<td>FileID</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='16 = 0x10'>16</td>
+<td>FileLength</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='24 = 0x18'>24</td>
+<td>CreationDate</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='32 = 0x20'>32</td>
+<td>DataPackets</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='40 = 0x28'>40</td>
+<td>PlayDuration</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='48 = 0x30'>48</td>
+<td>SendDuration</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='56 = 0x38'>56</td>
+<td>Preroll</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='64 = 0x40'>64</td>
+<td>Flags</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='68 = 0x44'>68</td>
+<td>MinPacketSize</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='72 = 0x48'>72</td>
+<td>MaxPacketSize</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='76 = 0x4c'>76</td>
+<td>MaxBitrate</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='StreamProperties'>ASF StreamProperties Tags</a></h2>
+<p>Tags with index 54 and greater are conditional based on the StreamType.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index1</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='0 = 0x0'>0</td>
+<td>StreamType</td>
+<td class=c>N</td>
+<td><span class=s>&#39;35907DE0-E415-11CF-A917-00805F5C442B&#39; = Degradable JPEG
+  <br>&#39;3AFB65E2-47EF-40F2-AC2C-70A90D71D343&#39; = Binary
+  <br>&#39;59DACFC0-59E6-11D0-A3AC-00A0C90348F6&#39; = Command
+  <br>&#39;91BD222C-F21C-497A-8B6D-5AA86BFC0185&#39; = File Transfer
+  <br>&#39;B61BE100-5B4E-11CF-A8FD-00805F5C442B&#39; = JFIF
+  <br>&#39;BC19EFC0-5B4D-11CF-A8FD-00805F5C442B&#39; = Video
+  <br>&#39;F8699E40-5B4D-11CF-A8FD-00805F5C442B&#39; = Audio</span></td></tr>
+<tr class=b>
+<td class=r title='16 = 0x10'>16</td>
+<td>ErrorCorrectionType</td>
+<td class=c>N</td>
+<td><span class=s>&#39;20FB5700-5B55-11CF-A8FD-00805F5C442B&#39; = No Error Correction
+  <br>&#39;BFC3CD50-618F-11CF-8BB2-00AA00B4E220&#39; = Audio Spread</span></td></tr>
+<tr>
+<td class=r title='32 = 0x20'>32</td>
+<td>TimeOffset</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='48 = 0x30'>48</td>
+<td>StreamNumber</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='54 = 0x36'>54</td>
+<td>AudioCodecID
+  <br>ImageWidth</td>
+<td class=c>N<br>N</td>
+<td>--&gt; <a href='RIFF.html#AudioEncoding'>RIFF AudioEncoding Values</a></td></tr>
+<tr class=b>
+<td class=r title='56 = 0x38'>56</td>
+<td>AudioChannels</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='58 = 0x3a'>58</td>
+<td>AudioSampleRate
+  <br>ImageHeight</td>
+<td class=c>N<br>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Nov 11, 2010</i>
+<br><i>Last revised May 13, 2013</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -0,0 +1,69 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<title>Apple Tags</title>
+<link rel=stylesheet type='text/css' href='style.css' title='Style'>
+</head>
+<body>
+<h2 class=top>Apple Tags</h2>
+<p>Tags extracted from maker notes of images from the iPhone 5 with iOS 7.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td title='0x0003 = 3'>0x0003</td>
+<td>RunTime</td>
+<td class=c>-</td>
+<td>--&gt; <a href='Apple.html#RunTime'>Apple RunTime Tags</a></td></tr>
+<tr class=b>
+<td title='0x000a = 10'>0x000a</td>
+<td>HDRImageType</td>
+<td class=c>int32s</td>
+<td><span class=s>3 = HDR Image
+  <br>4 = Original Image</span></td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='RunTime'>Apple RunTime Tags</a></h2>
+<p>This PLIST-format information contains the elements of a CMTime structure
+representing the amount of time the phone has been running since the last
+boot, not including standby time.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td>'epoch'</td>
+<td>RunTimeEpoch</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'flags'</td>
+<td>RunTimeFlags</td>
+<td class=c>N</td>
+<td><span class=s>Bit 0 = Valid
+  <br>Bit 1 = Has been rounded
+  <br>Bit 2 = Positive infinity
+  <br>Bit 3 = Negative infinity
+  <br>Bit 4 = Indefinite</span></td></tr>
+<tr>
+<td>'timescale'</td>
+<td>RunTimeScale</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'value'</td>
+<td>RunTimeValue</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<hr>
+(This document generated automatically by Image::ExifTool::BuildTagLookup)
+<br><i>Last revised Oct 2, 2013</i>
+<p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
+</body>
+</html>
@@ -83,6 +83,7 @@
   <br>CanonCameraInfo40D
   <br>CanonCameraInfo50D
   <br>CanonCameraInfo60D
+  <br>CanonCameraInfo70D
   <br>CanonCameraInfo450D
   <br>CanonCameraInfo500D
   <br>CanonCameraInfo550D
@@ -95,7 +96,7 @@
   <br>CanonCameraInfoUnknown32
   <br>CanonCameraInfoUnknown16
   <br>CanonCameraInfoUnknown</td>
-<td class=c>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-</td>
+<td class=c>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-</td>
 <td>--&gt; <a href='Canon.html#CameraInfo1D'>Canon CameraInfo1D Tags</a>
   <br>--&gt; <a href='Canon.html#CameraInfo1DmkII'>Canon CameraInfo1DmkII Tags</a>
   <br>--&gt; <a href='Canon.html#CameraInfo1DmkIIN'>Canon CameraInfo1DmkIIN Tags</a>
@@ -110,6 +111,7 @@
   <br>--&gt; <a href='Canon.html#CameraInfo40D'>Canon CameraInfo40D Tags</a>
   <br>--&gt; <a href='Canon.html#CameraInfo50D'>Canon CameraInfo50D Tags</a>
   <br>--&gt; <a href='Canon.html#CameraInfo60D'>Canon CameraInfo60D Tags</a>
+  <br>--&gt; <a href='Canon.html#CameraInfo70D'>Canon CameraInfo70D Tags</a>
   <br>--&gt; <a href='Canon.html#CameraInfo450D'>Canon CameraInfo450D Tags</a>
   <br>--&gt; <a href='Canon.html#CameraInfo500D'>Canon CameraInfo500D Tags</a>
   <br>--&gt; <a href='Canon.html#CameraInfo550D'>Canon CameraInfo550D Tags</a>
@@ -654,9 +656,24 @@
 </tr><tr><td class=r>0x3380000</td><td>= PowerShot N</td>
 </tr><tr><td class=r>0x3390000</td><td>= IXUS 245 HS / IXY 430F</td>
 </tr><tr><td class=r>0x3400000</td><td>= PowerShot SX280 HS</td>
+</tr><tr><td class=r>0x3410000</td><td>= PowerShot SX270 HS</td>
+</tr><tr><td class=r>0x3420000</td><td>= PowerShot A3500 IS</td>
 </tr><tr><td class=r>0x3430000</td><td>= PowerShot A2600</td>
+</tr><tr><td class=r>0x3450000</td><td>= PowerShot A1400</td>
 </tr><tr><td class=r>0x3460000</td><td>= PowerShot ELPH 130 IS / IXUS 140 / IXY 110F</td>
+</tr><tr><td class=r>0x3470000</td><td>= PowerShot ELPH 115 IS / IXUS 132/135 / IXY 90F</td>
 </tr><tr><td class=r>0x3490000</td><td>= PowerShot ELPH 330 HS / IXUS 255 HS / IXY 610F</td>
+</tr><tr><td class=r>0x3510000</td><td>= PowerShot A2500</td>
+</tr><tr><td class=r>0x3540000</td><td>= PowerShot G16</td>
+</tr><tr><td class=r>0x3550000</td><td>= PowerShot S120</td>
+</tr><tr><td class=r>0x3560000</td><td>= PowerShot SX170 IS</td>
+</tr><tr><td class=r>0x3580000</td><td>= PowerShot SX510 HS</td>
+</tr><tr><td class=r>0x3590000</td><td>= PowerShot S200 (new)</td>
+</tr><tr><td class=r>0x3610000</td><td>= PowerShot N100</td>
+</tr><tr><td class=r>0x3640000</td><td>= PowerShot G1 X Mark II</td>
+</tr><tr><td class=r>0x3650000</td><td>= PowerShot D30</td>
+</tr><tr><td class=r>0x3660000</td><td>= PowerShot SX700 HS</td>
+</tr><tr><td class=r>0x3670000</td><td>= PowerShot SX600 HS</td>
 </tr><tr><td class=r>0x4040000</td><td>= PowerShot G1</td>
 </tr><tr><td class=r>0x6040000</td><td>= PowerShot S100 / Digital IXUS / IXY Digital</td>
 </tr><tr><td class=r>0x4007d673</td><td>= DC19/DC21/DC22</td>
@@ -687,6 +704,7 @@
 </tr><tr><td class=r>0x4007da8f</td><td>= HF M30/M31/M36/M300/M306</td>
 </tr><tr><td class=r>0x4007da90</td><td>= HF S20/S21/S200</td>
 </tr><tr><td class=r>0x4007da92</td><td>= FS31/FS36/FS37/FS300/FS305/FS306/FS307</td>
+</tr><tr><td class=r>0x4007dda9</td><td>= HF G25</td>
 </tr><tr><td class=r>0x80000001</td><td>= EOS-1D</td>
 </tr><tr><td class=r>0x80000167</td><td>= EOS-1DS</td>
 </tr><tr><td class=r>0x80000168</td><td>= EOS 10D</td>
@@ -723,10 +741,14 @@
 </tr><tr><td class=r>0x80000297</td><td>= WFT-E2 II</td>
 </tr><tr><td class=r>0x80000298</td><td>= WFT-E4 II</td>
 </tr><tr><td class=r>0x80000301</td><td>= EOS Rebel T4i / 650D / Kiss X6i</td>
-</tr><tr><td class=r>0x80000302</td><td>= 6D</td>
+</tr><tr><td class=r>0x80000302</td><td>= EOS 6D</td>
+</tr><tr><td class=r>0x80000324</td><td>= EOS-1D C</td>
+</tr><tr><td class=r>0x80000325</td><td>= EOS 70D</td>
 </tr><tr><td class=r>0x80000326</td><td>= EOS Rebel T5i / 700D / Kiss X7i</td>
+</tr><tr><td class=r>0x80000327</td><td>= EOS Rebel T5 / 1200D / Kiss X70</td>
 </tr><tr><td class=r>0x80000331</td><td>= EOS M</td>
 </tr><tr><td class=r>0x80000346</td><td>= EOS Rebel SL1 / 100D / Kiss X7</td>
+</tr><tr><td class=r>0x80000355</td><td>= EOS M2</td>
 </tr></table></td></tr></table></blockquote>
 
 <h2><a name='CameraSettings'>Canon CameraSettings Tags</a></h2>
@@ -796,11 +818,12 @@
   <br>1 = AI Servo AF
   <br>2 = AI Focus AF
   <br>3 = Manual Focus (3)
-  <br>4 = Single</td><td>&nbsp;&nbsp;</td>
-  <td>5 = Continuous
-  <br>6 = Manual Focus (6)
+  <br>4 = Single
+  <br>5 = Continuous</td><td>&nbsp;&nbsp;</td>
+  <td>6 = Manual Focus (6)
   <br>16 = Pan Focus
   <br>256 = AF + MF
+  <br>512 = Movie Snap Focus
   <br>519 = Movie Servo AF</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
 <tr>
@@ -810,12 +833,13 @@
 <td><table class=cols><tr>
   <td>1 = JPEG
   <br>2 = CRW+THM
-  <br>3 = AVI+THM
-  <br>4 = TIF</td><td>&nbsp;&nbsp;</td>
-  <td>5 = TIF+JPEG
-  <br>6 = CR2
-  <br>7 = CR2+JPEG
-  <br>9 = Video</td><td>&nbsp;&nbsp;</td></tr></table>
+  <br>3 = AVI+THM</td><td>&nbsp;&nbsp;</td>
+  <td>4 = TIF
+  <br>5 = TIF+JPEG
+  <br>6 = CR2</td><td>&nbsp;&nbsp;</td>
+  <td>7 = CR2+JPEG
+  <br>9 = MOV
+  <br>10 = MP4</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
 <tr class=b>
 <td class=r title='10 = 0xa'>10</td>
@@ -1197,7 +1221,7 @@ attempting to identify the specific lens model.</p>
 </tr><tr><td>28</td><td>= Canon EF 80-200mm f/4.5-5.6 or Tamron Lens</td>
 </tr><tr><td>28.1</td><td>= Tamron SP AF 28-105mm f/2.8 LD Aspherical IF</td>
 </tr><tr><td>28.2</td><td>= Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical [IF] Macro</td>
-</tr><tr><td>28.3</td><td>= Tamron AF 70-300mm f/4.5-5.6 Di LD 1:2 Macro Zoom</td>
+</tr><tr><td>28.3</td><td>= Tamron AF 70-300mm f/4-5.6 Di LD 1:2 Macro</td>
 </tr><tr><td>28.4</td><td>= Tamron AF Aspherical 28-200mm f/3.8-5.6</td>
 </tr><tr><td>29</td><td>= Canon EF 50mm f/1.8 II</td>
 </tr><tr><td>30</td><td>= Canon EF 35-105mm f/4.5-5.6</td>
@@ -1235,6 +1259,7 @@ attempting to identify the specific lens model.</p>
 </tr><tr><td>51</td><td>= Canon EF-S 18-135mm f/3.5-5.6 IS</td>
 </tr><tr><td>52</td><td>= Canon EF-S 18-55mm f/3.5-5.6 IS II</td>
 </tr><tr><td>53</td><td>= Canon EF-S 18-55mm f/3.5-5.6 III</td>
+</tr><tr><td>54</td><td>= Canon EF-S 55-250mm f/4-5.6 IS II</td>
 </tr><tr><td>94</td><td>= Canon TS-E 17mm f/4L</td>
 </tr><tr><td>95</td><td>= Canon TS-E 24.0mm f/3.5 L II</td>
 </tr><tr><td>124</td><td>= Canon MP-E 65mm f/2.8 1-5x Macro Photo</td>
@@ -1270,6 +1295,7 @@ attempting to identify the specific lens model.</p>
 </tr><tr><td>137.12</td><td>= Tamron SP 60mm f/2 Macro Di II</td>
 </tr><tr><td>137.13</td><td>= Sigma 10-20mm f/3.5 EX DC HSM</td>
 </tr><tr><td>137.14</td><td>= Tamron SP 24-70mm f/2.8 Di VC USD</td>
+</tr><tr><td>137.15</td><td>= Sigma 18-35mm f/1.8 DC HSM</td>
 </tr><tr><td>138</td><td>= Canon EF 28-80mm f/2.8-4L</td>
 </tr><tr><td>139</td><td>= Canon EF 400mm f/2.8L</td>
 </tr><tr><td>140</td><td>= Canon EF 500mm f/4.5L</td>
@@ -1336,6 +1362,7 @@ attempting to identify the specific lens model.</p>
 </tr><tr><td>174</td><td>= Canon EF 135mm f/2L or Sigma Lens</td>
 </tr><tr><td>174.1</td><td>= Sigma 70-200mm f/2.8 EX DG APO OS HSM</td>
 </tr><tr><td>174.2</td><td>= Sigma 50-500mm f/4.5-6.3 APO DG OS HSM</td>
+</tr><tr><td>174.3</td><td>= Sigma 150-500mm f/5-6.3 APO DG OS HSM</td>
 </tr><tr><td>175</td><td>= Canon EF 400mm f/2.8L</td>
 </tr><tr><td>176</td><td>= Canon EF 24-85mm f/3.5-4.5 USM</td>
 </tr><tr><td>177</td><td>= Canon EF 300mm f/4L IS</td>
@@ -1346,6 +1373,7 @@ attempting to identify the specific lens model.</p>
 </tr><tr><td>182</td><td>= Canon EF 100-400mm f/4.5-5.6L IS + 2x</td>
 </tr><tr><td>183</td><td>= Canon EF 100-400mm f/4.5-5.6L IS or Sigma Lens</td>
 </tr><tr><td>183.1</td><td>= Sigma 150mm f/2.8 EX DG OS HSM APO Macro</td>
+</tr><tr><td>183.2</td><td>= Sigma 105mm f/2.8 EX DG OS HSM Macro</td>
 </tr><tr><td>184</td><td>= Canon EF 400mm f/2.8L + 2x</td>
 </tr><tr><td>185</td><td>= Canon EF 600mm f/4L IS</td>
 </tr><tr><td>186</td><td>= Canon EF 70-200mm f/4L</td>
@@ -1359,7 +1387,8 @@ attempting to identify the specific lens model.</p>
 </tr><tr><td>195</td><td>= Canon EF 35-105mm f/4.5-5.6 USM</td>
 </tr><tr><td>196</td><td>= Canon EF 75-300mm f/4-5.6 USM</td>
 </tr><tr><td>197</td><td>= Canon EF 75-300mm f/4-5.6 IS USM</td>
-</tr><tr><td>198</td><td>= Canon EF 50mm f/1.4 USM</td>
+</tr><tr><td>198</td><td>= Canon EF 50mm f/1.4 USM or Zeiss Lens</td>
+</tr><tr><td>198.1</td><td>= Zeiss Otus 55mm f/1.4 ZE</td>
 </tr><tr><td>199</td><td>= Canon EF 28-80mm f/3.5-5.6 USM</td>
 </tr><tr><td>200</td><td>= Canon EF 75-300mm f/4-5.6 USM</td>
 </tr><tr><td>201</td><td>= Canon EF 28-80mm f/3.5-5.6 USM</td>
@@ -1369,7 +1398,8 @@ attempting to identify the specific lens model.</p>
 </tr><tr><td>210</td><td>= Canon EF 28-90mm f/4-5.6 USM</td>
 </tr><tr><td>211</td><td>= Canon EF 28-200mm f/3.5-5.6 USM</td>
 </tr><tr><td>212</td><td>= Canon EF 28-105mm f/4-5.6 USM</td>
-</tr><tr><td>213</td><td>= Canon EF 90-300mm f/4.5-5.6 USM</td>
+</tr><tr><td>213</td><td>= Canon EF 90-300mm f/4.5-5.6 USM or Tamron Lens</td>
+</tr><tr><td>213.1</td><td>= Tamron SP 150-600mm F/5-6.3 Di VC USD</td>
 </tr><tr><td>214</td><td>= Canon EF-S 18-55mm f/3.5-5.6 USM</td>
 </tr><tr><td>215</td><td>= Canon EF 55-200mm f/4.5-5.6 II USM</td>
 </tr><tr><td>224</td><td>= Canon EF 70-200mm f/2.8L IS</td>
@@ -1412,6 +1442,7 @@ attempting to identify the specific lens model.</p>
 </tr><tr><td>494</td><td>= Canon EF 600mm f/4.0L IS II USM</td>
 </tr><tr><td>495</td><td>= Canon EF 24-70mm f/2.8L II USM</td>
 </tr><tr><td>496</td><td>= Canon EF 200-400mm f/4L IS USM</td>
+</tr><tr><td>499</td><td>= Canon EF 200-400mm f/4L IS USM + 1.4x</td>
 </tr><tr><td>502</td><td>= Canon EF 28mm f/2.8 IS USM</td>
 </tr><tr><td>503</td><td>= Canon EF 24mm f/2.8 IS USM</td>
 </tr><tr><td>504</td><td>= Canon EF 24-70mm f/4L IS USM</td>
@@ -1420,6 +1451,9 @@ attempting to identify the specific lens model.</p>
 </tr><tr><td>4143</td><td>= Canon EF-M 18-55mm f/3.5-5.6 IS STM</td>
 </tr><tr><td>4144</td><td>= Canon EF 40mm f/2.8 STM</td>
 </tr><tr><td>4145</td><td>= Canon EF-M 22mm f/2 STM</td>
+</tr><tr><td>4146</td><td>= Canon EF-S 18-55mm f/3.5-5.6 IS STM</td>
+</tr><tr><td>4147</td><td>= Canon EF-M 11-22mm f/4-5.6 IS STM</td>
+</tr><tr><td>4148</td><td>= Canon EF-S 55-250mm f/4-5.6 IS STM</td>
 </tr></table></td></tr></table></blockquote>
 
 <h2><a name='FocalLength'>Canon FocalLength Tags</a></h2>
@@ -2926,27 +2960,27 @@ versions 1.0.x, but they may be different for other firmware versions.</p>
 </td></tr>
 <tr>
 <td class=r title='144 = 0x90'>144</td>
-<td>ContrastUnknown?</td>
+<td>ContrastAuto</td>
 <td class=c>int32s</td>
 <td><span class=s>0xdeadbeef = n/a</span></td></tr>
 <tr class=b>
 <td class=r title='148 = 0x94'>148</td>
-<td>SharpnessUnknown?</td>
+<td>SharpnessAuto</td>
 <td class=c>int32s</td>
 <td><span class=s>0xdeadbeef = n/a</span></td></tr>
 <tr>
 <td class=r title='152 = 0x98'>152</td>
-<td>SaturationUnknown?</td>
+<td>SaturationAuto</td>
 <td class=c>int32s</td>
 <td><span class=s>0xdeadbeef = n/a</span></td></tr>
 <tr class=b>
 <td class=r title='156 = 0x9c'>156</td>
-<td>ColorToneUnknown?</td>
+<td>ColorToneAuto</td>
 <td class=c>int32s</td>
 <td><span class=s>0xdeadbeef = n/a</span></td></tr>
 <tr>
 <td class=r title='160 = 0xa0'>160</td>
-<td>FilterEffectUnknown?</td>
+<td>FilterEffectAuto</td>
 <td class=c>int32s</td>
 <td><table class=cols><tr>
   <td>0xdeadbeef = n/a
@@ -2958,7 +2992,7 @@ versions 1.0.x, but they may be different for other firmware versions.</p>
 </td></tr>
 <tr class=b>
 <td class=r title='164 = 0xa4'>164</td>
-<td>ToningEffectUnknown?</td>
+<td>ToningEffectAuto</td>
 <td class=c>int32s</td>
 <td><table class=cols><tr>
   <td>0xdeadbeef = n/a
@@ -4268,7 +4302,98 @@ versions 1.0.x, but they may be different for other firmware versions.</p>
 <td>&nbsp;</td></tr>
 <tr class=b>
 <td class=r title='801 = 0x321'>801</td>
-<td>PictureStyleInfo2</td>
+<td>PictureStyleInfo</td>
+<td class=c>-</td>
+<td>--&gt; <a href='Canon.html#PSInfo2'>Canon PSInfo2 Tags</a></td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='CameraInfo70D'>Canon CameraInfo70D Tags</a></h2>
+<p>CameraInfo tags for the EOS 70D.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index1</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='3 = 0x3'>3</td>
+<td>FNumber</td>
+<td class=c>int8u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='4 = 0x4'>4</td>
+<td>ExposureTime</td>
+<td class=c>int8u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='6 = 0x6'>6</td>
+<td>ISO</td>
+<td class=c>int8u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='27 = 0x1b'>27</td>
+<td>CameraTemperature</td>
+<td class=c>int8u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='35 = 0x23'>35</td>
+<td>FocalLength</td>
+<td class=c>int16uRev</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='132 = 0x84'>132</td>
+<td>CameraOrientation</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Horizontal (normal)
+  <br>1 = Rotate 90 CW
+  <br>2 = Rotate 270 CW</span></td></tr>
+<tr>
+<td class=r title='147 = 0x93'>147</td>
+<td>FocusDistanceUpper</td>
+<td class=c>int16uRev</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='149 = 0x95'>149</td>
+<td>FocusDistanceLower</td>
+<td class=c>int16uRev</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='199 = 0xc7'>199</td>
+<td>ColorTemperature</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='358 = 0x166'>358</td>
+<td>LensType</td>
+<td class=c>int16uRev</td>
+<td>--&gt; <a href='Canon.html#LensType'>Canon LensType Values</a></td></tr>
+<tr>
+<td class=r title='360 = 0x168'>360</td>
+<td>MinFocalLength</td>
+<td class=c>int16uRev</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='362 = 0x16a'>362</td>
+<td>MaxFocalLength</td>
+<td class=c>int16uRev</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='606 = 0x25e'>606</td>
+<td>FirmwareVersion</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='691 = 0x2b3'>691</td>
+<td>FileIndex</td>
+<td class=c>int32u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='703 = 0x2bf'>703</td>
+<td>DirectoryIndex</td>
+<td class=c>int32u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='975 = 0x3cf'>975</td>
+<td>PictureStyleInfo</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Canon.html#PSInfo2'>Canon PSInfo2 Tags</a></td></tr>
 </table></td></tr></table></blockquote>
@@ -4748,7 +4873,7 @@ versions 1.0.x, but they may be different for other firmware versions.</p>
 </table></td></tr></table></blockquote>
 
 <h2><a name='CameraInfo650D'>Canon CameraInfo650D Tags</a></h2>
-<p>CameraInfo tags for the EOS 650D.</p>
+<p>CameraInfo tags for the EOS 650D and 700D.</p>
 <blockquote>
 <table class=frame><tr><td>
 <table class=inner cellspacing=1>
@@ -4775,7 +4900,7 @@ versions 1.0.x, but they may be different for other firmware versions.</p>
 <td class=c>int8u</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td class=r title='32 = 0x20'>32</td>
+<td class=r title='35 = 0x23'>35</td>
 <td>FocalLength</td>
 <td class=c>int16uRev</td>
 <td>&nbsp;</td></tr>
@@ -4830,18 +4955,33 @@ versions 1.0.x, but they may be different for other firmware versions.</p>
 <td class=r title='539 = 0x21b'>539</td>
 <td>FirmwareVersion</td>
 <td class=c>N</td>
-<td>&nbsp;</td></tr>
+<td><span class=s><span class=n>(650D)</span></span></td></tr>
 <tr class=b>
+<td class=r title='544 = 0x220'>544</td>
+<td>FirmwareVersion</td>
+<td class=c>N</td>
+<td><span class=s><span class=n>(700D)</span></span></td></tr>
+<tr>
 <td class=r title='624 = 0x270'>624</td>
 <td>FileIndex</td>
 <td class=c>int32u</td>
-<td>&nbsp;</td></tr>
+<td><span class=s><span class=n>(650D)</span></span></td></tr>
+<tr class=b>
+<td class=r title='628 = 0x274'>628</td>
+<td>FileIndex</td>
+<td class=c>int32u</td>
+<td><span class=s><span class=n>(700D)</span></span></td></tr>
 <tr>
 <td class=r title='636 = 0x27c'>636</td>
 <td>DirectoryIndex</td>
 <td class=c>int32u</td>
-<td>&nbsp;</td></tr>
+<td><span class=s><span class=n>(650D)</span></span></td></tr>
 <tr class=b>
+<td class=r title='640 = 0x280'>640</td>
+<td>DirectoryIndex</td>
+<td class=c>int32u</td>
+<td><span class=s><span class=n>(700D)</span></span></td></tr>
+<tr>
 <td class=r title='912 = 0x390'>912</td>
 <td>PictureStyleInfo</td>
 <td class=c>-</td>
@@ -5097,30 +5237,10 @@ SD4000, SX20, SX120 and SX210)</span></span></td></tr>
 <td class=c>int32s</td>
 <td><span class=s><span class=n>(A420, A430, A530, A540, A700, SD600, SD630 and SD700)</span></span></td></tr>
 <tr class=b>
-<td class=r title='466 = 0x1d2'>466</td>
+<td class=r>-3</td>
 <td>CameraTemperature</td>
 <td class=c>int32s</td>
-<td><span class=s><span class=n>(100HS, 300HS, 500HS, A1200, A2200, A3200 and A3300)</span></span></td></tr>
-<tr>
-<td class=r title='503 = 0x1f7'>503</td>
-<td>CameraTemperature</td>
-<td class=c>int32s</td>
-<td><span class=s><span class=n>(A800)</span></span></td></tr>
-<tr class=b>
-<td class=r title='506 = 0x1fa'>506</td>
-<td>CameraTemperature</td>
-<td class=c>int32s</td>
-<td><span class=s><span class=n>(SX230HS)</span></span></td></tr>
-<tr>
-<td class=r title='520 = 0x208'>520</td>
-<td>CameraTemperature</td>
-<td class=c>int32s</td>
-<td><span class=s><span class=n>(310HS, 510HS, G1X, S100 (new), SX40HS and SX150)</span></span></td></tr>
-<tr class=b>
-<td class=r title='524 = 0x20c'>524</td>
-<td>CameraTemperature</td>
-<td class=c>int32s</td>
-<td><span class=s><span class=n>(110HS, 520HS, A2300, A2400, A3400, A4000, D20 and SX260HS)</span></span></td></tr>
+<td><span class=s><span class=n>(3 entries from end of record for most newer camera models)</span></span></td></tr>
 </table></td></tr></table></blockquote>
 
 <h2><a name='CameraInfoUnknown16'>Canon CameraInfoUnknown16 Tags</a></h2>
@@ -6783,21 +6903,26 @@ option is used.</p>
 <td>--&gt; <a href='Canon.html#ColorCalib'>Canon ColorCalib Tags</a>
   <br><span class='n s'>(B, C, A, Temperature)</span></td></tr>
 <tr>
+<td class=r title='196 = 0xc4'>196</td>
+<td>PerChannelBlackLevel</td>
+<td class=c>int16u[4]</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td class=r title='584 = 0x248'>584</td>
 <td>FlashOutput</td>
 <td class=c>int16s</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td class=r title='585 = 0x249'>585</td>
 <td>FlashBatteryLevel</td>
 <td class=c>int16s</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td class=r title='586 = 0x24a'>586</td>
 <td>ColorTempFlashData</td>
 <td class=c>int16s</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td class=r title='647 = 0x287'>647</td>
 <td>MeasuredRGGBData</td>
 <td class=c>int32u[4]</td>
@@ -6837,10 +6962,71 @@ option is used.</p>
 <td>--&gt; <a href='Canon.html#ColorCalib'>Canon ColorCalib Tags</a>
   <br><span class='n s'>(B, C, A, Temperature)</span></td></tr>
 <tr class=b>
+<td class=r title='231 = 0xe7'>231</td>
+<td>AverageBlackLevel</td>
+<td class=c>int16u[4]</td>
+<td>&nbsp;</td></tr>
+<tr>
 <td class=r title='640 = 0x280'>640</td>
 <td>RawMeasuredRGGB</td>
 <td class=c>int32u[4]</td>
 <td><span class=s><span class=n>(raw MeasuredRGGB values, before normalization)</span></span></td></tr>
+<tr class=b>
+<td class=r title='692 = 0x2b4'>692</td>
+<td>PerChannelBlackLevel</td>
+<td class=c>int16u[4]</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='696 = 0x2b8'>696</td>
+<td>NormalWhiteLevel</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='697 = 0x2b9'>697</td>
+<td>SpecularWhiteLevel</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='698 = 0x2ba'>698</td>
+<td>LinearityUpperMargin</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='715 = 0x2cb'>715</td>
+<td>PerChannelBlackLevel</td>
+<td class=c>int16u[4]</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='719 = 0x2cf'>719</td>
+<td>NormalWhiteLevel
+  <br>PerChannelBlackLevel</td>
+<td class=c>int16u<br>int16u[4]</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='720 = 0x2d0'>720</td>
+<td>SpecularWhiteLevel</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='721 = 0x2d1'>721</td>
+<td>LinearityUpperMargin</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='723 = 0x2d3'>723</td>
+<td>NormalWhiteLevel</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='724 = 0x2d4'>724</td>
+<td>SpecularWhiteLevel</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='725 = 0x2d5'>725</td>
+<td>LinearityUpperMargin</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
 <h2><a name='ColorCoefs'>Canon ColorCoefs Tags</a></h2>
@@ -7171,7 +7357,7 @@ option is used.</p>
 </table></td></tr></table></blockquote>
 
 <h2><a name='ColorData6'>Canon ColorData6 Tags</a></h2>
-<p>These tags are used by the EOS 600D.</p>
+<p>These tags are used by the EOS 600D and 1200D.</p>
 <blockquote>
 <table class=frame><tr><td>
 <table class=inner cellspacing=1>
@@ -7181,7 +7367,7 @@ option is used.</p>
 <td class=r title='0 = 0x0'>0</td>
 <td>ColorDataVersion</td>
 <td class=c>int16s</td>
-<td><span class=s>10 = 10 (600D)</span></td></tr>
+<td><span class=s>10 = 10 (600D/1200D)</span></td></tr>
 <tr class=b>
 <td class=r title='63 = 0x3f'>63</td>
 <td>WB_RGGBLevelsAsShot</td>
@@ -7439,10 +7625,35 @@ option is used.</p>
 <td>--&gt; <a href='Canon.html#ColorCalib'>Canon ColorCalib Tags</a>
   <br><span class='n s'>(B, C, A, Temperature)</span></td></tr>
 <tr>
+<td class=r title='251 = 0xfb'>251</td>
+<td>AverageBlackLevel</td>
+<td class=c>int16u[4]</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td class=r title='404 = 0x194'>404</td>
 <td>RawMeasuredRGGB</td>
 <td class=c>int32u[4]</td>
 <td><span class=s><span class=n>(raw MeasuredRGGB values, before normalization)</span></span></td></tr>
+<tr>
+<td class=r title='479 = 0x1df'>479</td>
+<td>PerChannelBlackLevel</td>
+<td class=c>int16u[4]</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='483 = 0x1e3'>483</td>
+<td>NormalWhiteLevel</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='484 = 0x1e4'>484</td>
+<td>SpecularWhiteLevel</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='485 = 0x1e5'>485</td>
+<td>LinearityUpperMargin</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
 <h2><a name='ColorData7'>Canon ColorData7 Tags</a></h2>
@@ -7456,7 +7667,7 @@ option is used.</p>
 <td class=r title='0 = 0x0'>0</td>
 <td>ColorDataVersion</td>
 <td class=c>int16s</td>
-<td><span class=s>10 = 10 (1DX/5DmkIII/6D/100D/650D/700D/M)</span></td></tr>
+<td><span class=s>10 = 10 (1DX/5DmkIII/6D/70D/100D/650D/700D/M)</span></td></tr>
 <tr class=b>
 <td class=r title='63 = 0x3f'>63</td>
 <td>WB_RGGBLevelsAsShot</td>
@@ -7764,10 +7975,35 @@ option is used.</p>
 <td>--&gt; <a href='Canon.html#ColorCalib'>Canon ColorCalib Tags</a>
   <br><span class='n s'>(B, C, A, Temperature)</span></td></tr>
 <tr>
+<td class=r title='276 = 0x114'>276</td>
+<td>AverageBlackLevel</td>
+<td class=c>int16u[4]</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td class=r title='429 = 0x1ad'>429</td>
 <td>RawMeasuredRGGB</td>
 <td class=c>int32u[4]</td>
 <td><span class=s><span class=n>(raw MeasuredRGGB values, before normalization)</span></span></td></tr>
+<tr>
+<td class=r title='504 = 0x1f8'>504</td>
+<td>PerChannelBlackLevel</td>
+<td class=c>int16u[4]</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='508 = 0x1fc'>508</td>
+<td>NormalWhiteLevel</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='509 = 0x1fd'>509</td>
+<td>SpecularWhiteLevel</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='510 = 0x1fe'>510</td>
+<td>LinearityUpperMargin</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
 <h2><a name='ColorDataUnknown'>Canon ColorDataUnknown Tags</a></h2>
@@ -7955,22 +8191,22 @@ to the one printed on the lens)</span></span></td></tr>
 <td title='0x0101 = 257'>0x0101</td>
 <td>GrainyBWFilter</td>
 <td class=c>N</td>
-<td>&nbsp;</td></tr>
+<td><span class=s>-1 = Off</span></td></tr>
 <tr class=b>
 <td title='0x0201 = 513'>0x0201</td>
 <td>SoftFocusFilter</td>
 <td class=c>N</td>
-<td>&nbsp;</td></tr>
+<td><span class=s>-1 = Off</span></td></tr>
 <tr>
 <td title='0x0301 = 769'>0x0301</td>
 <td>ToyCameraFilter</td>
 <td class=c>N</td>
-<td>&nbsp;</td></tr>
+<td><span class=s>-1 = Off</span></td></tr>
 <tr class=b>
 <td title='0x0401 = 1025'>0x0401</td>
 <td>MiniatureFilter</td>
 <td class=c>N</td>
-<td>&nbsp;</td></tr>
+<td><span class=s>-1 = Off</span></td></tr>
 <tr>
 <td title='0x0402 = 1026'>0x0402</td>
 <td>MiniatureFilterOrientation</td>
@@ -7982,6 +8218,26 @@ to the one printed on the lens)</span></span></td></tr>
 <td>MiniatureFilterPosition</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
+<tr>
+<td title='0x0404 = 1028'>0x0404</td>
+<td>MiniatureFilterParameter</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x0501 = 1281'>0x0501</td>
+<td>FisheyeFilter</td>
+<td class=c>N</td>
+<td><span class=s>-1 = Off</span></td></tr>
+<tr>
+<td title='0x0601 = 1537'>0x0601</td>
+<td>PaintingFilter</td>
+<td class=c>N</td>
+<td><span class=s>-1 = Off</span></td></tr>
+<tr class=b>
+<td title='0x0701 = 1793'>0x0701</td>
+<td>WatercolorFilter</td>
+<td class=c>N</td>
+<td><span class=s>-1 = Off</span></td></tr>
 </table></td></tr></table></blockquote>
 
 <h2><a name='CNTH'>Canon CNTH Tags</a></h2>
@@ -7999,6 +8255,26 @@ cameras such as the PowerShot S95.</p>
 <td><span class=s><span class=n>(the full THM image, embedded metadata is extracted as the first sub-document)</span></span></td></tr>
 </table></td></tr></table></blockquote>
 
+<h2><a name='uuid'>Canon uuid Tags</a></h2>
+<p>Tags extracted from the uuid atom of MP4 videos from cameras such as the
+SX280.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td>'CNCV'</td>
+<td>CompressorVersion</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'CNTH'</td>
+<td>CanonCNTH</td>
+<td class=c>-</td>
+<td>--&gt; <a href='Canon.html#CNTH'>Canon CNTH Tags</a></td></tr>
+</table></td></tr></table></blockquote>
+
 <h2><a name='Skip'>Canon Skip Tags</a></h2>
 <p>Information found in the &quot;skip&quot; atom of Canon MOV videos.</p>
 <blockquote>
@@ -8015,7 +8291,7 @@ cameras such as the PowerShot S95.</p>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Apr 9, 2013</i>
+<br><i>Last revised Feb 18, 2014</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -10,9 +10,10 @@
 <p>
 The values of the composite tags are <b>Derived From</b> the values of other
 tags.  These are convenience tags which are calculated after all other
-information is extracted.  User-defined Composite tags, useful for
-custom-formatting of tag values, may created in the <a href="../config.html">ExifTool configuration
-file</a>.
+information is extracted.  Only a few of these tags are writable directly,
+the others are changed by writing the corresponding <b>Derived From</b> tags.
+User-defined Composite tags, useful for custom-formatting of tag values, may
+created in the <a href="../config.html">ExifTool configuration file</a>.
 </p>
 <blockquote>
 <table class=frame><tr><td>
@@ -22,7 +23,8 @@ file</a>.
 <tr>
 <td>AdvancedSceneMode</td>
 <td class=c>N</td>
-<td class=n>SceneMode
+<td class=n>Model
+  <br>SceneMode
   <br>AdvancedSceneType</td>
 <td>--&gt; <a href='Panasonic.html#AdvancedSceneMode'>Panasonic AdvancedSceneMode Values</a></td></tr>
 <tr class=b>
@@ -418,7 +420,8 @@ manual mode)</span>
   <br>MaxFocalLength
   <br>LensModel
   <br>LensFocalRange
-  <br>LensSpec</td>
+  <br>LensSpec
+  <br>LensType2</td>
 <td><span class=s><span class=n>(attempt to identify the actual lens from all lenses with a given LensType.
 Applies only to LensType values with a lookup table.  May be configured
 by adding user-defined lenses)</span></span></td></tr>
@@ -482,6 +485,11 @@ option may be used to extract information from these embedded images.)</span></s
   <br>OtherImageLength</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td>PeakSpectralSensitivity</td>
+<td class=c>N</td>
+<td class=n>FLIR:PlanckB</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td>PreviewImage</td>
 <td class=c>Y</td>
 <td class=n>PreviewImageStart
@@ -490,18 +498,18 @@ option may be used to extract information from these embedded images.)</span></s
   <br>PreviewImageStart (1)
   <br>PreviewImageLength (1)</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>PreviewImage</td>
 <td class=c>N</td>
 <td class=n>ScreenNail</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>PreviewImageSize</td>
 <td class=c>N</td>
 <td class=n>PreviewImageWidth
   <br>PreviewImageHeight</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>RedBalance</td>
 <td class=c>N</td>
 <td class=n>WB_RGGBLevels
@@ -516,19 +524,25 @@ option may be used to extract information from these embedded images.)</span></s
   <br>WBRedLevel
   <br>WBGreenLevel</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>RedEyeReduction</td>
 <td class=c>N</td>
 <td class=n>CanonFlashMode
   <br>FlashBits</td>
 <td><span class=s>0 = Off
   <br>1 = On</span></td></tr>
-<tr class=b>
+<tr>
 <td>Rotation</td>
 <td class=c>N</td>
 <td class=n>QuickTime:MatrixStructure
   <br>QuickTime:HandlerType</td>
 <td>&nbsp;</td></tr>
+<tr class=b>
+<td>RunTimeSincePowerUp</td>
+<td class=c>N</td>
+<td class=n>Apple:RunTimeValue
+  <br>Apple:RunTimeScale</td>
+<td>&nbsp;</td></tr>
 <tr>
 <td>ScaleFactor35efl</td>
 <td class=c>N</td>
@@ -653,7 +667,7 @@ resized)</span></span></td></tr>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Feb 27, 2013</i>
+<br><i>Last revised Jan 9, 2014</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -53,7 +53,8 @@ still proprietary) Adobe format.</p>
 <td>--&gt; <a href='MinoltaRaw.html'>MinoltaRaw Tags</a></td></tr>
 <tr>
 <td>'MakN'</td>
-<td>MakerNoteNikon
+<td>MakerNoteApple
+  <br>MakerNoteNikon
   <br>MakerNoteCanon
   <br>MakerNoteCasio
   <br>MakerNoteCasio2
@@ -80,6 +81,7 @@ still proprietary) Adobe format.</p>
   <br>MakerNoteKodak7
   <br>MakerNoteKodak8a
   <br>MakerNoteKodak8b
+  <br>MakerNoteKodak8c
   <br>MakerNoteKodak9
   <br>MakerNoteKodak10
   <br>MakerNoteKodakUnknown
@@ -120,13 +122,15 @@ still proprietary) Adobe format.</p>
   <br>MakerNoteSony2
   <br>MakerNoteSony3
   <br>MakerNoteSony4
+  <br>MakerNoteSony5
   <br>MakerNoteSonyEricsson
   <br>MakerNoteSonySRF
   <br>MakerNoteUnknownText
   <br>MakerNoteUnknownBinary
   <br>MakerNoteUnknown</td>
-<td class=c>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef</td>
-<td>--&gt; <a href='Nikon.html'>Nikon Tags</a>
+<td class=c>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef</td>
+<td>--&gt; <a href='Apple.html'>Apple Tags</a>
+  <br>--&gt; <a href='Nikon.html'>Nikon Tags</a>
   <br>--&gt; <a href='Canon.html'>Canon Tags</a>
   <br>--&gt; <a href='Casio.html'>Casio Tags</a>
   <br>--&gt; <a href='Casio.html#Type2'>Casio Type2 Tags</a>
@@ -153,6 +157,7 @@ still proprietary) Adobe format.</p>
   <br>--&gt; <a href='Kodak.html#Type7'>Kodak Type7 Tags</a>
   <br>--&gt; <a href='Kodak.html#Type8'>Kodak Type8 Tags</a>
   <br>--&gt; <a href='Kodak.html#Type8'>Kodak Type8 Tags</a>
+  <br>--&gt; <a href='Kodak.html#Type8'>Kodak Type8 Tags</a>
   <br>--&gt; <a href='Kodak.html#Type9'>Kodak Type9 Tags</a>
   <br>--&gt; <a href='Kodak.html#Type10'>Kodak Type10 Tags</a>
   <br>--&gt; <a href='Kodak.html#Unknown'>Kodak Unknown Tags</a>
@@ -183,7 +188,7 @@ still proprietary) Adobe format.</p>
   <br>--&gt; <a href='Ricoh.html'>Ricoh Tags</a>
   <br>--&gt; <a href='Ricoh.html#Text'>Ricoh Text Tags</a>
   <br><span class=n>(Samsung "STMN" maker notes without PreviewImage)</span>
-  <br>--&gt; <a href='Samsung.html#Type1'>Samsung Type1 Tags</a>
+  <br>--&gt; <a href='Samsung.html'>Samsung Tags</a>
   <br>--&gt; <a href='Samsung.html#Type2'>Samsung Type2 Tags</a>
   <br>--&gt; <a href='Sanyo.html'>Sanyo Tags</a>
   <br>--&gt; <a href='Sanyo.html'>Sanyo Tags</a>
@@ -192,6 +197,7 @@ still proprietary) Adobe format.</p>
   <br>--&gt; <a href='Sony.html'>Sony Tags</a>
   <br>--&gt; <a href='Olympus.html'>Olympus Tags</a>
   <br>--&gt; <a href='Olympus.html'>Olympus Tags</a>
+  <br>--&gt; <a href='Sony.html#PIC'>Sony PIC Tags</a>
   <br>--&gt; <a href='Sony.html'>Sony Tags</a>
   <br>--&gt; <a href='Sony.html#Ericsson'>Sony Ericsson Tags</a>
   <br>--&gt; <a href='Sony.html#SRF'>Sony SRF Tags</a>
@@ -267,7 +273,7 @@ information.</p>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Apr 1, 2013</i>
+<br><i>Last revised Feb 3, 2014</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -0,0 +1,190 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<title>DPX Tags</title>
+<link rel=stylesheet type='text/css' href='style.css' title='Style'>
+</head>
+<body>
+<h2 class=top>DPX Tags</h2>
+<p>Tags extracted from DPX (Digital Picture Exchange) images.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index1</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='0 = 0x0'>0</td>
+<td>ByteOrder</td>
+<td class=c>N</td>
+<td><span class=s>&#39;SDPX&#39; = Big-endian
+  <br>&#39;XPDS&#39; = Little-endian</span></td></tr>
+<tr class=b>
+<td class=r title='8 = 0x8'>8</td>
+<td>HeaderVersion</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='16 = 0x10'>16</td>
+<td>DPXFileSize</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='20 = 0x14'>20</td>
+<td>DittoKey</td>
+<td class=c>N</td>
+<td><span class=s>0 = Same
+  <br>1 = New</span></td></tr>
+<tr>
+<td class=r title='36 = 0x24'>36</td>
+<td>ImageFileName</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='136 = 0x88'>136</td>
+<td>CreateDate</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='160 = 0xa0'>160</td>
+<td>Creator</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='260 = 0x104'>260</td>
+<td>Project</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='460 = 0x1cc'>460</td>
+<td>Copyright</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='660 = 0x294'>660</td>
+<td>EncryptionKey</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='768 = 0x300'>768</td>
+<td>Orientation</td>
+<td class=c>N</td>
+<td><table class=cols><tr>
+  <td>0 = Horizontal (normal)
+  <br>1 = Mirror vertical
+  <br>2 = Mirror horizontal
+  <br>3 = Rotate 180
+  <br>4 = Mirror horizontal and rotate 270 CW
+  <br>5 = Rotate 90 CW
+  <br>6 = Rotate 270 CW
+  <br>7 = Mirror horizontal and rotate 90 CW</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr class=b>
+<td class=r title='770 = 0x302'>770</td>
+<td>ImageElements</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='772 = 0x304'>772</td>
+<td>ImageWidth</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='776 = 0x308'>776</td>
+<td>ImageHeight</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='780 = 0x30c'>780</td>
+<td>DataSign</td>
+<td class=c>N</td>
+<td><span class=s>0 = Unsigned
+  <br>1 = Signed</span></td></tr>
+<tr class=b>
+<td class=r title='803 = 0x323'>803</td>
+<td>BitDepth</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='820 = 0x334'>820</td>
+<td>ImageDescription</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='892 = 0x37c'>892</td>
+<td>Image2Description</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='964 = 0x3c4'>964</td>
+<td>Image3Description</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='1036 = 0x40c'>1036</td>
+<td>Image4Description</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='1108 = 0x454'>1108</td>
+<td>Image5Description</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='1180 = 0x49c'>1180</td>
+<td>Image6Description</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='1252 = 0x4e4'>1252</td>
+<td>Image7Description</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='1324 = 0x52c'>1324</td>
+<td>Image8Description</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='1432 = 0x598'>1432</td>
+<td>SourceFileName</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='1532 = 0x5fc'>1532</td>
+<td>SourceCreateDate</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='1556 = 0x614'>1556</td>
+<td>InputDeviceName</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='1588 = 0x634'>1588</td>
+<td>InputDeviceSerialNumber</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='1732 = 0x6c4'>1732</td>
+<td>FrameID</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='1764 = 0x6e4'>1764</td>
+<td>SlateInformation</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='2048 = 0x800'>2048</td>
+<td>UserID</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<hr>
+(This document generated automatically by Image::ExifTool::BuildTagLookup)
+<br><i>Last revised Sep 23, 2013</i>
+<p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
+</body>
+</html>
@@ -71,250 +71,258 @@
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationGeoreferencedBy)</span></span></td></tr>
 <tr>
+<td>DCGeoreferencedDate</td>
+<td class=c title=' _ = Flattened'>string_</td>
+<td><span class=s><span class=n>(dctermsLocationGeoreferencedDate)</span></span></td></tr>
+<tr class=b>
 <td>DCGeoreferenceProtocol</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationGeoreferenceProtocol)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>DCGeoreferenceRemarks</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationGeoreferenceRemarks)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>DCGeoreferenceSources</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationGeoreferenceSources)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>DCGeoreferenceVerificationStatus</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationGeoreferenceVerificationStatus)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>DCHigherGeography</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationHigherGeography)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>DCHigherGeographyID</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationHigherGeographyID)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>DCIsland</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationIsland)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>DCIslandGroup</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationIslandGroup)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>DCLocality</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationLocality)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>DCLocationAccordingTo</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationLocationAccordingTo)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>DCLocationID</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationLocationID)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>DCLocationRemarks</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationLocationRemarks)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>DCMaximumDepthInMeters</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationMaximumDepthInMeters)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>DCMaximumDistanceAboveSurfaceInMeters</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationMaximumDistanceAboveSurfaceInMeters)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>DCMaximumElevationInMeters</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationMaximumElevationInMeters)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>DCMinimumDepthInMeters</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationMinimumDepthInMeters)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>DCMinimumDistanceAboveSurfaceInMeters</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationMinimumDistanceAboveSurfaceInMeters)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>DCMinimumElevationInMeters</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationMinimumElevationInMeters)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>DCMunicipality</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationMunicipality)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>DCPointRadiusSpatialFit</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationPointRadiusSpatialFit)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>DCStateProvince</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationStateProvince)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>DCVerbatimCoordinates</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationVerbatimCoordinates)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>DCVerbatimCoordinateSystem</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationVerbatimCoordinateSystem)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>DCVerbatimDepth</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationVerbatimDepth)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>DCVerbatimElevation</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationVerbatimElevation)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>DCVerbatimLatitude</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationVerbatimLatitude)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>DCVerbatimLocality</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationVerbatimLocality)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>DCVerbatimLongitude</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationVerbatimLongitude)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>DCVerbatimSRS</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationVerbatimSRS)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>DCWaterBody</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(dctermsLocationWaterBody)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>DCEvent</td>
 <td class=c>struct</td>
 <td>--&gt; <a href='DarwinCore.html#Event'>DarwinCore Event Struct</a>
   <br><span class='n s'>(called Event by the spec)</span></td></tr>
-<tr class=b>
+<tr>
 <td>EventDay</td>
 <td class=c title=' _ = Flattened'>integer_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>EventEarliestDate</td>
 <td class=c title=' _ = Flattened'>date_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>EventEndDayOfYear</td>
 <td class=c title=' _ = Flattened'>integer_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>EventID</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(EventEventID)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>EventRemarks</td>
 <td class=c title=' _ = Flattened'>lang-alt_</td>
 <td><span class=s><span class=n>(EventEventRemarks)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>EventTime</td>
 <td class=c title=' _ = Flattened'>date_</td>
 <td><span class=s><span class=n>(EventEventTime)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>EventFieldNotes</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>EventFieldNumber</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>EventHabitat</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>EventLatestDate</td>
 <td class=c title=' _ = Flattened'>date_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>EventMonth</td>
 <td class=c title=' _ = Flattened'>integer_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>EventSamplingEffort</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>EventSamplingProtocol</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>EventStartDayOfYear</td>
 <td class=c title=' _ = Flattened'>integer_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>EventVerbatimEventDate</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>EventYear</td>
 <td class=c title=' _ = Flattened'>integer_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>GeologicalContext</td>
 <td class=c>struct</td>
 <td>--&gt; <a href='DarwinCore.html#GeologicalContext'>DarwinCore GeologicalContext Struct</a></td></tr>
-<tr>
+<tr class=b>
 <td>GeologicalContextBed</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>EarliestAgeOrLowestStage</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(GeologicalContextEarliestAgeOrLowestStage)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>EarliestEonOrLowestEonothem</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(GeologicalContextEarliestEonOrLowestEonothem)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>EarliestEpochOrLowestSeries</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(GeologicalContextEarliestEpochOrLowestSeries)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>EarliestEraOrLowestErathem</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(GeologicalContextEarliestEraOrLowestErathem)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>EarliestPeriodOrLowestSystem</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(GeologicalContextEarliestPeriodOrLowestSystem)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>GeologicalContextFormation</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>GeologicalContextID</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(GeologicalContextGeologicalContextID)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>GeologicalContextGroup</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>HighestBiostratigraphicZone</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(GeologicalContextHighestBiostratigraphicZone)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>LatestAgeOrHighestStage</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(GeologicalContextLatestAgeOrHighestStage)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>LatestEonOrHighestEonothem</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(GeologicalContextLatestEonOrHighestEonothem)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>LatestEpochOrHighestSeries</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(GeologicalContextLatestEpochOrHighestSeries)</span></span></td></tr>
+<tr>
+<td>LatestEraOrHighestErathem</td>
+<td class=c title=' _ = Flattened'>string_</td>
+<td><span class=s><span class=n>(GeologicalContextLatestEraOrHighestErathem)</span></span></td></tr>
 <tr class=b>
 <td>LatestPeriodOrHighestSystem</td>
 <td class=c title=' _ = Flattened'>string_</td>
@@ -356,281 +364,289 @@
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(IdentificationIdentificationRemarks)</span></span></td></tr>
 <tr class=b>
+<td>IdentificationVerificationStatus</td>
+<td class=c title=' _ = Flattened'>string_</td>
+<td><span class=s><span class=n>(IdentificationIdentificationVerificationStatus)</span></span></td></tr>
+<tr>
 <td>IdentifiedBy</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(IdentificationIdentifiedBy)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>TypeStatus</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(IdentificationTypeStatus)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>MeasurementOrFact</td>
 <td class=c>struct</td>
 <td>--&gt; <a href='DarwinCore.html#MeasurementOrFact'>DarwinCore MeasurementOrFact Struct</a></td></tr>
-<tr>
+<tr class=b>
 <td>MeasurementAccuracy</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(MeasurementOrFactMeasurementAccuracy)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>MeasurementDeterminedBy</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(MeasurementOrFactMeasurementDeterminedBy)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>MeasurementDeterminedDate</td>
 <td class=c title=' _ = Flattened'>date_</td>
 <td><span class=s><span class=n>(MeasurementOrFactMeasurementDeterminedDate)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>MeasurementID</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(MeasurementOrFactMeasurementID)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>MeasurementMethod</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(MeasurementOrFactMeasurementMethod)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>MeasurementRemarks</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(MeasurementOrFactMeasurementRemarks)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>MeasurementType</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(MeasurementOrFactMeasurementType)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>MeasurementUnit</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(MeasurementOrFactMeasurementUnit)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>MeasurementValue</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(MeasurementOrFactMeasurementValue)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>Occurrence</td>
 <td class=c>struct</td>
 <td>--&gt; <a href='DarwinCore.html#Occurrence'>DarwinCore Occurrence Struct</a></td></tr>
-<tr>
+<tr class=b>
 <td>OccurrenceAssociatedMedia</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>OccurrenceAssociatedOccurrences</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>OccurrenceAssociatedReferences</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>OccurrenceAssociatedSequences</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>OccurrenceAssociatedTaxa</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>OccurrenceBehavior</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>OccurrenceCatalogNumber</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>OccurrenceDisposition</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>OccurrenceEstablishmentMeans</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>OccurrenceIndividualCount</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>OccurrenceIndividualID</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>OccurrenceLifeStage</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>OccurrenceDetails</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(OccurrenceOccurrenceDetails)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>OccurrenceID</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(OccurrenceOccurrenceID)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>OccurrenceRemarks</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(OccurrenceOccurrenceRemarks)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>OccurrenceStatus</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(OccurrenceOccurrenceStatus)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>OccurrenceOtherCatalogNumbers</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>OccurrencePreparations</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>OccurrencePreviousIdentifications</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>OccurrenceRecordedBy</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>OccurrenceRecordNumber</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>OccurrenceReproductiveCondition</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>OccurrenceSex</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>Record</td>
 <td class=c>struct</td>
 <td>--&gt; <a href='DarwinCore.html#Record'>DarwinCore Record Struct</a></td></tr>
-<tr>
+<tr class=b>
 <td>RecordBasisOfRecord</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>RecordCollectionCode</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>RecordCollectionID</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>RecordDataGeneralizations</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>RecordDatasetID</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>RecordDatasetName</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>RecordDynamicProperties</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>RecordInformationWithheld</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>RecordInstitutionCode</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>RecordInstitutionID</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>RecordOwnerInstitutionCode</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>ResourceRelationship</td>
 <td class=c>struct</td>
 <td>--&gt; <a href='DarwinCore.html#ResourceRelationship'>DarwinCore ResourceRelationship Struct</a></td></tr>
-<tr>
+<tr class=b>
 <td>RelatedResourceID</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(ResourceRelationshipRelatedResourceID)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>RelationshipAccordingTo</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(ResourceRelationshipRelationshipAccordingTo)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>RelationshipEstablishedDate</td>
 <td class=c title=' _ = Flattened'>date_</td>
 <td><span class=s><span class=n>(ResourceRelationshipRelationshipEstablishedDate)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>RelationshipOfResource</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(ResourceRelationshipRelationshipOfResource)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>RelationshipRemarks</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(ResourceRelationshipRelationshipRemarks)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>ResourceID</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(ResourceRelationshipResourceID)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>ResourceRelationshipID</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(ResourceRelationshipResourceRelationshipID)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>Taxon</td>
 <td class=c>struct</td>
 <td>--&gt; <a href='DarwinCore.html#Taxon'>DarwinCore Taxon Struct</a></td></tr>
-<tr>
+<tr class=b>
 <td>TaxonAcceptedNameUsage</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>TaxonAcceptedNameUsageID</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>TaxonClass</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>TaxonFamily</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>TaxonGenus</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>TaxonHigherClassification</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>TaxonInfraspecificEpithet</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>TaxonKingdom</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>TaxonNameAccordingTo</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>TaxonNameAccordingToID</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>TaxonNamePublishedIn</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>TaxonNamePublishedInID</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
+<tr class=b>
+<td>TaxonNamePublishedInYear</td>
+<td class=c title=' _ = Flattened'>string_</td>
+<td>&nbsp;</td></tr>
 <tr>
 <td>TaxonNomenclaturalCode</td>
 <td class=c title=' _ = Flattened'>string_</td>
@@ -648,62 +664,66 @@
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td>TaxonParentNameUsage</td>
+<td>TaxonOriginalNameUsageID</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>TaxonParentNameUsageID</td>
+<td>TaxonParentNameUsage</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td>TaxonPhylum</td>
+<td>TaxonParentNameUsageID</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>TaxonScientificName</td>
+<td>TaxonPhylum</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td>TaxonScientificNameAuthorship</td>
+<td>TaxonScientificName</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>TaxonScientificNameID</td>
+<td>TaxonScientificNameAuthorship</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td>TaxonSpecificEpithet</td>
+<td>TaxonScientificNameID</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>TaxonSubgenus</td>
+<td>TaxonSpecificEpithet</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td>TaxonSubgenus</td>
+<td class=c title=' _ = Flattened'>string_</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td>TaxonConceptID</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(TaxonTaxonConceptID)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>TaxonID</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(TaxonTaxonID)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>TaxonTaxonomicStatus</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>TaxonRank</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(TaxonTaxonRank)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>TaxonRemarks</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(TaxonTaxonRemarks)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>TaxonVerbatimTaxonRank</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>TaxonVernacularName</td>
 <td class=c title=' _ = Flattened'>lang-alt_</td>
 <td>&nbsp;</td></tr>
@@ -784,106 +804,110 @@
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>HigherGeography</td>
+<td>GeoreferencedDate</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td>HigherGeographyID</td>
+<td>HigherGeography</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>Island</td>
+<td>HigherGeographyID</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td>IslandGroup</td>
+<td>Island</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>Locality</td>
+<td>IslandGroup</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td>LocationAccordingTo</td>
+<td>Locality</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>LocationID</td>
+<td>LocationAccordingTo</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td>LocationRemarks</td>
+<td>LocationID</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>MaximumDepthInMeters</td>
+<td>LocationRemarks</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td>MaximumDistanceAboveSurfaceInMeters</td>
+<td>MaximumDepthInMeters</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>MaximumElevationInMeters</td>
+<td>MaximumDistanceAboveSurfaceInMeters</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td>MinimumDepthInMeters</td>
+<td>MaximumElevationInMeters</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>MinimumDistanceAboveSurfaceInMeters</td>
+<td>MinimumDepthInMeters</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td>MinimumElevationInMeters</td>
+<td>MinimumDistanceAboveSurfaceInMeters</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>Municipality</td>
+<td>MinimumElevationInMeters</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td>PointRadiusSpatialFit</td>
+<td>Municipality</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>StateProvince</td>
+<td>PointRadiusSpatialFit</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td>VerbatimCoordinateSystem</td>
+<td>StateProvince</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>VerbatimCoordinates</td>
+<td>VerbatimCoordinateSystem</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td>VerbatimDepth</td>
+<td>VerbatimCoordinates</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>VerbatimElevation</td>
+<td>VerbatimDepth</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td>VerbatimLatitude</td>
+<td>VerbatimElevation</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>VerbatimLocality</td>
+<td>VerbatimLatitude</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td>VerbatimLongitude</td>
+<td>VerbatimLocality</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>VerbatimSRS</td>
+<td>VerbatimLongitude</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td>VerbatimSRS</td>
+<td class=c>string</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td>WaterBody</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
@@ -1020,18 +1044,22 @@
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>LatestPeriodOrHighestSystem</td>
+<td>LatestEraOrHighestErathem</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td>LithostratigraphicTerms</td>
+<td>LatestPeriodOrHighestSystem</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>LowestBiostratigraphicZone</td>
+<td>LithostratigraphicTerms</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td>LowestBiostratigraphicZone</td>
+<td class=c>string</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td>Member</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
@@ -1064,10 +1092,14 @@
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>IdentifiedBy</td>
+<td>IdentificationVerificationStatus</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td>IdentifiedBy</td>
+<td class=c>string</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td>TypeStatus</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
@@ -1360,21 +1392,29 @@
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td>NomenclaturalCode</td>
+<td>NamePublishedInYear</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>NomenclaturalStatus</td>
+<td>NomenclaturalCode</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td>Order</td>
+<td>NomenclaturalStatus</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
+<td>Order</td>
+<td class=c>string</td>
+<td>&nbsp;</td></tr>
+<tr>
 <td>OriginalNameUsage</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
+<tr class=b>
+<td>OriginalNameUsageID</td>
+<td class=c>string</td>
+<td>&nbsp;</td></tr>
 <tr>
 <td>ParentNameUsage</td>
 <td class=c>string</td>
@@ -1439,7 +1479,7 @@
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Jan 30, 2013</i>
+<br><i>Last revised Jan 23, 2014</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -7,7 +7,8 @@
 </head>
 <body>
 <h2 class=top>DjVu Tags</h2>
-<p>Information is extracted from the following chunks in DjVu images.</p>
+<p>Information is extracted from the following chunks in DjVu images. See
+<a href="http://www.djvu.org/">http://www.djvu.org/</a> for the DjVu specification.</p>
 <blockquote>
 <table class=frame><tr><td>
 <table class=inner cellspacing=1>
@@ -306,7 +307,7 @@ PDF DocInfo tags (capitalized Tag ID&#39;s).</p>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Jan 3, 2012</i>
+<br><i>Last revised Jun 22, 2013</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -23,8 +23,8 @@ other tags which are not part of the EXIF specification, but may co-exist
 with EXIF tags in some images.  Tags which are part of the EXIF 2.3
 specification have an underlined <b>Tag Name</b> in the HTML version of this
 documentation.  See
-<a href="http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-008-2012_E.pdf">http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-008-2012_E.pdf</a> for the
-official EXIF 2.3 specification.
+<a href="http://www.cipa.jp/std/documents/e/DC-008-2012_E.pdf">http://www.cipa.jp/std/documents/e/DC-008-2012_E.pdf</a> for the official
+EXIF 2.3 specification.
 </p>
 <blockquote>
 <table class=frame><tr><td>
@@ -1256,20 +1256,22 @@ newline in ExifTool)</span></span></td></tr>
 <tr>
 <td title='0x87af = 34735'>0x87af</td>
 <td>GeoTiffDirectory</td>
-<td class=c>N</td>
-<td class=c>-</td>
-<td>&nbsp;</td></tr>
+<td class=c>undef</td>
+<td class=c>IFD0</td>
+<td><span class=s><span class=n>(these &quot;GeoTiff&quot; tags may read and written as a block, but they aren&#39;t
+extracted unless specifically requested.  Byte order changes are handled
+automatically when copying between TIFF images with different byte order)</span></span></td></tr>
 <tr class=b>
 <td title='0x87b0 = 34736'>0x87b0</td>
 <td>GeoTiffDoubleParams</td>
-<td class=c>N</td>
-<td class=c>-</td>
+<td class=c>undef</td>
+<td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
 <tr>
 <td title='0x87b1 = 34737'>0x87b1</td>
 <td>GeoTiffAsciiParams</td>
-<td class=c>N</td>
-<td class=c>-</td>
+<td class=c>string</td>
+<td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
 <td title='0x8822 = 34850'>0x8822</td>
@@ -1629,7 +1631,8 @@ hours, 2. If present, the time zone offset of ModifyDate)</span></span></td></tr
 <td>&nbsp;</td></tr>
 <tr class=b>
 <td title='0x927c = 37500'>0x927c</td>
-<td>MakerNoteNikon
+<td>MakerNoteApple
+  <br>MakerNoteNikon
   <br>MakerNoteCanon
   <br>MakerNoteCasio
   <br>MakerNoteCasio2
@@ -1656,6 +1659,7 @@ hours, 2. If present, the time zone offset of ModifyDate)</span></span></td></tr
   <br>MakerNoteKodak7
   <br>MakerNoteKodak8a
   <br>MakerNoteKodak8b
+  <br>MakerNoteKodak8c
   <br>MakerNoteKodak9
   <br>MakerNoteKodak10
   <br>MakerNoteKodakUnknown
@@ -1696,14 +1700,16 @@ hours, 2. If present, the time zone offset of ModifyDate)</span></span></td></tr
   <br>MakerNoteSony2
   <br>MakerNoteSony3
   <br>MakerNoteSony4
+  <br>MakerNoteSony5
   <br>MakerNoteSonyEricsson
   <br>MakerNoteSonySRF
   <br>MakerNoteUnknownText
   <br>MakerNoteUnknownBinary
   <br><u>MakerNoteUnknown</u></td>
-<td class=c>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef</td>
-<td class=c>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD</td>
-<td>--&gt; <a href='Nikon.html'>Nikon Tags</a>
+<td class=c>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef<br>undef</td>
+<td class=c>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD<br>ExifIFD</td>
+<td>--&gt; <a href='Apple.html'>Apple Tags</a>
+  <br>--&gt; <a href='Nikon.html'>Nikon Tags</a>
   <br>--&gt; <a href='Canon.html'>Canon Tags</a>
   <br>--&gt; <a href='Casio.html'>Casio Tags</a>
   <br>--&gt; <a href='Casio.html#Type2'>Casio Type2 Tags</a>
@@ -1730,6 +1736,7 @@ hours, 2. If present, the time zone offset of ModifyDate)</span></span></td></tr
   <br>--&gt; <a href='Kodak.html#Type7'>Kodak Type7 Tags</a>
   <br>--&gt; <a href='Kodak.html#Type8'>Kodak Type8 Tags</a>
   <br>--&gt; <a href='Kodak.html#Type8'>Kodak Type8 Tags</a>
+  <br>--&gt; <a href='Kodak.html#Type8'>Kodak Type8 Tags</a>
   <br>--&gt; <a href='Kodak.html#Type9'>Kodak Type9 Tags</a>
   <br>--&gt; <a href='Kodak.html#Type10'>Kodak Type10 Tags</a>
   <br>--&gt; <a href='Kodak.html#Unknown'>Kodak Unknown Tags</a>
@@ -1760,7 +1767,7 @@ hours, 2. If present, the time zone offset of ModifyDate)</span></span></td></tr
   <br>--&gt; <a href='Ricoh.html'>Ricoh Tags</a>
   <br>--&gt; <a href='Ricoh.html#Text'>Ricoh Text Tags</a>
   <br><span class=n>(Samsung "STMN" maker notes without PreviewImage)</span>
-  <br>--&gt; <a href='Samsung.html#Type1'>Samsung Type1 Tags</a>
+  <br>--&gt; <a href='Samsung.html'>Samsung Tags</a>
   <br>--&gt; <a href='Samsung.html#Type2'>Samsung Type2 Tags</a>
   <br>--&gt; <a href='Sanyo.html'>Sanyo Tags</a>
   <br>--&gt; <a href='Sanyo.html'>Sanyo Tags</a>
@@ -1769,6 +1776,7 @@ hours, 2. If present, the time zone offset of ModifyDate)</span></span></td></tr
   <br>--&gt; <a href='Sony.html'>Sony Tags</a>
   <br>--&gt; <a href='Olympus.html'>Olympus Tags</a>
   <br>--&gt; <a href='Olympus.html'>Olympus Tags</a>
+  <br>--&gt; <a href='Sony.html#PIC'>Sony PIC Tags</a>
   <br>--&gt; <a href='Sony.html'>Sony Tags</a>
   <br>--&gt; <a href='Sony.html#Ericsson'>Sony Ericsson Tags</a>
   <br>--&gt; <a href='Sony.html#SRF'>Sony SRF Tags</a>
@@ -2397,6 +2405,12 @@ unnecessary clutter)</span></span><table class=cols><tr>
 <td class=c>IFD0</td>
 <td>--&gt; <a href='PrintIM.html'>PrintIM Tags</a></td></tr>
 <tr class=b>
+<td title='0xc573 = 50547'>0xc573</td>
+<td>OriginalFileName</td>
+<td class=c>N</td>
+<td class=c>-</td>
+<td><span class=s><span class=n>(used by some obscure software)</span></span></td></tr>
+<tr>
 <td title='0xc580 = 50560'>0xc580</td>
 <td>USPTOOriginalContentType</td>
 <td class=c>N</td>
@@ -2404,37 +2418,37 @@ unnecessary clutter)</span></span><table class=cols><tr>
 <td><span class=s>0 = Text or Drawing
   <br>1 = Grayscale
   <br>2 = Color</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0xc612 = 50706'>0xc612</td>
 <td>DNGVersion</td>
 <td class=c title=' ! = Unsafe'>int8u[4]!</td>
 <td class=c>IFD0</td>
 <td><span class=s><span class=n>(tags 0xc612-0xc7b5 are used in DNG images unless otherwise noted)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td title='0xc613 = 50707'>0xc613</td>
 <td>DNGBackwardVersion</td>
 <td class=c title=' ! = Unsafe'>int8u[4]!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc614 = 50708'>0xc614</td>
 <td>UniqueCameraModel</td>
 <td class=c>string</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc615 = 50709'>0xc615</td>
 <td>LocalizedCameraModel</td>
 <td class=c>string</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc616 = 50710'>0xc616</td>
 <td>CFAPlaneColor</td>
 <td class=c>N</td>
 <td class=c>-</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc617 = 50711'>0xc617</td>
 <td>CFALayout</td>
 <td class=c>N</td>
@@ -2448,356 +2462,358 @@ unnecessary clutter)</span></span><table class=cols><tr>
   <br>7 = Even rows offset up by 1/2 row, even columns offset right by 1/2 column
   <br>8 = Even rows offset down by 1/2 row, even columns offset left by 1/2 column
   <br>9 = Even rows offset down by 1/2 row, even columns offset right by 1/2 column</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0xc618 = 50712'>0xc618</td>
 <td>LinearizationTable</td>
 <td class=c title=' ! = Unsafe'>int16u[n]!</td>
 <td class=c>SubIFD</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc619 = 50713'>0xc619</td>
 <td>BlackLevelRepeatDim</td>
 <td class=c title=' ! = Unsafe'>int16u[2]!</td>
 <td class=c>SubIFD</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc61a = 50714'>0xc61a</td>
 <td>BlackLevel</td>
 <td class=c title=' ! = Unsafe'>rational64u[n]!</td>
 <td class=c>SubIFD</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc61b = 50715'>0xc61b</td>
 <td>BlackLevelDeltaH</td>
 <td class=c title=' ! = Unsafe'>rational64s[n]!</td>
 <td class=c>SubIFD</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc61c = 50716'>0xc61c</td>
 <td>BlackLevelDeltaV</td>
 <td class=c title=' ! = Unsafe'>rational64s[n]!</td>
 <td class=c>SubIFD</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc61d = 50717'>0xc61d</td>
 <td>WhiteLevel</td>
 <td class=c title=' ! = Unsafe'>int32u[n]!</td>
 <td class=c>SubIFD</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc61e = 50718'>0xc61e</td>
 <td>DefaultScale</td>
 <td class=c title=' ! = Unsafe'>rational64u[2]!</td>
 <td class=c>SubIFD</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc61f = 50719'>0xc61f</td>
 <td>DefaultCropOrigin</td>
 <td class=c title=' ! = Unsafe'>int32u[2]!</td>
 <td class=c>SubIFD</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc620 = 50720'>0xc620</td>
 <td>DefaultCropSize</td>
 <td class=c title=' ! = Unsafe'>int32u[2]!</td>
 <td class=c>SubIFD</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc621 = 50721'>0xc621</td>
 <td>ColorMatrix1</td>
 <td class=c title=' ! = Unsafe'>rational64s[n]!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc622 = 50722'>0xc622</td>
 <td>ColorMatrix2</td>
 <td class=c title=' ! = Unsafe'>rational64s[n]!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc623 = 50723'>0xc623</td>
 <td>CameraCalibration1</td>
 <td class=c title=' ! = Unsafe'>rational64s[n]!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc624 = 50724'>0xc624</td>
 <td>CameraCalibration2</td>
 <td class=c title=' ! = Unsafe'>rational64s[n]!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc625 = 50725'>0xc625</td>
 <td>ReductionMatrix1</td>
 <td class=c title=' ! = Unsafe'>rational64s[n]!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc626 = 50726'>0xc626</td>
 <td>ReductionMatrix2</td>
 <td class=c title=' ! = Unsafe'>rational64s[n]!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc627 = 50727'>0xc627</td>
 <td>AnalogBalance</td>
 <td class=c title=' ! = Unsafe'>rational64u[n]!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc628 = 50728'>0xc628</td>
 <td>AsShotNeutral</td>
 <td class=c title=' ! = Unsafe'>rational64u[n]!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc629 = 50729'>0xc629</td>
 <td>AsShotWhiteXY</td>
 <td class=c title=' ! = Unsafe'>rational64u[2]!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc62a = 50730'>0xc62a</td>
 <td>BaselineExposure</td>
 <td class=c title=' ! = Unsafe'>rational64s!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc62b = 50731'>0xc62b</td>
 <td>BaselineNoise</td>
 <td class=c title=' ! = Unsafe'>rational64u!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc62c = 50732'>0xc62c</td>
 <td>BaselineSharpness</td>
 <td class=c title=' ! = Unsafe'>rational64u!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc62d = 50733'>0xc62d</td>
 <td>BayerGreenSplit</td>
 <td class=c title=' ! = Unsafe'>int32u!</td>
 <td class=c>SubIFD</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc62e = 50734'>0xc62e</td>
 <td>LinearResponseLimit</td>
 <td class=c title=' ! = Unsafe'>rational64u!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc62f = 50735'>0xc62f</td>
 <td>CameraSerialNumber</td>
 <td class=c>string</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc630 = 50736'>0xc630</td>
 <td>DNGLensInfo</td>
 <td class=c>rational64u[4]</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc631 = 50737'>0xc631</td>
 <td>ChromaBlurRadius</td>
 <td class=c title=' ! = Unsafe'>rational64u!</td>
 <td class=c>SubIFD</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc632 = 50738'>0xc632</td>
 <td>AntiAliasStrength</td>
 <td class=c title=' ! = Unsafe'>rational64u!</td>
 <td class=c>SubIFD</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc633 = 50739'>0xc633</td>
 <td>ShadowScale</td>
 <td class=c title=' ! = Unsafe'>rational64u!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc634 = 50740'>0xc634</td>
 <td>SR2Private
   <br>DNGAdobeData
   <br>MakerNotePentax
+  <br>MakerNotePentax5
   <br>DNGPrivateData</td>
-<td class=c>-<br>-<br>-<br>N</td>
-<td class=c>-<br>-<br>-<br>-</td>
+<td class=c title=' ! = Unsafe'>-<br>undef!<br>-<br>-<br>undef!</td>
+<td class=c>-<br>IFD0<br>-<br>-<br>IFD0</td>
 <td>--&gt; <a href='Sony.html#SR2Private'>Sony SR2Private Tags</a>
   <br>--&gt; <a href='DNG.html#AdobeData'>DNG AdobeData Tags</a>
+  <br>--&gt; <a href='Pentax.html'>Pentax Tags</a>
   <br>--&gt; <a href='Pentax.html'>Pentax Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0xc635 = 50741'>0xc635</td>
 <td>MakerNoteSafety</td>
 <td class=c>int16u</td>
 <td class=c>IFD0</td>
 <td><span class=s>0 = Unsafe
   <br>1 = Safe</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0xc640 = 50752'>0xc640</td>
 <td>RawImageSegmentation</td>
 <td class=c>N</td>
 <td class=c>-</td>
 <td><span class=s><span class=n>(used in segmented Canon CR2 images.  3 numbers: 1. Number of segments minus
 one; 2. Pixel width of segments except last; 3. Pixel width of last segment)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td title='0xc65a = 50778'>0xc65a</td>
 <td>CalibrationIlluminant1</td>
 <td class=c title=' ! = Unsafe'>int16u!</td>
 <td class=c>IFD0</td>
 <td>--&gt; <a href='EXIF.html#LightSource'>EXIF LightSource Values</a></td></tr>
-<tr>
+<tr class=b>
 <td title='0xc65b = 50779'>0xc65b</td>
 <td>CalibrationIlluminant2</td>
 <td class=c title=' ! = Unsafe'>int16u!</td>
 <td class=c>IFD0</td>
 <td>--&gt; <a href='EXIF.html#LightSource'>EXIF LightSource Values</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0xc65c = 50780'>0xc65c</td>
 <td>BestQualityScale</td>
 <td class=c title=' ! = Unsafe'>rational64u!</td>
 <td class=c>SubIFD</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc65d = 50781'>0xc65d</td>
 <td>RawDataUniqueID</td>
 <td class=c title=' ! = Unsafe'>int8u[16]!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc660 = 50784'>0xc660</td>
 <td>AliasLayerMetadata</td>
 <td class=c>N</td>
 <td class=c>-</td>
 <td><span class=s><span class=n>(used by Alias Sketchbook Pro)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td title='0xc68b = 50827'>0xc68b</td>
 <td>OriginalRawFileName</td>
 <td class=c title=' ! = Unsafe'>string!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc68c = 50828'>0xc68c</td>
 <td>OriginalRawFileData</td>
 <td class=c title=' ! = Unsafe'>undef!</td>
 <td class=c>IFD0</td>
 <td>--&gt; <a href='DNG.html#OriginalRaw'>DNG OriginalRaw Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td title='0xc68d = 50829'>0xc68d</td>
 <td>ActiveArea</td>
 <td class=c title=' ! = Unsafe'>int32u[4]!</td>
 <td class=c>SubIFD</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc68e = 50830'>0xc68e</td>
 <td>MaskedAreas</td>
 <td class=c title=' ! = Unsafe'>int32u[4]!</td>
 <td class=c>SubIFD</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc68f = 50831'>0xc68f</td>
 <td>AsShotICCProfile</td>
 <td class=c title=' ! = Unsafe'>undef!</td>
 <td class=c>IFD0</td>
 <td>--&gt; <a href='ICC_Profile.html'>ICC_Profile Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0xc690 = 50832'>0xc690</td>
 <td>AsShotPreProfileMatrix</td>
 <td class=c title=' ! = Unsafe'>rational64s[n]!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc691 = 50833'>0xc691</td>
 <td>CurrentICCProfile</td>
 <td class=c title=' ! = Unsafe'>undef!</td>
 <td class=c>IFD0</td>
 <td>--&gt; <a href='ICC_Profile.html'>ICC_Profile Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0xc692 = 50834'>0xc692</td>
 <td>CurrentPreProfileMatrix</td>
 <td class=c title=' ! = Unsafe'>rational64s[n]!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc6bf = 50879'>0xc6bf</td>
 <td>ColorimetricReference</td>
 <td class=c title=' ! = Unsafe'>int16u!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc6d2 = 50898'>0xc6d2</td>
 <td>PanasonicTitle</td>
 <td class=c>undef</td>
 <td class=c>IFD0</td>
 <td><span class=s><span class=n>(proprietary Panasonic tag used for baby/pet name, etc)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td title='0xc6d3 = 50899'>0xc6d3</td>
 <td>PanasonicTitle2</td>
 <td class=c>undef</td>
 <td class=c>IFD0</td>
 <td><span class=s><span class=n>(proprietary Panasonic tag used for baby/pet name with age)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td title='0xc6f3 = 50931'>0xc6f3</td>
 <td>CameraCalibrationSig</td>
 <td class=c title=' ! = Unsafe'>string!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc6f4 = 50932'>0xc6f4</td>
 <td>ProfileCalibrationSig</td>
 <td class=c title=' ! = Unsafe'>string!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc6f5 = 50933'>0xc6f5</td>
 <td>ProfileIFD</td>
 <td class=c>-</td>
 <td class=c>-</td>
 <td>--&gt; <a href='EXIF.html'>EXIF Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td title='0xc6f6 = 50934'>0xc6f6</td>
 <td>AsShotProfileName</td>
 <td class=c title=' ! = Unsafe'>string!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc6f7 = 50935'>0xc6f7</td>
 <td>NoiseReductionApplied</td>
 <td class=c title=' ! = Unsafe'>rational64u!</td>
 <td class=c>SubIFD</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc6f8 = 50936'>0xc6f8</td>
 <td>ProfileName</td>
 <td class=c title=' ! = Unsafe'>string!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc6f9 = 50937'>0xc6f9</td>
 <td>ProfileHueSatMapDims</td>
 <td class=c title=' ! = Unsafe'>int32u[3]!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc6fa = 50938'>0xc6fa</td>
 <td>ProfileHueSatMapData1</td>
 <td class=c title=' ! = Unsafe'>float[n]!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc6fb = 50939'>0xc6fb</td>
 <td>ProfileHueSatMapData2</td>
 <td class=c title=' ! = Unsafe'>float[n]!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc6fc = 50940'>0xc6fc</td>
 <td>ProfileToneCurve</td>
 <td class=c title=' ! = Unsafe'>float[n]!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc6fd = 50941'>0xc6fd</td>
 <td>ProfileEmbedPolicy</td>
 <td class=c title=' ! = Unsafe'>int32u!</td>
@@ -2806,49 +2822,49 @@ one; 2. Pixel width of segments except last; 3. Pixel width of last segment)</sp
   <br>1 = Embed if Used
   <br>2 = Never Embed
   <br>3 = No Restrictions</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0xc6fe = 50942'>0xc6fe</td>
 <td>ProfileCopyright</td>
 <td class=c title=' ! = Unsafe'>string!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc714 = 50964'>0xc714</td>
 <td>ForwardMatrix1</td>
 <td class=c title=' ! = Unsafe'>rational64s[n]!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc715 = 50965'>0xc715</td>
 <td>ForwardMatrix2</td>
 <td class=c title=' ! = Unsafe'>rational64s[n]!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc716 = 50966'>0xc716</td>
 <td>PreviewApplicationName</td>
 <td class=c title=' ! = Unsafe'>string!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc717 = 50967'>0xc717</td>
 <td>PreviewApplicationVersion</td>
 <td class=c title=' ! = Unsafe'>string!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc718 = 50968'>0xc718</td>
 <td>PreviewSettingsName</td>
 <td class=c title=' ! = Unsafe'>string!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc719 = 50969'>0xc719</td>
 <td>PreviewSettingsDigest</td>
 <td class=c title=' ! = Unsafe'>int8u!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc71a = 50970'>0xc71a</td>
 <td>PreviewColorSpace</td>
 <td class=c title=' ! = Unsafe'>int32u!</td>
@@ -2858,178 +2874,178 @@ one; 2. Pixel width of segments except last; 3. Pixel width of last segment)</sp
   <br>2 = sRGB
   <br>3 = Adobe RGB
   <br>4 = ProPhoto RGB</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0xc71b = 50971'>0xc71b</td>
 <td>PreviewDateTime</td>
 <td class=c title=' ! = Unsafe'>string!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc71c = 50972'>0xc71c</td>
 <td>RawImageDigest</td>
 <td class=c title=' ! = Unsafe'>int8u[16]!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc71d = 50973'>0xc71d</td>
 <td>OriginalRawFileDigest</td>
 <td class=c title=' ! = Unsafe'>int8u[16]!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc71e = 50974'>0xc71e</td>
 <td>SubTileBlockSize</td>
 <td class=c>N</td>
 <td class=c>-</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc71f = 50975'>0xc71f</td>
 <td>RowInterleaveFactor</td>
 <td class=c>N</td>
 <td class=c>-</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc725 = 50981'>0xc725</td>
 <td>ProfileLookTableDims</td>
 <td class=c title=' ! = Unsafe'>int32u[3]!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc726 = 50982'>0xc726</td>
 <td>ProfileLookTableData</td>
 <td class=c title=' ! = Unsafe'>float[n]!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc740 = 51008'>0xc740</td>
 <td>OpcodeList1</td>
 <td class=c>N</td>
 <td class=c>-</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc741 = 51009'>0xc741</td>
 <td>OpcodeList2</td>
 <td class=c>N</td>
 <td class=c>-</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc74e = 51022'>0xc74e</td>
 <td>OpcodeList3</td>
 <td class=c>N</td>
 <td class=c>-</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc761 = 51041'>0xc761</td>
 <td>NoiseProfile</td>
 <td class=c title=' ! = Unsafe'>double[n]!</td>
 <td class=c>SubIFD</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc763 = 51043'>0xc763</td>
 <td>TimeCodes</td>
 <td class=c>int8u[n]</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc764 = 51044'>0xc764</td>
 <td>FrameRate</td>
 <td class=c>rational64s</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc772 = 51058'>0xc772</td>
 <td>TStop</td>
 <td class=c>rational64u[n]</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc789 = 51081'>0xc789</td>
 <td>ReelName</td>
 <td class=c>string</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc791 = 51089'>0xc791</td>
 <td>OriginalDefaultFinalSize</td>
 <td class=c title=' ! = Unsafe'>int32u[2]!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc792 = 51090'>0xc792</td>
 <td>OriginalBestQualitySize</td>
 <td class=c title=' ! = Unsafe'>int32u[2]!</td>
 <td class=c>IFD0</td>
 <td><span class=s><span class=n>(called OriginalBestQualityFinalSize by the DNG spec)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td title='0xc793 = 51091'>0xc793</td>
 <td>OriginalDefaultCropSize</td>
 <td class=c title=' ! = Unsafe'>rational64u[2]!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc7a1 = 51105'>0xc7a1</td>
 <td>CameraLabel</td>
 <td class=c>string</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc7a3 = 51107'>0xc7a3</td>
 <td>ProfileHueSatMapEncoding</td>
 <td class=c title=' ! = Unsafe'>int32u!</td>
 <td class=c>IFD0</td>
 <td><span class=s>0 = Linear
   <br>1 = sRGB</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0xc7a4 = 51108'>0xc7a4</td>
 <td>ProfileLookTableEncoding</td>
 <td class=c title=' ! = Unsafe'>int32u!</td>
 <td class=c>IFD0</td>
 <td><span class=s>0 = Linear
   <br>1 = sRGB</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0xc7a5 = 51109'>0xc7a5</td>
 <td>BaselineExposureOffset</td>
 <td class=c title=' ! = Unsafe'>rational64u!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc7a6 = 51110'>0xc7a6</td>
 <td>DefaultBlackRender</td>
 <td class=c title=' ! = Unsafe'>int32u!</td>
 <td class=c>IFD0</td>
 <td><span class=s>0 = Auto
   <br>1 = None</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0xc7a7 = 51111'>0xc7a7</td>
 <td>NewRawImageDigest</td>
 <td class=c title=' ! = Unsafe'>int8u[16]!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xc7a8 = 51112'>0xc7a8</td>
 <td>RawToPreviewGain</td>
 <td class=c title=' ! = Unsafe'>double!</td>
 <td class=c>IFD0</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xc7b5 = 51125'>0xc7b5</td>
 <td>DefaultUserCrop</td>
 <td class=c title=' ! = Unsafe'>rational64u[4]!</td>
 <td class=c>SubIFD</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xea1c = 59932'>0xea1c</td>
 <td>Padding</td>
 <td class=c>undef</td>
 <td class=c>ExifIFD</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xea1d = 59933'>0xea1d</td>
 <td>OffsetSchema</td>
 <td class=c>int32s</td>
 <td class=c>ExifIFD</td>
 <td><span class=s><span class=n>(Microsoft&#39;s ill-conceived maker note offset difference)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td title='0xfde8 = 65000'>0xfde8</td>
 <td>OwnerName</td>
 <td class=c title=' / = Avoided'>string/</td>
@@ -3037,86 +3053,86 @@ one; 2. Pixel width of segments except last; 3. Pixel width of last segment)</sp
 <td><span class=s><span class=n>(tags 0xfde8-0xfdea and 0xfe4c-0xfe58 are generated by Photoshop Camera RAW.
 Some names are the same as other EXIF tags, but ExifTool will avoid writing
 these unless they already exist in the file)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td title='0xfde9 = 65001'>0xfde9</td>
 <td>SerialNumber</td>
 <td class=c title=' / = Avoided'>string/</td>
 <td class=c>ExifIFD</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xfdea = 65002'>0xfdea</td>
 <td>Lens</td>
 <td class=c title=' / = Avoided'>string/</td>
 <td class=c>ExifIFD</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xfe00 = 65024'>0xfe00</td>
 <td>KDC_IFD</td>
 <td class=c>-</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Kodak.html#KDC_IFD'>Kodak KDC_IFD Tags</a>
   <br><span class='n s'>(used in some Kodak KDC images)</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0xfe4c = 65100'>0xfe4c</td>
 <td>RawFile</td>
 <td class=c title=' / = Avoided'>string/</td>
 <td class=c>ExifIFD</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xfe4d = 65101'>0xfe4d</td>
 <td>Converter</td>
 <td class=c title=' / = Avoided'>string/</td>
 <td class=c>ExifIFD</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xfe4e = 65102'>0xfe4e</td>
 <td>WhiteBalance</td>
 <td class=c title=' / = Avoided'>string/</td>
 <td class=c>ExifIFD</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xfe51 = 65105'>0xfe51</td>
 <td>Exposure</td>
 <td class=c title=' / = Avoided'>string/</td>
 <td class=c>ExifIFD</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xfe52 = 65106'>0xfe52</td>
 <td>Shadows</td>
 <td class=c title=' / = Avoided'>string/</td>
 <td class=c>ExifIFD</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xfe53 = 65107'>0xfe53</td>
 <td>Brightness</td>
 <td class=c title=' / = Avoided'>string/</td>
 <td class=c>ExifIFD</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xfe54 = 65108'>0xfe54</td>
 <td>Contrast</td>
 <td class=c title=' / = Avoided'>string/</td>
 <td class=c>ExifIFD</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xfe55 = 65109'>0xfe55</td>
 <td>Saturation</td>
 <td class=c title=' / = Avoided'>string/</td>
 <td class=c>ExifIFD</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xfe56 = 65110'>0xfe56</td>
 <td>Sharpness</td>
 <td class=c title=' / = Avoided'>string/</td>
 <td class=c>ExifIFD</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xfe57 = 65111'>0xfe57</td>
 <td>Smoothness</td>
 <td class=c title=' / = Avoided'>string/</td>
 <td class=c>ExifIFD</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xfe58 = 65112'>0xfe58</td>
 <td>MoireFilter</td>
 <td class=c title=' / = Avoided'>string/</td>
@@ -3238,7 +3254,7 @@ these unless they already exist in the file)</span></span></td></tr>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Apr 9, 2013</i>
+<br><i>Last revised Feb 6, 2014</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -53,8 +53,9 @@ automates the handling of this tag in the MWG module -- see the
 <td>Directory</td>
 <td class=c title=' ! = Unsafe'>Y!</td>
 <td class=c>System</td>
-<td><span class=s><span class=n>(may be written to move the file to a specified directory. New directories
-are created as necessary)</span></span></td></tr>
+<td><span class=s><span class=n>(the directory of the file as specified in the call to ExifTool, or &quot;.&quot; if no
+directory was specified.  May be written to move the file to another
+directory that will be created if doesn&#39;t already exist)</span></span></td></tr>
 <tr class=b>
 <td>EXIF</td>
 <td class=c title=' ! = Unsafe'>Y!</td>
@@ -64,7 +65,9 @@ are created as necessary)</span></span></td></tr>
 <td>Error</td>
 <td class=c>N</td>
 <td class=c>ExifTool</td>
-<td>&nbsp;</td></tr>
+<td><span class=s><span class=n>(returns errors that may have occurred while reading or writing a file.  Any
+Error will prevent the file from being processed.  Minor errors may be
+downgraded to warnings with the -m or IgnoreMinorErrors option)</span></span></td></tr>
 <tr class=b>
 <td>ExifByteOrder</td>
 <td class=c>Y</td>
@@ -77,7 +80,7 @@ byte order only for newly created EXIF segments)</span>
 <td>ExifToolVersion</td>
 <td class=c>N</td>
 <td class=c>ExifTool</td>
-<td>&nbsp;</td></tr>
+<td><span class=s><span class=n>(the version of ExifTool currently running)</span></span></td></tr>
 <tr class=b>
 <td>ExifUnicodeByteOrder</td>
 <td class=c>Y</td>
@@ -138,9 +141,10 @@ this value should be done in octal, ie. &#39;oct($filePermissions#) &amp; 0200&#
 <td>FileSequence</td>
 <td class=c>N</td>
 <td class=c>ExifTool</td>
-<td><span class=s><span class=n>(sequence number for each processed file when extracting or copying
-information, beginning at 0 for the first file.  Not generated unless
-specifically requested)</span></span></td></tr>
+<td><span class=s><span class=n>(sequence number for each source file when extracting or copying information,
+including files that fail the -if condition of the command-line application,
+beginning at 0 for the first file.  Not generated unless specifically
+requested)</span></span></td></tr>
 <tr class=b>
 <td>FileSize</td>
 <td class=c>N</td>
@@ -151,7 +155,8 @@ specifically requested)</span></span></td></tr>
 <td>FileType</td>
 <td class=c>N</td>
 <td class=c>File</td>
-<td>&nbsp;</td></tr>
+<td><span class=s><span class=n>(a short description of the file type.  As a general rule, this is the
+extension commonly used for the file, but there are exceptions to this rule)</span></span></td></tr>
 <tr class=b>
 <td>Geosync</td>
 <td class=c>Y</td>
@@ -220,7 +225,7 @@ generated only if specifically requested)</span></span></td></tr>
 <td>MIMEType</td>
 <td class=c>N</td>
 <td class=c>File</td>
-<td>&nbsp;</td></tr>
+<td><span class=s><span class=n>(the MIME type of the source file)</span></span></td></tr>
 <tr class=b>
 <td>MaxVal</td>
 <td class=c>N</td>
@@ -257,11 +262,17 @@ unless specifically requested)</span></span></td></tr>
 <td class=c>File</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
+<td>ProcessingTime</td>
+<td class=c>N</td>
+<td class=c>ExifTool</td>
+<td><span class=s><span class=n>(the clock time in seconds taken by ExifTool to extract information from this
+file.  Not generated unless specifically requested.  Requires Time::HiRes)</span></span></td></tr>
+<tr>
 <td>RAFVersion</td>
 <td class=c>N</td>
 <td class=c>File</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>ResourceForkSize</td>
 <td class=c>N</td>
 <td class=c>System</td>
@@ -270,22 +281,27 @@ tag is generated the ExtractEmbedded option may be used to extract
 resource-fork information as a sub-document.  When writing, the resource
 fork is preserved by default, but it may be deleted with <code>-rsrc:all=</code> on
 the command line)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>Warning</td>
 <td class=c>N</td>
 <td class=c>ExifTool</td>
-<td>&nbsp;</td></tr>
-<tr>
+<td><span class=s><span class=n>(returns warnings that may have occurred while reading or writing a file.
+Use the -a or Duplicates option to see all warnings if more than one
+occurred. Minor warnings may be ignored with the -m or IgnoreMinorErrors
+option.  Minor warnings with a capital &quot;M&quot; in the &quot;[Minor]&quot; designation
+indicate that the processing is affected by ignoring the warning)</span></span></td></tr>
+<tr class=b>
 <td>XMP</td>
 <td class=c title=' ! = Unsafe'>Y!</td>
 <td class=c>XMP</td>
-<td><span class=s><span class=n>(the full XMP data block)</span></span></td></tr>
-<tr class=b>
+<td><span class=s><span class=n>(the XMP data block, but note that extended XMP in JPEG images may be split
+into multiple blocks)</span></span></td></tr>
+<tr>
 <td>XResolution</td>
 <td class=c>N</td>
 <td class=c>File</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>YResolution</td>
 <td class=c>N</td>
 <td class=c>File</td>
@@ -294,7 +310,7 @@ the command line)</span></span></td></tr>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Feb 7, 2013</i>
+<br><i>Last revised Feb 21, 2014</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -49,7 +49,8 @@ way to tell which)</span></span></td></tr>
 
 <h2><a name='FFF'>FLIR FFF Tags</a></h2>
 <p>Information extracted from FLIR FFF images and the FLIR APP1 segment of JPEG
-images.</p>
+images.  These tags may also be extracted from the first frame of an FLIR
+SEQ file, even though SEQ is not listed as a supported file type.</p>
 <blockquote>
 <table class=frame><tr><td>
 <table class=inner cellspacing=1>
@@ -61,10 +62,30 @@ images.</p>
 <td class=c>-</td>
 <td>--&gt; <a href='FLIR.html#RawData'>FLIR RawData Tags</a></td></tr>
 <tr class=b>
+<td title='0x0005 = 5'>0x0005</td>
+<td>GainDeadData</td>
+<td class=c>-</td>
+<td>--&gt; <a href='FLIR.html#GainDeadData'>FLIR GainDeadData Tags</a></td></tr>
+<tr>
+<td title='0x0006 = 6'>0x0006</td>
+<td>CoarseData</td>
+<td class=c>-</td>
+<td>--&gt; <a href='FLIR.html#CoarseData'>FLIR CoarseData Tags</a></td></tr>
+<tr class=b>
+<td title='0x000e = 14'>0x000e</td>
+<td>EmbeddedImage</td>
+<td class=c>-</td>
+<td>--&gt; <a href='FLIR.html#EmbeddedImage'>FLIR EmbeddedImage Tags</a></td></tr>
+<tr>
 <td title='0x0020 = 32'>0x0020</td>
 <td>CameraInfo</td>
 <td class=c>-</td>
 <td>--&gt; <a href='FLIR.html#CameraInfo'>FLIR CameraInfo Tags</a></td></tr>
+<tr class=b>
+<td title='0x0021 = 33'>0x0021</td>
+<td>MeasurementInfo</td>
+<td class=c>-</td>
+<td>--&gt; <a href='FLIR.html#MeasInfo'>FLIR MeasInfo Tags</a></td></tr>
 <tr>
 <td title='0x0022 = 34'>0x0022</td>
 <td>PaletteInfo</td>
@@ -81,13 +102,28 @@ images.</p>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
+<td title='0x0028 = 40'>0x0028</td>
+<td>PaintData</td>
+<td class=c>-</td>
+<td>--&gt; <a href='FLIR.html#PaintData'>FLIR PaintData Tags</a></td></tr>
+<tr>
+<td title='0x002a = 42'>0x002a</td>
+<td>PiP</td>
+<td class=c>-</td>
+<td>--&gt; <a href='FLIR.html#PiP'>FLIR PiP Tags</a></td></tr>
+<tr class=b>
 <td title='0x002b = 43'>0x002b</td>
 <td>GPSInfo</td>
 <td class=c>-</td>
 <td>--&gt; <a href='FLIR.html#GPSInfo'>FLIR GPSInfo Tags</a></td></tr>
 <tr>
+<td title='0x002c = 44'>0x002c</td>
+<td>MeterLink</td>
+<td class=c>-</td>
+<td>--&gt; <a href='FLIR.html#MeterLink'>FLIR MeterLink Tags</a></td></tr>
+<tr class=b>
 <td title='0x002e = 46'>0x002e</td>
-<td>ParamInfo</td>
+<td>ParameterInfo</td>
 <td class=c>-</td>
 <td>--&gt; <a href='FLIR.html#ParamInfo'>FLIR ParamInfo Tags</a></td></tr>
 </table></td></tr></table></blockquote>
@@ -117,7 +153,7 @@ as-is.  Note that most FLIR cameras using the PNG format seem to write the
 <td class=r title='16 = 0x10'>16</td>
 <td>RawThermalImageType</td>
 <td class=c>N</td>
-<td><span class=s><span class=n>(TIFF or PNG)</span></span></td></tr>
+<td>&nbsp;</td></tr>
 <tr class=b>
 <td class=r title='16 = 0x10'>16.1</td>
 <td>RawThermalImage</td>
@@ -125,7 +161,98 @@ as-is.  Note that most FLIR cameras using the PNG format seem to write the
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
+<h2><a name='GainDeadData'>FLIR GainDeadData Tags</a></h2>
+<p>Information found in FFF-format .GAN calibration image files.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index2</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='1 = 0x1'>1</td>
+<td>GainDeadMapImageWidth</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='2 = 0x2'>2</td>
+<td>GainDeadMapImageHeight</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='16 = 0x10'>16</td>
+<td>GainDeadMapImageType</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='16 = 0x10'>16.1</td>
+<td>GainDeadMapImage</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='CoarseData'>FLIR CoarseData Tags</a></h2>
+<p>Information found in FFF-format .CRS correction image files.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index2</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='1 = 0x1'>1</td>
+<td>CoarseMapImageWidth</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='2 = 0x2'>2</td>
+<td>CoarseMapImageHeight</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='16 = 0x10'>16</td>
+<td>CoarseMapImageType</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='16 = 0x10'>16.1</td>
+<td>CoarseMapImage</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='EmbeddedImage'>FLIR EmbeddedImage Tags</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index2</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='1 = 0x1'>1</td>
+<td>EmbeddedImageWidth</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='2 = 0x2'>2</td>
+<td>EmbeddedImageHeight</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='16 = 0x10'>16</td>
+<td>EmbeddedImageType</td>
+<td class=c>N</td>
+<td><span class=s><span class=n>(&quot;PNG&quot; for PNG image in Y Cb Cr colors, &quot;JPG&quot; for a JPEG image, or &quot;DAT&quot; for
+other image data)</span></span></td></tr>
+<tr class=b>
+<td class=r title='16 = 0x10'>16.1</td>
+<td>EmbeddedImage</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
 <h2><a name='CameraInfo'>FLIR CameraInfo Tags</a></h2>
+<p>FLIR camera information.  The Planck tags are variables used in the
+temperature calculation.  See
+<a href="http://u88.n24.queensu.ca/exiftool/forum/index.php?topic=4898.msg23972#msg23972">http://u88.n24.queensu.ca/exiftool/forum/index.php?topic=4898.msg23972#msg23972</a>
+for details.</p>
 <blockquote>
 <table class=frame><tr><td>
 <table class=inner cellspacing=1>
@@ -167,80 +294,100 @@ as-is.  Note that most FLIR cameras using the PNG format seem to write the
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
+<td class=r title='88 = 0x58'>88</td>
+<td>PlanckR1</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='92 = 0x5c'>92</td>
+<td>PlanckB</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='96 = 0x60'>96</td>
+<td>PlanckF</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
 <td class=r title='144 = 0x90'>144</td>
 <td>CameraTemperatureRangeMax</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td class=r title='148 = 0x94'>148</td>
 <td>CameraTemperatureRangeMin</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td class=r title='152 = 0x98'>152</td>
 <td>UnknownTemperature1?</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td class=r title='156 = 0x9c'>156</td>
 <td>UnknownTemperature2?</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td class=r title='160 = 0xa0'>160</td>
 <td>UnknownTemperature3?</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td class=r title='164 = 0xa4'>164</td>
 <td>UnknownTemperature4?</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td class=r title='168 = 0xa8'>168</td>
 <td>UnknownTemperature5?</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td class=r title='172 = 0xac'>172</td>
 <td>UnknownTemperature6?</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td class=r title='212 = 0xd4'>212</td>
 <td>CameraModel</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td class=r title='244 = 0xf4'>244</td>
 <td>CameraPartNumber</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td class=r title='260 = 0x104'>260</td>
 <td>CameraSerialNumber</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td class=r title='276 = 0x114'>276</td>
 <td>CameraSoftware</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td class=r title='368 = 0x170'>368</td>
 <td>LensModel</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td class=r title='400 = 0x190'>400</td>
 <td>LensPartNumber</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td class=r title='416 = 0x1a0'>416</td>
 <td>LensSerialNumber</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='436 = 0x1b4'>436</td>
+<td>FieldOfView</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
 <tr>
 <td class=r title='492 = 0x1ec'>492</td>
 <td>FilterModel</td>
@@ -257,10 +404,73 @@ as-is.  Note that most FLIR cameras using the PNG format seem to write the
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
+<td class=r title='776 = 0x308'>776</td>
+<td>PlanckO</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='780 = 0x30c'>780</td>
+<td>PlanckR2</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='824 = 0x338'>824</td>
+<td>RawValueMedian</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='828 = 0x33c'>828</td>
+<td>RawValueRange</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td class=r title='900 = 0x384'>900</td>
 <td>DateTimeOriginal</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
+<tr>
+<td class=r title='912 = 0x390'>912</td>
+<td>FocusStepCount</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='1116 = 0x45c'>1116</td>
+<td>FocusDistance</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='MeasInfo'>FLIR MeasInfo Tags</a></h2>
+<p>Tags listed below are only for the first measurement tool, however multiple
+measurements may be added, and information is extracted for all of them.
+Tags for subsequent measurements are generated as required with the prefixes
+&quot;Meas2&quot;, &quot;Meas3&quot;, etc.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td>Meas1Label</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>Meas1Params</td>
+<td class=c>N</td>
+<td><span class=s><span class=n>(Spot=X,Y; Area=X1,Y1,W,H; Ellipse=XC,YC,X1,Y1,X2,Y2; Line=X1,Y1,X2,Y2)</span></span></td></tr>
+<tr>
+<td>Meas1Type</td>
+<td class=c>N</td>
+<td><table class=cols><tr>
+  <td>1 = Spot
+  <br>2 = Area
+  <br>3 = Ellipse
+  <br>4 = Line</td><td>&nbsp;&nbsp;</td>
+  <td>5 = Endpoint
+  <br>6 = Alarm
+  <br>7 = Unused
+  <br>8 = Difference</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
 </table></td></tr></table></blockquote>
 
 <h2><a name='PaletteInfo'>FLIR PaletteInfo Tags</a></h2>
@@ -371,6 +581,79 @@ as-is.  Note that most FLIR cameras using the PNG format seem to write the
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
+<h2><a name='PaintData'>FLIR PaintData Tags</a></h2>
+<p>Information generated by FLIR Tools &quot;Paint colors&quot; tool.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index2</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='5 = 0x5'>5</td>
+<td>PaintImageWidth</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='6 = 0x6'>6</td>
+<td>PaintImageHeight</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='20 = 0x14'>20</td>
+<td>PaintImageType</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='20 = 0x14'>20.1</td>
+<td>PaintImage</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='PiP'>FLIR PiP Tags</a></h2>
+<p>FLIR Picture in Picture tags.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index2</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='0 = 0x0'>0</td>
+<td>Real2IR</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='2 = 0x2'>2</td>
+<td>OffsetX</td>
+<td class=c>N</td>
+<td><span class=s><span class=n>(offset from of insertion point from center)</span></span></td></tr>
+<tr>
+<td class=r title='3 = 0x3'>3</td>
+<td>OffsetY</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='4 = 0x4'>4</td>
+<td>PiPX1</td>
+<td class=c>N</td>
+<td><span class=s><span class=n>(crop size for radiometric image)</span></span></td></tr>
+<tr>
+<td class=r title='5 = 0x5'>5</td>
+<td>PiPX2</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='6 = 0x6'>6</td>
+<td>PiPY1</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='7 = 0x7'>7</td>
+<td>PiPY2</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
 <h2><a name='GPSInfo'>FLIR GPSInfo Tags</a></h2>
 <blockquote>
 <table class=frame><tr><td>
@@ -384,6 +667,135 @@ as-is.  Note that most FLIR cameras using the PNG format seem to write the
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
+<h2><a name='MeterLink'>FLIR MeterLink Tags</a></h2>
+<p>Tags containing Meterlink humidity meter information.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index1</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='26 = 0x1a'>26</td>
+<td>Reading1Units</td>
+<td class=c>N</td>
+<td><span class=s>0xd = C
+  <br>0x1b = %
+  <br>0x1d = Relative
+  <br>0x24 = g/kg</span></td></tr>
+<tr class=b>
+<td class=r title='28 = 0x1c'>28</td>
+<td>Reading1Description</td>
+<td class=c>N</td>
+<td><table class=cols><tr>
+  <td>0 = Humidity
+  <br>3 = Moisture
+  <br>7 = Dew Point
+  <br>8 = Air Temperature
+  <br>9 = IR Temperature
+  <br>11 = Difference Temperature</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr>
+<td class=r title='32 = 0x20'>32</td>
+<td>Reading1Device</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='96 = 0x60'>96</td>
+<td>Reading1Value</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='126 = 0x7e'>126</td>
+<td>Reading2Units</td>
+<td class=c>N</td>
+<td><span class=s>0xd = C
+  <br>0x1b = %
+  <br>0x1d = rel
+  <br>0x24 = g/kg</span></td></tr>
+<tr class=b>
+<td class=r title='128 = 0x80'>128</td>
+<td>Reading2Description</td>
+<td class=c>N</td>
+<td><table class=cols><tr>
+  <td>0 = Humidity
+  <br>3 = Moisture
+  <br>7 = Dew Point
+  <br>8 = Air Temperature
+  <br>9 = IR Temperature
+  <br>11 = Difference Temperature</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr>
+<td class=r title='132 = 0x84'>132</td>
+<td>Reading2Device</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='196 = 0xc4'>196</td>
+<td>Reading2Value</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='226 = 0xe2'>226</td>
+<td>Reading3Units</td>
+<td class=c>N</td>
+<td><span class=s>0xd = C
+  <br>0x1b = %
+  <br>0x1d = rel
+  <br>0x24 = g/kg</span></td></tr>
+<tr class=b>
+<td class=r title='228 = 0xe4'>228</td>
+<td>Reading3Description</td>
+<td class=c>N</td>
+<td><table class=cols><tr>
+  <td>0 = Humidity
+  <br>3 = Moisture
+  <br>7 = Dew Point
+  <br>8 = Air Temperature
+  <br>9 = IR Temperature
+  <br>11 = Difference Temperature</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr>
+<td class=r title='232 = 0xe8'>232</td>
+<td>Reading3Device</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='296 = 0x128'>296</td>
+<td>Reading3Value</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='326 = 0x146'>326</td>
+<td>Reading4Units</td>
+<td class=c>N</td>
+<td><span class=s>0xd = C
+  <br>0x1b = %
+  <br>0x1d = rel
+  <br>0x24 = g/kg</span></td></tr>
+<tr class=b>
+<td class=r title='328 = 0x148'>328</td>
+<td>Reading4Description</td>
+<td class=c>N</td>
+<td><table class=cols><tr>
+  <td>0 = Humidity
+  <br>3 = Moisture
+  <br>7 = Dew Point
+  <br>8 = Air Temperature
+  <br>9 = IR Temperature
+  <br>11 = Difference Temperature</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr>
+<td class=r title='332 = 0x14c'>332</td>
+<td>Reading4Device</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='396 = 0x18c'>396</td>
+<td>Reading4Value</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
 <h2><a name='ParamInfo'>FLIR ParamInfo Tags</a></h2>
 <blockquote>
 <table class=frame><tr><td>
@@ -412,6 +824,215 @@ as-is.  Note that most FLIR cameras using the PNG format seem to write the
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
+<h2><a name='UserData'>FLIR UserData Tags</a></h2>
+<p>Tags written by some FLIR cameras in a top-level (!) &quot;udta&quot; atom of MP4
+videos.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td>'uuid'</td>
+<td>FLIR_Parts
+  <br>FLIR_Serial
+  <br>FLIR_Params
+  <br>FLIR_UnknownUUID
+  <br>FLIR_GPS
+  <br>FLIR_MoreInfo
+  <br>SoftwareComponents?
+  <br>FLIR_Unknown?
+  <br>Units
+  <br>ThumbnailImage</td>
+<td class=c title=' + = List'>-<br>-<br>-<br>-<br>-<br>-<br>N<br>N<br>N+<br>N</td>
+<td>--&gt; <a href='FLIR.html#Parts'>FLIR Parts Tags</a>
+  <br>--&gt; <a href='FLIR.html#SerialNums'>FLIR SerialNums Tags</a>
+  <br>--&gt; <a href='FLIR.html#Params'>FLIR Params Tags</a>
+  <br>--&gt; <a href='FLIR.html#UnknownUUID'>FLIR UnknownUUID Tags</a>
+  <br>--&gt; <a href='FLIR.html#GPS_UUID'>FLIR GPS_UUID Tags</a>
+  <br>--&gt; <a href='FLIR.html#MoreInfo'>FLIR MoreInfo Tags</a></td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='Parts'>FLIR Parts Tags</a></h2>
+<p>Tags extracted from the &quot;uuid&quot; box with ID 43c3993b0f94424b82056b66513f485d
+in FLIR MP4 videos.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index1</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='4 = 0x4'>4</td>
+<td>BAHPVer
+  <br>BALPVer
+  <br>Battery
+  <br>BAVPVer
+  <br>CamCore
+  <br>DetectorBoard
+  <br>Detector
+  <br>GIDCVer
+  <br>GIDPVer
+  <br>GIPC_CPLD
+  <br>GIPCVer
+  <br>GIXIVer
+  <br>MainBoard
+  <br>Optics
+  <br>PartNumber</td>
+<td class=c>N<br>N<br>N<br>N<br>N<br>N<br>N<br>N<br>N<br>N<br>N<br>N<br>N<br>N<br>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='SerialNums'>FLIR SerialNums Tags</a></h2>
+<p>Tags extracted from the &quot;uuid&quot; box with ID 57f5b93e51e448afa0d9c3ef1b37f712
+in FLIR MP4 videos.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index1</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='12 = 0xc'>12</td>
+<td>UnknownSerial1?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='45 = 0x2d'>45</td>
+<td>UnknownSerial2?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='78 = 0x4e'>78</td>
+<td>UnknownSerial3?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='111 = 0x6f'>111</td>
+<td>UnknownSerial4?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='123 = 0x7b'>123</td>
+<td>UnknownNumber?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='126 = 0x7e'>126</td>
+<td>CameraSerialNumber</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='Params'>FLIR Params Tags</a></h2>
+<p>Tags extracted from the &quot;uuid&quot; box with ID 41e5dcf9e80a41ceadfe7f0c58082c19
+in FLIR MP4 videos.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index4</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='1 = 0x1'>1</td>
+<td>ReflectedApparentTemperature</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='2 = 0x2'>2</td>
+<td>AtmosphericTemperature</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='3 = 0x3'>3</td>
+<td>Emissivity</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='4 = 0x4'>4</td>
+<td>ObjectDistance</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='5 = 0x5'>5</td>
+<td>RelativeHumidity</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='6 = 0x6'>6</td>
+<td>EstimatedAtmosphericTrans</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='7 = 0x7'>7</td>
+<td>IRWindowTemperature</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='8 = 0x8'>8</td>
+<td>IRWindowTransmission</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='UnknownUUID'>FLIR UnknownUUID Tags</a></h2>
+<p>Tags extracted from the &quot;uuid&quot; box with ID 574520502cbb44adae5415e9b839d903
+in FLIR MP4 videos.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index4</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr><td colspan=4 class=c><i>[no tags known]</i></td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='GPS_UUID'>FLIR GPS_UUID Tags</a></h2>
+<p>Tags extracted from the &quot;uuid&quot; box with ID 7f2e21008b464918afb1de709a74f6f5
+in FLIR MP4 videos.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index4</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='1 = 0x1'>1</td>
+<td>GPSLatitude</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='2 = 0x2'>2</td>
+<td>GPSLongitude</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='3 = 0x3'>3</td>
+<td>GPSAltitude</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='MoreInfo'>FLIR MoreInfo Tags</a></h2>
+<p>Tags extracted from the &quot;uuid&quot; box with ID 2b452fdc74354094baee22a6b23a7cf8
+in FLIR MP4 videos.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index1</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='5 = 0x5'>5</td>
+<td>LensModel</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='11 = 0xb'>11</td>
+<td>UnknownTemperature1?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='15 = 0xf'>15</td>
+<td>UnknownTemperature2?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
 <h2><a name='FPF'>FLIR FPF Tags</a></h2>
 <p>Tags extracted from FLIR Public image Format (FPF) files.</p>
 <blockquote>
@@ -609,7 +1230,7 @@ as-is.  Note that most FLIR cameras using the PNG format seem to write the
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Apr 15, 2013</i>
+<br><i>Last revised Jan 14, 2014</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -76,10 +76,11 @@ necessarily correspond to the camera body number -- this needs to be checked)</s
   <br>0x180 = Medium Low
   <br>0x200 = Low
   <br>0x300 = None (B&amp;W)
-  <br>0x301 = B&amp;W Green Filter
+  <br>0x301 = B&amp;W Red Filter
   <br>0x302 = B&amp;W Yellow Filter
-  <br>0x303 = B&amp;W Blue Filter
+  <br>0x303 = B&amp;W Green Filter
   <br>0x310 = B&amp;W Sepia
+  <br>0x400 = Low 2
   <br>0x8000 = Film Simulation</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
 <tr>
@@ -124,7 +125,9 @@ necessarily correspond to the camera body number -- this needs to be checked)</s
 <td class=c>int16u</td>
 <td><span class=s>0x0 = Normal
   <br>0x100 = Strong
-  <br>0x200 = Weak</span></td></tr>
+  <br>0x180 = Medium Strong
+  <br>0x200 = Weak
+  <br>0x280 = Medium Weak</span></td></tr>
 <tr>
 <td title='0x1010 = 4112'>0x1010</td>
 <td>FujiFlashMode</td>
@@ -152,17 +155,24 @@ necessarily correspond to the camera body number -- this needs to be checked)</s
 <td><span class=s>0 = Auto
   <br>1 = Manual</span></td></tr>
 <tr>
+<td title='0x1022 = 4130'>0x1022</td>
+<td>AFPointSet</td>
+<td class=c>int16u</td>
+<td><span class=s><span class=n>(&quot;No&quot; for manual and AF-multi focus modes)</span>
+  <br>0 = No
+  <br>1 = Yes</span></td></tr>
+<tr class=b>
 <td title='0x1023 = 4131'>0x1023</td>
 <td>FocusPixel</td>
 <td class=c>int16u[2]</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x1030 = 4144'>0x1030</td>
 <td>SlowSync</td>
 <td class=c>int16u</td>
 <td><span class=s>0 = Off
   <br>1 = On</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x1031 = 4145'>0x1031</td>
 <td>PictureMode</td>
 <td class=c>int16u</td>
@@ -192,6 +202,7 @@ necessarily correspond to the camera body number -- this needs to be checked)</s
   <br>0x17 = Night (tripod)
   <br>0x18 = Pro Low-light
   <br>0x19 = Pro Focus
+  <br>0x1a = Portrait 2
   <br>0x1b = Dog Face Detection
   <br>0x1c = Cat Face Detection
   <br>0x40 = Advanced Filter
@@ -199,6 +210,11 @@ necessarily correspond to the camera body number -- this needs to be checked)</s
   <br>0x200 = Shutter speed priority AE
   <br>0x300 = Manual</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
+<tr>
+<td title='0x1032 = 4146'>0x1032</td>
+<td>ExposureCount</td>
+<td class=c>int16u</td>
+<td><span class=s><span class=n>(number of exposures used for this image)</span></span></td></tr>
 <tr class=b>
 <td title='0x1033 = 4147'>0x1033</td>
 <td>EXRAuto</td>
@@ -213,6 +229,24 @@ necessarily correspond to the camera body number -- this needs to be checked)</s
   <br>0x200 = SN (Signal to Noise priority)
   <br>0x300 = DR (Dynamic Range priority)</span></td></tr>
 <tr class=b>
+<td title='0x1040 = 4160'>0x1040</td>
+<td>ShadowTone</td>
+<td class=c>int32s</td>
+<td><span class=s>-32 = Hard
+  <br>-16 = Medium-hard
+  <br>0 = Normal
+  <br>16 = Medium-soft
+  <br>32 = Soft</span></td></tr>
+<tr>
+<td title='0x1041 = 4161'>0x1041</td>
+<td>HighlightTone</td>
+<td class=c>int32s</td>
+<td><span class=s>-32 = Hard
+  <br>-16 = Medium-hard
+  <br>0 = Normal
+  <br>16 = Medium-soft
+  <br>32 = Soft</span></td></tr>
+<tr class=b>
 <td title='0x1100 = 4352'>0x1100</td>
 <td>AutoBracketing</td>
 <td class=c>int16u</td>
@@ -317,37 +351,71 @@ necessarily correspond to the camera body number -- this needs to be checked)</s
 <td class=c>int16u</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
+<td title='0x1422 = 5154'>0x1422</td>
+<td>ImageStabilization</td>
+<td class=c>int16u[3]</td>
+<td><span class=s>[Value 0]
+  <br>0 = None
+  <br>1 = Optical
+  <br>2 = Sensor-shift
+  <br>512 = Digital
+  <br>[Value 1]
+  <br>0 = Off
+  <br>1 = On (mode 1, continuous)
+  <br>2 = On (mode 2, shooting only)</span></td></tr>
+<tr>
+<td title='0x1436 = 5174'>0x1436</td>
+<td>ImageGeneration</td>
+<td class=c>int16u</td>
+<td><span class=s>0 = Original Image
+  <br>1 = Re-developed from RAW</span></td></tr>
+<tr class=b>
+<td title='0x3820 = 14368'>0x3820</td>
+<td>FrameRate</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x3821 = 14369'>0x3821</td>
+<td>FrameWidth</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x3822 = 14370'>0x3822</td>
+<td>FrameHeight</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr>
 <td title='0x4100 = 16640'>0x4100</td>
 <td>FacesDetected</td>
 <td class=c>int16u</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x4103 = 16643'>0x4103</td>
 <td>FacePositions</td>
 <td class=c>int16u[n]</td>
 <td><span class=s><span class=n>(left, top, right and bottom coordinates in full-sized image for each face
 detected)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x4282 = 17026'>0x4282</td>
 <td>FaceRecInfo</td>
 <td class=c>-</td>
 <td>--&gt; <a href='FujiFilm.html#FaceRecInfo'>FujiFilm FaceRecInfo Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td title='0x8000 = 32768'>0x8000</td>
 <td>FileSource</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x8002 = 32770'>0x8002</td>
 <td>OrderNumber</td>
 <td class=c>int32u</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x8003 = 32771'>0x8003</td>
 <td>FrameNumber</td>
 <td class=c>int16u</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xb211 = 45585'>0xb211</td>
 <td>Parallax</td>
 <td class=c>rational64s</td>
@@ -574,6 +642,21 @@ RAF-format information.</p>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td title='0xf00a = 61450'>0xf00a</td>
+<td>BlackLevel</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0xf00c = 61452'>0xf00c</td>
+<td>WB_GRBLevelsStandard</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0xf00d = 61453'>0xf00d</td>
+<td>WB_GRBLevelsDaylight</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td title='0xf00e = 61454'>0xf00e</td>
 <td>WB_GRBLevels</td>
 <td class=c>N</td>
@@ -630,7 +713,7 @@ RAF-format information.</p>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Feb 27, 2013</i>
+<br><i>Last revised Jan 30, 2014</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -26,8 +26,9 @@ or by suffixing the tag name with a <code>#</code> character).</p>
 
 <p>When adding GPS information to an image, it is important to set all of the
 following tags: GPSLatitude, GPSLatitudeRef, GPSLongitude, GPSLongitudeRef,
-GPSAltitude and GPSAltitudeRef.  ExifTool will write the required
-GPSVersionID tag automatically if new a GPS IFD is added to an image.
+and GPSAltitude and GPSAltitudeRef if the altitude is known.  ExifTool will
+write the required GPSVersionID tag automatically if new a GPS IFD is added
+to an image.
 </p>
 <blockquote>
 <table class=frame><tr><td>
@@ -43,7 +44,8 @@ GPSVersionID tag automatically if new a GPS IFD is added to an image.
 <td title='0x0001 = 1'>0x0001</td>
 <td>GPSLatitudeRef</td>
 <td class=c>string[2]</td>
-<td><span class=s>&#39;N&#39; = North
+<td><span class=s><span class=n>(tags 0x0001-0x0006 used for camera location according to MWG 2.0)</span>
+  <br>&#39;N&#39; = North
   <br>&#39;S&#39; = South</span></td></tr>
 <tr>
 <td title='0x0002 = 2'>0x0002</td>
@@ -143,7 +145,8 @@ if it includes a timezone)</span></span></td></tr>
 <td title='0x0013 = 19'>0x0013</td>
 <td>GPSDestLatitudeRef</td>
 <td class=c>string[2]</td>
-<td><span class=s>&#39;N&#39; = North
+<td><span class=s><span class=n>(tags 0x0013-0x001a used for subject location according to MWG 2.0)</span>
+  <br>&#39;N&#39; = North
   <br>&#39;S&#39; = South</span></td></tr>
 <tr>
 <td title='0x0014 = 20'>0x0014</td>
@@ -215,7 +218,7 @@ UTC if time includes a timezone.  Format is YYYY:mm:dd)</span></span></td></tr>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Oct 7, 2011</i>
+<br><i>Last revised Jul 22, 2013</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -10,7 +10,9 @@
 <p>
 ExifTool extracts the following tags from GeoTIFF images.  See
 <a href="http://www.remotesensing.org/geotiff/spec/geotiffhome.html">http://www.remotesensing.org/geotiff/spec/geotiffhome.html</a> for the
-complete GeoTIFF specification.
+complete GeoTIFF specification.  These tags are not writable individually,
+but they may be copied en mass via the containing GeoTiffDirectory,
+GeoTiffDoubleParams and GeoTiffAsciiParams tags.
 </p>
 <blockquote>
 <table class=frame><tr><td>
@@ -498,6 +500,11 @@ complete GeoTIFF specification.
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td title='0x080e = 2062'>0x080e</td>
+<td>GeogToWGS84</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td title='0x0c00 = 3072'>0x0c00</td>
 <td>ProjectedCSType</td>
 <td class=c>N</td>
@@ -1496,12 +1503,12 @@ complete GeoTIFF specification.
   <br>32760 = WGS84 UTM zone 60S
   <br>32767 = User Defined</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr class=b>
+<tr>
 <td title='0x0c01 = 3073'>0x0c01</td>
 <td>PCSCitation</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0c02 = 3074'>0x0c02</td>
 <td>Projection</td>
 <td class=c>N</td>
@@ -1935,7 +1942,7 @@ complete GeoTIFF specification.
   <br>19926 = Stereo 70
   <br>32767 = User Defined</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr class=b>
+<tr>
 <td title='0x0c03 = 3075'>0x0c03</td>
 <td>ProjCoordTrans</td>
 <td class=c>N</td>
@@ -1970,112 +1977,112 @@ complete GeoTIFF specification.
   <br>28 = Cylindrical Equal Area
   <br>32767 = User Defined</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr>
+<tr class=b>
 <td title='0x0c04 = 3076'>0x0c04</td>
 <td>ProjLinearUnits</td>
 <td class=c>N</td>
 <td>--&gt; <a href='GeoTiff.html#Units'>GeoTiff Units Values</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0c05 = 3077'>0x0c05</td>
 <td>ProjLinearUnitSize</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0c06 = 3078'>0x0c06</td>
 <td>ProjStdParallel1</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x0c07 = 3079'>0x0c07</td>
 <td>ProjStdParallel2</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0c08 = 3080'>0x0c08</td>
 <td>ProjNatOriginLong</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x0c09 = 3081'>0x0c09</td>
 <td>ProjNatOriginLat</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0c0a = 3082'>0x0c0a</td>
 <td>ProjFalseEasting</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x0c0b = 3083'>0x0c0b</td>
 <td>ProjFalseNorthing</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0c0c = 3084'>0x0c0c</td>
 <td>ProjFalseOriginLong</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x0c0d = 3085'>0x0c0d</td>
 <td>ProjFalseOriginLat</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0c0e = 3086'>0x0c0e</td>
 <td>ProjFalseOriginEasting</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x0c0f = 3087'>0x0c0f</td>
 <td>ProjFalseOriginNorthing</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0c10 = 3088'>0x0c10</td>
 <td>ProjCenterLong</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x0c11 = 3089'>0x0c11</td>
 <td>ProjCenterLat</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0c12 = 3090'>0x0c12</td>
 <td>ProjCenterEasting</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x0c13 = 3091'>0x0c13</td>
 <td>ProjCenterNorthing</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0c14 = 3092'>0x0c14</td>
 <td>ProjScaleAtNatOrigin</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x0c15 = 3093'>0x0c15</td>
 <td>ProjScaleAtCenter</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0c16 = 3094'>0x0c16</td>
 <td>ProjAzimuthAngle</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x0c17 = 3095'>0x0c17</td>
 <td>ProjStraightVertPoleLong</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0c18 = 3096'>0x0c18</td>
 <td>ProjRectifiedGridAngle</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x1000 = 4096'>0x1000</td>
 <td>VerticalCSType</td>
 <td class=c>N</td>
@@ -2120,18 +2127,18 @@ complete GeoTIFF specification.
   <br>5106 = Caspian Sea
   <br>32767 = User Defined</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr>
+<tr class=b>
 <td title='0x1001 = 4097'>0x1001</td>
 <td>VerticalCitation</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x1002 = 4098'>0x1002</td>
 <td>VerticalDatum</td>
 <td class=c>N</td>
 <td><span class=s>1 = Vertical Datum Base
   <br>32767 = User Defined</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x1003 = 4099'>0x1003</td>
 <td>VerticalUnits</td>
 <td class=c>N</td>
@@ -2171,7 +2178,7 @@ complete GeoTIFF specification.
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Jan 25, 2011</i>
+<br><i>Last revised Feb 6, 2014</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -43,36 +43,41 @@ which case subsequent occurrences are extracted as sub-documents).</p>
 <tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
 <th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
 <tr>
+<td title='0x0013 = 19'>0x0013</td>
+<td>TimeCode</td>
+<td class=c>N</td>
+<td><span class=s><span class=n>(hours:minutes:seconds:frames)</span></span></td></tr>
+<tr class=b>
 <td title='0x0018 = 24'>0x0018</td>
 <td>DateTimeOriginal</td>
 <td class=c>N</td>
 <td><span class=s><span class=n>(combined with tag 0x19)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0070 = 112'>0x0070</td>
 <td>Camera1</td>
 <td class=c>-</td>
 <td>--&gt; <a href='H264.html#Camera1'>H264 Camera1 Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td title='0x0071 = 113'>0x0071</td>
 <td>Camera2</td>
 <td class=c>-</td>
 <td>--&gt; <a href='H264.html#Camera2'>H264 Camera2 Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0x007f = 127'>0x007f</td>
 <td>Shutter</td>
 <td class=c>-</td>
 <td>--&gt; <a href='H264.html#Shutter'>H264 Shutter Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td title='0x00a0 = 160'>0x00a0</td>
 <td>ExposureTime</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x00a1 = 161'>0x00a1</td>
 <td>FNumber</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x00a2 = 162'>0x00a2</td>
 <td>ExposureProgram</td>
 <td class=c>N</td>
@@ -87,44 +92,44 @@ which case subsequent occurrences are extracted as sub-documents).</p>
   <br>7 = Portrait
   <br>8 = Landscape</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr class=b>
+<tr>
 <td title='0x00a3 = 163'>0x00a3</td>
 <td>BrightnessValue</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x00a4 = 164'>0x00a4</td>
 <td>ExposureCompensation</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x00a5 = 165'>0x00a5</td>
 <td>MaxApertureValue</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x00a6 = 166'>0x00a6</td>
 <td>Flash</td>
 <td class=c>N</td>
 <td>--&gt; <a href='EXIF.html#Flash'>EXIF Flash Values</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0x00a7 = 167'>0x00a7</td>
 <td>CustomRendered</td>
 <td class=c>N</td>
 <td><span class=s>0 = Normal
   <br>1 = Custom</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x00a8 = 168'>0x00a8</td>
 <td>WhiteBalance</td>
 <td class=c>N</td>
 <td><span class=s>0 = Auto
   <br>1 = Manual</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x00a9 = 169'>0x00a9</td>
 <td>FocalLengthIn35mmFormat</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x00aa = 170'>0x00aa</td>
 <td>SceneCaptureType</td>
 <td class=c>N</td>
@@ -132,122 +137,122 @@ which case subsequent occurrences are extracted as sub-documents).</p>
   <br>1 = Landscape
   <br>2 = Portrait
   <br>3 = Night</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x00b0 = 176'>0x00b0</td>
 <td>GPSVersionID</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x00b1 = 177'>0x00b1</td>
 <td>GPSLatitudeRef</td>
 <td class=c>N</td>
 <td><span class=s>&#39;N&#39; = North
   <br>&#39;S&#39; = South</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x00b2 = 178'>0x00b2</td>
 <td>GPSLatitude</td>
 <td class=c>N</td>
 <td><span class=s><span class=n>(combined with tags 0xb3 and 0xb4)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x00b5 = 181'>0x00b5</td>
 <td>GPSLongitudeRef</td>
 <td class=c>N</td>
 <td><span class=s>&#39;E&#39; = East
   <br>&#39;W&#39; = West</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x00b6 = 182'>0x00b6</td>
 <td>GPSLongitude</td>
 <td class=c>N</td>
 <td><span class=s><span class=n>(combined with tags 0xb7 and 0xb8)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x00b9 = 185'>0x00b9</td>
 <td>GPSAltitudeRef</td>
 <td class=c>N</td>
 <td><span class=s>0 = Above Sea Level
   <br>1 = Below Sea Level</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x00ba = 186'>0x00ba</td>
 <td>GPSAltitude</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x00bb = 187'>0x00bb</td>
 <td>GPSTimeStamp</td>
 <td class=c>N</td>
 <td><span class=s><span class=n>(combined with tags 0xbc and 0xbd)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x00be = 190'>0x00be</td>
 <td>GPSStatus</td>
 <td class=c>N</td>
 <td><span class=s>&#39;A&#39; = Measurement Active
   <br>&#39;V&#39; = Measurement Void</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x00bf = 191'>0x00bf</td>
 <td>GPSMeasureMode</td>
 <td class=c>N</td>
 <td><span class=s>2 = 2-Dimensional Measurement
   <br>3 = 3-Dimensional Measurement</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x00c0 = 192'>0x00c0</td>
 <td>GPSDOP</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x00c1 = 193'>0x00c1</td>
 <td>GPSSpeedRef</td>
 <td class=c>N</td>
 <td><span class=s>&#39;K&#39; = km/h
   <br>&#39;M&#39; = mph
   <br>&#39;N&#39; = knots</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x00c2 = 194'>0x00c2</td>
 <td>GPSSpeed</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x00c3 = 195'>0x00c3</td>
 <td>GPSTrackRef</td>
 <td class=c>N</td>
 <td><span class=s>&#39;M&#39; = Magnetic North
   <br>&#39;T&#39; = True North</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x00c4 = 196'>0x00c4</td>
 <td>GPSTrack</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x00c5 = 197'>0x00c5</td>
 <td>GPSImgDirectionRef</td>
 <td class=c>N</td>
 <td><span class=s>&#39;M&#39; = Magnetic North
   <br>&#39;T&#39; = True North</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x00c6 = 198'>0x00c6</td>
 <td>GPSImgDirection</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x00c7 = 199'>0x00c7</td>
 <td>GPSMapDatum</td>
 <td class=c>N</td>
 <td><span class=s><span class=n>(combined with tag 0xc8)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x00e0 = 224'>0x00e0</td>
 <td>MakeModel</td>
 <td class=c>-</td>
 <td>--&gt; <a href='H264.html#MakeModel'>H264 MakeModel Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td title='0x00e1 = 225'>0x00e1</td>
 <td>RecInfo</td>
 <td class=c>-</td>
 <td>--&gt; <a href='H264.html#RecInfo'>H264 RecInfo Tags</a>
   <br><span class='n s'>(Canon only)</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x00e4 = 228'>0x00e4</td>
 <td>Model</td>
 <td class=c>N</td>
 <td><span class=s><span class=n>(Sony cameras only, combined with tags 0xe5 and 0xe6)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x00ee = 238'>0x00ee</td>
 <td>FrameInfo</td>
 <td class=c>-</td>
@@ -339,7 +344,8 @@ which case subsequent occurrences are extracted as sub-documents).</p>
 <td class=c>N</td>
 <td><span class=s>0x103 = Panasonic
   <br>0x108 = Sony
-  <br>0x1011 = Canon</span></td></tr>
+  <br>0x1011 = Canon
+  <br>0x1104 = JVC</span></td></tr>
 </table></td></tr></table></blockquote>
 
 <h2><a name='RecInfo'>H264 RecInfo Tags</a></h2>
@@ -381,7 +387,7 @@ which case subsequent occurrences are extracted as sub-documents).</p>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Aug 3, 2012</i>
+<br><i>Last revised May 15, 2013</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -124,7 +124,7 @@ official ID3 specification and
   <br>37 = Sound Clip
   <br>38 = Gospel
   <br>39 = Noise
-  <br>40 = AlternRock
+  <br>40 = Alt. Rock
   <br>41 = Bass
   <br>42 = Soul
   <br>43 = Punk
@@ -134,8 +134,8 @@ official ID3 specification and
   <br>47 = Instrumental Rock
   <br>48 = Ethnic
   <br>49 = Gothic
-  <br>50 = Darkwave</td><td>&nbsp;&nbsp;</td>
-  <td>51 = Techno-Industrial
+  <br>50 = Darkwave
+  <br>51 = Techno-Industrial
   <br>52 = Electronic
   <br>53 = Pop-Folk
   <br>54 = Eurodance
@@ -143,15 +143,15 @@ official ID3 specification and
   <br>56 = Southern Rock
   <br>57 = Comedy
   <br>58 = Cult
-  <br>59 = Gangsta
+  <br>59 = Gangsta Rap
   <br>60 = Top 40
   <br>61 = Christian Rap
   <br>62 = Pop/Funk
   <br>63 = Jungle
-  <br>64 = Native American
-  <br>65 = Cabaret
+  <br>64 = Native American</td><td>&nbsp;&nbsp;</td>
+  <td>65 = Cabaret
   <br>66 = New Wave
-  <br>67 = Psychadelic
+  <br>67 = Psychedelic
   <br>68 = Rave
   <br>69 = Showtunes
   <br>70 = Trailer
@@ -168,8 +168,8 @@ official ID3 specification and
   <br>81 = Folk-Rock
   <br>82 = National Folk
   <br>83 = Swing
-  <br>84 = Fast Fusion
-  <br>85 = Bebob
+  <br>84 = Fast-Fusion
+  <br>85 = Bebop
   <br>86 = Latin
   <br>87 = Revival
   <br>88 = Celtic
@@ -185,8 +185,8 @@ official ID3 specification and
   <br>98 = Easy Listening
   <br>99 = Acoustic
   <br>100 = Humour
-  <br>101 = Speech</td><td>&nbsp;&nbsp;</td>
-  <td>102 = Chanson
+  <br>101 = Speech
+  <br>102 = Chanson
   <br>103 = Opera
   <br>104 = Chamber Music
   <br>105 = Sonata
@@ -207,31 +207,75 @@ official ID3 specification and
   <br>120 = Duet
   <br>121 = Punk Rock
   <br>122 = Drum Solo
-  <br>123 = Acapella
+  <br>123 = A Cappella
   <br>124 = Euro-House
   <br>125 = Dance Hall
   <br>126 = Goa
   <br>127 = Drum &amp; Bass
   <br>128 = Club-House
-  <br>129 = Hardcore
-  <br>130 = Terror
+  <br>129 = Hardcore</td><td>&nbsp;&nbsp;</td>
+  <td>130 = Terror
   <br>131 = Indie
   <br>132 = BritPop
-  <br>133 = Negerpunk
+  <br>133 = Afro-Punk
   <br>134 = Polsk Punk
   <br>135 = Beat
-  <br>136 = Christian Gangsta
+  <br>136 = Christian Gangsta Rap
   <br>137 = Heavy Metal
   <br>138 = Black Metal
   <br>139 = Crossover
-  <br>140 = Contemporary C
+  <br>140 = Contemporary Christian
   <br>141 = Christian Rock
   <br>142 = Merengue
   <br>143 = Salsa
   <br>144 = Thrash Metal
   <br>145 = Anime
   <br>146 = JPop
-  <br>147 = SynthPop
+  <br>147 = Synthpop
+  <br>148 = Abstract
+  <br>149 = Art Rock
+  <br>150 = Baroque
+  <br>151 = Bhangra
+  <br>152 = Big Beat
+  <br>153 = Breakbeat
+  <br>154 = Chillout
+  <br>155 = Downtempo
+  <br>156 = Dub
+  <br>157 = EBM
+  <br>158 = Eclectic
+  <br>159 = Electro
+  <br>160 = Electroclash
+  <br>161 = Emo
+  <br>162 = Experimental
+  <br>163 = Garage
+  <br>164 = Global
+  <br>165 = IDM
+  <br>166 = Illbient
+  <br>167 = Industro-Goth
+  <br>168 = Jam Band
+  <br>169 = Krautrock
+  <br>170 = Leftfield
+  <br>171 = Lounge
+  <br>172 = Math Rock
+  <br>173 = New Romantic
+  <br>174 = Nu-Breakz
+  <br>175 = Post-Punk
+  <br>176 = Post-Rock
+  <br>177 = Psytrance
+  <br>178 = Shoegaze
+  <br>179 = Space Rock
+  <br>180 = Trop Rock
+  <br>181 = World Music
+  <br>182 = Neoclassical
+  <br>183 = Audiobook
+  <br>184 = Audio Theatre
+  <br>185 = Neue Deutsche Welle
+  <br>186 = Podcast
+  <br>187 = Indie Rock
+  <br>188 = G-Funk
+  <br>189 = Dubstep
+  <br>190 = Garage Rock
+  <br>191 = Psybient
   <br>255 = None
   <br>&#39;CR&#39; = Cover
   <br>&#39;RX&#39; = Remix</td><td>&nbsp;&nbsp;</td></tr></table>
@@ -1423,7 +1467,7 @@ if they do not appear in this table.</p>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Jan 17, 2013</i>
+<br><i>Last revised May 13, 2013</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -12,8 +12,8 @@ The tags listed below are part of the International Press Telecommunications
 Council (IPTC) and the Newspaper Association of America (NAA) Information
 Interchange Model (IIM).  This is an older meta information format, slowly
 being phased out in favor of XMP -- the newer IPTCCore specification uses
-XMP format.  IPTC information may be embedded in JPG, TIFF, PNG, MIFF, PS,
-PDF, PSD, XCF and DNG images.</p>
+XMP format.  IPTC information may be found in JPG, TIFF, PNG, MIFF, PS, PDF,
+PSD, XCF and DNG images.</p>
 
 <p>IPTC information is separated into different records, each of which has its
 own set of tags.  See
@@ -889,7 +889,7 @@ won&#39;t be able to read these tags as written by ExifTool)</span></span></td><
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Aug 3, 2012</i>
+<br><i>Last revised Oct 16, 2013</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -19,24 +19,24 @@ The following information is extracted from the JPEG JFIF header.  See
 <tr>
 <td class=r title='0 = 0x0'>0</td>
 <td>JFIFVersion</td>
-<td class=c>N</td>
+<td class=c title=' : = Mandatory'>N:</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
 <td class=r title='2 = 0x2'>2</td>
 <td>ResolutionUnit</td>
-<td class=c>int8u</td>
+<td class=c title=' : = Mandatory'>int8u:</td>
 <td><span class=s>0 = None
   <br>1 = inches
   <br>2 = cm</span></td></tr>
 <tr>
 <td class=r title='3 = 0x3'>3</td>
 <td>XResolution</td>
-<td class=c>int16u</td>
+<td class=c title=' : = Mandatory'>int16u:</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
 <td class=r title='5 = 0x5'>5</td>
 <td>YResolution</td>
-<td class=c>int16u</td>
+<td class=c title=' : = Mandatory'>int16u:</td>
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
@@ -55,7 +55,7 @@ The following information is extracted from the JPEG JFIF header.  See
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Jan 25, 2011</i>
+<br><i>Last revised Dec 18, 2013</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -65,7 +65,7 @@
   <br>FPXR
   <br>PreviewImage</td>
 <td class=c>-<br>-<br>N</td>
-<td>--&gt; <a href='JPEG.html#Scalado'>JPEG Scalado Tags</a>
+<td>--&gt; <a href='Scalado.html'>Scalado Tags</a>
   <br>--&gt; <a href='FlashPix.html'>FlashPix Tags</a>
   <br><span class=n>(continued from APP3)</span></td></tr>
 <tr class=b>
@@ -86,19 +86,31 @@
   <br>--&gt; <a href='HP.html#TDHD'>HP TDHD Tags</a></td></tr>
 <tr class=b>
 <td>'APP7'</td>
-<td>Qualcomm</td>
-<td class=c>-</td>
-<td>--&gt; <a href='Qualcomm.html'>Qualcomm Tags</a></td></tr>
+<td>Pentax
+  <br>Qualcomm</td>
+<td class=c>-<br>-</td>
+<td>--&gt; <a href='Pentax.html'>Pentax Tags</a>
+  <br>--&gt; <a href='Qualcomm.html'>Qualcomm Tags</a></td></tr>
 <tr>
 <td>'APP8'</td>
 <td>SPIFF</td>
 <td class=c>-</td>
 <td>--&gt; <a href='JPEG.html#SPIFF'>JPEG SPIFF Tags</a></td></tr>
 <tr class=b>
+<td>'APP9'</td>
+<td>MediaJukebox</td>
+<td class=c>-</td>
+<td>--&gt; <a href='JPEG.html#MediaJukebox'>JPEG MediaJukebox Tags</a></td></tr>
+<tr>
 <td>'APP10'</td>
 <td>Comment</td>
 <td class=c>N</td>
 <td><span class=s><span class=n>(PhotoStudio Unicode comment)</span></span></td></tr>
+<tr class=b>
+<td>'APP11'</td>
+<td>JPEG-HDR</td>
+<td class=c>-</td>
+<td>--&gt; <a href='JPEG.html#HDR'>JPEG HDR Tags</a></td></tr>
 <tr>
 <td>'APP12'</td>
 <td>PictureInfo
@@ -132,7 +144,7 @@
 <td>'DQT'</td>
 <td>DefineQuantizationTable</td>
 <td class=c>N</td>
-<td><span class=s><span class=n>(used to calculate the Extra:JPEGDigest tag value)</span></span></td></tr>
+<td><span class=s><span class=n>(used to calculate the Extra JPEGDigest tag value)</span></span></td></tr>
 <tr>
 <td>'SOF'</td>
 <td>StartOfFrame</td>
@@ -185,36 +197,6 @@ images).</p>
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
-<h2><a name='Scalado'>JPEG Scalado Tags</a></h2>
-<p>Tags extracted from the JPEG APP4 &quot;SCALADO&quot; segment (presumably written by
-Scalado mobile software, <a href="http://www.scalado.com/">http://www.scalado.com/</a>).</p>
-<blockquote>
-<table class=frame><tr><td>
-<table class=inner cellspacing=1>
-<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
-<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
-<tr>
-<td>'HGHT'</td>
-<td>PreviewImageHeight</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-<tr class=b>
-<td>'QUAL'</td>
-<td>PreviewQuality</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-<tr>
-<td>'SPMO'</td>
-<td>DataLength</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-<tr class=b>
-<td>'WDTH'</td>
-<td>PreviewImageWidth</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
-</table></td></tr></table></blockquote>
-
 <h2><a name='EPPIM'>JPEG EPPIM Tags</a></h2>
 <p>APP6 is used in by the Toshiba PDR-M700 to store a TIFF structure containing
 PrintIM information.</p>
@@ -397,6 +379,100 @@ SPIFF sample, version 1.2)</span></span></td></tr>
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
+<h2><a name='MediaJukebox'>JPEG MediaJukebox Tags</a></h2>
+<p>Tags found in the XML metadata of the &quot;Media Jukebox&quot; APP9 segment.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td>Album</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>Caption</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>Date</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>Keywords</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>Name</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>People</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>Places</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>Tool_Name</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>Tool_Version</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='HDR'>JPEG HDR Tags</a></h2>
+<p>Information extracted from APP11 of a JPEG-HDR image.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td>'RatioImage'</td>
+<td>RatioImage</td>
+<td class=c>N</td>
+<td><span class=s><span class=n>(the embedded JPEG-compressed ratio image)</span></span></td></tr>
+<tr class=b>
+<td>'alp'</td>
+<td>Alpha</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'bet'</td>
+<td>Beta</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'cor'</td>
+<td>CorrectionMethod</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'ln0'</td>
+<td>Ln0</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'ln1'</td>
+<td>Ln1</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'s2n'</td>
+<td>S2n</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'ver'</td>
+<td>JPEG-HDRVersion</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
 <h2><a name='AdobeCM'>JPEG AdobeCM Tags</a></h2>
 <p>The &quot;Adobe_CM&quot; APP13 segment presumably contains color management
 information, but the meaning of the data is currently unknown.  If anyone
@@ -517,7 +593,7 @@ because it may affect the appearance of the image.</p>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Apr 10, 2013</i>
+<br><i>Last revised Feb 19, 2014</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -290,7 +290,7 @@ exist)</span></td></tr>
   <br>ColorSpecData</td>
 <td class=c>-<br>N<br>N</td>
 <td>--&gt; <a href='ICC_Profile.html'>ICC_Profile Tags</a>
-  <br><span class=s>[!HTML]<table class=cols><tr>
+  <br><table class=cols><tr>
   <td>0 = Bi-level
   <br>1 = YCbCr(1)
   <br>3 = YCbCr(2)
@@ -310,7 +310,7 @@ exist)</span></td></tr>
   <br>22 = YPbPr(1125/60)
   <br>23 = YPbPr(1250/50)
   <br>24 = e-sYCC</td><td>&nbsp;&nbsp;</td></tr></table>
-</span></td></tr>
+</td></tr>
 </table></td></tr></table></blockquote>
 
 <h2><a name='FileType'>Jpeg2000 FileType Tags</a></h2>
@@ -458,7 +458,7 @@ exist)</span></td></tr>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Mar 15, 2013</i>
+<br><i>Last revised Jul 23, 2013</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -63,6 +63,7 @@ implements this policy and changes EXIF:Artist to a list-type tag.</p>
 <td class=c>Y</td>
 <td class=n>IPTC:City
   <br>XMP-photoshop:City
+  <br>XMP-iptcExt:LocationShownCity
   <br>CurrentIPTCDigest
   <br>IPTCDigest</td>
 <td>&nbsp;</td></tr>
@@ -80,6 +81,7 @@ implements this policy and changes EXIF:Artist to a list-type tag.</p>
 <td class=c>Y</td>
 <td class=n>IPTC:Country-PrimaryLocationName
   <br>XMP-photoshop:Country
+  <br>XMP-iptcExt:LocationShownCountryName
   <br>CurrentIPTCDigest
   <br>IPTCDigest</td>
 <td>&nbsp;</td></tr>
@@ -136,6 +138,7 @@ implements this policy and changes EXIF:Artist to a list-type tag.</p>
 <td class=c>Y</td>
 <td class=n>IPTC:Sub-location
   <br>XMP-iptcCore:Location
+  <br>XMP-iptcExt:LocationShownSublocation
   <br>CurrentIPTCDigest
   <br>IPTCDigest</td>
 <td>&nbsp;</td></tr>
@@ -172,6 +175,7 @@ implements this policy and changes EXIF:Artist to a list-type tag.</p>
 <td class=c>Y</td>
 <td class=n>IPTC:Province-State
   <br>XMP-photoshop:State
+  <br>XMP-iptcExt:LocationShownProvinceState
   <br>CurrentIPTCDigest
   <br>IPTCDigest</td>
 <td>&nbsp;</td></tr>
@@ -190,7 +194,7 @@ without the need to load the MWG Composite tags above.  See
 <tr>
 <td>RegionInfo</td>
 <td class=c>struct</td>
-<td>--&gt; <a href='XMP.html#RegionInfo'>RegionInfo Struct</a>
+<td>--&gt; <a href='MWG.html#RegionInfo'>MWG RegionInfo Struct</a>
   <br><span class='n s'>(called Regions by the spec)</span></td></tr>
 <tr class=b>
 <td>RegionAppliedToDimensions</td>
@@ -296,6 +300,22 @@ without the need to load the MWG Composite tags above.  See
   <br>&#39;Pet&#39; = Pet</span></td></tr>
 </table></td></tr></table></blockquote>
 
+<h2><a name='RegionInfo'>MWG RegionInfo Struct</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Field Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td>AppliedToDimensions</td>
+<td class=c>Dimensions</td>
+<td>--&gt; <a href='XMP.html#Dimensions'>Dimensions Struct</a></td></tr>
+<tr class=b>
+<td>RegionList</td>
+<td class=c title=' + = List'>MWG RegionStruct+</td>
+<td>--&gt; <a href='MWG.html#RegionStruct'>MWG RegionStruct Struct</a></td></tr>
+</table></td></tr></table></blockquote>
+
 <h2><a name='RegionStruct'>MWG RegionStruct Struct</a></h2>
 <blockquote>
 <table class=frame><tr><td>
@@ -366,7 +386,7 @@ accessed with different tag names, and to avoid infinite recursion.  See
 <tr>
 <td>KeywordInfo</td>
 <td class=c>struct</td>
-<td>--&gt; <a href='XMP.html#KeywordInfo'>KeywordInfo Struct</a>
+<td>--&gt; <a href='MWG.html#KeywordInfo'>MWG KeywordInfo Struct</a>
   <br><span class='n s'>(called Keywords by the spec)</span></td></tr>
 <tr class=b>
 <td>HierarchicalKeywords</td>
@@ -466,6 +486,18 @@ accessed with different tag names, and to avoid infinite recursion.  See
 <td><span class=s><span class=n>(KeywordsHierarchyKeyword)</span></span></td></tr>
 </table></td></tr></table></blockquote>
 
+<h2><a name='KeywordInfo'>MWG KeywordInfo Struct</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Field Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td>Hierarchy</td>
+<td class=c title=' + = List'>MWG KeywordStruct+</td>
+<td>--&gt; <a href='MWG.html#KeywordStruct'>MWG KeywordStruct Struct</a></td></tr>
+</table></td></tr></table></blockquote>
+
 <h2><a name='KeywordStruct'>MWG KeywordStruct Struct</a></h2>
 <blockquote>
 <table class=frame><tr><td>
@@ -498,7 +530,7 @@ belong to the ExifTool XMP-mwg-coll group.  See
 <tr>
 <td>Collections</td>
 <td class=c title=' + = List'>struct+</td>
-<td>--&gt; <a href='XMP.html#CollectionInfo'>CollectionInfo Struct</a></td></tr>
+<td>--&gt; <a href='MWG.html#CollectionInfo'>MWG CollectionInfo Struct</a></td></tr>
 <tr class=b>
 <td>CollectionName</td>
 <td class=c title=' _ = Flattened
@@ -511,9 +543,25 @@ belong to the ExifTool XMP-mwg-coll group.  See
 <td><span class=s><span class=n>(CollectionsCollectionURI)</span></span></td></tr>
 </table></td></tr></table></blockquote>
 
+<h2><a name='CollectionInfo'>MWG CollectionInfo Struct</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Field Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td>CollectionName</td>
+<td class=c>string</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>CollectionURI</td>
+<td class=c>string</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Jan 31, 2013</i>
+<br><i>Last revised Jul 22, 2013</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -3251,7 +3251,7 @@ because they are bulky 16-byte binary values.</p>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>SupportorAdministrationStatus</td>
+<td>SupportOrAdministrationStatus</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr>
@@ -6667,7 +6667,7 @@ because they are bulky 16-byte binary values.</p>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Jan 25, 2011</i>
+<br><i>Last revised Aug 7, 2013</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -1233,7 +1233,7 @@ are not shown because some are unruly GUID&#39;s.</p>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td>Filename</td>
+<td>WindowsFileName</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
@@ -1309,7 +1309,7 @@ are not shown because some are unruly GUID&#39;s.</p>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>Subtitle</td>
+<td>SubTitle</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr>
@@ -2060,7 +2060,7 @@ are not shown because some are unruly GUID&#39;s.</p>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Jan 2, 2013</i>
+<br><i>Last revised Nov 25, 2013</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -323,7 +323,7 @@ brackets if the original version of the lens has the same LensType.</p>
 </tr><tr><td>24.3</td><td>= Sigma 20-40mm F2.8 EX DG Aspherical IF</td>
 </tr><tr><td>24.4</td><td>= Sigma 18-200mm F3.5-6.3 DC</td>
 </tr><tr><td>24.5</td><td>= Sigma DC 18-125mm F4-5,6 D</td>
-</tr><tr><td>24.6</td><td>= Tamron SP AF 28-75mm F2.8 XR Di (IF) Macro</td>
+</tr><tr><td>24.6</td><td>= Tamron SP AF 28-75mm F2.8 XR Di LD Aspherical [IF] Macro</td>
 </tr><tr><td>25</td><td>= Minolta AF 100-300mm F4.5-5.6 APO (D) or Sigma Lens</td>
 </tr><tr><td>25.1</td><td>= Sigma 100-300mm F4 EX (APO (D) or D IF)</td>
 </tr><tr><td>25.2</td><td>= Sigma 70mm F2.8 EX DG Macro</td>
@@ -333,7 +333,7 @@ brackets if the original version of the lens has the same LensType.</p>
 </tr><tr><td>27</td><td>= Minolta AF 85mm F1.4 G (D)</td>
 </tr><tr><td>28</td><td>= Minolta/Sony AF 100mm F2.8 Macro (D) or Tamron Lens</td>
 </tr><tr><td>28.1</td><td>= Tamron SP AF 90mm F2.8 Di Macro</td>
-</tr><tr><td>28.2</td><td>= Tamron AF 180mm F3.5 SP Di LD [IF] Macro</td>
+</tr><tr><td>28.2</td><td>= Tamron SP AF 180mm F3.5 Di LD [IF] Macro</td>
 </tr><tr><td>29</td><td>= Minolta/Sony AF 75-300mm F4.5-5.6 (D)</td>
 </tr><tr><td>30</td><td>= Minolta AF 28-80mm F3.5-5.6 (D) or Sigma Lens</td>
 </tr><tr><td>30.1</td><td>= Sigma AF 10-20mm F4-5.6 EX DC</td>
@@ -362,10 +362,10 @@ brackets if the original version of the lens has the same LensType.</p>
 </tr><tr><td>50</td><td>= Sony DT 18-250mm F3.5-6.3 (SAL18250)</td>
 </tr><tr><td>51</td><td>= Sony DT 16-105mm F3.5-5.6 (SAL16105)</td>
 </tr><tr><td>52</td><td>= Sony 70-300mm F4.5-5.6 G SSM (SAL70300G) or Tamron Lens</td>
-</tr><tr><td>52.1</td><td>= Tamron SP 70-300mm F4-5.6 Di VC USD</td>
+</tr><tr><td>52.1</td><td>= Tamron SP 70-300mm F4-5.6 Di USD</td>
 </tr><tr><td>53</td><td>= Sony 70-400mm F4-5.6 G SSM (SAL70400G)</td>
 </tr><tr><td>54</td><td>= Carl Zeiss Vario-Sonnar T* 16-35mm F2.8 ZA SSM (SAL1635Z)</td>
-</tr><tr><td>55</td><td>= Sony DT 18-55mm F3.5-5.6 SAM (SAL1855)</td>
+</tr><tr><td>55</td><td>= Sony DT 18-55mm F3.5-5.6 SAM [II] (SAL1855)</td>
 </tr><tr><td>56</td><td>= Sony DT 55-200mm F4-5.6 SAM (SAL55200-2)</td>
 </tr><tr><td>57</td><td>= Sony DT 50mm F1.8 SAM (SAL50F18) or Tamron Lens</td>
 </tr><tr><td>57.1</td><td>= Tamron SP AF 60mm F2 Di II LD [IF] Macro 1:1</td>
@@ -379,14 +379,15 @@ brackets if the original version of the lens has the same LensType.</p>
 </tr><tr><td>64</td><td>= Sony 500mm F4.0 G SSM (SAL500F40G)</td>
 </tr><tr><td>65</td><td>= Sony DT 18-135mm F3.5-5.6 SAM (SAL18135)</td>
 </tr><tr><td>66</td><td>= Sony 300mm F2.8 G SSM II (SAL300F28G2)</td>
+</tr><tr><td>67</td><td>= Sony 70-200mm F2.8 G SSM II (SAL70200G2)</td>
 </tr><tr><td>68</td><td>= Sony DT 55-300mm F4.5-5.6 SAM (SAL55300)</td>
 </tr><tr><td>69</td><td>= Sony 70-400mm F4-5.6 G SSM II (SAL70400G2)</td>
 </tr><tr><td>70</td><td>= Carl Zeiss Planar T* 50mm F1.4 ZA SSM (SAL50F14Z)</td>
 </tr><tr><td>128</td><td>= Tamron or Sigma Lens (128)</td>
-</tr><tr><td>128.1</td><td>= Tamron 18-200mm F3.5-6.3</td>
-</tr><tr><td>128.2</td><td>= Tamron 28-300mm F3.5-6.3</td>
+</tr><tr><td>128.1</td><td>= Tamron AF 18-200mm F3.5-6.3 XR Di II LD Aspherical [IF] Macro</td>
+</tr><tr><td>128.2</td><td>= Tamron AF 28-300mm F3.5-6.3 XR Di LD Aspherical [IF] Macro</td>
 </tr><tr><td>128.3</td><td>= Tamron 80-300mm F3.5-6.3</td>
-</tr><tr><td>128.4</td><td>= Tamron AF 28-200mm F3.8-5.6 XR Di Aspherical [IF] MACRO</td>
+</tr><tr><td>128.4</td><td>= Tamron AF 28-200mm F3.8-5.6 XR Di Aspherical [IF] Macro</td>
 </tr><tr><td>128.5</td><td>= Tamron SP AF 17-35mm F2.8-4 Di LD Aspherical IF</td>
 </tr><tr><td>128.6</td><td>= Sigma AF 50-150mm F2.8 EX DC APO HSM II</td>
 </tr><tr><td>128.7</td><td>= Sigma 10-20mm F3.5 EX DC HSM</td>
@@ -396,6 +397,8 @@ brackets if the original version of the lens has the same LensType.</p>
 </tr><tr><td>128.11</td><td>= Sigma 85mm F1.4 EX DG HSM</td>
 </tr><tr><td>128.12</td><td>= Sigma 24-70mm F2.8 IF EX DG HSM</td>
 </tr><tr><td>128.13</td><td>= Sigma 18-250mm F3.5-6.3 DC OS HSM</td>
+</tr><tr><td>128.14</td><td>= Sigma 17-50mm F2.8 EX DC HSM</td>
+</tr><tr><td>128.15</td><td>= Sigma 17-70mm F2.8-4 DC Macro HSM</td>
 </tr><tr><td>129</td><td>= Tamron Lens (129)</td>
 </tr><tr><td>129.1</td><td>= Tamron 200-400mm F5.6 LD</td>
 </tr><tr><td>129.2</td><td>= Tamron 70-300mm F4-5.6 LD</td>
@@ -407,15 +410,17 @@ brackets if the original version of the lens has the same LensType.</p>
 </tr><tr><td>142</td><td>= Voigtlander 70-300mm F4.5-5.6</td>
 </tr><tr><td>146</td><td>= Voigtlander Macro APO-Lanthar 125mm F2.5 SL</td>
 </tr><tr><td>194</td><td>= Tamron SP AF 17-50mm F2.8 XR Di II LD Aspherical [IF]</td>
+</tr><tr><td>203</td><td>= Tamron SP 70-200mm F2.8 Di USD</td>
 </tr><tr><td>255</td><td>= Tamron Lens (255)</td>
 </tr><tr><td>255.1</td><td>= Tamron SP AF 17-50mm F2.8 XR Di II LD Aspherical</td>
 </tr><tr><td>255.2</td><td>= Tamron AF 18-250mm F3.5-6.3 XR Di II LD</td>
 </tr><tr><td>255.3</td><td>= Tamron AF 55-200mm F4-5.6 Di II LD Macro</td>
-</tr><tr><td>255.4</td><td>= Tamron AF 70-300mm F4-5.6 Di LD MACRO 1:2</td>
+</tr><tr><td>255.4</td><td>= Tamron AF 70-300mm F4-5.6 Di LD Macro 1:2</td>
 </tr><tr><td>255.5</td><td>= Tamron SP AF 200-500mm F5.0-6.3 Di LD IF</td>
 </tr><tr><td>255.6</td><td>= Tamron SP AF 10-24mm F3.5-4.5 Di II LD Aspherical IF</td>
 </tr><tr><td>255.7</td><td>= Tamron SP AF 70-200mm F2.8 Di LD IF Macro</td>
 </tr><tr><td>255.8</td><td>= Tamron SP AF 28-75mm F2.8 XR Di LD Aspherical IF</td>
+</tr><tr><td>255.9</td><td>= Tamron AF 90-300mm F4.5-5.6 Telemacro</td>
 </tr><tr><td>25501</td><td>= Minolta AF 50mm F1.7</td>
 </tr><tr><td>25511</td><td>= Minolta AF 35-70mm F4 or Other Lens</td>
 </tr><tr><td>25511.1</td><td>= Sigma UC AF 28-70mm F3.5-4.5</td>
@@ -434,6 +439,7 @@ brackets if the original version of the lens has the same LensType.</p>
 </tr><tr><td>25531</td><td>= Minolta AF 28-135mm F4-4.5 or Sigma Lens</td>
 </tr><tr><td>25531.1</td><td>= Sigma ZOOM-alpha 35-135mm F3.5-4.5</td>
 </tr><tr><td>25531.2</td><td>= Sigma 28-105mm F2.8-4 Aspherical</td>
+</tr><tr><td>25531.3</td><td>= Sigma 28-105mm F4-5.6 UC</td>
 </tr><tr><td>25541</td><td>= Minolta AF 35-105mm F3.5-4.5</td>
 </tr><tr><td>25551</td><td>= Minolta AF 70-210mm F4 Macro or Sigma Lens</td>
 </tr><tr><td>25551.1</td><td>= Sigma 70-210mm F4-5.6 APO</td>
@@ -529,29 +535,44 @@ brackets if the original version of the lens has the same LensType.</p>
 </tr><tr><td>45741.3</td><td>= Tokina 300mm F2.8 x2</td>
 </tr><tr><td>45751</td><td>= 1.4x Teleconverter</td>
 </tr><tr><td>45851</td><td>= Tamron SP AF 300mm F2.8 LD IF</td>
+</tr><tr><td>45861</td><td>= Tamron SP AF 35-105mm F2.8 LD Aspherical IF</td>
 </tr><tr><td>45871</td><td>= Tamron AF 70-210mm F2.8 SP LD</td>
+</tr><tr><td>61184</td><td>= Metabones Canon EF Adapter</td>
 </tr><tr><td>65535</td><td>= E-Mount, T-Mount, Other Lens or no lens</td>
 </tr><tr><td>65535.1</td><td>= Sony E 16mm F2.8</td>
-</tr><tr><td>65535.2</td><td>= Sony E 20mm F2.8</td>
-</tr><tr><td>65535.3</td><td>= Sony E 24mm F1.8 ZA</td>
-</tr><tr><td>65535.4</td><td>= Sony E 30mm F3.5 Macro</td>
-</tr><tr><td>65535.5</td><td>= Sony E 35mm F1.8 OSS</td>
-</tr><tr><td>65535.6</td><td>= Sony E 50mm F1.8 OSS</td>
-</tr><tr><td>65535.7</td><td>= Sony E 10-18mm F4 OSS</td>
-</tr><tr><td>65535.8</td><td>= Sony E PZ 16-50mm F3.5-5.6 OSS</td>
-</tr><tr><td>65535.9</td><td>= Sony E 18-55mm F3.5-5.6 OSS</td>
-</tr><tr><td>65535.10</td><td>= Sony E 18-200mm F3.5-6.3 OSS</td>
-</tr><tr><td>65535.11</td><td>= Sony E 55-210mm F4.5-6.3 OSS</td>
-</tr><tr><td>65535.12</td><td>= Sigma 19mm F2.8 EX DN</td>
-</tr><tr><td>65535.13</td><td>= Sigma 30mm F2.8 EX DN</td>
-</tr><tr><td>65535.14</td><td>= Tamron 18-200mm F3.5-6.3 Di III VC</td>
-</tr><tr><td>65535.15</td><td>= Arax MC 35mm F2.8 Tilt+Shift</td>
-</tr><tr><td>65535.16</td><td>= Arax MC 80mm F2.8 Tilt+Shift</td>
-</tr><tr><td>65535.17</td><td>= Zenitar MF 16mm F2.8 Fisheye M42</td>
-</tr><tr><td>65535.18</td><td>= Samyang 500mm Mirror F8.0</td>
-</tr><tr><td>65535.19</td><td>= Pentacon Auto 135mm F2.8</td>
-</tr><tr><td>65535.20</td><td>= Pentacon Auto 29mm F2.8</td>
-</tr><tr><td>65535.21</td><td>= Helios 44-2 58mm F2.0</td>
+</tr><tr><td>65535.2</td><td>= Sony E 18-55mm F3.5-5.6 OSS</td>
+</tr><tr><td>65535.3</td><td>= Sony E 55-210mm F4.5-6.3 OSS</td>
+</tr><tr><td>65535.4</td><td>= Sony E 18-200mm F3.5-6.3 OSS</td>
+</tr><tr><td>65535.5</td><td>= Sony E 30mm F3.5 Macro</td>
+</tr><tr><td>65535.6</td><td>= Sony E 24mm F1.8 ZA</td>
+</tr><tr><td>65535.7</td><td>= Sony E 50mm F1.8 OSS</td>
+</tr><tr><td>65535.8</td><td>= Sony E 16-70mm F4 ZA OSS</td>
+</tr><tr><td>65535.9</td><td>= Sony E 10-18mm F4 OSS</td>
+</tr><tr><td>65535.10</td><td>= Sony E PZ 16-50mm F3.5-5.6 OSS</td>
+</tr><tr><td>65535.11</td><td>= Sony FE 35mm F2.8 ZA</td>
+</tr><tr><td>65535.12</td><td>= Sony FE 24-70mm F4 ZA OSS</td>
+</tr><tr><td>65535.13</td><td>= Sony E 18-200mm F3.5-6.3 OSS LE</td>
+</tr><tr><td>65535.14</td><td>= Sony E 20mm F2.8</td>
+</tr><tr><td>65535.15</td><td>= Sony E 35mm F1.8 OSS</td>
+</tr><tr><td>65535.16</td><td>= Sony E PZ 18-105mm F4 G OSS</td>
+</tr><tr><td>65535.17</td><td>= Sony E PZ 18-200mm F3.5-6.3 OSS</td>
+</tr><tr><td>65535.18</td><td>= Sony FE 55mm F1.8 ZA</td>
+</tr><tr><td>65535.19</td><td>= Sony FE 28-70mm F3.5-5.6 OSS</td>
+</tr><tr><td>65535.20</td><td>= Sony FE 70-200mm F4 G OSS</td>
+</tr><tr><td>65535.21</td><td>= Sigma 19mm F2.8 [EX] DN</td>
+</tr><tr><td>65535.22</td><td>= Sigma 30mm F2.8 [EX] DN</td>
+</tr><tr><td>65535.23</td><td>= Sigma 60mm F2.8 DN</td>
+</tr><tr><td>65535.24</td><td>= Tamron 18-200mm F3.5-6.3 Di III VC</td>
+</tr><tr><td>65535.25</td><td>= Zeiss Touit 12mm F2.8</td>
+</tr><tr><td>65535.26</td><td>= Zeiss Touit 32mm F1.8</td>
+</tr><tr><td>65535.27</td><td>= Zeiss Touit 50mm F2.8 Macro</td>
+</tr><tr><td>65535.28</td><td>= Arax MC 35mm F2.8 Tilt+Shift</td>
+</tr><tr><td>65535.29</td><td>= Arax MC 80mm F2.8 Tilt+Shift</td>
+</tr><tr><td>65535.30</td><td>= Zenitar MF 16mm F2.8 Fisheye M42</td>
+</tr><tr><td>65535.31</td><td>= Samyang 500mm Mirror F8.0</td>
+</tr><tr><td>65535.32</td><td>= Pentacon Auto 135mm F2.8</td>
+</tr><tr><td>65535.33</td><td>= Pentacon Auto 29mm F2.8</td>
+</tr><tr><td>65535.34</td><td>= Helios 44-2 58mm F2.0</td>
 </tr></table></td></tr></table></blockquote>
 
 <h2><a name='CameraSettings'>Minolta CameraSettings Tags</a></h2>
@@ -2544,7 +2565,7 @@ DiMAGE X and Xt.</p>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Mar 20, 2013</i>
+<br><i>Last revised Feb 12, 2014</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -238,21 +238,26 @@ causes the other information to be re-encrypted with the new key)</span></span><
 <td class=c>-</td>
 <td>--&gt; <a href='Nikon.html#LocationInfo'>Nikon LocationInfo Tags</a></td></tr>
 <tr class=b>
+<td title='0x003d = 61'>0x003d</td>
+<td>BlackLevel</td>
+<td class=c>int16u[4]</td>
+<td>&nbsp;</td></tr>
+<tr>
 <td title='0x0080 = 128'>0x0080</td>
 <td>ImageAdjustment</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0081 = 129'>0x0081</td>
 <td>ToneComp</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x0082 = 130'>0x0082</td>
 <td>AuxiliaryLens</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0083 = 131'>0x0083</td>
 <td>LensType</td>
 <td class=c>int8u</td>
@@ -260,22 +265,22 @@ causes the other information to be re-encrypted with the new key)</span></span><
   <br>Bit 1 = D
   <br>Bit 2 = G
   <br>Bit 3 = VR</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0084 = 132'>0x0084</td>
 <td>Lens</td>
 <td class=c>rational64u[4]</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0085 = 133'>0x0085</td>
 <td>ManualFocusDistance</td>
 <td class=c>rational64u</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x0086 = 134'>0x0086</td>
 <td>DigitalZoom</td>
 <td class=c>rational64u</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0087 = 135'>0x0087</td>
 <td>FlashMode</td>
 <td class=c>int8u</td>
@@ -287,13 +292,13 @@ causes the other information to be re-encrypted with the new key)</span></span><
   <br>8 = Fired, Commander Mode
   <br>9 = Fired, TTL Mode</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr class=b>
+<tr>
 <td title='0x0088 = 136'>0x0088</td>
 <td>AFInfo</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Nikon.html#AFInfo'>Nikon AFInfo Tags</a>
   <br>--&gt; <a href='Nikon.html#AFInfo'>Nikon AFInfo Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td title='0x0089 = 137'>0x0089</td>
 <td>ShootingMode</td>
 <td class=c title=' ~ = Writable only with -n'>int16u~</td>
@@ -305,32 +310,32 @@ causes the other information to be re-encrypted with the new key)</span></span><
   <br>Bit 5 = Auto ISO
   <br>Bit 6 = White-Balance Bracketing
   <br>Bit 7 = IR Control</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x008b = 139'>0x008b</td>
 <td>LensFStops</td>
 <td class=c>undef[4]</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x008c = 140'>0x008c</td>
 <td>ContrastCurve</td>
 <td class=c title=' ! = Unsafe'>undef!</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x008d = 141'>0x008d</td>
 <td>ColorHue</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x008f = 143'>0x008f</td>
 <td>SceneMode</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x0090 = 144'>0x0090</td>
 <td>LightSource</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0091 = 145'>0x0091</td>
 <td>ShotInfoD40
   <br>ShotInfoD80
@@ -369,12 +374,12 @@ causes the other information to be re-encrypted with the new key)</span></span><
   <br>--&gt; <a href='Nikon.html#ShotInfoD7000'>Nikon ShotInfoD7000 Tags</a>
   <br>--&gt; <a href='Nikon.html#ShotInfo'>Nikon ShotInfo Tags</a>
   <br>--&gt; <a href='Nikon.html#ShotInfo'>Nikon ShotInfo Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0092 = 146'>0x0092</td>
 <td>HueAdjustment</td>
 <td class=c>int16s</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0093 = 147'>0x0093</td>
 <td>NEFCompression</td>
 <td class=c>int16u</td>
@@ -382,22 +387,22 @@ causes the other information to be re-encrypted with the new key)</span></span><
   <br>2 = Uncompressed
   <br>3 = Lossless
   <br>4 = Lossy (type 2)</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0094 = 148'>0x0094</td>
 <td>Saturation</td>
 <td class=c>int16s</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0095 = 149'>0x0095</td>
 <td>NoiseReduction</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x0096 = 150'>0x0096</td>
 <td>NEFLinearizationTable</td>
 <td class=c title=' ! = Unsafe'>undef!</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0097 = 151'>0x0097</td>
 <td>ColorBalance0100
   <br>ColorBalance0102
@@ -409,7 +414,7 @@ causes the other information to be re-encrypted with the new key)</span></span><
   <br>ColorBalance0213
   <br>ColorBalance0215
   <br>ColorBalanceUnknown</td>
-<td class=c>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>N</td>
+<td class=c>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-</td>
 <td>--&gt; <a href='Nikon.html#ColorBalance1'>Nikon ColorBalance1 Tags</a>
   <br>--&gt; <a href='Nikon.html#ColorBalance2'>Nikon ColorBalance2 Tags</a>
   <br>--&gt; <a href='Nikon.html#ColorBalance3'>Nikon ColorBalance3 Tags</a>
@@ -418,8 +423,9 @@ causes the other information to be re-encrypted with the new key)</span></span><
   <br>--&gt; <a href='Nikon.html#ColorBalance2'>Nikon ColorBalance2 Tags</a>
   <br>--&gt; <a href='Nikon.html#ColorBalance4'>Nikon ColorBalance4 Tags</a>
   <br>--&gt; <a href='Nikon.html#ColorBalance2'>Nikon ColorBalance2 Tags</a>
-  <br>--&gt; <a href='Nikon.html#ColorBalance4'>Nikon ColorBalance4 Tags</a></td></tr>
-<tr class=b>
+  <br>--&gt; <a href='Nikon.html#ColorBalance4'>Nikon ColorBalance4 Tags</a>
+  <br>--&gt; <a href='Nikon.html#ColorBalanceUnknown'>Nikon ColorBalanceUnknown Tags</a></td></tr>
+<tr>
 <td title='0x0098 = 152'>0x0098</td>
 <td>LensData0100
   <br>LensData0101
@@ -434,22 +440,22 @@ causes the other information to be re-encrypted with the new key)</span></span><
   <br>--&gt; <a href='Nikon.html#LensData0204'>Nikon LensData0204 Tags</a>
   <br>--&gt; <a href='Nikon.html#LensData0400'>Nikon LensData0400 Tags</a>
   <br>--&gt; <a href='Nikon.html#LensDataUnknown'>Nikon LensDataUnknown Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td title='0x0099 = 153'>0x0099</td>
 <td>RawImageCenter</td>
 <td class=c>int16u[2]</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x009a = 154'>0x009a</td>
 <td>SensorPixelSize</td>
 <td class=c>rational64u[2]</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x009c = 156'>0x009c</td>
 <td>SceneAssist</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x009e = 158'>0x009e</td>
 <td>RetouchHistory</td>
 <td class=c>int16u[10]</td>
@@ -486,33 +492,33 @@ causes the other information to be re-encrypted with the new key)</span></span><
   <br>38 = Selective Color
   <br>40 = Drawing</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr>
+<tr class=b>
 <td title='0x00a0 = 160'>0x00a0</td>
 <td>SerialNumber</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x00a2 = 162'>0x00a2</td>
 <td>ImageDataSize</td>
 <td class=c>int32u</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x00a5 = 165'>0x00a5</td>
 <td>ImageCount</td>
 <td class=c>int32u</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x00a6 = 166'>0x00a6</td>
 <td>DeletedImageCount</td>
 <td class=c>int32u</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x00a7 = 167'>0x00a7</td>
 <td>ShutterCount</td>
 <td class=c title=' ! = Unsafe'>int32u!</td>
 <td><span class=s><span class=n>(this value is used as a key to decrypt other information -- writing this tag
 causes the other information to be re-encrypted with the new key)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x00a8 = 168'>0x00a8</td>
 <td>FlashInfo0100
   <br>FlashInfo0102
@@ -523,37 +529,37 @@ causes the other information to be re-encrypted with the new key)</span></span><
   <br>--&gt; <a href='Nikon.html#FlashInfo0102'>Nikon FlashInfo0102 Tags</a>
   <br>--&gt; <a href='Nikon.html#FlashInfo0103'>Nikon FlashInfo0103 Tags</a>
   <br>--&gt; <a href='Nikon.html#FlashInfoUnknown'>Nikon FlashInfoUnknown Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td title='0x00a9 = 169'>0x00a9</td>
 <td>ImageOptimization</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x00aa = 170'>0x00aa</td>
 <td>Saturation</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x00ab = 171'>0x00ab</td>
 <td>VariProgram</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x00ac = 172'>0x00ac</td>
 <td>ImageStabilization</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x00ad = 173'>0x00ad</td>
 <td>AFResponse</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x00b0 = 176'>0x00b0</td>
 <td>MultiExposure</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Nikon.html#MultiExposure'>Nikon MultiExposure Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td title='0x00b1 = 177'>0x00b1</td>
 <td>HighISONoiseReduction</td>
 <td class=c>int16u</td>
@@ -566,43 +572,43 @@ causes the other information to be re-encrypted with the new key)</span></span><
   <br>5 = Medium High
   <br>6 = High</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr class=b>
+<tr>
 <td title='0x00b3 = 179'>0x00b3</td>
 <td>ToningEffect</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x00b6 = 182'>0x00b6</td>
 <td>PowerUpTime</td>
 <td class=c>undef</td>
 <td><span class=s><span class=n>(date/time when camera was last powered up)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x00b7 = 183'>0x00b7</td>
 <td>AFInfo2</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Nikon.html#AFInfo2'>Nikon AFInfo2 Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td title='0x00b8 = 184'>0x00b8</td>
 <td>FileInfo</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Nikon.html#FileInfo'>Nikon FileInfo Tags</a>
   <br>--&gt; <a href='Nikon.html#FileInfo'>Nikon FileInfo Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0x00b9 = 185'>0x00b9</td>
 <td>AFTune</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Nikon.html#AFTune'>Nikon AFTune Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td title='0x00bd = 189'>0x00bd</td>
 <td>PictureControlData</td>
 <td class=c title=' ! = Unsafe'>undef!</td>
 <td>--&gt; <a href='Nikon.html#PictureControl'>Nikon PictureControl Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0e00 = 3584'>0x0e00</td>
 <td>PrintIM</td>
 <td class=c>-</td>
 <td>--&gt; <a href='PrintIM.html'>PrintIM Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td title='0x0e01 = 3585'>0x0e01</td>
 <td>NikonCaptureData</td>
 <td class=c title=' ! = Unsafe'>undef!</td>
@@ -610,22 +616,22 @@ causes the other information to be re-encrypted with the new key)</span></span><
   <br><span class='n s'>(this data is dropped when copying Nikon MakerNotes since it may be too large
 to fit in the EXIF segment of a JPEG image, but it may be copied as a block
 into existing Nikon MakerNotes later if desired)</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0e09 = 3593'>0x0e09</td>
 <td>NikonCaptureVersion</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0e0e = 3598'>0x0e0e</td>
 <td>NikonCaptureOffsets</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Nikon.html#CaptureOffsets'>Nikon CaptureOffsets Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0e10 = 3600'>0x0e10</td>
 <td>NikonScanIFD</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Nikon.html#Scan'>Nikon Scan Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td title='0x0e13 = 3603'>0x0e13</td>
 <td>NikonCaptureEditVersions
   <br>NikonCaptureEditVersions</td>
@@ -633,17 +639,17 @@ into existing Nikon MakerNotes later if desired)</span></td></tr>
 <td><span class=n>(the ExtractEmbedded option may be used to decode settings from the stored
 edit versions, otherwise this is extracted as a binary data block)</span>
   <br>--&gt; <a href='NikonCapture.html'>NikonCapture Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0e1d = 3613'>0x0e1d</td>
 <td>NikonICCProfile</td>
 <td class=c title=' ! = Unsafe'>undef!</td>
 <td>--&gt; <a href='ICC_Profile.html'>ICC_Profile Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td title='0x0e1e = 3614'>0x0e1e</td>
 <td>NikonCaptureOutput</td>
 <td class=c title=' ! = Unsafe'>undef!</td>
 <td>--&gt; <a href='Nikon.html#CaptureOutput'>Nikon CaptureOutput Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0e22 = 3618'>0x0e22</td>
 <td>NEFBitDepth</td>
 <td class=c title=' ! = Unsafe'>int16u[4]!</td>
@@ -2124,6 +2130,19 @@ only valid for specific models.</p>
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
+<h2><a name='ColorBalanceUnknown'>Nikon ColorBalanceUnknown Tags</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index1</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='0 = 0x0'>0</td>
+<td>ColorBalanceVersion</td>
+<td class=c>undef[4]</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
 <h2><a name='LensData00'>Nikon LensData00 Tags</a></h2>
 <p>This structure is used by the D100, and D1X with firmware version 1.1.</p>
 <blockquote>
@@ -2481,9 +2500,9 @@ D200.</p>
 </tr><tr><td>'2 4'</td><td>= 2.04 (SB-600)</td>
 <td class=b>'5 2'</td><td class=b>= 5.02 (SB-900)</td>
 </tr><tr><td>'2 5'</td><td>= 2.05 (SB-600)</td>
-<td class=b>'7 1'</td><td class=b>= 7.01 (SB-910)</td>
+<td class=b>'6 1'</td><td class=b>= 6.01 (SB-700)</td>
 </tr><tr><td>'3 1'</td><td>= 3.01 (SU-800 Remote Commander)</td>
-<td class=b>&nbsp;</td><td class=b>&nbsp;</td>
+<td class=b>'7 1'</td><td class=b>= 7.01 (SB-910)</td>
 </tr></table></td></tr></table></blockquote>
 
 <h2><a name='FlashControlMode'>Nikon FlashControlMode Values</a></h2>
@@ -3471,27 +3490,41 @@ Nikon cameras such as the Coolpix S8000.</p>
 <tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
 <th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
 <tr>
+<td>'NCDB'</td>
+<td>NikonNCDB</td>
+<td class=c>-</td>
+<td>--&gt; <a href='Nikon.html#NCDB'>Nikon NCDB Tags</a></td></tr>
+<tr class=b>
 <td>'NCHD'</td>
 <td>MakerNoteVersion</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>'NCTG'</td>
 <td>NikonTags</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Nikon.html#NCTG'>Nikon NCTG Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>'NCTH'</td>
 <td>ThumbnailImage</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>'NCVW'</td>
 <td>PreviewImage</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
+<h2><a name='NCDB'>Nikon NCDB Tags</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr><td colspan=4 class=c><i>[no tags known]</i></td></tr>
+</table></td></tr></table></blockquote>
+
 <h2><a name='NCTG'>Nikon NCTG Tags</a></h2>
 <p>These tags are found in proprietary-format records of the NCTG atom in MOV
 videos from some Nikon cameras.</p>
@@ -4013,7 +4046,7 @@ ExifTool to choose in these cases (see the
 </tr><tr><td>'00 3F 2D 80 2C 40 00 06'</td><td>= Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) Macro (A14)</td>
 </tr><tr><td>'00 3F 80 A0 38 3F 00 02'</td><td>= Tamron SP AF 200-500mm f/5-6.3 Di (A08)</td>
 </tr><tr><td>'00 40 11 11 2C 2C 00 00'</td><td>= Samyang 8mm f/3.5 Fish-Eye</td>
-</tr><tr><td>'00 40 18 2B 2C 34 00 06'</td><td>= Tokina AT-X 107 DX Fisheye (AF 10-17mm f/3.5-4.5)</td>
+</tr><tr><td>'00 40 18 2B 2C 34 00 06'</td><td>= Tokina AT-X 107 AF DX Fisheye (AF 10-17mm f/3.5-4.5)</td>
 </tr><tr><td>'00 40 2A 72 2C 3C 00 06'</td><td>= Tokina AT-X 16.5-135 DX (AF 16.5-135mm F3.5-5.6)</td>
 </tr><tr><td>'00 40 2B 2B 2C 2C 00 02'</td><td>= Tokina AT-X 17 AF PRO (AF 17mm f/3.5)</td>
 </tr><tr><td>'00 40 2D 2D 2C 2C 00 00'</td><td>= Carl Zeiss Distagon T* 3.5/18 ZF.2</td>
@@ -4054,7 +4087,7 @@ ExifTool to choose in these cases (see the
 </tr><tr><td>'00 54 56 56 30 30 00 00'</td><td>= Coastal Optical Systems 60mm 1:4 UV-VIS-IR Macro Apo</td>
 </tr><tr><td>'00 54 62 62 0C 0C 00 00'</td><td>= Carl Zeiss Planar T* 1.4/85 ZF.2</td>
 </tr><tr><td>'00 54 68 68 18 18 00 00'</td><td>= Carl Zeiss Makro-Planar T* 2/100 ZF.2</td>
-</tr><tr><td>'00 54 68 68 24 24 00 02'</td><td>= Tokina AT-X M100 PRO D (AF 100mm f/2.8 Macro)</td>
+</tr><tr><td>'00 54 68 68 24 24 00 02'</td><td>= Tokina AT-X M100 AF PRO D (AF 100mm f/2.8 Macro)</td>
 </tr><tr><td>'00 54 8E 8E 24 24 00 02'</td><td>= Tokina AT-X 300 AF PRO (AF 300mm f/2.8)</td>
 </tr><tr><td>'00 58 64 64 20 20 00 00'</td><td>= Soligor C/D Macro MC 90mm f/2.5</td>
 </tr><tr><td>'01 00 00 00 00 00 02 00'</td><td>= TC-16A</td>
@@ -4071,6 +4104,7 @@ ExifTool to choose in these cases (see the
 </tr><tr><td>'02 3F 3C 5C 2D 35 02 00'</td><td>= Sigma 28-70mm F3.5-4.5 UC</td>
 </tr><tr><td>'02 40 44 5C 2C 34 02 00'</td><td>= Exakta AF 35-70mm 1:3.5-4.5 MC</td>
 </tr><tr><td>'02 40 44 73 2B 36 02 00'</td><td>= Sigma 35-135mm F3.5-4.5 a</td>
+</tr><tr><td>'02 40 5C 82 2C 35 02 00'</td><td>= Sigma APO 70-210mm F3.5-4.5</td>
 </tr><tr><td>'02 42 44 5C 2A 34 02 00'</td><td>= AF Zoom-Nikkor 35-70mm f/3.3-4.5</td>
 </tr><tr><td>'02 42 44 5C 2A 34 08 00'</td><td>= AF Zoom-Nikkor 35-70mm f/3.3-4.5</td>
 </tr><tr><td>'02 46 37 37 25 25 02 00'</td><td>= Sigma 24mm F2.8 Super Wide II Macro</td>
@@ -4155,7 +4189,7 @@ ExifTool to choose in these cases (see the
 </tr><tr><td>'26 3D 3C 80 2F 3D 1C 02'</td><td>= Sigma 28-300mm F3.8-5.6 Aspherical</td>
 </tr><tr><td>'26 3E 3C 6A 2E 3C 1C 02'</td><td>= Sigma 28-105mm F3.8-5.6 UC-III Aspherical IF</td>
 </tr><tr><td>'26 40 27 3F 2C 34 1C 02'</td><td>= Sigma 15-30mm F3.5-4.5 EX DG Aspherical DF</td>
-</tr><tr><td>'26 40 2D 44 2B 34 1C 02'</td><td>= Sigma 18-35 F3.5-4.5 Aspherical</td>
+</tr><tr><td>'26 40 2D 44 2B 34 1C 02'</td><td>= Sigma 18-35mm F3.5-4.5 Aspherical</td>
 </tr><tr><td>'26 40 2D 50 2C 3C 1C 06'</td><td>= Sigma 18-50mm F3.5-5.6 DC</td>
 </tr><tr><td>'26 40 2D 70 2B 3C 1C 06'</td><td>= Sigma 18-125mm F3.5-5.6 DC</td>
 </tr><tr><td>'26 40 2D 80 2C 40 1C 06'</td><td>= Sigma 18-200mm F3.5-6.3 DC</td>
@@ -4248,12 +4282,12 @@ ExifTool to choose in these cases (see the
 </tr><tr><td>'48 48 24 24 24 24 4B 02'</td><td>= Sigma 14mm F2.8 EX Aspherical HSM</td>
 </tr><tr><td>'48 48 2B 44 24 30 4B 06'</td><td>= Sigma 17-35mm F2.8-4 EX DG  Aspherical HSM</td>
 </tr><tr><td>'48 48 68 8E 30 30 4B 02'</td><td>= Sigma 100-300mm F4 EX IF HSM</td>
-</tr><tr><td>'48 48 76 76 24 24 4B 06'</td><td>= Sigma 150mm F2.8 EX DG APO Macro HSM</td>
+</tr><tr><td>'48 48 76 76 24 24 4B 06'</td><td>= Sigma APO Macro 150mm F2.8 EX DG HSM</td>
 </tr><tr><td>'48 48 8E 8E 24 24 4B 02'</td><td>= AF-S Nikkor 300mm f/2.8D IF-ED</td>
 </tr><tr><td>'48 48 8E 8E 24 24 E1 02'</td><td>= AF-S Nikkor 300mm f/2.8D IF-ED + TC-17E</td>
 </tr><tr><td>'48 48 8E 8E 24 24 F1 02'</td><td>= AF-S Nikkor 300mm f/2.8D IF-ED + TC-14E</td>
 </tr><tr><td>'48 48 8E 8E 24 24 F2 02'</td><td>= AF-S Nikkor 300mm f/2.8D IF-ED + TC-20E</td>
-</tr><tr><td>'48 4C 7C 7C 2C 2C 4B 02'</td><td>= Sigma 180mm F3.5 EX DG Macro</td>
+</tr><tr><td>'48 4C 7C 7C 2C 2C 4B 02'</td><td>= Sigma APO Macro 180mm F3.5 EX DG HSM</td>
 </tr><tr><td>'48 4C 7D 7D 2C 2C 4B 02'</td><td>= Sigma APO Macro 180mm F3.5 EX DG HSM</td>
 </tr><tr><td>'48 54 3E 3E 0C 0C 4B 06'</td><td>= Sigma 30mm F1.4 EX DC HSM</td>
 </tr><tr><td>'48 54 5C 80 24 24 4B 02'</td><td>= Sigma 70-200mm F2.8 EX APO IF HSM</td>
@@ -4304,7 +4338,7 @@ ExifTool to choose in these cases (see the
 </tr><tr><td>'67 54 37 5C 24 24 1C 02'</td><td>= Sigma 24-70mm F2.8 EX DG Macro</td>
 </tr><tr><td>'68 42 3C 60 2A 3C 6E 06'</td><td>= AF Zoom-Nikkor 28-80mm f/3.3-5.6G</td>
 </tr><tr><td>'69 47 5C 8E 30 3C 00 02'</td><td>= Tamron AF 70-300mm f/4-5.6 Di LD Macro 1:2 (A17N)</td>
-</tr><tr><td>'69 48 5C 8E 30 3C 6F 02'</td><td>= Tamron AF 70-300mm f/4-5.6 LD Macro 1:2 (772D)</td>
+</tr><tr><td>'69 48 5C 8E 30 3C 6F 02'</td><td>= Tamron AF 70-300mm f/4-5.6 LD Macro 1:2 (572D/772D)</td>
 </tr><tr><td>'69 48 5C 8E 30 3C 6F 06'</td><td>= AF Zoom-Nikkor 70-300mm f/4-5.6G</td>
 </tr><tr><td>'6A 48 8E 8E 30 30 70 02'</td><td>= AF-S Nikkor 300mm f/4D IF-ED</td>
 </tr><tr><td>'6B 48 24 24 24 24 71 02'</td><td>= AF Nikkor ED 14mm f/2.8D</td>
@@ -4321,6 +4355,7 @@ ExifTool to choose in these cases (see the
 </tr><tr><td>'78 40 37 6E 2C 3C 7C 0E'</td><td>= AF-S VR Zoom-Nikkor 24-120mm f/3.5-5.6G IF-ED</td>
 </tr><tr><td>'79 40 11 11 2C 2C 1C 06'</td><td>= Sigma 8mm F3.5 EX Circular Fisheye</td>
 </tr><tr><td>'79 40 3C 80 2C 3C 7F 06'</td><td>= AF Zoom-Nikkor 28-200mm f/3.5-5.6G IF-ED</td>
+</tr><tr><td>'79 48 3C 5C 24 24 1C 06'</td><td>= Sigma 28-70mm F2.8 EX DG</td>
 </tr><tr><td>'79 48 5C 5C 24 24 1C 06'</td><td>= Sigma Macro 70mm F2.8 EX DG</td>
 </tr><tr><td>'7A 3B 53 80 30 3C 4B 06'</td><td>= Sigma 55-200mm F4-5.6 DC HSM</td>
 </tr><tr><td>'7A 3C 1F 37 30 30 7E 06.1'</td><td>= AF-S DX Zoom-Nikkor 12-24mm f/4G IF-ED</td>
@@ -4346,16 +4381,20 @@ ExifTool to choose in these cases (see the
 </tr><tr><td>'8A 54 6A 6A 24 24 8C 0E'</td><td>= AF-S VR Micro-Nikkor 105mm f/2.8G IF-ED</td>
 </tr><tr><td>'8B 40 2D 80 2C 3C 8D 0E'</td><td>= AF-S DX VR Zoom-Nikkor 18-200mm f/3.5-5.6G IF-ED</td>
 </tr><tr><td>'8B 40 2D 80 2C 3C FD 0E'</td><td>= AF-S DX VR Zoom-Nikkor 18-200mm f/3.5-5.6G IF-ED [II]</td>
+</tr><tr><td>'8B 4C 2D 44 14 14 4B 06'</td><td>= Sigma 18-35mm F1.8 DC HSM</td>
 </tr><tr><td>'8C 40 2D 53 2C 3C 8E 06'</td><td>= AF-S DX Zoom-Nikkor 18-55mm f/3.5-5.6G ED</td>
 </tr><tr><td>'8D 44 5C 8E 34 3C 8F 0E'</td><td>= AF-S VR Zoom-Nikkor 70-300mm f/4.5-5.6G IF-ED</td>
+</tr><tr><td>'8E 3C 2B 5C 24 30 4B 0E'</td><td>= Sigma 17-70mm F2.8-4 DC Macro OS HSM Contemporary</td>
 </tr><tr><td>'8F 40 2D 72 2C 3C 91 06'</td><td>= AF-S DX Zoom-Nikkor 18-135mm f/3.5-5.6G IF-ED</td>
 </tr><tr><td>'90 3B 53 80 30 3C 92 0E'</td><td>= AF-S DX VR Zoom-Nikkor 55-200mm f/4-5.6G IF-ED</td>
+</tr><tr><td>'91 54 44 44 0C 0C 4B 06'</td><td>= Sigma 35mm F1.4 DG HSM</td>
 </tr><tr><td>'92 2C 2D 88 2C 40 4B 0E'</td><td>= Sigma 18-250mm F3.5-6.3 DC Macro OS HSM</td>
 </tr><tr><td>'92 48 24 37 24 24 94 06'</td><td>= AF-S Zoom-Nikkor 14-24mm f/2.8G ED</td>
 </tr><tr><td>'93 48 37 5C 24 24 95 06'</td><td>= AF-S Zoom-Nikkor 24-70mm f/2.8G ED</td>
 </tr><tr><td>'94 40 2D 53 2C 3C 96 06'</td><td>= AF-S DX Zoom-Nikkor 18-55mm f/3.5-5.6G ED II</td>
 </tr><tr><td>'95 00 37 37 2C 2C 97 06'</td><td>= PC-E Nikkor 24mm f/3.5D ED</td>
 </tr><tr><td>'95 4C 37 37 2C 2C 97 02'</td><td>= PC-E Nikkor 24mm f/3.5D ED</td>
+</tr><tr><td>'96 38 1F 37 34 3C 4B 06'</td><td>= Sigma 12-24mm F4.5-5.6 II DG HSM</td>
 </tr><tr><td>'96 48 98 98 24 24 98 0E'</td><td>= AF-S VR Nikkor 400mm f/2.8G ED</td>
 </tr><tr><td>'97 3C A0 A0 30 30 99 0E'</td><td>= AF-S VR Nikkor 500mm f/4G ED</td>
 </tr><tr><td>'98 3C A6 A6 30 30 9A 0E'</td><td>= AF-S VR Nikkor 600mm f/4G ED</td>
@@ -4373,9 +4412,13 @@ ExifTool to choose in these cases (see the
 </tr><tr><td>'9E 40 2D 6A 2C 3C A0 0E'</td><td>= AF-S DX VR Zoom-Nikkor 18-105mm f/3.5-5.6G ED</td>
 </tr><tr><td>'9F 37 50 A0 34 40 4B 0E'</td><td>= Sigma 50-500mm F4.5-6.3 DG OS HSM</td>
 </tr><tr><td>'9F 58 44 44 14 14 A1 06'</td><td>= AF-S DX Nikkor 35mm f/1.8G</td>
+</tr><tr><td>'A0 40 2D 74 2C 3C BB 0E'</td><td>= AF-S DX Nikkor 18-140mm f/3.5-5.6G ED VR</td>
+</tr><tr><td>'A0 48 2A 5C 24 30 4B 0E'</td><td>= Sigma 17-70mm F2.8-4 DC Macro OS HSM</td>
 </tr><tr><td>'A0 54 50 50 0C 0C A2 06'</td><td>= AF-S Nikkor 50mm f/1.4G</td>
 </tr><tr><td>'A1 40 18 37 2C 34 A3 06'</td><td>= AF-S DX Nikkor 10-24mm f/3.5-4.5G ED</td>
 </tr><tr><td>'A1 41 19 31 2C 2C 4B 06'</td><td>= Sigma 10-20mm F3.5 EX DC HSM</td>
+</tr><tr><td>'A1 54 55 55 0C 0C BC 06'</td><td>= AF-S Nikkor 58mm f/1.4G</td>
+</tr><tr><td>'A2 40 2D 53 2C 3C BD 0E'</td><td>= AF-S DX VR Nikkor 18-55mm f/3.5-5.6G II</td>
 </tr><tr><td>'A2 48 5C 80 24 24 A4 0E'</td><td>= AF-S Nikkor 70-200mm f/2.8G ED VR II</td>
 </tr><tr><td>'A3 3C 29 44 30 30 A5 0E'</td><td>= AF-S Nikkor 16-35mm f/4G ED VR</td>
 </tr><tr><td>'A3 3C 5C 8E 30 3C 4B 0E'</td><td>= Sigma 70-300mm F4-5.6 DG OS</td>
@@ -4402,6 +4445,7 @@ ExifTool to choose in these cases (see the
 </tr><tr><td>'B5 4C 3C 3C 14 14 B7 06'</td><td>= AF-S Nikkor 28mm f/1.8G</td>
 </tr><tr><td>'B6 48 37 56 24 24 1C 02'</td><td>= Sigma 24-60mm F2.8 EX DG</td>
 </tr><tr><td>'B7 44 60 98 34 3C B9 0E'</td><td>= AF-S Nikkor 80-400mm f/4.5-5.6G ED VR</td>
+</tr><tr><td>'B8 40 2D 44 2C 34 BA 06'</td><td>= AF-S Nikkor 18-35mm f/3.5-4.5G ED</td>
 </tr><tr><td>'CD 3D 2D 70 2E 3C 4B 0E'</td><td>= Sigma 18-125mm F3.8-5.6 DC OS HSM</td>
 </tr><tr><td>'CE 34 76 A0 38 40 4B 0E'</td><td>= Sigma 150-500mm F5-6.3 DG OS APO HSM</td>
 </tr><tr><td>'CF 38 6E 98 34 3C 4B 0E'</td><td>= Sigma APO 120-400mm F4.5-5.6 DG OS HSM</td>
@@ -4413,6 +4457,7 @@ ExifTool to choose in these cases (see the
 </tr><tr><td>'E5 54 6A 6A 24 24 35 02'</td><td>= Sigma Macro 105mm F2.8 EX DG</td>
 </tr><tr><td>'E6 41 3C 8E 2C 40 1C 02'</td><td>= Sigma 28-300mm F3.5-6.3 DG Macro</td>
 </tr><tr><td>'E9 54 37 5C 24 24 1C 02'</td><td>= Sigma 24-70mm F2.8 EX DG Macro</td>
+</tr><tr><td>'EA 48 27 27 24 24 1C 02'</td><td>= Sigma 15mm F2.8 EX Diagonal Fisheye</td>
 </tr><tr><td>'ED 40 2D 80 2C 40 4B 0E'</td><td>= Sigma 18-200mm F3.5-6.3 DC OS HSM</td>
 </tr><tr><td>'EE 48 5C 80 24 24 4B 06'</td><td>= Sigma 70-200mm F2.8 EX APO DG Macro HSM II</td>
 </tr><tr><td>'F0 38 1F 37 34 3C 4B 06'</td><td>= Sigma 12-24mm F4.5-5.6 EX DG Aspherical HSM</td>
@@ -4423,7 +4468,7 @@ ExifTool to choose in these cases (see the
 </tr><tr><td>'F3 54 2B 50 24 24 84 0E'</td><td>= Tamron SP AF 17-50mm f/2.8 XR Di II VC LD Aspherical (IF) (B005)</td>
 </tr><tr><td>'F4 54 56 56 18 18 84 06'</td><td>= Tamron SP AF 60mm f/2.0 Di II Macro 1:1 (G005)</td>
 </tr><tr><td>'F5 40 2C 8A 2C 40 40 0E'</td><td>= Tamron AF 18-270mm f/3.5-6.3 Di II VC LD Aspherical (IF) Macro (B003)</td>
-</tr><tr><td>'F5 48 76 76 24 24 4B 06'</td><td>= Sigma 150mm F2.8 EX DG APO Macro HSM</td>
+</tr><tr><td>'F5 48 76 76 24 24 4B 06'</td><td>= Sigma APO Macro 150mm F2.8 EX DG HSM</td>
 </tr><tr><td>'F6 3F 18 37 2C 34 84 06'</td><td>= Tamron SP AF 10-24mm f/3.5-4.5 Di II LD Aspherical (IF) (B001)</td>
 </tr><tr><td>'F6 48 2D 50 24 24 4B 06'</td><td>= Sigma 18-50mm F2.8 EX DC Macro</td>
 </tr><tr><td>'F7 53 5C 80 24 24 40 06'</td><td>= Tamron SP AF 70-200mm f/2.8 Di LD (IF) Macro (A001)</td>
@@ -4434,20 +4479,23 @@ ExifTool to choose in these cases (see the
 </tr><tr><td>'F9 3C 19 31 30 3C 4B 06'</td><td>= Sigma 10-20mm F4-5.6 EX DC HSM</td>
 </tr><tr><td>'F9 40 3C 8E 2C 40 40 0E'</td><td>= Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical (IF) Macro (A20)</td>
 </tr><tr><td>'FA 54 3C 5E 24 24 84 06'</td><td>= Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical (IF) Macro (A09NII)</td>
-</tr><tr><td>'FA 54 3C 5E 24 24 DF 06'</td><td>= Tamron SP AF 28-75mm F/2.8 XR Di LD Aspherical (IF) Macro (A09NII)</td>
+</tr><tr><td>'FA 54 3C 5E 24 24 DF 06'</td><td>= Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical (IF) Macro (A09NII)</td>
 </tr><tr><td>'FA 54 6E 8E 24 24 4B 02'</td><td>= Sigma APO 120-300mm F2.8 EX DG HSM</td>
 </tr><tr><td>'FB 54 2B 50 24 24 84 06'</td><td>= Tamron SP AF 17-50mm f/2.8 XR Di II LD Aspherical (IF) (A16NII)</td>
 </tr><tr><td>'FB 54 8E 8E 24 24 4B 02'</td><td>= Sigma APO 300mm F2.8 EX DG HSM</td>
 </tr><tr><td>'FC 40 2D 80 2C 40 DF 06'</td><td>= Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) Macro (A14NII)</td>
 </tr><tr><td>'FD 47 50 76 24 24 4B 06'</td><td>= Sigma 50-150mm F2.8 EX APO DC HSM II</td>
 </tr><tr><td>'FE 47 00 00 24 24 4B 06'</td><td>= Sigma 4.5mm F2.8 EX DC HSM Circular Fisheye</td>
-</tr><tr><td>'FE 48 37 5C 24 24 DF 0E'</td><td>= Tamron SP 24-70mm f/2.8 Di VC USD</td>
+</tr><tr><td>'FE 48 37 5C 24 24 DF 0E'</td><td>= Tamron SP 24-70mm f/2.8 Di VC USD (A007)</td>
 </tr><tr><td>'FE 53 5C 80 24 24 84 06'</td><td>= Tamron SP AF 70-200mm f/2.8 Di LD (IF) Macro (A001)</td>
+</tr><tr><td>'FE 54 5C 80 24 24 DF 0E'</td><td>= Tamron SP 70-200mm f/2.8 Di VC USD (A009)</td>
+</tr><tr><td>'FE 54 64 64 24 24 DF 0E'</td><td>= Tamron SP 90mm f/2.8 Di VC USD Macro 1:1 (F004)</td>
+</tr><tr><td>'FF 40 2D 80 2C 40 4B 06'</td><td>= Sigma 18-200mm F3.5-6.3 DC</td>
 </tr></table></td></tr></table></blockquote>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Apr 10, 2013</i>
+<br><i>Last revised Feb 3, 2014</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -730,263 +730,272 @@ Vivitar are not listed.</p>
 <table class='inner sep' cellspacing=1>
 <tr class=h><th>Value</th><th>CameraType</th><th>Value</th><th>CameraType</th><th>Value</th><th>CameraType</th></tr>
 <tr><td>'D4028'</td><td>= X-2,C-50Z</td>
-<td class=b>'D4381'</td><td class=b>= uT8000,ST8000</td>
-<td>'S0010'</td><td>= E-510</td>
-</tr><tr><td>'D4029'</td><td>= E-20,E-20N,E-20P</td>
-<td class=b>'D4382'</td><td class=b>= u9000,S9000</td>
+<td class=b>'D4385'</td><td class=b>= FE3010,X895</td>
 <td>'S0011'</td><td>= E-3</td>
-</tr><tr><td>'D4034'</td><td>= C720UZ</td>
-<td class=b>'D4384'</td><td class=b>= SP590UZ</td>
+</tr><tr><td>'D4029'</td><td>= E-20,E-20N,E-20P</td>
+<td class=b>'D4386'</td><td class=b>= FE3000,X890</td>
 <td>'S0013'</td><td>= E-410</td>
-</tr><tr><td>'D4040'</td><td>= E-1</td>
-<td class=b>'D4385'</td><td class=b>= FE3010,X895</td>
+</tr><tr><td>'D4034'</td><td>= C720UZ</td>
+<td class=b>'D4387'</td><td class=b>= FE35,X30</td>
 <td>'S0016'</td><td>= E-420</td>
-</tr><tr><td>'D4041'</td><td>= E-300</td>
-<td class=b>'D4386'</td><td class=b>= FE3000,X890</td>
+</tr><tr><td>'D4040'</td><td>= E-1</td>
+<td class=b>'D4388'</td><td class=b>= u550WP,S550WP</td>
 <td>'S0017'</td><td>= E-30</td>
-</tr><tr><td>'D4083'</td><td>= C2Z,D520Z,C220Z</td>
-<td class=b>'D4387'</td><td class=b>= FE35,X30</td>
+</tr><tr><td>'D4041'</td><td>= E-300</td>
+<td class=b>'D4390'</td><td class=b>= FE5000,X905</td>
 <td>'S0018'</td><td>= E-520</td>
-</tr><tr><td>'D4106'</td><td>= u20D,S400D,u400D</td>
-<td class=b>'D4388'</td><td class=b>= u550WP,S550WP</td>
+</tr><tr><td>'D4083'</td><td>= C2Z,D520Z,C220Z</td>
+<td class=b>'D4391'</td><td class=b>= u5000</td>
 <td>'S0019'</td><td>= E-P1</td>
-</tr><tr><td>'D4120'</td><td>= X-1</td>
-<td class=b>'D4390'</td><td class=b>= FE5000,X905</td>
+</tr><tr><td>'D4106'</td><td>= u20D,S400D,u400D</td>
+<td class=b>'D4392'</td><td class=b>= u7000,S7000</td>
 <td>'S0023'</td><td>= E-620</td>
-</tr><tr><td>'D4122'</td><td>= u10D,S300D,u300D</td>
-<td class=b>'D4391'</td><td class=b>= u5000</td>
+</tr><tr><td>'D4120'</td><td>= X-1</td>
+<td class=b>'D4396'</td><td class=b>= FE5010,X915</td>
 <td>'S0026'</td><td>= E-P2</td>
-</tr><tr><td>'D4125'</td><td>= AZ-1</td>
-<td class=b>'D4392'</td><td class=b>= u7000,S7000</td>
+</tr><tr><td>'D4122'</td><td>= u10D,S300D,u300D</td>
+<td class=b>'D4397'</td><td class=b>= FE25,X20</td>
 <td>'S0027'</td><td>= E-PL1</td>
-</tr><tr><td>'D4141'</td><td>= C150,D390</td>
-<td class=b>'D4396'</td><td class=b>= FE5010,X915</td>
+</tr><tr><td>'D4125'</td><td>= AZ-1</td>
+<td class=b>'D4398'</td><td class=b>= FE45,X40</td>
 <td>'S0029'</td><td>= E-450</td>
-</tr><tr><td>'D4193'</td><td>= C-5000Z</td>
-<td class=b>'D4397'</td><td class=b>= FE25,X20</td>
+</tr><tr><td>'D4141'</td><td>= C150,D390</td>
+<td class=b>'D4401'</td><td class=b>= XZ-1</td>
 <td>'S0030'</td><td>= E-600</td>
-</tr><tr><td>'D4194'</td><td>= X-3,C-60Z</td>
-<td class=b>'D4398'</td><td class=b>= FE45,X40</td>
+</tr><tr><td>'D4193'</td><td>= C-5000Z</td>
+<td class=b>'D4402'</td><td class=b>= uT6010,ST6010</td>
 <td>'S0032'</td><td>= E-P3</td>
-</tr><tr><td>'D4199'</td><td>= u30D,S410D,u410D</td>
-<td class=b>'D4401'</td><td class=b>= XZ-1</td>
+</tr><tr><td>'D4194'</td><td>= X-3,C-60Z</td>
+<td class=b>'D4406'</td><td class=b>= u7010,S7010 / u7020,S7020</td>
 <td>'S0033'</td><td>= E-5</td>
-</tr><tr><td>'D4205'</td><td>= X450,D535Z,C370Z</td>
-<td class=b>'D4402'</td><td class=b>= uT6010,ST6010</td>
+</tr><tr><td>'D4199'</td><td>= u30D,S410D,u410D</td>
+<td class=b>'D4407'</td><td class=b>= FE4010,X930</td>
 <td>'S0034'</td><td>= E-PL2</td>
-</tr><tr><td>'D4210'</td><td>= C160,D395</td>
-<td class=b>'D4406'</td><td class=b>= u7010,S7010 / u7020,S7020</td>
+</tr><tr><td>'D4205'</td><td>= X450,D535Z,C370Z</td>
+<td class=b>'D4408'</td><td class=b>= X560WP</td>
 <td>'S0036'</td><td>= E-M5</td>
-</tr><tr><td>'D4211'</td><td>= C725UZ</td>
-<td class=b>'D4407'</td><td class=b>= FE4010,X930</td>
+</tr><tr><td>'D4210'</td><td>= C160,D395</td>
+<td class=b>'D4409'</td><td class=b>= FE26,X21</td>
 <td>'S0038'</td><td>= E-PL3</td>
-</tr><tr><td>'D4213'</td><td>= FerrariMODEL2003</td>
-<td class=b>'D4408'</td><td class=b>= X560WP</td>
+</tr><tr><td>'D4211'</td><td>= C725UZ</td>
+<td class=b>'D4410'</td><td class=b>= FE4000,X920,X925</td>
 <td>'S0039'</td><td>= E-PM1</td>
-</tr><tr><td>'D4216'</td><td>= u15D</td>
-<td class=b>'D4409'</td><td class=b>= FE26,X21</td>
+</tr><tr><td>'D4213'</td><td>= FerrariMODEL2003</td>
+<td class=b>'D4411'</td><td class=b>= FE46,X41,X42</td>
 <td>'S0040'</td><td>= E-PL1s</td>
-</tr><tr><td>'D4217'</td><td>= u25D</td>
-<td class=b>'D4410'</td><td class=b>= FE4000,X920,X925</td>
+</tr><tr><td>'D4216'</td><td>= u15D</td>
+<td class=b>'D4412'</td><td class=b>= FE5020,X935</td>
 <td>'S0042'</td><td>= E-PL5</td>
-</tr><tr><td>'D4220'</td><td>= u-miniD,Stylus V</td>
-<td class=b>'D4411'</td><td class=b>= FE46,X41,X42</td>
+</tr><tr><td>'D4217'</td><td>= u25D</td>
+<td class=b>'D4413'</td><td class=b>= uTough-3000</td>
 <td>'S0043'</td><td>= E-PM2</td>
+</tr><tr><td>'D4220'</td><td>= u-miniD,Stylus V</td>
+<td class=b>'D4414'</td><td class=b>= StylusTough-6020</td>
+<td>'S0044'</td><td>= E-P5</td>
 </tr><tr><td>'D4221'</td><td>= u40D,S500,uD500</td>
-<td class=b>'D4412'</td><td class=b>= FE5020,X935</td>
-<td>'SR45'</td><td>= D220</td>
+<td class=b>'D4415'</td><td class=b>= StylusTough-8010</td>
+<td>'S0045'</td><td>= E-PL6</td>
 </tr><tr><td>'D4231'</td><td>= FerrariMODEL2004</td>
-<td class=b>'D4413'</td><td class=b>= uTough-3000</td>
-<td>'SR55'</td><td>= D320L</td>
+<td class=b>'D4417'</td><td class=b>= u5010,S5010</td>
+<td>'S0047'</td><td>= E-M1</td>
 </tr><tr><td>'D4240'</td><td>= X500,D590Z,C470Z</td>
-<td class=b>'D4414'</td><td class=b>= StylusTough-6020</td>
-<td>'SR83'</td><td>= D340L</td>
+<td class=b>'D4418'</td><td class=b>= u7040,S7040</td>
+<td>'S0051'</td><td>= E-M10</td>
 </tr><tr><td>'D4244'</td><td>= uD800,S800</td>
-<td class=b>'D4415'</td><td class=b>= StylusTough-8010</td>
-<td>'SR85'</td><td>= C830L,D340R</td>
+<td class=b>'D4419'</td><td class=b>= u9010,S9010</td>
+<td>'SR45'</td><td>= D220</td>
 </tr><tr><td>'D4256'</td><td>= u720SW,S720SW</td>
-<td class=b>'D4417'</td><td class=b>= u5010,S5010</td>
-<td>'SR852'</td><td>= C860L,D360L</td>
+<td class=b>'D4423'</td><td class=b>= FE4040</td>
+<td>'SR55'</td><td>= D320L</td>
 </tr><tr><td>'D4261'</td><td>= X600,D630,FE5500</td>
-<td class=b>'D4418'</td><td class=b>= u7040,S7040</td>
-<td>'SR872'</td><td>= C900Z,D400Z</td>
+<td class=b>'D4424'</td><td class=b>= FE47,X43</td>
+<td>'SR83'</td><td>= D340L</td>
 </tr><tr><td>'D4262'</td><td>= uD600,S600</td>
-<td class=b>'D4419'</td><td class=b>= u9010,S9010</td>
-<td>'SR874'</td><td>= C960Z,D460Z</td>
+<td class=b>'D4426'</td><td class=b>= FE4030,X950</td>
+<td>'SR85'</td><td>= C830L,D340R</td>
 </tr><tr><td>'D4301'</td><td>= u810/S810</td>
-<td class=b>'D4423'</td><td class=b>= FE4040</td>
-<td>'SR951'</td><td>= C2000Z</td>
+<td class=b>'D4428'</td><td class=b>= FE5030,X965,X960</td>
+<td>'SR852'</td><td>= C860L,D360L</td>
 </tr><tr><td>'D4302'</td><td>= u710,S710</td>
-<td class=b>'D4424'</td><td class=b>= FE47,X43</td>
-<td>'SR952'</td><td>= C21</td>
+<td class=b>'D4430'</td><td class=b>= u7030,S7030</td>
+<td>'SR872'</td><td>= C900Z,D400Z</td>
 </tr><tr><td>'D4303'</td><td>= u700,S700</td>
-<td class=b>'D4426'</td><td class=b>= FE4030,X950</td>
-<td>'SR953'</td><td>= C21T.commu</td>
+<td class=b>'D4432'</td><td class=b>= SP600UZ</td>
+<td>'SR874'</td><td>= C960Z,D460Z</td>
 </tr><tr><td>'D4304'</td><td>= FE100,X710</td>
-<td class=b>'D4428'</td><td class=b>= FE5030,X965,X960</td>
-<td>'SR954'</td><td>= C2020Z</td>
+<td class=b>'D4434'</td><td class=b>= SP800UZ</td>
+<td>'SR951'</td><td>= C2000Z</td>
 </tr><tr><td>'D4305'</td><td>= FE110,X705</td>
-<td class=b>'D4430'</td><td class=b>= u7030,S7030</td>
-<td>'SR955'</td><td>= C990Z,D490Z</td>
+<td class=b>'D4439'</td><td class=b>= FE4020,X940</td>
+<td>'SR952'</td><td>= C21</td>
 </tr><tr><td>'D4310'</td><td>= FE-130,X-720</td>
-<td class=b>'D4432'</td><td class=b>= SP600UZ</td>
-<td>'SR956'</td><td>= C211Z</td>
+<td class=b>'D4442'</td><td class=b>= FE5035</td>
+<td>'SR953'</td><td>= C21T.commu</td>
 </tr><tr><td>'D4311'</td><td>= FE-140,X-725</td>
-<td class=b>'D4434'</td><td class=b>= SP800UZ</td>
-<td>'SR959'</td><td>= C990ZS,D490Z</td>
+<td class=b>'D4448'</td><td class=b>= FE4050,X970</td>
+<td>'SR954'</td><td>= C2020Z</td>
 </tr><tr><td>'D4312'</td><td>= FE150,X730</td>
-<td class=b>'D4439'</td><td class=b>= FE4020,X940</td>
-<td>'SR95A'</td><td>= C2100UZ</td>
+<td class=b>'D4450'</td><td class=b>= FE5050,X985</td>
+<td>'SR955'</td><td>= C990Z,D490Z</td>
 </tr><tr><td>'D4313'</td><td>= FE160,X735</td>
-<td class=b>'D4442'</td><td class=b>= FE5035</td>
-<td>'SR971'</td><td>= C100,D370</td>
+<td class=b>'D4454'</td><td class=b>= u-7050</td>
+<td>'SR956'</td><td>= C211Z</td>
 </tr><tr><td>'D4314'</td><td>= u740,S740</td>
-<td class=b>'D4448'</td><td class=b>= FE4050,X970</td>
-<td>'SR973'</td><td>= C2,D230</td>
+<td class=b>'D4464'</td><td class=b>= T10,X27</td>
+<td>'SR959'</td><td>= C990ZS,D490Z</td>
 </tr><tr><td>'D4315'</td><td>= u750,S750</td>
-<td class=b>'D4450'</td><td class=b>= FE5050,X985</td>
-<td>'SX151'</td><td>= E100RS</td>
+<td class=b>'D4470'</td><td class=b>= FE5040,X980</td>
+<td>'SR95A'</td><td>= C2100UZ</td>
 </tr><tr><td>'D4316'</td><td>= u730/S730</td>
-<td class=b>'D4454'</td><td class=b>= u-7050</td>
-<td>'SX351'</td><td>= C3000Z / C3030Z</td>
+<td class=b>'D4472'</td><td class=b>= TG-310</td>
+<td>'SR971'</td><td>= C100,D370</td>
 </tr><tr><td>'D4317'</td><td>= FE115,X715</td>
-<td class=b>'D4464'</td><td class=b>= T10,X27</td>
-<td>'SX354'</td><td>= C3040Z</td>
+<td class=b>'D4474'</td><td class=b>= TG-610</td>
+<td>'SR973'</td><td>= C2,D230</td>
 </tr><tr><td>'D4321'</td><td>= SP550UZ</td>
-<td class=b>'D4470'</td><td class=b>= FE5040,X980</td>
-<td>'SX355'</td><td>= C2040Z</td>
+<td class=b>'D4476'</td><td class=b>= TG-810</td>
+<td>'SX151'</td><td>= E100RS</td>
 </tr><tr><td>'D4322'</td><td>= SP510UZ</td>
-<td class=b>'D4472'</td><td class=b>= TG-310</td>
-<td>'SX357'</td><td>= C700UZ</td>
+<td class=b>'D4478'</td><td class=b>= VG145,VG140,D715</td>
+<td>'SX351'</td><td>= C3000Z / C3030Z</td>
 </tr><tr><td>'D4324'</td><td>= FE170,X760</td>
-<td class=b>'D4474'</td><td class=b>= TG-610</td>
-<td>'SX358'</td><td>= C200Z,D510Z</td>
+<td class=b>'D4479'</td><td class=b>= VG130,D710</td>
+<td>'SX354'</td><td>= C3040Z</td>
 </tr><tr><td>'D4326'</td><td>= FE200</td>
-<td class=b>'D4476'</td><td class=b>= TG-810</td>
-<td>'SX374'</td><td>= C3100Z,C3020Z</td>
+<td class=b>'D4480'</td><td class=b>= VG120,D705</td>
+<td>'SX355'</td><td>= C2040Z</td>
 </tr><tr><td>'D4327'</td><td>= FE190/X750</td>
-<td class=b>'D4478'</td><td class=b>= VG145,VG140,D715</td>
-<td>'SX552'</td><td>= C4040Z</td>
+<td class=b>'D4482'</td><td class=b>= VR310,D720</td>
+<td>'SX357'</td><td>= C700UZ</td>
 </tr><tr><td>'D4328'</td><td>= u760,S760</td>
-<td class=b>'D4479'</td><td class=b>= VG130,D710</td>
-<td>'SX553'</td><td>= C40Z,D40Z</td>
+<td class=b>'D4484'</td><td class=b>= VR320,D725</td>
+<td>'SX358'</td><td>= C200Z,D510Z</td>
 </tr><tr><td>'D4330'</td><td>= FE180/X745</td>
-<td class=b>'D4480'</td><td class=b>= VG120,D705</td>
-<td>'SX556'</td><td>= C730UZ</td>
+<td class=b>'D4486'</td><td class=b>= VR330,D730</td>
+<td>'SX374'</td><td>= C3100Z,C3020Z</td>
 </tr><tr><td>'D4331'</td><td>= u1000/S1000</td>
-<td class=b>'D4482'</td><td class=b>= VR310,D720</td>
-<td>'SX558'</td><td>= C5050Z</td>
+<td class=b>'D4488'</td><td class=b>= VG110,D700</td>
+<td>'SX552'</td><td>= C4040Z</td>
 </tr><tr><td>'D4332'</td><td>= u770SW,S770SW</td>
-<td class=b>'D4484'</td><td class=b>= VR320,D725</td>
-<td>'SX571'</td><td>= C120,D380</td>
+<td class=b>'D4490'</td><td class=b>= SP-610UZ</td>
+<td>'SX553'</td><td>= C40Z,D40Z</td>
 </tr><tr><td>'D4333'</td><td>= FE240/X795</td>
-<td class=b>'D4486'</td><td class=b>= VR330,D730</td>
-<td>'SX574'</td><td>= C300Z,D550Z</td>
+<td class=b>'D4492'</td><td class=b>= SZ-10</td>
+<td>'SX556'</td><td>= C730UZ</td>
 </tr><tr><td>'D4334'</td><td>= FE210,X775</td>
-<td class=b>'D4488'</td><td class=b>= VG110,D700</td>
-<td>'SX575'</td><td>= C4100Z,C4000Z</td>
+<td class=b>'D4494'</td><td class=b>= SZ-20</td>
+<td>'SX558'</td><td>= C5050Z</td>
 </tr><tr><td>'D4336'</td><td>= FE230/X790</td>
-<td class=b>'D4490'</td><td class=b>= SP-610UZ</td>
-<td>'SX751'</td><td>= X200,D560Z,C350Z</td>
+<td class=b>'D4496'</td><td class=b>= SZ-30MR</td>
+<td>'SX571'</td><td>= C120,D380</td>
 </tr><tr><td>'D4337'</td><td>= FE220,X785</td>
-<td class=b>'D4492'</td><td class=b>= SZ-10</td>
-<td>'SX752'</td><td>= X300,D565Z,C450Z</td>
+<td class=b>'D4498'</td><td class=b>= SP-810UZ</td>
+<td>'SX574'</td><td>= C300Z,D550Z</td>
 </tr><tr><td>'D4338'</td><td>= u725SW,S725SW</td>
-<td class=b>'D4494'</td><td class=b>= SZ-20</td>
-<td>'SX753'</td><td>= C750UZ</td>
+<td class=b>'D4500'</td><td class=b>= SZ-11</td>
+<td>'SX575'</td><td>= C4100Z,C4000Z</td>
 </tr><tr><td>'D4339'</td><td>= FE250/X800</td>
-<td class=b>'D4496'</td><td class=b>= SZ-30MR</td>
-<td>'SX754'</td><td>= C740UZ</td>
+<td class=b>'D4504'</td><td class=b>= TG-615</td>
+<td>'SX751'</td><td>= X200,D560Z,C350Z</td>
 </tr><tr><td>'D4341'</td><td>= u780,S780</td>
-<td class=b>'D4498'</td><td class=b>= SP-810UZ</td>
-<td>'SX755'</td><td>= C755UZ</td>
+<td class=b>'D4508'</td><td class=b>= TG-620</td>
+<td>'SX752'</td><td>= X300,D565Z,C450Z</td>
 </tr><tr><td>'D4343'</td><td>= u790SW,S790SW</td>
-<td class=b>'D4500'</td><td class=b>= SZ-11</td>
-<td>'SX756'</td><td>= C5060WZ</td>
+<td class=b>'D4510'</td><td class=b>= TG-820</td>
+<td>'SX753'</td><td>= C750UZ</td>
 </tr><tr><td>'D4344'</td><td>= u1020,S1020</td>
-<td class=b>'D4504'</td><td class=b>= TG-615</td>
-<td>'SX757'</td><td>= C8080WZ</td>
+<td class=b>'D4512'</td><td class=b>= TG-1</td>
+<td>'SX754'</td><td>= C740UZ</td>
 </tr><tr><td>'D4346'</td><td>= FE15,X10</td>
-<td class=b>'D4508'</td><td class=b>= TG-620</td>
-<td>'SX758'</td><td>= X350,D575Z,C360Z</td>
+<td class=b>'D4516'</td><td class=b>= SH-21</td>
+<td>'SX755'</td><td>= C755UZ</td>
 </tr><tr><td>'D4348'</td><td>= FE280,X820,C520</td>
-<td class=b>'D4510'</td><td class=b>= TG-820</td>
-<td>'SX759'</td><td>= X400,D580Z,C460Z</td>
+<td class=b>'D4519'</td><td class=b>= SZ-14</td>
+<td>'SX756'</td><td>= C5060WZ</td>
 </tr><tr><td>'D4349'</td><td>= FE300,X830</td>
-<td class=b>'D4512'</td><td class=b>= TG-1</td>
-<td>'SX75A'</td><td>= AZ-2ZOOM</td>
+<td class=b>'D4520'</td><td class=b>= SZ-31MR</td>
+<td>'SX757'</td><td>= C8080WZ</td>
 </tr><tr><td>'D4350'</td><td>= u820,S820</td>
-<td class=b>'D4516'</td><td class=b>= SH-21</td>
-<td>'SX75B'</td><td>= D595Z,C500Z</td>
+<td class=b>'D4521'</td><td class=b>= SH-25MR</td>
+<td>'SX758'</td><td>= X350,D575Z,C360Z</td>
 </tr><tr><td>'D4351'</td><td>= u1200,S1200</td>
-<td class=b>'D4519'</td><td class=b>= SZ-14</td>
-<td>'SX75C'</td><td>= X550,D545Z,C480Z</td>
+<td class=b>'D4523'</td><td class=b>= SP-720UZ</td>
+<td>'SX759'</td><td>= X400,D580Z,C460Z</td>
 </tr><tr><td>'D4352'</td><td>= FE270,X815,C510</td>
-<td class=b>'D4520'</td><td class=b>= SZ-31MR</td>
-<td>'SX75D'</td><td>= IR-300</td>
+<td class=b>'D4529'</td><td class=b>= VG170</td>
+<td>'SX75A'</td><td>= AZ-2ZOOM</td>
 </tr><tr><td>'D4353'</td><td>= u795SW,S795SW</td>
-<td class=b>'D4521'</td><td class=b>= SH-25MR</td>
-<td>'SX75F'</td><td>= C55Z,C5500Z</td>
+<td class=b>'D4531'</td><td class=b>= XZ-2</td>
+<td>'SX75B'</td><td>= D595Z,C500Z</td>
 </tr><tr><td>'D4354'</td><td>= u1030SW,S1030SW</td>
-<td class=b>'D4523'</td><td class=b>= SP-720UZ</td>
-<td>'SX75G'</td><td>= C170,D425</td>
+<td class=b>'D4535'</td><td class=b>= SP-620UZ</td>
+<td>'SX75C'</td><td>= X550,D545Z,C480Z</td>
 </tr><tr><td>'D4355'</td><td>= SP560UZ</td>
-<td class=b>'D4529'</td><td class=b>= VG170</td>
-<td>'SX75J'</td><td>= C180,D435</td>
+<td class=b>'D4536'</td><td class=b>= TG-320</td>
+<td>'SX75D'</td><td>= IR-300</td>
 </tr><tr><td>'D4356'</td><td>= u1010,S1010</td>
-<td class=b>'D4531'</td><td class=b>= XZ-2</td>
-<td>'SX771'</td><td>= C760UZ</td>
+<td class=b>'D4537'</td><td class=b>= VR340,D750</td>
+<td>'SX75F'</td><td>= C55Z,C5500Z</td>
 </tr><tr><td>'D4357'</td><td>= u830,S830</td>
-<td class=b>'D4535'</td><td class=b>= SP-620UZ</td>
-<td>'SX772'</td><td>= C770UZ</td>
+<td class=b>'D4541'</td><td class=b>= SZ-12</td>
+<td>'SX75G'</td><td>= C170,D425</td>
 </tr><tr><td>'D4359'</td><td>= u840,S840</td>
-<td class=b>'D4536'</td><td class=b>= TG-320</td>
-<td>'SX773'</td><td>= C745UZ</td>
+<td class=b>'D4545'</td><td class=b>= VH410</td>
+<td>'SX75J'</td><td>= C180,D435</td>
 </tr><tr><td>'D4360'</td><td>= FE350WIDE,X865</td>
-<td class=b>'D4537'</td><td class=b>= VR340,D750</td>
-<td>'SX774'</td><td>= X250,D560Z,C350Z</td>
+<td class=b>'D4547'</td><td class=b>= TG-2</td>
+<td>'SX771'</td><td>= C760UZ</td>
 </tr><tr><td>'D4361'</td><td>= u850SW,S850SW</td>
-<td class=b>'D4541'</td><td class=b>= SZ-12</td>
-<td>'SX775'</td><td>= X100,D540Z,C310Z</td>
+<td class=b>'D4548'</td><td class=b>= TG-830</td>
+<td>'SX772'</td><td>= C770UZ</td>
 </tr><tr><td>'D4362'</td><td>= FE340,X855,C560</td>
-<td class=b>'D4545'</td><td class=b>= VH410</td>
-<td>'SX776'</td><td>= C460ZdelSol</td>
+<td class=b>'D4549'</td><td class=b>= TG-630</td>
+<td>'SX773'</td><td>= C745UZ</td>
 </tr><tr><td>'D4363'</td><td>= FE320,X835,C540</td>
-<td class=b>'D4547'</td><td class=b>= TG-2</td>
-<td>'SX777'</td><td>= C765UZ</td>
+<td class=b>'D4550'</td><td class=b>= SH-50</td>
+<td>'SX774'</td><td>= X250,D560Z,C350Z</td>
 </tr><tr><td>'D4364'</td><td>= SP570UZ</td>
-<td class=b>'D4548'</td><td class=b>= TG-830</td>
-<td>'SX77A'</td><td>= D555Z,C315Z</td>
+<td class=b>'D4553'</td><td class=b>= SZ-16,DZ-105</td>
+<td>'SX775'</td><td>= X100,D540Z,C310Z</td>
 </tr><tr><td>'D4366'</td><td>= FE330,X845,C550</td>
 <td class=b>'D4562'</td><td class=b>= SP-820UZ</td>
-<td>'SX851'</td><td>= C7070WZ</td>
+<td>'SX776'</td><td>= C460ZdelSol</td>
 </tr><tr><td>'D4368'</td><td>= FE310,X840,C530</td>
-<td class=b>'D4809'</td><td class=b>= C2500L</td>
-<td>'SX852'</td><td>= C70Z,C7000Z</td>
+<td class=b>'D4566'</td><td class=b>= SZ-15</td>
+<td>'SX777'</td><td>= C765UZ</td>
 </tr><tr><td>'D4370'</td><td>= u1050SW,S1050SW</td>
-<td class=b>'D4842'</td><td class=b>= E-10</td>
-<td>'SX853'</td><td>= SP500UZ</td>
+<td class=b>'D4572'</td><td class=b>= STYLUS1</td>
+<td>'SX77A'</td><td>= D555Z,C315Z</td>
 </tr><tr><td>'D4371'</td><td>= u1060,S1060</td>
-<td class=b>'D4856'</td><td class=b>= C-1</td>
-<td>'SX854'</td><td>= SP310</td>
+<td class=b>'D4809'</td><td class=b>= C2500L</td>
+<td>'SX851'</td><td>= C7070WZ</td>
 </tr><tr><td>'D4372'</td><td>= FE370,X880,C575</td>
-<td class=b>'D4857'</td><td class=b>= C-1Z,D-150Z</td>
-<td>'SX855'</td><td>= SP350</td>
+<td class=b>'D4842'</td><td class=b>= E-10</td>
+<td>'SX852'</td><td>= C70Z,C7000Z</td>
 </tr><tr><td>'D4374'</td><td>= SP565UZ</td>
-<td class=b>'DCHC'</td><td class=b>= D500L</td>
-<td>'SX873'</td><td>= SP320</td>
+<td class=b>'D4856'</td><td class=b>= C-1</td>
+<td>'SX853'</td><td>= SP500UZ</td>
 </tr><tr><td>'D4377'</td><td>= u1040,S1040</td>
-<td class=b>'DCHT'</td><td class=b>= D600L / D620L</td>
-<td>'SX875'</td><td>= FE180/X745</td>
+<td class=b>'D4857'</td><td class=b>= C-1Z,D-150Z</td>
+<td>'SX854'</td><td>= SP310</td>
 </tr><tr><td>'D4378'</td><td>= FE360,X875,C570</td>
-<td class=b>'S0003'</td><td class=b>= E-330</td>
-<td>'SX876'</td><td>= FE190/X750</td>
+<td class=b>'DCHC'</td><td class=b>= D500L</td>
+<td>'SX855'</td><td>= SP350</td>
 </tr><tr><td>'D4379'</td><td>= FE20,X15,C25</td>
-<td class=b>'S0004'</td><td class=b>= E-500</td>
-<td>&nbsp;</td><td>&nbsp;</td>
+<td class=b>'DCHT'</td><td class=b>= D600L / D620L</td>
+<td>'SX873'</td><td>= SP320</td>
 </tr><tr><td>'D4380'</td><td>= uT6000,ST6000</td>
+<td class=b>'S0003'</td><td class=b>= E-330</td>
+<td>'SX875'</td><td>= FE180/X745</td>
+</tr><tr><td>'D4381'</td><td>= uT8000,ST8000</td>
+<td class=b>'S0004'</td><td class=b>= E-500</td>
+<td>'SX876'</td><td>= FE190/X750</td>
+</tr><tr><td>'D4382'</td><td>= u9000,S9000</td>
 <td class=b>'S0009'</td><td class=b>= E-400</td>
 <td>&nbsp;</td><td>&nbsp;</td>
+</tr><tr><td>'D4384'</td><td>= SP590UZ</td>
+<td class=b>'S0010'</td><td class=b>= E-510</td>
+<td>&nbsp;</td><td>&nbsp;</td>
 </tr></table></td></tr></table></blockquote>
 
 <h2><a name='TextInfo'>Olympus TextInfo Tags</a></h2>
@@ -1193,7 +1202,7 @@ the Make and Model are used to identify the extender)</span>
 </tr><tr><td>'0 10 10'</td><td>= Olympus M.Zuiko Digital ED 12-50mm F3.5-6.3 EZ</td>
 </tr><tr><td>'0 11 10'</td><td>= Olympus M.Zuiko Digital 45mm F1.8</td>
 </tr><tr><td>'0 12 10'</td><td>= Olympus M.Zuiko Digital ED 60mm F2.8 Macro</td>
-</tr><tr><td>'0 13 10'</td><td>= Olympus M.Zuiko Digital ED 14-42mm F3.5-5.6 II R</td>
+</tr><tr><td>'0 13 10'</td><td>= Olympus M.Zuiko Digital 14-42mm F3.5-5.6 II R</td>
 </tr><tr><td>'0 14 10'</td><td>= Olympus M.Zuiko Digital ED 40-150mm F4.0-5.6 R</td>
 </tr><tr><td>'0 15 00'</td><td>= Olympus Zuiko Digital ED 7-14mm F4.0</td>
 </tr><tr><td>'0 15 10'</td><td>= Olympus M.Zuiko Digital ED 75mm F1.8</td>
@@ -1201,8 +1210,11 @@ the Make and Model are used to identify the extender)</span>
 </tr><tr><td>'0 17 00'</td><td>= Olympus Zuiko Digital Pro ED 35-100mm F2.0</td>
 </tr><tr><td>'0 18 00'</td><td>= Olympus Zuiko Digital 14-45mm F3.5-5.6</td>
 </tr><tr><td>'0 18 10'</td><td>= Olympus M.Zuiko Digital ED 75-300mm F4.8-6.7 II</td>
+</tr><tr><td>'0 19 10'</td><td>= Olympus M.Zuiko Digital ED 12-40mm F2.8 Pro</td>
 </tr><tr><td>'0 20 00'</td><td>= Olympus Zuiko Digital 35mm F3.5 Macro</td>
+</tr><tr><td>'0 21 10'</td><td>= Olympus M.Zuiko Digital ED 14-42mm F3.5-5.6 EZ</td>
 </tr><tr><td>'0 22 00'</td><td>= Olympus Zuiko Digital 17.5-45mm F3.5-5.6</td>
+</tr><tr><td>'0 22 10'</td><td>= Olympus M.Zuiko Digital 25mm F1.8</td>
 </tr><tr><td>'0 23 00'</td><td>= Olympus Zuiko Digital ED 14-42mm F3.5-5.6</td>
 </tr><tr><td>'0 24 00'</td><td>= Olympus Zuiko Digital ED 40-150mm F4.0-5.6</td>
 </tr><tr><td>'0 30 00'</td><td>= Olympus Zuiko Digital ED 50-200mm F2.8-3.5 SWD</td>
@@ -1216,8 +1228,11 @@ the Make and Model are used to identify the extender)</span>
 </tr><tr><td>'1 02 00'</td><td>= Sigma 55-200mm F4.0-5.6 DC</td>
 </tr><tr><td>'1 02 10'</td><td>= Sigma 19mm F2.8 EX DN</td>
 </tr><tr><td>'1 03 00'</td><td>= Sigma 18-125mm F3.5-5.6 DC</td>
+</tr><tr><td>'1 03 10'</td><td>= Sigma 30mm F2.8 DN | A</td>
 </tr><tr><td>'1 04 00'</td><td>= Sigma 18-125mm F3.5-5.6 DC</td>
+</tr><tr><td>'1 04 10'</td><td>= Sigma 19mm F2.8 DN | A</td>
 </tr><tr><td>'1 05 00'</td><td>= Sigma 30mm F1.4 EX DC HSM</td>
+</tr><tr><td>'1 05 10'</td><td>= Sigma 60mm F2.8 DN | A</td>
 </tr><tr><td>'1 06 00'</td><td>= Sigma APO 50-500mm F4.0-6.3 EX DG HSM</td>
 </tr><tr><td>'1 07 00'</td><td>= Sigma Macro 105mm F2.8 EX DG</td>
 </tr><tr><td>'1 08 00'</td><td>= Sigma APO Macro 150mm F2.8 EX DG HSM</td>
@@ -1252,6 +1267,10 @@ the Make and Model are used to identify the extender)</span>
 </tr><tr><td>'2 15 10'</td><td>= Lumix G X Vario 12-35mm F2.8 Asph. Power OIS</td>
 </tr><tr><td>'2 16 10'</td><td>= Lumix G Vario 45-150mm F4.0-5.6 Asph. Mega OIS</td>
 </tr><tr><td>'2 17 10'</td><td>= Lumix G X Vario 35-100mm F2.8 Power OIS</td>
+</tr><tr><td>'2 18 10'</td><td>= Lumix G Vario 14-42mm F3.5-5.6 II Asph. Mega OIS</td>
+</tr><tr><td>'2 19 10'</td><td>= Lumix G Vario 14-140mm F3.5-5.6 Asph. Power OIS</td>
+</tr><tr><td>'2 20 10'</td><td>= Lumix G Vario 12-32mm F3.5-5.6 Asph. Mega OIS</td>
+</tr><tr><td>'2 21 10'</td><td>= Leica DG Nocticron 42.5mm F1.2 Asph. Power OIS</td>
 </tr><tr><td>'3 01 00'</td><td>= Leica D Vario Elmarit 14-50mm F2.8-3.5 Asph.</td>
 </tr><tr><td>'3 02 00'</td><td>= Leica D Summilux 25mm F1.4 Asph.</td>
 </tr></table></td></tr></table></blockquote>
@@ -1316,13 +1335,19 @@ the Make and Model are used to identify the extender)</span>
 <td class=c>rational64s</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td title='0x0204 = 516'>0x0204</td>
+<td>NDFilter</td>
+<td class=c>Y</td>
+<td><span class=s>0 = Off
+  <br>1 = On</span></td></tr>
+<tr class=b>
 <td title='0x0300 = 768'>0x0300</td>
 <td>MacroMode</td>
 <td class=c>int16u</td>
 <td><span class=s>0 = Off
   <br>1 = On
   <br>2 = Super Macro</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0301 = 769'>0x0301</td>
 <td>FocusMode</td>
 <td class=c>int16u[n]</td>
@@ -1337,12 +1362,13 @@ the Make and Model are used to identify the extender)</span>
 <span class=s>[Value 1]</span><table class=cols><tr>
   <td>Bit 0 = S-AF
   <br>Bit 2 = C-AF
-  <br>Bit 4 = MF</td><td>&nbsp;&nbsp;</td>
-  <td>Bit 5 = Face detect
+  <br>Bit 4 = MF
+  <br>Bit 5 = Face detect
   <br>Bit 6 = Imager AF
+  <br>Bit 7 = Live View Magnification Frame
   <br>Bit 8 = AF sensor</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr>
+<tr class=b>
 <td title='0x0302 = 770'>0x0302</td>
 <td>FocusProcess</td>
 <td class=c>int16u[n]</td>
@@ -1350,34 +1376,34 @@ the Make and Model are used to identify the extender)</span>
   <br>[Value 0]
   <br>0 = AF Not Used
   <br>1 = AF Used</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0303 = 771'>0x0303</td>
 <td>AFSearch</td>
 <td class=c>int16u</td>
 <td><span class=s>0 = Not Ready
   <br>1 = Ready</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x0304 = 772'>0x0304</td>
 <td>AFAreas</td>
 <td class=c title=' ~ = Writable only with -n'>int32u[64]~</td>
 <td><span class=s><span class=n>(coordinates range from 0 to 255)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0305 = 773'>0x0305</td>
 <td>AFPointSelected</td>
 <td class=c title=' ~ = Writable only with -n'>rational64s[5]~</td>
 <td><span class=s><span class=n>(coordinates expressed as a percent)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x0306 = 774'>0x0306</td>
 <td>AFFineTune</td>
 <td class=c>int8u</td>
 <td><span class=s>0 = Off
   <br>1 = On</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0307 = 775'>0x0307</td>
 <td>AFFineTuneAdj</td>
 <td class=c>int16s[3]</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0400 = 1024'>0x0400</td>
 <td>FlashMode</td>
 <td class=c>int16u</td>
@@ -1390,12 +1416,12 @@ the Make and Model are used to identify the extender)</span>
   <br>Bit 4 = Forced On
   <br>Bit 5 = 2nd Curtain</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr class=b>
+<tr>
 <td title='0x0401 = 1025'>0x0401</td>
 <td>FlashExposureComp</td>
 <td class=c>rational64s</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0403 = 1027'>0x0403</td>
 <td>FlashRemoteControl</td>
 <td class=c>int16u</td>
@@ -1414,7 +1440,7 @@ the Make and Model are used to identify the extender)</span>
   <br>0x13 = Channel 3, High
   <br>0x14 = Channel 4, High</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr class=b>
+<tr>
 <td title='0x0404 = 1028'>0x0404</td>
 <td>FlashControlMode</td>
 <td class=c>int16u[3]</td>
@@ -1423,17 +1449,17 @@ the Make and Model are used to identify the extender)</span>
   <br>3 = TTL
   <br>4 = Auto
   <br>5 = Manual</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x0405 = 1029'>0x0405</td>
 <td>FlashIntensity</td>
 <td class=c>rational64s[3]</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x0406 = 1030'>0x0406</td>
 <td>ManualFlashStrength</td>
 <td class=c>rational64s[3]</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0500 = 1280'>0x0500</td>
 <td>WhiteBalance2</td>
 <td class=c>int16u</td>
@@ -1456,22 +1482,22 @@ the Make and Model are used to identify the extender)</span>
   <br>513 = Custom WB 2900K
   <br>514 = Custom WB 8000K</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr class=b>
+<tr>
 <td title='0x0501 = 1281'>0x0501</td>
 <td>WhiteBalanceTemperature</td>
 <td class=c>int16u</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0502 = 1282'>0x0502</td>
 <td>WhiteBalanceBracket</td>
 <td class=c>int16s</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x0503 = 1283'>0x0503</td>
 <td>CustomSaturation</td>
 <td class=c title=' ~ = Writable only with -n'>int16s[3]~</td>
 <td><span class=s><span class=n>(3 numbers: 1. CS Value, 2. Min, 3. Max)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x0504 = 1284'>0x0504</td>
 <td>ModifiedSaturation</td>
 <td class=c>int16u</td>
@@ -1480,24 +1506,24 @@ the Make and Model are used to identify the extender)</span>
   <br>2 = CM2 (Green Enhance)
   <br>3 = CM3 (Blue Enhance)
   <br>4 = CM4 (Skin Tones)</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0505 = 1285'>0x0505</td>
 <td>ContrastSetting</td>
 <td class=c>int16s[3]</td>
 <td><span class=s><span class=n>(value, min, max)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x0506 = 1286'>0x0506</td>
 <td>SharpnessSetting</td>
 <td class=c>int16s[3]</td>
 <td><span class=s><span class=n>(value, min, max)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0507 = 1287'>0x0507</td>
 <td>ColorSpace</td>
 <td class=c>int16u</td>
 <td><span class=s>0 = sRGB
   <br>1 = Adobe RGB
   <br>2 = Pro Photo RGB</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x0509 = 1289'>0x0509</td>
 <td>SceneMode</td>
 <td class=c>int16u</td>
@@ -1560,7 +1586,7 @@ the Make and Model are used to identify the extender)</span>
   <br>142 = Hand-held Starlight
   <br>154 = HDR</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr class=b>
+<tr>
 <td title='0x050a = 1290'>0x050a</td>
 <td>NoiseReduction</td>
 <td class=c>int16u</td>
@@ -1568,24 +1594,24 @@ the Make and Model are used to identify the extender)</span>
   <br>Bit 1 = Noise Filter
   <br>Bit 2 = Noise Filter (ISO Boost)
   <br>Bit 3 = Auto</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x050b = 1291'>0x050b</td>
 <td>DistortionCorrection</td>
 <td class=c>int16u</td>
 <td><span class=s>0 = Off
   <br>1 = On</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x050c = 1292'>0x050c</td>
 <td>ShadingCompensation</td>
 <td class=c>int16u</td>
 <td><span class=s>0 = Off
   <br>1 = On</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x050d = 1293'>0x050d</td>
 <td>CompressionFactor</td>
 <td class=c>rational64u</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x050f = 1295'>0x050f</td>
 <td>Gradation</td>
 <td class=c>int16s[n]</td>
@@ -1598,7 +1624,7 @@ the Make and Model are used to identify the extender)</span>
   <br>[Value 3]
   <br>0 = User-Selected
   <br>1 = Auto-Override</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x0520 = 1312'>0x0520</td>
 <td>PictureMode</td>
 <td class=c>int16u[n]</td>
@@ -1612,27 +1638,27 @@ the Make and Model are used to identify the extender)</span>
   <br>256 = Monotone
   <br>512 = Sepia</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr class=b>
+<tr>
 <td title='0x0521 = 1313'>0x0521</td>
 <td>PictureModeSaturation</td>
 <td class=c>int16s[3]</td>
 <td><span class=s><span class=n>(value, min, max)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x0522 = 1314'>0x0522</td>
 <td>PictureModeHue?</td>
 <td class=c>int16s</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x0523 = 1315'>0x0523</td>
 <td>PictureModeContrast</td>
 <td class=c>int16s[3]</td>
 <td><span class=s><span class=n>(value, min, max)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x0524 = 1316'>0x0524</td>
 <td>PictureModeSharpness</td>
 <td class=c>int16s[3]</td>
 <td><span class=s><span class=n>(value, min, max)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0525 = 1317'>0x0525</td>
 <td>PictureModeBWFilter</td>
 <td class=c>int16s</td>
@@ -1644,7 +1670,7 @@ the Make and Model are used to identify the extender)</span>
   <br>4 = Red
   <br>5 = Green</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr>
+<tr class=b>
 <td title='0x0526 = 1318'>0x0526</td>
 <td>PictureModeTone</td>
 <td class=c>int16s</td>
@@ -1656,7 +1682,7 @@ the Make and Model are used to identify the extender)</span>
   <br>4 = Purple
   <br>5 = Green</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr class=b>
+<tr>
 <td title='0x0527 = 1319'>0x0527</td>
 <td>NoiseFilter</td>
 <td class=c>int16s[3]</td>
@@ -1665,7 +1691,7 @@ the Make and Model are used to identify the extender)</span>
   <br>&#39;0 -2 1&#39; = Standard
   <br>&#39;0 0 0&#39; = n/a
   <br>&#39;1 -2 1&#39; = High</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x0529 = 1321'>0x0529</td>
 <td>ArtFilter</td>
 <td class=c>int16u[4]</td>
@@ -1699,7 +1725,7 @@ the Make and Model are used to identify the extender)</span>
   <br>32 = Dramatic Tone B&amp;W
   <br>33 = Watercolor II</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr class=b>
+<tr>
 <td title='0x052c = 1324'>0x052c</td>
 <td>MagicFilter</td>
 <td class=c>int16u[4]</td>
@@ -1733,7 +1759,7 @@ the Make and Model are used to identify the extender)</span>
   <br>32 = Dramatic Tone B&amp;W
   <br>33 = Watercolor II</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr>
+<tr class=b>
 <td title='0x052d = 1325'>0x052d</td>
 <td>PictureModeEffect</td>
 <td class=c>int16s[3]</td>
@@ -1741,6 +1767,11 @@ the Make and Model are used to identify the extender)</span>
   <br>&#39;0 -1 1&#39; = Standard
   <br>&#39;0 0 0&#39; = n/a
   <br>&#39;1 -1 1&#39; = High</span></td></tr>
+<tr>
+<td title='0x052e = 1326'>0x052e</td>
+<td>ToneLevel</td>
+<td class=c>Y</td>
+<td>&nbsp;</td></tr>
 <tr class=b>
 <td title='0x052f = 1327'>0x052f</td>
 <td>ArtFilterEffect</td>
@@ -1809,7 +1840,8 @@ the Make and Model are used to identify the extender)</span>
 <td><span class=s>0 = Off
   <br>1 = On, Mode 1
   <br>2 = On, Mode 2
-  <br>3 = On, Mode 3</span></td></tr>
+  <br>3 = On, Mode 3
+  <br>4 = On, Mode 4</span></td></tr>
 <tr>
 <td title='0x0900 = 2304'>0x0900</td>
 <td>ManometerPressure</td>
@@ -1838,6 +1870,11 @@ the Make and Model are used to identify the extender)</span>
 <td class=c>int16u</td>
 <td><span class=s>0 = Off
   <br>1 = On</span></td></tr>
+<tr class=b>
+<td title='0x0908 = 2312'>0x0908</td>
+<td>DateTimeUTC</td>
+<td class=c>string</td>
+<td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
 <h2><a name='RawDevelopment'>Olympus RawDevelopment Tags</a></h2>
@@ -2077,6 +2114,40 @@ the Make and Model are used to identify the extender)</span>
 <td>RawDevPMNoiseFilter</td>
 <td class=c>int16u</td>
 <td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x0121 = 289'>0x0121</td>
+<td>RawDevArtFilter</td>
+<td class=c>int16u[4]</td>
+<td><span class=s>[Value 0]</span><table class=cols><tr>
+  <td>0 = Off
+  <br>1 = Soft Focus
+  <br>2 = Pop Art
+  <br>3 = Pale &amp; Light Color
+  <br>4 = Light Tone
+  <br>5 = Pin Hole
+  <br>6 = Grainy Film
+  <br>9 = Diorama
+  <br>10 = Cross Process
+  <br>12 = Fish Eye
+  <br>13 = Drawing
+  <br>14 = Gentle Sepia
+  <br>15 = Tender Light
+  <br>16 = Pop Art II</td><td>&nbsp;&nbsp;</td>
+  <td>17 = Pin Hole II
+  <br>18 = Pin Hole III
+  <br>19 = Grainy Film II
+  <br>20 = Dramatic Tone
+  <br>21 = Punk
+  <br>22 = Soft Focus 2
+  <br>23 = Sparkle
+  <br>24 = Watercolor
+  <br>25 = Key Line
+  <br>27 = Miniature
+  <br>28 = Reflection
+  <br>29 = Fragmented
+  <br>32 = Dramatic Tone B&amp;W
+  <br>33 = Watercolor II</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
 </table></td></tr></table></blockquote>
 
 <h2><a name='ImageProcessing'>Olympus ImageProcessing Tags</a></h2>
@@ -2311,25 +2382,30 @@ the Make and Model are used to identify the extender)</span>
 <td class=c>undef</td>
 <td><span class=s><span class=n>(large unknown data block in ORF images but not JPG images)</span></span></td></tr>
 <tr class=b>
+<td title='0x0805 = 2053'>0x0805</td>
+<td>SensorCalibration</td>
+<td class=c>int16s[2]</td>
+<td><span class=s><span class=n>(2 numbers: 1. recommended maximum, 2. calibration midpoint)</span></span></td></tr>
+<tr>
 <td title='0x1010 = 4112'>0x1010</td>
 <td>NoiseReduction2</td>
 <td class=c>int16u</td>
 <td><span class=s>Bit 0 = Noise Reduction
   <br>Bit 1 = Noise Filter
   <br>Bit 2 = Noise Filter (ISO Boost)</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x1011 = 4113'>0x1011</td>
 <td>DistortionCorrection2</td>
 <td class=c>int16u</td>
 <td><span class=s>0 = Off
   <br>1 = On</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x1012 = 4114'>0x1012</td>
 <td>ShadingCompensation2</td>
 <td class=c>int16u</td>
 <td><span class=s>0 = Off
   <br>1 = On</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x101c = 4124'>0x101c</td>
 <td>MultipleExposureMode</td>
 <td class=c>int16u[2]</td>
@@ -2337,42 +2413,43 @@ the Make and Model are used to identify the extender)</span>
   <br>0 = Off
   <br>2 = On (2 frames)
   <br>3 = On (3 frames)</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x1103 = 4355'>0x1103</td>
 <td>UnknownBlock3?</td>
 <td class=c>undef</td>
 <td><span class=s><span class=n>(large unknown data block in ORF images but not JPG images)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x1104 = 4356'>0x1104</td>
 <td>UnknownBlock4?</td>
 <td class=c>undef</td>
 <td><span class=s><span class=n>(large unknown data block in ORF images but not JPG images)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x1112 = 4370'>0x1112</td>
 <td>AspectRatio</td>
 <td class=c>int8u[2]</td>
 <td><table class=cols><tr>
   <td>&#39;1 1&#39; = 4:3
+  <br>&#39;1 4&#39; = 1:1
   <br>&#39;2 2&#39; = 3:2
   <br>&#39;3 3&#39; = 16:9</td><td>&nbsp;&nbsp;</td>
   <td>&#39;4 4&#39; = 6:6
   <br>&#39;5 5&#39; = 5:4
-  <br>&#39;6 6&#39; = 7:6</td><td>&nbsp;&nbsp;</td>
-  <td>&#39;7 7&#39; = 6:5
-  <br>&#39;8 8&#39; = 7:5
+  <br>&#39;6 6&#39; = 7:6
+  <br>&#39;7 7&#39; = 6:5</td><td>&nbsp;&nbsp;</td>
+  <td>&#39;8 8&#39; = 7:5
   <br>&#39;9 9&#39; = 3:4</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr>
+<tr class=b>
 <td title='0x1113 = 4371'>0x1113</td>
 <td>AspectFrame</td>
 <td class=c>int16u[4]</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x1200 = 4608'>0x1200</td>
 <td>FacesDetected</td>
 <td class=c>int32u[n]</td>
 <td><span class=s><span class=n>(2 or 3 values)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x1201 = 4609'>0x1201</td>
 <td>FaceDetectArea</td>
 <td class=c>int16s[n]</td>
@@ -2380,21 +2457,26 @@ the Make and Model are used to identify the extender)</span>
 FaceDetectFrame for all 4 corners of the face rectangle.  For models with 3
 values in FacesDetected this gives X/Y coordinates, size and rotation angle
 of the face detect square)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x1202 = 4610'>0x1202</td>
 <td>MaxFaces</td>
 <td class=c>int32u[3]</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x1203 = 4611'>0x1203</td>
 <td>FaceDetectFrameSize</td>
 <td class=c>int16u[6]</td>
 <td><span class=s><span class=n>(width/height of the full face detect frame)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x1207 = 4615'>0x1207</td>
 <td>FaceDetectFrameCrop</td>
 <td class=c>int16s[12]</td>
 <td><span class=s><span class=n>(X/Y offset and width/height of the cropped face detect frame)</span></span></td></tr>
+<tr class=b>
+<td title='0x1306 = 4870'>0x1306</td>
+<td>CameraTemperature</td>
+<td class=c>N</td>
+<td><span class=s><span class=n>(this seems to be in degrees C only for some models)</span></span></td></tr>
 </table></td></tr></table></blockquote>
 
 <h2><a name='FocusInfo'>Olympus FocusInfo Tags</a></h2>
@@ -2548,8 +2630,7 @@ give AF point, upper bits give AF target selection mode)</span>
 <td title='0x1500 = 5376'>0x1500</td>
 <td>SensorTemperature</td>
 <td class=c>int16s</td>
-<td><span class=s><span class=n>(approximately Celsius for E-1, unknown calibration for E-3/410/420/510, and
-always zero for E-300/330/400/500, divide by 10 for E-P1?)</span></span></td></tr>
+<td>&nbsp;</td></tr>
 <tr class=b>
 <td title='0x1600 = 5632'>0x1600</td>
 <td>ImageStabilization</td>
@@ -3325,7 +3406,7 @@ like the LS-5, LS-10, LS-11.</p>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Apr 5, 2013</i>
+<br><i>Last revised Feb 6, 2014</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -19,11 +19,11 @@ extension level 3, including support for RC4, AES-128 and AES-256
 encryption.  A Password option is provided to allow processing of
 password-protected PDF files.</p>
 
-<p>When writing PDF files, ExifTool uses an incremental update.  This has the
-advantages of being fast and reversible.  The original PDF can be easily
-recovered by deleting the <code>PDF-update</code> pseudo-group (with
-<code>-PDF-update:all=</code> on the command line).  But there are two main
-disadvantages to this technique:</p>
+<p>ExifTool may be used to write native PDF and XMP metadata to PDF files. It
+uses an incremental update technique that has the advantages of being both
+fast and reversible.  The original PDF can be easily recovered by deleting
+the <code>PDF-update</code> pseudo-group (with <code>-PDF-update:all=</code> on the command
+line).  However, there are two main disadvantages to this technique:</p>
 
 <p>1) A linearized PDF file is no longer linearized after the update, so it
 must be subsequently re-linearized if this is required.</p>
@@ -739,7 +739,7 @@ false)</span>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Mar 4, 2013</i>
+<br><i>Last revised Oct 16, 2013</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -74,43 +74,49 @@ specification.</p>
 <td>'iCCP'</td>
 <td>ICC_Profile</td>
 <td class=c>-</td>
-<td>--&gt; <a href='ICC_Profile.html'>ICC_Profile Tags</a></td></tr>
+<td>--&gt; <a href='ICC_Profile.html'>ICC_Profile Tags</a>
+  <br><span class='n s'>(this is where ExifTool will write a new ICC_Profile)</span></td></tr>
 <tr>
+<td>'iCCP-name'</td>
+<td>ProfileName</td>
+<td class=c>N</td>
+<td><span class=s><span class=n>(not a real tag ID, this tag represents the iCCP profile name)</span></span></td></tr>
+<tr class=b>
 <td>'iTXt'</td>
 <td>InternationalText</td>
 <td class=c>-</td>
 <td>--&gt; <a href='PNG.html#TextualData'>PNG TextualData Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>'oFFs'</td>
 <td>ImageOffset</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>'pCAL'</td>
 <td>PixelCalibration</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>'pHYs'</td>
 <td>PhysicalPixel</td>
 <td class=c>-</td>
 <td>--&gt; <a href='PNG.html#PhysicalPixel'>PNG PhysicalPixel Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>'sBIT'</td>
 <td>SignificantBits</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>'sCAL'</td>
 <td>SubjectScale</td>
 <td class=c>-</td>
 <td>--&gt; <a href='PNG.html#SubjectScale'>PNG SubjectScale Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>'sPLT'</td>
 <td>SuggestedPalette</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>'sRGB'</td>
 <td>SRGBRendering</td>
 <td class=c>N</td>
@@ -118,38 +124,38 @@ specification.</p>
   <br>1 = Relative Colorimetric
   <br>2 = Saturation
   <br>3 = Absolute Colorimetric</span></td></tr>
-<tr>
+<tr class=b>
 <td>'sTER'</td>
 <td>StereoImage</td>
 <td class=c>-</td>
 <td>--&gt; <a href='PNG.html#StereoImage'>PNG StereoImage Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>'tEXt'</td>
 <td>TextualData</td>
 <td class=c>-</td>
 <td>--&gt; <a href='PNG.html#TextualData'>PNG TextualData Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>'tIME'</td>
 <td>ModifyDate</td>
 <td class=c>Y</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>'tRNS'</td>
 <td>Transparency</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>'tXMP'</td>
 <td>XMP</td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html'>XMP Tags</a>
   <br><span class='n s'>(obsolete location specified by a September 2001 XMP draft)</span></td></tr>
-<tr class=b>
+<tr>
 <td>'vpAg'</td>
 <td>VirtualPage</td>
 <td class=c>-</td>
 <td>--&gt; <a href='PNG.html#VirtualPage'>PNG VirtualPage Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>'zTXt'</td>
 <td>CompressedText</td>
 <td class=c>-</td>
@@ -336,73 +342,80 @@ ImageMagick.</p>
 <td class=c>string</td>
 <td><span class=s><span class=n>(unregistered)</span></span></td></tr>
 <tr class=b>
+<td>'Raw profile type 8bim'</td>
+<td>Photoshop_Profile</td>
+<td class=c>-</td>
+<td>--&gt; <a href='Photoshop.html'>Photoshop Tags</a>
+  <br><span class='n s'>(unregistered)</span></td></tr>
+<tr>
 <td>'Raw profile type APP1'</td>
 <td>APP1_Profile</td>
 <td class=c>-</td>
 <td>--&gt; <a href='EXIF.html'>EXIF Tags</a>
   <br>--&gt; <a href='XMP.html'>XMP Tags</a>
-  <br><span class='n s'>(unregistered)</span></td></tr>
-<tr>
+  <br><span class='n s'>(unregistered.  This is where ExifTool will create new EXIF)</span></td></tr>
+<tr class=b>
 <td>'Raw profile type exif'</td>
 <td>EXIF_Profile</td>
 <td class=c>-</td>
 <td>--&gt; <a href='EXIF.html'>EXIF Tags</a>
   <br><span class='n s'>(unregistered)</span></td></tr>
-<tr class=b>
+<tr>
 <td>'Raw profile type icc'</td>
 <td>ICC_Profile</td>
 <td class=c>-</td>
 <td>--&gt; <a href='ICC_Profile.html'>ICC_Profile Tags</a>
   <br><span class='n s'>(unregistered)</span></td></tr>
-<tr>
+<tr class=b>
 <td>'Raw profile type icm'</td>
 <td>ICC_Profile</td>
 <td class=c>-</td>
 <td>--&gt; <a href='ICC_Profile.html'>ICC_Profile Tags</a>
   <br><span class='n s'>(unregistered)</span></td></tr>
-<tr class=b>
+<tr>
 <td>'Raw profile type iptc'</td>
 <td>IPTC_Profile</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Photoshop.html'>Photoshop Tags</a>
-  <br><span class='n s'>(unregistered)</span></td></tr>
-<tr>
+  <br><span class='n s'>(unregistered.  May be either IPTC IIM or Photoshop IRB format.  This is
+where ExifTool will add new IPTC, inside a Photoshop IRB container)</span></td></tr>
+<tr class=b>
 <td>'Raw profile type xmp'</td>
 <td>XMP_Profile</td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html'>XMP Tags</a>
   <br><span class='n s'>(unregistered)</span></td></tr>
-<tr class=b>
+<tr>
 <td>'Software'</td>
 <td>Software</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>'Source'</td>
 <td>Source</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>'TimeStamp'</td>
 <td>TimeStamp</td>
 <td class=c>string</td>
 <td><span class=s><span class=n>(unregistered)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>'Title'</td>
 <td>Title</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>'URL'</td>
 <td>URL</td>
 <td class=c>string</td>
 <td><span class=s><span class=n>(unregistered)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>'Warning'</td>
 <td>PNGWarning</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>'XML:com.adobe.xmp'</td>
 <td>XMP</td>
 <td class=c>-</td>
@@ -410,12 +423,12 @@ ImageMagick.</p>
   <br><span class='n s'>(unregistered, but this is the location according to the June 2002 or later
 XMP specification, and is where ExifTool will add a new XMP chunk if the
 image didn't already contain XMP)</span></td></tr>
-<tr>
+<tr class=b>
 <td>'create-date'</td>
 <td>CreateDate</td>
 <td class=c>string</td>
 <td><span class=s><span class=n>(unregistered)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>'modify-date'</td>
 <td>ModDate</td>
 <td class=c>string</td>
@@ -509,7 +522,7 @@ image didn't already contain XMP)</span></td></tr>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Feb 8, 2012</i>
+<br><i>Last revised Nov 4, 2013</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -53,10 +53,15 @@ reference number and not the actual firmware version)</span></span></td></tr>
 <td title='0x0007 = 7'>0x0007</td>
 <td>FocusMode</td>
 <td class=c>int16u</td>
-<td><span class=s>1 = Auto
+<td><table class=cols><tr>
+  <td>1 = Auto
   <br>2 = Manual
   <br>4 = Auto, Focus button
-  <br>5 = Auto, Continuous</span></td></tr>
+  <br>5 = Auto, Continuous</td><td>&nbsp;&nbsp;</td>
+  <td>6 = AF-S
+  <br>7 = AF-C
+  <br>8 = AF-F</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
 <tr>
 <td title='0x000f = 15'>0x000f</td>
 <td>AFAreaMode</td>
@@ -77,7 +82,8 @@ reference number and not the actual firmware version)</span></span></td></tr>
   <br>&#39;32 1&#39; = 3-area (left)?
   <br>&#39;32 2&#39; = 3-area (center)?
   <br>&#39;32 3&#39; = 3-area (right)?
-  <br>&#39;64 0&#39; = Face Detect</td><td>&nbsp;&nbsp;</td></tr></table>
+  <br>&#39;64 0&#39; = Face Detect
+  <br>&#39;128 0&#39; = Spot Focusing 2</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
 <tr class=b>
 <td title='0x001a = 26'>0x001a</td>
@@ -85,7 +91,9 @@ reference number and not the actual firmware version)</span></span></td></tr>
 <td class=c>int16u</td>
 <td><span class=s>2 = On, Mode 1
   <br>3 = Off
-  <br>4 = On, Mode 2</span></td></tr>
+  <br>4 = On, Mode 2
+  <br>5 = Panning
+  <br>6 = On, Mode 3</span></td></tr>
 <tr>
 <td title='0x001c = 28'>0x001c</td>
 <td>MacroMode</td>
@@ -124,8 +132,8 @@ reference number and not the actual firmware version)</span></span></td></tr>
   <br>23 = Baby
   <br>24 = Soft Skin
   <br>25 = Candlelight
-  <br>26 = Starry Night</td><td>&nbsp;&nbsp;</td>
-  <td>27 = High Sensitivity
+  <br>26 = Starry Night
+  <br>27 = High Sensitivity
   <br>28 = Panorama Assist
   <br>29 = Underwater
   <br>30 = Beach
@@ -137,12 +145,13 @@ reference number and not the actual firmware version)</span></span></td></tr>
   <br>36 = High Speed Continuous Shooting
   <br>37 = Intelligent Auto
   <br>39 = Multi-aspect
-  <br>41 = Transform
-  <br>42 = Flash Burst
+  <br>41 = Transform</td><td>&nbsp;&nbsp;</td>
+  <td>42 = Flash Burst
   <br>43 = Pin Hole
   <br>44 = Film Grain
   <br>45 = My Color
   <br>46 = Photo Frame
+  <br>48 = Movie
   <br>51 = HDR
   <br>55 = Handheld Night Shot
   <br>57 = 3D
@@ -150,7 +159,31 @@ reference number and not the actual firmware version)</span></span></td></tr>
   <br>62 = Panorama
   <br>63 = Glass Through
   <br>64 = HDR
-  <br>66 = Digital Filter</td><td>&nbsp;&nbsp;</td></tr></table>
+  <br>66 = Digital Filter
+  <br>67 = Clear Portrait
+  <br>68 = Silky Skin
+  <br>69 = Backlit Softness
+  <br>70 = Clear in Backlight
+  <br>71 = Relaxing Tone
+  <br>72 = Sweet Child&#39;s Face
+  <br>73 = Distinct Scenery
+  <br>74 = Bright Blue Sky
+  <br>75 = Romantic Sunset Glow
+  <br>76 = Vivid Sunset Glow
+  <br>77 = Glistening Water
+  <br>78 = Clear Nightscape
+  <br>79 = Cool Night Sky
+  <br>80 = Warm Glowing Nightscape
+  <br>81 = Artistic Nightscape
+  <br>82 = Glittering Illuminations
+  <br>83 = Clear Night Portrait
+  <br>84 = Soft Image of a Flower
+  <br>85 = Appetizing Food
+  <br>86 = Cute Desert
+  <br>87 = Freeze Animal Motion
+  <br>88 = Clear Sports Shot
+  <br>89 = Monochrome
+  <br>90 = Creative Control</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
 <tr>
 <td title='0x0020 = 32'>0x0020</td>
@@ -192,10 +225,11 @@ same as the number printed on the camera body)</span></span></td></tr>
 <td><table class=cols><tr>
   <td>1 = Off
   <br>2 = Warm
-  <br>3 = Cool</td><td>&nbsp;&nbsp;</td>
-  <td>4 = Black &amp; White
-  <br>5 = Sepia
-  <br>6 = Happy</td><td>&nbsp;&nbsp;</td></tr></table>
+  <br>3 = Cool
+  <br>4 = Black &amp; White</td><td>&nbsp;&nbsp;</td>
+  <td>5 = Sepia
+  <br>6 = Happy
+  <br>8 = Vivid</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
 <tr class=b>
 <td title='0x0029 = 41'>0x0029</td>
@@ -207,11 +241,14 @@ written to memory card)</span></span></td></tr>
 <td title='0x002a = 42'>0x002a</td>
 <td>BurstMode</td>
 <td class=c>int16u</td>
-<td><span class=s><span class=n>(decoding may be different for some models)</span>
-  <br>0 = Off
+<td><span class=s><span class=n>(decoding may be different for some models)</span></span><table class=cols><tr>
+  <td>0 = Off
   <br>1 = On
   <br>2 = Auto Exposure Bracketing (AEB)
-  <br>4 = Unlimited</span></td></tr>
+  <br>4 = Unlimited
+  <br>8 = White Balance Bracketing
+  <br>17 = On (with flash)</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
 <tr class=b>
 <td title='0x002b = 43'>0x002b</td>
 <td>SequenceNumber</td>
@@ -402,22 +439,41 @@ L10 and LC80)</span></span><table class=cols><tr>
 <td class=c>int16u</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
+<td title='0x0045 = 69'>0x0045</td>
+<td>BracketSettings</td>
+<td class=c>int16u</td>
+<td><table class=cols><tr>
+  <td>0 = No Bracket
+  <br>1 = 3 Images, Sequence 0/-/+
+  <br>2 = 3 Images, Sequence -/0/+
+  <br>3 = 5 Images, Sequence 0/-/+
+  <br>4 = 5 Images, Sequence -/0/+
+  <br>5 = 7 Images, Sequence 0/-/+
+  <br>6 = 7 Images, Sequence -/0/+</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr>
 <td title='0x0046 = 70'>0x0046</td>
 <td>WBShiftAB</td>
 <td class=c>int16u</td>
 <td><span class=s><span class=n>(positive is a shift toward blue)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x0047 = 71'>0x0047</td>
 <td>WBShiftGM</td>
 <td class=c>int16u</td>
 <td><span class=s><span class=n>(positive is a shift toward green)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0048 = 72'>0x0048</td>
 <td>FlashCurtain</td>
 <td class=c>int16u</td>
 <td><span class=s>0 = n/a
   <br>1 = 1st
   <br>2 = 2nd</span></td></tr>
+<tr class=b>
+<td title='0x0049 = 73'>0x0049</td>
+<td>LongExposureNoiseReduction</td>
+<td class=c>int16u</td>
+<td><span class=s>1 = Off
+  <br>2 = On</span></td></tr>
 <tr>
 <td title='0x004b = 75'>0x004b</td>
 <td>PanasonicImageWidth</td>
@@ -441,19 +497,24 @@ L10 and LC80)</span></span><table class=cols><tr>
 <tr>
 <td title='0x0051 = 81'>0x0051</td>
 <td>LensType</td>
-<td class=c>N</td>
+<td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
 <td title='0x0052 = 82'>0x0052</td>
 <td>LensSerialNumber</td>
-<td class=c>N</td>
+<td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr>
 <td title='0x0053 = 83'>0x0053</td>
 <td>AccessoryType</td>
-<td class=c>N</td>
+<td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
+<td title='0x0054 = 84'>0x0054</td>
+<td>AccessorySerialNumber</td>
+<td class=c>string</td>
+<td>&nbsp;</td></tr>
+<tr>
 <td title='0x0059 = 89'>0x0059</td>
 <td>Transform</td>
 <td class=c>undef[4]</td>
@@ -463,7 +524,7 @@ L10 and LC80)</span></span><table class=cols><tr>
   <br>&#39;0 0&#39; = Off
   <br>&#39;1 1&#39; = Stretch Low
   <br>&#39;3 2&#39; = Stretch High</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x005d = 93'>0x005d</td>
 <td>IntelligentExposure</td>
 <td class=c>int16u</td>
@@ -472,6 +533,11 @@ L10 and LC80)</span></span><table class=cols><tr>
   <br>1 = Low
   <br>2 = Standard
   <br>3 = High</span></td></tr>
+<tr>
+<td title='0x0060 = 96'>0x0060</td>
+<td>LensFirmwareVersion</td>
+<td class=c>undef[4]</td>
+<td>&nbsp;</td></tr>
 <tr class=b>
 <td title='0x0061 = 97'>0x0061</td>
 <td>FaceRecInfo</td>
@@ -533,6 +599,11 @@ L10 and LC80)</span></span><table class=cols><tr>
   <br>3 = High
   <br>4 = Extended</span></td></tr>
 <tr>
+<td title='0x0077 = 119'>0x0077</td>
+<td>BurstSpeed</td>
+<td class=c>int16u</td>
+<td><span class=s><span class=n>(images per second)</span></span></td></tr>
+<tr class=b>
 <td title='0x0079 = 121'>0x0079</td>
 <td>IntelligentD-Range</td>
 <td class=c>int16u</td>
@@ -540,6 +611,12 @@ L10 and LC80)</span></span><table class=cols><tr>
   <br>1 = Low
   <br>2 = Standard
   <br>3 = High</span></td></tr>
+<tr>
+<td title='0x007c = 124'>0x007c</td>
+<td>ClearRetouch</td>
+<td class=c>int16u</td>
+<td><span class=s>0 = Off
+  <br>1 = On</span></td></tr>
 <tr class=b>
 <td title='0x0086 = 134'>0x0086</td>
 <td>ManometerPressure</td>
@@ -559,16 +636,116 @@ L10 and LC80)</span></span><table class=cols><tr>
   <br>6 = Portrait</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
 <tr class=b>
+<td title='0x008a = 138'>0x008a</td>
+<td>ShadingCompensation</td>
+<td class=c>int16u</td>
+<td><span class=s>0 = Off
+  <br>1 = On</span></td></tr>
+<tr>
+<td title='0x008c = 140'>0x008c</td>
+<td>AccelerometerZ</td>
+<td class=c>int16u</td>
+<td><span class=s><span class=n>(positive is acceleration upwards)</span></span></td></tr>
+<tr class=b>
+<td title='0x008d = 141'>0x008d</td>
+<td>AccelerometerX</td>
+<td class=c>int16u</td>
+<td><span class=s><span class=n>(positive is acceleration to the left)</span></span></td></tr>
+<tr>
+<td title='0x008e = 142'>0x008e</td>
+<td>AccelerometerY</td>
+<td class=c>int16u</td>
+<td><span class=s><span class=n>(positive is acceleration backwards)</span></span></td></tr>
+<tr class=b>
+<td title='0x008f = 143'>0x008f</td>
+<td>CameraOrientation</td>
+<td class=c>int8u</td>
+<td><table class=cols><tr>
+  <td>0 = Normal
+  <br>1 = Rotate CW
+  <br>2 = Rotate 180</td><td>&nbsp;&nbsp;</td>
+  <td>3 = Rotate CCW
+  <br>4 = Tilt Upwards
+  <br>5 = Tilt Downwards</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr>
+<td title='0x0090 = 144'>0x0090</td>
+<td>RollAngle</td>
+<td class=c>int16u</td>
+<td><span class=s><span class=n>(degrees of clockwise camera rotation)</span></span></td></tr>
+<tr class=b>
+<td title='0x0091 = 145'>0x0091</td>
+<td>PitchAngle</td>
+<td class=c>int16u</td>
+<td><span class=s><span class=n>(degrees of upward camera tilt)</span></span></td></tr>
+<tr>
+<td title='0x0093 = 147'>0x0093</td>
+<td>SweepPanoramaDirection</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Off
+  <br>1 = Left to Right
+  <br>2 = Right to Left
+  <br>3 = Top to Bottom
+  <br>4 = Bottom to Top</span></td></tr>
+<tr class=b>
+<td title='0x0094 = 148'>0x0094</td>
+<td>SweepPanoramaFieldOfView</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x0096 = 150'>0x0096</td>
+<td>TimerRecording</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Off
+  <br>1 = Time Lapse
+  <br>2 = Stop-motion Animation</span></td></tr>
+<tr class=b>
+<td title='0x009d = 157'>0x009d</td>
+<td>InternalNDFilter</td>
+<td class=c>rational64u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x009e = 158'>0x009e</td>
+<td>HDR</td>
+<td class=c>int16u</td>
+<td><table class=cols><tr>
+  <td>0 = Off
+  <br>100 = 1 EV
+  <br>200 = 2 EV
+  <br>300 = 3 EV</td><td>&nbsp;&nbsp;</td>
+  <td>32868 = 1 EV (Auto)
+  <br>32968 = 2 EV (Auto)
+  <br>33068 = 3 EV (Auto)</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr class=b>
+<td title='0x009f = 159'>0x009f</td>
+<td>ShutterType</td>
+<td class=c>int16u</td>
+<td><span class=s>0 = Mechanical
+  <br>1 = Electronic
+  <br>2 = Hybrid</span></td></tr>
+<tr>
+<td title='0x00a3 = 163'>0x00a3</td>
+<td>ClearRetouchValue</td>
+<td class=c>rational64u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x00ab = 171'>0x00ab</td>
+<td>TouchAE</td>
+<td class=c>int16u</td>
+<td><span class=s>0 = Off
+  <br>1 = On</span></td></tr>
+<tr>
 <td title='0x0e00 = 3584'>0x0e00</td>
 <td>PrintIM</td>
 <td class=c>-</td>
 <td>--&gt; <a href='PrintIM.html'>PrintIM Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td title='0x8000 = 32768'>0x8000</td>
 <td>MakerNoteVersion</td>
 <td class=c>undef</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x8001 = 32769'>0x8001</td>
 <td>SceneMode</td>
 <td class=c>int16u</td>
@@ -599,8 +776,8 @@ L10 and LC80)</span></span><table class=cols><tr>
   <br>23 = Baby
   <br>24 = Soft Skin
   <br>25 = Candlelight
-  <br>26 = Starry Night</td><td>&nbsp;&nbsp;</td>
-  <td>27 = High Sensitivity
+  <br>26 = Starry Night
+  <br>27 = High Sensitivity
   <br>28 = Panorama Assist
   <br>29 = Underwater
   <br>30 = Beach
@@ -611,13 +788,14 @@ L10 and LC80)</span></span><table class=cols><tr>
   <br>35 = Clipboard
   <br>36 = High Speed Continuous Shooting
   <br>37 = Intelligent Auto
-  <br>39 = Multi-aspect
-  <br>41 = Transform
+  <br>39 = Multi-aspect</td><td>&nbsp;&nbsp;</td>
+  <td>41 = Transform
   <br>42 = Flash Burst
   <br>43 = Pin Hole
   <br>44 = Film Grain
   <br>45 = My Color
   <br>46 = Photo Frame
+  <br>48 = Movie
   <br>51 = HDR
   <br>55 = Handheld Night Shot
   <br>57 = 3D
@@ -625,47 +803,71 @@ L10 and LC80)</span></span><table class=cols><tr>
   <br>62 = Panorama
   <br>63 = Glass Through
   <br>64 = HDR
-  <br>66 = Digital Filter</td><td>&nbsp;&nbsp;</td></tr></table>
+  <br>66 = Digital Filter
+  <br>67 = Clear Portrait
+  <br>68 = Silky Skin
+  <br>69 = Backlit Softness
+  <br>70 = Clear in Backlight
+  <br>71 = Relaxing Tone
+  <br>72 = Sweet Child&#39;s Face
+  <br>73 = Distinct Scenery
+  <br>74 = Bright Blue Sky
+  <br>75 = Romantic Sunset Glow
+  <br>76 = Vivid Sunset Glow
+  <br>77 = Glistening Water
+  <br>78 = Clear Nightscape
+  <br>79 = Cool Night Sky
+  <br>80 = Warm Glowing Nightscape
+  <br>81 = Artistic Nightscape
+  <br>82 = Glittering Illuminations
+  <br>83 = Clear Night Portrait
+  <br>84 = Soft Image of a Flower
+  <br>85 = Appetizing Food
+  <br>86 = Cute Desert
+  <br>87 = Freeze Animal Motion
+  <br>88 = Clear Sports Shot
+  <br>89 = Monochrome
+  <br>90 = Creative Control</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr>
+<tr class=b>
 <td title='0x8004 = 32772'>0x8004</td>
 <td>WBRedLevel</td>
 <td class=c>int16u</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x8005 = 32773'>0x8005</td>
 <td>WBGreenLevel</td>
 <td class=c>int16u</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x8006 = 32774'>0x8006</td>
 <td>WBBlueLevel</td>
 <td class=c>int16u</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x8007 = 32775'>0x8007</td>
 <td>FlashFired</td>
 <td class=c>int16u</td>
 <td><span class=s>1 = No
   <br>2 = Yes</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x8008 = 32776'>0x8008</td>
 <td>TextStamp</td>
 <td class=c>int16u</td>
 <td><span class=s>1 = Off
   <br>2 = On</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x8009 = 32777'>0x8009</td>
 <td>TextStamp</td>
 <td class=c>int16u</td>
 <td><span class=s>1 = Off
   <br>2 = On</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x8010 = 32784'>0x8010</td>
 <td>BabyAge</td>
 <td class=c>string</td>
 <td><span class=s><span class=n>(or pet age)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x8012 = 32786'>0x8012</td>
 <td>Transform</td>
 <td class=c>undef[4]</td>
@@ -1226,7 +1428,8 @@ on the M9, or the focal length of some multi-focal lenses.</p>
 </table></td></tr></table></blockquote>
 
 <h2><a name='Leica6'>Panasonic Leica6 Tags</a></h2>
-<p>This information is written by the S2 (as a trailer in JPEG images).</p>
+<p>This information is written by the S2 and M (Typ 240), as a trailer in JPEG
+images.</p>
 <blockquote>
 <table class=frame><tr><td>
 <table class=inner cellspacing=1>
@@ -1236,7 +1439,7 @@ on the M9, or the focal length of some multi-focal lenses.</p>
 <td title='0x0300 = 768'>0x0300</td>
 <td>PreviewImage</td>
 <td class=c>undef</td>
-<td><span class=s><span class=n>(S2)</span></span></td></tr>
+<td><span class=s><span class=n>(S2 and M (Typ 240))</span></span></td></tr>
 <tr class=b>
 <td title='0x0301 = 769'>0x0301</td>
 <td>UnknownBlock?</td>
@@ -1245,7 +1448,7 @@ on the M9, or the focal length of some multi-focal lenses.</p>
 <tr>
 <td title='0x0303 = 771'>0x0303</td>
 <td>LensType</td>
-<td class=c>N</td>
+<td class=c>string</td>
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
@@ -1287,7 +1490,7 @@ as the DMC-FT20.</p>
 <td class=r title='88 = 0x58'>88</td>
 <td>ThumbnailWidth</td>
 <td class=c>N</td>
-<td>&nbsp;</td></tr>
+<td><span class=s><span class=n>(Panasonic models)</span></span></td></tr>
 <tr>
 <td class=r title='90 = 0x5a'>90</td>
 <td>ThumbnailHeight</td>
@@ -1299,6 +1502,26 @@ as the DMC-FT20.</p>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td class=r title='1334 = 0x536'>1334</td>
+<td>ThumbnailWidth</td>
+<td class=c>N</td>
+<td><span class=s><span class=n>(Leica X Vario)</span></span></td></tr>
+<tr class=b>
+<td class=r title='1338 = 0x53a'>1338</td>
+<td>ThumbnailHeight</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='1342 = 0x53e'>1342</td>
+<td>ThumbnailLength</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='1350 = 0x546'>1350</td>
+<td>ThumbnailImage</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
 <td class=r title='16488 = 0x4068'>16488</td>
 <td>ExifData</td>
 <td class=c>-</td>
@@ -1306,54 +1529,74 @@ as the DMC-FT20.</p>
 </table></td></tr></table></blockquote>
 
 <h2><a name='AdvancedSceneMode'>Panasonic AdvancedSceneMode Values</a></h2>
-<p>A Composite tag derived from SceneMode and AdvancedSceneType.</p>
+<p>A Composite tag derived from Model, SceneMode and AdvancedSceneType.</p>
 <blockquote>
 <table class=frame><tr><td>
 <table class='inner sep' cellspacing=1>
 <tr class=h><th>Value</th><th>AdvancedSceneMode</th><th>Value</th><th>AdvancedSceneMode</th></tr>
 <tr><td>'0 1'</td><td>= Off</td>
-<td class=b>'45 10'</td><td class=b>= Elegant</td>
+<td class=b>'59 5'</td><td class=b>= High Dynamic</td>
 </tr><tr><td>'2 2'</td><td>= Outdoor Portrait</td>
-<td class=b>'45 12'</td><td class=b>= Monochrome</td>
+<td class=b>'59 6'</td><td class=b>= Miniature</td>
 </tr><tr><td>'2 3'</td><td>= Indoor Portrait</td>
-<td class=b>'45 13'</td><td class=b>= Dynamic Art</td>
+<td class=b>'59 9'</td><td class=b>= Low Key</td>
 </tr><tr><td>'2 4'</td><td>= Creative Portrait</td>
-<td class=b>'45 14'</td><td class=b>= Silhouette</td>
+<td class=b>'59 10'</td><td class=b>= Toy Effect</td>
 </tr><tr><td>'3 2'</td><td>= Nature</td>
-<td class=b>'51 2'</td><td class=b>= HDR Art</td>
+<td class=b>'59 11'</td><td class=b>= Dynamic Monochrome</td>
 </tr><tr><td>'3 3'</td><td>= Architecture</td>
-<td class=b>'51 3'</td><td class=b>= HDR B&amp;W</td>
+<td class=b>'59 12'</td><td class=b>= Soft</td>
 </tr><tr><td>'3 4'</td><td>= Creative Scenery</td>
-<td class=b>'59 1'</td><td class=b>= Expressive</td>
+<td class=b>'66 1'</td><td class=b>= Impressive Art</td>
 </tr><tr><td>'4 2'</td><td>= Outdoor Sports</td>
-<td class=b>'59 2'</td><td class=b>= Retro</td>
+<td class=b>'66 2'</td><td class=b>= Cross Process</td>
 </tr><tr><td>'4 3'</td><td>= Indoor Sports</td>
-<td class=b>'59 3'</td><td class=b>= High Key</td>
+<td class=b>'66 3'</td><td class=b>= Color Select</td>
 </tr><tr><td>'4 4'</td><td>= Creative Sports</td>
-<td class=b>'59 4'</td><td class=b>= Sepia</td>
+<td class=b>'66 4'</td><td class=b>= Star</td>
 </tr><tr><td>'9 2'</td><td>= Flower</td>
-<td class=b>'59 5'</td><td class=b>= High Dynamic</td>
+<td class=b>'90 3'</td><td class=b>= Old Days</td>
 </tr><tr><td>'9 3'</td><td>= Objects</td>
-<td class=b>'59 6'</td><td class=b>= Minature</td>
+<td class=b>'90 4'</td><td class=b>= Sunshine</td>
 </tr><tr><td>'9 4'</td><td>= Creative Macro</td>
-<td class=b>'59 9'</td><td class=b>= Low Key</td>
+<td class=b>'90 5'</td><td class=b>= Bleach Bypass</td>
 </tr><tr><td>'21 2'</td><td>= Illuminations</td>
-<td class=b>'59 10'</td><td class=b>= Toy Effect</td>
+<td class=b>'90 6'</td><td class=b>= Toy Pop</td>
 </tr><tr><td>'21 4'</td><td>= Creative Night Scenery</td>
-<td class=b>'59 11'</td><td class=b>= Dynamic Monochrome</td>
+<td class=b>'90 7'</td><td class=b>= Fantasy</td>
 </tr><tr><td>'45 2'</td><td>= Cinema</td>
-<td class=b>'59 12'</td><td class=b>= Soft</td>
+<td class=b>'90 8'</td><td class=b>= Monochrome</td>
 </tr><tr><td>'45 7'</td><td>= Expressive</td>
-<td class=b>'66 2'</td><td class=b>= Cross Process</td>
+<td class=b>'90 9'</td><td class=b>= Rough Monochrome</td>
 </tr><tr><td>'45 8'</td><td>= Retro</td>
-<td class=b>'66 3'</td><td class=b>= Color Select</td>
+<td class=b>'90 10'</td><td class=b>= Silky Monochrome</td>
 </tr><tr><td>'45 9'</td><td>= Pure</td>
-<td class=b>'66 4'</td><td class=b>= Star</td>
+<td class=b>'DMC-TZ40 90 1'</td><td class=b>= Expressive</td>
+</tr><tr><td>'45 10'</td><td>= Elegant</td>
+<td class=b>'DMC-TZ40 90 2'</td><td class=b>= Retro</td>
+</tr><tr><td>'45 12'</td><td>= Monochrome</td>
+<td class=b>'DMC-TZ40 90 3'</td><td class=b>= High Key</td>
+</tr><tr><td>'45 13'</td><td>= Dynamic Art</td>
+<td class=b>'DMC-TZ40 90 4'</td><td class=b>= Sepia</td>
+</tr><tr><td>'45 14'</td><td>= Silhouette</td>
+<td class=b>'DMC-TZ40 90 5'</td><td class=b>= High Dynamic</td>
+</tr><tr><td>'51 2'</td><td>= HDR Art</td>
+<td class=b>'DMC-TZ40 90 6'</td><td class=b>= Miniature</td>
+</tr><tr><td>'51 3'</td><td>= HDR B&amp;W</td>
+<td class=b>'DMC-TZ40 90 9'</td><td class=b>= Low Key</td>
+</tr><tr><td>'59 1'</td><td>= Expressive</td>
+<td class=b>'DMC-TZ40 90 10'</td><td class=b>= Toy Effect</td>
+</tr><tr><td>'59 2'</td><td>= Retro</td>
+<td class=b>'DMC-TZ40 90 11'</td><td class=b>= Dynamic Monochrome</td>
+</tr><tr><td>'59 3'</td><td>= High Key</td>
+<td class=b>'DMC-TZ40 90 12'</td><td class=b>= Soft</td>
+</tr><tr><td>'59 4'</td><td>= Sepia</td>
+<td class=b>&nbsp;</td><td class=b>&nbsp;</td>
 </tr></table></td></tr></table></blockquote>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Apr 10, 2013</i>
+<br><i>Last revised Feb 12, 2014</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -49,6 +49,37 @@
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
+<td title='0x0008 = 8'>0x0008</td>
+<td>BlackLevel1</td>
+<td class=c>int16u</td>
+<td><span class=s><span class=n>(summing BlackLevel1+2+3 values gives the common bias that must be added to
+the BlackLevelRed/Green/Blue tags below)</span></span></td></tr>
+<tr>
+<td title='0x0009 = 9'>0x0009</td>
+<td>BlackLevel2</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x000a = 10'>0x000a</td>
+<td>BlackLevel3</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x000e = 14'>0x000e</td>
+<td>LinearityLimitRed</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x000f = 15'>0x000f</td>
+<td>LinearityLimitGreen</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x0010 = 16'>0x0010</td>
+<td>LinearityLimitBlue</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td title='0x0011 = 17'>0x0011</td>
 <td>RedBalance</td>
 <td class=c>int16u</td>
@@ -64,6 +95,36 @@
 <td class=c>int16u</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td title='0x0018 = 24'>0x0018</td>
+<td>HighISOMultiplierRed</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x0019 = 25'>0x0019</td>
+<td>HighISOMultiplierGreen</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x001a = 26'>0x001a</td>
+<td>HighISOMultiplierBlue</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x001c = 28'>0x001c</td>
+<td>BlackLevelRed</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x001d = 29'>0x001d</td>
+<td>BlackLevelGreen</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x001e = 30'>0x001e</td>
+<td>BlackLevelBlue</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr>
 <td title='0x0024 = 36'>0x0024</td>
 <td>WBRedLevel</td>
 <td class=c>int16u</td>
@@ -208,7 +269,7 @@
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Sep 6, 2012</i>
+<br><i>Last revised Feb 12, 2014</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -213,13 +213,16 @@ different from other models)</span>
   <br>2 = Infinity
   <br>3 = Manual
   <br>4 = Super Macro
-  <br>5 = Pan Focus</td><td>&nbsp;&nbsp;</td>
-  <td>16 = AF-S
-  <br>17 = AF-C
-  <br>18 = AF-A
-  <br>32 = Contrast-detect
-  <br>33 = Tracking Contrast-detect
-  <br>288 = Face Detect</td><td>&nbsp;&nbsp;</td></tr></table>
+  <br>5 = Pan Focus
+  <br>16 = AF-S (Focus-priority)
+  <br>17 = AF-C (Focus-priority)</td><td>&nbsp;&nbsp;</td>
+  <td>18 = AF-A (Focus-priority)
+  <br>32 = Contrast-detect (Focus-priority)
+  <br>33 = Tracking Contrast-detect (Focus-priority)
+  <br>272 = AF-S (Release-priority)
+  <br>273 = AF-C (Release-priority)
+  <br>274 = AF-A (Release-priority)
+  <br>288 = Contrast-detect (Release-priority)</td><td>&nbsp;&nbsp;</td></tr></table>
 <span class=s><span class=n>(Asahi models)</span>
   <br>0 = Normal
   <br>1 = Macro (1)
@@ -247,11 +250,46 @@ different from other models)</span>
   <br>65533 = Automatic Tracking AF
   <br>65534 = Fixed Center
   <br>65535 = Auto</td><td>&nbsp;&nbsp;</td></tr></table>
+<span class=s>[Value 0]</span><table class=cols><tr>
+  <td>0 = None
+  <br>1 = Top-left
+  <br>2 = Top Near-left
+  <br>3 = Top
+  <br>4 = Top Near-right
+  <br>5 = Top-right
+  <br>6 = Upper-left
+  <br>7 = Upper Near-left
+  <br>8 = Upper-midle
+  <br>9 = Upper Near-right
+  <br>10 = Upper-right
+  <br>11 = Far Left
+  <br>12 = Left
+  <br>13 = Near-left
+  <br>14 = Center
+  <br>15 = Near-right
+  <br>16 = Right</td><td>&nbsp;&nbsp;</td>
+  <td>17 = Far Right
+  <br>18 = Lower-left
+  <br>19 = Lower Near-left
+  <br>20 = Lower-middle
+  <br>21 = Lower Near-right
+  <br>22 = Lower-right
+  <br>23 = Bottom-left
+  <br>24 = Bottom Near-left
+  <br>25 = Bottom
+  <br>26 = Bottom Near-right
+  <br>27 = Bottom-right
+  <br>65531 = AF Select
+  <br>65532 = Face Detect AF
+  <br>65533 = Automatic Tracking AF
+  <br>65534 = Fixed Center
+  <br>65535 = Auto</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
 <tr>
 <td title='0x000f = 15'>0x000f</td>
-<td>AFPointsInFocus</td>
-<td class=c>int16u</td>
+<td>AFPointsInFocus
+  <br>AFPointsInFocus</td>
+<td class=c>int16u<br>int32u</td>
 <td><table class=cols><tr>
   <td>0x0 = Fixed Center or Multiple
   <br>0x1 = Top-left
@@ -264,6 +302,34 @@ different from other models)</span>
   <br>0x8 = Bottom-center
   <br>0x9 = Bottom-right
   <br>0xffff = None</td><td>&nbsp;&nbsp;</td></tr></table>
+<table class=cols><tr>
+  <td>Bit 0 = Top-left
+  <br>Bit 1 = Top Near-left
+  <br>Bit 2 = Top
+  <br>Bit 3 = Top Near-right
+  <br>Bit 4 = Top-right
+  <br>Bit 5 = Upper-left
+  <br>Bit 6 = Upper Near-left
+  <br>Bit 7 = Upper-midle
+  <br>Bit 8 = Upper Near-right
+  <br>Bit 9 = Upper-right
+  <br>Bit 10 = Far Left
+  <br>Bit 11 = Left
+  <br>Bit 12 = Near-left
+  <br>Bit 13 = Center
+  <br>Bit 14 = Near-right
+  <br>Bit 15 = Right
+  <br>Bit 16 = Far Right
+  <br>Bit 17 = Lower-left
+  <br>Bit 18 = Lower Near-left
+  <br>Bit 19 = Lower-middle
+  <br>Bit 20 = Lower Near-right
+  <br>Bit 21 = Lower-right
+  <br>Bit 22 = Bottom-left
+  <br>Bit 23 = Bottom Near-left
+  <br>Bit 24 = Bottom
+  <br>Bit 25 = Bottom Near-right
+  <br>Bit 26 = Bottom-right</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
 <tr class=b>
 <td title='0x0010 = 16'>0x0010</td>
@@ -383,10 +449,12 @@ available.  Extended bracket values are printed as &#39;WB-BA&#39;, &#39;WB-GM&#
   <br>4 = Tungsten
   <br>5 = Manual
   <br>6 = Daylight Fluorescent
-  <br>7 = Day White Fluorescent</td><td>&nbsp;&nbsp;</td>
-  <td>8 = White Fluorescent
-  <br>9 = Flash
+  <br>7 = Day White Fluorescent
+  <br>8 = White Fluorescent</td><td>&nbsp;&nbsp;</td>
+  <td>9 = Flash
   <br>10 = Cloudy
+  <br>11 = Warm White Fluorescent
+  <br>14 = Multi Auto
   <br>15 = Color Temperature Enhancement
   <br>17 = Kelvin
   <br>65534 = Unknown
@@ -614,13 +682,14 @@ available.  Extended bracket values are printed as &#39;WB-BA&#39;, &#39;WB-GM&#
 <td title='0x0034 = 52'>0x0034</td>
 <td>DriveMode</td>
 <td class=c>int8u[4]</td>
-<td><span class=s>[Value 0]
-  <br>0 = Single-frame
+<td><span class=s>[Value 0]</span><table class=cols><tr>
+  <td>0 = Single-frame
   <br>1 = Continuous
-  <br>2 = Continuous (Lo)
-  <br>3 = Burst
-  <br>255 = Video
-  <br>[Value 1]</span><table class=cols><tr>
+  <br>2 = Continuous (Lo)</td><td>&nbsp;&nbsp;</td>
+  <td>3 = Burst
+  <br>4 = Continuous (Medium)
+  <br>255 = Video</td><td>&nbsp;&nbsp;</td></tr></table>
+<span class=s>[Value 1]</span><table class=cols><tr>
   <td>0 = No Timer
   <br>1 = Self-timer (12 s)
   <br>2 = Self-timer (2 s)</td><td>&nbsp;&nbsp;</td>
@@ -720,8 +789,9 @@ available.  Extended bracket values are printed as &#39;WB-BA&#39;, &#39;WB-GM&#
   <br>1 = On</span></td></tr>
 <tr>
 <td title='0x004d = 77'>0x004d</td>
-<td>FlashExposureComp</td>
-<td class=c>int32s</td>
+<td>FlashExposureComp
+  <br>FlashExposureComp</td>
+<td class=c>int32s<br>int8s[2]</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
 <td title='0x004f = 79'>0x004f</td>
@@ -788,7 +858,8 @@ available.  Extended bracket values are printed as &#39;WB-BA&#39;, &#39;WB-GM&#
 <td title='0x005c = 92'>0x005c</td>
 <td>ShakeReductionInfo</td>
 <td class=c>-</td>
-<td>--&gt; <a href='Pentax.html#SRInfo'>Pentax SRInfo Tags</a></td></tr>
+<td>--&gt; <a href='Pentax.html#SRInfo'>Pentax SRInfo Tags</a>
+  <br>--&gt; <a href='Pentax.html#SRInfo2'>Pentax SRInfo2 Tags</a></td></tr>
 <tr>
 <td title='0x005d = 93'>0x005d</td>
 <td>ShutterCount</td>
@@ -815,7 +886,8 @@ for live view or video recording)</span></span></td></tr>
   <br>9 = 9 (Q)
   <br>10 = 10 (K-01,K-30)
   <br>11 = 11 (Q10)
-  <br>12 = 12 (MX-1)</td><td>&nbsp;&nbsp;</td></tr></table>
+  <br>12 = 12 (MX-1)
+  <br>13 = 13 (K-3)</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
 <tr class=b>
 <td title='0x0067 = 103'>0x0067</td>
@@ -846,9 +918,11 @@ for live view or video recording)</span></span></td></tr>
 other models)</span></span><table class=cols><tr>
   <td>&#39;0 0 0 0&#39; = Off
   <br>&#39;0 1 0 0&#39; = Off (enabled)
+  <br>&#39;0 2&#39; = Off 2 (auto)
   <br>&#39;0 2 0 0&#39; = Off (auto)
   <br>&#39;1 0 0 0&#39; = On
   <br>&#39;1 1 0 0&#39; = On (enabled)
+  <br>&#39;1 2&#39; = On 2 (auto)
   <br>&#39;1 2 0 0&#39; = On (auto)</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
 <tr>
@@ -992,9 +1066,10 @@ other models)</span></span><table class=cols><tr>
 <td><table class=cols><tr>
   <td>0 = Off
   <br>1 = On
-  <br>&#39;0 0&#39; = Off
-  <br>&#39;1 1&#39; = Weak</td><td>&nbsp;&nbsp;</td>
-  <td>&#39;1 2&#39; = Normal
+  <br>2 = Auto 2
+  <br>&#39;0 0&#39; = Off</td><td>&nbsp;&nbsp;</td>
+  <td>&#39;1 1&#39; = Weak
+  <br>&#39;1 2&#39; = Normal
   <br>&#39;1 3&#39; = Strong
   <br>&#39;2 4&#39; = Auto</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
@@ -1057,44 +1132,62 @@ other models)</span></span><table class=cols><tr>
   <br>2 = Medium
   <br>3 = High</span></td></tr>
 <tr class=b>
+<td title='0x0085 = 133'>0x0085</td>
+<td>HDR</td>
+<td class=c>int8u[4]</td>
+<td><span class=s>[Value 0]
+  <br>0 = Off
+  <br>1 = HDR Auto
+  <br>2 = HDR 1
+  <br>3 = HDR 2
+  <br>4 = HDR 3
+  <br>[Value 1]
+  <br>0 = Auto-align Off
+  <br>1 = Auto-align On
+  <br>[Value 2]
+  <br>0 = n/a
+  <br>4 = 1 EV
+  <br>8 = 2 EV
+  <br>12 = 3 EV</span></td></tr>
+<tr>
 <td title='0x0088 = 136'>0x0088</td>
 <td>NeutralDensityFilter</td>
 <td class=c>int8u</td>
 <td><span class=s>0 = Off
   <br>1 = On</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x008b = 139'>0x008b</td>
 <td>ISO</td>
 <td class=c>int32u</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x0200 = 512'>0x0200</td>
 <td>BlackPoint</td>
 <td class=c>int16u[4]</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0201 = 513'>0x0201</td>
 <td>WhitePoint</td>
 <td class=c>int16u[4]</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x0203 = 515'>0x0203</td>
 <td>ColorMatrixA</td>
 <td class=c>int16s[9]</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0204 = 516'>0x0204</td>
 <td>ColorMatrixB</td>
 <td class=c>int16s[9]</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x0205 = 517'>0x0205</td>
 <td>CameraSettings
   <br>CameraSettingsUnknown</td>
 <td class=c>-<br>-</td>
 <td>--&gt; <a href='Pentax.html#CameraSettings'>Pentax CameraSettings Tags</a>
   <br>--&gt; <a href='Pentax.html#CameraSettingsUnknown'>Pentax CameraSettingsUnknown Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td title='0x0206 = 518'>0x0206</td>
 <td>AEInfo
   <br>AEInfo2
@@ -1105,7 +1198,7 @@ other models)</span></span><table class=cols><tr>
   <br>--&gt; <a href='Pentax.html#AEInfo2'>Pentax AEInfo2 Tags</a>
   <br>--&gt; <a href='Pentax.html#AEInfo3'>Pentax AEInfo3 Tags</a>
   <br>--&gt; <a href='Pentax.html#AEInfoUnknown'>Pentax AEInfoUnknown Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0207 = 519'>0x0207</td>
 <td>LensInfo</td>
 <td class=c>-</td>
@@ -1114,203 +1207,203 @@ other models)</span></span><table class=cols><tr>
   <br>--&gt; <a href='Pentax.html#LensInfo3'>Pentax LensInfo3 Tags</a>
   <br>--&gt; <a href='Pentax.html#LensInfo4'>Pentax LensInfo4 Tags</a>
   <br>--&gt; <a href='Pentax.html#LensInfo5'>Pentax LensInfo5 Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td title='0x0208 = 520'>0x0208</td>
 <td>FlashInfo
   <br>FlashInfoUnknown</td>
 <td class=c>-<br>-</td>
 <td>--&gt; <a href='Pentax.html#FlashInfo'>Pentax FlashInfo Tags</a>
   <br>--&gt; <a href='Pentax.html#FlashInfoUnknown'>Pentax FlashInfoUnknown Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0209 = 521'>0x0209</td>
 <td>AEMeteringSegments</td>
 <td class=c>int8u[n]</td>
 <td><span class=s><span class=n>(measurements from each of the 16 AE metering segments for models such as the
 K10D, and 77 metering segments for models such as the K-5, converted to LV)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x020a = 522'>0x020a</td>
 <td>FlashMeteringSegments</td>
 <td class=c>int8u[n]</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x020b = 523'>0x020b</td>
 <td>SlaveFlashMeteringSegments</td>
 <td class=c>int8u[n]</td>
 <td><span class=s><span class=n>(used in wireless control mode)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x020d = 525'>0x020d</td>
 <td>WB_RGGBLevelsDaylight</td>
 <td class=c>int16u[4]</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x020e = 526'>0x020e</td>
 <td>WB_RGGBLevelsShade</td>
 <td class=c>int16u[4]</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x020f = 527'>0x020f</td>
 <td>WB_RGGBLevelsCloudy</td>
 <td class=c>int16u[4]</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x0210 = 528'>0x0210</td>
 <td>WB_RGGBLevelsTungsten</td>
 <td class=c>int16u[4]</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0211 = 529'>0x0211</td>
 <td>WB_RGGBLevelsFluorescentD</td>
 <td class=c>int16u[4]</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x0212 = 530'>0x0212</td>
 <td>WB_RGGBLevelsFluorescentN</td>
 <td class=c>int16u[4]</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0213 = 531'>0x0213</td>
 <td>WB_RGGBLevelsFluorescentW</td>
 <td class=c>int16u[4]</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x0214 = 532'>0x0214</td>
 <td>WB_RGGBLevelsFlash</td>
 <td class=c>int16u[4]</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0215 = 533'>0x0215</td>
 <td>CameraInfo</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Pentax.html#CameraInfo'>Pentax CameraInfo Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0216 = 534'>0x0216</td>
 <td>BatteryInfo</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Pentax.html#BatteryInfo'>Pentax BatteryInfo Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td title='0x021b = 539'>0x021b</td>
 <td>SaturationInfo?</td>
 <td class=c>N</td>
 <td><span class=s><span class=n>(only in PEF and DNG images)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x021f = 543'>0x021f</td>
 <td>AFInfo</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Pentax.html#AFInfo'>Pentax AFInfo Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td title='0x0220 = 544'>0x0220</td>
 <td>HuffmanTable?</td>
 <td class=c>N</td>
 <td><span class=s><span class=n>(found in K10D, K20D and K2000D PEF images)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0221 = 545'>0x0221</td>
 <td>KelvinWB</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Pentax.html#KelvinWB'>Pentax KelvinWB Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td title='0x0222 = 546'>0x0222</td>
 <td>ColorInfo</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Pentax.html#ColorInfo'>Pentax ColorInfo Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0224 = 548'>0x0224</td>
 <td>EVStepInfo</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Pentax.html#EVStepInfo'>Pentax EVStepInfo Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td title='0x0226 = 550'>0x0226</td>
 <td>ShotInfo</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Pentax.html#ShotInfo'>Pentax ShotInfo Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0227 = 551'>0x0227</td>
 <td>FacePos</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Pentax.html#FacePos'>Pentax FacePos Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td title='0x0228 = 552'>0x0228</td>
 <td>FaceSize</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Pentax.html#FaceSize'>Pentax FaceSize Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0229 = 553'>0x0229</td>
 <td>SerialNumber</td>
 <td class=c>string</td>
 <td><span class=s><span class=n>(left blank by some cameras)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x022a = 554'>0x022a</td>
 <td>FilterInfo</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Pentax.html#FilterInfo'>Pentax FilterInfo Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0x022b = 555'>0x022b</td>
 <td>LevelInfo</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Pentax.html#LevelInfo'>Pentax LevelInfo Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td title='0x022d = 557'>0x022d</td>
 <td>WBLevels</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Pentax.html#WBLevels'>Pentax WBLevels Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0x022e = 558'>0x022e</td>
 <td>Artist</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x022f = 559'>0x022f</td>
 <td>Copyright</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x0230 = 560'>0x0230</td>
 <td>FirmwareVersion</td>
 <td class=c>string</td>
 <td><span class=s><span class=n>(only in AVI videos)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x0231 = 561'>0x0231</td>
 <td>ContrastDetectAFArea</td>
 <td class=c>int16u[4]</td>
 <td><span class=s><span class=n>(AF area of the most recent contrast-detect focus operation. Coordinates
 are left, top, width and height in a 720x480 frame, with Y downwards)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0235 = 565'>0x0235</td>
 <td>CrossProcessParams</td>
 <td class=c>undef[10]</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0239 = 569'>0x0239</td>
 <td>LensInfoQ</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Pentax.html#LensInfoQ'>Pentax LensInfoQ Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0x03fe = 1022'>0x03fe</td>
 <td>DataDump</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x03ff = 1023'>0x03ff</td>
-<td>TempInfoK5
+<td>TempInfo
   <br>UnknownInfo</td>
 <td class=c>-<br>-</td>
-<td>--&gt; <a href='Pentax.html#TempInfoK5'>Pentax TempInfoK5 Tags</a>
+<td>--&gt; <a href='Pentax.html#TempInfo'>Pentax TempInfo Tags</a>
   <br>--&gt; <a href='Pentax.html#UnknownInfo'>Pentax UnknownInfo Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0x0402 = 1026'>0x0402</td>
 <td>ToneCurve</td>
 <td class=c title=' ~ = Writable only with -n'>Y~</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x0403 = 1027'>0x0403</td>
 <td>ToneCurves</td>
 <td class=c title=' ~ = Writable only with -n'>Y~</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x0405 = 1029'>0x0405</td>
 <td>UnknownBlock?</td>
 <td class=c>undef</td>
 <td><span class=s><span class=n>(large unknown data block in PEF/DNG images but not JPG images)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x0e00 = 3584'>0x0e00</td>
 <td>PrintIM</td>
 <td class=c>-</td>
@@ -1323,121 +1416,127 @@ are left, top, width and height in a 720x480 frame, with Y downwards)</span></sp
 <table class='inner sep' cellspacing=1>
 <tr class=h><th>Value</th><th>PentaxModelID</th><th>Value</th><th>PentaxModelID</th><th>Value</th><th>PentaxModelID</th></tr>
 <tr><td class=r>0xd</td><td>= Optio 330/430</td>
-<td class='r b'>0x12b9c</td><td class=b>= K100D</td>
-<td class=r>0x12d72</td><td>= K2000</td>
+<td class='r b'>0x12ba2</td><td class=b>= K100D Super</td>
+<td class=r>0x12d9a</td><td>= Optio E70</td>
 </tr><tr><td class=r>0x12926</td><td>= Optio 230</td>
-<td class='r b'>0x12b9d</td><td class=b>= K110D</td>
-<td class=r>0x12d73</td><td>= K-m</td>
+<td class='r b'>0x12bb0</td><td class=b>= Optio T10/T20</td>
+<td class=r>0x12dae</td><td>= X70</td>
 </tr><tr><td class=r>0x12958</td><td>= Optio 330GS</td>
-<td class='r b'>0x12ba2</td><td class=b>= K100D Super</td>
-<td class=r>0x12d86</td><td>= Optio P70</td>
+<td class='r b'>0x12be2</td><td class=b>= Optio W10</td>
+<td class=r>0x12db8</td><td>= K-7</td>
 </tr><tr><td class=r>0x12962</td><td>= Optio 450/550</td>
-<td class='r b'>0x12bb0</td><td class=b>= Optio T10/T20</td>
-<td class=r>0x12d90</td><td>= Optio L70</td>
+<td class='r b'>0x12bf6</td><td class=b>= Optio M10</td>
+<td class=r>0x12dcc</td><td>= Optio W80</td>
 </tr><tr><td class=r>0x1296c</td><td>= Optio S</td>
-<td class='r b'>0x12be2</td><td class=b>= Optio W10</td>
-<td class=r>0x12d9a</td><td>= Optio E70</td>
+<td class='r b'>0x12c1e</td><td class=b>= K10D</td>
+<td class=r>0x12dea</td><td>= Optio P80</td>
 </tr><tr><td class=r>0x12971</td><td>= Optio S V1.01</td>
-<td class='r b'>0x12bf6</td><td class=b>= Optio M10</td>
-<td class=r>0x12dae</td><td>= X70</td>
+<td class='r b'>0x12c20</td><td class=b>= Samsung GX10</td>
+<td class=r>0x12df4</td><td>= Optio WS80</td>
 </tr><tr><td class=r>0x12994</td><td>= *ist D</td>
-<td class='r b'>0x12c1e</td><td class=b>= K10D</td>
-<td class=r>0x12db8</td><td>= K-7</td>
+<td class='r b'>0x12c28</td><td class=b>= Optio S7</td>
+<td class=r>0x12dfe</td><td>= K-x</td>
 </tr><tr><td class=r>0x129b2</td><td>= Optio 33L</td>
-<td class='r b'>0x12c20</td><td class=b>= Samsung GX10</td>
-<td class=r>0x12dcc</td><td>= Optio W80</td>
+<td class='r b'>0x12c2d</td><td class=b>= Optio L20</td>
+<td class=r>0x12e08</td><td>= 645D</td>
 </tr><tr><td class=r>0x129bc</td><td>= Optio 33LF</td>
-<td class='r b'>0x12c28</td><td class=b>= Optio S7</td>
-<td class=r>0x12dea</td><td>= Optio P80</td>
+<td class='r b'>0x12c32</td><td class=b>= Optio M20</td>
+<td class=r>0x12e12</td><td>= Optio E80</td>
 </tr><tr><td class=r>0x129c6</td><td>= Optio 33WR/43WR/555</td>
-<td class='r b'>0x12c2d</td><td class=b>= Optio L20</td>
-<td class=r>0x12df4</td><td>= Optio WS80</td>
+<td class='r b'>0x12c3c</td><td class=b>= Optio W20</td>
+<td class=r>0x12e30</td><td>= Optio W90</td>
 </tr><tr><td class=r>0x129d5</td><td>= Optio S4</td>
-<td class='r b'>0x12c32</td><td class=b>= Optio M20</td>
-<td class=r>0x12dfe</td><td>= K-x</td>
+<td class='r b'>0x12c46</td><td class=b>= Optio A20</td>
+<td class=r>0x12e3a</td><td>= Optio I-10</td>
 </tr><tr><td class=r>0x12a02</td><td>= Optio MX</td>
-<td class='r b'>0x12c3c</td><td class=b>= Optio W20</td>
-<td class=r>0x12e08</td><td>= 645D</td>
+<td class='r b'>0x12c78</td><td class=b>= Optio E30</td>
+<td class=r>0x12e44</td><td>= Optio H90</td>
 </tr><tr><td class=r>0x12a0c</td><td>= Optio S40</td>
-<td class='r b'>0x12c46</td><td class=b>= Optio A20</td>
-<td class=r>0x12e12</td><td>= Optio E80</td>
+<td class='r b'>0x12c7d</td><td class=b>= Optio E35</td>
+<td class=r>0x12e4e</td><td>= Optio E90</td>
 </tr><tr><td class=r>0x12a16</td><td>= Optio S4i</td>
-<td class='r b'>0x12c78</td><td class=b>= Optio E30</td>
-<td class=r>0x12e30</td><td>= Optio W90</td>
+<td class='r b'>0x12c82</td><td class=b>= Optio T30</td>
+<td class=r>0x12e58</td><td>= X90</td>
 </tr><tr><td class=r>0x12a34</td><td>= Optio 30</td>
-<td class='r b'>0x12c7d</td><td class=b>= Optio E35</td>
-<td class=r>0x12e3a</td><td>= Optio I-10</td>
+<td class='r b'>0x12c8c</td><td class=b>= Optio M30</td>
+<td class=r>0x12e6c</td><td>= K-r</td>
 </tr><tr><td class=r>0x12a52</td><td>= Optio S30</td>
-<td class='r b'>0x12c82</td><td class=b>= Optio T30</td>
-<td class=r>0x12e44</td><td>= Optio H90</td>
+<td class='r b'>0x12c91</td><td class=b>= Optio L30</td>
+<td class=r>0x12e76</td><td>= K-5</td>
 </tr><tr><td class=r>0x12a66</td><td>= Optio 750Z</td>
-<td class='r b'>0x12c8c</td><td class=b>= Optio M30</td>
-<td class=r>0x12e4e</td><td>= Optio E90</td>
+<td class='r b'>0x12c96</td><td class=b>= Optio W30</td>
+<td class=r>0x12e8a</td><td>= Optio RS1000/RS1500</td>
 </tr><tr><td class=r>0x12a70</td><td>= Optio SV</td>
-<td class='r b'>0x12c91</td><td class=b>= Optio L30</td>
-<td class=r>0x12e58</td><td>= X90</td>
+<td class='r b'>0x12ca0</td><td class=b>= Optio A30</td>
+<td class=r>0x12e94</td><td>= Optio RZ10</td>
 </tr><tr><td class=r>0x12a75</td><td>= Optio SVi</td>
-<td class='r b'>0x12c96</td><td class=b>= Optio W30</td>
-<td class=r>0x12e6c</td><td>= K-r</td>
+<td class='r b'>0x12cb4</td><td class=b>= Optio E40</td>
+<td class=r>0x12e9e</td><td>= Optio LS1000</td>
 </tr><tr><td class=r>0x12a7a</td><td>= Optio X</td>
-<td class='r b'>0x12ca0</td><td class=b>= Optio A30</td>
-<td class=r>0x12e76</td><td>= K-5</td>
+<td class='r b'>0x12cbe</td><td class=b>= Optio M40</td>
+<td class=r>0x12ebc</td><td>= Optio WG-1 GPS</td>
 </tr><tr><td class=r>0x12a8e</td><td>= Optio S5i</td>
-<td class='r b'>0x12cb4</td><td class=b>= Optio E40</td>
-<td class=r>0x12e8a</td><td>= Optio RS1000 / RS1500</td>
+<td class='r b'>0x12cc3</td><td class=b>= Optio L40</td>
+<td class=r>0x12ed0</td><td>= Optio S1</td>
 </tr><tr><td class=r>0x12a98</td><td>= Optio S50</td>
-<td class='r b'>0x12cbe</td><td class=b>= Optio M40</td>
-<td class=r>0x12e94</td><td>= Optio RZ10</td>
+<td class='r b'>0x12cc5</td><td class=b>= Optio L36</td>
+<td class=r>0x12ee4</td><td>= Q</td>
 </tr><tr><td class=r>0x12aa2</td><td>= *ist DS</td>
-<td class='r b'>0x12cc3</td><td class=b>= Optio L40</td>
-<td class=r>0x12e9e</td><td>= Optio LS1000</td>
+<td class='r b'>0x12cc8</td><td class=b>= Optio Z10</td>
+<td class=r>0x12ef8</td><td>= K-01</td>
 </tr><tr><td class=r>0x12ab6</td><td>= Optio MX4</td>
-<td class='r b'>0x12cc5</td><td class=b>= Optio L36</td>
-<td class=r>0x12ebc</td><td>= Optio WG-1 GPS</td>
+<td class='r b'>0x12cd2</td><td class=b>= K20D</td>
+<td class=r>0x12f0c</td><td>= Optio RZ18</td>
 </tr><tr><td class=r>0x12ac0</td><td>= Optio S5n</td>
-<td class='r b'>0x12cc8</td><td class=b>= Optio Z10</td>
-<td class=r>0x12ed0</td><td>= Optio S1</td>
+<td class='r b'>0x12cd4</td><td class=b>= Samsung GX20</td>
+<td class=r>0x12f16</td><td>= Optio VS20</td>
 </tr><tr><td class=r>0x12aca</td><td>= Optio WP</td>
-<td class='r b'>0x12cd2</td><td class=b>= K20D</td>
-<td class=r>0x12ee4</td><td>= Q</td>
+<td class='r b'>0x12cdc</td><td class=b>= Optio S10</td>
+<td class=r>0x12f2a</td><td>= Optio WG-2 GPS</td>
 </tr><tr><td class=r>0x12afc</td><td>= Optio S55</td>
-<td class='r b'>0x12cd4</td><td class=b>= Samsung GX20</td>
-<td class=r>0x12ef8</td><td>= K-01</td>
+<td class='r b'>0x12ce6</td><td class=b>= Optio A40</td>
+<td class=r>0x12f48</td><td>= Optio LS465</td>
 </tr><tr><td class=r>0x12b10</td><td>= Optio S5z</td>
-<td class='r b'>0x12cdc</td><td class=b>= Optio S10</td>
-<td class=r>0x12f0c</td><td>= Optio RZ18</td>
+<td class='r b'>0x12cf0</td><td class=b>= Optio V10</td>
+<td class=r>0x12f52</td><td>= K-30</td>
 </tr><tr><td class=r>0x12b1a</td><td>= *ist DL</td>
-<td class='r b'>0x12ce6</td><td class=b>= Optio A40</td>
-<td class=r>0x12f16</td><td>= Optio VS20</td>
+<td class='r b'>0x12cfa</td><td class=b>= K200D</td>
+<td class=r>0x12f5c</td><td>= X-5</td>
 </tr><tr><td class=r>0x12b24</td><td>= Optio S60</td>
-<td class='r b'>0x12cf0</td><td class=b>= Optio V10</td>
-<td class=r>0x12f2a</td><td>= Optio WG-2 GPS</td>
+<td class='r b'>0x12d04</td><td class=b>= Optio S12</td>
+<td class=r>0x12f66</td><td>= Q10</td>
 </tr><tr><td class=r>0x12b2e</td><td>= Optio S45</td>
-<td class='r b'>0x12cfa</td><td class=b>= K200D</td>
-<td class=r>0x12f48</td><td>= Optio LS465</td>
+<td class='r b'>0x12d0e</td><td class=b>= Optio E50</td>
+<td class=r>0x12f70</td><td>= K-5 II</td>
 </tr><tr><td class=r>0x12b38</td><td>= Optio S6</td>
-<td class='r b'>0x12d04</td><td class=b>= Optio S12</td>
-<td class=r>0x12f52</td><td>= K-30</td>
+<td class='r b'>0x12d18</td><td class=b>= Optio M50</td>
+<td class=r>0x12f71</td><td>= K-5 II s</td>
 </tr><tr><td class=r>0x12b4c</td><td>= Optio WPi</td>
-<td class='r b'>0x12d0e</td><td class=b>= Optio E50</td>
-<td class=r>0x12f5c</td><td>= X-5</td>
+<td class='r b'>0x12d22</td><td class=b>= Optio L50</td>
+<td class=r>0x12f7a</td><td>= Q7</td>
 </tr><tr><td class=r>0x12b56</td><td>= BenQ DC X600</td>
-<td class='r b'>0x12d18</td><td class=b>= Optio M50</td>
-<td class=r>0x12f66</td><td>= Q10</td>
+<td class='r b'>0x12d2c</td><td class=b>= Optio V20</td>
+<td class=r>0x12f84</td><td>= MX-1</td>
 </tr><tr><td class=r>0x12b60</td><td>= *ist DS2</td>
-<td class='r b'>0x12d22</td><td class=b>= Optio L50</td>
-<td class=r>0x12f70</td><td>= K-5 II</td>
+<td class='r b'>0x12d40</td><td class=b>= Optio W60</td>
+<td class=r>0x12f8e</td><td>= WG-3 GPS</td>
 </tr><tr><td class=r>0x12b62</td><td>= Samsung GX-1S</td>
-<td class='r b'>0x12d2c</td><td class=b>= Optio V20</td>
-<td class=r>0x12f71</td><td>= K-5 II s</td>
+<td class='r b'>0x12d4a</td><td class=b>= Optio M60</td>
+<td class=r>0x12f98</td><td>= WG-3</td>
 </tr><tr><td class=r>0x12b6a</td><td>= Optio A10</td>
-<td class='r b'>0x12d40</td><td class=b>= Optio W60</td>
-<td class=r>0x12f84</td><td>= MX-1</td>
+<td class='r b'>0x12d68</td><td class=b>= Optio E60/M90</td>
+<td class=r>0x12fa2</td><td>= WG-10</td>
 </tr><tr><td class=r>0x12b7e</td><td>= *ist DL2</td>
-<td class='r b'>0x12d4a</td><td class=b>= Optio M60</td>
-<td class=r>&nbsp;</td><td>&nbsp;</td>
+<td class='r b'>0x12d72</td><td class=b>= K2000</td>
+<td class=r>0x12fb6</td><td>= K-50</td>
 </tr><tr><td class=r>0x12b80</td><td>= Samsung GX-1L</td>
-<td class='r b'>0x12d68</td><td class=b>= Optio E60/M90</td>
+<td class='r b'>0x12d73</td><td class=b>= K-m</td>
+<td class=r>0x12fc0</td><td>= K-3</td>
+</tr><tr><td class=r>0x12b9c</td><td>= K100D</td>
+<td class='r b'>0x12d86</td><td class=b>= Optio P70</td>
+<td class=r>0x12fca</td><td>= K-500</td>
+</tr><tr><td class=r>0x12b9d</td><td>= K110D</td>
+<td class='r b'>0x12d90</td><td class=b>= Optio L70</td>
 <td class=r>&nbsp;</td><td>&nbsp;</td>
 </tr></table></td></tr></table></blockquote>
 
@@ -1566,9 +1665,8 @@ identify the specific lens model.</p>
 </tr><tr><td>'3 25'</td><td>= smc PENTAX-F 35-105mm F4-5.6 or Sigma or Tokina Lens</td>
 </tr><tr><td>'3 25.1'</td><td>= Sigma AF 28-300mm F3.5-5.6 DL IF</td>
 </tr><tr><td>'3 25.2'</td><td>= Sigma 55-200mm F4-5.6 DC</td>
-</tr><tr><td>'3 25.3'</td><td>= Sigma AF 28-300mm F3.5-5.6 DL IF</td>
-</tr><tr><td>'3 25.4'</td><td>= Sigma AF 28-300mm F3.5-6.3 DG IF Macro</td>
-</tr><tr><td>'3 25.5'</td><td>= Tokina 80-200mm F2.8 ATX-Pro</td>
+</tr><tr><td>'3 25.3'</td><td>= Sigma AF 28-300mm F3.5-6.3 DG IF Macro</td>
+</tr><tr><td>'3 25.4'</td><td>= Tokina 80-200mm F2.8 ATX-Pro</td>
 </tr><tr><td>'3 26'</td><td>= smc PENTAX-F* 250-600mm F5.6 ED[IF]</td>
 </tr><tr><td>'3 27'</td><td>= smc PENTAX-F 28-80mm F3.5-4.5 or Tokina Lens</td>
 </tr><tr><td>'3 27.1'</td><td>= Tokina AT-X Pro AF 28-70mm F2.6-2.8</td>
@@ -1594,13 +1692,14 @@ identify the specific lens model.</p>
 </tr><tr><td>'3 41.1'</td><td>= Sigma 50mm F2.8 Macro</td>
 </tr><tr><td>'3 44'</td><td>= Sigma or Tamron Lens (3 44)</td>
 </tr><tr><td>'3 44.1'</td><td>= Sigma AF 10-20mm F4-5.6 EX DC</td>
-</tr><tr><td>'3 44.2'</td><td>= Sigma 12-24mm F4.5 EX DG</td>
+</tr><tr><td>'3 44.2'</td><td>= Sigma 12-24mm F4.5-5.6 EX DG</td>
 </tr><tr><td>'3 44.3'</td><td>= Sigma 17-70mm F2.8-4.5 DC Macro</td>
 </tr><tr><td>'3 44.4'</td><td>= Sigma 18-50mm F3.5-5.6 DC</td>
 </tr><tr><td>'3 44.5'</td><td>= Tamron 35-90mm F4 AF</td>
-</tr><tr><td>'3 46'</td><td>= Sigma Lens (3 46)</td>
+</tr><tr><td>'3 46'</td><td>= Sigma or Samsung Lens (3 46)</td>
 </tr><tr><td>'3 46.1'</td><td>= Sigma APO 70-200mm F2.8 EX</td>
 </tr><tr><td>'3 46.2'</td><td>= Sigma EX APO 100-300mm F4 IF</td>
+</tr><tr><td>'3 46.3'</td><td>= Samsung/Schneider D-XENON 50-200mm F4-5.6 ED</td>
 </tr><tr><td>'3 50'</td><td>= smc PENTAX-FA 28-70mm F4 AL</td>
 </tr><tr><td>'3 51'</td><td>= Sigma 28mm F1.8 EX DG Aspherical Macro</td>
 </tr><tr><td>'3 52'</td><td>= smc PENTAX-FA 28-200mm F3.8-5.6 AL[IF] or Tamron Lens</td>
@@ -1644,7 +1743,7 @@ identify the specific lens model.</p>
 </tr><tr><td>'4 29'</td><td>= Tamron AF 28-200mm F3.8-5.6 LD Super II Macro (371D)</td>
 </tr><tr><td>'4 34'</td><td>= smc PENTAX-FA 24-90mm F3.5-4.5 AL[IF]</td>
 </tr><tr><td>'4 35'</td><td>= smc PENTAX-FA 100-300mm F4.7-5.8</td>
-</tr><tr><td>'4 36'</td><td>= Tamron AF70-300mm F4-5.6 LD Macro</td>
+</tr><tr><td>'4 36'</td><td>= Tamron AF 70-300mm F4-5.6 LD Macro 1:2</td>
 </tr><tr><td>'4 37'</td><td>= Tamron SP AF 24-135mm F3.5-5.6 AD AL (190D)</td>
 </tr><tr><td>'4 38'</td><td>= smc PENTAX-FA 28-105mm F3.2-4.5 AL[IF]</td>
 </tr><tr><td>'4 39'</td><td>= smc PENTAX-FA 31mm F1.8 AL Limited</td>
@@ -1656,22 +1755,23 @@ identify the specific lens model.</p>
 </tr><tr><td>'4 45.2'</td><td>= Tamron AF 28-300mm F3.5-6.3 XR Di LD Aspherical [IF] Macro</td>
 </tr><tr><td>'4 46'</td><td>= smc PENTAX-FA J 28-80mm F3.5-5.6 AL</td>
 </tr><tr><td>'4 47'</td><td>= smc PENTAX-FA J 18-35mm F4-5.6 AL</td>
-</tr><tr><td>'4 49'</td><td>= Tamron SP AF 28-75mm F2.8 XR Di (A09)</td>
+</tr><tr><td>'4 49'</td><td>= Tamron SP AF 28-75mm F2.8 XR Di LD Aspherical [IF] Macro</td>
 </tr><tr><td>'4 51'</td><td>= smc PENTAX-D FA 50mm F2.8 Macro</td>
 </tr><tr><td>'4 52'</td><td>= smc PENTAX-D FA 100mm F2.8 Macro</td>
-</tr><tr><td>'4 56'</td><td>= Samsung D-XENON 100mm F2.8 Macro</td>
+</tr><tr><td>'4 55'</td><td>= Samsung/Schneider D-XENOGON 35mm F2</td>
+</tr><tr><td>'4 56'</td><td>= Samsung/Schneider D-XENON 100mm F2.8 Macro</td>
 </tr><tr><td>'4 75'</td><td>= Tamron SP AF 70-200mm F2.8 Di LD [IF] Macro (A001)</td>
 </tr><tr><td>'4 214'</td><td>= smc PENTAX-DA 35mm F2.4 AL</td>
 </tr><tr><td>'4 229'</td><td>= smc PENTAX-DA 18-55mm F3.5-5.6 AL II</td>
 </tr><tr><td>'4 230'</td><td>= Tamron SP AF 17-50mm F2.8 XR Di II</td>
 </tr><tr><td>'4 231'</td><td>= smc PENTAX-DA 18-250mm F3.5-6.3 ED AL [IF]</td>
 </tr><tr><td>'4 237'</td><td>= Samsung/Schneider D-XENOGON 10-17mm F3.5-4.5</td>
-</tr><tr><td>'4 239'</td><td>= Samsung D-XENON 12-24mm F4 ED AL [IF]</td>
+</tr><tr><td>'4 239'</td><td>= Samsung/Schneider D-XENON 12-24mm F4 ED AL [IF]</td>
 </tr><tr><td>'4 242'</td><td>= smc PENTAX-DA* 16-50mm F2.8 ED AL [IF] SDM (SDM unused)</td>
 </tr><tr><td>'4 243'</td><td>= smc PENTAX-DA 70mm F2.4 Limited</td>
 </tr><tr><td>'4 244'</td><td>= smc PENTAX-DA 21mm F3.2 AL Limited</td>
-</tr><tr><td>'4 245'</td><td>= Schneider D-XENON 50-200mm F4-5.6</td>
-</tr><tr><td>'4 246'</td><td>= Schneider D-XENON 18-55mm F3.5-5.6</td>
+</tr><tr><td>'4 245'</td><td>= Samsung/Schneider D-XENON 50-200mm F4-5.6</td>
+</tr><tr><td>'4 246'</td><td>= Samsung/Schneider D-XENON 18-55mm F3.5-5.6</td>
 </tr><tr><td>'4 247'</td><td>= smc PENTAX-DA FISH-EYE 10-17mm F3.5-4.5 ED[IF]</td>
 </tr><tr><td>'4 248'</td><td>= smc PENTAX-DA 12-24mm F4 ED AL [IF]</td>
 </tr><tr><td>'4 249'</td><td>= Tamron XR DiII 18-200mm F3.5-6.3 (A14)</td>
@@ -1712,6 +1812,13 @@ identify the specific lens model.</p>
 </tr><tr><td>'7 0'</td><td>= smc PENTAX-DA 21mm F3.2 AL Limited</td>
 </tr><tr><td>'7 58'</td><td>= smc PENTAX-D FA Macro 100mm F2.8 WR</td>
 </tr><tr><td>'7 75'</td><td>= Tamron SP AF 70-200mm F2.8 Di LD [IF] Macro (A001)</td>
+</tr><tr><td>'7 202'</td><td>= smc PENTAX-DA L 18-55mm F3.5-5.6 AL WR</td>
+</tr><tr><td>'7 203'</td><td>= HD PENTAX-DA 55-300mm F4-5.8 ED WR</td>
+</tr><tr><td>'7 204'</td><td>= HD PENTAX-DA 15mm F4 ED AL Limited</td>
+</tr><tr><td>'7 205'</td><td>= HD PENTAX-DA 35mm F2.8 Macro Limited</td>
+</tr><tr><td>'7 206'</td><td>= HD PENTAX-DA 70mm F2.4 Limited</td>
+</tr><tr><td>'7 207'</td><td>= HD PENTAX-DA 21mm F3.2 ED AL Limited</td>
+</tr><tr><td>'7 208'</td><td>= HD PENTAX-DA 40mm F2.8 Limited</td>
 </tr><tr><td>'7 212'</td><td>= smc PENTAX-DA 50mm F1.8</td>
 </tr><tr><td>'7 213'</td><td>= smc PENTAX-DA 40mm F2.8 XS</td>
 </tr><tr><td>'7 214'</td><td>= smc PENTAX-DA 35mm F2.4 AL</td>
@@ -1721,11 +1828,12 @@ identify the specific lens model.</p>
 </tr><tr><td>'7 220'</td><td>= Tamron SP AF 10-24mm F3.5-4.5 Di II LD Aspherical [IF]</td>
 </tr><tr><td>'7 221'</td><td>= smc PENTAX-DA L 50-200mm F4-5.6 ED</td>
 </tr><tr><td>'7 222'</td><td>= smc PENTAX-DA L 18-55mm F3.5-5.6</td>
-</tr><tr><td>'7 223'</td><td>= Samsung D-XENON 18-55mm F3.5-5.6 II</td>
+</tr><tr><td>'7 223'</td><td>= Samsung/Schneider D-XENON 18-55mm F3.5-5.6 II</td>
 </tr><tr><td>'7 224'</td><td>= smc PENTAX-DA 15mm F4 ED AL Limited</td>
-</tr><tr><td>'7 225'</td><td>= Samsung D-XENON 18-250mm F3.5-6.3</td>
+</tr><tr><td>'7 225'</td><td>= Samsung/Schneider D-XENON 18-250mm F3.5-6.3</td>
 </tr><tr><td>'7 226'</td><td>= smc PENTAX-DA* 55mm F1.4 SDM (SDM unused)</td>
 </tr><tr><td>'7 227'</td><td>= smc PENTAX-DA* 60-250mm F4 [IF] SDM (SDM unused)</td>
+</tr><tr><td>'7 228'</td><td>= Samsung 16-45mm F4 ED</td>
 </tr><tr><td>'7 229'</td><td>= smc PENTAX-DA 18-55mm F3.5-5.6 AL II</td>
 </tr><tr><td>'7 230'</td><td>= Tamron AF 17-50mm F2.8 XR Di-II LD (Model A16)</td>
 </tr><tr><td>'7 231'</td><td>= smc PENTAX-DA 18-250mm F3.5-6.3 ED AL [IF]</td>
@@ -1738,6 +1846,7 @@ identify the specific lens model.</p>
 </tr><tr><td>'7 242'</td><td>= smc PENTAX-DA* 16-50mm F2.8 ED AL [IF] SDM (SDM unused)</td>
 </tr><tr><td>'7 243'</td><td>= smc PENTAX-DA 70mm F2.4 Limited</td>
 </tr><tr><td>'7 244'</td><td>= smc PENTAX-DA 21mm F3.2 AL Limited</td>
+</tr><tr><td>'8 3'</td><td>= Sigma AF 18-125mm F3.5-5.6 DC</td>
 </tr><tr><td>'8 4'</td><td>= Sigma 50mm F1.4 EX DG HSM</td>
 </tr><tr><td>'8 8'</td><td>= Sigma 18-250mm F3.5-6.3 DC OS HSM</td>
 </tr><tr><td>'8 11'</td><td>= Sigma 10-20mm F3.5 EX DC HSM</td>
@@ -1751,8 +1860,12 @@ identify the specific lens model.</p>
 </tr><tr><td>'8 21'</td><td>= Sigma 17-50mm F2.8 EX DC OS HSM</td>
 </tr><tr><td>'8 22'</td><td>= Sigma 85mm F1.4 EX DG HSM</td>
 </tr><tr><td>'8 23'</td><td>= Sigma 70-200mm F2.8 APO EX DG OS HSM</td>
+</tr><tr><td>'8 25'</td><td>= Sigma 17-50mm F2.8 EX DC HSM</td>
 </tr><tr><td>'8 27'</td><td>= Sigma 18-200mm F3.5-6.3 II DC HSM</td>
 </tr><tr><td>'8 28'</td><td>= Sigma 18-250mm F3.5-6.3 DC Macro HSM</td>
+</tr><tr><td>'8 29'</td><td>= Sigma 35mm F1.4 DG HSM</td>
+</tr><tr><td>'8 30'</td><td>= Sigma 17-70mm F2.8-4 DC Macro HSM Contemporary</td>
+</tr><tr><td>'8 209'</td><td>= HD PENTAX-DA 20-40mm F2.8-4 ED Limited DC WR</td>
 </tr><tr><td>'8 210'</td><td>= smc PENTAX-DA 18-270mm F3.5-6.3 ED SDM</td>
 </tr><tr><td>'8 211'</td><td>= HD PENTAX-DA 560mm F5.6 ED AW</td>
 </tr><tr><td>'8 215'</td><td>= smc PENTAX-DA 18-135mm F3.5-5.6 ED AL [IF] DC WR</td>
@@ -1765,9 +1878,11 @@ identify the specific lens model.</p>
 </tr><tr><td>'8 242'</td><td>= smc PENTAX-DA* 16-50mm F2.8 ED AL [IF] SDM</td>
 </tr><tr><td>'8 255'</td><td>= Sigma Lens (8 255)</td>
 </tr><tr><td>'8 255.1'</td><td>= Sigma 70-200mm F2.8 EX DG Macro HSM II</td>
-</tr><tr><td>'8 255.2'</td><td>= Sigma APO 150-500mm F5-6.3 DG OS HSM</td>
-</tr><tr><td>'8 255.3'</td><td>= Sigma 4.5mm F2.8 EX DC HSM Circular Fisheye</td>
-</tr><tr><td>'8 255.4'</td><td>= Sigma 50-200mm F4-5.6 DC OS</td>
+</tr><tr><td>'8 255.2'</td><td>= Sigma 150-500mm F5-6.3 DG APO [OS] HSM</td>
+</tr><tr><td>'8 255.3'</td><td>= Sigma 50-150mm F2.8 II APO EX DC HSM</td>
+</tr><tr><td>'8 255.4'</td><td>= Sigma 4.5mm F2.8 EX DC HSM Circular Fisheye</td>
+</tr><tr><td>'8 255.5'</td><td>= Sigma 50-200mm F4-5.6 DC OS</td>
+</tr><tr><td>'8 255.6'</td><td>= Sigma 24-70mm F2.8 EX DG HSM</td>
 </tr><tr><td>'9 0'</td><td>= 645 Manual Lens</td>
 </tr><tr><td>'10 0'</td><td>= 645 A Series Lens</td>
 </tr><tr><td>'11 1'</td><td>= smc PENTAX-FA 645 75mm F2.8</td>
@@ -1780,6 +1895,7 @@ identify the specific lens model.</p>
 </tr><tr><td>'11 9'</td><td>= smc PENTAX-FA 645 200mm F4 [IF]</td>
 </tr><tr><td>'11 10'</td><td>= smc PENTAX-FA 645 150mm F2.8 [IF]</td>
 </tr><tr><td>'11 11'</td><td>= smc PENTAX-FA 645 35mm F3.5 AL [IF]</td>
+</tr><tr><td>'11 12'</td><td>= smc PENTAX-FA 645 300mm F5.6 ED [IF]</td>
 </tr><tr><td>'11 14'</td><td>= smc PENTAX-FA 645 55-110mm F5.6</td>
 </tr><tr><td>'11 16'</td><td>= smc PENTAX-FA 645 33-55mm F4.5 AL</td>
 </tr><tr><td>'11 17'</td><td>= smc PENTAX-FA 645 150-300mm F5.6 ED [IF]</td>
@@ -1789,10 +1905,12 @@ identify the specific lens model.</p>
 </tr><tr><td>'21 0'</td><td>= Pentax Q Manual Lens</td>
 </tr><tr><td>'21 1'</td><td>= 01 Standard Prime 8.5mm F1.9</td>
 </tr><tr><td>'21 2'</td><td>= 02 Standard Zoom 5-15mm F2.8-4.5</td>
-</tr><tr><td>'21 3'</td><td>= 03 Fish-eye 3.2mm F5.6</td>
-</tr><tr><td>'21 4'</td><td>= 04 Toy Lens Wide 6.3mm F7.1</td>
-</tr><tr><td>'21 5'</td><td>= 05 Toy Lens Telephoto 18mm F8</td>
 </tr><tr><td>'21 6'</td><td>= 06 Telephoto Zoom 15-45mm F2.8</td>
+</tr><tr><td>'21 7'</td><td>= 07 Mount Shield 11.5mm F9</td>
+</tr><tr><td>'21 8'</td><td>= 08 Wide Zoom 3.8-5.9mm F3.7-4</td>
+</tr><tr><td>'22 3'</td><td>= 03 Fish-eye 3.2mm F5.6</td>
+</tr><tr><td>'22 4'</td><td>= 04 Toy Lens Wide 6.3mm F7.1</td>
+</tr><tr><td>'22 5'</td><td>= 05 Toy Lens Telephoto 18mm F8</td>
 </tr></table></td></tr></table></blockquote>
 
 <h2><a name='SRInfo'>Pentax SRInfo Tags</a></h2>
@@ -1830,7 +1948,7 @@ identify the specific lens model.</p>
 <td>SRHalfPressTime</td>
 <td class=c>int8u</td>
 <td><span class=s><span class=n>(time from when the shutter button was half pressed to when the shutter was
-released, including time for focusing)</span></span></td></tr>
+released, including time for focusing.  Not valid for some models)</span></span></td></tr>
 <tr class=b>
 <td class=r title='3 = 0x3'>3</td>
 <td>SRFocalLength</td>
@@ -1838,6 +1956,36 @@ released, including time for focusing)</span></span></td></tr>
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
+<h2><a name='SRInfo2'>Pentax SRInfo2 Tags</a></h2>
+<p>Shake reduction information for the K-3.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index1</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='0 = 0x0'>0</td>
+<td>SRResult?</td>
+<td class=c>int8u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='1 = 0x1'>1</td>
+<td>ShakeReduction</td>
+<td class=c>int8u</td>
+<td><table class=cols><tr>
+  <td>0 = Off
+  <br>1 = On
+  <br>4 = Off (AA simulation off)
+  <br>5 = On but Disabled
+  <br>6 = On (Video)
+  <br>7 = On (AA simulation off)
+  <br>12 = Off (AA simulation type 1)
+  <br>15 = On (AA simulation type 1)
+  <br>20 = Off (AA simulation type 2)
+  <br>23 = On (AA simulation type 2)</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+</table></td></tr></table></blockquote>
+
 <h2><a name='FaceInfo'>Pentax FaceInfo Tags</a></h2>
 <blockquote>
 <table class=frame><tr><td>
@@ -1934,6 +2082,12 @@ with positive Y downwards)</span></span></td></tr>
 <td class=c>int8u</td>
 <td><span class=s>0 = Off
   <br>1 = On</span></td></tr>
+<tr>
+<td class=r title='2 = 0x2'>2</td>
+<td>VignettingCorrection</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Off
+  <br>1 = On</span></td></tr>
 </table></td></tr></table></blockquote>
 
 <h2><a name='CameraSettings'>Pentax CameraSettings Tags</a></h2>
@@ -2353,16 +2507,19 @@ Remote or Self-timer, and Internal/ExternalFlashMode is not &quot;On, Wireless&q
 </td></tr>
 <tr class=b>
 <td class=r title='7 = 0x7'>7</td>
-<td>AEFlags?</td>
+<td>AEFlags</td>
 <td class=c>N</td>
-<td><span class=s>Bit 3 = AE lock
+<td><span class=s><span class=n>(indices after this are incremented by 1 for some models)</span>
+  <br>Bit 3 = AE lock
   <br>Bit 4 = Flash recommended?
   <br>Bit 7 = Aperture wide open</span></td></tr>
 <tr>
 <td class=r title='8 = 0x8'>8</td>
-<td>AEUnknown</td>
-<td class=c>N</td>
-<td><span class=s><span class=n>(indices after this are incremented by 1 for some models)</span></span></td></tr>
+<td>AEApertureSteps</td>
+<td class=c>int8u</td>
+<td><span class=s><span class=n>(number of steps the aperture has been stopped down from wide open.  There
+are roughly 8 steps per F-stop for most lenses, or 18 steps for 645D lenses,
+but it varies slightly by lens)</span></span></td></tr>
 <tr class=b>
 <td class=r title='9 = 0x9'>9</td>
 <td>AEMaxAperture</td>
@@ -2386,12 +2543,41 @@ Remote or Self-timer, and Internal/ExternalFlashMode is not &quot;On, Wireless&q
   <br>Bit 4 = Center-weighted average
   <br>Bit 5 = Spot</span></td></tr>
 <tr class=b>
+<td class=r title='13 = 0xd'>13</td>
+<td>AEWhiteBalance</td>
+<td class=c>int8u</td>
+<td><span class=s><span class=n>(K7 and Kx)</span>
+  <br>[Mask 0xf0]</span><table class=cols><tr>
+  <td>0x0 = Standard
+  <br>0x10 = Daylight
+  <br>0x20 = Shade
+  <br>0x30 = Cloudy
+  <br>0x40 = Daylight Fluorescent
+  <br>0x50 = Day White Fluorescent
+  <br>0x60 = White Fluorescent
+  <br>0x70 = Tungsten</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr>
+<td class=r title='13 = 0xd'>13.1</td>
+<td>AEMeteringMode2</td>
+<td class=c>int8u</td>
+<td><span class=s><span class=n>(K7 and Kx, override for an incompatable metering mode setting)</span>
+  <br>[Mask 0x0f]
+  <br>0x0 = Multi-segment
+  <br>Bit 0 = Center-weighted average
+  <br>Bit 1 = Spot</span></td></tr>
+<tr class=b>
 <td class=r title='14 = 0xe'>14</td>
 <td>FlashExposureCompSet</td>
 <td class=c>int8s</td>
 <td><span class=s><span class=n>(reports the camera setting, unlike tag 0x004d which reports 0 in Green mode
 or if flash was on but did not fire.  Both this tag and 0x004d report the
 setting even if the flash is off)</span></span></td></tr>
+<tr>
+<td class=r title='21 = 0x15'>21</td>
+<td>LevelIndicator</td>
+<td class=c>int8u</td>
+<td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
 <h2><a name='AEInfo2'>Pentax AEInfo2 Tags</a></h2>
@@ -2432,6 +2618,12 @@ setting even if the flash is off)</span></span></td></tr>
 <td class=c>int8s</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td class=r title='11 = 0xb'>11</td>
+<td>AEApertureSteps</td>
+<td class=c>int8u</td>
+<td><span class=s><span class=n>(number of steps the aperture has been stopped down from wide open.  There
+are roughly 8 steps per F-stop, but it varies slightly by lens)</span></span></td></tr>
+<tr class=b>
 <td class=r title='15 = 0xf'>15</td>
 <td>SceneMode</td>
 <td class=c>int8u</td>
@@ -2460,22 +2652,22 @@ setting even if the flash is off)</span></span></td></tr>
   <br>27 = Forest
   <br>29 = Backlight Silhouette</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr class=b>
+<tr>
 <td class=r title='16 = 0x10'>16</td>
 <td>AEMaxAperture</td>
 <td class=c>int8u</td>
 <td><span class=s><span class=n>(val = 2**((raw-68)/16))</span></span></td></tr>
-<tr>
+<tr class=b>
 <td class=r title='17 = 0x11'>17</td>
 <td>AEMaxAperture2</td>
 <td class=c>int8u</td>
 <td><span class=s><span class=n>(val = 2**((raw-68)/16))</span></span></td></tr>
-<tr class=b>
+<tr>
 <td class=r title='18 = 0x12'>18</td>
 <td>AEMinAperture</td>
 <td class=c>int8u</td>
 <td><span class=s><span class=n>(val = 2**((raw-68)/16))</span></span></td></tr>
-<tr>
+<tr class=b>
 <td class=r title='19 = 0x13'>19</td>
 <td>AEMinExposureTime</td>
 <td class=c>int8u</td>
@@ -2483,7 +2675,7 @@ setting even if the flash is off)</span></span></td></tr>
 </table></td></tr></table></blockquote>
 
 <h2><a name='AEInfo3'>Pentax AEInfo3 Tags</a></h2>
-<p>Auto-exposure information for the K-30</p>
+<p>Auto-exposure information for the K-3, K-30, K-50 and K-500.</p>
 <blockquote>
 <table class=frame><tr><td>
 <table class=inner cellspacing=1>
@@ -2585,14 +2777,16 @@ gymnastics to decode them into useful values.</p>
 <td class=r title='0 = 0x0'>0.1</td>
 <td>AutoAperture</td>
 <td class=c>int8u</td>
-<td><span class=s>[Mask 0x01]
+<td><span class=s><span class=n>(not valid for the K-r, K-5 or K-5II)</span>
+  <br>[Mask 0x01]
   <br>0x0 = On
   <br>0x1 = Off</span></td></tr>
 <tr class=b>
 <td class=r title='0 = 0x0'>0.2</td>
 <td>MinAperture</td>
 <td class=c>int8u</td>
-<td><span class=s>[Mask 0x06]
+<td><span class=s><span class=n>(not valid for the K-r, K-5 or K-5II)</span>
+  <br>[Mask 0x06]
   <br>0x0 = 22
   <br>0x2 = 32
   <br>0x4 = 45
@@ -2601,7 +2795,8 @@ gymnastics to decode them into useful values.</p>
 <td class=r title='0 = 0x0'>0.3</td>
 <td>LensFStops</td>
 <td class=c>int8u</td>
-<td><span class=s>[Mask 0x70]</span></td></tr>
+<td><span class=s><span class=n>(not valid for the K-r, K-5 or K-5II)</span>
+  <br>[Mask 0x70]</span></td></tr>
 <tr class=b>
 <td class=r title='1 = 0x1'>1</td>
 <td>LensKind?</td>
@@ -2671,12 +2866,12 @@ gymnastics to decode them into useful values.</p>
 <td class=r title='13 = 0xd'>13</td>
 <td>LC12?</td>
 <td class=c>int8u</td>
-<td>&nbsp;</td></tr>
+<td><span class=s><span class=n>(ID&#39;s 13-16 are offset by 1 for the K-r, K-5 and K-5II)</span></span></td></tr>
 <tr class=b>
 <td class=r title='14 = 0xe'>14.1</td>
 <td>MaxAperture</td>
 <td class=c>int8u</td>
-<td><span class=s><span class=n>(effective wide open aperture for current focal length.  Not valid for K-5)</span>
+<td><span class=s><span class=n>(effective wide open aperture for current focal length)</span>
   <br>[Mask 0x7f]</span></td></tr>
 <tr>
 <td class=r title='15 = 0xf'>15</td>
@@ -2729,7 +2924,7 @@ gymnastics to decode them into useful values.</p>
 </table></td></tr></table></blockquote>
 
 <h2><a name='LensInfo5'>Pentax LensInfo5 Tags</a></h2>
-<p>Pentax lens information structure for the K-01.</p>
+<p>Pentax lens information structure for the K-01 and newer models.</p>
 <blockquote>
 <table class=frame><tr><td>
 <table class=inner cellspacing=1>
@@ -2929,7 +3124,7 @@ serviced)</span></span></td></tr>
   <br>0x20 = Almost Empty
   <br>0x30 = Running Low
   <br>0x40 = Full
-  <br><span class=n>(K-5, K-7, K-r, K-x and 645D)</span>
+  <br><span class=n>(other models except the K110D, K2000 and K-m)</span>
   <br>[Mask 0xf0]
   <br>0x10 = Empty or Missing
   <br>0x20 = Almost Empty
@@ -3689,30 +3884,34 @@ used.</p>
 <table class='inner sep' cellspacing=1>
 <tr class=h><th>Value</th><th>DigitalFilter</th><th>Value</th><th>DigitalFilter</th><th>Value</th><th>DigitalFilter</th></tr>
 <tr><td class=r>0</td><td>= Off</td>
-<td class='r b'>7</td><td class=b>= Slim</td>
-<td class=r>16</td><td>= Miniature</td>
-</tr><tr><td class=r>1</td><td>= Base Parameter Adjust</td>
 <td class='r b'>9</td><td class=b>= Fisheye</td>
-<td class=r>17</td><td>= Starburst</td>
-</tr><tr><td class=r>2</td><td>= Soft Focus</td>
-<td class='r b'>10</td><td class=b>= Toy Camera</td>
 <td class=r>18</td><td>= Posterization</td>
-</tr><tr><td class=r>3</td><td>= High Contrast</td>
-<td class='r b'>11</td><td class=b>= Retro</td>
+</tr><tr><td class=r>1</td><td>= Base Parameter Adjust</td>
+<td class='r b'>10</td><td class=b>= Toy Camera</td>
 <td class=r>19</td><td>= Sketch Filter</td>
-</tr><tr><td class=r>4</td><td>= Color Filter</td>
-<td class='r b'>12</td><td class=b>= Pastel</td>
+</tr><tr><td class=r>2</td><td>= Soft Focus</td>
+<td class='r b'>11</td><td class=b>= Retro</td>
 <td class=r>20</td><td>= Shading</td>
-</tr><tr><td class=r>5</td><td>= Extract Color</td>
-<td class='r b'>13</td><td class=b>= Water Color</td>
+</tr><tr><td class=r>3</td><td>= High Contrast</td>
+<td class='r b'>12</td><td class=b>= Pastel</td>
 <td class=r>21</td><td>= Invert Color</td>
-</tr><tr><td class=r>6</td><td>= Monochrome</td>
+</tr><tr><td class=r>4</td><td>= Color Filter</td>
+<td class='r b'>13</td><td class=b>= Water Color</td>
+<td class=r>23</td><td>= Tone Expansion</td>
+</tr><tr><td class=r>5</td><td>= Extract Color</td>
 <td class='r b'>14</td><td class=b>= HDR</td>
 <td class=r>254</td><td>= Custom Filter</td>
+</tr><tr><td class=r>6</td><td>= Monochrome</td>
+<td class='r b'>16</td><td class=b>= Miniature</td>
+<td class=r>&nbsp;</td><td>&nbsp;</td>
+</tr><tr><td class=r>7</td><td>= Slim</td>
+<td class='r b'>17</td><td class=b>= Starburst</td>
+<td class=r>&nbsp;</td><td>&nbsp;</td>
 </tr></table></td></tr></table></blockquote>
 
 <h2><a name='LevelInfo'>Pentax LevelInfo Tags</a></h2>
-<p>Tags decoded from the electronic level information.</p>
+<p>Tags decoded from the electronic level information for the K-5.  May not be
+valid for other models.</p>
 <blockquote>
 <table class=frame><tr><td>
 <table class=inner cellspacing=1>
@@ -3852,10 +4051,11 @@ used.</p>
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
-<h2><a name='TempInfoK5'>Pentax TempInfoK5 Tags</a></h2>
+<h2><a name='TempInfo'>Pentax TempInfo Tags</a></h2>
 <p>A number of additional temperature readings are extracted from this 256-byte
-binary-data block in images from the K-5.  It is currently not known where
-the corresponding temperature sensors are located in the camera.</p>
+binary-data block in images from models such as the K-01, K-3, K-5, K-50 and
+K-500.  It is currently not known where the corresponding temperature
+sensors are located in the camera.</p>
 <blockquote>
 <table class=frame><tr><td>
 <table class=inner cellspacing=1>
@@ -4323,7 +4523,7 @@ stored as ASCII text in a format very similar to some HP models.</p>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Apr 9, 2013</i>
+<br><i>Last revised Feb 12, 2014</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -141,7 +141,7 @@ Unknown (-u) option is used.
 <td>&nbsp;</td></tr>
 <tr class=b>
 <td title='0x0400 = 1024'>0x0400</td>
-<td>LayerStateInfo?</td>
+<td>TargetLayerID?</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr>
@@ -341,11 +341,106 @@ synchronized with the IPTC)</span></span></td></tr>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td title='0x042d = 1069'>0x042d</td>
+<td>LayerSelectionIDs?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x042e = 1070'>0x042e</td>
+<td>HDRToningInfo?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x042f = 1071'>0x042f</td>
+<td>PrintInfo?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x0430 = 1072'>0x0430</td>
+<td>LayerGroupsEnabledID?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x0431 = 1073'>0x0431</td>
+<td>ColorSamplersResource2?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x0432 = 1074'>0x0432</td>
+<td>MeasurementScale?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x0433 = 1075'>0x0433</td>
+<td>TimelineInfo?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x0434 = 1076'>0x0434</td>
+<td>SheetDisclosure?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x0435 = 1077'>0x0435</td>
+<td>DisplayInfo?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x0436 = 1078'>0x0436</td>
+<td>OnionSkins?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x0438 = 1080'>0x0438</td>
+<td>CountInfo?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x043a = 1082'>0x043a</td>
+<td>PrintInfo2?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x043b = 1083'>0x043b</td>
+<td>PrintStyle?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x043c = 1084'>0x043c</td>
+<td>MacintoshNSPrintInfo?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x043d = 1085'>0x043d</td>
+<td>WindowsDEVMODE?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x043e = 1086'>0x043e</td>
+<td>AutoSaveFilePath?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x043f = 1087'>0x043f</td>
+<td>AutoSaveFormat?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td title='0x0bb7 = 2999'>0x0bb7</td>
 <td>ClippingPathName</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
+<tr>
+<td title='0x1b58 = 7000'>0x1b58</td>
+<td>ImageReadyVariables?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
 <tr class=b>
+<td title='0x1f40 = 8000'>0x1f40</td>
+<td>LightroomWorkflow?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
 <td title='0x2710 = 10000'>0x2710</td>
 <td>PrintFlagsInfo?</td>
 <td class=c>N</td>
@@ -454,7 +549,7 @@ synchronized with the IPTC)</span></span></td></tr>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Nov 12, 2012</i>
+<br><i>Last revised May 27, 2013</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -13,6 +13,9 @@ meta information a variety of audio, video and image parameters, as well as
 proprietary information written by many camera models.  Tags with a question
 mark after their name are not extracted unless the Unknown option is set.</p>
 
+<p>ExifTool has the ability to write/create XMP, and edit some date/time tags
+in QuickTime-format files.</p>
+
 <p>According to the specification, many QuickTime date/time tags should be
 stored as UTC.  Unfortunately, digital cameras often store local time values
 instead (presumably because they don&#39;t know the time zone).  For this
@@ -20,6 +23,10 @@ reason, by default ExifTool does not assume a time zone for these values.
 However, if the QuickTimeUTC option is set via the API or the ExifTool
 configuration file, then ExifTool will assume these values are properly
 stored as UTC, and will convert them to local time when extracting.</p>
+
+<p>See
+<a href="http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html">http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html</a>
+for the official specification.</p>
 <blockquote>
 <table class=frame><tr><td>
 <table class=inner cellspacing=1>
@@ -31,26 +38,36 @@ stored as UTC, and will convert them to local time when extracting.</p>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
+<td>'_htc'</td>
+<td>HTCInfo</td>
+<td class=c>-</td>
+<td>--&gt; <a href='QuickTime.html#HTC'>QuickTime HTC Tags</a></td></tr>
+<tr>
 <td>'free'</td>
 <td>KodakFree
   <br>Free?</td>
 <td class=c>-<br>N</td>
 <td>--&gt; <a href='Kodak.html#Free'>Kodak Free Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>'ftyp'</td>
 <td>FileType</td>
 <td class=c>-</td>
 <td>--&gt; <a href='QuickTime.html#FileType'>QuickTime FileType Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>'junk'</td>
 <td>Junk?</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>'mdat'</td>
 <td>MovieData?</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
+<tr>
+<td>'mdat-offset'</td>
+<td>MovieDataOffset</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
 <tr class=b>
 <td>'mdat-size'</td>
 <td>MovieDataSize</td>
@@ -79,6 +96,16 @@ and is used in the AvgBitrate calculation)</span></span></td></tr>
 <td class=c>-<br>N</td>
 <td>--&gt; <a href='Canon.html#Skip'>Canon Skip Tags</a></td></tr>
 <tr>
+<td>'thum'</td>
+<td>ThumbnailImage</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'udta'</td>
+<td>UserData</td>
+<td class=c>-</td>
+<td>--&gt; <a href='FLIR.html#UserData'>FLIR UserData Tags</a></td></tr>
+<tr>
 <td>'uuid'</td>
 <td>UUID-XMP
   <br>UUID-PROF
@@ -95,6 +122,20 @@ and is used in the AvgBitrate calculation)</span></span></td></tr>
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
+<h2><a name='HTC'>QuickTime HTC Tags</a></h2>
+<p>Tags written by some HTC camera phones.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td>'slmt'</td>
+<td>Unknown_slmt?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
 <h2><a name='FileType'>QuickTime FileType Tags</a></h2>
 <blockquote>
 <table class=frame><tr><td>
@@ -240,9 +281,11 @@ and is used in the AvgBitrate calculation)</span></span></td></tr>
 <tr>
 <td>'uuid'</td>
 <td>UUID-USMT
+  <br>UUID-Canon
   <br>UUID-Unknown?</td>
-<td class=c>-<br>N</td>
-<td>--&gt; <a href='QuickTime.html#UserMedia'>QuickTime UserMedia Tags</a></td></tr>
+<td class=c>-<br>-<br>N</td>
+<td>--&gt; <a href='QuickTime.html#UserMedia'>QuickTime UserMedia Tags</a>
+  <br>--&gt; <a href='Canon.html#uuid'>Canon uuid Tags</a></td></tr>
 </table></td></tr></table></blockquote>
 
 <h2><a name='CMovie'>QuickTime CMovie Tags</a></h2>
@@ -350,11 +393,13 @@ and is used in the AvgBitrate calculation)</span></span></td></tr>
   <br>&#39;m7sm&#39; = MPEG-7 Stream
   <br>&#39;mdir&#39; = Metadata
   <br>&#39;mdta&#39; = Metadata Tags
-  <br>&#39;mjsm&#39; = MPEG-J</td><td>&nbsp;&nbsp;</td>
-  <td>&#39;ocsm&#39; = Object Content
-  <br>&#39;odsm&#39; = Object Descriptor
+  <br>&#39;mjsm&#39; = MPEG-J
+  <br>&#39;ocsm&#39; = Object Content</td><td>&nbsp;&nbsp;</td>
+  <td>&#39;odsm&#39; = Object Descriptor
+  <br>&#39;priv&#39; = Private
   <br>&#39;sdsm&#39; = Scene Description
   <br>&#39;soun&#39; = Audio Track
+  <br>&#39;subp&#39; = Subpicture
   <br>&#39;text&#39; = Text
   <br>&#39;tmcd&#39; = Time Code
   <br>&#39;url &#39; = URL
@@ -377,7 +422,10 @@ and is used in the AvgBitrate calculation)</span></span></td></tr>
 <table class=frame><tr><td>
 <table class='inner sep' cellspacing=1>
 <tr class=h><th>Value</th><th>VendorID</th><th>Value</th><th>VendorID</th><th>Value</th><th>VendorID</th></tr>
-<tr><td>'FFMP'</td><td>= FFmpeg</td>
+<tr><td>'AR.D'</td><td>= Parrot AR.Drone</td>
+<td class=b>'ZORA'</td><td class=b>= Zoran Corporation</td>
+<td>'niko'</td><td>= Nikon</td>
+</tr><tr><td>'FFMP'</td><td>= FFmpeg</td>
 <td class=b>'appl'</td><td class=b>= Apple</td>
 <td>'olym'</td><td>= Olympus</td>
 </tr><tr><td>'GIC '</td><td>= General Imaging Co.</td>
@@ -392,9 +440,6 @@ and is used in the AvgBitrate calculation)</span></span></td></tr>
 </tr><tr><td>'SMI '</td><td>= Sorenson Media Inc.</td>
 <td class=b>'mino'</td><td class=b>= Minolta</td>
 <td>'sany'</td><td>= Sanyo</td>
-</tr><tr><td>'ZORA'</td><td>= Zoran Corporation</td>
-<td class=b>'niko'</td><td class=b>= Nikon</td>
-<td>&nbsp;</td><td>&nbsp;</td>
 </tr></table></td></tr></table></blockquote>
 
 <h2><a name='ItemList'>QuickTime ItemList Tags</a></h2>
@@ -503,6 +548,36 @@ added dynamically to this table after processing the Meta Keys information.</p>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
+<td>'gshh'</td>
+<td>GoogleHostHeader</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'gspm'</td>
+<td>GooglePingMessage</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'gspu'</td>
+<td>GooglePingURL</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'gssd'</td>
+<td>GoogleSourceData</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'gsst'</td>
+<td>GoogleStartTime</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'gstd'</td>
+<td>GoogleTrackDuration</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td>'hdvd'</td>
 <td>HDVideo</td>
 <td class=c>N</td>
@@ -1165,12 +1240,12 @@ ItemList tags written by the &quot;mdta&quot; handler.  The prefix of
 <tr class=b>
 <td class=r title='1 = 0x1'>1</td>
 <td>CreateDate</td>
-<td class=c>N</td>
+<td class=c>int32u</td>
 <td><span class=s><span class=n>(converted from UTC to local time if the QuickTimeUTC option is set)</span></span></td></tr>
 <tr>
 <td class=r title='2 = 0x2'>2</td>
 <td>ModifyDate</td>
-<td class=c>N</td>
+<td class=c>int32u</td>
 <td><span class=s><span class=n>(converted from UTC to local time if the QuickTimeUTC option is set)</span></span></td></tr>
 <tr class=b>
 <td class=r title='3 = 0x3'>3</td>
@@ -1316,12 +1391,12 @@ ItemList tags written by the &quot;mdta&quot; handler.  The prefix of
 <tr class=b>
 <td class=r title='1 = 0x1'>1</td>
 <td>MediaCreateDate</td>
-<td class=c>N</td>
+<td class=c>int32u</td>
 <td><span class=s><span class=n>(converted from UTC to local time if the QuickTimeUTC option is set)</span></span></td></tr>
 <tr>
 <td class=r title='2 = 0x2'>2</td>
 <td>MediaModifyDate</td>
-<td class=c>N</td>
+<td class=c>int32u</td>
 <td><span class=s><span class=n>(converted from UTC to local time if the QuickTimeUTC option is set)</span></span></td></tr>
 <tr class=b>
 <td class=r title='3 = 0x3'>3</td>
@@ -1562,17 +1637,17 @@ ItemList tags written by the &quot;mdta&quot; handler.  The prefix of
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td class=r title='10 = 0xa'>10</td>
+<td class=r title='12 = 0xc'>12</td>
 <td>TextColor</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td class=r title='16 = 0x10'>16</td>
+<td class=r title='18 = 0x12'>18</td>
 <td>BackgroundColor</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td class=r title='22 = 0x16'>22</td>
+<td class=r title='24 = 0x18'>24</td>
 <td>FontName</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
@@ -1723,49 +1798,229 @@ ItemList tags written by the &quot;mdta&quot; handler.  The prefix of
 </table></td></tr></table></blockquote>
 
 <h2><a name='AudioSampleDesc'>QuickTime AudioSampleDesc Tags</a></h2>
-<p>MP4 audio sample description.</p>
+<p>MP4 audio sample description.  This hybrid atom contains both data and child
+atoms.</p>
 <blockquote>
 <table class=frame><tr><td>
 <table class=inner cellspacing=1>
-<tr class=h><th>Index2</th><th>Tag Name</th>
+<tr class=h><th>ID/Index</th><th>Tag Name</th>
 <th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
 <tr>
-<td class=r title='2 = 0x2'>2</td>
+<td class=r title='4 = 0x4'>4</td>
 <td>AudioFormat</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td class=r title='10 = 0xa'>10</td>
+<td class=r title='20 = 0x14'>20</td>
 <td>AudioVendorID</td>
 <td class=c>N</td>
 <td>--&gt; <a href='QuickTime.html#VendorID'>QuickTime VendorID Values</a></td></tr>
 <tr>
-<td class=r title='12 = 0xc'>12</td>
+<td class=r title='24 = 0x18'>24</td>
 <td>AudioChannels</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td class=r title='13 = 0xd'>13</td>
+<td class=r title='26 = 0x1a'>26</td>
 <td>AudioBitsPerSample</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td class=r title='16 = 0x10'>16</td>
+<td class=r title='32 = 0x20'>32</td>
 <td>AudioSampleRate</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td class=r title='28 = 0x1c'>28</td>
-<td>AudioFormat</td>
+<td>'damr'</td>
+<td>DecodeConfig</td>
+<td class=c>-</td>
+<td>--&gt; <a href='QuickTime.html#DecodeConfig'>QuickTime DecodeConfig Tags</a></td></tr>
+<tr>
+<td>'pinf'</td>
+<td>PurchaseInfo</td>
+<td class=c>-</td>
+<td>--&gt; <a href='QuickTime.html#ProtectionInfo'>QuickTime ProtectionInfo Tags</a></td></tr>
+<tr class=b>
+<td>'sinf'</td>
+<td>ProtectionInfo</td>
+<td class=c>-</td>
+<td>--&gt; <a href='QuickTime.html#ProtectionInfo'>QuickTime ProtectionInfo Tags</a></td></tr>
+<tr>
+<td>'wave'</td>
+<td>Wave</td>
+<td class=c>-</td>
+<td>--&gt; <a href='QuickTime.html#Wave'>QuickTime Wave Tags</a></td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='DecodeConfig'>QuickTime DecodeConfig Tags</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index1</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='0 = 0x0'>0</td>
+<td>EncoderVendor</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='4 = 0x4'>4</td>
+<td>EncoderVersion</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='ProtectionInfo'>QuickTime ProtectionInfo Tags</a></h2>
+<p>Child atoms found in &quot;sinf&quot; and/or &quot;pinf&quot; atoms.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td>'frma'</td>
+<td>OriginalFormat</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'schi'</td>
+<td>SchemeInfo</td>
+<td class=c>-</td>
+<td>--&gt; <a href='QuickTime.html#SchemeInfo'>QuickTime SchemeInfo Tags</a></td></tr>
+<tr>
+<td>'schm'</td>
+<td>SchemeType</td>
+<td class=c>-</td>
+<td>--&gt; <a href='QuickTime.html#SchemeType'>QuickTime SchemeType Tags</a></td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='SchemeInfo'>QuickTime SchemeInfo Tags</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td>'cert'</td>
+<td>Certificate</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'iviv'</td>
+<td>InitializationVector</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'key '</td>
+<td>KeyID</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'name'</td>
+<td>UserName</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'righ'</td>
+<td>Rights</td>
+<td class=c>-</td>
+<td>--&gt; <a href='QuickTime.html#Rights'>QuickTime Rights Tags</a></td></tr>
+<tr class=b>
+<td>'user'</td>
+<td>UserID</td>
 <td class=c>N</td>
-<td><span class=s><span class=n>(in Casio MOV videos)</span></span></td></tr>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='Rights'>QuickTime Rights Tags</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td>'aver'</td>
+<td>VersionRestrictions</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'medi'</td>
+<td>MediaFlags</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'mode'</td>
+<td>ModeFlags</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'plat'</td>
+<td>Platform</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'song'</td>
+<td>ItemID</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'tool'</td>
+<td>ItemTool</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'tran'</td>
+<td>TransactionID</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'veID'</td>
+<td>ItemVendorID</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='SchemeType'>QuickTime SchemeType Tags</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index1</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='4 = 0x4'>4</td>
+<td>SchemeType</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='8 = 0x8'>8</td>
+<td>SchemeVersion</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='10 = 0xa'>10</td>
+<td>SchemeURL</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='Wave'>QuickTime Wave Tags</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td>'frma'</td>
+<td>PurchaseFileFormat</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
 <h2><a name='ImageDesc'>QuickTime ImageDesc Tags</a></h2>
 <blockquote>
 <table class=frame><tr><td>
 <table class=inner cellspacing=1>
-<tr class=h><th>Index2</th><th>Tag Name</th>
+<tr class=h><th>ID/Index</th><th>Tag Name</th>
 <th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
 <tr>
 <td class=r title='2 = 0x2'>2</td>
@@ -1807,6 +2062,89 @@ ItemList tags written by the &quot;mdta&quot; handler.  The prefix of
 <td>BitDepth</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
+<tr>
+<td>'btrt'</td>
+<td>BitrateInfo</td>
+<td class=c>-</td>
+<td>--&gt; <a href='QuickTime.html#Bitrate'>QuickTime Bitrate Tags</a></td></tr>
+<tr class=b>
+<td>'clap'</td>
+<td>CleanAperture</td>
+<td class=c>-</td>
+<td>--&gt; <a href='QuickTime.html#CleanAperture'>QuickTime CleanAperture Tags</a></td></tr>
+<tr>
+<td>'colr'</td>
+<td>ColorRepresentation</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'fiel'</td>
+<td>VideoFieldOrder</td>
+<td class=c>N</td>
+<td><span class=s>[Value 0]
+  <br>1 = Progressive
+  <br>2 = 2:1 Interlaced</span></td></tr>
+<tr>
+<td>'gama'</td>
+<td>Gamma</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'pasp'</td>
+<td>PixelAspectRatio</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='Bitrate'>QuickTime Bitrate Tags</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index4</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='0 = 0x0'>0</td>
+<td>BufferSize</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='1 = 0x1'>1</td>
+<td>MaxBitrate</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='2 = 0x2'>2</td>
+<td>AverageBitrate</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='CleanAperture'>QuickTime CleanAperture Tags</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index8</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='0 = 0x0'>0</td>
+<td>CleanApertureWidth</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='1 = 0x1'>1</td>
+<td>CleanApertureHeight</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='2 = 0x2'>2</td>
+<td>CleanApertureOffsetX</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='3 = 0x3'>3</td>
+<td>CleanApertureOffsetY</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
 <h2><a name='HintSampleDesc'>QuickTime HintSampleDesc Tags</a></h2>
@@ -1814,23 +2152,48 @@ ItemList tags written by the &quot;mdta&quot; handler.  The prefix of
 <blockquote>
 <table class=frame><tr><td>
 <table class=inner cellspacing=1>
-<tr class=h><th>Index2</th><th>Tag Name</th>
+<tr class=h><th>ID/Index</th><th>Tag Name</th>
 <th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
 <tr>
-<td class=r title='2 = 0x2'>2</td>
+<td class=r title='4 = 0x4'>4</td>
 <td>HintFormat</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='16 = 0x10'>16</td>
+<td>HintTrackVersion</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='20 = 0x14'>20</td>
+<td>MaxPacketSize</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'snro'</td>
+<td>SequenceNumberRandomOffset</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'tims'</td>
+<td>RTPTimeScale</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'tsro'</td>
+<td>TimestampRandomOffset</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
 <h2><a name='OtherSampleDesc'>QuickTime OtherSampleDesc Tags</a></h2>
 <blockquote>
 <table class=frame><tr><td>
 <table class=inner cellspacing=1>
-<tr class=h><th>Index2</th><th>Tag Name</th>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
 <th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
 <tr>
-<td class=r title='2 = 0x2'>2</td>
+<td title='0x0004 = 4'>0x0004</td>
 <td>OtherFormat</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
@@ -1892,12 +2255,12 @@ ItemList tags written by the &quot;mdta&quot; handler.  The prefix of
 <tr class=b>
 <td class=r title='1 = 0x1'>1</td>
 <td>TrackCreateDate</td>
-<td class=c>N</td>
+<td class=c>int32u</td>
 <td><span class=s><span class=n>(converted from UTC to local time if the QuickTimeUTC option is set)</span></span></td></tr>
 <tr>
 <td class=r title='2 = 0x2'>2</td>
 <td>TrackModifyDate</td>
-<td class=c>N</td>
+<td class=c>int32u</td>
 <td><span class=s><span class=n>(converted from UTC to local time if the QuickTimeUTC option is set)</span></span></td></tr>
 <tr class=b>
 <td class=r title='3 = 0x3'>3</td>
@@ -1944,10 +2307,15 @@ ItemList tags written by the &quot;mdta&quot; handler.  The prefix of
 <th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
 <tr>
 <td>'chap'</td>
-<td>ChapterList</td>
+<td>ChapterListTrackID</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
+<td>'mpod'</td>
+<td>ElementaryStreamTrack</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
 <td>'tmcd'</td>
 <td>TimeCode</td>
 <td class=c>N</td>
@@ -1965,117 +2333,132 @@ multi-language user data tags found, even if they don&#39;t exist in this table.
 <tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
 <th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
 <tr>
+<td>'@sec'</td>
+<td>SamsungSec</td>
+<td class=c>-</td>
+<td>--&gt; <a href='Samsung.html#sec'>Samsung sec Tags</a></td></tr>
+<tr class=b>
 <td>'AllF'</td>
 <td>PlayAllFrames</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>'CNCV'</td>
 <td>CompressorVersion</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>'CNFV'</td>
 <td>FirmwareVersion</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>'CNMN'</td>
 <td>Model</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>'CNTH'</td>
 <td>CanonCNTH</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Canon.html#CNTH'>Canon CNTH Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>'DcMD'</td>
 <td>KodakDcMD</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Kodak.html#DcMD'>Kodak DcMD Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>'FFMV'</td>
 <td>FujiFilmFFMV</td>
 <td class=c>-</td>
 <td>--&gt; <a href='FujiFilm.html#FFMV'>FujiFilm FFMV Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>'GoPr'</td>
 <td>GoProType</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>'INFO'</td>
 <td>SamsungINFO</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Samsung.html#INFO'>Samsung INFO Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>'LEIC'</td>
 <td>LeicaLEIC</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Panasonic.html#PANA'>Panasonic PANA Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>'LOOP'</td>
 <td>LoopStyle</td>
 <td class=c>N</td>
 <td><span class=s>1 = Normal
   <br>2 = Palindromic</span></td></tr>
-<tr class=b>
+<tr>
 <td>'MMA0'</td>
 <td>MinoltaMMA0</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Minolta.html#MMA'>Minolta MMA Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>'MMA1'</td>
 <td>MinoltaMMA1</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Minolta.html#MMA'>Minolta MMA Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>'MVTG'</td>
 <td>FujiFilmMVTG</td>
 <td class=c>-</td>
 <td>--&gt; <a href='EXIF.html'>EXIF Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>'NCDT'</td>
 <td>NikonNCDT</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Nikon.html#NCDT'>Nikon NCDT Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>'PANA'</td>
 <td>PanasonicPANA</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Panasonic.html#PANA'>Panasonic PANA Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>'PENT'</td>
 <td>PentaxPENT</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Pentax.html#PENT'>Pentax PENT Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>'PXMN'</td>
 <td>MakerNotePentax5b</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Pentax.html'>Pentax Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>'PXTH'</td>
 <td>PentaxPreview</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Pentax.html#PXTH'>Pentax PXTH Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>'QVMI'</td>
 <td>CasioQVMI</td>
 <td class=c>-</td>
 <td>--&gt; <a href='EXIF.html'>EXIF Tags</a></td></tr>
+<tr class=b>
+<td>'RMKN'</td>
+<td>RicohRMKN</td>
+<td class=c>-</td>
+<td>--&gt; <a href='EXIF.html'>EXIF Tags</a></td></tr>
 <tr>
+<td>'RTHU'</td>
+<td>PreviewImage</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td>'SDLN'</td>
 <td>PlayMode</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>'SelO'</td>
 <td>PlaySelection</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>'TAGS'</td>
 <td>FujiFilmTags
   <br>KodakTags
@@ -2105,61 +2488,106 @@ multi-language user data tags found, even if they don&#39;t exist in this table.
   <br>--&gt; <a href='Samsung.html#MP4'>Samsung MP4 Tags</a>
   <br>--&gt; <a href='Sanyo.html#MOV'>Sanyo MOV Tags</a>
   <br>--&gt; <a href='Sanyo.html#MP4'>Sanyo MP4 Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>'WLOC'</td>
 <td>WindowLocation</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>'XMP_'</td>
 <td>XMP</td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html'>XMP Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>'Xtra'</td>
 <td>MicrosoftXtra</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Microsoft.html#Xtra'>Microsoft Xtra Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>'albm'</td>
 <td>Album</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>'albr'</td>
 <td>AlbumArtist</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
+<tr class=b>
+<td>'angl'</td>
+<td>CameraAngle</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
 <tr>
+<td>'apmd'</td>
+<td>ApertureMode</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td>'auth'</td>
 <td>Author</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>'ccid'</td>
 <td>ContentID</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>'cdis'</td>
 <td>ContentDistributorID</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
+<tr>
+<td>'chpl'</td>
+<td>ChapterList</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'clfn'</td>
+<td>ClipFileName</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'clid'</td>
+<td>ClipID</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
 <tr class=b>
 <td>'clsf'</td>
 <td>Classification</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td>'cmid'</td>
+<td>CameraID</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'cmnm'</td>
+<td>Model</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'coll'</td>
+<td>CollectionName</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td>'cprt'</td>
 <td>Copyright</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>'cvru'</td>
 <td>CoverURI</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
+<tr class=b>
+<td>'date'</td>
+<td>DateTimeOriginal</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
 <tr>
 <td>'dscp'</td>
 <td>Description</td>
@@ -2196,20 +2624,30 @@ multi-language user data tags found, even if they don&#39;t exist in this table.
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
+<td>'kgtt'</td>
+<td>TrackType</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
 <td>'kywd'</td>
 <td>Keywords</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>'loci'</td>
 <td>LocationInformation</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>'lrcu'</td>
 <td>LyricsURI</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
+<tr class=b>
+<td>'manu'</td>
+<td>Make</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
 <tr>
 <td>'meta'</td>
 <td>Meta</td>
@@ -2236,27 +2674,60 @@ multi-language user data tags found, even if they don&#39;t exist in this table.
 <td class=c>-</td>
 <td>--&gt; <a href='QuickTime.html#Video'>QuickTime Video Tags</a></td></tr>
 <tr class=b>
+<td>'reel'</td>
+<td>ReelName</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
 <td>'rtng'</td>
 <td>Rating</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
+<tr class=b>
+<td>'scen'</td>
+<td>Scene</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
 <tr>
 <td>'scrn'</td>
 <td>OlympusPreview</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Olympus.html#scrn'>Olympus scrn Tags</a></td></tr>
 <tr class=b>
+<td>'shot'</td>
+<td>ShotName</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'slno'</td>
+<td>SerialNumber</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'smta'</td>
+<td>SamsungSmta</td>
+<td class=c>-</td>
+<td>--&gt; <a href='Samsung.html#smta'>Samsung smta Tags</a></td></tr>
+<tr>
 <td>'thmb'</td>
 <td>MakerNotePentax5a
-  <br>OlympusThumbnail</td>
-<td class=c>-<br>-</td>
+  <br>OlympusThumbnail
+  <br>ThumbnailImage
+  <br>ThumbnailPNG
+  <br>UnknownThumbnail</td>
+<td class=c>-<br>-<br>N<br>N<br>N</td>
 <td>--&gt; <a href='Pentax.html'>Pentax Tags</a>
   <br>--&gt; <a href='Olympus.html#thmb'>Olympus thmb Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>'titl'</td>
 <td>Title</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
+<tr>
+<td>'urat'</td>
+<td>UserRating</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
 <tr class=b>
 <td>'vndr'</td>
 <td>Vendor</td>
@@ -2713,7 +3184,7 @@ multi-language user data tags found, even if they don&#39;t exist in this table.
 <tr>
 <td class=r title='0 = 0x0'>0</td>
 <td>PreviewDate</td>
-<td class=c>N</td>
+<td class=c>int32u</td>
 <td><span class=s><span class=n>(converted from UTC to local time if the QuickTimeUTC option is set)</span></span></td></tr>
 <tr class=b>
 <td class=r title='2 = 0x2'>2</td>
@@ -2961,7 +3432,7 @@ multi-language user data tags found, even if they don&#39;t exist in this table.
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Feb 27, 2013</i>
+<br><i>Last revised Jan 13, 2014</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -24,6 +24,12 @@ video.</p>
 <tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
 <th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
 <tr>
+<td>'EXIF'</td>
+<td>EXIF</td>
+<td class=c>-</td>
+<td>--&gt; <a href='EXIF.html'>EXIF Tags</a>
+  <br><span class='n s'>(EXIF extracted from WEBP images)</span></td></tr>
+<tr class=b>
 <td>'JUNK'</td>
 <td>OlympusJunk
   <br>CasioJunk
@@ -37,62 +43,62 @@ video.</p>
   <br>--&gt; <a href='Ricoh.html#AVI'>Ricoh AVI Tags</a>
   <br>--&gt; <a href='Pentax.html#Junk'>Pentax Junk Tags</a>
   <br>--&gt; <a href='Pentax.html#Junk2'>Pentax Junk2 Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>'JUNQ'</td>
 <td>OldXMP</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>'LIST_INFO'</td>
 <td>Info</td>
 <td class=c>-</td>
 <td>--&gt; <a href='RIFF.html#Info'>RIFF Info Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>'LIST_Tdat'</td>
 <td>Tdat</td>
 <td class=c>-</td>
 <td>--&gt; <a href='RIFF.html#Tdat'>RIFF Tdat Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>'LIST_exif'</td>
 <td>Exif</td>
 <td class=c>-</td>
 <td>--&gt; <a href='RIFF.html#Exif'>RIFF Exif Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>'LIST_hdrl'</td>
 <td>Hdrl</td>
 <td class=c>-</td>
 <td>--&gt; <a href='RIFF.html#Hdrl'>RIFF Hdrl Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>'LIST_hydt'</td>
 <td>PentaxData</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Pentax.html#AVI'>Pentax AVI Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>'LIST_ncdt'</td>
 <td>NikonData</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Nikon.html#AVI'>Nikon AVI Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>'VP8 '</td>
 <td>VP8Bitstream</td>
 <td class=c>-</td>
 <td>--&gt; <a href='RIFF.html#VP8'>RIFF VP8 Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>'_PMX'</td>
 <td>XMP</td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html'>XMP Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>'bext'</td>
 <td>BroadcastExtension</td>
 <td class=c>-</td>
 <td>--&gt; <a href='RIFF.html#BroadcastExt'>RIFF BroadcastExt Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>'fmt '</td>
 <td>AudioFormat</td>
 <td class=c>-</td>
 <td>--&gt; <a href='RIFF.html#AudioFormat'>RIFF AudioFormat Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>'olym'</td>
 <td>Olym</td>
 <td class=c>-</td>
@@ -1000,6 +1006,7 @@ cameras.  The first 4 characters of the data are used as the Tag ID below.</p>
 <td>StreamType</td>
 <td class=c>N</td>
 <td><span class=s>&#39;auds&#39; = Audio
+  <br>&#39;iavs&#39; = Interleaved Audio+Video
   <br>&#39;mids&#39; = MIDI
   <br>&#39;txts&#39; = Text
   <br>&#39;vids&#39; = Video</span></td></tr>
@@ -1158,7 +1165,7 @@ cameras.  The first 4 characters of the data are used as the Tag ID below.</p>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Aug 25, 2012</i>
+<br><i>Last revised Nov 4, 2013</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -36,17 +36,316 @@ serial number of the lens unit)</span></span></td></tr>
 <td class=c>-</td>
 <td>--&gt; <a href='PrintIM.html'>PrintIM Tags</a></td></tr>
 <tr>
+<td title='0x1000 = 4096'>0x1000</td>
+<td>RecordingFormat</td>
+<td class=c>int16u</td>
+<td><span class=s>2 = JPEG
+  <br>3 = DNG</span></td></tr>
+<tr class=b>
 <td title='0x1001 = 4097'>0x1001</td>
-<td>ImageInfo</td>
-<td class=c>-</td>
-<td>--&gt; <a href='Ricoh.html#ImageInfo'>Ricoh ImageInfo Tags</a></td></tr>
+<td>ImageInfo
+  <br>ExposureProgram</td>
+<td class=c>-<br>int16u</td>
+<td>--&gt; <a href='Ricoh.html#ImageInfo'>Ricoh ImageInfo Tags</a>
+  <br><span class=n>(GR)</span>
+  <br><table class=cols><tr>
+  <td>1 = Auto
+  <br>2 = Program AE
+  <br>3 = Aperture-priority AE
+  <br>4 = Shutter speed priority AE
+  <br>5 = Shutter/aperture priority AE
+  <br>6 = Manual
+  <br>7 = Movie</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr>
+<td title='0x1002 = 4098'>0x1002</td>
+<td>DriveMode</td>
+<td class=c>int16u</td>
+<td><span class=s><span class=n>(valid only for some models)</span>
+  <br>0 = Single-frame
+  <br>1 = Continuous
+  <br>8 = AF-priority Continuous</span></td></tr>
 <tr class=b>
 <td title='0x1003 = 4099'>0x1003</td>
-<td>Sharpness</td>
-<td class=c>int32u</td>
+<td>Sharpness
+  <br>WhiteBalance</td>
+<td class=c>int32u<br>int16u</td>
 <td><span class=s>0 = Sharp
   <br>1 = Normal
-  <br>2 = Soft</span></td></tr>
+  <br>2 = Soft
+  <br><span class=n>(GR)</span></span><table class=cols><tr>
+  <td>0 = Auto
+  <br>1 = Multi-P Auto
+  <br>2 = Daylight
+  <br>3 = Cloudy
+  <br>4 = Incandescent 1
+  <br>5 = Incandescent 2
+  <br>6 = Daylight Fluorescent
+  <br>7 = Neutral White Fluorescent
+  <br>8 = Cool White Fluorescent
+  <br>9 = Warm White Fluorescent
+  <br>10 = Manual
+  <br>11 = Kelvin</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr>
+<td title='0x1004 = 4100'>0x1004</td>
+<td>WhiteBalanceFineTune</td>
+<td class=c>int16u</td>
+<td><span class=s><span class=n>(2 numbers: amount of adjustment towards Amber and Green.  Not valid for all
+models)</span></span></td></tr>
+<tr class=b>
+<td title='0x1006 = 4102'>0x1006</td>
+<td>FocusMode</td>
+<td class=c>int16u</td>
+<td><table class=cols><tr>
+  <td>1 = Manual
+  <br>2 = Multi AF
+  <br>3 = Spot AF
+  <br>4 = Snap
+  <br>5 = Infinity</td><td>&nbsp;&nbsp;</td>
+  <td>7 = Face Detect
+  <br>8 = Subject Tracking
+  <br>9 = Pinpoint AF
+  <br>10 = Movie</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr>
+<td title='0x1007 = 4103'>0x1007</td>
+<td>AutoBracketing</td>
+<td class=c>int16u</td>
+<td><table class=cols><tr>
+  <td>0 = Off
+  <br>9 = AE
+  <br>11 = WB
+  <br>16 = DR</td><td>&nbsp;&nbsp;</td>
+  <td>17 = Contrast
+  <br>18 = WB2
+  <br>19 = Effect</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr class=b>
+<td title='0x1009 = 4105'>0x1009</td>
+<td>MacroMode</td>
+<td class=c>int16u</td>
+<td><span class=s>0 = Off
+  <br>1 = On</span></td></tr>
+<tr>
+<td title='0x100a = 4106'>0x100a</td>
+<td>FlashMode</td>
+<td class=c>int16u</td>
+<td><table class=cols><tr>
+  <td>0 = Off
+  <br>1 = Auto, Fired
+  <br>2 = On
+  <br>3 = Auto, Fired, Red-eye reduction
+  <br>4 = Slow Sync
+  <br>5 = Manual
+  <br>6 = On, Red-eye reduction
+  <br>7 = Synchro, Red-eye reduction
+  <br>8 = Auto, Did not fire</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr class=b>
+<td title='0x100b = 4107'>0x100b</td>
+<td>FlashExposureComp</td>
+<td class=c>rational64s</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x100c = 4108'>0x100c</td>
+<td>ManualFlashOutput</td>
+<td class=c>rational64s</td>
+<td><table class=cols><tr>
+  <td>-288 = 1/64
+  <br>-240 = 1/32
+  <br>-216 = 1/22
+  <br>-192 = 1/16</td><td>&nbsp;&nbsp;</td>
+  <td>-168 = 1/11
+  <br>-144 = 1/8
+  <br>-120 = 1/5.6
+  <br>-96 = 1/4</td><td>&nbsp;&nbsp;</td>
+  <td>-72 = 1/2.8
+  <br>-48 = 1/2
+  <br>-24 = 1/1.4
+  <br>0 = Full</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr class=b>
+<td title='0x100d = 4109'>0x100d</td>
+<td>FullPressSnap</td>
+<td class=c>int16u</td>
+<td><span class=s>0 = Off
+  <br>1 = On</span></td></tr>
+<tr>
+<td title='0x100e = 4110'>0x100e</td>
+<td>DynamicRangeExpansion</td>
+<td class=c>int16u</td>
+<td><span class=s>0 = Off
+  <br>3 = Weak
+  <br>4 = Medium
+  <br>5 = Strong</span></td></tr>
+<tr class=b>
+<td title='0x100f = 4111'>0x100f</td>
+<td>NoiseReduction</td>
+<td class=c>int16u</td>
+<td><span class=s>0 = Off
+  <br>1 = Weak
+  <br>2 = Medium
+  <br>3 = Strong</span></td></tr>
+<tr>
+<td title='0x1010 = 4112'>0x1010</td>
+<td>ImageEffects</td>
+<td class=c>int16u</td>
+<td><table class=cols><tr>
+  <td>0 = Standard
+  <br>1 = Vivid
+  <br>3 = Black &amp; White
+  <br>5 = B&amp;W Toning Effect
+  <br>6 = Setting 1
+  <br>7 = Setting 2
+  <br>9 = High-contrast B&amp;W</td><td>&nbsp;&nbsp;</td>
+  <td>10 = Cross Process
+  <br>11 = Positive Film
+  <br>12 = Bleach Bypass
+  <br>13 = Retro
+  <br>15 = Miniature
+  <br>17 = High Key</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr class=b>
+<td title='0x1011 = 4113'>0x1011</td>
+<td>Vignetting</td>
+<td class=c>int16u</td>
+<td><span class=s>0 = Off
+  <br>1 = Low
+  <br>2 = Medium
+  <br>3 = High</span></td></tr>
+<tr>
+<td title='0x1012 = 4114'>0x1012</td>
+<td>Contrast</td>
+<td class=c>int32u</td>
+<td><span class=s>2147483647 = MAX</span></td></tr>
+<tr class=b>
+<td title='0x1013 = 4115'>0x1013</td>
+<td>Saturation</td>
+<td class=c>int32u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x1014 = 4116'>0x1014</td>
+<td>Sharpness</td>
+<td class=c>int32u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x1015 = 4117'>0x1015</td>
+<td>ToningEffect</td>
+<td class=c>int16u</td>
+<td><table class=cols><tr>
+  <td>0 = Off
+  <br>1 = Sepia
+  <br>2 = Red
+  <br>3 = Green</td><td>&nbsp;&nbsp;</td>
+  <td>4 = Blue
+  <br>5 = Purple
+  <br>6 = B&amp;W
+  <br>7 = Color</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr>
+<td title='0x1016 = 4118'>0x1016</td>
+<td>HueAdjust</td>
+<td class=c>int16u</td>
+<td><table class=cols><tr>
+  <td>0 = Off
+  <br>1 = Basic
+  <br>2 = Magenta
+  <br>3 = Yellow</td><td>&nbsp;&nbsp;</td>
+  <td>4 = Normal
+  <br>5 = Warm
+  <br>6 = Cool</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr class=b>
+<td title='0x1017 = 4119'>0x1017</td>
+<td>WideAdapter</td>
+<td class=c>int16u</td>
+<td><span class=s>0 = Not Attached
+  <br>2 = Attached</span></td></tr>
+<tr>
+<td title='0x1018 = 4120'>0x1018</td>
+<td>CropMode35mm</td>
+<td class=c>int16u</td>
+<td><span class=s>0 = Off
+  <br>1 = On</span></td></tr>
+<tr class=b>
+<td title='0x1019 = 4121'>0x1019</td>
+<td>NDFilter</td>
+<td class=c>int16u</td>
+<td><span class=s>0 = Off
+  <br>1 = On</span></td></tr>
+<tr>
+<td title='0x101a = 4122'>0x101a</td>
+<td>WBBracketShotNumber</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x1200 = 4608'>0x1200</td>
+<td>AFStatus</td>
+<td class=c>int16u</td>
+<td><span class=s>0 = Out of Focus
+  <br>1 = In Focus</span></td></tr>
+<tr>
+<td title='0x1201 = 4609'>0x1201</td>
+<td>AFAreaXPosition1</td>
+<td class=c>int32u</td>
+<td><span class=s><span class=n>(manual AF area position in a 1280x864 image)</span></span></td></tr>
+<tr class=b>
+<td title='0x1202 = 4610'>0x1202</td>
+<td>AFAreaYPosition1</td>
+<td class=c>int32u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x1203 = 4611'>0x1203</td>
+<td>AFAreaXPosition</td>
+<td class=c>int32u</td>
+<td><span class=s><span class=n>(manual AF area position in the full image)</span></span></td></tr>
+<tr class=b>
+<td title='0x1204 = 4612'>0x1204</td>
+<td>AFAreaYPosition</td>
+<td class=c>int32u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x1205 = 4613'>0x1205</td>
+<td>AFAreaMode</td>
+<td class=c>int16u</td>
+<td><span class=s>0 = Auto
+  <br>2 = Manual</span></td></tr>
+<tr class=b>
+<td title='0x1307 = 4871'>0x1307</td>
+<td>ColorTempKelvin</td>
+<td class=c>int32u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x1308 = 4872'>0x1308</td>
+<td>ColorTemperature</td>
+<td class=c>int32u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x1500 = 5376'>0x1500</td>
+<td>FocalLength</td>
+<td class=c>rational64u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x1601 = 5633'>0x1601</td>
+<td>SensorWidth</td>
+<td class=c>int32u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x1602 = 5634'>0x1602</td>
+<td>SensorHeight</td>
+<td class=c>int32u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x1603 = 5635'>0x1603</td>
+<td>CroppedImageWidth</td>
+<td class=c>int32u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x1604 = 5636'>0x1604</td>
+<td>CroppedImageHeight</td>
+<td class=c>int32u</td>
+<td>&nbsp;</td></tr>
 <tr>
 <td title='0x2001 = 8193'>0x2001</td>
 <td>RicohSubdir
@@ -450,7 +749,7 @@ model names have already been scaled to include the 35mm crop factor.</p>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Apr 9, 2013</i>
+<br><i>Last revised Jul 24, 2013</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -6,7 +6,7 @@
 <link rel=stylesheet type='text/css' href='style.css' title='Style'>
 </head>
 <body>
-<h2 class=top><a name='Type1'>Samsung Type1 Tags</a></h2>
+<h2 class=top>Samsung Tags</h2>
 <p>Tags found in the binary &quot;STMN&quot; format maker notes written by a number of
 Samsung models.</p>
 <blockquote>
@@ -37,7 +37,7 @@ Samsung models.</p>
 </table></td></tr></table></blockquote>
 
 <h2><a name='IFD'>Samsung IFD Tags</a></h2>
-<p>This is a standard-format IFD found in the Type1 maker notes of some Samsung
+<p>This is a standard-format IFD found in the maker notes of some Samsung
 models, except that the entry count is a 4-byte integer and the offsets are
 relative to the end of the IFD.  Currently, no tags in this IFD are known,
 so the Unknown (-u) or Verbose (-v) option must be used to see this
@@ -107,7 +107,10 @@ information.</p>
   <br>7 = Samsung NX 60mm F2.8 Macro ED OIS SSA
   <br>8 = Samsung NX 16mm F2.4 Pancake
   <br>9 = Samsung NX 85mm F1.4 ED SSA
-  <br>12 = Samsung NX 12-24mm F4-5.6 ED</td><td>&nbsp;&nbsp;</td></tr></table>
+  <br>10 = Samsung NX 45mm F1.8
+  <br>11 = Samsung NX 45mm F1.8 2D/3D
+  <br>12 = Samsung NX 12-24mm F4-5.6 ED
+  <br>14 = Samsung NX 10mm F3.5 Fisheye</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
 <tr>
 <td title='0xa004 = 40964'>0xa004</td>
@@ -271,6 +274,46 @@ array of X coordinates then an array of Y coordinates)</span></span></td></tr>
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
+<h2><a name='sec'>Samsung sec Tags</a></h2>
+<p>This information is found in the @sec atom of Samsung MP4 videos from models
+such as the WB30F.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index1</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='0 = 0x0'>0</td>
+<td>Make</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='32 = 0x20'>32</td>
+<td>Model</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='512 = 0x200'>512</td>
+<td>ThumbnailWidth</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='516 = 0x204'>516</td>
+<td>ThumbnailHeight</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='520 = 0x208'>520</td>
+<td>ThumbnailLength</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='524 = 0x20c'>524</td>
+<td>ThumbnailImage</td>
+<td class=c>N</td>
+<td><span class=s><span class=n>(the THM image, embedded metadata is extracted as the first sub-document)</span></span></td></tr>
+</table></td></tr></table></blockquote>
+
 <h2><a name='INFO'>Samsung INFO Tags</a></h2>
 <p>This information is found in MP4 videos from Samsung models such as the
 SMX-C20N.</p>
@@ -369,9 +412,35 @@ WP10.</p>
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
+<h2><a name='smta'>Samsung smta Tags</a></h2>
+<p>This information is found in the smta atom of Samsung MP4 videos from models
+such as the Galaxy S4.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td>'svss'</td>
+<td>SamsungSvss</td>
+<td class=c>-</td>
+<td>--&gt; <a href='Samsung.html#svss'>Samsung svss Tags</a></td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='svss'>Samsung svss Tags</a></h2>
+<p>This information is found in the svss atom of Samsung MP4 videos from models
+such as the Galaxy S4.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr><td colspan=4 class=c><i>[no tags known]</i></td></tr>
+</table></td></tr></table></blockquote>
+
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Dec 21, 2012</i>
+<br><i>Last revised Feb 3, 2014</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<title>Scalado Tags</title>
+<link rel=stylesheet type='text/css' href='style.css' title='Style'>
+</head>
+<body>
+<h2 class=top>Scalado Tags</h2>
+<p>Tags extracted from the JPEG APP4 &quot;SCALADO&quot; segment found in images from
+HTC, LG and Samsung phones.  (Presumably written by Scalado mobile software,
+<a href="http://www.scalado.com/">http://www.scalado.com/</a>.)</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td>'HGHT'</td>
+<td>PreviewImageHeight</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'QUAL'</td>
+<td>PreviewQuality</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'SPMO'</td>
+<td>DataLength?</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'WDTH'</td>
+<td>PreviewImageWidth</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<hr>
+(This document generated automatically by Image::ExifTool::BuildTagLookup)
+<br><i>Last revised Sep 13, 2013</i>
+<p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
+</body>
+</html>
@@ -28,7 +28,8 @@ for more details.
 <td class=n>DateTimeOriginal
   <br>CreateDate
   <br>ModifyDate</td>
-<td>&nbsp;</td></tr>
+<td><span class=s><span class=n>(contrary to the shortcut name, this represents only the common EXIF
+date/time tags.  To access all date/time tags, use Time:All instead)</span></span></td></tr>
 <tr class=b>
 <td>Canon</td>
 <td class=c>Y</td>
@@ -65,6 +66,15 @@ for more details.
   <br>SerialNumber</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td>ColorSpaceTags</td>
+<td class=c>Y</td>
+<td class=n>ExifIFD:ColorSpace
+  <br>ExifIFD:Gamma
+  <br>InteropIFD:InteropIndex
+  <br>ICC_Profile</td>
+<td><span class=s><span class=n>(standard tags which carry color space information.  Useful for preserving
+color space when deleting all other metadata)</span></span></td></tr>
+<tr class=b>
 <td>Common</td>
 <td class=c>Y</td>
 <td class=n>FileName
@@ -80,7 +90,7 @@ for more details.
   <br>WhiteBalance
   <br>Flash</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>CommonIFD0</td>
 <td class=c>Y</td>
 <td class=n>IFD0:ImageDescription
@@ -103,10 +113,11 @@ for more details.
 <td><span class=s><span class=n>(common metadata tags found in IFD0 of TIFF-format images.  Used to simpify
 deletion of all metadata from these images.  See
 <a href="../faq.html#Q7">FAQ number 7</a> for details)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>MakerNotes</td>
 <td class=c>Y</td>
 <td class=n>MakerNotes
+  <br>MakerNoteApple
   <br>MakerNoteCanon
   <br>MakerNoteCasio
   <br>MakerNoteCasio2
@@ -133,6 +144,7 @@ deletion of all metadata from these images.  See
   <br>MakerNoteKodak7
   <br>MakerNoteKodak8a
   <br>MakerNoteKodak8b
+  <br>MakerNoteKodak8c
   <br>MakerNoteKodak9
   <br>MakerNoteKodak10
   <br>MakerNoteKodakUnknown
@@ -174,6 +186,7 @@ deletion of all metadata from these images.  See
   <br>MakerNoteSony2
   <br>MakerNoteSony3
   <br>MakerNoteSony4
+  <br>MakerNoteSony5
   <br>MakerNoteSonyEricsson
   <br>MakerNoteSonySRF
   <br>MakerNoteUnknownText
@@ -181,7 +194,7 @@ deletion of all metadata from these images.  See
   <br>MakerNoteUnknown</td>
 <td><span class=s><span class=n>(useful when copying tags between files to either copy the maker notes as a
 block or prevent it from being copied)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>Nikon</td>
 <td class=c>Y</td>
 <td class=n>Model
@@ -213,7 +226,7 @@ block or prevent it from being copied)</span></span></td></tr>
   <br>FlashMode
   <br>FlashExposureComp</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>Unsafe</td>
 <td class=c>Y</td>
 <td class=n>IFD0:YCbCrPositioning
@@ -231,7 +244,7 @@ as a shortcut to use when rebuilding JPEG EXIF from scratch)</span></span></td><
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Apr 2, 2013</i>
+<br><i>Last revised Feb 13, 2014</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -270,40 +270,57 @@ MakerNotes.</p>
   <br>3 = High
   <br>4294967295 = n/a</span></td></tr>
 <tr>
+<td title='0x2010 = 8208'>0x2010</td>
+<td>Tag2010a
+  <br>Tag2010b
+  <br>Tag2010c
+  <br>Tag2010d
+  <br>Tag2010e
+  <br>Tag2010f
+  <br>Tag2010g</td>
+<td class=c>-<br>-<br>-<br>-<br>-<br>-<br>-</td>
+<td>--&gt; <a href='Sony.html#Tag2010a'>Sony Tag2010a Tags</a>
+  <br>--&gt; <a href='Sony.html#Tag2010b'>Sony Tag2010b Tags</a>
+  <br>--&gt; <a href='Sony.html#Tag2010c'>Sony Tag2010c Tags</a>
+  <br>--&gt; <a href='Sony.html#Tag2010d'>Sony Tag2010d Tags</a>
+  <br>--&gt; <a href='Sony.html#Tag2010e'>Sony Tag2010e Tags</a>
+  <br>--&gt; <a href='Sony.html#Tag2010f'>Sony Tag2010f Tags</a>
+  <br>--&gt; <a href='Sony.html#Tag2010g'>Sony Tag2010g Tags</a></td></tr>
+<tr class=b>
 <td title='0x2011 = 8209'>0x2011</td>
 <td>VignettingCorrection</td>
 <td class=c>int32u</td>
 <td><span class=s>0 = Off
   <br>2 = Auto
   <br>4294967295 = n/a</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x2012 = 8210'>0x2012</td>
 <td>LateralChromaticAberration</td>
 <td class=c>int32u</td>
 <td><span class=s>0 = Off
   <br>2 = Auto
   <br>4294967295 = n/a</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x2013 = 8211'>0x2013</td>
 <td>DistortionCorrection</td>
 <td class=c>int32u</td>
 <td><span class=s>0 = Off
   <br>2 = Auto
   <br>4294967295 = n/a</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x2014 = 8212'>0x2014</td>
 <td>WBShiftAB_GM</td>
 <td class=c>int32s[2]</td>
 <td><span class=s><span class=n>(2 numbers: 1. positive is a shift toward amber, 2. positive is a shift
 toward magenta)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x2016 = 8214'>0x2016</td>
 <td>AutoPortraitFramed</td>
 <td class=c>int16u</td>
 <td><span class=s><span class=n>(&quot;Yes&quot; if this image was created by the Auto Portrait Framing feature)</span>
   <br>0 = No
   <br>1 = Yes</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0x201b = 8219'>0x201b</td>
 <td>FocusMode</td>
 <td class=c>int8u</td>
@@ -315,7 +332,7 @@ toward magenta)</span></span></td></tr>
   <br>6 = DMF
   <br>7 = AF-D</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr>
+<tr class=b>
 <td title='0x201c = 8220'>0x201c</td>
 <td>AFAreaModeSetting</td>
 <td class=c>int8u</td>
@@ -327,14 +344,15 @@ toward magenta)</span></span></td></tr>
   <br><span class=n>(NEX models)</span>
   <br>0 = Multi
   <br>1 = Center
-  <br>3 = Flexible Spot</span></td></tr>
-<tr class=b>
+  <br>3 = Flexible Spot
+  <br>11 = Zone</span></td></tr>
+<tr>
 <td title='0x201d = 8221'>0x201d</td>
 <td>FlexibleSpotPosition</td>
 <td class=c>int16u[2]</td>
 <td><span class=s><span class=n>(X and Y coordinages of the AF point.  Valid only when AFAreaMode is Flexible
 Spot)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td title='0x201e = 8222'>0x201e</td>
 <td>AFPointSelected</td>
 <td class=c>int8u</td>
@@ -360,33 +378,52 @@ Spot)</span></span></td></tr>
   <br>18 = Lower Far Left
   <br>19 = Upper Far Left</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
+<tr>
+<td title='0x2020 = 8224'>0x2020</td>
+<td>AFInfo2</td>
+<td class=c>-</td>
+<td>--&gt; <a href='Sony.html#AFInfo2'>Sony AFInfo2 Tags</a></td></tr>
 <tr class=b>
 <td title='0x3000 = 12288'>0x3000</td>
 <td>ShotInfo</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Sony.html#ShotInfo'>Sony ShotInfo Tags</a></td></tr>
 <tr>
+<td title='0x900b = 36875'>0x900b</td>
+<td>Tag900b</td>
+<td class=c>-</td>
+<td>--&gt; <a href='Sony.html#Tag900b'>Sony Tag900b Tags</a></td></tr>
+<tr class=b>
 <td title='0x9050 = 36944'>0x9050</td>
 <td>Tag9050</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Sony.html#Tag9050'>Sony Tag9050 Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0x9400 = 37888'>0x9400</td>
 <td>Tag9400a
-  <br>Tag9400b</td>
-<td class=c>-<br>-</td>
+  <br>Tag9400b
+  <br>Tag9400c</td>
+<td class=c>-<br>-<br>-</td>
 <td>--&gt; <a href='Sony.html#Tag9400a'>Sony Tag9400a Tags</a>
-  <br>--&gt; <a href='Sony.html#Tag9400b'>Sony Tag9400b Tags</a></td></tr>
-<tr>
+  <br>--&gt; <a href='Sony.html#Tag9400b'>Sony Tag9400b Tags</a>
+  <br>--&gt; <a href='Sony.html#Tag9400c'>Sony Tag9400c Tags</a></td></tr>
+<tr class=b>
 <td title='0x9402 = 37890'>0x9402</td>
 <td>Tag9402</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Sony.html#Tag9402'>Sony Tag9402 Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0x9403 = 37891'>0x9403</td>
 <td>Tag9403</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Sony.html#Tag9403'>Sony Tag9403 Tags</a></td></tr>
+<tr class=b>
+<td title='0x9405 = 37893'>0x9405</td>
+<td>Tag9405a
+  <br>Tag9405b</td>
+<td class=c>-<br>-</td>
+<td>--&gt; <a href='Sony.html#Tag9405a'>Sony Tag9405a Tags</a>
+  <br>--&gt; <a href='Sony.html#Tag9405b'>Sony Tag9405b Tags</a></td></tr>
 <tr>
 <td title='0x9406 = 37894'>0x9406</td>
 <td>Tag9406</td>
@@ -398,11 +435,16 @@ Spot)</span></span></td></tr>
 <td class=c>-</td>
 <td>--&gt; <a href='Sony.html#Tag940a'>Sony Tag940a Tags</a></td></tr>
 <tr>
+<td title='0x940c = 37900'>0x940c</td>
+<td>Tag940c</td>
+<td class=c>-</td>
+<td>--&gt; <a href='Sony.html#Tag940c'>Sony Tag940c Tags</a></td></tr>
+<tr class=b>
 <td title='0x940e = 37902'>0x940e</td>
 <td>AFInfo</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Sony.html#AFInfo'>Sony AFInfo Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0xb000 = 45056'>0xb000</td>
 <td>FileFormat</td>
 <td class=c>int8u[4]</td>
@@ -413,9 +455,10 @@ Spot)</span></span></td></tr>
   <br>&#39;3 0 0 0&#39; = ARW 2.0</td><td>&nbsp;&nbsp;</td>
   <td>&#39;3 1 0 0&#39; = ARW 2.1
   <br>&#39;3 2 0 0&#39; = ARW 2.2
-  <br>&#39;3 3 0 0&#39; = ARW 2.3</td><td>&nbsp;&nbsp;</td></tr></table>
+  <br>&#39;3 3 0 0&#39; = ARW 2.3
+  <br>&#39;3 3 1 0&#39; = ARW 2.3.1</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr>
+<tr class=b>
 <td title='0xb001 = 45057'>0xb001</td>
 <td>SonyModelID</td>
 <td class=c>int16u</td>
@@ -440,13 +483,13 @@ Spot)</span></span></td></tr>
   <br>278 = NEX-5
   <br>279 = NEX-3
   <br>280 = SLT-A33
-  <br>281 = SLT-A55 / SLT-A55V</td><td>&nbsp;&nbsp;</td>
-  <td>282 = DSLR-A560
+  <br>281 = SLT-A55 / SLT-A55V
+  <br>282 = DSLR-A560
   <br>283 = DSLR-A580
   <br>284 = NEX-C3
   <br>285 = SLT-A35
-  <br>286 = SLT-A65 / SLT-A65V
-  <br>287 = SLT-A77 / SLT-A77V
+  <br>286 = SLT-A65 / SLT-A65V</td><td>&nbsp;&nbsp;</td>
+  <td>287 = SLT-A77 / SLT-A77V
   <br>288 = NEX-5N
   <br>289 = NEX-7
   <br>290 = NEX-VG20E
@@ -459,10 +502,20 @@ Spot)</span></span></td></tr>
   <br>297 = DSC-RX100
   <br>298 = DSC-RX1
   <br>299 = NEX-VG900
+  <br>300 = NEX-VG30E
+  <br>302 = ILCE-3000
   <br>303 = SLT-A58
-  <br>305 = NEX-3N</td><td>&nbsp;&nbsp;</td></tr></table>
+  <br>305 = NEX-3N
+  <br>306 = ILCE-7
+  <br>307 = NEX-5T
+  <br>308 = DSC-RX100M2
+  <br>309 = DSC-RX10
+  <br>310 = DSC-RX1R
+  <br>311 = ILCE-7R
+  <br>312 = ILCE-6000
+  <br>313 = ILCE-5000</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr class=b>
+<tr>
 <td title='0xb020 = 45088'>0xb020</td>
 <td>CreativeStyle</td>
 <td class=c>string</td>
@@ -484,17 +537,17 @@ Spot)</span></span></td></tr>
   <br>&#39;Sunset&#39; = Sunset
   <br>&#39;Vivid&#39; = Vivid</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr>
+<tr class=b>
 <td title='0xb021 = 45089'>0xb021</td>
 <td>ColorTemperature</td>
 <td class=c>int32u</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xb022 = 45090'>0xb022</td>
 <td>ColorCompensationFilter</td>
 <td class=c>int32u</td>
 <td><span class=s><span class=n>(negative is green, positive is magenta)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td title='0xb023 = 45091'>0xb023</td>
 <td>SceneMode</td>
 <td class=c>int32u</td>
@@ -524,14 +577,14 @@ Spot)</span></span></td></tr>
   <br>28 = Pet
   <br>65535 = n/a</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr class=b>
+<tr>
 <td title='0xb024 = 45092'>0xb024</td>
 <td>ZoneMatching</td>
 <td class=c>int32u</td>
 <td><span class=s>0 = ISO Setting Used
   <br>1 = High Key
   <br>2 = Low Key</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0xb025 = 45093'>0xb025</td>
 <td>DynamicRangeOptimizer</td>
 <td class=c>int32u</td>
@@ -551,24 +604,24 @@ Spot)</span></span></td></tr>
   <br>19 = Lv4
   <br>20 = Lv5</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr class=b>
+<tr>
 <td title='0xb026 = 45094'>0xb026</td>
 <td>ImageStabilization</td>
 <td class=c>int32u</td>
 <td><span class=s>0 = Off
   <br>1 = On
   <br>4294967295 = n/a</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0xb027 = 45095'>0xb027</td>
 <td>LensType</td>
 <td class=c>int32u</td>
 <td>--&gt; <a href='Sony.html#LensType'>Sony LensType Values</a></td></tr>
-<tr class=b>
+<tr>
 <td title='0xb028 = 45096'>0xb028</td>
 <td>MinoltaMakerNote</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Minolta.html'>Minolta Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td title='0xb029 = 45097'>0xb029</td>
 <td>ColorMode</td>
 <td class=c>int32u</td>
@@ -595,23 +648,23 @@ Spot)</span></span></td></tr>
   <br>105 = Autumn Leaves
   <br>4294967295 = n/a</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr class=b>
+<tr>
 <td title='0xb02a = 45098'>0xb02a</td>
 <td>LensSpec</td>
 <td class=c>int8u[8]</td>
 <td><span class=s><span class=n>(like LensInfo, but also specifies lens features: DT, E, ZA, G, SSM, SAM,
 OSS, STF, Reflex, Macro and Fisheye)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td title='0xb02b = 45099'>0xb02b</td>
 <td>FullImageSize</td>
 <td class=c>int32u[2]</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0xb02c = 45100'>0xb02c</td>
 <td>PreviewImageSize</td>
 <td class=c>int32u[2]</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0xb040 = 45120'>0xb040</td>
 <td>Macro</td>
 <td class=c>int16u</td>
@@ -619,7 +672,7 @@ OSS, STF, Reflex, Macro and Fisheye)</span></span></td></tr>
   <br>1 = On
   <br>2 = Close Focus
   <br>65535 = n/a</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0xb041 = 45121'>0xb041</td>
 <td>ExposureMode</td>
 <td class=c>int16u</td>
@@ -656,20 +709,20 @@ OSS, STF, Reflex, Macro and Fisheye)</span></span></td></tr>
   <br>42 = 3D Image
   <br>65535 = n/a</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr>
+<tr class=b>
 <td title='0xb042 = 45122'>0xb042</td>
 <td>FocusMode</td>
 <td class=c>int16u</td>
-<td><span class=s><span class=n>(not FocusMode for all models)</span>
+<td><span class=s><span class=n>(not valid for all models)</span>
   <br>1 = AF-S
   <br>2 = AF-C
   <br>4 = Permanent-AF
   <br>65535 = n/a</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0xb043 = 45123'>0xb043</td>
 <td>AFAreaMode</td>
 <td class=c>int16u</td>
-<td><span class=s><span class=n>(not valid for some models)</span></span><table class=cols><tr>
+<td><span class=s><span class=n>(older models)</span></span><table class=cols><tr>
   <td>0 = Default
   <br>1 = Multi
   <br>2 = Center
@@ -679,15 +732,24 @@ OSS, STF, Reflex, Macro and Fisheye)</span></span></td></tr>
   <br>14 = Tracking
   <br>15 = Face Tracking
   <br>65535 = n/a</td><td>&nbsp;&nbsp;</td></tr></table>
+<span class=s><span class=n>(DSC-HX9V generation cameras)</span></span><table class=cols><tr>
+  <td>0 = Multi
+  <br>1 = Center
+  <br>2 = Spot
+  <br>3 = Flexible Spot
+  <br>10 = Selective (for Miniature effect)
+  <br>14 = Tracking
+  <br>15 = Face Tracking
+  <br>255 = Manual</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr>
+<tr class=b>
 <td title='0xb044 = 45124'>0xb044</td>
 <td>AFIlluminator</td>
 <td class=c>int16u</td>
 <td><span class=s>0 = Off
   <br>1 = Auto
   <br>65535 = n/a</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0xb047 = 45127'>0xb047</td>
 <td>JPEGQuality</td>
 <td class=c>int16u</td>
@@ -695,7 +757,7 @@ OSS, STF, Reflex, Macro and Fisheye)</span></span></td></tr>
   <br>1 = Fine
   <br>2 = Extra Fine
   <br>65535 = n/a</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0xb048 = 45128'>0xb048</td>
 <td>FlashLevel</td>
 <td class=c>int16s</td>
@@ -717,7 +779,7 @@ OSS, STF, Reflex, Macro and Fisheye)</span></span></td></tr>
   <br>128 = n/a
   <br>32767 = High</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr class=b>
+<tr>
 <td title='0xb049 = 45129'>0xb049</td>
 <td>ReleaseMode</td>
 <td class=c>int16u</td>
@@ -726,14 +788,14 @@ OSS, STF, Reflex, Macro and Fisheye)</span></span></td></tr>
   <br>5 = Exposure Bracketing
   <br>6 = White Balance Bracketing
   <br>65535 = n/a</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0xb04a = 45130'>0xb04a</td>
 <td>SequenceNumber</td>
 <td class=c>int16u</td>
 <td><span class=s><span class=n>(shot number in continuous burst)</span>
   <br>0 = Single
   <br>65535 = n/a</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0xb04b = 45131'>0xb04b</td>
 <td>Anti-Blur</td>
 <td class=c>int16u</td>
@@ -741,30 +803,24 @@ OSS, STF, Reflex, Macro and Fisheye)</span></span></td></tr>
   <br>1 = On (Continuous)
   <br>2 = On (Shooting)
   <br>65535 = n/a</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0xb04e = 45134'>0xb04e</td>
-<td>FocusMode
-  <br>LongExposureNoiseReduction</td>
-<td class=c>int16u<br>int16u</td>
-<td><span class=s><span class=n>(FocusMode for RX100)</span>
+<td>FocusMode</td>
+<td class=c>int16u</td>
+<td><span class=s><span class=n>(valid for DSC-HX9V generation and newer)</span>
   <br>0 = Manual
   <br>2 = AF-S
   <br>3 = AF-C
   <br>5 = Semi-manual
-  <br>6 = Direct Manual Focus
-  <br><span class=n>(LongExposureNoiseReduction for other models)</span>
-  <br>0 = Off
-  <br>1 = On
-  <br>2 = On 2
-  <br>65535 = n/a</span></td></tr>
-<tr class=b>
+  <br>6 = DMF</span></td></tr>
+<tr>
 <td title='0xb04f = 45135'>0xb04f</td>
 <td>DynamicRangeOptimizer</td>
 <td class=c>int16u</td>
 <td><span class=s>0 = Off
   <br>1 = Standard
   <br>2 = Plus</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0xb050 = 45136'>0xb050</td>
 <td>HighISONoiseReduction2</td>
 <td class=c>int16u</td>
@@ -774,14 +830,14 @@ OSS, STF, Reflex, Macro and Fisheye)</span></span></td></tr>
   <br>2 = Low
   <br>3 = Off
   <br>65535 = n/a</span></td></tr>
-<tr class=b>
+<tr>
 <td title='0xb052 = 45138'>0xb052</td>
 <td>IntelligentAuto</td>
 <td class=c>int16u</td>
 <td><span class=s>0 = Off
   <br>1 = On
   <br>2 = Advanced</span></td></tr>
-<tr>
+<tr class=b>
 <td title='0xb054 = 45140'>0xb054</td>
 <td>WhiteBalance</td>
 <td class=c>int16u</td>
@@ -843,7 +899,7 @@ brackets if the original version of the lens has the same LensType.</p>
 </tr><tr><td>24.3</td><td>= Sigma 20-40mm F2.8 EX DG Aspherical IF</td>
 </tr><tr><td>24.4</td><td>= Sigma 18-200mm F3.5-6.3 DC</td>
 </tr><tr><td>24.5</td><td>= Sigma DC 18-125mm F4-5,6 D</td>
-</tr><tr><td>24.6</td><td>= Tamron SP AF 28-75mm F2.8 XR Di (IF) Macro</td>
+</tr><tr><td>24.6</td><td>= Tamron SP AF 28-75mm F2.8 XR Di LD Aspherical [IF] Macro</td>
 </tr><tr><td>25</td><td>= Minolta AF 100-300mm F4.5-5.6 APO (D) or Sigma Lens</td>
 </tr><tr><td>25.1</td><td>= Sigma 100-300mm F4 EX (APO (D) or D IF)</td>
 </tr><tr><td>25.2</td><td>= Sigma 70mm F2.8 EX DG Macro</td>
@@ -853,7 +909,7 @@ brackets if the original version of the lens has the same LensType.</p>
 </tr><tr><td>27</td><td>= Minolta AF 85mm F1.4 G (D)</td>
 </tr><tr><td>28</td><td>= Minolta/Sony AF 100mm F2.8 Macro (D) or Tamron Lens</td>
 </tr><tr><td>28.1</td><td>= Tamron SP AF 90mm F2.8 Di Macro</td>
-</tr><tr><td>28.2</td><td>= Tamron AF 180mm F3.5 SP Di LD [IF] Macro</td>
+</tr><tr><td>28.2</td><td>= Tamron SP AF 180mm F3.5 Di LD [IF] Macro</td>
 </tr><tr><td>29</td><td>= Minolta/Sony AF 75-300mm F4.5-5.6 (D)</td>
 </tr><tr><td>30</td><td>= Minolta AF 28-80mm F3.5-5.6 (D) or Sigma Lens</td>
 </tr><tr><td>30.1</td><td>= Sigma AF 10-20mm F4-5.6 EX DC</td>
@@ -882,10 +938,10 @@ brackets if the original version of the lens has the same LensType.</p>
 </tr><tr><td>50</td><td>= Sony DT 18-250mm F3.5-6.3 (SAL18250)</td>
 </tr><tr><td>51</td><td>= Sony DT 16-105mm F3.5-5.6 (SAL16105)</td>
 </tr><tr><td>52</td><td>= Sony 70-300mm F4.5-5.6 G SSM (SAL70300G) or Tamron Lens</td>
-</tr><tr><td>52.1</td><td>= Tamron SP 70-300mm F4-5.6 Di VC USD</td>
+</tr><tr><td>52.1</td><td>= Tamron SP 70-300mm F4-5.6 Di USD</td>
 </tr><tr><td>53</td><td>= Sony 70-400mm F4-5.6 G SSM (SAL70400G)</td>
 </tr><tr><td>54</td><td>= Carl Zeiss Vario-Sonnar T* 16-35mm F2.8 ZA SSM (SAL1635Z)</td>
-</tr><tr><td>55</td><td>= Sony DT 18-55mm F3.5-5.6 SAM (SAL1855)</td>
+</tr><tr><td>55</td><td>= Sony DT 18-55mm F3.5-5.6 SAM [II] (SAL1855)</td>
 </tr><tr><td>56</td><td>= Sony DT 55-200mm F4-5.6 SAM (SAL55200-2)</td>
 </tr><tr><td>57</td><td>= Sony DT 50mm F1.8 SAM (SAL50F18) or Tamron Lens</td>
 </tr><tr><td>57.1</td><td>= Tamron SP AF 60mm F2 Di II LD [IF] Macro 1:1</td>
@@ -899,14 +955,15 @@ brackets if the original version of the lens has the same LensType.</p>
 </tr><tr><td>64</td><td>= Sony 500mm F4.0 G SSM (SAL500F40G)</td>
 </tr><tr><td>65</td><td>= Sony DT 18-135mm F3.5-5.6 SAM (SAL18135)</td>
 </tr><tr><td>66</td><td>= Sony 300mm F2.8 G SSM II (SAL300F28G2)</td>
+</tr><tr><td>67</td><td>= Sony 70-200mm F2.8 G SSM II (SAL70200G2)</td>
 </tr><tr><td>68</td><td>= Sony DT 55-300mm F4.5-5.6 SAM (SAL55300)</td>
 </tr><tr><td>69</td><td>= Sony 70-400mm F4-5.6 G SSM II (SAL70400G2)</td>
 </tr><tr><td>70</td><td>= Carl Zeiss Planar T* 50mm F1.4 ZA SSM (SAL50F14Z)</td>
 </tr><tr><td>128</td><td>= Tamron or Sigma Lens (128)</td>
-</tr><tr><td>128.1</td><td>= Tamron 18-200mm F3.5-6.3</td>
-</tr><tr><td>128.2</td><td>= Tamron 28-300mm F3.5-6.3</td>
+</tr><tr><td>128.1</td><td>= Tamron AF 18-200mm F3.5-6.3 XR Di II LD Aspherical [IF] Macro</td>
+</tr><tr><td>128.2</td><td>= Tamron AF 28-300mm F3.5-6.3 XR Di LD Aspherical [IF] Macro</td>
 </tr><tr><td>128.3</td><td>= Tamron 80-300mm F3.5-6.3</td>
-</tr><tr><td>128.4</td><td>= Tamron AF 28-200mm F3.8-5.6 XR Di Aspherical [IF] MACRO</td>
+</tr><tr><td>128.4</td><td>= Tamron AF 28-200mm F3.8-5.6 XR Di Aspherical [IF] Macro</td>
 </tr><tr><td>128.5</td><td>= Tamron SP AF 17-35mm F2.8-4 Di LD Aspherical IF</td>
 </tr><tr><td>128.6</td><td>= Sigma AF 50-150mm F2.8 EX DC APO HSM II</td>
 </tr><tr><td>128.7</td><td>= Sigma 10-20mm F3.5 EX DC HSM</td>
@@ -916,6 +973,8 @@ brackets if the original version of the lens has the same LensType.</p>
 </tr><tr><td>128.11</td><td>= Sigma 85mm F1.4 EX DG HSM</td>
 </tr><tr><td>128.12</td><td>= Sigma 24-70mm F2.8 IF EX DG HSM</td>
 </tr><tr><td>128.13</td><td>= Sigma 18-250mm F3.5-6.3 DC OS HSM</td>
+</tr><tr><td>128.14</td><td>= Sigma 17-50mm F2.8 EX DC HSM</td>
+</tr><tr><td>128.15</td><td>= Sigma 17-70mm F2.8-4 DC Macro HSM</td>
 </tr><tr><td>129</td><td>= Tamron Lens (129)</td>
 </tr><tr><td>129.1</td><td>= Tamron 200-400mm F5.6 LD</td>
 </tr><tr><td>129.2</td><td>= Tamron 70-300mm F4-5.6 LD</td>
@@ -927,15 +986,17 @@ brackets if the original version of the lens has the same LensType.</p>
 </tr><tr><td>142</td><td>= Voigtlander 70-300mm F4.5-5.6</td>
 </tr><tr><td>146</td><td>= Voigtlander Macro APO-Lanthar 125mm F2.5 SL</td>
 </tr><tr><td>194</td><td>= Tamron SP AF 17-50mm F2.8 XR Di II LD Aspherical [IF]</td>
+</tr><tr><td>203</td><td>= Tamron SP 70-200mm F2.8 Di USD</td>
 </tr><tr><td>255</td><td>= Tamron Lens (255)</td>
 </tr><tr><td>255.1</td><td>= Tamron SP AF 17-50mm F2.8 XR Di II LD Aspherical</td>
 </tr><tr><td>255.2</td><td>= Tamron AF 18-250mm F3.5-6.3 XR Di II LD</td>
 </tr><tr><td>255.3</td><td>= Tamron AF 55-200mm F4-5.6 Di II LD Macro</td>
-</tr><tr><td>255.4</td><td>= Tamron AF 70-300mm F4-5.6 Di LD MACRO 1:2</td>
+</tr><tr><td>255.4</td><td>= Tamron AF 70-300mm F4-5.6 Di LD Macro 1:2</td>
 </tr><tr><td>255.5</td><td>= Tamron SP AF 200-500mm F5.0-6.3 Di LD IF</td>
 </tr><tr><td>255.6</td><td>= Tamron SP AF 10-24mm F3.5-4.5 Di II LD Aspherical IF</td>
 </tr><tr><td>255.7</td><td>= Tamron SP AF 70-200mm F2.8 Di LD IF Macro</td>
 </tr><tr><td>255.8</td><td>= Tamron SP AF 28-75mm F2.8 XR Di LD Aspherical IF</td>
+</tr><tr><td>255.9</td><td>= Tamron AF 90-300mm F4.5-5.6 Telemacro</td>
 </tr><tr><td>2550</td><td>= Minolta AF 50mm F1.7</td>
 </tr><tr><td>2551</td><td>= Minolta AF 35-70mm F4 or Other Lens</td>
 </tr><tr><td>2551.1</td><td>= Sigma UC AF 28-70mm F3.5-4.5</td>
@@ -954,6 +1015,7 @@ brackets if the original version of the lens has the same LensType.</p>
 </tr><tr><td>2553</td><td>= Minolta AF 28-135mm F4-4.5 or Sigma Lens</td>
 </tr><tr><td>2553.1</td><td>= Sigma ZOOM-alpha 35-135mm F3.5-4.5</td>
 </tr><tr><td>2553.2</td><td>= Sigma 28-105mm F2.8-4 Aspherical</td>
+</tr><tr><td>2553.3</td><td>= Sigma 28-105mm F4-5.6 UC</td>
 </tr><tr><td>2554</td><td>= Minolta AF 35-105mm F3.5-4.5</td>
 </tr><tr><td>2555</td><td>= Minolta AF 70-210mm F4 Macro or Sigma Lens</td>
 </tr><tr><td>2555.1</td><td>= Sigma 70-210mm F4-5.6 APO</td>
@@ -1049,29 +1111,44 @@ brackets if the original version of the lens has the same LensType.</p>
 </tr><tr><td>4574.3</td><td>= Tokina 300mm F2.8 x2</td>
 </tr><tr><td>4575</td><td>= 1.4x Teleconverter</td>
 </tr><tr><td>4585</td><td>= Tamron SP AF 300mm F2.8 LD IF</td>
+</tr><tr><td>4586</td><td>= Tamron SP AF 35-105mm F2.8 LD Aspherical IF</td>
 </tr><tr><td>4587</td><td>= Tamron AF 70-210mm F2.8 SP LD</td>
+</tr><tr><td>6118</td><td>= Metabones Canon EF Adapter</td>
 </tr><tr><td>6553</td><td>= E-Mount, T-Mount, Other Lens or no lens</td>
 </tr><tr><td>6553.1</td><td>= Sony E 16mm F2.8</td>
-</tr><tr><td>6553.2</td><td>= Sony E 18-200mm F3.5-6.3 OSS</td>
-</tr><tr><td>6553.3</td><td>= Sony E 55-210mm F4.5-6.3 OSS</td>
-</tr><tr><td>6553.4</td><td>= Sigma 19mm F2.8 EX DN</td>
-</tr><tr><td>6553.5</td><td>= Sigma 30mm F2.8 EX DN</td>
-</tr><tr><td>6553.6</td><td>= Tamron 18-200mm F3.5-6.3 Di III VC</td>
-</tr><tr><td>6553.7</td><td>= Arax MC 35mm F2.8 Tilt+Shift</td>
-</tr><tr><td>6553.8</td><td>= Arax MC 80mm F2.8 Tilt+Shift</td>
-</tr><tr><td>6553.9</td><td>= Zenitar MF 16mm F2.8 Fisheye M42</td>
-</tr><tr><td>6553.10</td><td>= Samyang 500mm Mirror F8.0</td>
-</tr><tr><td>6553.11</td><td>= Pentacon Auto 135mm F2.8</td>
-</tr><tr><td>6553.12</td><td>= Pentacon Auto 29mm F2.8</td>
-</tr><tr><td>6553.13</td><td>= Sony E 20mm F2.8</td>
-</tr><tr><td>6553.14</td><td>= Helios 44-2 58mm F2.0</td>
-</tr><tr><td>6553.15</td><td>= Sony E 24mm F1.8 ZA</td>
-</tr><tr><td>6553.16</td><td>= Sony E 30mm F3.5 Macro</td>
-</tr><tr><td>6553.17</td><td>= Sony E 35mm F1.8 OSS</td>
-</tr><tr><td>6553.18</td><td>= Sony E 50mm F1.8 OSS</td>
-</tr><tr><td>6553.19</td><td>= Sony E 10-18mm F4 OSS</td>
-</tr><tr><td>6553.20</td><td>= Sony E PZ 16-50mm F3.5-5.6 OSS</td>
-</tr><tr><td>6553.21</td><td>= Sony E 18-55mm F3.5-5.6 OSS</td>
+</tr><tr><td>6553.2</td><td>= Sony E PZ 16-50mm F3.5-5.6 OSS</td>
+</tr><tr><td>6553.3</td><td>= Sony FE 35mm F2.8 ZA</td>
+</tr><tr><td>6553.4</td><td>= Sony FE 24-70mm F4 ZA OSS</td>
+</tr><tr><td>6553.5</td><td>= Sony E 18-200mm F3.5-6.3 OSS LE</td>
+</tr><tr><td>6553.6</td><td>= Sony E 20mm F2.8</td>
+</tr><tr><td>6553.7</td><td>= Sony E 35mm F1.8 OSS</td>
+</tr><tr><td>6553.8</td><td>= Sony E PZ 18-105mm F4 G OSS</td>
+</tr><tr><td>6553.9</td><td>= Sony E PZ 18-200mm F3.5-6.3 OSS</td>
+</tr><tr><td>6553.10</td><td>= Sony FE 55mm F1.8 ZA</td>
+</tr><tr><td>6553.11</td><td>= Sony FE 28-70mm F3.5-5.6 OSS</td>
+</tr><tr><td>6553.12</td><td>= Sony FE 70-200mm F4 G OSS</td>
+</tr><tr><td>6553.13</td><td>= Sony E 18-55mm F3.5-5.6 OSS</td>
+</tr><tr><td>6553.14</td><td>= Sigma 19mm F2.8 [EX] DN</td>
+</tr><tr><td>6553.15</td><td>= Sigma 30mm F2.8 [EX] DN</td>
+</tr><tr><td>6553.16</td><td>= Sigma 60mm F2.8 DN</td>
+</tr><tr><td>6553.17</td><td>= Tamron 18-200mm F3.5-6.3 Di III VC</td>
+</tr><tr><td>6553.18</td><td>= Zeiss Touit 12mm F2.8</td>
+</tr><tr><td>6553.19</td><td>= Zeiss Touit 32mm F1.8</td>
+</tr><tr><td>6553.20</td><td>= Zeiss Touit 50mm F2.8 Macro</td>
+</tr><tr><td>6553.21</td><td>= Arax MC 35mm F2.8 Tilt+Shift</td>
+</tr><tr><td>6553.22</td><td>= Arax MC 80mm F2.8 Tilt+Shift</td>
+</tr><tr><td>6553.23</td><td>= Sony E 55-210mm F4.5-6.3 OSS</td>
+</tr><tr><td>6553.24</td><td>= Zenitar MF 16mm F2.8 Fisheye M42</td>
+</tr><tr><td>6553.25</td><td>= Samyang 500mm Mirror F8.0</td>
+</tr><tr><td>6553.26</td><td>= Pentacon Auto 135mm F2.8</td>
+</tr><tr><td>6553.27</td><td>= Pentacon Auto 29mm F2.8</td>
+</tr><tr><td>6553.28</td><td>= Helios 44-2 58mm F2.0</td>
+</tr><tr><td>6553.29</td><td>= Sony E 18-200mm F3.5-6.3 OSS</td>
+</tr><tr><td>6553.30</td><td>= Sony E 30mm F3.5 Macro</td>
+</tr><tr><td>6553.31</td><td>= Sony E 24mm F1.8 ZA</td>
+</tr><tr><td>6553.32</td><td>= Sony E 50mm F1.8 OSS</td>
+</tr><tr><td>6553.33</td><td>= Sony E 16-70mm F4 ZA OSS</td>
+</tr><tr><td>6553.34</td><td>= Sony E 10-18mm F4 OSS</td>
 </tr><tr><td>25501</td><td>= Minolta AF 50mm F1.7</td>
 </tr><tr><td>25511</td><td>= Minolta AF 35-70mm F4 or Other Lens</td>
 </tr><tr><td>25511.1</td><td>= Sigma UC AF 28-70mm F3.5-4.5</td>
@@ -1090,6 +1167,7 @@ brackets if the original version of the lens has the same LensType.</p>
 </tr><tr><td>25531</td><td>= Minolta AF 28-135mm F4-4.5 or Sigma Lens</td>
 </tr><tr><td>25531.1</td><td>= Sigma ZOOM-alpha 35-135mm F3.5-4.5</td>
 </tr><tr><td>25531.2</td><td>= Sigma 28-105mm F2.8-4 Aspherical</td>
+</tr><tr><td>25531.3</td><td>= Sigma 28-105mm F4-5.6 UC</td>
 </tr><tr><td>25541</td><td>= Minolta AF 35-105mm F3.5-4.5</td>
 </tr><tr><td>25551</td><td>= Minolta AF 70-210mm F4 Macro or Sigma Lens</td>
 </tr><tr><td>25551.1</td><td>= Sigma 70-210mm F4-5.6 APO</td>
@@ -1185,34 +1263,49 @@ brackets if the original version of the lens has the same LensType.</p>
 </tr><tr><td>45741.3</td><td>= Tokina 300mm F2.8 x2</td>
 </tr><tr><td>45751</td><td>= 1.4x Teleconverter</td>
 </tr><tr><td>45851</td><td>= Tamron SP AF 300mm F2.8 LD IF</td>
+</tr><tr><td>45861</td><td>= Tamron SP AF 35-105mm F2.8 LD Aspherical IF</td>
 </tr><tr><td>45871</td><td>= Tamron AF 70-210mm F2.8 SP LD</td>
+</tr><tr><td>61184</td><td>= Metabones Canon EF Adapter</td>
 </tr><tr><td>65535</td><td>= E-Mount, T-Mount, Other Lens or no lens</td>
 </tr><tr><td>65535.1</td><td>= Sony E 16mm F2.8</td>
-</tr><tr><td>65535.2</td><td>= Sony E 20mm F2.8</td>
-</tr><tr><td>65535.3</td><td>= Sony E 24mm F1.8 ZA</td>
-</tr><tr><td>65535.4</td><td>= Sony E 30mm F3.5 Macro</td>
-</tr><tr><td>65535.5</td><td>= Sony E 35mm F1.8 OSS</td>
-</tr><tr><td>65535.6</td><td>= Sony E 50mm F1.8 OSS</td>
-</tr><tr><td>65535.7</td><td>= Sony E 10-18mm F4 OSS</td>
-</tr><tr><td>65535.8</td><td>= Sony E PZ 16-50mm F3.5-5.6 OSS</td>
-</tr><tr><td>65535.9</td><td>= Sony E 18-55mm F3.5-5.6 OSS</td>
-</tr><tr><td>65535.10</td><td>= Sony E 18-200mm F3.5-6.3 OSS</td>
-</tr><tr><td>65535.11</td><td>= Sony E 55-210mm F4.5-6.3 OSS</td>
-</tr><tr><td>65535.12</td><td>= Sigma 19mm F2.8 EX DN</td>
-</tr><tr><td>65535.13</td><td>= Sigma 30mm F2.8 EX DN</td>
-</tr><tr><td>65535.14</td><td>= Tamron 18-200mm F3.5-6.3 Di III VC</td>
-</tr><tr><td>65535.15</td><td>= Arax MC 35mm F2.8 Tilt+Shift</td>
-</tr><tr><td>65535.16</td><td>= Arax MC 80mm F2.8 Tilt+Shift</td>
-</tr><tr><td>65535.17</td><td>= Zenitar MF 16mm F2.8 Fisheye M42</td>
-</tr><tr><td>65535.18</td><td>= Samyang 500mm Mirror F8.0</td>
-</tr><tr><td>65535.19</td><td>= Pentacon Auto 135mm F2.8</td>
-</tr><tr><td>65535.20</td><td>= Pentacon Auto 29mm F2.8</td>
-</tr><tr><td>65535.21</td><td>= Helios 44-2 58mm F2.0</td>
+</tr><tr><td>65535.2</td><td>= Sony E 18-55mm F3.5-5.6 OSS</td>
+</tr><tr><td>65535.3</td><td>= Sony E 55-210mm F4.5-6.3 OSS</td>
+</tr><tr><td>65535.4</td><td>= Sony E 18-200mm F3.5-6.3 OSS</td>
+</tr><tr><td>65535.5</td><td>= Sony E 30mm F3.5 Macro</td>
+</tr><tr><td>65535.6</td><td>= Sony E 24mm F1.8 ZA</td>
+</tr><tr><td>65535.7</td><td>= Sony E 50mm F1.8 OSS</td>
+</tr><tr><td>65535.8</td><td>= Sony E 16-70mm F4 ZA OSS</td>
+</tr><tr><td>65535.9</td><td>= Sony E 10-18mm F4 OSS</td>
+</tr><tr><td>65535.10</td><td>= Sony E PZ 16-50mm F3.5-5.6 OSS</td>
+</tr><tr><td>65535.11</td><td>= Sony FE 35mm F2.8 ZA</td>
+</tr><tr><td>65535.12</td><td>= Sony FE 24-70mm F4 ZA OSS</td>
+</tr><tr><td>65535.13</td><td>= Sony E 18-200mm F3.5-6.3 OSS LE</td>
+</tr><tr><td>65535.14</td><td>= Sony E 20mm F2.8</td>
+</tr><tr><td>65535.15</td><td>= Sony E 35mm F1.8 OSS</td>
+</tr><tr><td>65535.16</td><td>= Sony E PZ 18-105mm F4 G OSS</td>
+</tr><tr><td>65535.17</td><td>= Sony E PZ 18-200mm F3.5-6.3 OSS</td>
+</tr><tr><td>65535.18</td><td>= Sony FE 55mm F1.8 ZA</td>
+</tr><tr><td>65535.19</td><td>= Sony FE 28-70mm F3.5-5.6 OSS</td>
+</tr><tr><td>65535.20</td><td>= Sony FE 70-200mm F4 G OSS</td>
+</tr><tr><td>65535.21</td><td>= Sigma 19mm F2.8 [EX] DN</td>
+</tr><tr><td>65535.22</td><td>= Sigma 30mm F2.8 [EX] DN</td>
+</tr><tr><td>65535.23</td><td>= Sigma 60mm F2.8 DN</td>
+</tr><tr><td>65535.24</td><td>= Tamron 18-200mm F3.5-6.3 Di III VC</td>
+</tr><tr><td>65535.25</td><td>= Zeiss Touit 12mm F2.8</td>
+</tr><tr><td>65535.26</td><td>= Zeiss Touit 32mm F1.8</td>
+</tr><tr><td>65535.27</td><td>= Zeiss Touit 50mm F2.8 Macro</td>
+</tr><tr><td>65535.28</td><td>= Arax MC 35mm F2.8 Tilt+Shift</td>
+</tr><tr><td>65535.29</td><td>= Arax MC 80mm F2.8 Tilt+Shift</td>
+</tr><tr><td>65535.30</td><td>= Zenitar MF 16mm F2.8 Fisheye M42</td>
+</tr><tr><td>65535.31</td><td>= Samyang 500mm Mirror F8.0</td>
+</tr><tr><td>65535.32</td><td>= Pentacon Auto 135mm F2.8</td>
+</tr><tr><td>65535.33</td><td>= Pentacon Auto 29mm F2.8</td>
+</tr><tr><td>65535.34</td><td>= Helios 44-2 58mm F2.0</td>
 </tr></table></td></tr></table></blockquote>
 
 <h2><a name='CameraInfo'>Sony CameraInfo Tags</a></h2>
 <p>Camera information stored by the A33, A35, A55, A450, A500, A550, A560,
-A580, NEX-3/5/C3 and VG10E.  Some tags are valid only for some of these
+A580, NEX-3/5/5C/C3 and VG10E.  Some tags are valid only for some of these
 models.</p>
 <blockquote>
 <table class=frame><tr><td>
@@ -1235,6 +1328,30 @@ models.</p>
 <td class=c>int16u</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
+<td class=r title='20 = 0x14'>20</td>
+<td>AFPointSelected</td>
+<td class=c>int8u</td>
+<td><table class=cols><tr>
+  <td>0 = Auto
+  <br>1 = Center
+  <br>2 = Top
+  <br>3 = Upper-right
+  <br>4 = Right</td><td>&nbsp;&nbsp;</td>
+  <td>5 = Lower-right
+  <br>6 = Bottom
+  <br>7 = Lower-left
+  <br>8 = Left
+  <br>9 = Upper-left</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr>
+<td class=r title='21 = 0x15'>21</td>
+<td>FocusMode</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Manual
+  <br>1 = AF-S
+  <br>2 = AF-C
+  <br>3 = AF-A</span></td></tr>
+<tr class=b>
 <td class=r title='25 = 0x19'>25</td>
 <td>FocusStatus</td>
 <td class=c>int8u</td>
@@ -1314,18 +1431,74 @@ models.</p>
 <td class=c>undef[8]</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
+<td class=r title='20 = 0x14'>20</td>
+<td>FocusModeSetting</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Manual
+  <br>1 = AF-S
+  <br>2 = AF-C
+  <br>3 = AF-A
+  <br>4 = DMF</span></td></tr>
+<tr>
+<td class=r title='21 = 0x15'>21</td>
+<td>AFPointSelected</td>
+<td class=c>int8u</td>
+<td><table class=cols><tr>
+  <td>0 = Auto
+  <br>1 = Center
+  <br>2 = Top
+  <br>3 = Upper-right
+  <br>4 = Right
+  <br>5 = Lower-right</td><td>&nbsp;&nbsp;</td>
+  <td>6 = Bottom
+  <br>7 = Lower-left
+  <br>8 = Left
+  <br>9 = Upper-left
+  <br>10 = Far Right
+  <br>11 = Far Left</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr class=b>
+<td class=r title='25 = 0x19'>25</td>
+<td>AFPoint</td>
+<td class=c>int8u</td>
+<td><table class=cols><tr>
+  <td>0 = Upper-left
+  <br>1 = Left
+  <br>2 = Lower-left
+  <br>3 = Far Left
+  <br>4 = Bottom Assist-left
+  <br>5 = Bottom
+  <br>6 = Bottom Assist-right
+  <br>7 = Center (7)
+  <br>8 = Center (horizontal)
+  <br>9 = Center (9)
+  <br>10 = Center (10)
+  <br>11 = Center (11)</td><td>&nbsp;&nbsp;</td>
+  <td>12 = Center (12)
+  <br>13 = Center (vertical)
+  <br>14 = Center (14)
+  <br>15 = Top Assist-left
+  <br>16 = Top
+  <br>17 = Top Assist-right
+  <br>18 = Far Right
+  <br>19 = Upper-right
+  <br>20 = Right
+  <br>21 = Lower-right
+  <br>22 = Center F2.8</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr>
 <td class=r title='304 = 0x130'>304</td>
 <td>AFMicroAdjValue</td>
 <td class=c>int8u</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td class=r title='305 = 0x131'>305</td>
 <td>AFMicroAdjMode</td>
 <td class=c>int8u</td>
 <td><span class=s>[Mask 0x80]
   <br>0x0 = Off
   <br>0x80 = On</span></td></tr>
-<tr class=b>
+<tr>
 <td class=r title='305 = 0x131'>305.1</td>
 <td>AFMicroAdjRegisteredLenses</td>
 <td class=c>int8u</td>
@@ -1422,22 +1595,7 @@ A200, A230, A290, A300, A330, A350, A380, A390, A700, A850 and A900.</p>
 <td class=r title='63 = 0x3f'>63</td>
 <td>ExposureProgram</td>
 <td class=c>int8u</td>
-<td><table class=cols><tr>
-  <td>0 = Auto
-  <br>1 = Manual
-  <br>2 = Program AE
-  <br>3 = Aperture-priority AE
-  <br>4 = Shutter speed priority AE
-  <br>8 = Program Shift A
-  <br>9 = Program Shift S
-  <br>16 = Portrait
-  <br>17 = Sports
-  <br>18 = Sunset
-  <br>19 = Night Portrait
-  <br>20 = Landscape
-  <br>21 = Macro
-  <br>35 = Auto No Flash</td><td>&nbsp;&nbsp;</td></tr></table>
-</td></tr>
+<td>--&gt; <a href='Sony.html#ExposureProgram'>Sony ExposureProgram Values</a></td></tr>
 <tr>
 <td class=r title='65 = 0x41'>65</td>
 <td>CreativeStyle</td>
@@ -1459,12 +1617,39 @@ A200, A230, A290, A300, A330, A350, A380, A390, A700, A850 and A900.</p>
   <br>16 = Sepia</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
 <tr class=b>
+<td class=r title='2118 = 0x846'>2118</td>
+<td>ShutterCount</td>
+<td class=c>int32u</td>
+<td><span class=s><span class=n>(only valid for some DSLR models)</span></span></td></tr>
+<tr>
 <td class=r title='2491 = 0x9bb'>2491</td>
 <td>FocusPosition</td>
 <td class=c>int8u</td>
 <td><span class=s><span class=n>(only valid for some DSLR models)</span></span></td></tr>
 </table></td></tr></table></blockquote>
 
+<h2><a name='ExposureProgram'>Sony ExposureProgram Values</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class='inner sep' cellspacing=1>
+<tr class=h><th>Value</th><th>ExposureProgram</th><th>Value</th><th>ExposureProgram</th><th>Value</th><th>ExposureProgram</th></tr>
+<tr><td class=r>0</td><td>= Auto</td>
+<td class='r b'>8</td><td class=b>= Program Shift A</td>
+<td class=r>19</td><td>= Night Portrait</td>
+</tr><tr><td class=r>1</td><td>= Manual</td>
+<td class='r b'>9</td><td class=b>= Program Shift S</td>
+<td class=r>20</td><td>= Landscape</td>
+</tr><tr><td class=r>2</td><td>= Program AE</td>
+<td class='r b'>16</td><td class=b>= Portrait</td>
+<td class=r>21</td><td>= Macro</td>
+</tr><tr><td class=r>3</td><td>= Aperture-priority AE</td>
+<td class='r b'>17</td><td class=b>= Sports</td>
+<td class=r>35</td><td>= Auto No Flash</td>
+</tr><tr><td class=r>4</td><td>= Shutter speed priority AE</td>
+<td class='r b'>18</td><td class=b>= Sunset</td>
+<td class=r>&nbsp;</td><td>&nbsp;</td>
+</tr></table></td></tr></table></blockquote>
+
 <h2><a name='MoreInfo'>Sony MoreInfo Tags</a></h2>
 <p>More camera settings information decoded for the A450, A500, A550, A560,
 A580, A33, A35, A55, NEX-3/5/C3 and VG10E.</p>
@@ -1480,15 +1665,27 @@ A580, A33, A35, A55, NEX-3/5/C3 and VG10E.</p>
 <td>--&gt; <a href='Sony.html#MoreSettings'>Sony MoreSettings Tags</a></td></tr>
 <tr class=b>
 <td title='0x0002 = 2'>0x0002</td>
-<td>FaceInfo</td>
-<td class=c>-</td>
-<td>--&gt; <a href='Sony.html#FaceInfo'>Sony FaceInfo Tags</a></td></tr>
+<td>FaceInfo
+  <br>FaceInfoA</td>
+<td class=c>-<br>-</td>
+<td>--&gt; <a href='Sony.html#FaceInfo'>Sony FaceInfo Tags</a>
+  <br>--&gt; <a href='Sony.html#FaceInfoA'>Sony FaceInfoA Tags</a></td></tr>
 <tr>
 <td title='0x0107 = 263'>0x0107</td>
 <td>TiffMeteringImage</td>
 <td class=c>N</td>
 <td><span class=s><span class=n>(10-bit RGB data from the 1200 AE metering segments, converted to a 16-bit
 TIFF image)</span></span></td></tr>
+<tr class=b>
+<td title='0x0201 = 513'>0x0201</td>
+<td>MoreInfo0201</td>
+<td class=c>-</td>
+<td>--&gt; <a href='Sony.html#MoreInfo0201'>Sony MoreInfo0201 Tags</a></td></tr>
+<tr>
+<td title='0x0401 = 1025'>0x0401</td>
+<td>MoreInfo0401</td>
+<td class=c>-</td>
+<td>--&gt; <a href='Sony.html#MoreInfo0401'>Sony MoreInfo0401 Tags</a></td></tr>
 </table></td></tr></table></blockquote>
 
 <h2><a name='MoreSettings'>Sony MoreSettings Tags</a></h2>
@@ -1518,40 +1715,7 @@ TIFF image)</span></span></td></tr>
 <td class=r title='2 = 0x2'>2</td>
 <td>ExposureProgram</td>
 <td class=c>int8u</td>
-<td><table class=cols><tr>
-  <td>1 = Program AE
-  <br>2 = Aperture-priority AE
-  <br>3 = Shutter speed priority AE
-  <br>4 = Manual
-  <br>5 = Cont. Priority AE
-  <br>16 = Auto
-  <br>17 = Auto (no flash)
-  <br>18 = Auto+
-  <br>49 = Portrait
-  <br>50 = Landscape
-  <br>51 = Macro
-  <br>52 = Sports
-  <br>53 = Sunset
-  <br>54 = Night view
-  <br>55 = Night view/portrait
-  <br>56 = Handheld Night Shot
-  <br>57 = 3D Sweep Panorama
-  <br>64 = Auto 2
-  <br>65 = Auto 2 (no flash)
-  <br>80 = Sweep Panorama
-  <br>96 = Anti Motion Blur
-  <br>128 = Toy Camera
-  <br>129 = Pop Color
-  <br>130 = Posterization
-  <br>131 = Posterization B/W
-  <br>132 = Retro Photo
-  <br>133 = High-key
-  <br>134 = Partial Color Red
-  <br>135 = Partial Color Green
-  <br>136 = Partial Color Blue
-  <br>137 = Partial Color Yellow
-  <br>138 = High Contrast Monochrome</td><td>&nbsp;&nbsp;</td></tr></table>
-</td></tr>
+<td>--&gt; <a href='Sony.html#ExposureProgram2'>Sony ExposureProgram2 Values</a></td></tr>
 <tr>
 <td class=r title='3 = 0x3'>3</td>
 <td>MeteringMode</td>
@@ -1728,29 +1892,35 @@ TIFF image)</span></span></td></tr>
 <td class=c>int8u</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td class=r title='41 = 0x29'>41</td>
+<td>FocalLength2</td>
+<td class=c>int8u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td class=r title='42 = 0x2a'>42</td>
 <td>ExposureCompensation2</td>
 <td class=c>int16s</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td class=r title='44 = 0x2c'>44</td>
 <td>FlashExposureCompSet2</td>
 <td class=c>int16s</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td class=r title='46 = 0x2e'>46</td>
 <td>Orientation2</td>
 <td class=c>int8u</td>
 <td><span class=s>1 = Horizontal (normal)
+  <br>2 = Rotate 180
   <br>6 = Rotate 90 CW
   <br>8 = Rotate 270 CW</span></td></tr>
-<tr class=b>
+<tr>
 <td class=r title='48 = 0x30'>48</td>
 <td>FlashAction2</td>
 <td class=c>int8u</td>
 <td><span class=s>0 = Did not fire
   <br>1 = Fired</span></td></tr>
-<tr>
+<tr class=b>
 <td class=r title='50 = 0x32'>50</td>
 <td>FocusMode2</td>
 <td class=c>int8u</td>
@@ -1758,6 +1928,46 @@ TIFF image)</span></span></td></tr>
   <br>1 = MF</span></td></tr>
 </table></td></tr></table></blockquote>
 
+<h2><a name='ExposureProgram2'>Sony ExposureProgram2 Values</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class='inner sep' cellspacing=1>
+<tr class=h><th>Value</th><th>ExposureProgram2</th><th>Value</th><th>ExposureProgram2</th><th>Value</th><th>ExposureProgram2</th></tr>
+<tr><td class=r>1</td><td>= Program AE</td>
+<td class='r b'>52</td><td class=b>= Sports</td>
+<td class=r>129</td><td>= Pop Color</td>
+</tr><tr><td class=r>2</td><td>= Aperture-priority AE</td>
+<td class='r b'>53</td><td class=b>= Sunset</td>
+<td class=r>130</td><td>= Posterization</td>
+</tr><tr><td class=r>3</td><td>= Shutter speed priority AE</td>
+<td class='r b'>54</td><td class=b>= Night view</td>
+<td class=r>131</td><td>= Posterization B/W</td>
+</tr><tr><td class=r>4</td><td>= Manual</td>
+<td class='r b'>55</td><td class=b>= Night view/portrait</td>
+<td class=r>132</td><td>= Retro Photo</td>
+</tr><tr><td class=r>5</td><td>= Cont. Priority AE</td>
+<td class='r b'>56</td><td class=b>= Handheld Night Shot</td>
+<td class=r>133</td><td>= High-key</td>
+</tr><tr><td class=r>16</td><td>= Auto</td>
+<td class='r b'>57</td><td class=b>= 3D Sweep Panorama</td>
+<td class=r>134</td><td>= Partial Color Red</td>
+</tr><tr><td class=r>17</td><td>= Auto (no flash)</td>
+<td class='r b'>64</td><td class=b>= Auto 2</td>
+<td class=r>135</td><td>= Partial Color Green</td>
+</tr><tr><td class=r>18</td><td>= Auto+</td>
+<td class='r b'>65</td><td class=b>= Auto 2 (no flash)</td>
+<td class=r>136</td><td>= Partial Color Blue</td>
+</tr><tr><td class=r>49</td><td>= Portrait</td>
+<td class='r b'>80</td><td class=b>= Sweep Panorama</td>
+<td class=r>137</td><td>= Partial Color Yellow</td>
+</tr><tr><td class=r>50</td><td>= Landscape</td>
+<td class='r b'>96</td><td class=b>= Anti Motion Blur</td>
+<td class=r>138</td><td>= High Contrast Monochrome</td>
+</tr><tr><td class=r>51</td><td>= Macro</td>
+<td class='r b'>128</td><td class=b>= Toy Camera</td>
+<td class=r>&nbsp;</td><td>&nbsp;</td>
+</tr></table></td></tr></table></blockquote>
+
 <h2><a name='WhiteBalanceSetting'>Sony WhiteBalanceSetting Values</a></h2>
 <blockquote>
 <table class=frame><tr><td>
@@ -1872,65 +2082,175 @@ increasing Y downwards)</span></span></td></tr>
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
-<h2><a name='CameraSettings'>Sony CameraSettings Tags</a></h2>
-<p>Camera settings for the A200, A300, A350, A700, A850 and A900.</p>
+<h2><a name='FaceInfoA'>Sony FaceInfoA Tags</a></h2>
 <blockquote>
 <table class=frame><tr><td>
 <table class=inner cellspacing=1>
 <tr class=h><th>Index2</th><th>Tag Name</th>
 <th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
 <tr>
-<td class=r title='0 = 0x0'>0</td>
-<td>ExposureTime</td>
-<td class=c>int16u</td>
+<td class=r title='3 = 0x3'>3</td>
+<td>FacesDetected</td>
+<td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td class=r title='1 = 0x1'>1</td>
-<td>FNumber</td>
-<td class=c>int16u</td>
+<td class=r title='11 = 0xb'>11</td>
+<td>PotentialFace1Position</td>
+<td class=c>int16u[4]</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td class=r title='4 = 0x4'>4</td>
-<td>DriveMode</td>
-<td class=c>int16u</td>
-<td><span class=s>[Mask 0xff]</span><table class=cols><tr>
-  <td>0x1 = Single Frame
-  <br>0x2 = Continuous High
-  <br>0x4 = Self-timer 10 sec
-  <br>0x5 = Self-timer 2 sec, Mirror Lock-up
-  <br>0x6 = Single-frame Bracketing
-  <br>0x7 = Continuous Bracketing
-  <br>0xa = Remote Commander
-  <br>0xb = Mirror Lock-up
-  <br>0x12 = Continuous Low
-  <br>0x18 = White Balance Bracketing Low
-  <br>0x19 = D-Range Optimizer Bracketing Low
-  <br>0x28 = White Balance Bracketing High
-  <br>0x29 = D-Range Optimizer Bracketing High</td><td>&nbsp;&nbsp;</td></tr></table>
-</td></tr>
+<td class=r title='21 = 0x15'>21</td>
+<td>PotentialFace2Position</td>
+<td class=c>int16u[4]</td>
+<td>&nbsp;</td></tr>
 <tr class=b>
-<td class=r title='6 = 0x6'>6</td>
-<td>WhiteBalanceFineTune</td>
-<td class=c>int16s</td>
-<td><span class=s><span class=n>(A700 only)</span></span></td></tr>
+<td class=r title='31 = 0x1f'>31</td>
+<td>PotentialFace3Position</td>
+<td class=c>int16u[4]</td>
+<td>&nbsp;</td></tr>
 <tr>
-<td class=r title='12 = 0xc'>12</td>
-<td>ColorTemperatureSetting</td>
-<td class=c>int16u</td>
+<td class=r title='41 = 0x29'>41</td>
+<td>PotentialFace4Position</td>
+<td class=c>int16u[4]</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td class=r title='13 = 0xd'>13</td>
-<td>ColorCompensationFilterSet</td>
-<td class=c>int16u</td>
-<td><span class=s><span class=n>(negative is green, positive is magenta)</span></span></td></tr>
+<td class=r title='51 = 0x33'>51</td>
+<td>PotentialFace5Position</td>
+<td class=c>int16u[4]</td>
+<td>&nbsp;</td></tr>
 <tr>
-<td class=r title='16 = 0x10'>16</td>
+<td class=r title='61 = 0x3d'>61</td>
+<td>PotentialFace6Position</td>
+<td class=c>int16u[4]</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='71 = 0x47'>71</td>
+<td>PotentialFace7Position</td>
+<td class=c>int16u[4]</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='81 = 0x51'>81</td>
+<td>PotentialFace8Position</td>
+<td class=c>int16u[4]</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='91 = 0x5b'>91</td>
+<td>Face1Position</td>
+<td class=c>int16u[4]</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='101 = 0x65'>101</td>
+<td>Face2Position</td>
+<td class=c>int16u[4]</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='111 = 0x6f'>111</td>
+<td>Face3Position</td>
+<td class=c>int16u[4]</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='121 = 0x79'>121</td>
+<td>Face4Position</td>
+<td class=c>int16u[4]</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='MoreInfo0201'>Sony MoreInfo0201 Tags</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index1</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='283 = 0x11b'>283</td>
+<td>ImageCount</td>
+<td class=c>int32u</td>
+<td><span class=s><span class=n>(not valid for the A450, A500 or A550)</span></span></td></tr>
+<tr class=b>
+<td class=r title='293 = 0x125'>293</td>
+<td>ShutterCount</td>
+<td class=c>int32u</td>
+<td><span class=s><span class=n>(not valid for the A450, A500 or A550)</span></span></td></tr>
+<tr>
+<td class=r title='330 = 0x14a'>330</td>
+<td>ShutterCount</td>
+<td class=c>int32u</td>
+<td><span class=s><span class=n>(A450, A500 and A550 only)</span></span></td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='MoreInfo0401'>Sony MoreInfo0401 Tags</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index1</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='1102 = 0x44e'>1102</td>
+<td>ShotNumberSincePowerUp</td>
+<td class=c>int32u</td>
+<td><span class=s><span class=n>(Not valid for the NEX-3 or NEX-5)</span></span></td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='CameraSettings'>Sony CameraSettings Tags</a></h2>
+<p>Camera settings for the A200, A300, A350, A700, A850 and A900.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index2</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='0 = 0x0'>0</td>
+<td>ExposureTime</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='1 = 0x1'>1</td>
+<td>FNumber</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='4 = 0x4'>4</td>
+<td>DriveMode</td>
+<td class=c>int16u</td>
+<td><span class=s>[Mask 0xff]</span><table class=cols><tr>
+  <td>0x1 = Single Frame
+  <br>0x2 = Continuous High
+  <br>0x4 = Self-timer 10 sec
+  <br>0x5 = Self-timer 2 sec, Mirror Lock-up
+  <br>0x6 = Single-frame Bracketing
+  <br>0x7 = Continuous Bracketing
+  <br>0xa = Remote Commander
+  <br>0xb = Mirror Lock-up
+  <br>0x12 = Continuous Low
+  <br>0x18 = White Balance Bracketing Low
+  <br>0x19 = D-Range Optimizer Bracketing Low
+  <br>0x28 = White Balance Bracketing High
+  <br>0x29 = D-Range Optimizer Bracketing High</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr class=b>
+<td class=r title='6 = 0x6'>6</td>
+<td>WhiteBalanceFineTune</td>
+<td class=c>int16s</td>
+<td><span class=s><span class=n>(A700 only)</span></span></td></tr>
+<tr>
+<td class=r title='12 = 0xc'>12</td>
+<td>ColorTemperatureSetting</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='13 = 0xd'>13</td>
+<td>ColorCompensationFilterSet</td>
+<td class=c>int16u</td>
+<td><span class=s><span class=n>(negative is green, positive is magenta)</span></span></td></tr>
+<tr>
+<td class=r title='16 = 0x10'>16</td>
 <td>FocusModeSetting</td>
 <td class=c>int16u</td>
 <td><span class=s>0 = Manual
   <br>1 = AF-S
   <br>2 = AF-C
-  <br>3 = AF-A</span></td></tr>
+  <br>3 = AF-A
+  <br>4 = DMF</span></td></tr>
 <tr class=b>
 <td class=r title='17 = 0x11'>17</td>
 <td>AFAreaMode</td>
@@ -1940,18 +2260,18 @@ increasing Y downwards)</span></span></td></tr>
   <br>2 = Spot</span></td></tr>
 <tr>
 <td class=r title='18 = 0x12'>18</td>
-<td>AFPointSelected</td>
+<td>AFPointSetting</td>
 <td class=c>int16u</td>
 <td><table class=cols><tr>
   <td>1 = Center
   <br>2 = Top
-  <br>3 = Top-Right
+  <br>3 = Upper-right
   <br>4 = Right
-  <br>5 = Bottom-Right
+  <br>5 = Lower-right
   <br>6 = Bottom</td><td>&nbsp;&nbsp;</td>
-  <td>7 = Bottom-Left
+  <td>7 = Lower-left
   <br>8 = Left
-  <br>9 = Top-Left
+  <br>9 = Upper-left
   <br>10 = Far Right
   <br>11 = Far Left</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
@@ -2111,22 +2431,7 @@ increasing Y downwards)</span></span></td></tr>
 <td class=r title='60 = 0x3c'>60</td>
 <td>ExposureProgram</td>
 <td class=c>int16u</td>
-<td><table class=cols><tr>
-  <td>0 = Auto
-  <br>1 = Manual
-  <br>2 = Program AE
-  <br>3 = Aperture-priority AE
-  <br>4 = Shutter speed priority AE
-  <br>8 = Program Shift A
-  <br>9 = Program Shift S
-  <br>16 = Portrait
-  <br>17 = Sports
-  <br>18 = Sunset
-  <br>19 = Night Portrait
-  <br>20 = Landscape
-  <br>21 = Macro
-  <br>35 = Auto No Flash</td><td>&nbsp;&nbsp;</td></tr></table>
-</td></tr>
+<td>--&gt; <a href='Sony.html#ExposureProgram'>Sony ExposureProgram Values</a></td></tr>
 <tr class=b>
 <td class=r title='61 = 0x3d'>61</td>
 <td>ImageStabilizationSetting</td>
@@ -2147,7 +2452,8 @@ increasing Y downwards)</span></span></td></tr>
 <td><span class=s>0 = Manual
   <br>1 = AF-S
   <br>2 = AF-C
-  <br>3 = AF-A</span></td></tr>
+  <br>3 = AF-A
+  <br>4 = DMF</span></td></tr>
 <tr>
 <td class=r title='81 = 0x51'>81</td>
 <td>BatteryLevel</td>
@@ -2195,10 +2501,15 @@ increasing Y downwards)</span></span></td></tr>
 <td><span class=s>33 = 1/3 EV
   <br>50 = 1/2 EV</span></td></tr>
 <tr>
+<td class=r title='154 = 0x9a'>154</td>
+<td>FolderNumber</td>
+<td class=c>int16u</td>
+<td><span class=s>[Mask 0x3ff]</span></td></tr>
+<tr class=b>
 <td class=r title='155 = 0x9b'>155</td>
 <td>ImageNumber</td>
 <td class=c>int16u</td>
-<td>&nbsp;</td></tr>
+<td><span class=s>[Mask 0x3fff]</span></td></tr>
 </table></td></tr></table></blockquote>
 
 <h2><a name='CameraSettings2'>Sony CameraSettings2 Tags</a></h2>
@@ -2245,18 +2556,18 @@ increasing Y downwards)</span></span></td></tr>
   <br>2 = Spot</span></td></tr>
 <tr>
 <td class=r title='17 = 0x11'>17</td>
-<td>AFPointSelected</td>
+<td>AFPointSetting</td>
 <td class=c>int16u</td>
 <td><table class=cols><tr>
   <td>1 = Center
   <br>2 = Top
-  <br>3 = Top-Right
+  <br>3 = Upper-right
   <br>4 = Right
-  <br>5 = Bottom-Right</td><td>&nbsp;&nbsp;</td>
+  <br>5 = Lower-right</td><td>&nbsp;&nbsp;</td>
   <td>6 = Bottom
-  <br>7 = Bottom-Left
+  <br>7 = Lower-left
   <br>8 = Left
-  <br>9 = Top-Left</td><td>&nbsp;&nbsp;</td></tr></table>
+  <br>9 = Upper-left</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
 <tr class=b>
 <td class=r title='19 = 0x13'>19</td>
@@ -2358,22 +2669,7 @@ increasing Y downwards)</span></span></td></tr>
 <td class=r title='60 = 0x3c'>60</td>
 <td>ExposureProgram</td>
 <td class=c>int16u</td>
-<td><table class=cols><tr>
-  <td>0 = Auto
-  <br>1 = Manual
-  <br>2 = Program AE
-  <br>3 = Aperture-priority AE
-  <br>4 = Shutter speed priority AE
-  <br>8 = Program Shift A
-  <br>9 = Program Shift S
-  <br>16 = Portrait
-  <br>17 = Sports
-  <br>18 = Sunset
-  <br>19 = Night Portrait
-  <br>20 = Landscape
-  <br>21 = Macro
-  <br>35 = Auto No Flash</td><td>&nbsp;&nbsp;</td></tr></table>
-</td></tr>
+<td>--&gt; <a href='Sony.html#ExposureProgram'>Sony ExposureProgram Values</a></td></tr>
 <tr>
 <td class=r title='61 = 0x3d'>61</td>
 <td>ImageStabilizationSetting</td>
@@ -2507,40 +2803,7 @@ A560, A580, NEX-3, NEX-5, NEX-C3 and NEX-VG10E.</p>
 <td class=r title='5 = 0x5'>5</td>
 <td>ExposureProgram</td>
 <td class=c>int8u</td>
-<td><table class=cols><tr>
-  <td>1 = Program AE
-  <br>2 = Aperture-priority AE
-  <br>3 = Shutter speed priority AE
-  <br>4 = Manual
-  <br>5 = Cont. Priority AE
-  <br>16 = Auto
-  <br>17 = Auto (no flash)
-  <br>18 = Auto+
-  <br>49 = Portrait
-  <br>50 = Landscape
-  <br>51 = Macro
-  <br>52 = Sports
-  <br>53 = Sunset
-  <br>54 = Night view
-  <br>55 = Night view/portrait
-  <br>56 = Handheld Night Shot
-  <br>57 = 3D Sweep Panorama
-  <br>64 = Auto 2
-  <br>65 = Auto 2 (no flash)
-  <br>80 = Sweep Panorama
-  <br>96 = Anti Motion Blur
-  <br>128 = Toy Camera
-  <br>129 = Pop Color
-  <br>130 = Posterization
-  <br>131 = Posterization B/W
-  <br>132 = Retro Photo
-  <br>133 = High-key
-  <br>134 = Partial Color Red
-  <br>135 = Partial Color Green
-  <br>136 = Partial Color Blue
-  <br>137 = Partial Color Yellow
-  <br>138 = High Contrast Monochrome</td><td>&nbsp;&nbsp;</td></tr></table>
-</td></tr>
+<td>--&gt; <a href='Sony.html#ExposureProgram2'>Sony ExposureProgram2 Values</a></td></tr>
 <tr>
 <td class=r title='6 = 0x6'>6</td>
 <td>FocusModeSetting</td>
@@ -2846,23 +3109,76 @@ A560, A580, NEX-3, NEX-5, NEX-C3 and NEX-VG10E.</p>
   <br>1 = AF
   <br>16 = Manual</span></td></tr>
 <tr class=b>
+<td class=r title='153 = 0x99'>153</td>
+<td>LensMount</td>
+<td class=c>int8u</td>
+<td><span class=s>1 = Unknown
+  <br>16 = A-Mount
+  <br>17 = E-Mount</span></td></tr>
+<tr>
 <td class=r title='268 = 0x10c'>268</td>
 <td>SequenceNumber</td>
 <td class=c>int8u</td>
 <td><span class=s>0 = Single
   <br>255 = n/a</span></td></tr>
-<tr>
+<tr class=b>
 <td class=r title='276 = 0x114'>276</td>
+<td>FolderNumber</td>
+<td class=c>int32u</td>
+<td><span class=s>[Mask 0xffc000]</span></td></tr>
+<tr>
+<td class=r title='276 = 0x114'>276.1</td>
 <td>ImageNumber</td>
-<td class=c>int16u</td>
+<td class=c>int32u</td>
 <td><span class=s>[Mask 0x3fff]</span></td></tr>
 <tr class=b>
+<td class=r title='512 = 0x200'>512</td>
+<td>ShotNumberSincePowerUp2</td>
+<td class=c>int32u</td>
+<td><span class=s><span class=n>(same as ShotNumberSincePowerUp for single-shot images, but includes all
+shots of the current image in multi-shot modes like HDR, panorama, and
+multi-frame noise reduction)</span></span></td></tr>
+<tr>
+<td class=r title='643 = 0x283'>643</td>
+<td>AFButtonPressed</td>
+<td class=c>int8u</td>
+<td><span class=s>1 = No
+  <br>16 = Yes</span></td></tr>
+<tr class=b>
+<td class=r title='644 = 0x284'>644</td>
+<td>LiveViewMetering</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = n/a
+  <br>16 = 40 Segment
+  <br>32 = 1200-zone Evaluative</span></td></tr>
+<tr>
+<td class=r title='645 = 0x285'>645</td>
+<td>ViewingMode2</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = n/a
+  <br>16 = Viewfinder
+  <br>33 = Focus Check Live View
+  <br>34 = Quick AF Live View</span></td></tr>
+<tr class=b>
+<td class=r title='646 = 0x286'>646</td>
+<td>AELock</td>
+<td class=c>int8u</td>
+<td><span class=s>1 = On
+  <br>2 = Off</span></td></tr>
+<tr>
 <td class=r title='647 = 0x287'>647</td>
 <td>FlashAction</td>
 <td class=c>int8u</td>
 <td><span class=s><span class=n>(A450, A500 and A550)</span>
   <br>1 = Did not fire
   <br>2 = Fired</span></td></tr>
+<tr class=b>
+<td class=r title='651 = 0x28b'>651</td>
+<td>LiveViewFocusMode</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = n/a
+  <br>1 = AF
+  <br>16 = Manual</span></td></tr>
 <tr>
 <td class=r title='780 = 0x30c'>780</td>
 <td>SequenceNumber</td>
@@ -2877,13 +3193,64 @@ A560, A580, NEX-3, NEX-5, NEX-C3 and NEX-VG10E.</p>
 <td><span class=s><span class=n>(A450, A500 and A550)</span>
   <br>[Mask 0x3fff]</span></td></tr>
 <tr>
+<td class=r title='790 = 0x316'>790</td>
+<td>FolderNumber</td>
+<td class=c>int16u</td>
+<td><span class=s><span class=n>(A450, A500 and A550)</span>
+  <br>[Mask 0x3ff]</span></td></tr>
+<tr class=b>
+<td class=r title='1015 = 0x3f7'>1015</td>
+<td>LensType2</td>
+<td class=c>int16u</td>
+<td>--&gt; <a href='Sony.html#LensType2'>Sony LensType2 Values</a></td></tr>
+<tr>
 <td class=r title='1024 = 0x400'>1024</td>
 <td>ImageNumber</td>
 <td class=c>int16u</td>
 <td><span class=s><span class=n>(A450, A500 and A550)</span>
   <br>[Mask 0x3fff]</span></td></tr>
+<tr class=b>
+<td class=r title='1026 = 0x402'>1026</td>
+<td>FolderNumber</td>
+<td class=c>int16u</td>
+<td><span class=s><span class=n>(A450, A500 and A550)</span>
+  <br>[Mask 0x3ff]</span></td></tr>
 </table></td></tr></table></blockquote>
 
+<h2><a name='LensType2'>Sony LensType2 Values</a></h2>
+<p>Lens type numbers for Sony E-Mount lenses used by NEX models.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class='inner sep' cellspacing=1>
+<tr class=h><th>Value</th><th>LensType2</th><th>Value</th><th>LensType2</th></tr>
+<tr><td class=r>0</td><td>= Unknown E-Mount lens or other lens</td>
+<td class='r b'>32790</td><td class=b>= Sony E 50mm F1.8 OSS</td>
+</tr><tr><td class=r>1</td><td>= Sony LA-EA1 Adapter</td>
+<td class='r b'>32791</td><td class=b>= Sony E 16-70mm F4 ZA OSS</td>
+</tr><tr><td class=r>2</td><td>= Sony LA-EA2 Adapter</td>
+<td class='r b'>32792</td><td class=b>= Sony E 10-18mm F4 OSS</td>
+</tr><tr><td class=r>3</td><td>= Sony LA-EA3 Adapter</td>
+<td class='r b'>32793</td><td class=b>= Sony E PZ 16-50mm F3.5-5.6 OSS</td>
+</tr><tr><td class=r>6</td><td>= Sony LA-EA4 Adapter</td>
+<td class='r b'>32794</td><td class=b>= Sony FE 35mm F2.8 ZA</td>
+</tr><tr><td class=r>44</td><td>= Metabones Canon EF Smart Adapter</td>
+<td class='r b'>32795</td><td class=b>= Sony FE 24-70mm F4 ZA OSS</td>
+</tr><tr><td class=r>239</td><td>= Metabones Canon EF Speed Booster</td>
+<td class='r b'>32797</td><td class=b>= Sony E 18-200mm F3.5-6.3 OSS LE</td>
+</tr><tr><td class=r>32784</td><td>= Sony E 16mm F2.8</td>
+<td class='r b'>32798</td><td class=b>= Sony E 20mm F2.8</td>
+</tr><tr><td class=r>32785</td><td>= Sony E 18-55mm F3.5-5.6 OSS</td>
+<td class='r b'>32799</td><td class=b>= Sony E 35mm F1.8 OSS</td>
+</tr><tr><td class=r>32786</td><td>= Sony E 55-210mm F4.5-6.3 OSS</td>
+<td class='r b'>32800</td><td class=b>= Sony E PZ 18-105mm F4 G OSS</td>
+</tr><tr><td class=r>32787</td><td>= Sony E 18-200mm F3.5-6.3 OSS</td>
+<td class='r b'>32807</td><td class=b>= Sony E PZ 18-200mm F3.5-6.3 OSS</td>
+</tr><tr><td class=r>32788</td><td>= Sony E 30mm F3.5 Macro</td>
+<td class='r b'>32808</td><td class=b>= Sony FE 55mm F1.8 ZA</td>
+</tr><tr><td class=r>32789</td><td>= Sony E 24mm F1.8 ZA</td>
+<td class='r b'>32813</td><td class=b>= Sony FE 28-70mm F3.5-5.6 OSS</td>
+</tr></table></td></tr></table></blockquote>
+
 <h2><a name='CameraSettingsUnknown'>Sony CameraSettingsUnknown Tags</a></h2>
 <blockquote>
 <table class=frame><tr><td>
@@ -3029,12 +3396,18 @@ A580 and NEX-3/5/C3/VG10.</p>
 </td></tr>
 <tr class=b>
 <td class=r title='22 = 0x16'>22</td>
-<td>MemoryCardConfiguration</td>
-<td class=c>int8u</td>
+<td>MemoryCardConfiguration
+  <br>CameraOrientation</td>
+<td class=c>int8u<br>int8u</td>
 <td><span class=s>244 = MemoryStick in use, SD card present
   <br>245 = MemoryStick in use, SD slot empty
   <br>252 = SD card in use, MemoryStick present
-  <br>254 = SD card in use, MemoryStick slot empty</span></td></tr>
+  <br>254 = SD card in use, MemoryStick slot empty
+  <br>[Mask 0xc0]
+  <br>0x0 = Horizontal (normal)
+  <br>0x40 = Rotate 90 CW
+  <br>0x80 = Rotate 270 CW
+  <br>0xc0 = Rotate 180</span></td></tr>
 <tr>
 <td class=r title='24 = 0x18'>24</td>
 <td>CameraOrientation</td>
@@ -3042,12 +3415,13 @@ A580 and NEX-3/5/C3/VG10.</p>
 <td><span class=s>[Mask 0x30]
   <br>0x0 = Horizontal (normal)
   <br>0x10 = Rotate 90 CW
-  <br>0x20 = Rotate 270 CW</span></td></tr>
+  <br>0x20 = Rotate 270 CW
+  <br>0x30 = Rotate 180</span></td></tr>
 </table></td></tr></table></blockquote>
 
 <h2><a name='Panorama'>Sony Panorama Tags</a></h2>
-<p>Tags found only in panorama images from Sony cameras such as the HX1, HX5
-and TX7.  The width/height values of these tags are not affected by camera
+<p>Tags found in panorama images from various Sony DSC, NEX, SLT and DSLR
+cameras.  The width/height values of these tags are not affected by camera
 rotation -- the width is always the longer dimension.</p>
 <blockquote>
 <table class=frame><tr><td>
@@ -3068,8 +3442,8 @@ rotation -- the width is always the longer dimension.</p>
 <td class=r title='3 = 0x3'>3</td>
 <td>PanoramaDirection</td>
 <td class=c>int32u</td>
-<td><span class=s>0 = Right to Left
-  <br>1 = Left to Right</span></td></tr>
+<td><span class=s>0 = Left or Up
+  <br>1 = Right or Down</span></td></tr>
 <tr class=b>
 <td class=r title='4 = 0x4'>4</td>
 <td>PanoramaCropLeft</td>
@@ -3112,67 +3486,977 @@ rotation -- the width is always the longer dimension.</p>
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
-<h2><a name='ShotInfo'>Sony ShotInfo Tags</a></h2>
+<h2><a name='Tag2010a'>Sony Tag2010a Tags</a></h2>
+<p>Valid for NEX-5N.</p>
 <blockquote>
 <table class=frame><tr><td>
 <table class=inner cellspacing=1>
-<tr class=h><th>Index1</th><th>Tag Name</th>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
 <th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
 <tr>
-<td class=r title='2 = 0x2'>2</td>
-<td>FaceInfoOffset</td>
-<td class=c>N</td>
-<td>&nbsp;</td></tr>
+<td title='0x1128 = 4392'>0x1128</td>
+<td>ReleaseMode3</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Normal
+  <br>1 = Continuous
+  <br>2 = Continuous - Bracketing
+  <br>5 = Continuous - Speed/Advance Priority</span></td></tr>
 <tr class=b>
-<td class=r title='6 = 0x6'>6</td>
-<td>SonyDateTime</td>
-<td class=c>string[20]</td>
-<td>&nbsp;</td></tr>
+<td title='0x112c = 4396'>0x112c</td>
+<td>ReleaseMode2</td>
+<td class=c>int8u</td>
+<td>--&gt; <a href='Sony.html#ReleaseMode2'>Sony ReleaseMode2 Values</a></td></tr>
 <tr>
-<td class=r title='26 = 0x1a'>26</td>
-<td>SonyImageHeight</td>
+<td title='0x113e = 4414'>0x113e</td>
+<td>StopsAboveBaseISO</td>
 <td class=c>int16u</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td class=r title='28 = 0x1c'>28</td>
-<td>SonyImageWidth</td>
+<td title='0x1140 = 4416'>0x1140</td>
+<td>BrightnessValue</td>
 <td class=c>int16u</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td class=r title='48 = 0x30'>48</td>
-<td>FacesDetected</td>
-<td class=c>int16u</td>
-<td>&nbsp;</td></tr>
+<td title='0x1144 = 4420'>0x1144</td>
+<td>DynamicRangeOptimizer</td>
+<td class=c>int8u</td>
+<td><table class=cols><tr>
+  <td>0 = Off
+  <br>1 = Auto
+  <br>3 = Lv1
+  <br>4 = Lv2</td><td>&nbsp;&nbsp;</td>
+  <td>5 = Lv3
+  <br>6 = Lv4
+  <br>7 = Lv5
+  <br>8 = n/a</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
 <tr class=b>
-<td class=r title='50 = 0x32'>50</td>
-<td>FaceInfoLength</td>
-<td class=c>N</td>
+<td title='0x1148 = 4424'>0x1148</td>
+<td>HDRSetting</td>
+<td class=c>int8u</td>
+<td><table class=cols><tr>
+  <td>0 = Off
+  <br>1 = HDR Auto
+  <br>7 = HDR 3 EV</td><td>&nbsp;&nbsp;</td>
+  <td>9 = HDR 4 EV
+  <br>11 = HDR 5 EV
+  <br>13 = HDR 6 EV</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr>
+<td title='0x114c = 4428'>0x114c</td>
+<td>ExposureCompensation</td>
+<td class=c>int16s</td>
 <td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x1163 = 4451'>0x1163</td>
+<td>PictureEffect2</td>
+<td class=c>int8u</td>
+<td>--&gt; <a href='Sony.html#PictureEffect2'>Sony PictureEffect2 Values</a></td></tr>
 <tr>
-<td class=r title='72 = 0x48'>72</td>
-<td>FaceInfo1</td>
-<td class=c>-</td>
-<td>--&gt; <a href='Sony.html#FaceInfo1'>Sony FaceInfo1 Tags</a></td></tr>
+<td title='0x1170 = 4464'>0x1170</td>
+<td>Quality2</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = JPEG
+  <br>1 = RAW
+  <br>2 = RAW + JPEG</span></td></tr>
 <tr class=b>
-<td class=r title='94 = 0x5e'>94</td>
-<td>FaceInfo2</td>
-<td class=c>-</td>
-<td>--&gt; <a href='Sony.html#FaceInfo2'>Sony FaceInfo2 Tags</a></td></tr>
+<td title='0x1174 = 4468'>0x1174</td>
+<td>MeteringMode</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Multi-segment
+  <br>2 = Center-weighted average
+  <br>3 = Spot</span></td></tr>
+<tr>
+<td title='0x1175 = 4469'>0x1175</td>
+<td>ExposureProgram</td>
+<td class=c>int8u</td>
+<td>--&gt; <a href='Sony.html#ExposureProgram3'>Sony ExposureProgram3 Values</a></td></tr>
+<tr class=b>
+<td title='0x117c = 4476'>0x117c</td>
+<td>WB_RGBLevels</td>
+<td class=c>int16u[3]</td>
+<td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
-<h2><a name='FaceInfo1'>Sony FaceInfo1 Tags</a></h2>
+<h2><a name='ReleaseMode2'>Sony ReleaseMode2 Values</a></h2>
 <blockquote>
 <table class=frame><tr><td>
-<table class=inner cellspacing=1>
-<tr class=h><th>Index1</th><th>Tag Name</th>
-<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
-<tr>
-<td class=r title='0 = 0x0'>0</td>
-<td>Face1Position</td>
-<td class=c>int16u[4]</td>
-<td><span class=s><span class=n>(top, left, height and width of detected face.  Coordinates are relative to
-the full-sized unrotated image, with increasing Y downwards)</span></span></td></tr>
-<tr class=b>
+<table class='inner sep' cellspacing=1>
+<tr class=h><th>Value</th><th>ReleaseMode2</th><th>Value</th><th>ReleaseMode2</th></tr>
+<tr><td class=r>0</td><td>= Normal</td>
+<td class='r b'>15</td><td class=b>= Continuous - High Resolution Sweep Panorama</td>
+</tr><tr><td class=r>1</td><td>= Continuous</td>
+<td class='r b'>16</td><td class=b>= Continuous - 3D Image</td>
+</tr><tr><td class=r>2</td><td>= Continuous - Exposure Bracketing</td>
+<td class='r b'>17</td><td class=b>= Continuous - Burst 2</td>
+</tr><tr><td class=r>3</td><td>= Continuous - White Balance Bracketing</td>
+<td class='r b'>19</td><td class=b>= Continuous - Speed/Advance Priority</td>
+</tr><tr><td class=r>5</td><td>= Continuous - Burst</td>
+<td class='r b'>20</td><td class=b>= Continuous - Multi Frame NR</td>
+</tr><tr><td class=r>6</td><td>= Single Frame - Capture During Movie</td>
+<td class='r b'>23</td><td class=b>= Single-frame - Exposure Bracketing</td>
+</tr><tr><td class=r>7</td><td>= Continuous - Sweep Panorama</td>
+<td class='r b'>26</td><td class=b>= Continuous Low</td>
+</tr><tr><td class=r>8</td><td>= Continuous - Anti-Motion Blur, Hand-held Twilight</td>
+<td class='r b'>27</td><td class=b>= Continuous - High Sensitivity</td>
+</tr><tr><td class=r>9</td><td>= Continuous - HDR</td>
+<td class='r b'>28</td><td class=b>= Smile Shutter</td>
+</tr><tr><td class=r>10</td><td>= Continuous - Background defocus</td>
+<td class='r b'>29</td><td class=b>= Continuous - Tele-zoom Advance Priority</td>
+</tr><tr><td class=r>13</td><td>= Continuous - 3D Sweep Panorama</td>
+<td class='r b'>146</td><td class=b>= Single Frame - Movie Capture</td>
+</tr></table></td></tr></table></blockquote>
+
+<h2><a name='PictureEffect2'>Sony PictureEffect2 Values</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class='inner sep' cellspacing=1>
+<tr class=h><th>Value</th><th>PictureEffect2</th><th>Value</th><th>PictureEffect2</th><th>Value</th><th>PictureEffect2</th></tr>
+<tr><td class=r>0</td><td>= Off</td>
+<td class='r b'>5</td><td class=b>= Soft High Key</td>
+<td class=r>10</td><td>= Rich-tone Monochrome</td>
+</tr><tr><td class=r>1</td><td>= Toy Camera</td>
+<td class='r b'>6</td><td class=b>= Partial Color</td>
+<td class=r>11</td><td>= Miniature</td>
+</tr><tr><td class=r>2</td><td>= Pop Color</td>
+<td class='r b'>7</td><td class=b>= High Contrast Monochrome</td>
+<td class=r>12</td><td>= Water Color</td>
+</tr><tr><td class=r>3</td><td>= Posterization</td>
+<td class='r b'>8</td><td class=b>= Soft Focus</td>
+<td class=r>13</td><td>= Illustration</td>
+</tr><tr><td class=r>4</td><td>= Retro Photo</td>
+<td class='r b'>9</td><td class=b>= HDR Painting</td>
+<td class=r>&nbsp;</td><td>&nbsp;</td>
+</tr></table></td></tr></table></blockquote>
+
+<h2><a name='ExposureProgram3'>Sony ExposureProgram3 Values</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class='inner sep' cellspacing=1>
+<tr class=h><th>Value</th><th>ExposureProgram3</th><th>Value</th><th>ExposureProgram3</th><th>Value</th><th>ExposureProgram3</th></tr>
+<tr><td class=r>0</td><td>= Program AE</td>
+<td class='r b'>11</td><td class=b>= Twilight Portrait</td>
+<td class=r>27</td><td>= Gourmet</td>
+</tr><tr><td class=r>1</td><td>= Aperture-priority AE</td>
+<td class='r b'>12</td><td class=b>= Sunset</td>
+<td class=r>28</td><td>= Pet</td>
+</tr><tr><td class=r>2</td><td>= Shutter speed priority AE</td>
+<td class='r b'>14</td><td class=b>= Action (High speed)</td>
+<td class=r>29</td><td>= Macro</td>
+</tr><tr><td class=r>3</td><td>= Manual</td>
+<td class='r b'>16</td><td class=b>= Sports</td>
+<td class=r>30</td><td>= Backlight Correction HDR</td>
+</tr><tr><td class=r>4</td><td>= Auto</td>
+<td class='r b'>17</td><td class=b>= Handheld Night Shot</td>
+<td class=r>33</td><td>= Sweep Panorama</td>
+</tr><tr><td class=r>5</td><td>= iAuto</td>
+<td class='r b'>18</td><td class=b>= Anti Motion Blur</td>
+<td class=r>36</td><td>= Background Defocus</td>
+</tr><tr><td class=r>6</td><td>= Superior Auto</td>
+<td class='r b'>19</td><td class=b>= High Sensitivity</td>
+<td class=r>37</td><td>= Soft Skin</td>
+</tr><tr><td class=r>7</td><td>= iAuto+</td>
+<td class='r b'>21</td><td class=b>= Beach</td>
+<td class=r>42</td><td>= 3D Image</td>
+</tr><tr><td class=r>8</td><td>= Portrait</td>
+<td class='r b'>22</td><td class=b>= Snow</td>
+<td class=r>43</td><td>= Cont. Priority AE</td>
+</tr><tr><td class=r>9</td><td>= Landscape</td>
+<td class='r b'>23</td><td class=b>= Fireworks</td>
+<td class=r>&nbsp;</td><td>&nbsp;</td>
+</tr><tr><td class=r>10</td><td>= Twilight</td>
+<td class='r b'>26</td><td class=b>= Underwater</td>
+<td class=r>&nbsp;</td><td>&nbsp;</td>
+</tr></table></td></tr></table></blockquote>
+
+<h2><a name='Tag2010b'>Sony Tag2010b Tags</a></h2>
+<p>Valid for SLT-A65/A77, NEX-7/VG20E.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td title='0x0000 = 0'>0x0000</td>
+<td>SequenceImageNumber</td>
+<td class=c>int32u</td>
+<td><span class=s><span class=n>(number of images captured in burst sequence)</span></span></td></tr>
+<tr class=b>
+<td title='0x0004 = 4'>0x0004</td>
+<td>SequenceFileNumber</td>
+<td class=c>int32u</td>
+<td><span class=s><span class=n>(file number in burst sequence)</span></span></td></tr>
+<tr>
+<td title='0x0008 = 8'>0x0008</td>
+<td>ReleaseMode2</td>
+<td class=c>int32u</td>
+<td>--&gt; <a href='Sony.html#ReleaseMode2'>Sony ReleaseMode2 Values</a></td></tr>
+<tr class=b>
+<td title='0x01b6 = 438'>0x01b6</td>
+<td>SonyDateTime</td>
+<td class=c>undef[7]</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x1128 = 4392'>0x1128</td>
+<td>ReleaseMode3</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Normal
+  <br>1 = Continuous
+  <br>2 = Continuous - Bracketing
+  <br>5 = Continuous - Speed/Advance Priority</span></td></tr>
+<tr class=b>
+<td title='0x112c = 4396'>0x112c</td>
+<td>ReleaseMode2</td>
+<td class=c>int8u</td>
+<td>--&gt; <a href='Sony.html#ReleaseMode2'>Sony ReleaseMode2 Values</a></td></tr>
+<tr>
+<td title='0x113e = 4414'>0x113e</td>
+<td>StopsAboveBaseISO</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x1140 = 4416'>0x1140</td>
+<td>BrightnessValue</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x1144 = 4420'>0x1144</td>
+<td>DynamicRangeOptimizer</td>
+<td class=c>int8u</td>
+<td><table class=cols><tr>
+  <td>0 = Off
+  <br>1 = Auto
+  <br>3 = Lv1
+  <br>4 = Lv2</td><td>&nbsp;&nbsp;</td>
+  <td>5 = Lv3
+  <br>6 = Lv4
+  <br>7 = Lv5
+  <br>8 = n/a</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr class=b>
+<td title='0x1148 = 4424'>0x1148</td>
+<td>HDRSetting</td>
+<td class=c>int8u</td>
+<td><table class=cols><tr>
+  <td>0 = Off
+  <br>1 = HDR Auto
+  <br>7 = HDR 3 EV</td><td>&nbsp;&nbsp;</td>
+  <td>9 = HDR 4 EV
+  <br>11 = HDR 5 EV
+  <br>13 = HDR 6 EV</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr>
+<td title='0x114c = 4428'>0x114c</td>
+<td>ExposureCompensation</td>
+<td class=c>int16s</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x1167 = 4455'>0x1167</td>
+<td>PictureEffect2</td>
+<td class=c>int8u</td>
+<td>--&gt; <a href='Sony.html#PictureEffect2'>Sony PictureEffect2 Values</a></td></tr>
+<tr>
+<td title='0x1174 = 4468'>0x1174</td>
+<td>Quality2</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = JPEG
+  <br>1 = RAW
+  <br>2 = RAW + JPEG</span></td></tr>
+<tr class=b>
+<td title='0x1178 = 4472'>0x1178</td>
+<td>MeteringMode</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Multi-segment
+  <br>2 = Center-weighted average
+  <br>3 = Spot</span></td></tr>
+<tr>
+<td title='0x1179 = 4473'>0x1179</td>
+<td>ExposureProgram</td>
+<td class=c>int8u</td>
+<td>--&gt; <a href='Sony.html#ExposureProgram3'>Sony ExposureProgram3 Values</a></td></tr>
+<tr class=b>
+<td title='0x1180 = 4480'>0x1180</td>
+<td>WB_RGBLevels</td>
+<td class=c>int16u[3]</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='Tag2010c'>Sony Tag2010c Tags</a></h2>
+<p>Valid for SLT-A37/A57 and NEX-F3.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td title='0x0000 = 0'>0x0000</td>
+<td>SequenceImageNumber</td>
+<td class=c>int32u</td>
+<td><span class=s><span class=n>(number of images captured in burst sequence)</span></span></td></tr>
+<tr class=b>
+<td title='0x0004 = 4'>0x0004</td>
+<td>SequenceFileNumber</td>
+<td class=c>int32u</td>
+<td><span class=s><span class=n>(file number in burst sequence)</span></span></td></tr>
+<tr>
+<td title='0x0008 = 8'>0x0008</td>
+<td>ReleaseMode2</td>
+<td class=c>int32u</td>
+<td>--&gt; <a href='Sony.html#ReleaseMode2'>Sony ReleaseMode2 Values</a></td></tr>
+<tr class=b>
+<td title='0x0200 = 512'>0x0200</td>
+<td>DigitalZoomRatio</td>
+<td class=c>int8u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x0210 = 528'>0x0210</td>
+<td>SonyDateTime</td>
+<td class=c>undef[7]</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x1104 = 4356'>0x1104</td>
+<td>ReleaseMode3</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Normal
+  <br>1 = Continuous
+  <br>2 = Continuous - Bracketing
+  <br>5 = Continuous - Speed/Advance Priority</span></td></tr>
+<tr>
+<td title='0x1108 = 4360'>0x1108</td>
+<td>ReleaseMode2</td>
+<td class=c>int8u</td>
+<td>--&gt; <a href='Sony.html#ReleaseMode2'>Sony ReleaseMode2 Values</a></td></tr>
+<tr class=b>
+<td title='0x111a = 4378'>0x111a</td>
+<td>StopsAboveBaseISO</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x111c = 4380'>0x111c</td>
+<td>BrightnessValue</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x1120 = 4384'>0x1120</td>
+<td>DynamicRangeOptimizer</td>
+<td class=c>int8u</td>
+<td><table class=cols><tr>
+  <td>0 = Off
+  <br>1 = Auto
+  <br>3 = Lv1
+  <br>4 = Lv2</td><td>&nbsp;&nbsp;</td>
+  <td>5 = Lv3
+  <br>6 = Lv4
+  <br>7 = Lv5
+  <br>8 = n/a</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr>
+<td title='0x1124 = 4388'>0x1124</td>
+<td>HDRSetting</td>
+<td class=c>int8u</td>
+<td><table class=cols><tr>
+  <td>0 = Off
+  <br>1 = HDR Auto
+  <br>7 = HDR 3 EV</td><td>&nbsp;&nbsp;</td>
+  <td>9 = HDR 4 EV
+  <br>11 = HDR 5 EV
+  <br>13 = HDR 6 EV</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr class=b>
+<td title='0x1128 = 4392'>0x1128</td>
+<td>ExposureCompensation</td>
+<td class=c>int16s</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x1143 = 4419'>0x1143</td>
+<td>PictureEffect2</td>
+<td class=c>int8u</td>
+<td>--&gt; <a href='Sony.html#PictureEffect2'>Sony PictureEffect2 Values</a></td></tr>
+<tr class=b>
+<td title='0x1150 = 4432'>0x1150</td>
+<td>Quality2</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = JPEG
+  <br>1 = RAW
+  <br>2 = RAW + JPEG</span></td></tr>
+<tr>
+<td title='0x1154 = 4436'>0x1154</td>
+<td>MeteringMode</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Multi-segment
+  <br>2 = Center-weighted average
+  <br>3 = Spot</span></td></tr>
+<tr class=b>
+<td title='0x1155 = 4437'>0x1155</td>
+<td>ExposureProgram</td>
+<td class=c>int8u</td>
+<td>--&gt; <a href='Sony.html#ExposureProgram3'>Sony ExposureProgram3 Values</a></td></tr>
+<tr>
+<td title='0x115c = 4444'>0x115c</td>
+<td>WB_RGBLevels</td>
+<td class=c>int16u[3]</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='Tag2010d'>Sony Tag2010d Tags</a></h2>
+<p>Valid for DSC-HX10V/HX20V/HX200V/TX66/TX200V/TX300V/WX50/WX100/WX150, but
+not valid for panorama images.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td title='0x0000 = 0'>0x0000</td>
+<td>SequenceImageNumber</td>
+<td class=c>int32u</td>
+<td><span class=s><span class=n>(number of images captured in burst sequence)</span></span></td></tr>
+<tr class=b>
+<td title='0x0004 = 4'>0x0004</td>
+<td>SequenceFileNumber</td>
+<td class=c>int32u</td>
+<td><span class=s><span class=n>(file number in burst sequence)</span></span></td></tr>
+<tr>
+<td title='0x0008 = 8'>0x0008</td>
+<td>ReleaseMode2</td>
+<td class=c>int32u</td>
+<td>--&gt; <a href='Sony.html#ReleaseMode2'>Sony ReleaseMode2 Values</a></td></tr>
+<tr class=b>
+<td title='0x01fe = 510'>0x01fe</td>
+<td>SonyDateTime</td>
+<td class=c>undef[7]</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x1180 = 4480'>0x1180</td>
+<td>ReleaseMode3</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Normal
+  <br>1 = Continuous
+  <br>2 = Continuous - Bracketing
+  <br>5 = Continuous - Speed/Advance Priority</span></td></tr>
+<tr class=b>
+<td title='0x1184 = 4484'>0x1184</td>
+<td>ReleaseMode2</td>
+<td class=c>int8u</td>
+<td>--&gt; <a href='Sony.html#ReleaseMode2'>Sony ReleaseMode2 Values</a></td></tr>
+<tr>
+<td title='0x1196 = 4502'>0x1196</td>
+<td>StopsAboveBaseISO</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x1198 = 4504'>0x1198</td>
+<td>BrightnessValue</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x119c = 4508'>0x119c</td>
+<td>DynamicRangeOptimizer</td>
+<td class=c>int8u</td>
+<td><table class=cols><tr>
+  <td>0 = Off
+  <br>1 = Auto
+  <br>3 = Lv1
+  <br>4 = Lv2</td><td>&nbsp;&nbsp;</td>
+  <td>5 = Lv3
+  <br>6 = Lv4
+  <br>7 = Lv5
+  <br>8 = n/a</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr class=b>
+<td title='0x11a0 = 4512'>0x11a0</td>
+<td>HDRSetting</td>
+<td class=c>int8u</td>
+<td><table class=cols><tr>
+  <td>0 = Off
+  <br>1 = HDR Auto
+  <br>7 = HDR 3 EV</td><td>&nbsp;&nbsp;</td>
+  <td>9 = HDR 4 EV
+  <br>11 = HDR 5 EV
+  <br>13 = HDR 6 EV</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr>
+<td title='0x11bf = 4543'>0x11bf</td>
+<td>PictureEffect2</td>
+<td class=c>int8u</td>
+<td>--&gt; <a href='Sony.html#PictureEffect2'>Sony PictureEffect2 Values</a></td></tr>
+<tr class=b>
+<td title='0x11d0 = 4560'>0x11d0</td>
+<td>MeteringMode</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Multi-segment
+  <br>2 = Center-weighted average
+  <br>3 = Spot</span></td></tr>
+<tr>
+<td title='0x11d1 = 4561'>0x11d1</td>
+<td>ExposureProgram</td>
+<td class=c>int8u</td>
+<td>--&gt; <a href='Sony.html#ExposureProgram3'>Sony ExposureProgram3 Values</a></td></tr>
+<tr class=b>
+<td title='0x11d8 = 4568'>0x11d8</td>
+<td>WB_RGBLevels</td>
+<td class=c>int16u[3]</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='Tag2010e'>Sony Tag2010e Tags</a></h2>
+<p>Valid for SLT-A58/A99, ILCE-3000, NEX-3N/5R/5T/6/VG30E/VG900, DSC-RX100,
+DSC-RX1/RX1R. Also valid for DSC-HX300/HX50V/TX30/WX60/WX200/WX300, but not
+for panorama images.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td title='0x0000 = 0'>0x0000</td>
+<td>SequenceImageNumber</td>
+<td class=c>int32u</td>
+<td><span class=s><span class=n>(number of images captured in burst sequence)</span></span></td></tr>
+<tr class=b>
+<td title='0x0004 = 4'>0x0004</td>
+<td>SequenceFileNumber</td>
+<td class=c>int32u</td>
+<td><span class=s><span class=n>(file number in burst sequence)</span></span></td></tr>
+<tr>
+<td title='0x0008 = 8'>0x0008</td>
+<td>ReleaseMode2</td>
+<td class=c>int32u</td>
+<td>--&gt; <a href='Sony.html#ReleaseMode2'>Sony ReleaseMode2 Values</a></td></tr>
+<tr class=b>
+<td title='0x021c = 540'>0x021c</td>
+<td>DigitalZoomRatio</td>
+<td class=c>int8u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x022c = 556'>0x022c</td>
+<td>SonyDateTime</td>
+<td class=c>undef[7]</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x115c = 4444'>0x115c</td>
+<td>ReleaseMode3</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Normal
+  <br>1 = Continuous
+  <br>2 = Continuous - Bracketing
+  <br>5 = Continuous - Speed/Advance Priority</span></td></tr>
+<tr>
+<td title='0x1160 = 4448'>0x1160</td>
+<td>ReleaseMode2</td>
+<td class=c>int8u</td>
+<td>--&gt; <a href='Sony.html#ReleaseMode2'>Sony ReleaseMode2 Values</a></td></tr>
+<tr class=b>
+<td title='0x1172 = 4466'>0x1172</td>
+<td>StopsAboveBaseISO</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x1174 = 4468'>0x1174</td>
+<td>BrightnessValue</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x1178 = 4472'>0x1178</td>
+<td>DynamicRangeOptimizer</td>
+<td class=c>int8u</td>
+<td><table class=cols><tr>
+  <td>0 = Off
+  <br>1 = Auto
+  <br>3 = Lv1
+  <br>4 = Lv2</td><td>&nbsp;&nbsp;</td>
+  <td>5 = Lv3
+  <br>6 = Lv4
+  <br>7 = Lv5
+  <br>8 = n/a</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr>
+<td title='0x117c = 4476'>0x117c</td>
+<td>HDRSetting</td>
+<td class=c>int8u</td>
+<td><table class=cols><tr>
+  <td>0 = Off
+  <br>1 = HDR Auto
+  <br>7 = HDR 3 EV</td><td>&nbsp;&nbsp;</td>
+  <td>9 = HDR 4 EV
+  <br>11 = HDR 5 EV
+  <br>13 = HDR 6 EV</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr class=b>
+<td title='0x1180 = 4480'>0x1180</td>
+<td>ExposureCompensation</td>
+<td class=c>int16s</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x119b = 4507'>0x119b</td>
+<td>PictureEffect2</td>
+<td class=c>int8u</td>
+<td>--&gt; <a href='Sony.html#PictureEffect2'>Sony PictureEffect2 Values</a></td></tr>
+<tr class=b>
+<td title='0x11a8 = 4520'>0x11a8</td>
+<td>Quality2</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = JPEG
+  <br>1 = RAW
+  <br>2 = RAW + JPEG</span></td></tr>
+<tr>
+<td title='0x11ac = 4524'>0x11ac</td>
+<td>MeteringMode</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Multi-segment
+  <br>2 = Center-weighted average
+  <br>3 = Spot</span></td></tr>
+<tr class=b>
+<td title='0x11ad = 4525'>0x11ad</td>
+<td>ExposureProgram</td>
+<td class=c>int8u</td>
+<td>--&gt; <a href='Sony.html#ExposureProgram3'>Sony ExposureProgram3 Values</a></td></tr>
+<tr>
+<td title='0x11b4 = 4532'>0x11b4</td>
+<td>WB_RGBLevels</td>
+<td class=c>int16u[3]</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x1278 = 4728'>0x1278</td>
+<td>FocalLength</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x127a = 4730'>0x127a</td>
+<td>MinFocalLength</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x127c = 4732'>0x127c</td>
+<td>MaxFocalLength</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='Tag2010f'>Sony Tag2010f Tags</a></h2>
+<p>Valid for DSC-RX100M2, DSC-QX10/QX100.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td title='0x0004 = 4'>0x0004</td>
+<td>ReleaseMode2</td>
+<td class=c>int32u</td>
+<td>--&gt; <a href='Sony.html#ReleaseMode2'>Sony ReleaseMode2 Values</a></td></tr>
+<tr class=b>
+<td title='0x1014 = 4116'>0x1014</td>
+<td>ReleaseMode3</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Normal
+  <br>1 = Continuous
+  <br>2 = Continuous - Bracketing
+  <br>5 = Continuous - Speed/Advance Priority</span></td></tr>
+<tr>
+<td title='0x1018 = 4120'>0x1018</td>
+<td>ReleaseMode2</td>
+<td class=c>int8u</td>
+<td>--&gt; <a href='Sony.html#ReleaseMode2'>Sony ReleaseMode2 Values</a></td></tr>
+<tr class=b>
+<td title='0x102a = 4138'>0x102a</td>
+<td>StopsAboveBaseISO</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x102c = 4140'>0x102c</td>
+<td>BrightnessValue</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x1030 = 4144'>0x1030</td>
+<td>DynamicRangeOptimizer</td>
+<td class=c>int8u</td>
+<td><table class=cols><tr>
+  <td>0 = Off
+  <br>1 = Auto
+  <br>3 = Lv1
+  <br>4 = Lv2</td><td>&nbsp;&nbsp;</td>
+  <td>5 = Lv3
+  <br>6 = Lv4
+  <br>7 = Lv5
+  <br>8 = n/a</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr>
+<td title='0x1034 = 4148'>0x1034</td>
+<td>HDRSetting</td>
+<td class=c>int8u</td>
+<td><table class=cols><tr>
+  <td>0 = Off
+  <br>1 = HDR Auto
+  <br>7 = HDR 3 EV</td><td>&nbsp;&nbsp;</td>
+  <td>9 = HDR 4 EV
+  <br>11 = HDR 5 EV
+  <br>13 = HDR 6 EV</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr class=b>
+<td title='0x1038 = 4152'>0x1038</td>
+<td>ExposureCompensation</td>
+<td class=c>int16s</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x1053 = 4179'>0x1053</td>
+<td>PictureEffect2</td>
+<td class=c>int8u</td>
+<td>--&gt; <a href='Sony.html#PictureEffect2'>Sony PictureEffect2 Values</a></td></tr>
+<tr class=b>
+<td title='0x1060 = 4192'>0x1060</td>
+<td>Quality2</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = JPEG
+  <br>1 = RAW
+  <br>2 = RAW + JPEG</span></td></tr>
+<tr>
+<td title='0x1064 = 4196'>0x1064</td>
+<td>MeteringMode</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Multi-segment
+  <br>2 = Center-weighted average
+  <br>3 = Spot</span></td></tr>
+<tr class=b>
+<td title='0x1065 = 4197'>0x1065</td>
+<td>ExposureProgram</td>
+<td class=c>int8u</td>
+<td>--&gt; <a href='Sony.html#ExposureProgram3'>Sony ExposureProgram3 Values</a></td></tr>
+<tr>
+<td title='0x106c = 4204'>0x106c</td>
+<td>WB_RGBLevels</td>
+<td class=c>int16u[3]</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x1134 = 4404'>0x1134</td>
+<td>FocalLength</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x1136 = 4406'>0x1136</td>
+<td>MinFocalLength</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x1138 = 4408'>0x1138</td>
+<td>MaxFocalLength</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='Tag2010g'>Sony Tag2010g Tags</a></h2>
+<p>Valid for DSC-RX10/HX60V/HX400V, ILCE-7/7R/5000/6000.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td title='0x0004 = 4'>0x0004</td>
+<td>ReleaseMode2</td>
+<td class=c>int32u</td>
+<td>--&gt; <a href='Sony.html#ReleaseMode2'>Sony ReleaseMode2 Values</a></td></tr>
+<tr class=b>
+<td title='0x020c = 524'>0x020c</td>
+<td>ReleaseMode3</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Normal
+  <br>1 = Continuous
+  <br>2 = Continuous - Bracketing
+  <br>5 = Continuous - Speed/Advance Priority</span></td></tr>
+<tr>
+<td title='0x0210 = 528'>0x0210</td>
+<td>ReleaseMode2</td>
+<td class=c>int8u</td>
+<td>--&gt; <a href='Sony.html#ReleaseMode2'>Sony ReleaseMode2 Values</a></td></tr>
+<tr class=b>
+<td title='0x0222 = 546'>0x0222</td>
+<td>StopsAboveBaseISO</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x0224 = 548'>0x0224</td>
+<td>BrightnessValue</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x0228 = 552'>0x0228</td>
+<td>DynamicRangeOptimizer</td>
+<td class=c>int8u</td>
+<td><table class=cols><tr>
+  <td>0 = Off
+  <br>1 = Auto
+  <br>3 = Lv1
+  <br>4 = Lv2</td><td>&nbsp;&nbsp;</td>
+  <td>5 = Lv3
+  <br>6 = Lv4
+  <br>7 = Lv5
+  <br>8 = n/a</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr>
+<td title='0x022c = 556'>0x022c</td>
+<td>HDRSetting</td>
+<td class=c>int8u</td>
+<td><table class=cols><tr>
+  <td>0 = Off
+  <br>1 = HDR Auto
+  <br>7 = HDR 3 EV</td><td>&nbsp;&nbsp;</td>
+  <td>9 = HDR 4 EV
+  <br>11 = HDR 5 EV
+  <br>13 = HDR 6 EV</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr class=b>
+<td title='0x0230 = 560'>0x0230</td>
+<td>ExposureCompensation</td>
+<td class=c>int16s</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x024b = 587'>0x024b</td>
+<td>PictureEffect2</td>
+<td class=c>int8u</td>
+<td>--&gt; <a href='Sony.html#PictureEffect2'>Sony PictureEffect2 Values</a></td></tr>
+<tr class=b>
+<td title='0x0258 = 600'>0x0258</td>
+<td>Quality2</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = JPEG
+  <br>1 = RAW
+  <br>2 = RAW + JPEG</span></td></tr>
+<tr>
+<td title='0x025c = 604'>0x025c</td>
+<td>MeteringMode</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Multi-segment
+  <br>2 = Center-weighted average
+  <br>3 = Spot</span></td></tr>
+<tr class=b>
+<td title='0x025d = 605'>0x025d</td>
+<td>ExposureProgram</td>
+<td class=c>int8u</td>
+<td>--&gt; <a href='Sony.html#ExposureProgram3'>Sony ExposureProgram3 Values</a></td></tr>
+<tr>
+<td title='0x0264 = 612'>0x0264</td>
+<td>WB_RGBLevels</td>
+<td class=c>int16u[3]</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x032c = 812'>0x032c</td>
+<td>FocalLength</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x032e = 814'>0x032e</td>
+<td>MinFocalLength</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x0330 = 816'>0x0330</td>
+<td>MaxFocalLength</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='AFInfo2'>Sony AFInfo2 Tags</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index1</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='0 = 0x0'>0</td>
+<td>AFPointsUsed</td>
+<td class=c>int32u</td>
+<td><span class=s><span class=n>(SLT models only)</span></span><table class=cols><tr>
+  <td>0x0 = (none)
+  <br>Bit 0 = Center
+  <br>Bit 1 = Top
+  <br>Bit 2 = Upper-right
+  <br>Bit 3 = Right
+  <br>Bit 4 = Lower-right
+  <br>Bit 5 = Bottom
+  <br>Bit 6 = Lower-left
+  <br>Bit 7 = Left
+  <br>Bit 8 = Upper-left</td><td>&nbsp;&nbsp;</td>
+  <td>Bit 9 = Far Right
+  <br>Bit 10 = Far Left
+  <br>Bit 11 = Upper-middle
+  <br>Bit 12 = Near Right
+  <br>Bit 13 = Lower-middle
+  <br>Bit 14 = Near Left
+  <br>Bit 15 = Upper Far Right
+  <br>Bit 16 = Lower Far Right
+  <br>Bit 17 = Lower Far Left
+  <br>Bit 18 = Upper Far Left</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='ShotInfo'>Sony ShotInfo Tags</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index1</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='2 = 0x2'>2</td>
+<td>FaceInfoOffset</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='6 = 0x6'>6</td>
+<td>SonyDateTime</td>
+<td class=c>string[20]</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='26 = 0x1a'>26</td>
+<td>SonyImageHeight</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='28 = 0x1c'>28</td>
+<td>SonyImageWidth</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='48 = 0x30'>48</td>
+<td>FacesDetected</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='50 = 0x32'>50</td>
+<td>FaceInfoLength</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td class=r title='52 = 0x34'>52</td>
+<td>MetaVersion</td>
+<td class=c>string[16]</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td class=r title='72 = 0x48'>72</td>
+<td>FaceInfo1</td>
+<td class=c>-</td>
+<td>--&gt; <a href='Sony.html#FaceInfo1'>Sony FaceInfo1 Tags</a></td></tr>
+<tr>
+<td class=r title='94 = 0x5e'>94</td>
+<td>FaceInfo2</td>
+<td class=c>-</td>
+<td>--&gt; <a href='Sony.html#FaceInfo2'>Sony FaceInfo2 Tags</a></td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='FaceInfo1'>Sony FaceInfo1 Tags</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Index1</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td class=r title='0 = 0x0'>0</td>
+<td>Face1Position</td>
+<td class=c>int16u[4]</td>
+<td><span class=s><span class=n>(top, left, height and width of detected face.  Coordinates are relative to
+the full-sized unrotated image, with increasing Y downwards)</span></span></td></tr>
+<tr class=b>
 <td class=r title='32 = 0x20'>32</td>
 <td>Face2Position</td>
 <td class=c>int16u[4]</td>
@@ -3258,6 +4542,35 @@ the full-sized unrotated image, with increasing Y downwards)</span></span></td><
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
+<h2><a name='Tag900b'>Sony Tag900b Tags</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td title='0x0002 = 2'>0x0002</td>
+<td>FacesDetected</td>
+<td class=c>N</td>
+<td><table class=cols><tr>
+  <td>0 = 0
+  <br>33 = 5
+  <br>57 = 2</td><td>&nbsp;&nbsp;</td>
+  <td>77 = 4
+  <br>93 = 3
+  <br>98 = 1</td><td>&nbsp;&nbsp;</td>
+  <td>115 = 8
+  <br>168 = 6
+  <br>241 = 7</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr class=b>
+<td title='0x00bd = 189'>0x00bd</td>
+<td>FaceDetection</td>
+<td class=c>N</td>
+<td><span class=s>0 = Off
+  <br>98 = On</span></td></tr>
+</table></td></tr></table></blockquote>
+
 <h2><a name='Tag9050'>Sony Tag9050 Tags</a></h2>
 <p>Data for tags 0x9050, 0x94xx and 0x2010 is encrypted by a simple
 substitution cipher, but the deciphered values are listed below.</p>
@@ -3285,9 +4598,138 @@ substitution cipher, but the deciphered values are listed below.</p>
   <br>65 = Built-in Flash present and fired
   <br>128 = External Flash present
   <br>129 = External Flash present and fired</span></td></tr>
+<tr class=b>
+<td title='0x0032 = 50'>0x0032</td>
+<td>ImageCount</td>
+<td class=c>int32u</td>
+<td><span class=s><span class=n>(total number of image exposures made by the camera)</span></span></td></tr>
+<tr>
+<td title='0x003a = 58'>0x003a</td>
+<td>SonyExposureTime</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x003c = 60'>0x003c</td>
+<td>SonyFNumber</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x004c = 76'>0x004c</td>
+<td>ImageCount2</td>
+<td class=c>int32u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x0051 = 81'>0x0051</td>
+<td>SonyDateTime2</td>
+<td class=c>undef[6]</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x0105 = 261'>0x0105</td>
+<td>LensMount</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Unknown
+  <br>1 = A-Mount
+  <br>2 = E-mount</span></td></tr>
+<tr class=b>
+<td title='0x0106 = 262'>0x0106</td>
+<td>LensFormat</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Unknown
+  <br>1 = APS-C
+  <br>2 = Full-frame</span></td></tr>
+<tr>
+<td title='0x0107 = 263'>0x0107</td>
+<td>LensType2</td>
+<td class=c>int16u</td>
+<td>--&gt; <a href='Sony.html#LensType2'>Sony LensType2 Values</a></td></tr>
+<tr class=b>
+<td title='0x0109 = 265'>0x0109</td>
+<td>LensType</td>
+<td class=c>int16u</td>
+<td>--&gt; <a href='Sony.html#LensType'>Sony LensType Values</a>
+  <br><span class='n s'>(SLT models, and NEX with A-Mount lenses)</span></td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='Tag9400a'>Sony Tag9400a Tags</a></h2>
+<p>Valid for many DSC, NEX and SLT models</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td title='0x0008 = 8'>0x0008</td>
+<td>SequenceImageNumber</td>
+<td class=c>int32u</td>
+<td><span class=s><span class=n>(number of images captured in burst sequence)</span></span></td></tr>
+<tr class=b>
+<td title='0x000c = 12'>0x000c</td>
+<td>SequenceFileNumber</td>
+<td class=c>int32u</td>
+<td><span class=s><span class=n>(file number in burst sequence)</span></span></td></tr>
+<tr>
+<td title='0x0010 = 16'>0x0010</td>
+<td>ReleaseMode2</td>
+<td class=c>int8u</td>
+<td>--&gt; <a href='Sony.html#ReleaseMode2'>Sony ReleaseMode2 Values</a></td></tr>
+<tr class=b>
+<td title='0x0012 = 18'>0x0012</td>
+<td>DigitalZoom</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = No
+  <br>1 = Yes</span></td></tr>
+<tr>
+<td title='0x001a = 26'>0x001a</td>
+<td>ShotNumberSincePowerUp</td>
+<td class=c>int32u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x0022 = 34'>0x0022</td>
+<td>SequenceLength</td>
+<td class=c>int8u</td>
+<td><table class=cols><tr>
+  <td>0 = Continuous
+  <br>1 = 1 shot
+  <br>2 = 2 shots
+  <br>3 = 3 shots
+  <br>4 = 4 shots
+  <br>5 = 5 shots
+  <br>6 = 6 shots
+  <br>10 = 10 shots
+  <br>100 = Continuous - iSweep Panorama
+  <br>200 = Continuous - Sweep Panorama</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr>
+<td title='0x0028 = 40'>0x0028</td>
+<td>CameraOrientation</td>
+<td class=c>int8u</td>
+<td><span class=s>1 = Horizontal (normal)
+  <br>3 = Rotate 180
+  <br>6 = Rotate 90 CW
+  <br>8 = Rotate 270 CW</span></td></tr>
+<tr class=b>
+<td title='0x0029 = 41'>0x0029</td>
+<td>Quality2</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = JPEG
+  <br>1 = RAW
+  <br>2 = RAW + JPEG
+  <br>3 = JPEG + MPO</span></td></tr>
+<tr>
+<td title='0x0044 = 68'>0x0044</td>
+<td>SonyImageHeight</td>
+<td class=c title=' ~ = Writable only with -n'>int16u~</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x0052 = 82'>0x0052</td>
+<td>ModelReleaseYear</td>
+<td class=c title=' ~ = Writable only with -n'>int8u~</td>
+<td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
-<h2><a name='Tag9400a'>Sony Tag9400a Tags</a></h2>
+<h2><a name='Tag9400b'>Sony Tag9400b Tags</a></h2>
+<p>Valid for NEX-3N, ILCE-3000, SLT-A58, DSC-WX60, DSC-WX300, DSC-RX100M2,
+DSC-HX50V, DSC-QX10/QX100.</p>
 <blockquote>
 <table class=frame><tr><td>
 <table class=inner cellspacing=1>
@@ -3307,31 +4749,20 @@ substitution cipher, but the deciphered values are listed below.</p>
 <td title='0x0010 = 16'>0x0010</td>
 <td>ReleaseMode2</td>
 <td class=c>int8u</td>
-<td><span class=s>0 = Normal
-  <br>1 = Continuous
-  <br>2 = Continuous - Exposure Bracketing
-  <br>3 = Continuous - White Balance Bracketing
-  <br>5 = Continuous - Burst
-  <br>6 = Single Frame - Capture During Movie
-  <br>7 = Continuous - Sweep Panorama
-  <br>8 = Continuous - Anti-Motion Blur, Hand-held Twilight
-  <br>9 = Continuous - HDR
-  <br>10 = Continuous - Background defocus
-  <br>13 = Continuous - 3D Sweep Panorama
-  <br>16 = Continuous - 3D Image
-  <br>19 = Continuous - Speed/Advance Priority
-  <br>20 = Continuous - Multi Frame NR
-  <br>26 = Continuous Low
-  <br>27 = Continuous - High Sensitivity
-  <br>28 = Smile Shutter
-  <br>29 = Continuous - Tele-zoom Advance Priority</span></td></tr>
+<td>--&gt; <a href='Sony.html#ReleaseMode2'>Sony ReleaseMode2 Values</a></td></tr>
 <tr class=b>
-<td title='0x001a = 26'>0x001a</td>
+<td title='0x0012 = 18'>0x0012</td>
+<td>DigitalZoom</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = No
+  <br>1 = Yes</span></td></tr>
+<tr>
+<td title='0x0016 = 22'>0x0016</td>
 <td>ShotNumberSincePowerUp</td>
 <td class=c>int32u</td>
 <td>&nbsp;</td></tr>
-<tr>
-<td title='0x0022 = 34'>0x0022</td>
+<tr class=b>
+<td title='0x001e = 30'>0x001e</td>
 <td>SequenceLength</td>
 <td class=c>int8u</td>
 <td><table class=cols><tr>
@@ -3346,69 +4777,58 @@ substitution cipher, but the deciphered values are listed below.</p>
   <br>100 = Continuous - iSweep Panorama
   <br>200 = Continuous - Sweep Panorama</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr class=b>
-<td title='0x0028 = 40'>0x0028</td>
+<tr>
+<td title='0x0024 = 36'>0x0024</td>
 <td>CameraOrientation</td>
 <td class=c>int8u</td>
 <td><span class=s>1 = Horizontal (normal)
   <br>3 = Rotate 180
   <br>6 = Rotate 90 CW
   <br>8 = Rotate 270 CW</span></td></tr>
-<tr>
-<td title='0x0029 = 41'>0x0029</td>
+<tr class=b>
+<td title='0x0025 = 37'>0x0025</td>
 <td>Quality2</td>
 <td class=c>int8u</td>
 <td><span class=s>0 = JPEG
   <br>1 = RAW
   <br>2 = RAW + JPEG
   <br>3 = JPEG + MPO</span></td></tr>
+<tr>
+<td title='0x003f = 63'>0x003f</td>
+<td>SonyImageHeight</td>
+<td class=c title=' ~ = Writable only with -n'>int16u~</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x0046 = 70'>0x0046</td>
+<td>ModelReleaseYear</td>
+<td class=c title=' ~ = Writable only with -n'>int8u~</td>
+<td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
-<h2><a name='Tag9400b'>Sony Tag9400b Tags</a></h2>
+<h2><a name='Tag9400c'>Sony Tag9400c Tags</a></h2>
+<p>Valid for DSC-RX10/HX60V/HX400V, ILCE-7/7R/5000/6000.</p>
 <blockquote>
 <table class=frame><tr><td>
 <table class=inner cellspacing=1>
 <tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
 <th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
 <tr>
-<td title='0x0008 = 8'>0x0008</td>
-<td>SequenceImageNumber</td>
-<td class=c>int32u</td>
-<td><span class=s><span class=n>(number of images captured in burst sequence)</span></span></td></tr>
-<tr class=b>
-<td title='0x000c = 12'>0x000c</td>
-<td>SequenceFileNumber</td>
-<td class=c>int32u</td>
-<td><span class=s><span class=n>(file number in burst sequence)</span></span></td></tr>
-<tr>
-<td title='0x0010 = 16'>0x0010</td>
+<td title='0x0009 = 9'>0x0009</td>
 <td>ReleaseMode2</td>
 <td class=c>int8u</td>
-<td><span class=s>0 = Normal
-  <br>1 = Continuous
-  <br>2 = Continuous - Exposure Bracketing
-  <br>3 = Continuous - White Balance Bracketing
-  <br>5 = Continuous - Burst
-  <br>6 = Single Frame - Capture During Movie
-  <br>7 = Continuous - Sweep Panorama
-  <br>8 = Continuous - Anti-Motion Blur, Hand-held Twilight
-  <br>9 = Continuous - HDR
-  <br>10 = Continuous - Background defocus
-  <br>13 = Continuous - 3D Sweep Panorama
-  <br>16 = Continuous - 3D Image
-  <br>19 = Continuous - Speed/Advance Priority
-  <br>20 = Continuous - Multi Frame NR
-  <br>26 = Continuous Low
-  <br>27 = Continuous - High Sensitivity
-  <br>28 = Smile Shutter
-  <br>29 = Continuous - Tele-zoom Advance Priority</span></td></tr>
+<td>--&gt; <a href='Sony.html#ReleaseMode2'>Sony ReleaseMode2 Values</a></td></tr>
 <tr class=b>
-<td title='0x0016 = 22'>0x0016</td>
+<td title='0x000a = 10'>0x000a</td>
 <td>ShotNumberSincePowerUp</td>
 <td class=c>int32u</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td title='0x001e = 30'>0x001e</td>
+<td title='0x0012 = 18'>0x0012</td>
+<td>SequenceImageNumber</td>
+<td class=c>int32u</td>
+<td><span class=s><span class=n>(number of images captured in burst sequence)</span></span></td></tr>
+<tr class=b>
+<td title='0x0016 = 22'>0x0016</td>
 <td>SequenceLength</td>
 <td class=c>int8u</td>
 <td><table class=cols><tr>
@@ -3423,22 +4843,40 @@ substitution cipher, but the deciphered values are listed below.</p>
   <br>100 = Continuous - iSweep Panorama
   <br>200 = Continuous - Sweep Panorama</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
+<tr>
+<td title='0x001a = 26'>0x001a</td>
+<td>SequenceFileNumber</td>
+<td class=c>int32u</td>
+<td><span class=s><span class=n>(file number in burst sequence)</span></span></td></tr>
 <tr class=b>
-<td title='0x0024 = 36'>0x0024</td>
+<td title='0x001e = 30'>0x001e</td>
+<td>SequenceLength</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Continuous
+  <br>1 = 1 file
+  <br>2 = 2 files
+  <br>3 = 3 files</span></td></tr>
+<tr>
+<td title='0x0029 = 41'>0x0029</td>
 <td>CameraOrientation</td>
 <td class=c>int8u</td>
 <td><span class=s>1 = Horizontal (normal)
   <br>3 = Rotate 180
   <br>6 = Rotate 90 CW
   <br>8 = Rotate 270 CW</span></td></tr>
-<tr>
-<td title='0x0025 = 37'>0x0025</td>
+<tr class=b>
+<td title='0x002a = 42'>0x002a</td>
 <td>Quality2</td>
 <td class=c>int8u</td>
 <td><span class=s>0 = JPEG
   <br>1 = RAW
   <br>2 = RAW + JPEG
   <br>3 = JPEG + MPO</span></td></tr>
+<tr>
+<td title='0x0047 = 71'>0x0047</td>
+<td>SonyImageHeight</td>
+<td class=c title=' ~ = Writable only with -n'>int16u~</td>
+<td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
 <h2><a name='Tag9402'>Sony Tag9402 Tags</a></h2>
@@ -3453,14 +4891,27 @@ substitution cipher, but the deciphered values are listed below.</p>
 <td class=c>int8s</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
+<td title='0x0016 = 22'>0x0016</td>
+<td>FocusMode</td>
+<td class=c>int8u</td>
+<td><span class=s>[Mask 0x7f]
+  <br>0x0 = Manual
+  <br>0x2 = AF-S
+  <br>0x3 = AF-C
+  <br>0x4 = AF-A
+  <br>0x6 = DMF</span></td></tr>
+<tr>
 <td title='0x0017 = 23'>0x0017</td>
 <td>AFAreaMode</td>
 <td class=c>int8u</td>
 <td><table class=cols><tr>
   <td>0 = Multi
   <br>1 = Center
-  <br>3 = Flexible Spot</td><td>&nbsp;&nbsp;</td>
-  <td>14 = Tracking
+  <br>2 = Spot
+  <br>3 = Flexible Spot
+  <br>10 = Selective (for Miniature effect)
+  <br>11 = Zone
+  <br>14 = Tracking
   <br>15 = Face Tracking
   <br>255 = Manual</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
@@ -3479,6 +4930,137 @@ substitution cipher, but the deciphered values are listed below.</p>
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
+<h2><a name='Tag9405a'>Sony Tag9405a Tags</a></h2>
+<p>Valid for SLT, NEX, ILCE-3000 and several DSC models.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td title='0x0603 = 1539'>0x0603</td>
+<td>LensFormat</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Unknown
+  <br>1 = APS-C
+  <br>2 = Full-frame</span></td></tr>
+<tr class=b>
+<td title='0x0604 = 1540'>0x0604</td>
+<td>LensMount</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Unknown
+  <br>1 = A-Mount
+  <br>2 = E-mount</span></td></tr>
+<tr>
+<td title='0x0605 = 1541'>0x0605</td>
+<td>LensType2</td>
+<td class=c>int16u</td>
+<td>--&gt; <a href='Sony.html#LensType2'>Sony LensType2 Values</a>
+  <br><span class='n s'>(E-Mount lenses)</span></td></tr>
+<tr class=b>
+<td title='0x0608 = 1544'>0x0608</td>
+<td>LensType</td>
+<td class=c>int16u</td>
+<td>--&gt; <a href='Sony.html#LensType'>Sony LensType Values</a>
+  <br><span class='n s'>(A-Mount lenses on SLT and NEX)</span></td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='Tag9405b'>Sony Tag9405b Tags</a></h2>
+<p>Valid for the DSC-RX10/HX60V/HX400V and ILCE-7/7R/5000/6000.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td title='0x000e = 14'>0x000e</td>
+<td>SonyExposureTime2</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x0010 = 16'>0x0010</td>
+<td>ExposureTime</td>
+<td class=c>rational32u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x0014 = 20'>0x0014</td>
+<td>SonyFNumber</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x0016 = 22'>0x0016</td>
+<td>SonyMaxApertureValue</td>
+<td class=c>int16u</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x0024 = 36'>0x0024</td>
+<td>SequenceImageNumber</td>
+<td class=c>int32u</td>
+<td><span class=s><span class=n>(number of images captured in burst sequence)</span></span></td></tr>
+<tr class=b>
+<td title='0x0034 = 52'>0x0034</td>
+<td>ReleaseMode2</td>
+<td class=c>int8u</td>
+<td>--&gt; <a href='Sony.html#ReleaseMode2'>Sony ReleaseMode2 Values</a></td></tr>
+<tr>
+<td title='0x0044 = 68'>0x0044</td>
+<td>LongExposureNoiseReduction</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Off
+  <br>1 = On</span></td></tr>
+<tr class=b>
+<td title='0x0046 = 70'>0x0046</td>
+<td>PictureEffect2</td>
+<td class=c>int8u</td>
+<td>--&gt; <a href='Sony.html#PictureEffect2'>Sony PictureEffect2 Values</a></td></tr>
+<tr>
+<td title='0x0048 = 72'>0x0048</td>
+<td>ExposureProgram</td>
+<td class=c>int8u</td>
+<td>--&gt; <a href='Sony.html#ExposureProgram3'>Sony ExposureProgram3 Values</a></td></tr>
+<tr class=b>
+<td title='0x004a = 74'>0x004a</td>
+<td>CreativeStyle</td>
+<td class=c>int8u</td>
+<td><table class=cols><tr>
+  <td>0 = Standard
+  <br>1 = Vivid
+  <br>2 = Neutral
+  <br>3 = Portrait
+  <br>4 = Landscape</td><td>&nbsp;&nbsp;</td>
+  <td>5 = B&amp;W
+  <br>9 = Sunset
+  <br>11 = Autumn Leaves
+  <br>13 = Sepia</td><td>&nbsp;&nbsp;</td></tr></table>
+</td></tr>
+<tr>
+<td title='0x005d = 93'>0x005d</td>
+<td>LensFormat</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Unknown
+  <br>1 = APS-C
+  <br>2 = Full-frame</span></td></tr>
+<tr class=b>
+<td title='0x005e = 94'>0x005e</td>
+<td>LensMount</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Unknown
+  <br>1 = A-Mount
+  <br>2 = E-mount</span></td></tr>
+<tr>
+<td title='0x0060 = 96'>0x0060</td>
+<td>LensType2</td>
+<td class=c>int16u</td>
+<td>--&gt; <a href='Sony.html#LensType2'>Sony LensType2 Values</a>
+  <br><span class='n s'>(E-Mount lenses)</span></td></tr>
+<tr class=b>
+<td title='0x0062 = 98'>0x0062</td>
+<td>LensType</td>
+<td class=c>int16u</td>
+<td>--&gt; <a href='Sony.html#LensType'>Sony LensType Values</a>
+  <br><span class='n s'>(A-Mount lenses on SLT and NEX)</span></td></tr>
+</table></td></tr></table></blockquote>
+
 <h2><a name='Tag9406'>Sony Tag9406 Tags</a></h2>
 <blockquote>
 <table class=frame><tr><td>
@@ -3486,10 +5068,25 @@ substitution cipher, but the deciphered values are listed below.</p>
 <tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
 <th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
 <tr>
+<td title='0x0005 = 5'>0x0005</td>
+<td>BatteryTemperature</td>
+<td class=c>int8u</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x0006 = 6'>0x0006</td>
+<td>BatteryLevelGrip1</td>
+<td class=c>int8u</td>
+<td>&nbsp;</td></tr>
+<tr>
 <td title='0x0007 = 7'>0x0007</td>
 <td>BatteryLevel</td>
 <td class=c>int8u</td>
 <td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x0008 = 8'>0x0008</td>
+<td>BatteryLevelGrip2</td>
+<td class=c>int8u</td>
+<td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
 <h2><a name='Tag940a'>Sony Tag940a Tags</a></h2>
@@ -3531,6 +5128,27 @@ substitution cipher, but the deciphered values are listed below.</p>
 </td></tr>
 </table></td></tr></table></blockquote>
 
+<h2><a name='Tag940c'>Sony Tag940c Tags</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td title='0x0008 = 8'>0x0008</td>
+<td>LensMount</td>
+<td class=c>int8u</td>
+<td><span class=s>0 = Unknown
+  <br>1 = A-Mount (1)
+  <br>4 = E-mount
+  <br>5 = A-Mount (5)</span></td></tr>
+<tr class=b>
+<td title='0x0009 = 9'>0x0009</td>
+<td>LensType2</td>
+<td class=c>int16u</td>
+<td>--&gt; <a href='Sony.html#LensType2'>Sony LensType2 Values</a></td></tr>
+</table></td></tr></table></blockquote>
+
 <h2><a name='AFInfo'>Sony AFInfo Tags</a></h2>
 <p>These tags are currently extracted for SLT models only.</p>
 <blockquote>
@@ -3742,24 +5360,73 @@ substitution cipher, but the deciphered values are listed below.</p>
 <td title='0x017e = 382'>0x017e</td>
 <td>ExposureProgram</td>
 <td class=c>int8u</td>
-<td><table class=cols><tr>
-  <td>0 = Program AE
-  <br>1 = Aperture-priority AE
-  <br>2 = Shutter speed priority AE
-  <br>3 = Manual
-  <br>4 = Auto
-  <br>5 = iAuto
-  <br>6 = Superior Auto
-  <br>7 = iAuto+
-  <br>8 = Portrait
-  <br>9 = Landscape
-  <br>12 = Sunset
-  <br>17 = Handheld Night Shot
-  <br>29 = Macro
-  <br>33 = Sweep Panorama
-  <br>36 = Background Defocus
-  <br>43 = Cont. Priority AE</td><td>&nbsp;&nbsp;</td></tr></table>
-</td></tr>
+<td>--&gt; <a href='Sony.html#ExposureProgram3'>Sony ExposureProgram3 Values</a></td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='PIC'>Sony PIC Tags</a></h2>
+<p>The TextInfo data is extracted as a block to preserve the formatting, and
+some of the more interesting information is extracted as separate tags.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td>'BC:'</td>
+<td>Barcode</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'BarCode:'</td>
+<td>Barcode</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'Capt:'</td>
+<td>SensorTemperature</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'FWVer:'</td>
+<td>FirmwareVersion</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'IFD'</td>
+<td>PIC_IFD</td>
+<td class=c>-</td>
+<td>--&gt; <a href='Sony.html'>Sony Tags</a></td></tr>
+<tr class=b>
+<td>'Temp:'</td>
+<td>CameraTemperature</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'Temp:Clbt:'</td>
+<td>BoardTemperature</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'TextInfo1'</td>
+<td>TextInfo1</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'TextInfo2'</td>
+<td>TextInfo2</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'VR Enable C:'</td>
+<td>VibrationReduction</td>
+<td class=c>N</td>
+<td><span class=s>0 = Off
+  <br>1 = On</span></td></tr>
+<tr>
+<td>'barcode:'</td>
+<td>Barcode</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
 <h2><a name='Ericsson'>Sony Ericsson Tags</a></h2>
@@ -3893,25 +5560,35 @@ this information is also written to ARW images by other models.</p>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
+<td title='0x7310 = 29456'>0x7310</td>
+<td>BlackLevel</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
 <td title='0x7313 = 29459'>0x7313</td>
 <td>WB_RGGBLevels</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x74a0 = 29856'>0x74a0</td>
 <td>MaxApertureAtMaxFocal</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td title='0x74a1 = 29857'>0x74a1</td>
 <td>MaxApertureAtMinFocal</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td title='0x74c0 = 29888'>0x74c0</td>
 <td>SR2DataIFD</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Sony.html#SR2DataIFD'>Sony SR2DataIFD Tags</a></td></tr>
+<tr>
+<td title='0x7800 = 30720'>0x7800</td>
+<td>ColorMatrix</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
 <tr class=b>
 <td title='0x7820 = 30752'>0x7820</td>
 <td>WB_RGBLevelsDaylight</td>
@@ -3928,6 +5605,16 @@ this information is also written to ARW images by other models.</p>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td title='0x7823 = 30755'>0x7823</td>
+<td>WB_RGBLevelsFlash</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x7824 = 30756'>0x7824</td>
+<td>WB_RGBLevels4500K</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
 <td title='0x7825 = 30757'>0x7825</td>
 <td>WB_RGBLevelsShade</td>
 <td class=c>N</td>
@@ -3938,8 +5625,43 @@ this information is also written to ARW images by other models.</p>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td title='0x7827 = 30759'>0x7827</td>
+<td>WB_RGBLevelsFluorescentP1</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td title='0x7828 = 30760'>0x7828</td>
-<td>WB_RGBLevelsFlash</td>
+<td>WB_RGBLevelsFluorescentP2</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x7829 = 30761'>0x7829</td>
+<td>WB_RGBLevelsFluorescentM1</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x782a = 30762'>0x782a</td>
+<td>WB_RGBLevels8500K</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x782b = 30763'>0x782b</td>
+<td>WB_RGBLevels6000K</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x782c = 30764'>0x782c</td>
+<td>WB_RGBLevels3200K</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td title='0x782d = 30765'>0x782d</td>
+<td>WB_RGBLevels2500K</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td title='0x787f = 30847'>0x787f</td>
+<td>WhiteLevel</td>
 <td class=c>N</td>
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
@@ -4046,7 +5768,7 @@ the JPEG image from a PMP file)</span></span></td></tr>
 
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Apr 11, 2013</i>
+<br><i>Last revised Feb 20, 2014</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -0,0 +1,187 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<title>Torrent Tags</title>
+<link rel=stylesheet type='text/css' href='style.css' title='Style'>
+</head>
+<body>
+<h2 class=top>Torrent Tags</h2>
+<p>Below are tags commonly found in BitTorrent files.  As well as these tags,
+any other existing tags will be extracted.  For convenience, list items are
+expanded into individual tags with an index in the tag name, but only the
+tags with index &quot;1&quot; are listed in the tables below.  See
+<a href="https://wiki.theory.org/BitTorrentSpecification">https://wiki.theory.org/BitTorrentSpecification</a> for the BitTorrent
+specification.</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td>'announce'</td>
+<td>Announce</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'announce-list'</td>
+<td>AnnounceList1</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'comment'</td>
+<td>Comment</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'created by'</td>
+<td>Creator</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'creation date'</td>
+<td>CreateDate</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'encoding'</td>
+<td>Encoding</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'info'</td>
+<td>Info</td>
+<td class=c>-</td>
+<td>--&gt; <a href='Torrent.html#Info'>Torrent Info Tags</a></td></tr>
+<tr class=b>
+<td>'url-list'</td>
+<td>URLList1</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='Info'>Torrent Info Tags</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td>'file-duration'</td>
+<td>File1Duration</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'file-media'</td>
+<td>File1Media</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'files'</td>
+<td>Files</td>
+<td class=c>-</td>
+<td>--&gt; <a href='Torrent.html#Files'>Torrent Files Tags</a></td></tr>
+<tr class=b>
+<td>'length'</td>
+<td>Length</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'md5sum'</td>
+<td>MD5Sum</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'name'</td>
+<td>Name</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'name.utf-8'</td>
+<td>NameUTF-8</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'piece length'</td>
+<td>PieceLength</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'pieces'</td>
+<td>Pieces</td>
+<td class=c>N</td>
+<td><span class=s><span class=n>(concatenation of 20-byte SHA-1 digests for each piece)</span></span></td></tr>
+<tr class=b>
+<td>'private'</td>
+<td>Private</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'profiles'</td>
+<td>Profiles</td>
+<td class=c>-</td>
+<td>--&gt; <a href='Torrent.html#Profiles'>Torrent Profiles Tags</a></td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='Files'>Torrent Files Tags</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td>'length'</td>
+<td>File1Length</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'md5sum'</td>
+<td>File1MD5Sum</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'path'</td>
+<td>File1Path</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'path.utf-8'</td>
+<td>File1PathUTF-8</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<h2><a name='Profiles'>Torrent Profiles Tags</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag&nbsp;ID</th><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td>'acodec'</td>
+<td>Profile1AudioCodec</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'height'</td>
+<td>Profile1Height</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>'vcodec'</td>
+<td>Profile1VideoCodec</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>'width'</td>
+<td>Profile1Width</td>
+<td class=c>N</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
+<hr>
+(This document generated automatically by Image::ExifTool::BuildTagLookup)
+<br><i>Last revised Sep 10, 2013</i>
+<p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
+</body>
+</html>
@@ -143,150 +143,154 @@ as extensions from various other sources.  See
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#exif'>XMP exif Tags</a></td></tr>
 <tr>
+<td>exifEX</td>
+<td class=c>-</td>
+<td>--&gt; <a href='XMP.html#exifEX'>XMP exifEX Tags</a></td></tr>
+<tr class=b>
 <td>expressionmedia</td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#ExpressionMedia'>XMP ExpressionMedia Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>extensis</td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#extensis'>XMP extensis Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>fpv</td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#fpv'>XMP fpv Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>getty</td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#GettyImages'>XMP GettyImages Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>GPano</td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#GPano'>XMP GPano Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>ics</td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#ics'>XMP ics Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>iptcCore</td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#iptcCore'>XMP iptcCore Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>iptcExt</td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#iptcExt'>XMP iptcExt Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>lr</td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#Lightroom'>XMP Lightroom Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>mediapro</td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#MediaPro'>XMP MediaPro Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>microsoft</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Microsoft.html#XMP'>Microsoft XMP Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>MP</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Microsoft.html#MP'>Microsoft MP Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>MP1</td>
 <td class=c>-</td>
 <td>--&gt; <a href='Microsoft.html#MP1'>Microsoft MP1 Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>mwg-coll</td>
 <td class=c>-</td>
 <td>--&gt; <a href='MWG.html#Collections'>MWG Collections Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>mwg-kw</td>
 <td class=c>-</td>
 <td>--&gt; <a href='MWG.html#Keywords'>MWG Keywords Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>mwg-rs</td>
 <td class=c>-</td>
 <td>--&gt; <a href='MWG.html#Regions'>MWG Regions Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td><u>pdf</u></td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#pdf'>XMP pdf Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td><u>pdfx</u></td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#pdfx'>XMP pdfx Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>photomech</td>
 <td class=c>-</td>
 <td>--&gt; <a href='PhotoMechanic.html#XMP'>PhotoMechanic XMP Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td><u>photoshop</u></td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#photoshop'>XMP photoshop Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>PixelLive</td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#PixelLive'>XMP PixelLive Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>plus</td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#plus'>XMP plus Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>prism</td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#prism'>XMP prism Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>prl</td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#prl'>XMP prl Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>pur</td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#pur'>XMP pur Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td>rdf</td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#rdf'>XMP rdf Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>swf</td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#swf'>XMP swf Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td><u>tiff</u></td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#tiff'>XMP tiff Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td><u>x</u></td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#x'>XMP x Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td><u>xmp</u></td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#xmp'>XMP xmp Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td><u>xmpBJ</u></td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#xmpBJ'>XMP xmpBJ Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td><u>xmpDM</u></td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#xmpDM'>XMP xmpDM Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td><u>xmpMM</u></td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#xmpMM'>XMP xmpMM Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td><u>xmpNote</u></td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#xmpNote'>XMP xmpNote Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td>xmpPLUS</td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#xmpPLUS'>XMP xmpPLUS Tags</a></td></tr>
-<tr class=b>
+<tr>
 <td><u>xmpRights</u></td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#xmpRights'>XMP xmpRights Tags</a></td></tr>
-<tr>
+<tr class=b>
 <td><u>xmpTPg</u></td>
 <td class=c>-</td>
 <td>--&gt; <a href='XMP.html#xmpTPg'>XMP xmpTPg Tags</a></td></tr>
@@ -419,7 +423,7 @@ hear.)</p>
 <td class=c title=' / = Avoided'>string/</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>Datetime</td>
+<td>DateTime</td>
 <td class=c title=' / = Avoided'>date/</td>
 <td>&nbsp;</td></tr>
 <tr>
@@ -479,21 +483,29 @@ RegionExtensions.</p>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>ConfidenceLevel</td>
+<td>AngleInfoYaw</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td>FaceID</td>
+<td>ConfidenceLevel</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
+<td>FaceID</td>
+<td class=c>integer</td>
+<td>&nbsp;</td></tr>
+<tr>
 <td>TimeStamp</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
 <h2><a name='aux'>XMP aux Tags</a></h2>
-<p>Photoshop Auxiliary namespace tags.</p>
+<p>Adobe-defined auxiliary EXIF tags.  This namespace existed in the XMP
+specification until it was dropped in 2012, presumably due to the
+introduction of the EXIF 2.3 for XMP specification and the exifEX namespace
+at this time.  For this reason, tags below with equivalents in the
+<a href="#exifEX">exifEX namespace</a> are avoided when writing.</p>
 <blockquote>
 <table class=frame><tr><td>
 <table class=inner cellspacing=1>
@@ -525,15 +537,19 @@ RegionExtensions.</p>
 <td>&nbsp;</td></tr>
 <tr>
 <td>LensInfo</td>
-<td class=c>string</td>
+<td class=c title=' / = Avoided'>string/</td>
 <td><span class=s><span class=n>(4 rational values giving focal and aperture ranges)</span></span></td></tr>
 <tr class=b>
-<td>OwnerName</td>
-<td class=c>string</td>
+<td>LensSerialNumber</td>
+<td class=c title=' / = Avoided'>string/</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td>OwnerName</td>
+<td class=c title=' / = Avoided'>string/</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td>SerialNumber</td>
-<td class=c>string</td>
+<td class=c title=' / = Avoided'>string/</td>
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
@@ -637,7 +653,8 @@ specific properties in XMP (see <a href="http://creativecommons.org/ns">http://c
 </table></td></tr></table></blockquote>
 
 <h2><a name='crs'>XMP crs Tags</a></h2>
-<p>Photoshop Camera Raw namespace tags.</p>
+<p>Photoshop Camera Raw namespace tags.  It is a shame that Adobe pollutes the
+metadata space with these incredibly bulky image editing parameters.</p>
 <blockquote>
 <table class=frame><tr><td>
 <table class=inner cellspacing=1>
@@ -668,53 +685,263 @@ specific properties in XMP (see <a href="http://creativecommons.org/ns">http://c
 <td class=c>boolean</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td>Blacks2012</td>
+<td>AutoWhiteVersion</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>BlueHue</td>
+<td>Blacks2012</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td>BlueSaturation</td>
+<td>BlueHue</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>Brightness</td>
+<td>BlueSaturation</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td>Brightness</td>
+<td class=c>integer</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td>CameraProfile</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>CameraProfileDigest</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>ChromaticAberrationB</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>ChromaticAberrationR</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
+<tr class=b>
+<td>CircularGradientBasedCorrections</td>
+<td class=c title=' + = List'>struct+</td>
+<td>--&gt; <a href='XMP.html#Correction'>Correction Struct</a></td></tr>
+<tr>
+<td>CircGradBasedCorrActive</td>
+<td class=c title=' _ = Flattened'>boolean_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionActive)</span></span></td></tr>
+<tr class=b>
+<td>CircGradBasedCorrAmount</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionAmount)</span></span></td></tr>
+<tr>
+<td>CircGradBasedCorrMasks</td>
+<td class=c title=' _ = Flattened
+ + = List'>struct_+</td>
+<td>--&gt; <a href='XMP.html#CorrectionMask'>CorrectionMask Struct</a>
+  <br><span class='n s'>(CircularGradientBasedCorrectionsCorrectionMasks)</span></td></tr>
+<tr class=b>
+<td>CircGradBasedCorrMaskAlpha</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksAlpha)</span></span></td></tr>
+<tr>
+<td>CircGradBasedCorrMaskAngle</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksAngle)</span></span></td></tr>
+<tr class=b>
+<td>CircGradBasedCorrMaskBottom</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksBottom)</span></span></td></tr>
+<tr>
+<td>CircGradBasedCorrMaskCenterValue</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksCenterValue)</span></span></td></tr>
+<tr class=b>
+<td>CircGradBasedCorrMaskCenterWeight</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksCenterWeight)</span></span></td></tr>
+<tr>
+<td>CircGradBasedCorrMaskDabs</td>
+<td class=c title=' _ = Flattened'>string_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksDabs)</span></span></td></tr>
+<tr class=b>
+<td>CircGradBasedCorrMaskFeather</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksFeather)</span></span></td></tr>
+<tr>
+<td>CircGradBasedCorrMaskFlipped</td>
+<td class=c title=' _ = Flattened'>boolean_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksFlipped)</span></span></td></tr>
+<tr class=b>
+<td>CircGradBasedCorrMaskFlow</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksFlow)</span></span></td></tr>
+<tr>
+<td>CircGradBasedCorrMaskFullX</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksFullX)</span></span></td></tr>
+<tr class=b>
+<td>CircGradBasedCorrMaskFullY</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksFullY)</span></span></td></tr>
+<tr>
+<td>CircGradBasedCorrMaskLeft</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksLeft)</span></span></td></tr>
+<tr class=b>
+<td>CircGradBasedCorrMaskValue</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksMaskValue)</span></span></td></tr>
+<tr>
+<td>CircGradBasedCorrMaskMidpoint</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksMidpoint)</span></span></td></tr>
+<tr class=b>
+<td>CircGradBasedCorrMaskPerimeterValue</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksPerimeterValue)</span></span></td></tr>
+<tr>
+<td>CircGradBasedCorrMaskRadius</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksRadius)</span></span></td></tr>
+<tr class=b>
+<td>CircGradBasedCorrMaskRight</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksRight)</span></span></td></tr>
+<tr>
+<td>CircGradBasedCorrMaskRoundness</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksRoundness)</span></span></td></tr>
+<tr class=b>
+<td>CircGradBasedCorrMaskSizeX</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksSizeX)</span></span></td></tr>
+<tr>
+<td>CircGradBasedCorrMaskSizeY</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksSizeY)</span></span></td></tr>
+<tr class=b>
+<td>CircGradBasedCorrMaskTop</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksTop)</span></span></td></tr>
+<tr>
+<td>CircGradBasedCorrMaskVersion</td>
+<td class=c title=' _ = Flattened'>integer_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksVersion)</span></span></td></tr>
+<tr class=b>
+<td>CircGradBasedCorrMaskWhat</td>
+<td class=c title=' _ = Flattened'>string_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksWhat)</span></span></td></tr>
+<tr>
+<td>CircGradBasedCorrMaskX</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksX)</span></span></td></tr>
+<tr class=b>
+<td>CircGradBasedCorrMaskY</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksY)</span></span></td></tr>
+<tr>
+<td>CircGradBasedCorrMaskZeroX</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksZeroX)</span></span></td></tr>
+<tr class=b>
+<td>CircGradBasedCorrMaskZeroY</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsCorrectionMasksZeroY)</span></span></td></tr>
+<tr>
+<td>CircGradBasedCorrBrightness</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsLocalBrightness)</span></span></td></tr>
+<tr class=b>
+<td>CircGradBasedCorrClarity</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsLocalClarity)</span></span></td></tr>
+<tr>
+<td>CircGradBasedCorrClarity2012</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsLocalClarity2012)</span></span></td></tr>
+<tr class=b>
+<td>CircGradBasedCorrContrast</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsLocalContrast)</span></span></td></tr>
+<tr>
+<td>CircGradBasedCorrContrast2012</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsLocalContrast2012)</span></span></td></tr>
+<tr class=b>
+<td>CircGradBasedCorrDefringe</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsLocalDefringe)</span></span></td></tr>
+<tr>
+<td>CircGradBasedCorrExposure</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsLocalExposure)</span></span></td></tr>
+<tr class=b>
+<td>CircGradBasedCorrExposure2012</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsLocalExposure2012)</span></span></td></tr>
+<tr>
+<td>CircGradBasedCorrHighlights2012</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsLocalHighlights2012)</span></span></td></tr>
+<tr class=b>
+<td>CircGradBasedCorrLuminanceNoise</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsLocalLuminanceNoise)</span></span></td></tr>
+<tr>
+<td>CircGradBasedCorrMoire</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsLocalMoire)</span></span></td></tr>
+<tr class=b>
+<td>CircGradBasedCorrSaturation</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsLocalSaturation)</span></span></td></tr>
+<tr>
+<td>CircGradBasedCorrShadows2012</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsLocalShadows2012)</span></span></td></tr>
+<tr class=b>
+<td>CircGradBasedCorrSharpness</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsLocalSharpness)</span></span></td></tr>
+<tr>
+<td>CircGradBasedCorrTemperature</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsLocalTemperature)</span></span></td></tr>
+<tr class=b>
+<td>CircGradBasedCorrTint</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsLocalTint)</span></span></td></tr>
+<tr>
+<td>CircGradBasedCorrHue</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsLocalToningHue)</span></span></td></tr>
+<tr class=b>
+<td>CircGradBasedCorrSaturation</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsLocalToningSaturation)</span></span></td></tr>
 <tr>
+<td>CircGradBasedCorrWhat</td>
+<td class=c title=' _ = Flattened'>string_</td>
+<td><span class=s><span class=n>(CircularGradientBasedCorrectionsWhat)</span></span></td></tr>
+<tr class=b>
 <td>Clarity</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>Clarity2012</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>ColorNoiseReduction</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>ColorNoiseReductionDetail</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
+<tr class=b>
+<td>ColorNoiseReductionSmoothness</td>
+<td class=c>integer</td>
+<td>&nbsp;</td></tr>
 <tr>
 <td>Contrast</td>
 <td class=c title=' / = Avoided'>integer/</td>
@@ -834,6 +1061,22 @@ specific properties in XMP (see <a href="http://creativecommons.org/ns">http://c
 <td>--&gt; <a href='XMP.html#CorrectionMask'>CorrectionMask Struct</a>
   <br><span class='n s'>(GradientBasedCorrectionsCorrectionMasks)</span></td></tr>
 <tr>
+<td>GradientBasedCorrMaskAlpha</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksAlpha)</span></span></td></tr>
+<tr class=b>
+<td>GradientBasedCorrMaskAngle</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksAngle)</span></span></td></tr>
+<tr>
+<td>GradientBasedCorrMaskBottom</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksBottom)</span></span></td></tr>
+<tr class=b>
+<td>GradientBasedCorrMaskCenterValue</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksCenterValue)</span></span></td></tr>
+<tr>
 <td>GradientBasedCorrMaskCenterWeight</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksCenterWeight)</span></span></td></tr>
@@ -842,6 +1085,14 @@ specific properties in XMP (see <a href="http://creativecommons.org/ns">http://c
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksDabs)</span></span></td></tr>
 <tr>
+<td>GradientBasedCorrMaskFeather</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksFeather)</span></span></td></tr>
+<tr class=b>
+<td>GradientBasedCorrMaskFlipped</td>
+<td class=c title=' _ = Flattened'>boolean_</td>
+<td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksFlipped)</span></span></td></tr>
+<tr>
 <td>GradientBasedCorrMaskFlow</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksFlow)</span></span></td></tr>
@@ -854,345 +1105,457 @@ specific properties in XMP (see <a href="http://creativecommons.org/ns">http://c
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksFullY)</span></span></td></tr>
 <tr class=b>
+<td>GradientBasedCorrMaskLeft</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksLeft)</span></span></td></tr>
+<tr>
 <td>GradientBasedCorrMaskValue</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksMaskValue)</span></span></td></tr>
+<tr class=b>
+<td>GradientBasedCorrMaskMidpoint</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksMidpoint)</span></span></td></tr>
 <tr>
+<td>GradientBasedCorrMaskPerimeterValue</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksPerimeterValue)</span></span></td></tr>
+<tr class=b>
 <td>GradientBasedCorrMaskRadius</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksRadius)</span></span></td></tr>
-<tr class=b>
-<td>GradientBasedCorrMaskWhat</td>
-<td class=c title=' _ = Flattened'>string_</td>
-<td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksWhat)</span></span></td></tr>
 <tr>
-<td>GradientBasedCorrMaskZeroX</td>
+<td>GradientBasedCorrMaskRight</td>
 <td class=c title=' _ = Flattened'>real_</td>
-<td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksZeroX)</span></span></td></tr>
+<td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksRight)</span></span></td></tr>
 <tr class=b>
-<td>GradientBasedCorrMaskZeroY</td>
+<td>GradientBasedCorrMaskRoundness</td>
 <td class=c title=' _ = Flattened'>real_</td>
-<td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksZeroY)</span></span></td></tr>
+<td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksRoundness)</span></span></td></tr>
 <tr>
-<td>GradientBasedCorrBrightness</td>
+<td>GradientBasedCorrMaskSizeX</td>
 <td class=c title=' _ = Flattened'>real_</td>
-<td><span class=s><span class=n>(GradientBasedCorrectionsLocalBrightness)</span></span></td></tr>
+<td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksSizeX)</span></span></td></tr>
 <tr class=b>
-<td>GradientBasedCorrClarity</td>
+<td>GradientBasedCorrMaskSizeY</td>
 <td class=c title=' _ = Flattened'>real_</td>
-<td><span class=s><span class=n>(GradientBasedCorrectionsLocalClarity)</span></span></td></tr>
+<td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksSizeY)</span></span></td></tr>
 <tr>
-<td>GradientBasedCorrClarity2012</td>
+<td>GradientBasedCorrMaskTop</td>
 <td class=c title=' _ = Flattened'>real_</td>
-<td><span class=s><span class=n>(GradientBasedCorrectionsLocalClarity2012)</span></span></td></tr>
+<td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksTop)</span></span></td></tr>
 <tr class=b>
-<td>GradientBasedCorrContrast</td>
-<td class=c title=' _ = Flattened'>real_</td>
-<td><span class=s><span class=n>(GradientBasedCorrectionsLocalContrast)</span></span></td></tr>
+<td>GradientBasedCorrMaskVersion</td>
+<td class=c title=' _ = Flattened'>integer_</td>
+<td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksVersion)</span></span></td></tr>
+<tr>
+<td>GradientBasedCorrMaskWhat</td>
+<td class=c title=' _ = Flattened'>string_</td>
+<td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksWhat)</span></span></td></tr>
+<tr class=b>
+<td>GradientBasedCorrMaskX</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksX)</span></span></td></tr>
+<tr>
+<td>GradientBasedCorrMaskY</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksY)</span></span></td></tr>
+<tr class=b>
+<td>GradientBasedCorrMaskZeroX</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksZeroX)</span></span></td></tr>
 <tr>
+<td>GradientBasedCorrMaskZeroY</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(GradientBasedCorrectionsCorrectionMasksZeroY)</span></span></td></tr>
+<tr class=b>
+<td>GradientBasedCorrBrightness</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(GradientBasedCorrectionsLocalBrightness)</span></span></td></tr>
+<tr>
+<td>GradientBasedCorrClarity</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(GradientBasedCorrectionsLocalClarity)</span></span></td></tr>
+<tr class=b>
+<td>GradientBasedCorrClarity2012</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(GradientBasedCorrectionsLocalClarity2012)</span></span></td></tr>
+<tr>
+<td>GradientBasedCorrContrast</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(GradientBasedCorrectionsLocalContrast)</span></span></td></tr>
+<tr class=b>
 <td>GradientBasedCorrContrast2012</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(GradientBasedCorrectionsLocalContrast2012)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>GradientBasedCorrDefringe</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(GradientBasedCorrectionsLocalDefringe)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>GradientBasedCorrExposure</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(GradientBasedCorrectionsLocalExposure)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>GradientBasedCorrExposure2012</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(GradientBasedCorrectionsLocalExposure2012)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>GradientBasedCorrHighlights2012</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(GradientBasedCorrectionsLocalHighlights2012)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>GradientBasedCorrLuminanceNoise</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(GradientBasedCorrectionsLocalLuminanceNoise)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>GradientBasedCorrMoire</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(GradientBasedCorrectionsLocalMoire)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>GradientBasedCorrSaturation</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(GradientBasedCorrectionsLocalSaturation)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>GradientBasedCorrShadows2012</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(GradientBasedCorrectionsLocalShadows2012)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>GradientBasedCorrSharpness</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(GradientBasedCorrectionsLocalSharpness)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>GradientBasedCorrTemperature</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(GradientBasedCorrectionsLocalTemperature)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>GradientBasedCorrTint</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(GradientBasedCorrectionsLocalTint)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>GradientBasedCorrHue</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(GradientBasedCorrectionsLocalToningHue)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>GradientBasedCorrSaturation</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(GradientBasedCorrectionsLocalToningSaturation)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>GradientBasedCorrWhat</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(GradientBasedCorrectionsWhat)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>GrainAmount</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>GrainFrequency</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>GrainSize</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>GrayMixerAqua</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>GrayMixerBlue</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>GrayMixerGreen</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>GrayMixerMagenta</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>GrayMixerOrange</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>GrayMixerPurple</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>GrayMixerRed</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>GrayMixerYellow</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>GreenHue</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>GreenSaturation</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>HasCrop</td>
 <td class=c>boolean</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>HasSettings</td>
 <td class=c>boolean</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>HighlightRecovery</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>Highlights2012</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>HueAdjustmentAqua</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>HueAdjustmentBlue</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>HueAdjustmentGreen</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>HueAdjustmentMagenta</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>HueAdjustmentOrange</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>HueAdjustmentPurple</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>HueAdjustmentRed</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>HueAdjustmentYellow</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>IncrementalTemperature</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>IncrementalTint</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>LensManualDistortionAmount</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>LensProfileChromaticAberrationScale</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>LensProfileDigest</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>LensProfileDistortionScale</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>LensProfileEnable</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>LensProfileFilename</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>LensProfileName</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>LensProfileSetup</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>LensProfileVignettingScale</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>LuminanceAdjustmentAqua</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>LuminanceAdjustmentBlue</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>LuminanceAdjustmentGreen</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>LuminanceAdjustmentMagenta</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>LuminanceAdjustmentOrange</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>LuminanceAdjustmentPurple</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>LuminanceAdjustmentRed</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>LuminanceAdjustmentYellow</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>LuminanceNoiseReductionContrast</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>LuminanceNoiseReductionDetail</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>LuminanceSmoothing</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>MoireFilter</td>
 <td class=c>string</td>
 <td><span class=s>&#39;Off&#39; = Off
   <br>&#39;On&#39; = On</span></td></tr>
-<tr class=b>
+<tr>
 <td>PaintBasedCorrections</td>
 <td class=c title=' + = List'>struct+</td>
 <td>--&gt; <a href='XMP.html#Correction'>Correction Struct</a></td></tr>
-<tr>
+<tr class=b>
 <td>PaintCorrectionActive</td>
 <td class=c title=' _ = Flattened'>boolean_</td>
 <td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionActive)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>PaintCorrectionAmount</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionAmount)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>PaintBasedCorrectionMasks</td>
 <td class=c title=' _ = Flattened
  + = List'>struct_+</td>
 <td>--&gt; <a href='XMP.html#CorrectionMask'>CorrectionMask Struct</a>
   <br><span class='n s'>(PaintBasedCorrectionsCorrectionMasks)</span></td></tr>
+<tr>
+<td>PaintCorrectionMaskAlpha</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionMasksAlpha)</span></span></td></tr>
 <tr class=b>
+<td>PaintCorrectionMaskAngle</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionMasksAngle)</span></span></td></tr>
+<tr>
+<td>PaintCorrectionMaskBottom</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionMasksBottom)</span></span></td></tr>
+<tr class=b>
+<td>PaintCorrectionMaskCenterValue</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionMasksCenterValue)</span></span></td></tr>
+<tr>
 <td>PaintCorrectionMaskCenterWeight</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionMasksCenterWeight)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>PaintCorrectionMaskDabs</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionMasksDabs)</span></span></td></tr>
+<tr>
+<td>PaintCorrectionMaskFeather</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionMasksFeather)</span></span></td></tr>
 <tr class=b>
+<td>PaintCorrectionMaskFlipped</td>
+<td class=c title=' _ = Flattened'>boolean_</td>
+<td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionMasksFlipped)</span></span></td></tr>
+<tr>
 <td>PaintCorrectionMaskFlow</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionMasksFlow)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>PaintCorrectionMaskFullX</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionMasksFullX)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>PaintCorrectionMaskFullY</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionMasksFullY)</span></span></td></tr>
+<tr class=b>
+<td>PaintCorrectionMaskLeft</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionMasksLeft)</span></span></td></tr>
 <tr>
 <td>PaintCorrectionMaskValue</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionMasksMaskValue)</span></span></td></tr>
 <tr class=b>
+<td>PaintCorrectionMaskMidpoint</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionMasksMidpoint)</span></span></td></tr>
+<tr>
+<td>PaintCorrectionMaskPerimeterValue</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionMasksPerimeterValue)</span></span></td></tr>
+<tr class=b>
 <td>PaintCorrectionMaskRadius</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionMasksRadius)</span></span></td></tr>
 <tr>
+<td>PaintCorrectionMaskRight</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionMasksRight)</span></span></td></tr>
+<tr class=b>
+<td>PaintCorrectionMaskRoundness</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionMasksRoundness)</span></span></td></tr>
+<tr>
+<td>PaintCorrectionMaskSizeX</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionMasksSizeX)</span></span></td></tr>
+<tr class=b>
+<td>PaintCorrectionMaskSizeY</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionMasksSizeY)</span></span></td></tr>
+<tr>
+<td>PaintCorrectionMaskTop</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionMasksTop)</span></span></td></tr>
+<tr class=b>
+<td>PaintCorrectionMaskVersion</td>
+<td class=c title=' _ = Flattened'>integer_</td>
+<td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionMasksVersion)</span></span></td></tr>
+<tr>
 <td>PaintCorrectionMaskWhat</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionMasksWhat)</span></span></td></tr>
 <tr class=b>
+<td>PaintCorrectionMaskX</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionMasksX)</span></span></td></tr>
+<tr>
+<td>PaintCorrectionMaskY</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionMasksY)</span></span></td></tr>
+<tr class=b>
 <td>PaintCorrectionMaskZeroX</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td><span class=s><span class=n>(PaintBasedCorrectionsCorrectionMasksZeroX)</span></span></td></tr>
@@ -1305,17 +1668,25 @@ specific properties in XMP (see <a href="http://creativecommons.org/ns">http://c
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>PerspectiveHorizontal</td>
+<td>PerspectiveAspect</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td>PerspectiveHorizontal</td>
+<td class=c>integer</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td>PerspectiveRotate</td>
 <td class=c>real</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>PerspectiveScale</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
+<tr class=b>
+<td>PerspectiveUpright</td>
+<td class=c>integer</td>
+<td>&nbsp;</td></tr>
 <tr>
 <td>PerspectiveVertical</td>
 <td class=c>integer</td>
@@ -1365,165 +1736,371 @@ specific properties in XMP (see <a href="http://creativecommons.org/ns">http://c
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td>RetouchAreas</td>
+<td class=c title=' + = List'>struct+</td>
+<td>--&gt; <a href='XMP.html#RetouchArea'>RetouchArea Struct</a></td></tr>
+<tr class=b>
+<td>RetouchAreaFeather</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasFeather)</span></span></td></tr>
+<tr>
+<td>RetouchAreaMasks</td>
+<td class=c title=' _ = Flattened
+ + = List'>struct_+</td>
+<td>--&gt; <a href='XMP.html#CorrectionMask'>CorrectionMask Struct</a>
+  <br><span class='n s'>(RetouchAreasMasks)</span></td></tr>
+<tr class=b>
+<td>RetouchAreaMaskAlpha</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksAlpha)</span></span></td></tr>
+<tr>
+<td>RetouchAreaMaskAngle</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksAngle)</span></span></td></tr>
+<tr class=b>
+<td>RetouchAreaMaskBottom</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksBottom)</span></span></td></tr>
+<tr>
+<td>RetouchAreaMaskCenterValue</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksCenterValue)</span></span></td></tr>
+<tr class=b>
+<td>RetouchAreaMaskCenterWeight</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksCenterWeight)</span></span></td></tr>
+<tr>
+<td>RetouchAreaMaskDabs</td>
+<td class=c title=' _ = Flattened'>string_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksDabs)</span></span></td></tr>
+<tr class=b>
+<td>RetouchAreaMaskFeather</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksFeather)</span></span></td></tr>
+<tr>
+<td>RetouchAreaMaskFlipped</td>
+<td class=c title=' _ = Flattened'>boolean_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksFlipped)</span></span></td></tr>
+<tr class=b>
+<td>RetouchAreaMaskFlow</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksFlow)</span></span></td></tr>
+<tr>
+<td>RetouchAreaMaskFullX</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksFullX)</span></span></td></tr>
+<tr class=b>
+<td>RetouchAreaMaskFullY</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksFullY)</span></span></td></tr>
+<tr>
+<td>RetouchAreaMaskLeft</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksLeft)</span></span></td></tr>
+<tr class=b>
+<td>RetouchAreaMaskValue</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksMaskValue)</span></span></td></tr>
+<tr>
+<td>RetouchAreaMaskMidpoint</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksMidpoint)</span></span></td></tr>
+<tr class=b>
+<td>RetouchAreaMaskPerimeterValue</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksPerimeterValue)</span></span></td></tr>
+<tr>
+<td>RetouchAreaMaskRadius</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksRadius)</span></span></td></tr>
+<tr class=b>
+<td>RetouchAreaMaskRight</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksRight)</span></span></td></tr>
+<tr>
+<td>RetouchAreaMaskRoundness</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksRoundness)</span></span></td></tr>
+<tr class=b>
+<td>RetouchAreaMaskSizeX</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksSizeX)</span></span></td></tr>
+<tr>
+<td>RetouchAreaMaskSizeY</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksSizeY)</span></span></td></tr>
+<tr class=b>
+<td>RetouchAreaMaskTop</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksTop)</span></span></td></tr>
+<tr>
+<td>RetouchAreaMaskVersion</td>
+<td class=c title=' _ = Flattened'>integer_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksVersion)</span></span></td></tr>
+<tr class=b>
+<td>RetouchAreaMaskWhat</td>
+<td class=c title=' _ = Flattened'>string_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksWhat)</span></span></td></tr>
+<tr>
+<td>RetouchAreaMaskX</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksX)</span></span></td></tr>
+<tr class=b>
+<td>RetouchAreaMaskY</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksY)</span></span></td></tr>
+<tr>
+<td>RetouchAreaMaskZeroX</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksZeroX)</span></span></td></tr>
+<tr class=b>
+<td>RetouchAreaMaskZeroY</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasMasksZeroY)</span></span></td></tr>
+<tr>
+<td>RetouchAreaMethod</td>
+<td class=c title=' _ = Flattened'>string_</td>
+<td><span class=s><span class=n>(RetouchAreasMethod)</span></span></td></tr>
+<tr class=b>
+<td>RetouchAreaOffsetY</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasOffsetY)</span></span></td></tr>
+<tr>
+<td>RetouchAreaOpacity</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasOpacity)</span></span></td></tr>
+<tr class=b>
+<td>RetouchAreaSeed</td>
+<td class=c title=' _ = Flattened'>integer_</td>
+<td><span class=s><span class=n>(RetouchAreasSeed)</span></span></td></tr>
+<tr>
+<td>RetouchAreaSourceState</td>
+<td class=c title=' _ = Flattened'>string_</td>
+<td><span class=s><span class=n>(RetouchAreasSourceState)</span></span></td></tr>
+<tr class=b>
+<td>RetouchAreaSourceX</td>
+<td class=c title=' _ = Flattened'>real_</td>
+<td><span class=s><span class=n>(RetouchAreasSourceX)</span></span></td></tr>
+<tr>
+<td>RetouchAreaSpotType</td>
+<td class=c title=' _ = Flattened'>string_</td>
+<td><span class=s><span class=n>(RetouchAreasSpotType)</span></span></td></tr>
+<tr class=b>
 <td>RetouchInfo</td>
 <td class=c title=' + = List'>string+</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>Saturation</td>
 <td class=c title=' / = Avoided'>integer/</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>SaturationAdjustmentAqua</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>SaturationAdjustmentBlue</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>SaturationAdjustmentGreen</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>SaturationAdjustmentMagenta</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>SaturationAdjustmentOrange</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>SaturationAdjustmentPurple</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>SaturationAdjustmentRed</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>SaturationAdjustmentYellow</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>Shadows</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>Shadows2012</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>ShadowTint</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>SharpenDetail</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>SharpenEdgeMasking</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>SharpenRadius</td>
 <td class=c>real</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>Sharpness</td>
 <td class=c title=' / = Avoided'>integer/</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>Smoothness</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>SplitToningBalance</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>SplitToningHighlightHue</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>SplitToningHighlightSaturation</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>SplitToningShadowHue</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>SplitToningShadowSaturation</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>ColorTemperature</td>
 <td class=c title=' / = Avoided'>integer/</td>
 <td><span class=s><span class=n>(called Temperature by the spec)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>Tint</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>ToneCurve</td>
 <td class=c title=' + = List'>string+</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>ToneCurveBlue</td>
 <td class=c title=' + = List'>string+</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>ToneCurveGreen</td>
 <td class=c title=' + = List'>string+</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>ToneCurveName</td>
 <td class=c>string</td>
 <td><span class=s>&#39;Custom&#39; = Custom
   <br>&#39;Linear&#39; = Linear
   <br>&#39;Medium Contrast&#39; = Medium Contrast
   <br>&#39;Strong Contrast&#39; = Strong Contrast</span></td></tr>
-<tr class=b>
+<tr>
 <td>ToneCurveName2012</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>ToneCurvePV2012</td>
 <td class=c title=' + = List'>string+</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>ToneCurvePV2012Blue</td>
 <td class=c title=' + = List'>string+</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>ToneCurvePV2012Green</td>
 <td class=c title=' + = List'>string+</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>ToneCurvePV2012Red</td>
 <td class=c title=' + = List'>string+</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>ToneCurveRed</td>
 <td class=c title=' + = List'>string+</td>
 <td>&nbsp;</td></tr>
+<tr>
+<td>UprightCenterMode</td>
+<td class=c>integer</td>
+<td>&nbsp;</td></tr>
 <tr class=b>
-<td>Version</td>
+<td>UprightCenterNormX</td>
+<td class=c>real</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>UprightCenterNormY</td>
+<td class=c>real</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>UprightDependentDigest</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr>
-<td>Vibrance</td>
+<td>UprightFocalLength35mm</td>
+<td class=c>real</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>UprightFocalMode</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
+<tr>
+<td>UprightPreview</td>
+<td class=c>boolean</td>
+<td>&nbsp;</td></tr>
 <tr class=b>
-<td>VignetteAmount</td>
+<td>UprightTransform_0</td>
+<td class=c>string</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>UprightTransform_1</td>
+<td class=c>string</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>UprightTransform_2</td>
+<td class=c>string</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>UprightTransform_3</td>
+<td class=c>string</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>UprightTransform_4</td>
+<td class=c>string</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>UprightTransformCount</td>
+<td class=c>integer</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>UprightVersion</td>
+<td class=c>integer</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>Version</td>
+<td class=c>string</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>Vibrance</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td>VignetteAmount</td>
+<td class=c>integer</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td>VignetteMidpoint</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>WhiteBalance</td>
 <td class=c title=' / = Avoided'>string/</td>
 <td><table class=cols><tr>
@@ -1537,7 +2114,7 @@ specific properties in XMP (see <a href="http://creativecommons.org/ns">http://c
   <br>&#39;Shade&#39; = Shade
   <br>&#39;Tungsten&#39; = Tungsten</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr>
+<tr class=b>
 <td>Whites2012</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
@@ -1646,6 +2223,22 @@ specific properties in XMP (see <a href="http://creativecommons.org/ns">http://c
 <tr class=h><th>Field Name</th>
 <th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
 <tr>
+<td>Alpha</td>
+<td class=c>real</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>Angle</td>
+<td class=c>real</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>Bottom</td>
+<td class=c>real</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>CenterValue</td>
+<td class=c>real</td>
+<td>&nbsp;</td></tr>
+<tr>
 <td>CenterWeight</td>
 <td class=c>real</td>
 <td>&nbsp;</td></tr>
@@ -1654,6 +2247,14 @@ specific properties in XMP (see <a href="http://creativecommons.org/ns">http://c
 <td class=c title=' + = List'>string+</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td>Feather</td>
+<td class=c>real</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>Flipped</td>
+<td class=c>boolean</td>
+<td>&nbsp;</td></tr>
+<tr>
 <td>Flow</td>
 <td class=c>real</td>
 <td>&nbsp;</td></tr>
@@ -1666,27 +2267,115 @@ specific properties in XMP (see <a href="http://creativecommons.org/ns">http://c
 <td class=c>real</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
+<td>Left</td>
+<td class=c>real</td>
+<td>&nbsp;</td></tr>
+<tr>
 <td>MaskValue</td>
 <td class=c>real</td>
 <td>&nbsp;</td></tr>
+<tr class=b>
+<td>Midpoint</td>
+<td class=c>real</td>
+<td>&nbsp;</td></tr>
 <tr>
+<td>PerimeterValue</td>
+<td class=c>real</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td>Radius</td>
 <td class=c>real</td>
 <td>&nbsp;</td></tr>
+<tr>
+<td>Right</td>
+<td class=c>real</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>Roundness</td>
+<td class=c>real</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>SizeX</td>
+<td class=c>real</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>SizeY</td>
+<td class=c>real</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>Top</td>
+<td class=c>real</td>
+<td>&nbsp;</td></tr>
 <tr class=b>
+<td>Version</td>
+<td class=c>integer</td>
+<td>&nbsp;</td></tr>
+<tr>
 <td>What</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
+<tr class=b>
+<td>X</td>
+<td class=c>real</td>
+<td>&nbsp;</td></tr>
 <tr>
-<td>ZeroX</td>
+<td>Y</td>
 <td class=c>real</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
+<td>ZeroX</td>
+<td class=c>real</td>
+<td>&nbsp;</td></tr>
+<tr>
 <td>ZeroY</td>
 <td class=c>real</td>
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
+<h2><a name='RetouchArea'>XMP RetouchArea Struct</a></h2>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Field Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td>Feather</td>
+<td class=c>real</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>Masks</td>
+<td class=c title=' + = List'>CorrectionMask+</td>
+<td>--&gt; <a href='XMP.html#CorrectionMask'>CorrectionMask Struct</a></td></tr>
+<tr>
+<td>Method</td>
+<td class=c>string</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>OffsetY</td>
+<td class=c>real</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>Opacity</td>
+<td class=c>real</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>Seed</td>
+<td class=c>integer</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>SourceState</td>
+<td class=c>string</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>SourceX</td>
+<td class=c>real</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>SpotType</td>
+<td class=c>string</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
 <h2><a name='dc'>XMP dc Tags</a></h2>
 <p>Dublin Core namespace tags.</p>
 <blockquote>
@@ -1906,7 +2595,9 @@ of tags available in DICOM-format files.</p>
 </table></td></tr></table></blockquote>
 
 <h2><a name='exif'>XMP exif Tags</a></h2>
-<p>EXIF namespace for EXIF tags.</p>
+<p>EXIF namespace for EXIF tags.  See
+<a href="http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-010-2012_E.pdf">http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-010-2012_E.pdf</a> for the
+specification.</p>
 <blockquote>
 <table class=frame><tr><td>
 <table class=inner cellspacing=1>
@@ -2168,95 +2859,99 @@ of tags available in DICOM-format files.</p>
 <td class=c>rational</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>GPSImgDirection</td>
+<td>GPSHPositioningError</td>
 <td class=c>rational</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td>GPSImgDirection</td>
+<td class=c>rational</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td>GPSImgDirectionRef</td>
 <td class=c>string</td>
 <td><span class=s>&#39;M&#39; = Magnetic North
   <br>&#39;T&#39; = True North</span></td></tr>
-<tr class=b>
+<tr>
 <td>GPSLatitude</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>GPSLongitude</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>GPSMapDatum</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>GPSMeasureMode</td>
 <td class=c>integer</td>
 <td><span class=s>2 = 2-Dimensional
   <br>3 = 3-Dimensional</span></td></tr>
-<tr class=b>
+<tr>
 <td>GPSProcessingMethod</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>GPSSatellites</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>GPSSpeed</td>
 <td class=c>rational</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>GPSSpeedRef</td>
 <td class=c>string</td>
 <td><span class=s>&#39;K&#39; = km/h
   <br>&#39;M&#39; = mph
   <br>&#39;N&#39; = knots</span></td></tr>
-<tr class=b>
+<tr>
 <td>GPSStatus</td>
 <td class=c>string</td>
 <td><span class=s>&#39;A&#39; = Measurement Active
   <br>&#39;V&#39; = Measurement Void</span></td></tr>
-<tr>
+<tr class=b>
 <td>GPSDateTime</td>
 <td class=c>date</td>
 <td><span class=s><span class=n>(a date/time tag called GPSTimeStamp by the XMP specification.  This tag is
 renamed here to prevent direct copy from EXIF:GPSTimeStamp which is a
 time-only tag.  Instead, the value of this tag should be taken from
 Composite:GPSDateTime when copying from EXIF)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>GPSTrack</td>
 <td class=c>rational</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>GPSTrackRef</td>
 <td class=c>string</td>
 <td><span class=s>&#39;M&#39; = Magnetic North
   <br>&#39;T&#39; = True North</span></td></tr>
-<tr class=b>
+<tr>
 <td>GPSVersionID</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>ImageUniqueID</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>ISO</td>
 <td class=c title=' + = List'>integer+</td>
 <td><span class=s><span class=n>(called ISOSpeedRatings by the spec)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>LightSource</td>
 <td class=c>string</td>
 <td>--&gt; <a href='EXIF.html#LightSource'>EXIF LightSource Values</a></td></tr>
-<tr class=b>
+<tr>
 <td>MakerNote</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>MaxApertureValue</td>
 <td class=c>rational</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>MeteringMode</td>
 <td class=c>integer</td>
 <td><table class=cols><tr>
@@ -2268,63 +2963,63 @@ Composite:GPSDateTime when copying from EXIF)</span></span></td></tr>
   <br>6 = Partial
   <br>255 = Other</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr>
+<tr class=b>
 <td>NativeDigest</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>Opto-ElectricConvFactor</td>
 <td class=c>struct</td>
 <td>--&gt; <a href='XMP.html#OECF'>OECF Struct</a>
   <br><span class='n s'>(called OECF by the spec)</span></td></tr>
-<tr>
+<tr class=b>
 <td>OECFColumns</td>
 <td class=c title=' _ = Flattened'>integer_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>OECFNames</td>
 <td class=c title=' _ = Flattened
  + = List'>string_+</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>OECFRows</td>
 <td class=c title=' _ = Flattened'>integer_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>OECFValues</td>
 <td class=c title=' _ = Flattened
  + = List'>rational_+</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>ExifImageWidth</td>
 <td class=c>integer</td>
 <td><span class=s><span class=n>(called PixelXDimension by the spec)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>ExifImageHeight</td>
 <td class=c>integer</td>
 <td><span class=s><span class=n>(called PixelYDimension by the spec)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>RelatedSoundFile</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>Saturation</td>
 <td class=c>integer</td>
 <td><span class=s>0 = Normal
   <br>1 = Low
   <br>2 = High</span></td></tr>
-<tr>
+<tr class=b>
 <td>SceneCaptureType</td>
 <td class=c>integer</td>
 <td><span class=s>0 = Standard
   <br>1 = Landscape
   <br>2 = Portrait
   <br>3 = Night</span></td></tr>
-<tr class=b>
+<tr>
 <td>SceneType</td>
 <td class=c>integer</td>
 <td><span class=s>1 = Directly photographed</span></td></tr>
-<tr>
+<tr class=b>
 <td>SensingMethod</td>
 <td class=c>integer</td>
 <td><span class=s><span class=n>(values 1 and 6 are not standard EXIF)</span></span><table class=cols><tr>
@@ -2337,66 +3032,66 @@ Composite:GPSDateTime when copying from EXIF)</span></span></td></tr>
   <br>7 = Trilinear
   <br>8 = Color sequential linear</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr class=b>
+<tr>
 <td>Sharpness</td>
 <td class=c>integer</td>
 <td><span class=s>0 = Normal
   <br>1 = Soft
   <br>2 = Hard</span></td></tr>
-<tr>
+<tr class=b>
 <td>ShutterSpeedValue</td>
 <td class=c>rational</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>SpatialFrequencyResponse</td>
 <td class=c>struct</td>
 <td>--&gt; <a href='XMP.html#OECF'>OECF Struct</a></td></tr>
-<tr>
+<tr class=b>
 <td>SpatialFrequencyResponseColumns</td>
 <td class=c title=' _ = Flattened'>integer_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>SpatialFrequencyResponseNames</td>
 <td class=c title=' _ = Flattened
  + = List'>string_+</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>SpatialFrequencyResponseRows</td>
 <td class=c title=' _ = Flattened'>integer_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>SpatialFrequencyResponseValues</td>
 <td class=c title=' _ = Flattened
  + = List'>rational_+</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>SpectralSensitivity</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>SubjectArea</td>
 <td class=c title=' + = List'>integer+</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>SubjectDistance</td>
 <td class=c>rational</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>SubjectDistanceRange</td>
 <td class=c>integer</td>
 <td><span class=s>0 = Unknown
   <br>1 = Macro
   <br>2 = Close
   <br>3 = Distant</span></td></tr>
-<tr>
+<tr class=b>
 <td>SubjectLocation</td>
 <td class=c title=' + = List'>integer+</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>UserComment</td>
 <td class=c>lang-alt</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>WhiteBalance</td>
 <td class=c>integer</td>
 <td><span class=s>0 = Auto
@@ -2495,8 +3190,91 @@ Composite:GPSDateTime when copying from EXIF)</span></span></td></tr>
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
+<h2><a name='exifEX'>XMP exifEX Tags</a></h2>
+<p>EXIF tags added by the EXIF 2.3 for XMP specification (see
+<a href="http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-010-2012_E.pdf">http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-010-2012_E.pdf</a>).</p>
+<blockquote>
+<table class=frame><tr><td>
+<table class=inner cellspacing=1>
+<tr class=h><th>Tag Name</th>
+<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
+<tr>
+<td>SerialNumber</td>
+<td class=c>string</td>
+<td><span class=s><span class=n>(called BodySerialNumber by the spec)</span></span></td></tr>
+<tr class=b>
+<td>OwnerName</td>
+<td class=c>string</td>
+<td><span class=s><span class=n>(called CameraOwnerName by the spec)</span></span></td></tr>
+<tr>
+<td>Gamma</td>
+<td class=c>rational</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>InteropIndex</td>
+<td class=c>string</td>
+<td><span class=s><span class=n>(called InteroperabilityIndex by the spec)</span>
+  <br>&#39;R03&#39; = R03 - DCF option file (Adobe RGB)
+  <br>&#39;R98&#39; = R98 - DCF basic file (sRGB)
+  <br>&#39;THM&#39; = THM - DCF thumbnail file</span></td></tr>
+<tr>
+<td>ISOSpeed</td>
+<td class=c>integer</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>ISOSpeedLatitudeyyy</td>
+<td class=c>integer</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>ISOSpeedLatitudezzz</td>
+<td class=c>integer</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>LensMake</td>
+<td class=c>string</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>LensModel</td>
+<td class=c>string</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>LensSerialNumber</td>
+<td class=c>string</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>LensInfo</td>
+<td class=c title=' + = List'>rational+</td>
+<td><span class=s><span class=n>(called LensSpecification by the spec.  Unfortunately the EXIF 2.3 for XMP
+specification defined this new tag instead of using the existing
+XMP-aux:LensInfo)</span></span></td></tr>
+<tr class=b>
+<td>PhotographicSensitivity</td>
+<td class=c>integer</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>RecommendedExposureIndex</td>
+<td class=c>integer</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>SensitivityType</td>
+<td class=c>integer</td>
+<td><span class=s>0 = Unknown
+  <br>1 = Standard Output Sensitivity
+  <br>2 = Recommended Exposure Index
+  <br>3 = ISO Speed
+  <br>4 = Standard Output Sensitivity and Recommended Exposure Index
+  <br>5 = Standard Output Sensitivity and ISO Speed
+  <br>6 = Recommended Exposure Index and ISO Speed
+  <br>7 = Standard Output Sensitivity, Recommended Exposure Index and ISO Speed</span></td></tr>
+<tr>
+<td>StandardOutputSensitivity</td>
+<td class=c>integer</td>
+<td>&nbsp;</td></tr>
+</table></td></tr></table></blockquote>
+
 <h2><a name='ExpressionMedia'>XMP ExpressionMedia Tags</a></h2>
-<p>Microsoft Expression Media namespace tags.</p>
+<p>Microsoft Expression Media namespace tags.  These tags are avoided when
+writing due to name conflicts with tags in other schemas.</p>
 <blockquote>
 <table class=frame><tr><td>
 <table class=inner cellspacing=1>
@@ -2506,7 +3284,20 @@ Composite:GPSDateTime when copying from EXIF)</span></span></td></tr>
 <td>CatalogSets</td>
 <td class=c title=' / = Avoided
  + = List'>string/+</td>
-<td><span class=s><span class=n>(avoided due to conflict with XMP-mediapro:CatalogSets)</span></span></td></tr>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>Event</td>
+<td class=c title=' / = Avoided'>string/</td>
+<td>&nbsp;</td></tr>
+<tr>
+<td>People</td>
+<td class=c title=' / = Avoided
+ + = List'>string/+</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
+<td>Status</td>
+<td class=c title=' / = Avoided'>string/</td>
+<td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
 <h2><a name='extensis'>XMP extensis Tags</a></h2>
@@ -3438,60 +4229,64 @@ created to enable writing of XMP-pdfx information.</p>
  + = List'>string_+</td>
 <td><span class=s><span class=n>(DocumentAncestorsAncestorID)</span></span></td></tr>
 <tr>
-<td>Headline</td>
+<td>EmbeddedXMPDigest</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>History</td>
+<td>Headline</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td>History</td>
+<td class=c>string</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td>ICCProfileName</td>
 <td class=c>string</td>
 <td><span class=s><span class=n>(called ICCProfile by the spec)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>Instructions</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>LegacyIPTCDigest</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>SidecarForExtension</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>Source</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>State</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>SupplementalCategories</td>
 <td class=c title=' + = List'>string+</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>TextLayers</td>
 <td class=c title=' + = List'>struct+</td>
 <td>--&gt; <a href='XMP.html#Layer'>Layer Struct</a></td></tr>
-<tr>
+<tr class=b>
 <td>TextLayerName</td>
 <td class=c title=' _ = Flattened
  + = List'>string_+</td>
 <td><span class=s><span class=n>(TextLayersLayerName)</span></span></td></tr>
-<tr class=b>
+<tr>
 <td>TextLayerText</td>
 <td class=c title=' _ = Flattened
  + = List'>string_+</td>
 <td><span class=s><span class=n>(TextLayersLayerText)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>TransmissionReference</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>Urgency</td>
 <td class=c>integer</td>
 <td><span class=s><span class=n>(should be in the range 1-8 to conform with the XMP spec)</span></span><table class=cols><tr>
@@ -4574,7 +5369,9 @@ treated specially to allow it to be set to a specific value if required.</p>
 </table></td></tr></table></blockquote>
 
 <h2><a name='tiff'>XMP tiff Tags</a></h2>
-<p>EXIF namespace for TIFF tags.</p>
+<p>EXIF namespace for TIFF tags.  See
+<a href="http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-010-2012_E.pdf">http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-010-2012_E.pdf</a> for the
+specification.</p>
 <blockquote>
 <table class=frame><tr><td>
 <table class=inner cellspacing=1>
@@ -4708,7 +5505,7 @@ treated specially to allow it to be set to a specific value if required.</p>
 <tr>
 <td>YCbCrSubSampling</td>
 <td class=c title=' + = List'>integer+</td>
-<td><span class=s><span class=n>(while technically this is  a list-type tag, for compatibility with its EXIF
+<td><span class=s><span class=n>(while technically this is a list-type tag, for compatibility with its EXIF
 counterpart it is written and read as a simple string)</span></span><table class=cols><tr>
   <td>&#39;1 1&#39; = YCbCr4:4:4 (1 1)
   <br>&#39;1 2&#39; = YCbCr4:4:0 (1 2)
@@ -5172,50 +5969,54 @@ namespace prefixes are found, they are translated to the newer &quot;xmp&quot;,
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td>DiscNumber</td>
+<td class=c>string</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td>Duration</td>
 <td class=c>struct</td>
 <td>--&gt; <a href='XMP.html#Time'>Time Struct</a></td></tr>
-<tr class=b>
+<tr>
 <td>DurationScale</td>
 <td class=c title=' _ = Flattened'>rational_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>DurationValue</td>
 <td class=c title=' _ = Flattened'>integer_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>Engineer</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>FileDataRate</td>
 <td class=c>rational</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>Genre</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>Good</td>
 <td class=c>boolean</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>Instrument</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>IntroTime</td>
 <td class=c>struct</td>
 <td>--&gt; <a href='XMP.html#Time'>Time Struct</a></td></tr>
-<tr class=b>
+<tr>
 <td>IntroTimeScale</td>
 <td class=c title=' _ = Flattened'>rational_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>IntroTimeValue</td>
 <td class=c title=' _ = Flattened'>integer_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>Key</td>
 <td class=c>string</td>
 <td><table class=cols><tr>
@@ -5232,14 +6033,18 @@ namespace prefixes are found, they are translated to the newer &quot;xmp&quot;,
   <br>&#39;G&#39; = G
   <br>&#39;G#&#39; = G#</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr>
+<tr class=b>
 <td>LogComment</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>Loop</td>
 <td class=c>boolean</td>
 <td>&nbsp;</td></tr>
+<tr class=b>
+<td>Lyrics</td>
+<td class=c>string</td>
+<td>&nbsp;</td></tr>
 <tr>
 <td>Markers</td>
 <td class=c title=' + = List'>struct+</td>
@@ -5330,25 +6135,29 @@ namespace prefixes are found, they are translated to the newer &quot;xmp&quot;,
 <td class=c title=' _ = Flattened'>integer_</td>
 <td>&nbsp;</td></tr>
 <tr class=b>
-<td>ProjectName</td>
+<td>PartOfCompilation</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
 <tr>
+<td>ProjectName</td>
+<td class=c>string</td>
+<td>&nbsp;</td></tr>
+<tr class=b>
 <td>ProjectRef</td>
 <td class=c>struct</td>
 <td>--&gt; <a href='XMP.html#ProjectLink'>ProjectLink Struct</a></td></tr>
-<tr class=b>
+<tr>
 <td>ProjectRefPath</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>ProjectRefType</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s>&#39;audio&#39; = Audio
   <br>&#39;custom&#39; = Custom
   <br>&#39;movie&#39; = Movie
   <br>&#39;still&#39; = Still Image</span></td></tr>
-<tr class=b>
+<tr>
 <td>PullDown</td>
 <td class=c>string</td>
 <td><table class=cols><tr>
@@ -5363,80 +6172,80 @@ namespace prefixes are found, they are translated to the newer &quot;xmp&quot;,
   <br>&#39;WWWSW&#39; = WWWSW
   <br>&#39;WWWWS&#39; = WWWWS</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr>
+<tr class=b>
 <td>RelativePeakAudioFilePath</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>RelativeTimestamp</td>
 <td class=c>struct</td>
 <td>--&gt; <a href='XMP.html#Time'>Time Struct</a></td></tr>
-<tr>
+<tr class=b>
 <td>RelativeTimestampScale</td>
 <td class=c title=' _ = Flattened'>rational_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>RelativeTimestampValue</td>
 <td class=c title=' _ = Flattened'>integer_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>ReleaseDate</td>
 <td class=c>date</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>ResampleParams</td>
 <td class=c>struct</td>
 <td>--&gt; <a href='XMP.html#ResampleStretch'>ResampleStretch Struct</a></td></tr>
-<tr>
+<tr class=b>
 <td>ResampleParamsQuality</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s>&#39;High&#39; = High
   <br>&#39;Low&#39; = Low
   <br>&#39;Medium&#39; = Medium</span></td></tr>
-<tr class=b>
+<tr>
 <td>ScaleType</td>
 <td class=c>string</td>
 <td><span class=s>&#39;Both&#39; = Both
   <br>&#39;Major&#39; = Major
   <br>&#39;Minor&#39; = Minor
   <br>&#39;Neither&#39; = Neither</span></td></tr>
-<tr>
+<tr class=b>
 <td>Scene</td>
 <td class=c title=' / = Avoided'>string/</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>ShotDate</td>
 <td class=c>date</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>ShotDay</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>ShotLocation</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>ShotName</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>ShotNumber</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>ShotSize</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>SpeakerPlacement</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>StartTimecode</td>
 <td class=c>struct</td>
 <td>--&gt; <a href='XMP.html#Timecode'>Timecode Struct</a></td></tr>
-<tr class=b>
+<tr>
 <td>StartTimecodeTimeFormat</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><table class=cols><tr>
@@ -5451,15 +6260,15 @@ namespace prefixes are found, they are translated to the newer &quot;xmp&quot;,
   <br>&#39;5994NonDropTimecode&#39; = 59.94 fps (non-drop)
   <br>&#39;60Timecode&#39; = 60 fps</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr>
+<tr class=b>
 <td>StartTimecodeTimeValue</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>StartTimecodeValue</td>
 <td class=c title=' _ = Flattened'>integer_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>StretchMode</td>
 <td class=c>string</td>
 <td><span class=s>&#39;Beat Splice&#39; = Beat Splice
@@ -5467,37 +6276,37 @@ namespace prefixes are found, they are translated to the newer &quot;xmp&quot;,
   <br>&#39;Hybrid&#39; = Hybrid
   <br>&#39;Resample&#39; = Resample
   <br>&#39;Time-Scale&#39; = Time-Scale</span></td></tr>
-<tr class=b>
+<tr>
 <td>TakeNumber</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>TapeName</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>Tempo</td>
 <td class=c>real</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>TimeScaleParams</td>
 <td class=c>struct</td>
 <td>--&gt; <a href='XMP.html#TimeScaleStretch'>TimeScaleStretch Struct</a></td></tr>
-<tr class=b>
+<tr>
 <td>TimeScaleParamsFrameOverlappingPercentage</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>TimeScaleParamsFrameSize</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>TimeScaleParamsQuality</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s>&#39;High&#39; = High
   <br>&#39;Low&#39; = Low
   <br>&#39;Medium&#39; = Medium</span></td></tr>
-<tr>
+<tr class=b>
 <td>TimeSignature</td>
 <td class=c>string</td>
 <td><table class=cols><tr>
@@ -5511,216 +6320,216 @@ namespace prefixes are found, they are translated to the newer &quot;xmp&quot;,
   <br>&#39;9/8&#39; = 9/8
   <br>&#39;other&#39; = other</td><td>&nbsp;&nbsp;</td></tr></table>
 </td></tr>
-<tr class=b>
+<tr>
 <td>TrackNumber</td>
 <td class=c>integer</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>Tracks</td>
 <td class=c title=' + = List'>struct+</td>
 <td>--&gt; <a href='XMP.html#Track'>Track Struct</a></td></tr>
-<tr class=b>
+<tr>
 <td>TracksFrameRate</td>
 <td class=c title=' _ = Flattened
  + = List'>string_+</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>TracksMarkers</td>
 <td class=c title=' _ = Flattened
  + = List'>struct_+</td>
 <td>--&gt; <a href='XMP.html#Marker'>Marker Struct</a></td></tr>
-<tr class=b>
+<tr>
 <td>TracksMarkersComment</td>
 <td class=c title=' _ = Flattened
  + = List'>string_+</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>TracksMarkersCuePointParams</td>
 <td class=c title=' _ = Flattened
  + = List'>struct_+</td>
 <td>--&gt; <a href='XMP.html#CuePointParam'>CuePointParam Struct</a></td></tr>
-<tr class=b>
+<tr>
 <td>TracksMarkersCuePointParamsKey</td>
 <td class=c title=' _ = Flattened
  + = List'>string_+</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>TracksMarkersCuePointParamsValue</td>
 <td class=c title=' _ = Flattened
  + = List'>string_+</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>TracksMarkersCuePointType</td>
 <td class=c title=' _ = Flattened
  + = List'>string_+</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>TracksMarkersDuration</td>
 <td class=c title=' _ = Flattened
  + = List'>string_+</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>TracksMarkersLocation</td>
 <td class=c title=' _ = Flattened
  + = List'>string_+</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>TracksMarkersName</td>
 <td class=c title=' _ = Flattened
  + = List'>string_+</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>TracksMarkersProbability</td>
 <td class=c title=' _ = Flattened
  + = List'>real_+</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>TracksMarkersSpeaker</td>
 <td class=c title=' _ = Flattened
  + = List'>string_+</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>TracksMarkersStartTime</td>
 <td class=c title=' _ = Flattened
  + = List'>string_+</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>TracksMarkersTarget</td>
 <td class=c title=' _ = Flattened
  + = List'>string_+</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>TracksMarkersType</td>
 <td class=c title=' _ = Flattened
  + = List'>string_+</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>TracksTrackName</td>
 <td class=c title=' _ = Flattened
  + = List'>string_+</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>TracksTrackType</td>
 <td class=c title=' _ = Flattened
  + = List'>string_+</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>VideoAlphaMode</td>
 <td class=c>string</td>
 <td><span class=s>&#39;none&#39; = None
   <br>&#39;pre-multiplied&#39; = Pre-multiplied
   <br>&#39;straight&#39; = Straight</span></td></tr>
-<tr class=b>
+<tr>
 <td>VideoAlphaPremultipleColor</td>
 <td class=c>struct</td>
 <td>--&gt; <a href='XMP.html#Colorant'>Colorant Struct</a></td></tr>
-<tr>
+<tr class=b>
 <td>VideoAlphaPremultipleColorA</td>
 <td class=c title=' _ = Flattened'>integer_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>VideoAlphaPremultipleColorB</td>
 <td class=c title=' _ = Flattened'>integer_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>VideoAlphaPremultipleColorBlack</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>VideoAlphaPremultipleColorBlue</td>
 <td class=c title=' _ = Flattened'>integer_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>VideoAlphaPremultipleColorCyan</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>VideoAlphaPremultipleColorGreen</td>
 <td class=c title=' _ = Flattened'>integer_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>VideoAlphaPremultipleColorL</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>VideoAlphaPremultipleColorMagenta</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>VideoAlphaPremultipleColorMode</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td><span class=s>&#39;CMYK&#39; = CMYK
   <br>&#39;LAB&#39; = Lab
   <br>&#39;RGB&#39; = RGB</span></td></tr>
-<tr class=b>
+<tr>
 <td>VideoAlphaPremultipleColorRed</td>
 <td class=c title=' _ = Flattened'>integer_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>VideoAlphaPremultipleColorSwatchName</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>VideoAlphaPremultipleColorTint</td>
 <td class=c title=' _ = Flattened'>integer_</td>
 <td><span class=s><span class=n>(not part of 2010 XMP specification)</span></span></td></tr>
-<tr>
+<tr class=b>
 <td>VideoAlphaPremultipleColorType</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>VideoAlphaPremultipleColorYellow</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>VideoAlphaUnityIsTransparent</td>
 <td class=c>boolean</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>VideoColorSpace</td>
 <td class=c>string</td>
 <td><span class=s>&#39;CCIR-601&#39; = CCIR-601
   <br>&#39;CCIR-709&#39; = CCIR-709
   <br>&#39;sRGB&#39; = sRGB</span></td></tr>
-<tr>
+<tr class=b>
 <td>VideoCompressor</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>VideoFieldOrder</td>
 <td class=c>string</td>
 <td><span class=s>&#39;Lower&#39; = Lower
   <br>&#39;Progressive&#39; = Progressive
   <br>&#39;Upper&#39; = Upper</span></td></tr>
-<tr>
+<tr class=b>
 <td>VideoFrameRate</td>
 <td class=c>string</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>VideoFrameSize</td>
 <td class=c>struct</td>
 <td>--&gt; <a href='XMP.html#Dimensions'>Dimensions Struct</a></td></tr>
-<tr>
+<tr class=b>
 <td>VideoFrameSizeH</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>VideoFrameSizeUnit</td>
 <td class=c title=' _ = Flattened'>string_</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>VideoFrameSizeW</td>
 <td class=c title=' _ = Flattened'>real_</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>VideoModDate</td>
 <td class=c>date</td>
 <td>&nbsp;</td></tr>
-<tr>
+<tr class=b>
 <td>VideoPixelAspectRatio</td>
 <td class=c>rational</td>
 <td>&nbsp;</td></tr>
-<tr class=b>
+<tr>
 <td>VideoPixelDepth</td>
 <td class=c>string</td>
 <td><table class=cols><tr>
@@ -7104,22 +7913,6 @@ XMP module for convenience.  (see <a href="http://www.w3.org/TR/SVG11/">http://w
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
-<h2><a name='RegionInfo'>XMP RegionInfo Struct</a></h2>
-<blockquote>
-<table class=frame><tr><td>
-<table class=inner cellspacing=1>
-<tr class=h><th>Field Name</th>
-<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
-<tr>
-<td>AppliedToDimensions</td>
-<td class=c>Dimensions</td>
-<td>--&gt; <a href='XMP.html#Dimensions'>Dimensions Struct</a></td></tr>
-<tr class=b>
-<td>RegionList</td>
-<td class=c title=' + = List'>MWG RegionStruct+</td>
-<td>--&gt; <a href='MWG.html#RegionStruct'>MWG RegionStruct Struct</a></td></tr>
-</table></td></tr></table></blockquote>
-
 <h2><a name='Area'>XMP Area Struct</a></h2>
 <blockquote>
 <table class=frame><tr><td>
@@ -7152,37 +7945,9 @@ XMP module for convenience.  (see <a href="http://www.w3.org/TR/SVG11/">http://w
 <td>&nbsp;</td></tr>
 </table></td></tr></table></blockquote>
 
-<h2><a name='KeywordInfo'>XMP KeywordInfo Struct</a></h2>
-<blockquote>
-<table class=frame><tr><td>
-<table class=inner cellspacing=1>
-<tr class=h><th>Field Name</th>
-<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
-<tr>
-<td>Hierarchy</td>
-<td class=c title=' + = List'>MWG KeywordStruct+</td>
-<td>--&gt; <a href='MWG.html#KeywordStruct'>MWG KeywordStruct Struct</a></td></tr>
-</table></td></tr></table></blockquote>
-
-<h2><a name='CollectionInfo'>XMP CollectionInfo Struct</a></h2>
-<blockquote>
-<table class=frame><tr><td>
-<table class=inner cellspacing=1>
-<tr class=h><th>Field Name</th>
-<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr>
-<tr>
-<td>CollectionName</td>
-<td class=c>string</td>
-<td>&nbsp;</td></tr>
-<tr class=b>
-<td>CollectionURI</td>
-<td class=c>string</td>
-<td>&nbsp;</td></tr>
-</table></td></tr></table></blockquote>
-
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Mar 25, 2013</i>
+<br><i>Last revised Feb 19, 2014</i>
 <p class=lf><a href='index.html'>&lt;-- ExifTool Tag Names</a></p>
 </body>
 </html>
@@ -24,34 +24,35 @@ The tables listed below give the names of all tags recognized by ExifTool.
 <a href='ICC_Profile.html'>ICC_Profile</a><br>
 <a href='PrintIM.html'>PrintIM</a><br>
 <a href='Photoshop.html'>Photoshop</a><br>
-<a href='Nikon.html'>Nikon</a><br>
-<a href='NikonCustom.html'>NikonCustom</a><br>
-<a href='NikonCapture.html'>NikonCapture</a><br>
-<a href='Olympus.html'>Olympus</a><br>
+<a href='Apple.html'>Apple</a><br>
 <a href='Canon.html'>Canon</a><br>
 <a href='CanonCustom.html'>CanonCustom</a><br>
 <a href='CanonVRD.html'>CanonVRD</a><br>
 <a href='Casio.html'>Casio</a><br>
-<a href='FLIR.html'>FLIR</a></td><td width='16%'>
+<a href='FLIR.html'>FLIR</a><br>
 <a href='FujiFilm.html'>FujiFilm</a><br>
 <a href='GE.html'>GE</a><br>
 <a href='HP.html'>HP</a><br>
-<a href='JVC.html'>JVC</a><br>
+<a href='JVC.html'>JVC</a></td><td width='16%'>
 <a href='Kodak.html'>Kodak</a><br>
 <a href='Leaf.html'>Leaf</a><br>
 <a href='Minolta.html'>Minolta</a><br>
+<a href='Nikon.html'>Nikon</a><br>
+<a href='NikonCustom.html'>NikonCustom</a><br>
+<a href='NikonCapture.html'>NikonCapture</a><br>
+<a href='Olympus.html'>Olympus</a><br>
 <a href='Panasonic.html'>Panasonic</a><br>
 <a href='Pentax.html'>Pentax</a><br>
 <a href='PhaseOne.html'>PhaseOne</a><br>
 <a href='Reconyx.html'>Reconyx</a><br>
-<a href='Ricoh.html'>Ricoh</a><br>
-<a href='Samsung.html'>Samsung</a><br>
 <a href='Sanyo.html'>Sanyo</a><br>
+<a href='Samsung.html'>Samsung</a><br>
+<a href='Ricoh.html'>Ricoh</a><br>
 <a href='Sigma.html'>Sigma</a><br>
 <a href='Sony.html'>Sony</a><br>
 <a href='SonyIDC.html'>SonyIDC</a><br>
-<a href='Unknown.html'>Unknown</a></td><td width='16%'>
-<a href='DNG.html'>DNG</a><br>
+<a href='Unknown.html'>Unknown</a><br>
+<a href='DNG.html'>DNG</a></td><td width='16%'>
 <a href='CanonRaw.html'>CanonRaw</a><br>
 <a href='KyoceraRaw.html'>KyoceraRaw</a><br>
 <a href='MinoltaRaw.html'>MinoltaRaw</a><br>
@@ -61,6 +62,7 @@ The tables listed below give the names of all tags recognized by ExifTool.
 <a href='FlashPix.html'>FlashPix</a><br>
 <a href='MPF.html'>MPF</a><br>
 <a href='Stim.html'>Stim</a><br>
+<a href='Scalado.html'>Scalado</a><br>
 <a href='Qualcomm.html'>Qualcomm</a><br>
 <a href='APP12.html'>APP12</a><br>
 <a href='AFCP.html'>AFCP</a><br>
@@ -68,8 +70,8 @@ The tables listed below give the names of all tags recognized by ExifTool.
 <a href='FotoStation.html'>FotoStation</a><br>
 <a href='PhotoMechanic.html'>PhotoMechanic</a><br>
 <a href='Microsoft.html'>Microsoft</a><br>
-<a href='GIMP.html'>GIMP</a></td><td width='16%'>
-<a href='MIE.html'>MIE</a><br>
+<a href='GIMP.html'>GIMP</a><br>
+<a href='MIE.html'>MIE</a></td><td width='16%'>
 <a href='Jpeg2000.html'>Jpeg2000</a><br>
 <a href='GIF.html'>GIF</a><br>
 <a href='BMP.html'>BMP</a><br>
@@ -77,6 +79,7 @@ The tables listed below give the names of all tags recognized by ExifTool.
 <a href='PNG.html'>PNG</a><br>
 <a href='MNG.html'>MNG</a><br>
 <a href='DjVu.html'>DjVu</a><br>
+<a href='DPX.html'>DPX</a><br>
 <a href='OpenEXR.html'>OpenEXR</a><br>
 <a href='MIFF.html'>MIFF</a><br>
 <a href='PGF.html'>PGF</a><br>
@@ -86,8 +89,8 @@ The tables listed below give the names of all tags recognized by ExifTool.
 <a href='PDF.html'>PDF</a><br>
 <a href='PostScript.html'>PostScript</a><br>
 <a href='ID3.html'>ID3</a><br>
-<a href='ITC.html'>ITC</a></td><td width='16%'>
-<a href='Ogg.html'>Ogg</a><br>
+<a href='ITC.html'>ITC</a><br>
+<a href='Ogg.html'>Ogg</a></td><td width='16%'>
 <a href='Vorbis.html'>Vorbis</a><br>
 <a href='FLAC.html'>FLAC</a><br>
 <a href='Theora.html'>Theora</a><br>
@@ -104,10 +107,11 @@ The tables listed below give the names of all tags recognized by ExifTool.
 <a href='Flash.html'>Flash</a><br>
 <a href='Real.html'>Real</a><br>
 <a href='RIFF.html'>RIFF</a><br>
-<a href='AIFF.html'>AIFF</a></td><td width='16%'>
+<a href='AIFF.html'>AIFF</a><br>
 <a href='ASF.html'>ASF</a><br>
-<a href='DICOM.html'>DICOM</a><br>
+<a href='DICOM.html'>DICOM</a></td><td width='16%'>
 <a href='HTML.html'>HTML</a><br>
+<a href='Torrent.html'>Torrent</a><br>
 <a href='EXE.html'>EXE</a><br>
 <a href='LNK.html'>LNK</a><br>
 <a href='Font.html'>Font</a><br>
@@ -182,11 +186,19 @@ find that some ExifTool tag names are different than expected.  The usual
 reason for this is to make the tag names more consistent across different
 types of meta information.  To determine a tag name, either consult this
 documentation or run <code>exiftool -s</code> on a file containing the information in
-question.
+question.</p>
+
+<p>(This documentation is the result of years of research, testing and reverse
+engineering, and is the most complete metadata tag list available anywhere
+on the internet.  It is provided not only for ExifTool users, but more
+importantly as a public service to help augment the collective knowledge,
+and is often used as a primary source of information in the development of
+other metadata software.  Please help keep this documentation as accurate
+and complete as possible, and feed back any new discoveries to the source.)
 </p>
 <hr>
 (This document generated automatically by Image::ExifTool::BuildTagLookup)
-<br><i>Last revised Apr 9, 2013</i>
+<br><i>Last revised Feb 18, 2014</i>
 <p class=lf><a href='../index.html'>&lt;-- Back to ExifTool home page</a></p>
 </body>
 </html>
@@ -13,6 +13,406 @@
 <p><b>Note:</b> This page gives the history of older exiftool versions.  See
 <a href="history.html">history.html</a> for the recent history.</p>
 
+<a name='v9.26'><b>Apr. 13, 2013 - Version 9.26</b></a>
+<ul>
+<li>Added read support for FLIR FFF and FPF images and decode more FLIR tags
+<li>Added some new Pentax LensType's and Nikon LensID's
+<li>Added a few new Panasonic ContrastMode values
+<li>Decode a number of Canon 6D tags
+<li>Allow CanonRaw tags to be written using "CIFF" as a group name
+<li>Improved decoding of Canon ColorData information for newer EOS models
+<li>Improved decoding of a number of Sony tags (thanks Jos Roost)
+<li>Removed index number from duplicate Composite TagID's in XML output
+<li>Fixed byte-order problem for a few Nikon D5200 and D7100 tags
+<li>Fixed incompatibility with old-style (pre-8.46) XMP user-defined structure
+    definitions
+</ul>
+
+<a name='v9.25'><b>Apr. 6, 2013 - Version 9.25</b></a> <span class=grn>(production release)</span>
+<ul>
+<li>Added read support for FLIR thermal image metadata in JPEG images
+<li>Added write support for DNG version 1.4 images
+<li>Added a new Pentax DriveMode value and a new Pentax LensType
+<li>Added two new Olympus CameraType values
+<li>Added print conversion for XMP Flash tags to provide alternate language
+    support
+<li>Decode a few more Nikon and Pentax tags
+<li>Decode more Sony tags (thanks Jos Roost)
+<li>Decode more Panasonic tags and changed decoding of others
+<li>Enhanced -j and -php options to work with -D, -H and -l
+<li>Improved German translations (thanks Herbert Kauer)
+<li>Patched decoding of QuickTime date/time tags to accommodate Samsung and Sony
+    cameras that use an incorrect time zero of 1970 instead of 1904.  This patch
+    will only work for videos produced before 2036, so hopefully Samsung and
+    Sony will fix this problem at their end before then (care to place a wager?)
+<li>Fixed issues when using "-wm cg" and writing metadata as a block
+<li>Fixed possible "division by zero" error when reading undefined XMP rational
+</ul>
+
+<a name='v9.24'><b>Mar. 23, 2013 - Version 9.24</b></a>
+<ul>
+<li>Added ability to overwrite plus append output files (-w+!)
+<li>Added support for Sigma X3F version 3.0 images
+<li>Added a few new values for some Pentax tags
+<li>Added a few new CanonModelID's
+<li>Decode Nikon D5100 and D5200 custom settings plus a few other Nikon tags
+<li>Allow the value for missing tags extracted with the -f option to be
+    configured via the API MissingTagValue setting (default is still "-")
+<li>Improved decoding of Sony LensSpec (again, thanks Jos Roost)
+<li>Fixed bug reading QuickTime extended-size atoms
+</ul>
+
+<a name='v9.23'><b>Mar. 10, 2013 - Version 9.23</b></a>
+<ul>
+<li>Added -W (-tagOut) and -Wext (-tagOutExt) options to allow multiple tags
+    to be extracted to separate output files from a single source file
+<li>Added append feature to -w (-w+)
+<li>Added ability to extract SoundFile from Ricoh RMETA
+<li>Added more SonyModelID and Sony LensType values and improved Sony LensType
+    decoding (thanks Jos Roost)
+<li>Added a new Olympus LensType (thanks Niels Kristian Bech Jensen)
+<li>Added another Pentax LensType
+<li>Decode more Nikon flash information (thanks Alyda Gilmore for the samples)
+<li>Decode Pentax Kelvin white balance tags (thanks Klaus Homeister)
+<li>Extract PDF embedded image color space
+<li>Improved Spanish translations (thanks Emilio Sancha)
+<li>More patches to avoid "APP1 segment too large" errors when copying all tags
+    from some RAW images
+</ul>
+
+<a name='v9.22'><b>Mar. 2, 2013 - Version 9.22</b></a>
+<ul>
+<li>Fixed problem extracting metadata from encrypted embedded JPEG images in PDF
+    files and added the ability to extract JPEG 2000 information too
+</ul>
+
+<a name='v9.21'><b>Mar. 2, 2013 - Version 9.21</b></a>
+<ul>
+<li>Added ability to extract embedded images and their metadata from PDF files
+<li>Added read support for binary-format PLIST files
+<li>Added support for Sigma DP3 Merrill maker notes
+<li>Added a few new Sigma LensType values
+<li>Added a new FujiFilm PictureMode value
+<li>Decode a number of new Pentax tags (thanks Klaus Homeister)
+<li>Decode more Sony tags (thanks Jos Roost)
+<li>Decode some new Nikon D800 tags (thanks Alyda Gilmore for the samples)
+<li>Decode a number of new tags in 3GP videos
+<li>Decode Pentax CameraType
+<li>Made a few more DNG tags writable (but protected)
+<li>Fixed problem reading XREF table of some PDF files
+<li>API Changes:
+    <ul>
+    <li>The CombineInfo() routine is now deprecated because it is likely that
+        nobody ever used it.  If anyone actually uses this, please let me know
+    </ul>
+</li>
+</ul>
+
+<a name='v9.20'><b>Feb. 20, 2013 - Version 9.20</b></a>
+<ul>
+<li>NOTICE: This release fixes a problem in the 9.19 Windows version that could
+    cause ExifTool to crash when writing metadata to some files  (it seems that
+    one of the files in the 9.19 Windows package was corrupted)
+<li>Added a new PentaxModelID
+<li>Added write support for a few Getty Images XMP tags
+<li>Decode Sony AFAreaModeSetting (thanks Jos Roost)
+</ul>
+
+<a name='v9.19'><b>Feb. 20, 2013 - Version 9.19</b></a>
+<ul>
+<li>Added read support for Phase One IIQ maker notes
+<li>Added a couple of new Minolta Teleconverter values
+<li>Patched problem which could result in runtime warning when extracting
+    information from a file with an incorrectly formatted PreviewImage pointer
+<li>Improved handling of unknown maker notes when writing to reduce the chance
+    of corruption (fixes problem of corrupted SilverFast maker notes)
+<li>Fixed bug in HtmlDump where unused bytes at end of MakerNotes were not shown
+    if they came at the end of a TIFF-format file
+</ul>
+
+<a name='v9.18'><b>Feb. 16, 2013 - Version 9.18</b></a>
+<ul>
+<li>Decode more AF information for Sony SLT models (thanks Andy Johnson for the
+    samples)
+<li>Recognize CameraInfo and ColorData information from newer Canon 1DX firmware
+<li>Organized support files in full Perl distribution into separate directories
+<li>Improved German and Spanish translations (thanks Herbert Kauer and Emilio
+    Sancha)
+<li>Fixed inconsistency where a priority tag could be hidden by a same-named tag
+    in the same group when using the -j or -X option combined with -g or -G
+<li>Fixed problem in standard tests that could cause ExifTool test 25 to fail
+</ul>
+
+<a name='v9.17'><b>Feb. 9, 2013 - Version 9.17</b></a>
+<ul>
+<li>Added PLIST and MODD to the list of supported file extensions
+<li>Added track name to UserData tags within QuickTime tracks
+<li>Added a new Pentax LensType (thanks Pietu Pohjalainen)
+<li>Added a new Canon LensType
+<li>Decode binary data in PLIST and MODD files
+<li>Decode new Canon 1DX CustomFunctions
+<li>Issue a minor warning and ignore duplicate PDF Info dictionaries unless the
+    -m option is used
+<li>Improved date/time parsing when writing to allow single-digit fields
+<li>Improved decoding/naming of a few Sony tags (thanks Jos Roost)
+<li>Improved German translations (thanks Herbert Kauer)
+<li>Changed a few PLIST tag names
+<li>Fixed decoding of Olympus CameraType for some models
+<li>Fixed problem calculating AvgBitrate for some video files
+<li>Fixed problem writing Canon:LensSerialNumber
+</ul>
+
+<a name='v9.16'><b>Feb. 2, 2013 - Version 9.16</b></a>
+<ul>
+<li>Added support for DarwinCore XMP tags
+<li>Added support for CinemaDNG tags
+<li>Added basic support for parsing XML PLIST information, and use this to
+    extract tags from QuickTime iTunesInfo Data
+<li>Added a new Pentax lens (thanks Niels Kristian Bech Jensen)
+<li>Added some new Sony E-mount lenses (thanks Jos Roost)
+<li>Added a new NEFBitDepth value (thanks Jos Roost)
+<li>Added a new CanonModelID
+<li>Decode a few more Sony tags (thanks Jos Roost)
+<li>Improved decoding of QuickTime iTunesInfo tags
+<li>Improved Spanish translations (thanks Emilio Sancha)
+<li>Improved handling of errors in Perl expression of new formatting feature
+<li>Improved -p option to also handle structures
+<li>Changed a number of Sigma lens names for Olympus to conform with official
+    Sigma model names (thanks Niels Kristian Bech Jensen)
+<li>Moved the MWG XMP tags documentation to the MWG page
+<li>Patched to allow reading GPX track logs with no version number
+<li>Fixed problem reading an ID3 POPM frame with a missing counter
+<li>Fixed bug which could cause "uninitialized value" runtime warning when
+    reading Nikon maker notes with an empty RetouchHistory
+<li>API Changes:
+    <ul>
+    <li>Compatibility Notice: The MWG Composite tags are no longer automatically
+        loaded just by using the MWG module.  Image::ExifTool::MWG::Load() must
+        now be called explicitly to load these tags
+    </ul>
+</ul>
+
+<a name='v9.15'><b>Jan. 27, 2013 - Version 9.15</b></a>
+<ul>
+<li>Added advanced formatting feature to -p and -tagsFromFile options
+<li>Added -echo3 and -echo4 options
+<li>Added a few more Olympus LensType values, removed one, changed some lens
+    names for consistency (all thanks Niels Kristian Bech Jensen), and use
+    hexadecimal instead of decimal for numerical LensType values
+<li>Added a number of new Sony E-mount lenses
+<li>Added a new Tamron lens for Sony (thanks Marcin Krol)
+<li>Trim trailing spaces from Panasonic LensType strings
+<li>Fixed bug which could cause "Can't call method GetMarkerPointers" runtime
+    warning when writing certain types of corrupted images
+<li>Fixed problem copying PrevewImage from some corrupted files
+<li>Fixed problem identifying a Sigma lens for Nikon at some focal lengths 
+<li>API Changes:
+    <ul>
+    <li>Added AddUserDefinedTags() method
+    <li>Added formatting feature for tag values in SetNewValuesFromFile()
+    </ul>
+</ul>
+
+<a name='v9.14'><b>Jan. 18, 2013 - Version 9.14</b></a>
+<ul>
+<li>Added -wm (-writeMode) option to provide control over tag write/create mode
+<li>Added ability to use wildcards in target tag names when writing
+<li>Added ability to read/write Jpeg2000 XML tag as a block
+<li>Added ability to delete MPF segment (with -MPF:All=)
+<li>Added a number of new Olympus lenses (thanks Niels Kristian Bech Jensen)
+<li>Added a new Nikon LensID (thanks Robert Rottmerhusen)
+<li>Added a number of new Pentax LensType's (thanks Alan Robinson for one)
+<li>Added a few new CanonModelID's and Canon LensType's
+<li>Decode ID3v2 POPM and OWNE frames
+<li>Decode new Canon 6D CustomFunctions
+<li>Improved calculation of ScaleFactor35efl for Canon cameras
+<li>Changed priority of PDF Info tags so tags from most recent Info dictionary
+    take precedence (to partially accomodate the questionable Acrobat Pro
+    incremental update technique)
+<li>Changed some verbose warnings when attempting to write "unsafe" tags
+<li>Changed behaviour so that "unsafe" tags are not copied for any tag specified
+    using a wildcard (previously this was the behaviour for a tag name of 'all'
+    or '*', but not names like 'gps*')
+<li>Fixed bug where a Composite tag could sometimes not be generated when the
+    -struct option was used if the tag was derived from an XMP List-type tag
+<li>Fixed problem conditionally deleting GIF Comment and MIE tags
+<li>Fixed decoding of RawImageWidth/Height from FujiFilm X-E1 RAF images
+<li>API Changes:
+    <ul>
+    <li>Added WriteMode option
+    </ul>
+</ul>
+
+<a name='v9.13'><b>Jan. 10, 2013 - Version 9.13</b></a> <span class=grn>(production release)</span>
+<ul>
+<li>Added basic validation of ExifVersion and FlashpixVersion tags when writing
+<li>Fixed problem where MPF PreviewImage was lost when editing metadata in JPEG
+    images from the Nikon D4, D600 or D800
+</ul>
+
+<a name='v9.12'><b>Jan. 2, 2013 - Version 9.12</b></a> <span class=grn>(production release)</span>
+<ul>
+<li>Fixed problem introduced in 9.10 preserving file modification date/time when
+    some options are used
+</ul>
+
+<a name='v9.11'><b>Jan. 2, 2013 - Version 9.11</b></a> <span class=grn>(production release)</span>
+<ul>
+<li>Improved decoding of some Sony tags
+<li>Changed 3 tag names to avoid a leading digit to fix XML validation problem
+<li>Fixed bug introduced in 9.04 that could double-encipher some Sony MakerNote
+    information when writing (affected files are fixed by writing any tag with
+    ExifTool 9.11)
+</ul>
+
+<a name='v9.10'><b>Dec. 29, 2012 - Version 9.10</b></a>
+<ul>
+<li>Added write support for a few new XMP-crs and XMP-photomech tags
+<li>Added a new Samsung LensType (thanks Jaroslav Stepanek)
+<li>Added a new Pentax LensType (thanks Helmut Sch&uuml;tz)
+<li>Added a new Canon LensType
+<li>Decode Sony A99 FocusMode (thanks Michael Tapes for the samples)
+<li>Tolerate (but warn about) up to 4 bytes of garbage at start of EXIF segment
+<li>Changed -P option to also preserve FileCreateDate on Windows (requires
+    Win32API::File::Time)
+<li>Changed "[minor]" warning messages to capitalize the "M" (ie. "[Minor]") if
+    processing is affected when the warning is ignored
+<li>Patched to avoid problem of slow processing with some corrupted EXIF
+</ul>
+
+<a name='v9.09'><b>Dec. 15, 2012 - Version 9.09</b></a>
+<ul>
+<li>Added a few new Google XMP GPano tags
+<li>Added a new Olympus CameraType
+<li>Added a couple of new Minolta LensTypes
+<li>Added two new Nikon LensID's (thanks David P&uuml;schel and Robert
+    Rottmerhusen)
+<li>Decode Nikon D7000 AFPointsUsed and make this tag writable
+<li>Decode a new Olympus tag (thanks Christoph Anton Mitterer)
+<li>Renamed one of the FujiFilm RAF RawImageWidth/Height pairs to
+    RawImageFullWidth/Height
+<li>Changed -stay_open when combined with -q to flush output after each command
+    (as already done without -q) (requires IO::Handle)
+<li>Fixed problem shifting FileCreateDate when writing other "real" tags in the
+    same command
+</ul>
+
+<a name='v9.08'><b>Nov. 26, 2012 - Version 9.08</b></a>
+<ul>
+<li>Fixed bug introduced in 9.07 that broke writing of FileModifyDate
+</ul>
+
+<a name='v9.07'><b>Nov. 24, 2012 - Version 9.07</b></a>
+<ul>
+<li>Added ability to read/write FileCreateDate (Windows only)
+<li>Added ability to read FileInodeChangeDate (non-Windows only)
+<li>Added support for new tags in DNG 1.4 specification
+<li>Added support for Google Photosphere GPano XMP tags
+<li>Added a couple of new Olympus filter effects
+<li>Changed a Panasonic LensType (thanks Olaf Ulrich)
+<li>API Changes:
+    <ul>
+    <li>Enhanced SetFileModifyDate() to write FileCreateDate (Windows only)
+    </ul>
+</ul>
+
+<a name='v9.06'><b>Nov. 17, 2012 - Version 9.06</b></a>
+<ul>
+<li>Added support for Nikon maker notes in images from any camera make (as
+    written by Capture NX2)
+<li>Added support for FujiFilm X-E1 RAF images
+<li>Added a new Olympus CameraType
+<li>Added a new PentaxModelID and a new Pentax LensType
+<li>Extract FileCreateDate (Windows) and FileInodeChangeDate (other systems)
+<li>Fixed bug decoding UTF-16 ID3 synchronized lyrics
+</ul>
+
+<a name='v9.05'><b>Nov. 10, 2012 - Version 9.05</b></a>
+<ul>
+<li>Added ability to read APE metadata from MP3 audio files
+<li>Decode ID3 synchronized lyrics/text information
+<li>Decode maker notes in Leica V-LUX40 MP4 videos
+<li>Decode Sony A99 AFPointSelected (thanks Michael Tapes for the samples)
+<li>Improved decoding of some Sony tags (thanks Jos Roost)
+<li>API Changes:
+    <ul>
+    <li>Removed GeoNoInterpolate option (just set GeoMaxIntSecs to 0 instead)
+    </ul>
+</ul>
+
+<a name='v9.04'><b>Nov. 3, 2012 - Version 9.04</b></a> <span class=grn>(production release)</span>
+<ul>
+<li>Added two new Sony LensType values (thanks Matthias Paul)
+<li>Added a few new Canon LensType values
+<li>Added a couple of new PentaxModelID's and decode some new K-5 II values
+<li>Added support for some new XMP tags written by the Apple iPhone 5
+<li>Added a new Olympus CameraType
+<li>Decode more Sony tags/values (thanks Jos Roost)
+<li>Decode Nikon HDRInfo (thanks Stefan)
+<li>Decode some FlashInfo tags for new Nikon models
+<li>Decode a few WM ID3 tags (some documentation on these would be nice)
+<li>Fixed bug which could cause truncated/garbage ID3v2 strings to be returned
+<li>Fixed -globalTimeShift option to also work when copying tags
+<li>Fixed decoding of Nikon AFFineTuneAdj for FirmwareVersion 1.10B (thanks
+    Michael Tapes for the samples for this and the A77)
+<li>Fixed problem where a few tags (FileSequence, NewGUID and Now) were not
+    available for use with the -p option
+<li>API Changes:
+    <ul>
+    <li>Added RequestAll and GeoNoInterpolate options
+    <li>Fixed problem in SetNewValue when setting the Raw value of some tags
+    </ul>
+</ul>
+
+<a name='v9.03'><b>Oct. 13, 2012 - Version 9.03</b></a>
+<ul>
+<li>Added new feature to provide control over directory levels in %d strings
+<li>Added ability to write OtherImage in NEF images
+<li>Added a new Pentax LensType
+<li>Added a few new CanonModelID's (thanks Laurent Clevy)
+<li>Added a new Nikon LensID (thanks Geert De Soete)
+<li>Added a few new Olympus CameraType values
+<li>Decode some new CameraInfo tags for the Canon EOS 650D
+<li>Decode a number of new Sony tags (thanks Jos Roost)
+<li>Improved decoding of some Sigma tags for the DP1/DP2 Merrill
+<li>Give priority to EXIF tags over SigmaRaw tags X3F images
+<li>Changed Samsung lens names to include "NX" (thanks Jaroslav Stepanek)
+<li>Fixed misleading verbose "TAG is not writable" messages when copying
+    list-type tags
+<li>API Changes:
+    <ul>
+    <li>Enhanced GetValue() to allow return of 'Rational' value
+    </ul>
+</ul>
+
+<a name='v9.02'><b>Sept. 6, 2012 - Version 9.02</b></a>
+<ul>
+<li>Added a new Nikon LensID (thanks Joseph Heled)
+<li>Added a new EXIF SubFileType value used in DNG images
+<li>Added write support for Apple Adjustment Settings XMP tags (XMP-aas)
+<li>Added a couple of new Samsung LensType values (thanks Jaroslav Stepanek)
+<li>Added a couple of new Canon LensType values and a new CanonModelID
+<li>Decode a number of new Sony tags (thanks Jos Roost)
+<li>Enhanced "-o -" feature to allow output file type to be specified
+<li>Extract last file access time as FileAccessDate
+<li>Allow tags to be set from files which are zero bytes in size
+<li>Made ProfileHueSatMap tags Binary if they are too long
+<li>Changed names of some PanasonicRaw DistortionInfo tags
+<li>Changed decoding for a Sony ExposureMode value
+<li>Fixed hang/crash that could occur when writing to an image with corrupted
+    Sony MoreInfo data (ie. SLT-A55V JPEG corrupted by GIMP)
+</ul>
+
+<a name='v9.01'><b>Aug. 25, 2012 - Version 9.01</b></a> <span class=grn>(production release)</span>
+<ul>
+<li>Added a couple of new CanonModelID values
+<li>Added a couple of new Canon LensType values (thanks Pascal de Bruijn)
+<li>Added a new PentaxModelID and a few new Pentax PictureMode values
+<li>Decode a new Pentax ISO tag
+<li>Improved -listx output for XMP structure tags
+<li>Fixed "unexpected end of file" problems with some compressed MIE files
+</ul>
+
 <a name='v9.00'><b>Aug. 18, 2012 - Version 9.00</b></a>
 <ul>
 <li>Added support for PDF encryption V5.6 (new in Adobe Reader X)
@@ -469,6 +869,7 @@
 <li>Added ability to specify internal encoding of EXIF "ASCII" strings and
     QuickTime strings
 <li>Added a new DigiKam XMP tag
+<li>Documented -echo option (has been an undocumented feature since 6.86)
 <li>Decode a number of new Sony tags
 <li>Decode a few new Pentax tags and added a few new values
 <li>Decode a few new QuickTime and ID3 tags
@@ -2196,7 +2597,7 @@
     <li>ch_s  (thanks Haibing Zhong) [renamed 'zh_cn' in 7.75]
     <li>cz    (thanks Petr Mich&aacute;lek) [renamed 'cs' in 7.68]
     <li>de    (thanks Jens Duttke)
-    <li>en_ca (for those of us who like to see "colour" to be spelled properly)
+    <li>en_ca (for those of us who like to see "colour" spelled properly)
     <li>en_gb (correct "colour" plus a few other quirks)
     <li>es    (thanks Santiago del Br&iacute;o Gonz&aacute;lez)
     <li>fr    (thanks Bernard Guillotin)
@@ -6,15 +6,15 @@
 </head>
 <body>
 <pre>
-<span class='com'>#------------------------------------------------------------------------------
+<span class=com>#------------------------------------------------------------------------------
 # File:         ExifTool_config  --&gt;  ~/.ExifTool_config
 #
 # Description:  Sample user configuration file for Image::ExifTool
 #
 # Notes:        This example file shows how to define your own shortcuts and
 #               add new EXIF, IPTC, XMP, PNG, MIE and Composite tags, as well
-#               as how to specify preferred lenses for the LensID tag and
-#               define default values for ExifTool options.
+#               as how to specify preferred lenses for the LensID tag, and
+#               define new file types and default ExifTool option values.
 #
 #               Note that unknown tags may be extracted even if they aren't
 #               defined, but tags must be defined to be written.  Also note
@@ -30,10 +30,10 @@
 #               run.  Your home directory is determined by the first defined of
 #               the following environment variables:
 #
-#                   1. EXIFTOOL_HOME
-#                   2. HOME
-#                   3. HOMEDRIVE + HOMEPATH
-#                   4. (the current directory)
+#                   1.  EXIFTOOL_HOME
+#                   2.  HOME
+#                   3.  HOMEDRIVE + HOMEPATH
+#                   4.  (the current directory)
 #
 #               Alternatively, the -config option of the exiftool application
 #               may be used to load a specific configuration file (note that
@@ -73,74 +73,87 @@
     MyAlias =&gt; 'FocalLengthIn35mmFormat',
 );
 
-<span class='com'># NOTE: All tag names used in the following tables are case sensitive.
+<span class=com># NOTE: All tag names used in the following tables are case sensitive.
 
 # The %Image::ExifTool::UserDefined hash defines new tags to be added
 # to existing tables.</span>
 %Image::ExifTool::UserDefined = (
-    <span class='com'># All EXIF tags are added to the Main table, and WriteGroup is used to
+    <span class=com># All EXIF tags are added to the Main table, and WriteGroup is used to
     # specify where the tag is written (default is ExifIFD if not specified):</span>
     'Image::ExifTool::Exif::Main' =&gt; {
+        <span class=com># Example 1.  EXIF:NewEXIFTag</span>
         0xd000 =&gt; {
             Name =&gt; 'NewEXIFTag',
             Writable =&gt; 'int16u',
             WriteGroup =&gt; 'IFD0',
         },
-        <span class='com'># add more user-defined EXIF tags here...</span>
+        <span class=com># add more user-defined EXIF tags here...</span>
     },
-    <span class='com'># the <a href="geotag.html">Geotag feature</a> writes these additional GPS tags if available:</span>
+    <span class=com># the <a href="geotag.html">Geotag feature</a> writes these additional GPS tags if available:</span>
     'Image::ExifTool::GPS::Main' =&gt; {
+        <span class=com># Example 2.  GPS:GPSPitch</span>
         0xd000 =&gt; {
             Name =&gt; 'GPSPitch',
             Writable =&gt; 'rational64s',
         },
+        <span class=com># Example 3.  GPS:GPSRoll</span>
         0xd001 =&gt; {
             Name =&gt; 'GPSRoll',
             Writable =&gt; 'rational64s',
         },
     },
-    <span class='com'># IPTC tags are added to a specific record type (ie. application record):
+    <span class=com># IPTC tags are added to a specific record type (ie. application record):
     # (Note: IPTC tag ID's are limited to the range 0-255)</span>
     'Image::ExifTool::IPTC::ApplicationRecord' =&gt; {
-        240 =&gt; {
+        <span class=com># Example 4.  IPTC:NewIPTCTag</span>
+        160 =&gt; {
             Name =&gt; 'NewIPTCTag',
             Format =&gt; 'string[0,16]',
         },
-        <span class='com'># add more user-defined IPTC ApplicationRecord tags here...</span>
+        <span class=com># add more user-defined IPTC ApplicationRecord tags here...</span>
     },
-    <span class='com'># XMP tags may be added to existing namespaces:</span>
+    <span class=com># XMP tags may be added to existing namespaces:</span>
     'Image::ExifTool::XMP::xmp' =&gt; {
+        <span class=com># Example 5.  XMP-xmp:NewXMPxmpTag</span>
         NewXMPxmpTag =&gt; { Groups =&gt; { 2 =&gt; 'Author' } },
-        <span class='com'># add more user-defined XMP-xmp tags here...</span>
+        <span class=com># add more user-defined XMP-xmp tags here...</span>
     },
-    <span class='com'># special Geotag tags for XMP-exif:</span>
+    <span class=com># special Geotag tags for XMP-exif:</span>
     'Image::ExifTool::XMP::exif' =&gt; {
+        <span class=com># Example 6.  XMP-exif:GPSPitch</span>
         GPSPitch =&gt; { Writable =&gt; 'rational', Groups =&gt; { 2 =&gt; 'Location' } },
+        <span class=com># Example 7.  XMP-exif:GPSRoll</span>
         GPSRoll  =&gt; { Writable =&gt; 'rational', Groups =&gt; { 2 =&gt; 'Location' } },
     },
-    <span class='com'># new XMP namespaces (ie. xxx) must be added to the Main XMP table:</span>
+    <span class=com># new XMP namespaces (ie. xxx) must be added to the Main XMP table:</span>
     'Image::ExifTool::XMP::Main' =&gt; {
-        xxx =&gt; { <span class='com'># &lt;-- must be the same as the NAMESPACE prefix</span>
+        <span class=com># namespace definition for examples 8 to 11</span>
+        xxx =&gt; { <span class=com># &lt;-- must be the same as the NAMESPACE prefix</span>
             SubDirectory =&gt; {
                 TagTable =&gt; 'Image::ExifTool::UserDefined::xxx',
-                <span class='com'># (see the definition of this table below)</span>
+                <span class=com># (see the definition of this table below)</span>
             },
         },
-        <span class='com'># add more user-defined XMP namespaces here...</span>
+        <span class=com># add more user-defined XMP namespaces here...</span>
     },
-    <span class='com'># new PNG tags are added to the PNG::TextualData table:</span>
+    <span class=com># new PNG tags are added to the PNG::TextualData table:</span>
     'Image::ExifTool::PNG::TextualData' =&gt; {
+        <span class=com># Example 12.  PNG:NewPngTag1</span>
         NewPngTag1 =&gt; { },
+        <span class=com># Example 13.  PNG:NewPngTag2</span>
         NewPngTag2 =&gt; { },
+        <span class=com># Example 14.  PNG:NewPngTag3</span>
         NewPngTag3 =&gt; { },
     },
-    <span class='com'># add a new MIE tag (MieTag1) and group (MIE-Test) to MIE-Meta
+    <span class=com># add a new MIE tag (NewMieTag1) and group (MIE-Test) to MIE-Meta
     # (Note: MIE group names must NOT end with a number)</span>
     'Image::ExifTool::MIE::Meta' =&gt; {
+        <span class=com># Example 15.  MIE-Meta:NewMieTag1</span>
         NewMieTag1 =&gt; {
             Writable =&gt; 'rational64u',
             Units =&gt; [ 'cm', 'in' ],
         },
+        <span class=com># new MIE "Test" group for example 16</span>
         Test =&gt; {
             SubDirectory =&gt; {
                 TagTable =&gt; 'Image::ExifTool::UserDefined::MIETest',
@@ -148,9 +161,9 @@
             },
         },
     },
-    <span class='com'># Composite tags are added to the Composite table:</span>
+    <span class=com># Composite tags are added to the Composite table:</span>
     'Image::ExifTool::Composite' =&gt; {
-        <span class='com'># Composite tags are unique:  The Require/Desire elements specify
+        <span class=com># Composite tags are unique:  The Require/Desire elements specify
         # tags that must/may exist, and the keys of these hashes are used as
         # indices in the @val array of the ValueConv expression to access
         # the numerical (-n) values of these tags.  All Require'd tags must
@@ -162,10 +175,10 @@
             Require =&gt; {
                 0 =&gt; 'FileName',
             },
-            <span class='com'># remove the extension from FileName</span>
-            ValueConv =&gt; 'my $name=$val[0]; $name=~s/\..*?$//; $name',
+            <span class=com># remove the extension from FileName</span>
+            ValueConv =&gt; '$val[0] =~ /(.*)\./ ? $1 : $val[0]',
         },
-        <span class='com'># the next few examples demonstrate simplifications which may be
+        <span class=com># the next few examples demonstrate simplifications which may be
         # used if only one tag is Require'd or Desire'd:
         # 1) the Require lookup may be replaced with a simple tag name
         # 2) "$val" may be used to represent "$val[0]" in the expression</span>
@@ -173,20 +186,20 @@
             Require =&gt; 'FileName',
             ValueConv =&gt; '$val=~/\.([^.]*)$/; $1',
         },
-        <span class='com'># override CircleOfConfusion tag to use D/1750 instead of D/1440</span>
+        <span class=com># override CircleOfConfusion tag to use D/1750 instead of D/1440</span>
         CircleOfConfusion =&gt; {
             Require =&gt; 'ScaleFactor35efl',
             Groups =&gt; { 2 =&gt; 'Camera' },
             ValueConv =&gt; 'sqrt(24*24+36*36) / ($val * 1750)',
-            <span class='com'># an optional PrintConv may be used to format the value</span>
+            <span class=com># an optional PrintConv may be used to format the value</span>
             PrintConv =&gt; 'sprintf("%.3f mm",$val)',
         },
-        <span class='com'># generate a description for this file type</span>
+        <span class=com># generate a description for this file type</span>
         FileTypeDescription =&gt; {
             Require =&gt; 'FileType',
             ValueConv =&gt; 'GetFileType($val,1) || $val',
         },
-        <span class='com'># calculate physical image size based on resolution</span>
+        <span class=com># calculate physical image size based on resolution</span>
         PhysicalImageSize => {
             Require => {
                 0 => 'ImageWidth',
@@ -196,29 +209,29 @@
                 4 => 'ResolutionUnit',
             },
             ValueConv => '$val[0]/$val[2] . " " . $val[1]/$val[3]',
-            <span class='com'># (the @prt array contains print-formatted values)</span>
+            <span class=com># (the @prt array contains print-formatted values)</span>
             PrintConv => 'sprintf("%.1fx%.1f $prt[4]", split(" ",$val))',
         },
-        <span class='com'># [advanced] select largest JPEG preview image</span>
+        <span class=com># [advanced] select largest JPEG preview image</span>
         BigImage => {
             Desire => {
                 0 => 'JpgFromRaw',
                 1 => 'PreviewImage',
                 2 => 'OtherImage',
-                <span class='com'># (DNG and A100 ARW may be have 2 PreviewImage's)</span>
+                <span class=com># (DNG and A100 ARW may be have 2 PreviewImage's)</span>
                 3 => 'PreviewImage (1)',
             },
-            <span class='com'># ValueConv may also be a code reference
+            <span class=com># ValueConv may also be a code reference
             # Inputs: 0) reference to list of values, 1) ExifTool object</span>
             ValueConv => sub {
                 my $val = shift;
                 my ($image, $bigImage, $len, $bigLen);
                 foreach $image (@$val) {
                     next unless ref $image eq 'SCALAR';
-                    <span class='com'># check for JPEG image (or "Binary data" if -b not used)</span>
+                    <span class=com># check for JPEG image (or "Binary data" if -b not used)</span>
                     next unless $$image =~ /^(\xff\xd8\xff|Binary data (\d+))/;
-                    $len = $2 || length $$image; <span class='com'># get image length</span>
-                    <span class='com'># save largest image</span>
+                    $len = $2 || length $$image; <span class=com># get image length</span>
+                    <span class=com># save largest image</span>
                     next if defined $bigLen and $bigLen >= $len;
                     $bigLen = $len;
                     $bigImage = $image;
@@ -229,7 +242,7 @@
     },
 );
 
-<a name='xmp-xxx'><span class='com'># This is a basic example of the definition for a new XMP namespace.
+<a name='xmp-xxx'><span class=com># This is a basic example of the definition for a new XMP namespace.
 # This table is referenced through a SubDirectory tag definition
 # in the %Image::ExifTool::UserDefined definition above.
 # The namespace prefix for these tags is 'xxx', which corresponds to
@@ -238,25 +251,29 @@
     GROUPS =&gt; { 0 =&gt; 'XMP', 1 =&gt; 'XMP-xxx', 2 =&gt; 'Image' },
     NAMESPACE =&gt; { 'xxx' =&gt; 'http://ns.myname.com/xxx/1.0/' },
     WRITABLE =&gt; 'string',
-    <span class='com'># replace "NewXMPxxxTag1" with your own tag name (ie. "MyTag")</span>
+    <span class=com># replace "NewXMPxxxTag1" with your own tag name (ie. "MyTag")</span>
+    <span class=com># Example 8.  XMP-xxx:NewXMPxxxTag1</span>
     NewXMPxxxTag1 =&gt; { Writable => 'lang-alt' },
+    <span class=com># Example 9.  XMP-xxx:NewXMPxxxTag2</span>
     NewXMPxxxTag2 =&gt; { Groups =&gt; { 2 =&gt; 'Author' } },
+    <span class=com># Example 10.  XMP-xxx:NewXMPxxxTag3</span>
     NewXMPxxxTag3 =&gt; { List =&gt; 'Bag' },
-    <span class='com'># example structured XMP tag</span>
+    <span class=com># example structured XMP tag</span>
     NewXMPxxxStruct => {
-        <span class='com'># the "Struct" entry defines the structure fields</span>
+        <span class=com># the "Struct" entry defines the structure fields</span>
+        <span class=com># Example 11.  XMP-xxx:NewXMPxxxStruct</span>
         Struct =&gt; {
-            <span class='com'># optional namespace prefix and URI for structure fields
+            <span class=com># optional namespace prefix and URI for structure fields
             # (required only if different than NAMESPACE above)</span>
             NAMESPACE =&gt; { 'test' =&gt; 'http://x.y.z/test/' },
-            <span class='com'># optional structure name (used for warning messages only)</span>
+            <span class=com># optional structure name (used for warning messages only)</span>
             STRUCT_NAME =&gt; 'MyStruct',
-            <span class='com'># optional rdf:type property for the structure</span>
+            <span class=com># optional rdf:type property for the structure</span>
             TYPE =&gt; 'http://x.y.z/test/xystruct',
-            <span class='com'># structure fields (very similar to tag definitions)</span>
+            <span class=com># structure fields (very similar to tag definitions)</span>
             X =&gt; { Writable =&gt; 'integer' },
             Y =&gt; { Writable =&gt; 'integer' },
-            <span class='com'># a nested structure...</span>
+            <span class=com># a nested structure...</span>
             Things =&gt; {
                 List =&gt; 'Bag',
                 Struct =&gt; {
@@ -266,9 +283,9 @@
                 },
             },
         },
-        List =&gt; 'Seq', <span class='com'># structures may also be elements of a list</span>
+        List =&gt; 'Seq', <span class=com># structures may also be elements of a list</span>
     },
-<span class='com'>    # Each field in the structure has an automatically-generated
+<span class=com>    # Each field in the structure has an automatically-generated
     # corresponding flattened tag with an ID that is the concatenation
     # of the original structure tag ID and the field name (after
     # capitalizing the first letter of the field name if necessary).
@@ -279,32 +296,55 @@
     NewXMPxxxStructX => { Name => 'SomeOtherName', Flat => 1 },
 );
 
-<span class='com'># Adding a new MIE group requires a few extra definitions</span>
+<span class=com># Adding a new MIE group requires a few extra definitions</span>
 use Image::ExifTool::MIE;
 %Image::ExifTool::UserDefined::MIETest = (
-    %Image::ExifTool::MIE::tableDefaults,   <span class='com'># default MIE table entries</span>
+    %Image::ExifTool::MIE::tableDefaults,   <span class=com># default MIE table entries</span>
     GROUPS      =&gt; { 0 =&gt; 'MIE', 1 =&gt; 'MIE-Test', 2 =&gt; 'Document' },
     WRITE_GROUP =&gt; 'MIE-Test',
-    NewMieTag2  =&gt; { },     <span class='com'># new user-defined tag in MIE-Test group</span>
+    <span class=com># Example 16.  MIE-Test:NewMieTag2</span>
+    NewMieTag2  =&gt; { },     <span class=com># new user-defined tag in MIE-Test group</span>
 );
 
-<span class='com'># A special 'Lenses' list can be defined to give priority to specific lenses
+<span class=com># A special 'Lenses' list can be defined to give priority to specific lenses
 # in the logic to determine a lens model for the Composite:LensID tag</span>
 @Image::ExifTool::UserDefined::Lenses = (
     'Sigma AF 10-20mm F4-5.6 EX DC',
     'Tokina AF193-2 19-35mm f/3.5-4.5',
 );
 
-<span class='com'># Specify default ExifTool option values
+<span class=com># User-defined file types to recognize</span>
+%Image::ExifTool::UserDefined::FileTypes = (
+    XXX =&gt; { <span class=com># &lt;-- the extension of the new file type</span>
+        <span class=com># BaseType specifies the format upon which this file is based.
+        # If BaseType is defined, then the file will be fully supported,
+        # and in this case the Magic pattern should not be defined</span>
+        BaseType =&gt; 'TIFF',
+        MIMEType =&gt; 'image/x-xxx',  <span class=com># (defaults to 'application/unknown')</span>
+        Description =&gt; 'My XXX file type',
+    },
+    YYY =&gt; {
+        <span class=com># without BaseType, the file will be recognized but not supported</span>
+        Magic =&gt; '0123abcd',    <span class=com># regular expression to match at start of file</span>
+        MIMEType =&gt; 'application/test',
+        Description =&gt; 'Test imaginary file type',
+    },
+    ZZZ =&gt; {
+        <span class=com># if neither BaseType nor Magic are defined, the file will be
+        # recognized by extension only</span>
+    },
+);
+
+<span class=com># Specify default ExifTool option values
 # (see the <a href="ExifTool.html#Options">Options function documentation</a> for available options)</span>
 %Image::ExifTool::UserDefined::Options = (
-    CoordFormat =&gt; '%.6f',  <span class='com'># change default GPS coordinate format</span>
-    Duplicates =&gt; 1,        <span class='com'># make -a default for the exiftool app</span>
-    GeoMaxHDOP =&gt; 4,        <span class='com'># ignore GPS fixes with HDOP &gt; 4</span>
+    CoordFormat =&gt; '%.6f',  <span class=com># change default GPS coordinate format</span>
+    Duplicates =&gt; 1,        <span class=com># make -a default for the exiftool app</span>
+    GeoMaxHDOP =&gt; 4,        <span class=com># ignore GPS fixes with HDOP &gt; 4</span>
 );
 
-<span class='com'>#------------------------------------------------------------------------------</span>
-1;  <span class='com'>#end</span>
+<span class=com>#------------------------------------------------------------------------------</span>
+1;  <span class=com>#end</span>
 </pre>
 <hr>
 <p class='lf'><a href="index.html">&lt;-- Back to ExifTool home page</a></p>
@@ -46,11 +46,18 @@ value.</p>
 <tr><td>CUR_LANG</td><td>Hash reference for localized language lookup corresponding
     to current 'Lang' options setting.</td></tr>
 
+<tr><td>CUR_WRITE_GROUP</td><td>Current family 1 group while writing.  Currently
+    used only when writing QuickTime tracks.</td></tr>
+
 <tr><td>DEL_GROUP</td><td>Hash of groups to delete.  Value is 1 to delete group
-    completely, or 2 if tags were added back after deleting the group.</td></tr>
+    completely, or 2 if tags were added back after deleting the group.  May
+    have a leading "-" if excluded from a delete.</td></tr>
 
 <tr><td>DEL_PREVIEW</td><td>Flag to delete preview from after JPEG EOI</td></tr>
 
+<tr><td>DemoteErrors</td><td>Errors are demoted to warnings and this count is
+    incremented if non-zero to begin with</td></tr>
+
 <tr><td>DIR_COUNT</td><td>Hash reference for counters of various types of directorys (ICC, IPTC,...)</td></tr>
 
 <tr><td>DIR_NAME</td><td>Name of directory currently being processed</td></tr>
@@ -156,6 +163,9 @@ value.</p>
     accumulate lists as usual, or 0 to accumulate lists in TAG_EXTRA "NoList" element (and
     set a TAG_EXTRA "NoListDel" flag for tags that wouldn't have been created).</td></tr>
 
+<tr><td>NO_STRUCT</td><td>Set if structures shouldn't be restored for this metadata.  Used
+    to avoid restoring structures for non-XMP (ie. XML) information.</td></tr>
+
 <tr><td>NO_UNKNOWN</td><td>Don't generate unknown tags automatically even if Unknown option is set</td></tr>
 
 <tr><td>NUM_FOUND</td><td>Number of tags found</td></tr>
@@ -87,11 +87,11 @@ when one is expected.</p>
 <p>A command-line interface to <a href="ExifTool.html">Image::ExifTool</a>, used for
 reading and writing meta information in a variety of file types.  <em>FILE</em> is
 one or more source file names, directory names, or <code>-</code> for the standard
-input.  Information is read from source files and printed in readable form
+input.  Metadata is read from source files and printed in readable form
 to the console (or written to output text files with <strong>-w</strong>).</p>
-<p>To write or delete information, tag values are assigned using the
+<p>To write or delete metadata, tag values are assigned using the
 -<em>TAG</em>=[<em>VALUE</em>] syntax, or the <strong>-geotag</strong> option.  To copy or move
-information, the <strong>-tagsFromFile</strong> feature is used.  By default the original
+metadata, the <strong>-tagsFromFile</strong> feature is used.  By default the original
 files are preserved with <code>_original</code> appended to their names -- be sure to
 verify that the new files are OK before erasing the originals.  Once in
 write mode, exiftool will ignore any read-specific options.</p>
@@ -104,37 +104,38 @@ supported by ExifTool (r = read, w = write, c = create):</p>
 <pre>
   File Types
   ------------+-------------+-------------+-------------+------------
-  3FR   r     | EIP   r     | LA    r     | ORF   r/w   | RSRC  r
-  3G2   r     | EPS   r/w   | LNK   r     | OTF   r     | RTF   r
-  3GP   r     | ERF   r/w   | M2TS  r     | PAC   r     | RW2   r/w
-  ACR   r     | EXE   r     | M4A/V r     | PAGES r     | RWL   r/w
-  AFM   r     | EXIF  r/w/c | MEF   r/w   | PBM   r/w   | RWZ   r
-  AI    r/w   | EXR   r     | MIE   r/w/c | PCD   r     | RM    r
-  AIFF  r     | F4A/V r     | MIFF  r     | PDF   r/w   | SO    r
-  APE   r     | FFF   r/w   | MKA   r     | PEF   r/w   | SR2   r/w
-  ARW   r/w   | FLA   r     | MKS   r     | PFA   r     | SRF   r
-  ASF   r     | FLAC  r     | MKV   r     | PFB   r     | SRW   r/w
-  AVI   r     | FLV   r     | MNG   r/w   | PFM   r     | SVG   r
-  BMP   r     | FPF   r     | MODD  r     | PGF   r     | SWF   r
-  BTF   r     | FPX   r     | MOS   r/w   | PGM   r/w   | THM   r/w
-  CHM   r     | GIF   r/w   | MOV   r     | PLIST r     | TIFF  r/w
-  COS   r     | GZ    r     | MP3   r     | PICT  r     | TTC   r
-  CR2   r/w   | HDP   r/w   | MP4   r     | PMP   r     | TTF   r
-  CRW   r/w   | HDR   r     | MPC   r     | PNG   r/w   | VRD   r/w/c
-  CS1   r/w   | HTML  r     | MPG   r     | PPM   r/w   | VSD   r
-  DCM   r     | ICC   r/w/c | MPO   r/w   | PPT   r     | WAV   r
-  DCP   r/w   | IDML  r     | MQV   r     | PPTX  r     | WDP   r/w
-  DCR   r     | IIQ   r/w   | MRW   r/w   | PS    r/w   | WEBP  r
-  DFONT r     | IND   r/w   | MXF   r     | PSB   r/w   | WEBM  r
-  DIVX  r     | INX   r     | NEF   r/w   | PSD   r/w   | WMA   r
-  DJVU  r     | ITC   r     | NRW   r/w   | PSP   r     | WMV   r
-  DLL   r     | J2C   r     | NUMBERS r   | QTIF  r     | WV    r
-  DNG   r/w   | JNG   r/w   | ODP   r     | RA    r     | X3F   r/w
-  DOC   r     | JP2   r/w   | ODS   r     | RAF   r/w   | XCF   r
-  DOCX  r     | JPEG  r/w   | ODT   r     | RAM   r     | XLS   r
-  DV    r     | K25   r     | OFR   r     | RAR   r     | XLSX  r
-  DVB   r     | KDC   r     | OGG   r     | RAW   r/w   | XMP   r/w/c
-  DYLIB r     | KEY   r     | OGV   r     | RIFF  r     | ZIP   r</pre>
+  3FR   r     | EIP   r     | LA    r     | OTF   r     | RW2   r/w
+  3G2   r/w   | EPS   r/w   | LNK   r     | PAC   r     | RWL   r/w
+  3GP   r/w   | ERF   r/w   | M2TS  r     | PAGES r     | RWZ   r
+  ACR   r     | EXE   r     | M4A/V r/w   | PBM   r/w   | RM    r
+  AFM   r     | EXIF  r/w/c | MEF   r/w   | PCD   r     | SO    r
+  AI    r/w   | EXR   r     | MIE   r/w/c | PDF   r/w   | SR2   r/w
+  AIFF  r     | EXV   r/w/c | MIFF  r     | PEF   r/w   | SRF   r
+  APE   r     | F4A/V r/w   | MKA   r     | PFA   r     | SRW   r/w
+  ARW   r/w   | FFF   r/w   | MKS   r     | PFB   r     | SVG   r
+  ASF   r     | FLA   r     | MKV   r     | PFM   r     | SWF   r
+  AVI   r     | FLAC  r     | MNG   r/w   | PGF   r     | THM   r/w
+  BMP   r     | FLV   r     | MODD  r     | PGM   r/w   | TIFF  r/w
+  BTF   r     | FPF   r     | MOS   r/w   | PLIST r     | TORRENT r
+  CHM   r     | FPX   r     | MOV   r/w   | PICT  r     | TTC   r
+  COS   r     | GIF   r/w   | MP3   r     | PMP   r     | TTF   r
+  CR2   r/w   | GZ    r     | MP4   r/w   | PNG   r/w   | VRD   r/w/c
+  CRW   r/w   | HDP   r/w   | MPC   r     | PPM   r/w   | VSD   r
+  CS1   r/w   | HDR   r     | MPG   r     | PPT   r     | WAV   r
+  DCM   r     | HTML  r     | MPO   r/w   | PPTX  r     | WDP   r/w
+  DCP   r/w   | ICC   r/w/c | MQV   r/w   | PS    r/w   | WEBP  r
+  DCR   r     | IDML  r     | MRW   r/w   | PSB   r/w   | WEBM  r
+  DFONT r     | IIQ   r/w   | MXF   r     | PSD   r/w   | WMA   r
+  DIVX  r     | IND   r/w   | NEF   r/w   | PSP   r     | WMV   r
+  DJVU  r     | INX   r     | NRW   r/w   | QTIF  r/w   | WV    r
+  DLL   r     | ITC   r     | NUMBERS r   | RA    r     | X3F   r/w
+  DNG   r/w   | J2C   r     | ODP   r     | RAF   r/w   | XCF   r
+  DOC   r     | JNG   r/w   | ODS   r     | RAM   r     | XLS   r
+  DOCX  r     | JP2   r/w   | ODT   r     | RAR   r     | XLSX  r
+  DPX   r     | JPEG  r/w   | OFR   r     | RAW   r/w   | XMP   r/w/c
+  DV    r     | K25   r     | OGG   r     | RIFF  r     | ZIP   r
+  DVB   r/w   | KDC   r     | OGV   r     | RSRC  r     |
+  DYLIB r     | KEY   r     | ORF   r/w   | RTF   r     |</pre>
 <pre>
   Meta Information
   ----------------------+----------------------+---------------------
@@ -143,15 +144,16 @@ supported by ExifTool (r = read, w = write, c = create):</p>
   IPTC           r/w/c  |  Kodak Meta     r/w  |  Adobe APP14    r
   XMP            r/w/c  |  FotoStation    r/w  |  MPF            r
   MakerNotes     r/w/c  |  PhotoMechanic  r/w  |  Stim           r
-  Photoshop IRB  r/w/c  |  JPEG 2000      r    |  APE            r
-  ICC Profile    r/w/c  |  DICOM          r    |  Vorbis         r
-  MIE            r/w/c  |  Flash          r    |  SPIFF          r
-  JFIF           r/w/c  |  FlashPix       r    |  DjVu           r
-  Ducky APP12    r/w/c  |  QuickTime      r    |  M2TS           r
-  PDF            r/w/c  |  Matroska       r    |  PE/COFF        r
-  PNG            r/w/c  |  GeoTIFF        r    |  AVCHD          r
-  Canon VRD      r/w/c  |  PrintIM        r    |  ZIP            r
-  Nikon Capture  r/w/c  |  ID3            r    |  (and more)</pre>
+  Photoshop IRB  r/w/c  |  JPEG 2000      r    |  DPX            r
+  ICC Profile    r/w/c  |  DICOM          r    |  APE            r
+  MIE            r/w/c  |  Flash          r    |  Vorbis         r
+  JFIF           r/w/c  |  FlashPix       r    |  SPIFF          r
+  Ducky APP12    r/w/c  |  QuickTime      r    |  DjVu           r
+  PDF            r/w/c  |  Matroska       r    |  M2TS           r
+  PNG            r/w/c  |  MXF            r    |  PE/COFF        r
+  Canon VRD      r/w/c  |  PrintIM        r    |  AVCHD          r
+  Nikon Capture  r/w/c  |  FLAC           r    |  ZIP            r
+  GeoTIFF        r/w/c  |  ID3            r    |  (and more)</pre>
 <p>
 </p>
 <hr />
@@ -160,10 +162,10 @@ supported by ExifTool (r = read, w = write, c = create):</p>
 names), except for single-character options when the corresponding
 upper-case option exists.  Many single-character options have equivalent
 long-name versions (shown in brackets), and some options have inverses which
-are invoked with a leading double-dash.  Note that multiple single-character
-options may NOT be combined into one argument because this would be
-interpreted as a tag name.  Contrary to standard practice, options may
-appear after source file names on the exiftool command line.</p>
+are invoked with a leading double-dash.  Unrecognized options are
+interpreted as tag names (for this reason, multiple single-character options
+may NOT be combined into one argument).  Contrary to standard practice,
+options may appear after source file names on the exiftool command line.</p>
 <p>
 </p>
 <h2><a name="option_summary">Option Summary</a></h2>
@@ -254,6 +256,7 @@ appear after source file names on the exiftool command line.</p>
   -ver                             Print exiftool version number</pre>
 <p><a href="#advanced_options">Advanced options</a></p>
 <pre>
+  -api OPT[=VAL]                   Set ExifTool API option
   -common_args                     Define common arguments
   -config CFGFILE                  Specify configuration file name
   -echo[NUM] TEXT                  Echo text to stdout or stderr
@@ -270,8 +273,9 @@ appear after source file names on the exiftool command line.</p>
 <dt><strong><a name="tag" class="item"><strong>-</strong><em>TAG</em></a></strong></dt>
 
 <dd>
-<p>Extract information for specified tag (ie. <code>-CreateDate</code>).  A tag name
-is the handle by which a piece of information is referenced.  See
+<p>Extract information for the specified tag (ie. <code>-CreateDate</code>).  Multiple
+tags may be specified in a single command.  A tag name is the handle by
+which a piece of information is referenced.  See
 <a href="TagNames/index.html">Image::ExifTool::TagNames</a> for documentation on
 available tag names.  A tag name may include leading group names separated
 by colons (ie. <code>-EXIF:CreateDate</code>, or <code>-Doc1:XMP:Creator</code>), and each group
@@ -302,39 +306,45 @@ information.  Use the <strong>-s</strong> option to see the tag names instead.</
 <p>Exclude specified tag from extracted information.  Same as the <strong>-x</strong> option.
 Once excluded from the output, a tag may not be re-included by a subsequent
 option.  May also be used following a <strong>-tagsFromFile</strong> option to exclude
-tags from being copied, or to exclude groups from being deleted when
+tags from being copied (when redirecting to another tag, it is the source
+tag that should be excluded), or to exclude groups from being deleted when
 deleting all information (ie. <code>-all= --exif:all</code> deletes all but EXIF
 information).  But note that this will not exclude individual tags from a
-group delete. Instead, individual tags may be recovered using the
-<strong>-tagsFromFile</strong> option (ie. <code>-all= -tagsfromfile @ -artist</code>).  Wildcards
-are permitted as described above for <strong>-TAG</strong>.</p>
+group delete (unless a family 2 group is specified, see note 4 below). 
+Instead, individual tags may be recovered using the <strong>-tagsFromFile</strong> option
+(ie. <code>-all= -tagsfromfile @ -artist</code>). Wildcards are permitted as described
+above for <strong>-TAG</strong>.</p>
 </dd>
 <dt><strong><a name="tag_value" class="item"><strong>-</strong><em>TAG</em>[+-]<strong>=</strong>[<em>VALUE</em>]</a></strong></dt>
 
 <dd>
 <p>Write a new value for the specified tag (ie. <code>-comment=wow</code>), or delete the
-tag if no <em>VALUE</em> is given (ie. <code>-comment=</code>). <code>+=</code> and <code>-=</code> are used to
+tag if no <em>VALUE</em> is given (ie. <code>-comment=</code>).  <code>+=</code> and <code>-=</code> are used to
 add or remove existing entries from a list, or to shift date/time values
 (see <a href="Shift.html">Image::ExifTool::Shift.pl</a> for details).
 <code>+=</code> may also be used to increment numerical values, and <code>-=</code> may be used
 to conditionally delete or replace a tag (see <a href="#writing_examples">WRITING EXAMPLES</a> for
 examples).</p>
-<p><em>TAG</em> may contain a leading family 0 or 1 group name separated by a colon.
-If no group name is specified, the tag is created in the preferred group,
-and updated in any other location where a same-named tag already exists. 
-The preferred group is the first group in the following list where <em>TAG</em> is
-valid: 1) EXIF, 2) IPTC, 3) XMP.</p>
+<p><em>TAG</em> may contain one or more leading family 0, 1 or 2 group names,
+prefixed by optional family numbers, and separated colons.  If no group name
+is specified, the tag is created in the preferred group, and updated in any
+other location where a same-named tag already exists.  The preferred group
+is the first group in the following list where <em>TAG</em> is valid: 1) EXIF, 2)
+IPTC, 3) XMP.</p>
 <p>The wildcards <code>*</code> and <code>?</code> may be used in tag names to assign the same
 value to multiple tags.  When specified with wildcards, &quot;unsafe&quot; tags are
 not written.  A tag name of <code>All</code> is eqivalent to <code>*</code> (except that it
 doesn't require quoting, while arguments with wildcards do on systems with
 shell globbing), and is often used when deleting all metadata (ie. <code>-All=</code>)
-or an entire group (ie. <code>-GROUP:All=</code>).  Note that not all groups are
-deletable, and that the JPEG APP14 &quot;Adobe&quot; group is not removed by default
-with <code>-All=</code> because it may affect the appearance of the image.  Use the
-<strong>-listd</strong> option for a complete list of deletable groups. Also, within an
-image some groups may be contained within others, and these groups are
-removed if the containing group is deleted:</p>
+or an entire group (ie. <code>-GROUP:All=</code>, see note 4 below).  Note that not
+all groups are deletable, and that the JPEG APP14 &quot;Adobe&quot; group is not
+removed by default with <code>-All=</code> because it may affect the appearance of the
+image.  However, this will remove color space information, so the colors may
+be affected (but this may be avoided by copying back the tags defined by the
+ColorSpaceTags shortcut).  Use the <strong>-listd</strong> option for a complete list of
+deletable groups, and see note 5 below regarding the &quot;APP&quot; groups.  Also,
+within an image some groups may be contained within others, and these groups
+are removed if the containing group is deleted:</p>
 <pre>
   JPEG Image:
   - Deleting EXIF or IFD0 also deletes ExifIFD, GlobParamIFD,
@@ -346,13 +356,29 @@ removed if the containing group is deleted:</p>
   - Deleting EXIF only removes ExifIFD which also deletes
     InteropIFD and MakerNotes.</pre>
 <p>Notes:</p>
-<p>1) MakerNotes tags may be edited, but not created or deleted individually. 
-This avoids many potential problems including the inevitable compatibility
-problems with OEM software which may be very inflexible about the
-information it expects to find in the maker notes.</p>
-<p>2) Changes to PDF files are reversible because the original information is
+<p>1) <strong>Many tag values may be assigned in a single command</strong>.  If two
+assignments affect the same tag, the latter takes precedence (except for
+list-type tags, where both values are written).</p>
+<p>2) In general, MakerNotes tags are considered &quot;Permanent&quot;, and may be edited
+but not created or deleted individually.  This avoids many potential
+problems including the inevitable compatibility problems with OEM software
+which may be very inflexible about the information it expects to find in the
+maker notes.</p>
+<p>3) Changes to PDF files are reversible because the original information is
 never actually deleted from the file.  So ExifTool alone may not be used to
 securely edit metadata in PDF files.</p>
+<p>4) Specifying <code>-GROUP:all=</code> deletes the entire group as a block only if a
+single family 0 or 1 group is specified.  Otherwise all deletable tags in
+the specified group(s) are removed individually, and in this case is it
+possible to exclude individual tags from a mass delete.  For example,
+<code>-time:all --Exif:Time:All</code> removes all deletable Time tags except those in
+the EXIF.  This difference also applies if family 2 is specified when
+deleting all groups. For example, <code>-2all:all=</code> deletes tags individually,
+while <code>-all:all=</code> deletes entire blocks.</p>
+<p>5) The &quot;APP&quot; group names (&quot;APP0&quot; through &quot;APP15&quot;) are used to delete JPEG
+application segments which are not associated with another deletable group. 
+For example, specifying <code>-APP14:All=</code> will NOT delete the APP14 &quot;Adobe&quot;
+segment because this is accomplished with <code>-Adobe:All</code>.</p>
 <p>Special feature:  Integer values may be specified in hexadecimal with a
 leading <code>0x</code>, and simple rational values may be specified as fractions.</p>
 </dd>
@@ -377,15 +403,16 @@ all possible tags (see note 1 below) from the source file are copied to
 same-named tags in the preferred location of the output file (the same as
 specifying <code>-all</code>).  More than one <strong>-tagsFromFile</strong> option may be used to
 copy tags from multiple files.</p>
-<p>By default, this option will commute information between same-named tags in
-different groups and write each tag to the preferred group.  This allows
-some information to be automatically translated when copying between images
-of different formats.  However, if a group name is specified for a tag then
-the information is written to this group (unless redirected to another
-group, see below).  If <code>All</code> is used as a group name, then the information
-is written to the same family 1 group in the destination file.  In this way,
-<code>-All:All</code> is used to copy all information while preserving the family 1
-group (ie. the specific location in the metadata) of each tag.</p>
+<p>By default, this option will update any existing and writable same-named
+tags in the output <em>FILE</em>, but will create new tags only in their preferred
+groups.  This allows some information to be automatically transferred to the
+appropriate group when copying between images of different formats. However,
+if a group name is specified for a tag then the information is written only
+to this group (unless redirected to another group, see below).  If <code>All</code> is
+used as a group name, then each tag is written to the same family 1 group it
+had in the source file (ie. the same specific location in the metadata), but
+a different family may be specified by adding a leading family number to the
+group name (ie. <code>-0All:all</code>).</p>
 <p><em>SRCFILE</em> may be the same as <em>FILE</em> to move information around within a
 single file.  In this case, <code>@</code> may be used to represent the source file
 (ie. <code>-tagsFromFile @</code>), permitting this feature to be used for batch
@@ -501,8 +528,8 @@ descriptions.  This option is mainly used for extracting embedded images or
 other binary data, but it may also be useful for some text strings since
 control characters (such as newlines) are not replaced by '.' as they are in
 the default output.  List items are separated by a newline when extracted
-with the <strong>-b</strong> option.  May be combined with <a href="#php"><code>-php</code></a> or <a href="#x"><code>-X</code></a> to extract
-binary data in PHP or XML format.</p>
+with the <strong>-b</strong> option.  May be combined with <code>-j</code>, <a href="#php"><code>-php</code></a> or <a href="#x"><code>-X</code></a> to
+extract binary data in JSON, PHP or XML format.</p>
 </dd>
 <dt><strong><a name="fmt" class="item"><strong>-c</strong> <em>FMT</em> (<strong>-coordFormat</strong>)</a></strong></dt>
 
@@ -575,7 +602,7 @@ information about coded character sets.</p>
 <dt><strong><a name="csv_csvfile" class="item"><strong>-csv</strong>[=<em>CSVFILE</em>]</a></strong></dt>
 
 <dd>
-<p>Export information in as a CSV file, or import information if <em>CSVFILE</em> is
+<p>Export information in CSV format, or import information if <em>CSVFILE</em> is
 specified.  When importing, the CSV file must be in exactly the same format
 as the exported file.  The first row of the <em>CSVFILE</em> must be the ExifTool
 tag names (with optional group names) for each column of the file, and
@@ -589,12 +616,22 @@ examples demonstrate basic use of this option:</p>
 <pre>
     # update metadata for all images in a directory from CSV file
     exiftool -csv=a.csv dir</pre>
-<p>Empty values are ignored when importing.  To force a tag to be deleted, use
-the <strong>-f</strong> option and set the value to &quot;-&quot; in the CSV file (or to the
-MissingTagValue if this API option was used).  May be combined with the
-<strong>-g</strong> or <strong>-G</strong> option to add group names to the tags.  Note that list-type
-tags are stored as simple strings in a CSV file, but the <strong>-sep</strong> option may
-be used to split them back into separate items when importing.</p>
+<p>Empty values are ignored when importing.  Also, FileName and Directory
+columns are ignored if they exist (ie. ExifTool will not attempt to write
+these tags with a CSV import).  To force a tag to be deleted, use the <strong>-f</strong>
+option and set the value to &quot;-&quot; in the CSV file (or to the MissingTagValue
+if this API option was used).  Multiple databases may be imported in a
+single command.</p>
+<p>When exporting a CSV file, the <strong>-g</strong> or <strong>-G</strong> option to add group names to
+the tag headings.  If the <strong>-a</strong> option is used to allow duplicate tag names,
+the duplicate tags are only included in the CSV output if the column
+headings are unique.  Adding the <strong>-G4</strong> option ensures a unique column
+heading for each tag.  When exporting specific tags, the CSV columns are
+arranged in the same order as the specified tags provided the column
+headings exactly match the specified tag names, otherwise the columns are
+sorted in alphabetical order.</p>
+<p>List-type tags are stored as simple strings in a CSV file, but the <strong>-sep</strong>
+option may be used to split them back into separate items when importing.</p>
 <p>Special feature:  <strong>-csv</strong>+=<em>CSVFILE</em> may be used to add items to existing
 lists. This affects only list-type tags.  Also applies to the <strong>-j</strong> option.</p>
 <p>Note that this option is fundamentally different than all other output
@@ -698,8 +735,10 @@ simple strings).  The <strong>-a</strong> option is implied if the <strong>-g</s
 are used, otherwise it is ignored and duplicate tags are suppressed.  Adding
 the <strong>-D</strong> or <strong>-H</strong> option changes tag values to JSON objects with &quot;val&quot; and
 &quot;id&quot; fields, and adding <strong>-l</strong> adds a &quot;desc&quot; field, and a &quot;num&quot; field if the
-numerical value is different from the converted &quot;val&quot;.  The <strong>-b</strong>, <strong>-L</strong> and
-<strong>-charset</strong> options have no effect on the JSON output.</p>
+numerical value is different from the converted &quot;val&quot;.  The <strong>-b</strong> option may
+be added to output binary data, encoded in base64 if necessary (indicated by
+&quot;base64:&quot; as the first 7 bytes of the value).  The <strong>-L</strong> and <strong>-charset</strong>
+options have no effect on the JSON output.</p>
 <p>If <em>JSONFILE</em> is specified, the file is imported and the tag definitions
 from the file are used to set tag values on a per-file basis.  The special
 &quot;SourceFile&quot; entry in each JSON object associates the information with a
@@ -713,8 +752,8 @@ may be suffixed with a <code>#</code> to disable print conversion.</p>
 
 <dd>
 <p>Use long 2-line Canon-style output format.  Adds a description and
-unconverted value to the XML, JSON or PHP output when <strong>-X</strong>, <strong>-j</strong> or
-<strong>-php</strong> is used.</p>
+unconverted value (if it is different from the converted value) to the XML,
+JSON or PHP output when <strong>-X</strong>, <strong>-j</strong> or <strong>-php</strong> is used.</p>
 </dd>
 <dt><strong><a name="l" class="item"><strong>-L</strong> (<strong>-latin</strong>)</a></strong></dt>
 
@@ -778,7 +817,7 @@ when writing.  For example, the following commands all have the same effect:</p>
 <dd>
 <p>Print output in the format specified by the given file or string (and ignore
 other format options).  Tag names in the format file or string begin with a
-<code>$</code> symbol and may contain a leading group name and/or a trailing <code>#</code>. 
+<code>$</code> symbol and may contain a leading group names and/or a trailing <code>#</code>. 
 Case is not significant.  Braces <code>{}</code> may be used around the tag name to
 separate it from subsequent text.  Use <code>$$</code> to represent a <code>$</code> symbol, and
 <code>$/</code> for a newline.  Multiple <strong>-p</strong> options may be used, each contributing
@@ -798,7 +837,7 @@ are ignored.  For example, this format file:</p>
     exiftool -p test.fmt a.jpg b.jpg</pre>
 <p>produces output like this:</p>
 <pre>
-    -- Generated by ExifTool 9.27 --
+    -- Generated by ExifTool 9.53 --
     File: a.jpg - 2003:10:31 15:44:19
     (f/5.6, 1/60s, ISO 100)
     File: b.jpg - 2006:05:23 11:57:38
@@ -822,17 +861,18 @@ example below prints the camera Make with spaces translated to underlines,
 and multiple consecutive underlines replaced by a single underline:</p>
 <pre>
     exiftool -p '${make;tr/ /_/;s/__+/_/g}' image.jpg</pre>
-<p>A default expression of <code>tr(/\\?*:|&quot;&lt;&gt;)()d</code> is assumed if the
-expression is empty, and removes the characters / \ ? * : | &lt; and &gt;
-from the printed value.</p>
+<p>A default expression of <code>tr(/\\?*:|&quot;&lt;&gt;\0)()d</code> is assumed if the
+expression is empty, which removes the characters / \ ? * : | &lt; &gt;
+and null from the printed value.</p>
 </dd>
 <dt><strong><a name="php" class="item"><strong>-php</strong></a></strong></dt>
 
 <dd>
 <p>Format output as a PHP Array.  The <strong>-g</strong>, <strong>-G</strong>, <strong>-D</strong>, <strong>-H</strong>, <strong>-l</strong>,
-<strong>-sep</strong> and <strong>-struct</strong> options combine with <strong>-php</strong> in the same way as with
-<strong>-json</strong>. As well, the <strong>-b</strong> option may be added to output binary data. 
-Here is a simple example showing how this could be used in a PHP script:</p>
+<strong>-sep</strong> and <strong>-struct</strong> options combine with <strong>-php</strong>, and duplicate tags are
+handled in the same way as with the <strong>-json</strong> option.  As well, the <strong>-b</strong>
+option may be added to output binary data.  Here is a simple example showing
+how this could be used in a PHP script:</p>
 <pre>
     &lt;?php
     eval('$array=' . `exiftool -php -q image.jpg`);
@@ -865,6 +905,9 @@ default is to join list items with &quot;, &quot;.  When writing, this option ca
 values assigned to list-type tags to be split into individual items at each
 substring matching <em>STR</em> (otherwise they are not split by default).  Space
 characters in <em>STR</em> match zero or more whitespace characters in the value.</p>
+<p>Note that an empty separator (&quot;&quot;) is allowed, and will join items with no
+separator when reading, or split the value into individual characters when
+writing.</p>
 </dd>
 <dt><strong><a name="sort" class="item"><strong>-sort</strong></a></strong></dt>
 
@@ -985,8 +1028,9 @@ used as in the last example above.)</p>
 <p>For %c, these modifiers have a different effects.  If a field width is
 given, the copy number is padded with zeros to the specified width.  A
 leading '-' adds a dash before the copy number, and a '+' adds an underline.
-By default, a copy number of zero is omitted, but this can be changed by
-adding a decimal point to the modifier.  For example:</p>
+By default, the copy number is omitted from the first file of a given name,
+but this can be changed by adding a decimal point to the modifier.  For
+example:</p>
 <pre>
     -w A%-cZ.txt      # AZ.txt, A-1Z.txt, A-2Z.txt ...
     -w B%5c.txt       # B.txt, B00001.txt, B00002.txt ...
@@ -1022,7 +1066,7 @@ although %c is only valid for output file names.</p>
 <dd>
 <p>This enhanced version of the <strong>-w</strong> option allows a separate output file to
 be created for each extracted tag.  The differences between <strong>-W</strong> and <strong>-w</strong>
-are listed below:</p>
+are as follows:</p>
 <p>1) With <strong>-W</strong>, a new output file is created for each extracted tag.</p>
 <p>2) <strong>-W</strong> supports three additional format codes:  %t, %g and %s represent
 the tag name, group name, and suggested extension for the output file (based
@@ -1036,7 +1080,9 @@ allows a simple file name to be specified, which, when combined with the
 append feature, provides a method to write metadata from multiple source
 files to a single output file without the need for shell redirection.</p>
 <p>4) Adding the <strong>-v</strong> option to <strong>-W</strong> generates a list of the tags and output
-file names instead of giving a verbose dump of the entire file.</p>
+file names instead of giving a verbose dump of the entire file.  (Unless
+appending all output to one file for each source file by using <strong>-W+</strong> with
+an output file <em>FMT</em> that does not contain %t, $g or %s.)</p>
 <p>5) Individual list items are stored in separate files when <strong>-W</strong> is combined
 with <strong>-b</strong>, but note that for separate files to be created %c must be used
 in <em>FMT</em> to give the files unique names.</p>
@@ -1178,16 +1224,16 @@ is used.</p>
 
 <dd>
 <p>Specify a condition to be evaluated before processing each <em>FILE</em>.  <em>EXPR</em>
-is a Perl-like expression containing tag names prefixed by <code>$</code> symbols.  It
-is evaluated with the tags from each <em>FILE</em> in turn, and the file is
-processed only if the expression returns true.  Unlike Perl variable names,
-tag names are not case sensitive and may contain a hyphen.  As well, tag
-names may have a leading group name separated by a colon, and/or a trailing
-<code>#</code> character to disable print conversion.  The expression <code>$GROUP:all</code>
-evaluates to 1 if any tag exists in the specified <code>GROUP</code>, or 0 otherwise
-(see note 2 below).  When multiple <strong>-if</strong> options are used, all conditions
-must be satisfied to process the file.  Returns an exit status of 1 if all
-files fail the condition.  Below are a few examples:</p>
+is a Perl-like logic expression containing tag names prefixed by <code>$</code>
+symbols.  It is evaluated with the tags from each <em>FILE</em> in turn, and the
+file is processed only if the expression returns true.  Unlike Perl variable
+names, tag names are not case sensitive and may contain a hyphen.  As well,
+tag names may have a leading group names separated by colons, and/or a
+trailing <code>#</code> character to disable print conversion.  The expression
+<code>$GROUP:all</code> evaluates to 1 if any tag exists in the specified <code>GROUP</code>, or
+0 otherwise (see note 2 below).  When multiple <strong>-if</strong> options are used, all
+conditions must be satisfied to process the file.  Returns an exit status of
+1 if all files fail the condition.  Below are a few examples:</p>
 <pre>
     # extract shutterspeed from all Canon images in a directory
     exiftool -shutterspeed -if '$make eq &quot;Canon&quot;' dir</pre>
@@ -1216,9 +1262,8 @@ process one file based on tags from another, two steps are required.  For
 example, to process XMP sidecar files in directory <a href="#dir"><code>DIR</code></a> based on tags from
 the associated NEF:</p>
 <pre>
- a) exiftool -if EXPR -p '$directory/$filename' -ext nef DIR &gt; nef.txt</pre>
-<pre>
- b) exiftool -@ nef.txt -srcfile %d%f.xmp ...</pre>
+    exiftool -if EXPR -p '$directory/$filename' -ext nef DIR &gt; nef.txt
+    exiftool -@ nef.txt -srcfile %d%f.xmp ...</pre>
 </dd>
 <dt><strong><a name="m" class="item"><strong>-m</strong> (<strong>-ignoreMinorErrors</strong>)</a></strong></dt>
 
@@ -1280,12 +1325,12 @@ file was successfully written (ie. the file is moved instead of copied).</p>
 <p>Similar to <strong>-overwrite_original</strong> except that an extra step is added to
 allow the original file attributes to be preserved.  For example, on a Mac
 this causes the original file creation date, type, creator, label color,
-icon and hard links to the file to be preserved (but note that the Mac OS
-resource fork is always preserved unless specifically deleted with
-<code>-rsrc:all=</code>).  This is implemented by opening the original file in update
-mode and replacing its data with a copy of a temporary file before deleting
-the temporary.  The extra step results in slower performance, so the
-<strong>-overwrite_original</strong> option should be used instead unless necessary.</p>
+icon, Finder tags and hard links to the file to be preserved (but note that
+the Mac OS resource fork is always preserved unless specifically deleted
+with <code>-rsrc:all=</code>).  This is implemented by opening the original file in
+update mode and replacing its data with a copy of a temporary file before
+deleting the temporary.  The extra step results in slower performance, so
+the <strong>-overwrite_original</strong> option should be used instead unless necessary.</p>
 </dd>
 <dt><strong><a name="p" class="item"><strong>-P</strong> (<strong>-preserve</strong>)</a></strong></dt>
 
@@ -1458,8 +1503,8 @@ read/write support for tags as recommended by the Metadata Working Group.
 To save typing, <code>-use MWG</code> is assumed if the <code>MWG</code> group is specified for
 any tag on the command line.  See the
 <a href="TagNames/MWG.html">MWG Tags documentation</a> for more
-details.  (Note that this option is not reversible, and remains in effect
-until the application terminates, even across the <code>-execute</code> option.)</p>
+details.  Note that this option is not reversible, and remains in effect
+until the application terminates, even across the <code>-execute</code> option.</p>
 </dd>
 </dl>
 <p>
@@ -1525,7 +1570,7 @@ application.</p>
 
 <dd>
 <p>Print a list of all valid tag names (<strong>-list</strong>), all writable tag names
-(<strong>-listw</strong>), all supported file extensions (<strong>-listff</strong>), all recognized file
+(<strong>-listw</strong>), all supported file extensions (<strong>-listf</strong>), all recognized file
 extensions (<strong>-listr</strong>), all writable file extensions (<strong>-listwf</strong>), all tag
 groups [in a specified family] (<strong>-listg</strong>[<em>NUM</em>]), all deletable tag groups
 (<strong>-listd</strong>), or an XML database of tag details including language
@@ -1572,6 +1617,14 @@ drag-and-drop applications.  These options may also be used to improve
 performance in multi-pass processing by reducing the overhead required to
 load exiftool for each invocation.</p>
 <dl>
+<dt><strong><a name="api_opt_val" class="item"><strong>-api</strong> <em>OPT[=VAL]</em></a></strong></dt>
+
+<dd>
+<p>Set ExifTool API option.  <em>OPT</em> is an API option name.  The option value is
+set to 1 if <em>=VAL</em> is omitted.  See
+<a href="ExifTool.html#options">Image::ExifTool Options</a> for a list of available
+API options.  This overrides API options set via the config file.</p>
+</dd>
 <dt><strong><a name="common_args" class="item"><strong>-common_args</strong></a></strong></dt>
 
 <dd>
@@ -1616,13 +1669,13 @@ original <em>FILE</em>.  This may be useful in some special situations for
 processing related preview images or sidecar files.  See the <strong>-w</strong> option
 for a description of the <em>FMT</em> syntax.  Note that file name <em>FMT</em> strings
 for all options are based on the original <em>FILE</em> specified from the command
-line, not the name of the source file specified by <strong>-srcfile</strong>.  A <em>FMT</em> of
-<code>@</code> may be used to represent the original <em>FILE</em>, and may be useful when
-specifying multiple <strong>-srcfile</strong> options (ie. to fall back to processing the
-original <em>FILE</em> if no sidecar exists).</p>
+line, not the name of the source file specified by <strong>-srcfile</strong>.</p>
 <p>If than one <strong>-srcfile</strong> option is specified, the files are tested in order
 and the first existing source file is processed.  If none of the source
 files already exist, then exiftool uses the first <strong>-srcfile</strong> specified.</p>
+<p>A <em>FMT</em> of <code>@</code> may be used to represent the original <em>FILE</em>, which may be
+useful when specifying multiple <strong>-srcfile</strong> options (ie. to fall back to
+processing the original <em>FILE</em> if no sidecar exists).</p>
 </dd>
 <dt><strong><a name="stay_open_flag" class="item"><strong>-stay_open</strong> <em>FLAG</em></a></strong></dt>
 
@@ -1685,7 +1738,9 @@ tags, sorted by group (for family 1).</p>
 <dt><strong><a name="exiftool_common_dir" class="item">exiftool -common dir</a></strong></dt>
 
 <dd>
-<p>Print common meta information for all images in <code>dir</code>.</p>
+<p>Print common meta information for all images in <code>dir</code>.  <code>-common</code> is a
+<a href="http://search.cpan.org/dist/Image-ExifTool/lib/Image/ExifTool/Shortcuts.pm">shortcut tag</a> representing common EXIF meta
+information.</p>
 </dd>
 <dt><strong><a name="exiftool_t_createdate_aperture_shutterspeed_iso_dir_out_txt" class="item">exiftool -T -createdate -aperture -shutterspeed -iso dir &gt; out.txt</a></strong></dt>
 
@@ -2277,12 +2332,12 @@ and assumes that the images in <code>dir</code> have all been previously geotagg
 <dd>
 <p>Add an IPTC keyword in a pipeline, saving output to a new file.</p>
 </dd>
-<dt><strong><a name="wget_qo_http_a_domain_com_bigfile_jpg_exiftool_fast" class="item">wget -qO - <a href="http://a.domain.com/bigfile.jpg">http://a.domain.com/bigfile.jpg</a> | exiftool -fast -</a></strong></dt>
+<dt><strong><a name="curl_s_http_a_domain_com_bigfile_jpg_exiftool_fast" class="item">curl -s <a href="http://a.domain.com/bigfile.jpg">http://a.domain.com/bigfile.jpg</a> | exiftool -fast -</a></strong></dt>
 
 <dd>
-<p>Extract information from an image over the internet using the GNU wget
-utility.  The <strong>-fast</strong> option prevents exiftool from scanning for trailer
-information, so only the meta information header is transferred.</p>
+<p>Extract information from an image over the internet using the cURL utility. 
+The <strong>-fast</strong> option prevents exiftool from scanning for trailer information,
+so only the meta information header is transferred.</p>
 </dd>
 <dt><strong><a name="exiftool_a_jpg_thumbnailimage_b_exiftool_comment_wow_exiftool_a_jpg_thumbnailimage" class="item">exiftool a.jpg -thumbnailimage -b | exiftool -comment=wow - |
 exiftool a.jpg -thumbnailimage'&lt;=-'</a></strong></dt>
@@ -2303,7 +2358,7 @@ error occured or if all files failed the <strong>-if</strong> condition.</p>
 </p>
 <hr />
 <h1><a name="author">AUTHOR</a></h1>
-<p>Copyright 2003-2013, Phil Harvey</p>
+<p>Copyright 2003-2014, Phil Harvey</p>
 <p>This is free software; you can redistribute it and/or modify it under the
 same terms as Perl itself.</p>
 <p>
@@ -41,6 +41,7 @@ ol.index { margin: 0; padding: 0 0 0 2em }
 <li><a href="#Q23">"0 image files updated"</a></li>
 <li><a href="#Q24">Date/time gets reset to today</a></li>
 <li><a href="#Q25">Image validation</a></li>
+<li><a href="#Q26">Import from database</a></li>
 </ol>
 </div>
 
@@ -128,6 +129,10 @@ These recommendations are implemented by the ExifTool
 widest range of applications, it is suggested that these MWG tags be used
 whenever possible.</blockquote>
 
+<blockquote>One final note: When writing, the <code>-v2</code> option may be
+useful because it provides details about what ExifTool is writing, and where.
+</blockquote>
+
 <a name="Q4"></a>
 <p>4. <b>"ExifTool reports more than one shutter speed or aperture value, and
 they are slightly different"</b></p>
@@ -464,9 +469,9 @@ Vorbis information:</blockquote>
 
 <!-- NOTE: CHANGES TO FAQ 10 MUST ALSO BE REFLECTED IN ExifTool.pod! -->
 
-<blockquote><b>EXIF</b>: Most textual information in EXIF is stored in "ASCII"
+<blockquote><b>EXIF</b>: Most textual information in EXIF is stored in ASCII
 format (called "string" in the <a href="TagNames/index.html">ExifTool tag name
-documentation</a>).  By default ExifTool does not convert these strings. 
+documentation</a>).  By default ExifTool does not convert these strings.
 However, it is not uncommon for applications to write UTF&#8209;8 or other
 encodings where ASCII is expected.  To deal with these, ExifTool allows the
 internal EXIF string encoding to be specified with
@@ -516,16 +521,19 @@ specification</a> for more information about IPTC character coding.</blockquote>
 <blockquote>ExifTool may be used to convert IPTC values to a different internal
 encoding.  To do this, all IPTC tags must be rewritten along with the desired
 value of CodedCharacterSet.  For example, the following command changes the
-internal IPTC encoding to UTF&#8209;8:
+internal IPTC encoding to UTF&#8209;8 (from Windows Latin1 unless
+CodedCharacterSet was already "UTF8"):
 <pre>exiftool -tagsfromfile @ -iptc:all -codedcharacterset=utf8 a.jpg
+</pre>or from Windows Latin2 (cp1250) to UTF&#8209;8:
+<pre>exiftool -tagsfromfile @ -iptc:all -codedcharacterset=utf8 -charset iptc=latin2 a.jpg
 </pre>and this command changes it back from UTF&#8209;8 to Windows Latin1 (cp1252):
 <pre>exiftool -tagsfromfile @ -iptc:all -codedcharacterset= a.jpg
-</pre>or this command changes it back from UTF&#8209;8 to Windows Latin2 (cp1250):
+</pre>or to Windows Latin2:
 <pre>exiftool -tagsfromfile @ -iptc:all -codedcharacterset= -charset iptc=latin2 a.jpg
-</pre>Note that unless CodedCharacterSet indicates UTF&#8209;8, applications
-have no reliable way to determine the IPTC character encoding.  For this reason,
-it is recommended that CodedCharacterSet be set to "<code>UTF8</code>" when
-creating new IPTC.</blockquote>
+</pre>Note that unless CodedCharacterSet is UTF&#8209;8, applications have no
+reliable way to determine the IPTC character encoding.  For this reason, it is
+recommended that CodedCharacterSet be set to "<code>UTF8</code>" when creating
+new IPTC.</blockquote>
 
 <blockquote class='sm'><sup>&dagger;</sup> <span class=lt>Refers to the older
 <a href="http://www.iptc.org/site/News_Exchange_Formats/IIM/">IPTC IIM</a> format.
@@ -689,6 +697,9 @@ name, or to disable the config file feature.
 <a name="Q12"></a>
 <p>12. <b>"How do I export information from exiftool to a database?"</b></p>
 
+<blockquote><i>[See <a href="#Q26">FAQ number 26</a> for help with the reverse
+-- importing metadata from a database.]</i></blockquote>
+
 <blockquote>
 It is often easiest to export information formatted as  a tab-delimited or
 comma-separated list of values using the exiftool <code>-T</code> or
@@ -798,32 +809,28 @@ See the <code>-p</code> option in the <a href="exiftool_pod.html">application
 documentation</a> for more information about this feature.
 </blockquote>
 
-<blockquote><b>Note</b>:  Information may be <b>imported</b> from CSV or JSON files for
-writing to images by specifying an input file name with the <code>-csv</code> or
-<code>-j</code> option.  See the <a href="exiftool_pod.html">exiftool
-application documentation</a> for more details.</blockquote>
-
 <a name="Q13"></a>
-<p>13. <b>"Why is my file smaller after I use ExifTool to write information?"</b></p>
+<p>13a. <b>"Why is my file smaller after I use ExifTool to write information?"</b>, or
+<br>13b. <b>"Why do some Offset tags change value when I write other tags?"</b></p>
 
 <blockquote>
 There are various specific reasons why this can happen, but the general answer
 is:  When ExifTool writes an image, the meta information may be restructured in
-such a way that it takes less space than in the original file.</blockquote>
-
-<blockquote>For instance, the EXIF/TIFF standard allows for blocks of
-unreferenced data to exist in an image.  Some digital cameras write JPEG or
-TIFF-based RAW files which contain large blocks of unused data, usually filled
-with binary zeros.  The reason for this could be to simplify camera algorithms
-by allowing variable-sized information to be written at fixed offsets in the
-output image. When ExifTool rewrites an image it does not copy these unused
-blocks.  This can result in a significant reduction in file size for some
-images.  <i>[The <code>-htmlDump</code> option may be used to view the file
-structure if you are interested in seeing these unused data blocks -- use a
-command like "<code>exiftool -htmlDump a.jpg &gt; out.html</code>", then open
+such a way that it takes less space than in the original file, or so that some
+tags are stored at different offsets in the file.</blockquote>
+
+<blockquote>The EXIF/TIFF standard allows for blocks of unreferenced data to
+exist in an image.  Some digital cameras write JPEG or TIFF-based RAW files
+which contain large blocks of unused data, usually filled with binary zeros. 
+The reason for this could be to simplify camera algorithms by allowing
+variable-sized information to be written at fixed offsets in the output image. 
+When ExifTool rewrites an image it does not copy these unused blocks.  This can
+result in a significant reduction in file size for some images.  <i>[The
+<code>-htmlDump</code> option may be used to view the file structure if you are
+interested in seeing these unused data blocks -- use a command like
+"<code>exiftool -htmlDump a.jpg &gt; out.html</code>", then open
 <code>out.html</code> in your web browser.  Unused data blocks are
-<span class=U>brown</span> in this output.]</i>
-</blockquote>
+<span class=U>brown</span> in this output.]</i> </blockquote>
 
 <blockquote>Also, the size of an XMP record may easily shrink or grow when it is
 rewritten, even if no meta information is changed.  This is partly due to the
@@ -1420,8 +1427,56 @@ reading, and will often catch more problems when writing, but it does not
 attempt to do a full validation.  If you are looking for a validator,
 try <a href="http://jhove.sourceforge.net">JHOVE</a>.</blockquote>
 
+<a name="Q26"></a>
+<p>26. <b>"How do I import information from a database?"</b></p>
+
+<blockquote><i>[See <a href="#Q12">FAQ number 12</a> for help with the reverse
+-- exporting metadata to a database.]</i></blockquote>
+
+<blockquote>ExifTool has the ability to import metadata from CSV and JSON format
+database files for writing to output image files. For example, the following
+commands use imported metadata to write to all image files in a directory.
+
+<pre><span class='blk'># import from CSV file</span>
+exiftool -csv="c:\Users\Phil\test.csv" "c:\Users\Phil\Images"
+
+<span class='blk'># import from JSON file</span>
+exiftool -json="c:\Users\Phil\test.json" "c:\Users\Phil\Images"</pre>
+
+For the above commands, the input CSV or JSON file must have the same format as
+the output from these commands:
+
+<pre><span class='blk'># export to CSV file</span>
+exiftool -csv "c:\Users\Phil\Images" > "c:\Users\Phil\test.csv"
+
+<span class='blk'># export to JSON file</span>
+exiftool -json "c:\Users\Phil\Images" > "c:\Users\Phil\test.json"</pre>
+
+Specifically, the first row of the CSV file must contain the tag names.
+The first column must be a special "SourceFile" column, containing the names of
+the associated image files, with paths specified in the same way as on the
+command line.  The JSON file contains similar entries, but is not structured in
+row/column format.</blockquote>
+
+<blockquote>For each image file specified on the command line, all tags for the
+database entry with the corresponding SourceFile name are written (with the
+exception of the FileName and Directory tags, which are ignored).  A special
+SourceFile name of "*" may be used to match any image file.  A warning is issued
+and nothing is written if a specified file does not match any SourceFile entry
+in the database.</blockquote>
+
+<blockquote>Tag names may be prefixed by a group name to write to a specific
+group (using the same format as when <code>-G</code> or <code>-G1</code> is
+added to the export command).  Tags with empty values are ignored.  To delete a
+tag, set the tag value to "-" and use the <code>-f</code> option when
+importing.</blockquote>
+
+<blockquote>See the <code>-csv</code> or <code>-j</code> option in the
+<a href="exiftool_pod.html#input_output_text_formatting">application documentation</a>
+for more details.</blockquote>
+
 <hr>
-<i>Last revised Mar 19, 2013</i>
+<i>Last revised Jan. 24, 2014</i>
 <p class='lf'><a href="index.html">&lt;-- Back to ExifTool home page</a></p>
 </body>
 </html>
@@ -19,7 +19,7 @@ contained in the image.  The most common use of this feature is to organize
 images by date/time, but any other tag value may also be used.</p>
 
 <p>Writing the <b>Directory</b> tag moves a file to a specified directory.  The
-directory is created if it didn't already exist.</p>
+directory is created if it doesn't already exist.</p>
 
 <p>Writing the <b>FileName</b> tag renames a file.  If the new <b>FileName</b>
 has a directory specification (ie. contains a '<code>/</code>' character), then
@@ -48,17 +48,17 @@ of <a href="#codes">common date format codes</a> is provided for reference.</p>
 <p>Writing the <b>FileName</b> and/or <b>Directory</b> tags alone causes the
 file to be renamed or moved, not copied.  However, if any "real" tags are
 written at the same time, then the file is rewritten to the new destination and
-the original file is left unchanged.  (Only the three writable "pseudo" tags,
-<b>FileName</b>, <b>Directory</b> and <b>FileModifyDate</b>, may be set without
-causing the file to be rewritten.)  If desired, the <code>-overwrite_original</code>
-option may be used to remove the original copy when the file is rewritten.</p>
+the original file is left unchanged.  (Only the four writable "pseudo" tags,
+<b>FileName</b>, <b>Directory</b>, <b>FileModifyDate</b> and 
+<b>FileCreateDate</b>, may be set without causing the file to be rewritten.)  If
+desired, the <code>-overwrite_original</code> option may be used to remove the
+original copy when the file is rewritten.</p>
 
 <p>Conversely, the <code>-o</code> option may be used to force exiftool to
 always create a copy of the file, even if no meta-information tags are written. 
 This is true even if the <code>-o</code> option is superseded by writing the
 <b>Directory</b> tag, or through a <b>FileName</b> which includes a directory
-specification.  (This is useful if you want to derive the directory name from the
-values of other tags, see <a href="#ex5">example 5</a> below.  Also see
+specification.  (See <a href="#ex5">example 5</a> below.  Also see
 <a href="#ex11">example 11</a> for the directory precedence rules.)</p>
 
 <p>If the <code>-d</code> option is used, the unformatted date/time value must
@@ -78,8 +78,9 @@ first be filtered to remove or translate these characters.  A special feature
 allows these characters to be removed from a tag value by adding a semicolon
 inside the braces after a tag name.  For example:
 <pre class=code>    exiftool "-filename&lt;${model;}.%e" c:\images</pre>
-See the <code>-p</code> option in the <a href="exiftool_pod.html">application
-documentation</a> for more details.
+This advanced formatting feature may also be used to do arbitrary reformatting
+of any tag value used in a format string.  See the <code>-p</code> option in the
+<a href="exiftool_pod.html">application documentation</a> for more details.
 </blockquote>
 
 <h2>Examples</h2>
@@ -251,6 +252,7 @@ to most systems, but additional codes may be available on your specific system
 <tr><th>%m</th><td>- month number (01-12)</td></tr>
 <tr><th>%M</th><td>- minute (00-59)</td></tr>
 <tr><th>%p</th><td>- 'AM' or 'PM'</td></tr>
+<tr><th>%s</th><td>- number of seconds since the Epoch, UTC (see note 1 below)</td></tr>
 <tr><th>%S</th><td>- seconds (00-59)</td></tr>
 <tr><th>%w</th><td>- weekday number (0-6)</td></tr>
 <tr><th>%W</th><td>- week number of the year (00-53)</td></tr>
@@ -258,10 +260,11 @@ to most systems, but additional codes may be available on your specific system
 <tr><th>%X</th><td>- preferred locale time representation</td></tr>
 <tr><th>%y</th><td>- 2-digit year (00-99)</td></tr>
 <tr><th>%Y</th><td>- 4-digit year (ie. 2006)</td></tr>
-<tr><th>%Z</th><td>- time zone name</td></tr>
+<tr><th>%z</th><td>- time zone in the form +/-hhmm (see note 1 below)</td></tr>
+<tr><th>%Z</th><td>- system time zone name (see note 2 below)</td></tr>
 <tr><th>%%</th><td>- a literal '%' character</td></tr>
 </table></blockquote>
-<p>Note that ExifTool file name format codes may be used inside a date format
+<p>ExifTool file name format codes may be used inside a date format
 string when a date/time tag is used to set the value of the <b>FileName</b> or
 <b>Directory</b> tags via the command-line interface.  In this case, an extra
 '<code>%</code>' must be added to pass the format code through the date/time
@@ -275,6 +278,16 @@ parser:</p>
 <p>See the <code>-w</code> option in the <a href="exiftool_pod.html">exiftool
 application documentation</a> for details about special features available
 with these name format codes.</p>
+<p><b>Notes:</b></p>
+<ol>
+<li>The %s and %z format codes use the time zone specified by the date/time
+value.  If the date/time value does not include a time zone specification, then
+it is interpreted as a local time in the system time zone.  These format codes
+are parsed by ExifTool, so they should work on all systems.<br><br></li>
+<li>The %Z format code ignores any time zone specified in the date/time value,
+and returns the system time-zone name for the given date/time interpreted as a
+local system time.</li>
+</ol>
 <hr>
 <p class='lf'><a href="index.html">&lt;-- Back to ExifTool home page</a></p>
 </body>
@@ -59,7 +59,8 @@ must be <a href="#Orient">user-defined</a>.</i></blockquote>
 <a name="Implementation"></a>
 <h3>Implementation</h3>
 
-<p>Geotagging is accomplished in ExifTool through the use of three special tags:
+<p>Geotagging is accomplished in ExifTool through the use of three special
+<a href="TagNames/Extra.html">Extra tags</a>:
 <code>Geotag</code>, <code>Geosync</code> and <code>Geotime</code>.</p>
 
 <blockquote class=lt><i>Note: When writing these tags, order is important. If
@@ -69,9 +70,9 @@ and <code>Geosync</code>.</i></blockquote>
 <a name="geotag"></a>
 <h4>Geotag</h4>
 
-<p>The <code>Geotag</code> tag is used to define the GPS track log data. Setting
-the value of this tag via the exiftool application activates the geotagging
-feature.  As an example, the following command line adds GPS tags to all images
+<p>The <code>Geotag</code> tag is used to define the GPS track log data. The
+geotagging feature is activated by assigning the name of a track log file to
+this tag.  As an example, the following command line adds GPS tags to all images
 in the "/Users/Phil/Pictures" directory based on GPS positions stored in the
 track log file "track.log" in the current directory:</p>
 
@@ -86,10 +87,13 @@ above:</p>
 </pre>
 
 <p>Multiple GPS log files may be loaded simultaneously by using more than one
-<code>-geotag</code> option (or by using wildcards in the filename argument
-for the <code>-geotag</code> option,  but note that here the filename may need
-to be quoted -- see the <a href="#Examples">examples</a> below).  This allows
-batch processing of images spanning different tracks with a single command.</p>
+<code>-geotag</code> option or <code>-geotag=</code> assignment in the same
+command.  This allows batch processing of images spanning different tracks with
+a single command.  Wildcards may be used in the argument of the
+<code>-geotag</code> option, but note that the argument may then need to be
+quoted on some systems to prevent shell globbing, and that wildcards are not
+supported with the <code>-geotag=</code> syntax.  See the
+<a href="#Examples">examples</a> below.</p>
 
 <p>Deleting the <code>Geotag</code> tag (with <code>-geotag=</code>) causes the
 GPS tags written by the <code>-geotag</code> feature to be deleted.</p>
@@ -509,6 +513,8 @@ one or more geotagged images:</p>
 #
 # Usage:        exiftool -p gpx.fmt -d %Y-%m-%dT%H:%M:%SZ FILE [...] > out.gpx
 #
+# Requires:     ExifTool version 8.10 or later
+#
 # Revisions:    2010/02/05 - P. Harvey created
 #
 # Notes:     1) All input files must contain GPSLatitude and GPSLongitude.
@@ -585,6 +591,8 @@ file from a collection of geotagged images:</p>
 #
 # Usage:        exiftool -p kml.fmt FILE [...] > out.kml
 #
+# Requires:     ExifTool version 8.10 or later
+#
 # Revisions:    2010/02/05 - P. Harvey created
 #               2013/02/05 - PH Fixed camera icon to work with new Google Earth
 #
@@ -636,7 +644,7 @@ file from a collection of geotagged images:</p>
 
 <hr>
 <i>Created Apr. 2, 2009</i><br>
-<i>Last revised Feb. 7, 2013</i>
+<i>Last revised Sept. 30, 2013</i>
 <p class='lf'><a href="index.html">&lt;-- Back to ExifTool home page</a></p>
 </body>
 </html>
@@ -11,418 +11,414 @@
 
 <p>RSS feed: <a href="http://owl.phy.queensu.ca/~phil/exiftool/rss.xml">http://owl.phy.queensu.ca/~phil/exiftool/rss.xml</a></p>
 
-<p><b>Note:</b> The most recent production release is <a href="Image-ExifTool-9.27.tar.gz">Version 9.27</a>. (Other versions are
+<p><b>Note:</b> The most recent production release is <a href="Image-ExifTool-9.53.tar.gz">Version 9.53</a>. (Other versions are
 considered development releases, and are not uploaded to <a href="http://search.cpan.org/dist/Image-ExifTool/">CPAN</a>.)</p>
 
 <!-- Use line width of 80 -->
 <!-- *********************************************************************** -->
 
-<a name='v9.27'><b>Apr. 15, 2013 - Version 9.27</b></a> <span class=grn>(production release)</span>
+<a name='v9.53'><b>Feb. 22, 2014 - Version 9.53</b></a></span> <span class=grn>(production release)</span>
 <ul>
-<li>Fixed "ARRAY ref" runtime error introduced in 9.25 that could occur when
-    using the -X option
-<li>Fixed runtime warning which could occur when conditionally deleting XMP
-    structure
+<li>Added user-defined file types feature
+<li>Added support for a few more XMP-expressionmedia tags
+<li>Decode CameraTemperature from a few new Canon models
+<li>Decode another Sony tag (thanks Jos Roost)
+<li>Recognize the JXR extension
+<li>Changed wording of IPTC "Unrecognized data" warning
+<li>Patched round-off error problem in seconds of some date/time values
+<li>Fixed problem creating EXV files with the -o option
+<li>Fixed problem conditionally replacing Extra block-type tags
 </ul>
 
-<a name='v9.26'><b>Apr. 13, 2013 - Version 9.26</b></a>
+<a name='v9.52'><b>Feb. 17, 2014 - Version 9.52</b></a>
 <ul>
-<li>Added read support for FLIR FFF and FPF images and decode more FLIR tags
-<li>Added some new Pentax LensType's and Nikon LensID's
-<li>Added a few new Panasonic ContrastMode values
-<li>Decode a number of Canon 6D tags
-<li>Allow CanonRaw tags to be written using "CIFF" as a group name
-<li>Improved decoding of Canon ColorData information for newer EOS models
-<li>Improved decoding of a number of Sony tags (thanks Jos Roost)
-<li>Removed index number from duplicate Composite TagID's in XML output
-<li>Fixed byte-order problem for a few Nikon D5200 and D7100 tags
-<li>Fixed incompatibility with old-style (pre-8.46) XMP user-defined structure
-    definitions
+<li>Fixed bug introduced in 9.44 which resulted in incorrect maker note offsets
+    when copying maker notes from DNG images of some Pentax models
 </ul>
 
-<a name='v9.25'><b>Apr. 6, 2013 - Version 9.25</b></a> <span class=grn>(production release)</span>
+<a name='v9.51'><b>Feb. 15, 2014 - Version 9.51</b></a>
 <ul>
-<li>Added read support for FLIR thermal image metadata in JPEG images
-<li>Added write support for DNG version 1.4 images
-<li>Added a new Pentax DriveMode value and a new Pentax LensType
-<li>Added two new Olympus CameraType values
-<li>Added print conversion for XMP Flash tags to provide alternate language
-    support
-<li>Decode a few more Nikon and Pentax tags
-<li>Decode more Sony tags (thanks Jos Roost)
-<li>Decode more Panasonic tags and changed decoding of others
-<li>Enhanced -j and -php options to work with -D, -H and -l
-<li>Improved German translations (thanks Herbert Kauer)
-<li>Patched decoding of QuickTime date/time tags to accommodate Samsung and Sony
-    cameras that use an incorrect time zero of 1970 instead of 1904.  This patch
-    will only work for videos produced before 2036, so hopefully Samsung and
-    Sony will fix this problem at their end before then (care to place a wager?)
-<li>Fixed issues when using "-wm cg" and writing metadata as a block
-<li>Fixed possible "division by zero" error when reading undefined XMP rational
+<li>Added a number of new CanonModelID values
+<li>Added a new Sony/Minolta LensType (thanks Jos Roost)
+<li>Added a new Panasonic BurstMode
+<li>Added a new Pentax LensType
+<li>Added new ColorSpaceTags shortcut
+<li>Decode a number of new PanasonicRaw tags (thanks LibRaw)
+<li>Decode ColorData tags for the new Canon EOS 1200D
+<li>Improved Sony maker note decoding for some newer models (thanks Jos Roost)
+<li>Fixed conversion of XMP:LensID for Pentax lenses on Ricoh-branded cameras
+</ul>
+
+<a name='v9.50'><b>Feb. 8, 2014 - Version 9.50</b></a>
+<ul>
+<li>Added support for Exiv2 EXV metadata files
+<li>Added ability to read/write/copy GeoTiff tags as a block
+<li>Added ability to combine -b with -j to write base64-encoded binary data in
+    JSON output format
+<li>Added a new Nikon LensID
+<li>Added a new Sony/Minolta LensType (thanks Jos Roost)
+<li>Added new Extra ProcessingTime tag
+<li>Added a new Olympus CameraType
+<li>Added header signature to .EXIF files
+<li>Decode a new Olympus tag (thanks LibRaw)
+<li>Improved conversion of some Canon RecordMode values
+<li>Improved decoding of tags for Hasselblad Stellar (thanks Jos Roost)
+<li>Fixed -htmlDump offsets for information extracted from some embedded images
+<li>Fixed hemisphere problem in Composite GPS tags derived from
+    QuickTime:LocationInformation
+<li>API Changes:
+    <ul>
+    <li>Option names are now case insensitive
+    </ul>
+</ul>
+
+<a name='v9.49'><b>Feb. 1, 2014 - Version 9.49</b></a>
+<ul>
+<li>Added new Olympus and Samsung LensType values, and fixed an Olympus lens
+    name (thanks Niels Kristian Bech Jensen)
+<li>Added another Polish tag translation (thanks Kacper Perschke)
+<li>Added a new Panasonic ColorEffect value
+<li>Decode a new FujiFilm tag (thanks LibRaw)
+<li>Adjusted scaling factor for H264 ExposureTime values (thanks Francois)
 </ul>
 
-<a name='v9.24'><b>Mar. 23, 2013 - Version 9.24</b></a>
+<a name='v9.48'><b>Jan. 25, 2014 - Version 9.48</b></a>
 <ul>
-<li>Added ability to overwrite plus append output files (-w+!)
-<li>Added support for Sigma X3F version 3.0 images
-<li>Added a few new values for some Pentax tags
-<li>Added a few new CanonModelID's
-<li>Decode Nikon D5100 and D5200 custom settings plus a few other Nikon tags
-<li>Allow the value for missing tags extracted with the -f option to be
-    configured via the API MissingTagValue setting (default is still "-")
-<li>Improved decoding of Sony LensSpec (again, thanks Jos Roost)
-<li>Fixed bug reading QuickTime extended-size atoms
+<li>Added a new GeoTiff tag
+<li>Added a couple of new Canon LensType values
+<li>Added a few new XMP DarwinCore tags
+<li>Updated Sony MakerNotes for the ILCE-5000 (thanks Jos Roost)
+<li>Improved Polish translations (thanks Kacper Perschke)
+<li>Fixed problem writing RicohSubdirIFD in GR images
+<li>Fixed runtime error when writing PNG image with a TIFF-format EXIF profile
 </ul>
 
-<a name='v9.23'><b>Mar. 10, 2013 - Version 9.23</b></a>
+<a name='v9.47'><b>Jan. 18, 2014 - Version 9.47</b></a>
 <ul>
-<li>Added -W (-tagOut) and -Wext (-tagOutExt) options to allow multiple tags
-    to be extracted to separate output files from a single source file
-<li>Added append feature to -w (-w+)
-<li>Added ability to extract SoundFile from Ricoh RMETA
-<li>Added more SonyModelID and Sony LensType values and improved Sony LensType
-    decoding (thanks Jos Roost)
+<li>Added read support for JPEG-HDR APP11 information
+<li>Added read support for Media Jukebox APP9 information
 <li>Added a new Olympus LensType (thanks Niels Kristian Bech Jensen)
-<li>Added another Pentax LensType
-<li>Decode more Nikon flash information (thanks Alyda Gilmore for the samples)
-<li>Decode Pentax Kelvin white balance tags (thanks Klaus Homeister)
-<li>Extract PDF embedded image color space
-<li>Improved Spanish translations (thanks Emilio Sancha)
-<li>More patches to avoid "APP1 segment too large" errors when copying all tags
-    from some RAW images
+<li>Added a few new Nikon LensID's (thanks Robert Rottmerhusen)
+<li>Added a new Minolta/Sony LensType and fixed some Tamron lens names (thanks
+    Jos Roost)
+<li>Decode more FLIR tags (thanks Tomas)
+<li>Patched for quirk in Kodak PixPro AZ362 maker notes
 </ul>
 
-<a name='v9.22'><b>Mar. 2, 2013 - Version 9.22</b></a>
+<a name='v9.46'><b>Jan. 11, 2014 - Version 9.46</b></a> <span class=grn>(production release)</span>
 <ul>
-<li>Fixed problem extracting metadata from encrypted embedded JPEG images in PDF
-    files and added the ability to extract JPEG 2000 information too
+<li>Added a few Nikon lenses (thanks Niels for two)
+<li>Added a few new XMP-xmpDM tags (thanks Mats Peterson)
+<li>Added a new Pentax DriveMode (thanks Doug O'Brien)
+<li>Added a new Olympus lens (thanks Niels Kristian Bech Jensen)
+<li>Decode a number of new QuickTime tags
+<li>Decode a few new Canon filter tags
+<li>Improved -d option to properly handle time zones with %s and %z
+<li>Improved conversions for Panasonic Composite AdvancedSceneMode
+<li>Changed a few Tamron lens strings (thanks Niels Kristian Bech Jensen)
+<li>Patched to avoid round-off errors in seconds of filesystem time tags
+<li>Fixed extraction of CompressorID for some MOV videos
 </ul>
 
-<a name='v9.21'><b>Mar. 2, 2013 - Version 9.21</b></a>
+<a name='v9.45'><b>Dec. 21, 2013 - Version 9.45</b></a>
 <ul>
-<li>Added ability to extract embedded images and their metadata from PDF files
-<li>Added read support for binary-format PLIST files
-<li>Added support for Sigma DP3 Merrill maker notes
-<li>Added a few new Sigma LensType values
-<li>Added a new FujiFilm PictureMode value
-<li>Decode a number of new Pentax tags (thanks Klaus Homeister)
-<li>Decode more Sony tags (thanks Jos Roost)
-<li>Decode some new Nikon D800 tags (thanks Alyda Gilmore for the samples)
-<li>Decode a number of new tags in 3GP videos
-<li>Decode Pentax CameraType
-<li>Made a few more DNG tags writable (but protected)
-<li>Fixed problem reading XREF table of some PDF files
-<li>API Changes:
-    <ul>
-    <li>The CombineInfo() routine is now deprecated because it is likely that
-        nobody ever used it.  If anyone actually uses this, please let me know
-    </ul
-</li>
+<li>Added details about movie data offset in MOV verbose dump
+<li>Added a new Pentax WhiteBalance value
+<li>Added a new Sony/Minolta LensType (thanks Jos Roost)
+<li>Decode a new QuickTime tag
+<li>Prevent illegal tag names to be generated from user-defined XMP tags
+<li>Patched to allow reading some improperly formatted EXIF UserComment values
+<li>Fixed problem where reading some large M2TS files could take a loooong time
 </ul>
 
-<a name='v9.20'><b>Feb. 20, 2013 - Version 9.20</b></a>
+<a name='v9.44'><b>Dec. 11, 2013 - Version 9.44</b></a>
 <ul>
-<li>NOTICE: This release fixes a problem in the 9.19 Windows version that could
-    cause ExifTool to crash when writing metadata to some files  (it seems that
-    one of the files in the 9.19 Windows package was corrupted)
-<li>Added a new PentaxModelID
-<li>Added write support for a few Getty Images XMP tags
-<li>Decode Sony AFAreaModeSetting (thanks Jos Roost)
+<li>Added a new Pentax WhiteBalance value
+<li>Added back the K-3 SRResult tag, but make it Unknown and with no print
+    conversion
+<li>Fixed problem copying the maker notes of some recent Pentax models
 </ul>
 
-<a name='v9.19'><b>Feb. 20, 2013 - Version 9.19</b></a>
+<a name='v9.43'><b>Dec. 8, 2013 - Version 9.43</b></a>
 <ul>
-<li>Added read support for Phase One IIQ maker notes
-<li>Added a couple of new Minolta Teleconverter values
-<li>Patched problem which could result in runtime warning when extracting
-    information from a file with an incorrectly formatted PreviewImage pointer
-<li>Improved handling of unknown maker notes when writing to reduce the chance
-    of corruption (fixes problem of corrupted SilverFast maker notes)
-<li>Fixed bug in HtmlDump where unused bytes at end of MakerNotes were not shown
-    if they came at the end of a TIFF-format file
+<li>Added a new Olympus CameraType
+<li>Added new Canon and Pentax LensType values
+<li>Added a new Panasonic ShootingMode
+<li>Added a new CanonModelID
+<li>Decode a number of new Sony Tags (thanks Jos Roost)
+<li>Decode a new Pentax tag
+<li>Fixed decoding of a few Pentax tags for newer models
+<li>Fixed decoding of CameraTemperature for Olympus Stylus 1
+<li>Fixed bug when writing QuickTime date/time tags with QuickTimeUTC option set
 </ul>
 
-<a name='v9.18'><b>Feb. 16, 2013 - Version 9.18</b></a>
+<a name='v9.42'><b>Dec. 1, 2013 - Version 9.42</b></a>
 <ul>
-<li>Decode more AF information for Sony SLT models (thanks Andy Johnson for the
-    samples)
-<li>Recognize CameraInfo and ColorData information from newer Canon 1DX firmware
-<li>Organized support files in full Perl distribution into separate directories
-<li>Improved German and Spanish translations (thanks Herbert Kauer and Emilio
-    Sancha)
-<li>Fixed inconsistency where a priority tag could be hidden by a same-named tag
-    in the same group when using the -j or -X option combined with -g or -G
-<li>Fixed problem in standard tests that could cause ExifTool test 25 to fail
+<li>Added a new Canon LensType (thanks Norbert Wasser)
+<li>Added a new Pentax LensType (thanks Louis Granboulan)
+<li>Added a new Sony LensType (thanks Fredrik Agert)
+<li>Added a new Nikon LensID (thanks LibRaw)
+<li>Added a new Olympus CameraType
+<li>Decode a number of new Sony tags (thanks Jos Roost)
+<li>Decode a number of new Panasonic tags (thanks Thomas Modes)
+<li>Decode a few new Pentax tags (thanks Klaus Homeister and others)
+<li>Improved Olympus SensorTemperature calibration (thanks Eric Sibert)
+<li>Patched decoding of EXIF:UserComment to tolerate invalid character code
+    written by Canon Zoombrowser EX 4.5
+<li>Patched to allow GPS information to be extracted from incorrectly formatted
+    EXIF written by Windows Phone OS 7.5 (observed in some HTC and Nokia phones)
+<li>Fixed runtime warnings which could occur when -j or -php combined with -f
 </ul>
 
-<a name='v9.17'><b>Feb. 9, 2013 - Version 9.17</b></a>
+<a name='v9.41'><b>Nov. 16, 2013 - Version 9.41</b></a>
 <ul>
-<li>Added PLIST and MODD to the list of supported file extensions
-<li>Added track name to UserData tags within QuickTime tracks
-<li>Added a new Pentax LensType (thanks Pietu Pohjalainen)
-<li>Added a new Canon LensType
-<li>Decode binary data in PLIST and MODD files
-<li>Decode new Canon 1DX CustomFunctions
-<li>Issue a minor warning and ignore duplicate PDF Info dictionaries unless the
-    -m option is used
-<li>Improved date/time parsing when writing to allow single-digit fields
-<li>Improved decoding/naming of a few Sony tags (thanks Jos Roost)
-<li>Improved German translations (thanks Herbert Kauer)
-<li>Changed a few PLIST tag names
-<li>Fixed decoding of Olympus CameraType for some models
-<li>Fixed problem calculating AvgBitrate for some video files
-<li>Fixed problem writing Canon:LensSerialNumber
+<li>Added the ability to use multiple group qualifiers on tag names when writing
+    and copying (ie. "-QuickTime:Time:All=now")
+<li>Added ability to geotag from Google Location Services KML files
+<li>Added a new Pentax LensType (thanks Louis Granboulan)
+<li>Added a new Canon LensType (thanks David Monro)
+<li>Added a new Sony LensType2 (thanks Jos Roost)
+<li>Decode a bunch more Nikon, Canon, Sony and FujiFilm WhiteBalance tags
+    (thanks LibRaw)
+<li>Extract information from the new Pentax APP7 segment
 </ul>
 
-<a name='v9.16'><b>Feb. 2, 2013 - Version 9.16</b></a>
+<a name='v9.40'><b>Nov. 8, 2013 - Version 9.40</b> - "Write QuickTime"</a>
 <ul>
-<li>Added support for DarwinCore XMP tags
-<li>Added support for CinemaDNG tags
-<li>Added basic support for parsing XML PLIST information, and use this to
-    extract tags from QuickTime iTunesInfo Data
-<li>Added a new Pentax lens (thanks Niels Kristian Bech Jensen)
-<li>Added some new Sony E-mount lenses (thanks Jos Roost)
-<li>Added a new NEFBitDepth value (thanks Jos Roost)
-<li>Added a new CanonModelID
+<li>Added ability to write XMP and edit date/time tags in QuickTime-format files
+    (ie. MOV, MP4)
+<li>Added -api option to allow API options to be set via the command line
+<li>Added ability to specify family 2 group name when writing
+<li>Added write support for a number of new XMP tags
+<li>Added a new Nikon LensID
+<li>Added new Canon and Minolta/Sony LensType values (thanks Jos Roost)
+<li>Added a few of the new values defined in the DICOM 2011 specification
+<li>Add standard XMP to a PNG image when writing, even if XMP already exists in
+    another non-standard chunk
 <li>Decode a few more Sony tags (thanks Jos Roost)
-<li>Improved decoding of QuickTime iTunesInfo tags
-<li>Improved Spanish translations (thanks Emilio Sancha)
-<li>Improved handling of errors in Perl expression of new formatting feature
-<li>Improved -p option to also handle structures
-<li>Changed a number of Sigma lens names for Olympus to conform with official
-    Sigma model names (thanks Niels Kristian Bech Jensen)
-<li>Moved the MWG XMP tags documentation to the MWG page
-<li>Patched to allow reading GPX track logs with no version number
-<li>Fixed problem reading an ID3 POPM frame with a missing counter
-<li>Fixed bug which could cause "uninitialized value" runtime warning when
-    reading Nikon maker notes with an empty RetouchHistory
+<li>Decode a few more QuickTime tags
+<li>Decode a few more Panasonic tags (thanks Thomas Modes)
+<li>Extract EXIF information from WEBP images
+<li>Extract a few more unknown tags in Samsung MP4 videos
+<li>Extract ProfileName from the PNG iCCP chunk
+<li>Improved error message if no matches found when writing to tag(s) specified
+    by wildcards
+<li>Improved XML output so EXIF tags now report a count (if constant, and > 1)
+<li>Avoid writing a few XMP-crs tags which have XMP-exifEX equivalents unless
+    specified explicitly
+<li>Patched POD documentation in MIE.pm to remove non-ASCII characters
+<li>Fixed bug adding back XMP tags in PDF files after deleting all in the same
+    command (also made XMP the preferred group when writing PDF files)
+<li>Fixed bug extracting some font information from QuickTime videos
+<li>Fixed inconsistencies in behaviour when extracting XML as a block from
+    JPEG2000 images
+<li>Fixed problem where FileName was changed when using -srcfile option and
+    writing only the Directory
 <li>API Changes:
     <ul>
-    <li>Compatibility Notice: The MWG Composite tags are no longer automatically
-        loaded just by using the MWG module.  Image::ExifTool::MWG::Load() must
-        now be called explicitly to load these tags
+    <li>Added the PNGEarlyXMP option
     </ul>
-</ul>
-
-<a name='v9.15'><b>Jan. 27, 2013 - Version 9.15</b></a>
-<ul>
-<li>Added advanced formatting feature to -p and -tagsFromFile options
-<li>Added -echo3 and -echo4 options
-<li>Added a few more Olympus LensType values, removed one, changed some lens
-    names for consistency (all thanks Niels Kristian Bech Jensen), and use
-    hexadecimal instead of decimal for numerical LensType values
-<li>Added a number of new Sony E-mount lenses
-<li>Added a new Tamron lens for Sony (thanks Marcin Krol)
-<li>Trim trailing spaces from Panasonic LensType strings
-<li>Fixed bug which could cause "Can't call method GetMarkerPointers" runtime
-    warning when writing certain types of corrupted images
-<li>Fixed problem copying PrevewImage from some corrupted files
-<li>Fixed problem identifying a Sigma lens for Nikon at some focal lengths 
-<li>API Changes:
+<li>Internal Changes:
     <ul>
-    <li>Added AddUserDefinedTags() method
-    <li>Added formatting feature for tag values in SetNewValuesFromFile()
+    <li>Changed all "$exifTool" variable names to "$et" throughout -- my
+        apologies to the diff engines
     </ul>
 </ul>
 
-<a name='v9.14'><b>Jan. 18, 2013 - Version 9.14</b></a>
+<a name='v9.39'><b>Oct. 19, 2013 - Version 9.39</b></a>
 <ul>
-<li>Added -wm (-writeMode) option to provide control over tag write/create mode
-<li>Added ability to use wildcards in target tag names when writing
-<li>Added ability to read/write Jpeg2000 XML tag as a block
-<li>Added ability to delete MPF segment (with -MPF:All=)
-<li>Added a number of new Olympus lenses (thanks Niels Kristian Bech Jensen)
-<li>Added a new Nikon LensID (thanks Robert Rottmerhusen)
-<li>Added a number of new Pentax LensType's (thanks Alan Robinson for one)
-<li>Added a few new CanonModelID's and Canon LensType's
-<li>Decode ID3v2 POPM and OWNE frames
-<li>Decode new Canon 6D CustomFunctions
-<li>Improved calculation of ScaleFactor35efl for Canon cameras
-<li>Changed priority of PDF Info tags so tags from most recent Info dictionary
-    take precedence (to partially accomodate the questionable Acrobat Pro
-    incremental update technique)
-<li>Changed some verbose warnings when attempting to write "unsafe" tags
-<li>Changed behaviour so that "unsafe" tags are not copied for any tag specified
-    using a wildcard (previously this was the behaviour for a tag name of 'all'
-    or '*', but not names like 'gps*')
-<li>Fixed bug where a Composite tag could sometimes not be generated when the
-    -struct option was used if the tag was derived from an XMP List-type tag
-<li>Fixed problem conditionally deleting GIF Comment and MIE tags
-<li>Fixed decoding of RawImageWidth/Height from FujiFilm X-E1 RAF images
-<li>API Changes:
-    <ul>
-    <li>Added WriteMode option
-    </ul>
+<li>Added a new PentaxCameraID and some new LensTypes (thanks Louis Granboulan)
+<li>Added a new Nikon LensID
+<li>Added a new Panasonic ShutterType
+<li>Additions and improvements to Pentax makernote decoding for K-3
+<li>Decode a number of new tags including purchase information from MP4 videos
+<li>Decode FLIR information acquired by Extech MeterLink meters (thanks Tomas)
+<li>Decode more Sony tags (thanks Jos Roost)
+<li>Patched to suppress the run-time "No such file or directory" error that has
+    been seen when using the -csv option on Windows systems
 </ul>
 
-<a name='v9.13'><b>Jan. 10, 2013 - Version 9.13</b></a> <span class=grn>(production release)</span>
+<a name='v9.38'><b>Oct. 7, 2013 - Version 9.38</b></a>
 <ul>
-<li>Added basic validation of ExifVersion and FlashpixVersion tags when writing
-<li>Fixed problem where MPF PreviewImage was lost when editing metadata in JPEG
-    images from the Nikon D4, D600 or D800
+<li>Added read support for DPX images
+<li>Added a new Pentax LensType
+<li>Added a few new CanonModelID values
+<li>Added a new XMP-apple-fi tag
+<li>Decode a few more Canon tags (thanks Tomasz Kawecki)
+<li>Decode a few more Sony tags (thanks Jos Roost)
+<li>Improved the names of a few Apple tags (thanks Neal Krawetz) and added new
+    Composite tag
+<li>Tolerate NMEA sentences with missing degrees written by some crappy software
+<li>Changed Duration conversion to print number of days if more than 24 hours
 </ul>
 
-<a name='v9.12'><b>Jan. 2, 2013 - Version 9.12</b></a> <span class=grn>(production release)</span>
+<a name='v9.37'><b>Sept. 14, 2013 - Version 9.37</b></a>
 <ul>
-<li>Fixed problem introduced in 9.10 preserving file modification date/time when
-    some options are used
+<li>Added support for maker notes from Apple iPhone5 iOS 7
+<li>Added two more Torrent tags
+<li>Added a new Pentax DigitalFilter
+<li>Added new Olympus CameraType and LensType values
+<li>Decode a couple more Olympus tags
+<li>More improvements to Sony decoding (thanks Jos Roost)
+<li>Improved decoding of Scalado JPEG APP4 information
+<li>Fixed problem where a PreviewImage could be reported in either the File or
+    Composite group, depending on the details of the command
 </ul>
 
-<a name='v9.11'><b>Jan. 2, 2013 - Version 9.11</b></a> <span class=grn>(production release)</span>
+<a name='v9.36'><b>Sept. 7, 2013 - Version 9.36</b></a>
 <ul>
-<li>Improved decoding of some Sony tags
-<li>Changed 3 tag names to avoid a leading digit to fix XML validation problem
-<li>Fixed bug introduced in 9.04 that could double-encipher some Sony MakerNote
-    information when writing (affected files are fixed by writing any tag with
-    ExifTool 9.11)
+<li>Added read support for BitTorrent description files (bencode format)
+<li>Added a couple of new Nikon LensID's (thanks J&uuml;rgen Sahlberg)
+<li>Added support for PNG 8bim raw profile
+<li>Added or fixed a few Pentax LensType values (thanks Louis Granboulan)
+<li>Added ability to delete DNGAdobeData and DNGPrivateData
+<li>Decode more Sony tags and improved decoding of others (thanks Jos Roost)
+<li>Decode a number of new FujiFilm tags and fixed 2 incorrect Saturation values
+<li>Decode a number of Canon CameraInfo tags for the 70D (thanks Tomasz Kawecki)
+<li>Patched to issue minor warning and extract only the first 1000 values from
+    XMP list-type tags containing more than 1000 items (all values may be
+    extracted by ignoring this warning with the -m option)
+<li>Patched decoding of PNG IPTC raw profile to allow either IIM or IRB data
+<li>Flagged ImageSourceData as "unsafe" (avoids excessive memory usage when
+    copying all tags because this data may be larger than the image itself for
+    Photoshop TIFF images)
+<li>Disabled feature introduced in version 9.14 which allowed multiple tags
+    (specified by wildcards) to be copied into a single list.  This feature had
+    the unintended side-effect of generating duplicate list items when copying
+    list-type tags if there were multiple source tags with the same name.  If
+    necessary, -addTagsFromFile may still be used to copy the values of multiple
+    tags into a single list.
 </ul>
 
-<a name='v9.10'><b>Dec. 29, 2012 - Version 9.10</b></a>
+<a name='v9.35'><b>Aug. 17, 2013 - Version 9.35</b></a>
 <ul>
-<li>Added write support for a few new XMP-crs and XMP-photomech tags
-<li>Added a new Samsung LensType (thanks Jaroslav Stepanek)
-<li>Added a new Pentax LensType (thanks Helmut Sch&uuml;tz)
-<li>Added a new Canon LensType
-<li>Decode Sony A99 FocusMode (thanks Michael Tapes for the samples)
-<li>Tolerate (but warn about) up to 4 bytes of garbage at start of EXIF segment
-<li>Changed -P option to also preserve FileCreateDate on Windows (requires
-    Win32API::File::Time)
-<li>Changed "[minor]" warning messages to capitalize the "M" (ie. "[Minor]") if
-    processing is affected when the warning is ignored
-<li>Patched to avoid problem of slow processing with some corrupted EXIF
+<li>Added a new Canon LensType (thanks Oliver)
+<li>Added two new Olympus CameraType values
+<li>Added some new Pentax LensType values (thanks Louis Granboulan)
+<li>Added a new RIFF StreamType value
+<li>Decode a number of new Sony tags (thanks Jos Roost)
+<li>Decode CameraTemperature from more Canon models
+<li>Extract thumbnail information from Leica X VARIO MP4 videos
+<li>Improved decoding of Pentax LensData (thanks Louis Granboulan)
+<li>Patched to avoid a warning for the messed-up Leica M maker notes
+<li>Changed a few Pentax Samsung/Schneider lens names for consistency
+<li>Changed "Can't delete" message to indicate if the tag is Permanent
+<li>Fixed the case of a few tag names (thanks Romain)
 </ul>
 
-<a name='v9.09'><b>Dec. 15, 2012 - Version 9.09</b></a>
+<a name='v9.34'><b>July 27, 2013 - Version 9.34</b></a>
 <ul>
-<li>Added a few new Google XMP GPano tags
-<li>Added a new Olympus CameraType
-<li>Added a couple of new Minolta LensTypes
-<li>Added two new Nikon LensID's (thanks David P&uuml;schel and Robert
-    Rottmerhusen)
-<li>Decode Nikon D7000 AFPointsUsed and make this tag writable
-<li>Decode a new Olympus tag (thanks Christoph Anton Mitterer)
-<li>Renamed one of the FujiFilm RAF RawImageWidth/Height pairs to
-    RawImageFullWidth/Height
-<li>Changed -stay_open when combined with -q to flush output after each command
-    (as already done without -q) (requires IO::Handle)
-<li>Fixed problem shifting FileCreateDate when writing other "real" tags in the
-    same command
+<li>Added support for Ricoh GR maker notes (in MOV videos too)
+<li>Added a new Olympus LensType (thanks Niels Kristian Bech Jensen)
+<li>Added a new Canon LensType (thanks Norbert Wasser)
+<li>Added support for Sony DSC-TF1 maker notes (thanks Jos Roost)
+<li>Added patch for messed up Leica M (Typ 240) MakerNote trailer
+<li>Added a few new CanonModelID's and a few new PentaxModelID's
+<li>Added some new XMP-crs tags written by LR5
+<li>Added a few new Nikon LensID's
+<li>Decode a number of new Ricoh GR tags (thanks Tim Gray)
+<li>Recognize the Nikon SB-700 external flash
+<li>Updated MWG location tags to conform with the MWG 2.0 specification (but
+    continue writing legacy IPTC Core location tags)
+<li>Removed "[Minor]" designation from "excessive count" warning if count is
+    greater than 2M
+<li>Avoid processing multiple EXIF IFD's if only one should exist
 </ul>
 
-<a name='v9.08'><b>Nov. 26, 2012 - Version 9.08</b></a>
+<a name='v9.33'><b>July 13, 2013 - Version 9.33</b></a>
 <ul>
-<li>Fixed bug introduced in 9.07 that broke writing of FileModifyDate
+<li>Added support for EXIF UTF-16 Unicode text (previously treated as UCS-2)
+<li>Added support for Leica X Vario maker notes
+<li>Added a couple of new SonyModelID values (thanks Jos Roost)
+<li>Added a new CanonModelID and a new Olympus CameraType
+<li>Added a new Canon LensType
+<li>Added a new Olympus LensType (thanks Niels Kristian Bech Jensen)
+<li>Decode some new Panasonic tags and added values for others (thanks Thomas)
+<li>Improved decoding of Olympus RawDevArtFilter
+<li>Improved decoding of some Sony tags for the RX100M2
+<li>Changed application to always return an error status when exiting if an
+    error was encountered when extracting information
 </ul>
 
-<a name='v9.07'><b>Nov. 24, 2012 - Version 9.07</b></a>
+<a name='v9.32'><b>June 22, 2013 - Version 9.32</b></a>
 <ul>
-<li>Added ability to read/write FileCreateDate (Windows only)
-<li>Added ability to read FileInodeChangeDate (non-Windows only)
-<li>Added support for new tags in DNG 1.4 specification
-<li>Added support for Google Photosphere GPano XMP tags
-<li>Added a couple of new Olympus filter effects
-<li>Changed a Panasonic LensType (thanks Olaf Ulrich)
-<li>API Changes:
-    <ul>
-    <li>Enhanced SetFileModifyDate() to write FileCreateDate (Windows only)
-    </ul>
+<li>Added support for "Exif 2.3 for XMP" tags
+<li>Added a few new Olympus LensTypes (thanks Niels Kristian Bech Jensen)
+<li>Added a few new PentaxModelID's
+<li>Added two new Samsung LensType values (thanks Pascal de Bruijn)
+<li>Decode a new Olympus tag
+<li>Fixed problem extracting audio comments from Ricoh G700SE images
+<li>Fixed a non-conforming CanonModelID string
 </ul>
 
-<a name='v9.06'><b>Nov. 17, 2012 - Version 9.06</b></a>
+<a name='v9.31'><b>June 8, 2013 - Version 9.31</b></a>
 <ul>
-<li>Added support for Nikon maker notes in images from any camera make (as
-    written by Capture NX2)
-<li>Added support for FujiFilm X-E1 RAF images
-<li>Added a new Olympus CameraType
-<li>Added a new PentaxModelID and a new Pentax LensType
-<li>Extract FileCreateDate (Windows) and FileInodeChangeDate (other systems)
-<li>Fixed bug decoding UTF-16 ID3 synchronized lyrics
+<li>Added a number of new Photoshop tags (but marked as Unknown)
+<li>Added a few new values for some Olympus tags
+<li>Added conversion for Olympus SensorTemperature
+<li>Added two new CanonModelID's
+<li>Added support for Reconyx firmware 4.0.0
+<li>Decode a number of new QuickTime and FLIR tags in MP4 videos
+<li>Decode more Sony tags (thanks Jos Roost)
+<li>Decode a new Olympus tag
+<li>The API List option may now be used in the config file for the same effect
+    as -sep when combined with the -X, -j or -php option on the command line
+<li>Fixed problem where some QuickTime string values could have terminating NULL
+    characters, which caused problems when renaming files using these tags
 </ul>
 
-<a name='v9.05'><b>Nov. 10, 2012 - Version 9.05</b></a>
+<a name='v9.30'><b>May 25, 2013 - Version 9.30</b></a>
 <ul>
-<li>Added ability to read APE metadata from MP3 audio files
-<li>Decode ID3 synchronized lyrics/text information
-<li>Decode maker notes in Leica V-LUX40 MP4 videos
-<li>Decode Sony A99 AFPointSelected (thanks Michael Tapes for the samples)
-<li>Improved decoding of some Sony tags (thanks Jos Roost)
-<li>API Changes:
-    <ul>
-    <li>Removed GeoNoInterpolate option (just set GeoMaxIntSecs to 0 instead)
-    </ul>
+<li>Added a new Canon LensType
+<li>Decode many Canon 700D CameraInfo tags
+<li>Also delete null characters with the default advanced formatting filter
+<li>Tolerate leading whitespace in HTML files
+<li>Fixed decoding of Canon 650D CameraInfo FocalLength
+<li>Fixed bug in new advanced formatting feature which gave incorrect
+    output when used in the -p option for processing multiple files
 </ul>
 
-<a name='v9.04'><b>Nov. 3, 2012 - Version 9.04</b></a> <span class=grn>(production release)</span>
+<a name='v9.29'><b>May 18, 2013 - Version 9.29</b></a>
 <ul>
-<li>Added two new Sony LensType values (thanks Matthias Paul)
-<li>Added a few new Canon LensType values
-<li>Added a couple of new PentaxModelID's and decode some new K-5 II values
-<li>Added support for some new XMP tags written by the Apple iPhone 5
-<li>Added a new Olympus CameraType
-<li>Decode more Sony tags/values (thanks Jos Roost)
-<li>Decode Nikon HDRInfo (thanks Stefan)
-<li>Decode some FlashInfo tags for new Nikon models
-<li>Decode a few WM ID3 tags (some documentation on these would be nice)
-<li>Fixed bug which could cause truncated/garbage ID3v2 strings to be returned
-<li>Fixed -globalTimeShift option to also work when copying tags
-<li>Fixed decoding of Nikon AFFineTuneAdj for FirmwareVersion 1.10B (thanks
-    Michael Tapes for the samples for this and the A77)
-<li>Fixed problem where a few tags (FileSequence, NewGUID and Now) were not
-    available for use with the -p option
-<li>API Changes:
-    <ul>
-    <li>Added RequestAll and GeoNoInterpolate options
-    <li>Fixed problem in SetNewValue when setting the Raw value of some tags
-    </ul>
+<li>Added another H264 Model value (thanks Rob Lewis)
+<li>Added support for Canon 5DmkIII firmware version 1.2.1
+<li>Added recognition of IBM AVC video files
+<li>Added a new CanonModelID
+<li>Decode more FLIR tags (thanks Tomas)
+<li>Decode H264 MDPM TimeCode
+<li>More improvements to Sony LensType decoding (thanks Jos Roost)
+<li>Extract information from the ASF Metadata Library in WMV files
+<li>Extract ColorBalanceVersion for unknown Nikon ColorBalance information
+<li>Updated some ID3 Genre names (thanks Mats Peterson)
+<li>Fixed warning when using -p with a string containing a newline
+<li>Fixed some incorrect Pentax Q LensType values
 </ul>
 
-<a name='v9.03'><b>Oct. 13, 2012 - Version 9.03</b></a>
+<a name='v9.28'><b>Apr. 21, 2013 - Version 9.28</b></a>
 <ul>
-<li>Added new feature to provide control over directory levels in %d strings
-<li>Added ability to write OtherImage in NEF images
-<li>Added a new Pentax LensType
-<li>Added a few new CanonModelID's (thanks Laurent Clevy)
-<li>Added a new Nikon LensID (thanks Geert De Soete)
-<li>Added a few new Olympus CameraType values
-<li>Decode some new CameraInfo tags for the Canon EOS 650D
-<li>Decode a number of new Sony tags (thanks Jos Roost)
-<li>Improved decoding of some Sigma tags for the DP1/DP2 Merrill
-<li>Give priority to EXIF tags over SigmaRaw tags X3F images
-<li>Changed Samsung lens names to include "NX" (thanks Jaroslav Stepanek)
-<li>Fixed misleading verbose "TAG is not writable" messages when copying
-    list-type tags
+<li>Added the ability to delete unknown JPEG APP segments by segment name
+<li>Added a bunch of new ID3 Genre values (thanks Mats Peterson)
+<li>Decode a few more Sony tags (thanks Jos Roost)
+<li>Decode a few more tricky FLIR tags (thanks Tomas)
+<li>Improved Dutch language translation (thanks Peter van der Laan)
+<li>Patched to avoid warning in images where the AFMicroAdj data has been
+    truncated by Canon DPP
+<li>Fixed -tagsFromFile and -v so they may now be used when writing via pipes
+<li>Fixed writing of Panasonic LensType tags that were broken in the 9.15 update
+<li>Fixed incorrect case for list type of XMP DocumentAncestors and TextLayers
 <li>API Changes:
     <ul>
-    <li>Enhanced GetValue() to allow return of 'Rational' value
+    <li>Allow a File::RandomAccess reference as an input to WriteInfo()
     </ul>
+</li>
 </ul>
 
-<a name='v9.02'><b>Sept. 6, 2012 - Version 9.02</b></a>
-<ul>
-<li>Added a new Nikon LensID (thanks Joseph Heled)
-<li>Added a new EXIF SubFileType value used in DNG images
-<li>Added write support for Apple Adjustment Settings XMP tags (XMP-aas)
-<li>Added a couple of new Samsung LensType values (thanks Jaroslav Stepanek)
-<li>Added a couple of new Canon LensType values and a new CanonModelID
-<li>Decode a number of new Sony tags (thanks Jos Roost)
-<li>Enhanced "-o -" feature to allow output file type to be specified
-<li>Extract last file access time as FileAccessDate
-<li>Allow tags to be set from files which are zero bytes in size
-<li>Made ProfileHueSatMap tags Binary if they are too long
-<li>Changed names of some PanasonicRaw DistortionInfo tags
-<li>Changed decoding for a Sony ExposureMode value
-<li>Fixed hang/crash that could occur when writing to an image with corrupted
-    Sony MoreInfo data (ie. SLT-A55V JPEG corrupted by GIMP)
-</ul>
-
-<a name='v9.01'><b>Aug. 25, 2012 - Version 9.01</b></a> <span class=grn>(production release)</span>
+<a name='v9.27'><b>Apr. 15, 2013 - Version 9.27</b></a> <span class=grn>(production release)</span>
 <ul>
-<li>Added a couple of new CanonModelID values
-<li>Added a couple of new Canon LensType values (thanks Pascal de Bruijn)
-<li>Added a new PentaxModelID and a few new Pentax PictureMode values
-<li>Decode a new Pentax ISO tag
-<li>Improved -listx output for XMP structure tags
-<li>Fixed "unexpected end of file" problems with some compressed MIE files
+<li>Fixed "ARRAY ref" runtime error introduced in 9.25 that could occur when
+    using the -X option
+<li>Fixed runtime warning which could occur when conditionally deleting XMP
+    structure
 </ul>
 
 <a name='ancient' href="ancient_history.html"><b>History of older versions</b> (back to 1.00) --></a><br><br>
@@ -205,12 +205,13 @@ the TIFF specification states that values must begin on a (2-byte) word
 boundary. All data in the maker notes value block is
 <a name=XE class='W M'>underlined</a>.</span></p>
 
-<p>Currently, only TIFF/EXIF and JPEG meta information is dumped.  By default,
-all offsets are relative to the start of the TIFF header (as below).  For a TIFF
-image this is at the start of the file, but for a JPEG image it is 10 bytes
-after the start of the APP1 EXIF segment.  However, this base offset can be
-specified on the command line with "-htmlDump#" (ie. "-htmlDump0" for absolute
-offsets), or via the API with the "HtmlDumpBase" option.</p>
+<p>Currently, only TIFF/EXIF and JPEG meta information is dumped.  The leftmost
+column of the output gives the offset in hex relative to the start of the TIFF
+header (by default).  For a TIFF image this is at the start of the file, but for
+a JPEG image it is 10 bytes after the start of the APP1 EXIF segment.  However,
+this base offset can be specified on the command line with "-htmlDump#" (ie.
+"-htmlDump0" for absolute offsets), or via the API with the "HtmlDumpBase"
+option.</p>
 
 <noscript><b class=V>--&gt;
 Enable JavaScript for active highlighting and information tool tips!
@@ -41,26 +41,26 @@ problem mentioned above.</p>
 
 <hr>
 
-<p><b>Canon:</b> The 350D (firmware 1.0.1) gets the size of the thumbnail image
+<p><a name="Canon"><b>Canon:</b></a> The 350D (firmware 1.0.1) gets the size of the thumbnail image
 wrong and reports it to be 10 bytes too long.  This can cause the reported
 thumbnail image data to run off the end of the APP1 segment.  A bug in version
 1.0.4 of the 40D firmware causes it to write a maker note entry count that is
 one greater than it should be.</p>
 
-<p><b>Casio:</b> The preview image is referenced by two different offsets (the
+<p><a name="Casio"><b>Casio:</b></a> The preview image is referenced by two different offsets (the
 PreviewImage tag plus a PreviewImageStart/PreviewImageLength pair).  Also, the
 offset for the PrintIM information is relative to the start of the IFD entry
 even though other offsets aren't.</p>
 
-<p><b>Concord:</b> Some models write PrintIM information with an entry-based
+<p><a name="Concord"><b>Concord:</b></a> Some models write PrintIM information with an entry-based
 offset like Casio.</p>
 
-<p><b>General Electric:</b> A number of GE cameras store zero offsets for some
+<p><a name="GE"><b>General Electric:</b></a> A number of GE cameras store zero offsets for some
 maker note tags (possibly to indicate that the tags do not exist), and other
 offsets are 12 bytes too high for some models (like the A1230, E1035 and G2).
 </p>
 
-<p><b>Hewlett-Packard:</b> The PhotoSmart 720 (one of the few HP models to use
+<p><a name="HP"><b>Hewlett-Packard:</b></a> The PhotoSmart 720 (one of the few HP models to use
 EXIF-format maker notes) uses a format code of 5 (rational64u) for tag 0x0204,
 but stores a rational32u value.  Other models show about as much standardization
 as the Kodak point-and-shoot lineup.  Also, some models (C945, M22, M23, R507,
@@ -68,20 +68,20 @@ R607, R707, R717, R725, R727, R817, R818, R827, R927 and R960) write the EXIF
 ComponentsConfiguration incorrectly as ASCII characters (like the Leica M8 and
 M9).</p>
 
-<p><b>Kodak:</b> Professional DCS Photo Desk software writes a cyclical EXIF
+<p><a name="Kodak"><b>Kodak:</b></a> Professional DCS Photo Desk software writes a cyclical EXIF
 directory such that the InteropIFD pointer points back to IFD0.
 Point-and-shoot models show little standardization in maker note format.
 Some models with IFD-format maker notes store incorrect count values for
 a number of tags (this is particularly nasty), and may contain blank IFD
 entries which are filled with 0xff's (not zeros like other makes).</p>
 
-<p><b>Konica:</b> The KD-300Z writes all maker notes offsets relative to the
+<p><a name="Konica"><b>Konica:</b></a> The KD-300Z writes all maker notes offsets relative to the
 start of the individual IFD entry.</p>
 
-<p><b>Kyocera:</b> A number of models write all maker notes offsets relative
+<p><a name="Kyocera"><b>Kyocera:</b></a> A number of models write all maker notes offsets relative
 to the start of the individual IFD entry.</p>
 
-<p><b>Leica:</b> The M8 and M9 write the EXIF ComponentsConfiguration value in
+<p><a name="Leica"><b>Leica:</b></a> The M8 and M9 write the EXIF ComponentsConfiguration value in
 ASCII instead of binary.  The M8 writes EXIF ExposureCompensation and
 ShutterSpeedValue incorrectly as a unsigned rationals when they should be
 signed.  This leads to crazy values like "+65536" for small negative exposure
@@ -111,15 +111,25 @@ directory is yet another level of idiocy).</li>
 different from the M8 and M9.  Consistency isn't Leica's strong suit.</li>
 </ul>
 
-<p><b>Minolta:</b> An obvious bug in the firmware of the Z2 writes an incorrect
+<p>Strike that.  The most idiotic award now goes to the Leica M (Typ 240), which
+adds these quirks (firmware 1.1.0.2):</p>
+
+<ul>
+<li>Tag 0x0301 has the same offset as the PreviewImage in the maker note IFD,
+although it looks like the data for this tag probably comes after the
+PreviewImage.</li>
+<li>Tag 0x0302 has an invalid offset (0xffffffff).</li>
+</ul>
+
+<p><a name="Minolta"><b>Minolta:</b></a> An obvious bug in the firmware of the Z2 writes an incorrect
 offset for the 'MinoltaCameraSettings2' information -- it writes the offset of
 the offset itself instead of the offset of the value (hahaha!).  Other
 offsets are correct.</p>
 
-<p><b>Nikon:</b> D2H NEF files have huge blocks with all zero data (3.7 MB in
+<p><a name="Nikon"><b>Nikon:</b></a> D2H NEF files have huge blocks with all zero data (3.7 MB in
 my test file!).</p>
 
-<p><b>Olympus:</b> The E-1 and E-300 have subdirectories in the maker notes, but
+<p><a name="Olympus"><b>Olympus:</b></a> The E-1 and E-300 have subdirectories in the maker notes, but
 not only does the data size of these subdirectories exclude the subdirectory
 value data, but also it is 2 bytes too small for the directory information
 itself (doh! -- they forgot to include the entry count).  Similarly, the stored
@@ -127,7 +137,7 @@ size of the maker note data block is too small for many models, which results
 in a loss of data if the maker notes are copied as a block when an image is
 rewritten.</p>
 
-<p><b>Pentax:</b> The Optio 330 uses an offset for the PrintIM information which
+<p><a name="Pentax"><b>Pentax:</b></a> The Optio 330 uses an offset for the PrintIM information which
 is relative to the start of the IFD entry (hmmm, like some Casio models...). 
 Also, preview image offsets in the maker notes are given relative to the EXIF
 base rather than the maker note base (like all other maker notes offsets).</p>
@@ -144,7 +154,7 @@ space in each image with large unused data blocks in the EXIF information.</p>
 <p>Note that the worst problems are with the Optio 230, 330, and 430, which
 carry the Asahi brand name.</p>
 
-<p><b>Photoshop and Nikon Capture:</b> Both of these packages write TIFF IPTC
+<p><a name="Photoshop"><b>Photoshop and Nikon Capture:</b></a> Both of these packages write TIFF IPTC
 information as 'int32u' (or 'LONG').  This is wrong
 (<a href="http://www.awaresystems.be/imaging/tiff/tifftags/iptc.html">see
 reference</a>).  Nikon Capture goes one step further and simply ignores IPTC
@@ -152,20 +162,22 @@ that is written correctly as 'undef' or 'int8u'.  (So for compatibility,
 ExifTool also writes this incorrectly as 'int32u'.)  Photoshop completely
 deletes the maker notes when an image is edited.</p>
 
-<p><b>Ricoh:</b> An IFD subdirectory in the Ricoh maker notes of both the
+<p><a name="Ricoh"><b>Ricoh:</b></a> There is an IFD subdirectory in the Ricoh maker notes of both the
 Caplio RR30 and RR1.  The RR30 uses standard EXIF offsets (relative to the start
 of the EXIF data), but for the RR1 the offsets are relative to the start of the
 subdirectory.  The G700 uses MPF offsets relative to the start of the file,
-instead of the start of the MPF segment as per the MPF spec.</p>
+instead of the start of the MPF segment as per the MPF spec.  The HX15 uses
+a standard EXIF maker note structure, but there are 2 extra padding bytes
+between the IFD entry count and the 1st IFD entry.</p>
 
-<p><b>Rollei:</b> The DK4010 writes all maker notes offsets relative to the
+<p><a name="Rollei"><b>Rollei:</b></a> The DK4010 writes all maker notes offsets relative to the
 start of the individual IFD entry.</p>
 
-<p><b>Sanyo:</b> The offsets written in the maker notes of the J1, J2, J3, S1,
+<p><a name="Sanyo"><b>Sanyo:</b></a> The offsets written in the maker notes of the J1, J2, J3, S1,
 S3 and S4 have very little to do with reality.  Apparently the Sanyo
 programmers have no understanding of the concept of an IFD offset.</p>
 
-<p><b>Skanhex:</b> With some Skanhex models (SX-210Z3, SX-330Z3, SX3300,
+<p><a name="Skanhex"><b>Skanhex:</b></a> With some Skanhex models (SX-210Z3, SX-330Z3, SX3300,
 SX410Z3), the 264-byte makernotes block contains no useful information, and
 overlaps values from the ExifIFD.  For these models there is also a large block
 (typically 1195 bytes) of unreferenced information in the EXIF data immediately
@@ -175,18 +187,18 @@ images that contain this block (except for a variable amount of padding at the
 end with 0xff bytes).  These quirks also affect some Gateway, Jenoptik, Medion,
 Samsung and Yakumo models built by Skanhex.</p>
 
-<p><b>Toshiba:</b> The PDR-3310 writes all maker notes offsets relative to the
+<p><a name="Toshiba"><b>Toshiba:</b></a> The PDR-3310 writes all maker notes offsets relative to the
 start of the individual IFD entry.  (very similar to Konica KD-300Z)</p>
 
 <hr><a name="raw"></a>
 <h2>RAW file Idiosyncracies</h2>
 
-<p><b>Minolta MRW:</b> The A200 stores the thumbnail image offset in IFD0
+<p><a name="MinoltaMRW"><b>Minolta MRW:</b></a> The A200 stores the thumbnail image offset in IFD0
 relative to the start of file, while all other offsets are relative to the start
 of the TIFF header, which is 48 bytes into the file.  Also, the A200 stores the
 StripOffsets and the StripByteCounts values in the wrong byte order.</p>
 
-<p><b>Sony ARW:</b> The maker notes of ARW images are not self-contained, so
+<p><a name="SonyARW"><b>Sony ARW:</b></a> The maker notes of ARW images are not self-contained, so
 some information is lost when the images are rewritten by other software
 (including the Adobe DNG converter).  The A100 with firmware 1.00 sets the high
 word of the thumbnail image offset to zero, but it should sometimes be 0x0001.
@@ -200,13 +212,13 @@ some original A100 firmware 1.00 images, but no longer crashes if the images are
 first edited with ExifTool (probably because ExifTool fixes the above mentioned
 problems when it rewrites the image).</p>
 
-<p><b>Leica DNG:</b> The makernote offsets for the M8 are relative to the start
+<p><a name="LeicaDNG"><b>Leica DNG:</b></a> The makernote offsets for the M8 are relative to the start
 of the makernote IFD in JPEG images, but relative to the start of the makernote
 header (8 bytes earlier) in DNG images.  <i>[2009-09-09: This is fixed for the
 M9 which has offsets relative to the start of the makernote header for both JPEG
 and DNG.]</i></p>
 
-<p><b>Nikon NEF:</b> Aside from the encryption that Nikon uses to try to hide
+<p><a name="NikonNEF"><b>Nikon NEF:</b></a> Aside from the encryption that Nikon uses to try to hide
 some information in their maker notes, the NEF files in general seem fairly well
 behaved.  Even so, the Nikon Transfer utility (version 1.3) still manages to
 corrupt some information in the 0th SubIFD when it is used to process NEF
@@ -219,33 +231,33 @@ cause loss of MakerNote information if the file is edited by other software (but
 this isn't a problem with ExifTool, which will fix this type of problem
 automatically when writing).</p>
 
-<p><b>Nikon NRW:</b> Nikon should have just called this NEF with a different
+<p><a name="NikonNRW"><b>Nikon NRW:</b></a> Nikon should have just called this NEF with a different
 version number -- there should be no need to pollute the universe with zillions
 of unnecessary file extensions.  Oh right, they weren't smart enough to include
 a file identifier containing a version number in their NEF images -- Doh! In
 these images, CFAPattern2 is written incorrectly with UNDEFINED instead of BYTE
 format.</p>
 
-<p><b>Phase One IIQ:</b> Many values are referenced from more than one location
+<p><a name="PhaseOneIIQ"><b>Phase One IIQ:</b></a> Many values are referenced from more than one location
 in the TIFF structure of these images.  For instance, the IFD0 strip data
 actually exists within the MakerNotes data block.  This is a poor design, and
 leads to duplicated information when the image is rewritten.</p>
 
-<p><b>Ricoh DNG:</b>  The GR Digital IV (firmware 1.14) stores an incorrect
+<p><a name="RicohDNG"><b>Ricoh DNG:</b></a>  The GR Digital IV (firmware 1.14) stores an incorrect
 length for the JPEG preview in SubIFD1.</p>
 
-<p><b>Samsung SRW:</b> Yet another TIFF-based RAW image with no proper file
+<p><a name="SamsungSRW"><b>Samsung SRW:</b></a> Yet another TIFF-based RAW image with no proper file
 identifier.  In these images the thumbnail is stored inside a SubIFD of IFD1
 instead of directly in IFD1 (dumb, dumb...).  Also, the NX200 (firmware
 NX200_011181) uses a base offset for the X/YResolution values that is different
 from the PreviewImageStart pointer, both in the MakerNotes PreviewIFD.  (Note
 that the NX100 uses the same base for both, so this is certainly a firmware bug
 for the NX200. <i>[2012-06-21: This problem now also affects the EX1, NX20 and
-WB2000]</i>)</p>
+WB2000] [2013-07-25: Add the NX2000 to this list]</i>)</p>
 
 <hr>
 <i>Created Mar. 25, 2005</i>
-<br><i>Last revised Mar. 9, 2013</i>
+<br><i>Last revised Oct. 22, 2013</i>
 <p class='lf'><a href="index.html">&lt;-- Back to ExifTool home page</a></p>
 </body>
 </html>
@@ -22,31 +22,33 @@ a:hover.wt  { text-decoration: underline; }
 a:active.wt { color: red; }
 pre         { color: #800; padding: 0; margin: 0 }
 blockquote  { margin-top: 1em; margin-bottom: 1em }
+blockquote.s    { margin-left: 1em; margin-right: 1em }
 div.wide        { margin: 0 -.5em }
-table.tight td  { padding: 0px 4px }
+table.tight td  { padding: 1px 1px 0px 3px }
 table.links     { border-collapse: collapse; width: 100%; margin: 0 }
 table.links th  { border-right: 1px solid white; font-weight: normal;
                   width: 17%; background: #008 }
 table.links th.rt { border-right: 0 }
 table.dl        { border: 1px solid gray; border-collapse: collapse }
 table.dl td     { padding: .4em .8em }
-
+table.bm        { margin: 0 0 .35em 0 }
+span.sup        { font-size: 0.8em; font-weight: normal; position: relative; top: -.4em; }
 -->
 </style>
 </head>
 <body>
 <h1><a name="top">ExifTool by Phil Harvey</a></h1>
 <h2 class='tight red'><b>Read</b>, <b>Write</b> and <b>Edit</b> Meta Information!</h2>
-<p><b>Also available</b> --> <a href="http://owl.phy.queensu.ca/~phil/exiftool/fix_corrupted_nef.html">Utility to fix Nikon NEF images corrupted by Nikon Transfer 1</a></p>
-<div class='wide'><table class='links'><tr>
-<th><a href="install.html" class='wt'>&nbsp;Installing&nbsp;</a></th>
-<th><a href="TagNames/index.html" class='wt'>&nbsp;Tag&nbsp;Names&nbsp;</a></th>
-<th><a href="#links" class='wt'>&nbsp;Resources&nbsp;</a></th>
-<th><a href="history.html" class='wt'>&nbsp;History&nbsp;</a></th>
-<th><a href="http://u88.n24.queensu.ca/exiftool/forum/" class='wt'>&nbsp;Forum&nbsp;</a></th>
-<th class='rt'><a href="faq.html" class='wt'>&nbsp;FAQ&nbsp;</a></th>
+<p><b>Also available</b> --> <a href="http://owl.phy.queensu.ca/~phil/exiftool/fix_corrupted_nef.html">Utility to fix Nikon NEF images corrupted by Nikon software</a></p>
+<div class=wide><table class=links><tr>
+<th><a href="install.html" class=wt>&nbsp;Installing&nbsp;</a></th>
+<th><a href="TagNames/index.html" class=wt>&nbsp;Tag&nbsp;Names&nbsp;</a></th>
+<th><a href="#links" class=wt>&nbsp;Resources&nbsp;</a></th>
+<th><a href="history.html" class=wt>&nbsp;History&nbsp;</a></th>
+<th><a href="http://u88.n24.queensu.ca/exiftool/forum/" class=wt>&nbsp;Forum&nbsp;</a></th>
+<th class=rt><a href="faq.html" class=wt>&nbsp;FAQ&nbsp;</a></th>
 </tr></table></div>
-<div class='index'>
+<div class=index>
 <a href="#features">Features</a>
 <br><a href="#comments">User Comments</a>
 <br><a href="#supported">Supported File Types</a>
@@ -72,9 +74,9 @@ table.dl td     { padding: .4em .8em }
 </div>
 
 <blockquote><table class='dl lg'><tr><td><b>
-<a href="Image-ExifTool-9.27.tar.gz">
-Download        Version 9.27</a> (3.5 MB) -
-<a href="history.html">Apr. 15, 2013</a></b></td></tr></table></blockquote>
+<a href="Image-ExifTool-9.53.tar.gz">
+Download        Version 9.53</a> (3.6 MB) -
+<a href="history.html">Feb. 22, 2014</a></b></td></tr></table></blockquote>
 
 <p><b>ExifTool is a platform-independent <a href="ExifTool.html">Perl
 library</a> plus a <a href="exiftool_pod.html">command-line application</a> for
@@ -122,8 +124,8 @@ distribution above.)</i></p>
 
 <blockquote><table class='dl lg'><tr><td><b>
 <a name="alone">Windows Executable:</a>
-<a href="exiftool-9.27.zip">
-         exiftool-9.27.zip</a> (3.5 MB)</b></td></tr></table></blockquote>
+<a href="exiftool-9.53.zip">
+         exiftool-9.53.zip</a> (3.7 MB)</b></td></tr></table></blockquote>
 
 <p><b>The stand-alone Windows executable</b> does not require Perl. Just
 download and un-zip the archive then double-click on
@@ -134,8 +136,8 @@ of Windows (including Windows 7).</p>
 
 <blockquote><table class='dl lg'><tr><td><b>
 Mac OS X Package:
-<a href="ExifTool-9.27.dmg">
-         ExifTool-9.27.dmg</a> (2.3 MB)</b></td></tr></table></blockquote>
+<a href="ExifTool-9.53.dmg">
+         ExifTool-9.53.dmg</a> (2.3 MB)</b></td></tr></table></blockquote>
 
 <p><b>The OS X package</b> installs the ExifTool command-line application and
 libraries in /usr/bin. After installing, type "<code>exiftool</code>" in a
@@ -164,6 +166,7 @@ installing ExifTool on Windows, Mac OS X and Unix systems.</p>
     <a href="TagNames/IPTC.html">IPTC</a>,
     <a href="TagNames/XMP.html">XMP</a>,
     <a href="TagNames/JFIF.html">JFIF</a>, MakerNotes,
+    <a href="TagNames/GeoTiff.html">GeoTIFF</a>,
     <a href="TagNames/ICC_Profile.html">ICC Profile</a>,
     <a href="TagNames/Photoshop.html">Photoshop IRB</a>,
     <a href="TagNames/AFCP.html">AFCP</a> and more...</li>
@@ -182,7 +185,7 @@ installing ExifTool on Windows, Mac OS X and Unix systems.</p>
 <li>Deletes meta information individually, in groups, or altogether</li>
 <li>Sets the file modification date (and creation date in Windows) from EXIF information</li>
 <li>Supports alternate language tags in <a href="TagNames/XMP.html">XMP</a>,
-    <a href="Tagnames/PNG.html#TextualData">PNG</a>, <a href="TagNames/ID3.html">ID3</a>,
+    <a href="TagNames/PNG.html#TextualData">PNG</a>, <a href="TagNames/ID3.html">ID3</a>,
     <a href="TagNames/Font.html#Name">Font</a>, <a href="TagNames/QuickTime.html">QuickTime</a>,
     <a href="TagNames/ICC_Profile.html">ICC Profile</a>, <a href="TagNames/MIE.html">MIE</a> and
     <a href="TagNames/MXF.html">MXF</a> information</li>
@@ -240,163 +243,170 @@ suck the last bit of metadata out of whatever image file you throw at it!"</i> -
 </blockquote>
 
 <h2><a name="supported">Supported File Types</a></h2>
-<p>ExifTool can <b>R</b>ead, <b>W</b>rite and/or <b>C</b>reate files in the following formats:</p>
-<blockquote><table class='norm tight'>
-<tr><th>File Type</th><th>Support</th><th>Description</th></tr>
-<tr><td>3FR</td><td>R</td><td>Hasselblad RAW (<a href="TagNames/EXIF.html">TIFF</a>-based)</td></tr>
-<tr><td>3G2, 3GP2</td><td>R</td><td>3rd Gen. Partnership Project 2 audio/video (<a href="TagNames/QuickTime.html">QuickTime</a>-based)</td></tr>
-<tr><td>3GP, 3GPP</td><td>R</td><td>3rd Gen. Partnership Project audio/video (<a href="TagNames/QuickTime.html">QuickTime</a>-based)</td></tr>
-<tr><td><a href="TagNames/DICOM.html">ACR</a></td><td>R</td><td>American College of Radiology ACR-NEMA (DICOM-like)</td></tr>
-<tr><td><a href="TagNames/Font.html">AFM, ACFM, AMFM</a></td><td>R</td><td>Adobe [Composite/Multiple Master] Font Metrics</td></tr>
-<tr><td>AI, AIT</td><td>R/W</td><td>Adobe Illustrator [Template] (<a href="TagNames/PostScript.html">PS</a> or <a href="TagNames/PDF.html">PDF</a>)</td></tr>
-<tr><td><a href="TagNames/AIFF.html">AIFF, AIF, AIFC</a></td><td>R</td><td>Audio Interchange File Format [Compressed]</td></tr>
-<tr><td><a href="TagNames/APE.html">APE</a></td><td>R</td><td>Monkey's Audio</td></tr>
-<tr><td>ARW</td><td>R/W</td><td>Sony Alpha RAW (<a href="TagNames/EXIF.html">TIFF</a>-based)</td></tr>
-<tr><td><a href="TagNames/ASF.html">ASF</a></td><td>R</td><td>Microsoft Advanced Systems Format</td></tr>
-<tr><td>AVI</td><td>R</td><td>Audio Video Interleaved (<a href="TagNames/RIFF.html">RIFF</a>-based)</td></tr>
-<tr><td><a href="TagNames/BMP.html">BMP, DIB</a></td><td>R</td><td>Windows BitMaP / Device Independent Bitmap</td></tr>
-<tr><td><a href="TagNames/EXIF.html">BTF, TIFF, TIF</a></td><td>R</td><td>BigTIFF (64-bit Tagged Image File Format)</td></tr>
-<tr><td><a href="TagNames/EXE.html#CHM">CHM</a></td><td>R</td><td>Microsoft Compiled HTML format</td></tr>
-<tr><td>COS</td><td>R</td><td>Capture One Settings (XML-based)</td></tr>
-<tr><td>CR2</td><td>R/W</td><td>Canon RAW 2 (<a href="TagNames/EXIF.html">TIFF</a>-based)</td></tr>
-<tr><td><a href="TagNames/CanonRaw.html">CRW, CIFF</a></td><td>R/W</td><td>Canon RAW Camera Image File Format (<a href="canon_raw.html">CRW specification</a>)</td></tr>
-<tr><td>CS1</td><td>R/W</td><td>Sinar CaptureShop 1-shot RAW (<a href="TagNames/Photoshop.html">PSD</a>-based)</td></tr>
-<tr><td><a href="TagNames/DICOM.html">DCM, DC3, DIC, DICM</a></td><td>R</td><td>DICOM - Digital Imaging and Communications in Medicine</td></tr>
-<tr><td>DCP</td><td>R/W</td><td>DNG Camera Profile (<a href="TagNames/DNG.html">DNG</a>-like)</td></tr>
-<tr><td>DCR</td><td>R</td><td>Kodak Digital Camera RAW (<a href="TagNames/EXIF.html">TIFF</a>-based)</td></tr>
-<tr><td><a href="TagNames/Font.html">DFONT</a></td><td>R</td><td>Macintosh Data Fork Font</td></tr>
-<tr><td>DIVX</td><td>R</td><td>DivX media format (<a href="TagNames/ASF.html">ASF</a>-based)</td></tr>
-<tr><td><a href="TagNames/DjVu.html">DJVU, DJV</a></td><td>R</td><td>DjVu image (AIFF-like)</td></tr>
-<tr><td><a href="TagNames/DNG.html">DNG</a></td><td>R/W</td><td>Digital Negative (<a href="TagNames/EXIF.html">TIFF</a>-based)</td></tr>
-<tr><td>DOC, DOT</td><td>R</td><td>Microsoft Word Document/Template (<a href="TagNames/FlashPix.html">FPX</a>-like)</td></tr>
-<tr><td><a href="TagNames/OOXML.html">DOCX, DOCM</a></td><td>R</td><td>Office Open XML Document [Macro-enabled]</td></tr>
-<tr><td><a href="TagNames/OOXML.html">DOTX, DOTM</a></td><td>R</td><td>Office Open XML Document Template [Macro-enabled]</td></tr>
-<tr><td><a href="TagNames/EXE.html#MachO">DYLIB</a></td><td>R</td><td>Mac OS X Mach-O executable and library files</td></tr>
-<tr><td><a href="TagNames/DV.html">DV</a></td><td>R</td><td>Digital Video</td></tr>
-<tr><td>DVB</td><td>R</td><td>Digital Video Broadcasting (<a href="TagNames/QuickTime.html">QuickTime</a>-based)</td></tr>
-<tr><td>EIP</td><td>R</td><td>Capture One Enhanced Image Package (<a href="TagNames/ZIP.html">ZIP</a>-based)</td></tr>
-<tr><td><a href="TagNames/PostScript.html">EPS, EPSF, PS</a></td><td>R/W</td><td>[Encapsulated] PostScript Format</td></tr>
-<tr><td>ERF</td><td>R/W</td><td>Epson RAW Format (<a href="TagNames/EXIF.html">TIFF</a>-based)</td></tr>
-<tr><td><a href="TagNames/EXE.html">EXE, DLL</a></td><td>R</td><td>DOS/Windows executable and library files</td></tr>
-<tr><td><a href="TagNames/EXIF.html">EXIF</a></td><td>R/W/C</td><td>Exchangable Image File Format metadata (<a href="TagNames/EXIF.html">TIFF</a>-based)</td></tr>
-<tr><td><a href="TagNames/OpenEXR.html">EXR</a></td><td>R</td><td>Open EXR (Extended Range)</td></tr>
-<tr><td>F4A, F4B, F4P, F4V</td><td>R</td><td>Adobe Flash Player 9+ Audio/Video (<a href="TagNames/QuickTime.html">Quicktime</a>-based)</td></tr>
-<tr><td>FFF</td><td>R/W</td><td>Hasselblad Flexible File Format (<a href="TagNames/EXIF.html">TIFF</a>-based)</td></tr>
-<tr><td><a href="TagNames/FLIR.html#FFF">FFF</a></td><td>R</td><td>FLIR Systems thermal image File Format</td></tr>
-<tr><td>FLA</td><td>R</td><td>Macromedia/Adobe Flash project (<a href="TagNames/FlashPix.html">FPX</a>-like)</td></tr>
-<tr><td><a href="TagNames/FLAC.html">FLAC</a></td><td>R</td><td>Free Lossless Audio Codec</td></tr>
-<tr><td><a href="TagNames/Flash.html#FLV">FLV</a></td><td>R</td><td>Flash Video</td></tr>
-<tr><td><a href="TagNames/FLIR.html#FPF">FPF</a></td><td>R</td><td>FLIR Public image Format</td></tr>
-<tr><td><a href="TagNames/FlashPix.html">FPX</a></td><td>R</td><td>FlashPix image</td></tr>
-<tr><td><a href="TagNames/GIF.html">GIF</a></td><td>R/W</td><td>Compuserve Graphics Interchange Format</td></tr>
-<tr><td><a href="TagNames/ZIP.html#GZIP">GZ, GZIP</a></td><td>R</td><td>GNU ZIP compressed archive</td></tr>
-<tr><td>HDP, WDP</td><td>R/W</td><td>Windows HD Photo / Media Photo (<a href="TagNames/EXIF.html">TIFF</a>-based)</td></tr>
-<tr><td><a href="TagNames/Radiance.html">HDR</a></td><td>R</td><td>Radiance RGBE (Red Green Blue Exponent) High Dynamic-Range</td></tr>
-<tr><td><a href="TagNames/HTML.html">HTML, HTM, XHTML</a></td><td>R</td><td>[Extensible] HyperText Markup Language</td></tr>
-<tr><td><a href="TagNames/ICC_Profile.html">ICC, ICM</a></td><td>R/W/C</td><td>International Color Consortium color profile</td></tr>
-<tr><td>IDML</td><td>R</td><td>Adobe InDesign Markup Language (ZIP/XML-based)</td></tr>
-<tr><td><a href="TagNames/PhaseOne.html">IIQ</a></td><td>R/W</td><td>Phase One Intelligent Image Quality RAW (<a href="TagNames/EXIF.html">TIFF</a>-based)</td></tr>
-<tr><td>IND, INDD, INDT</td><td>R/W</td><td>Adobe InDesign Document/Template (<a href="TagNames/XMP.html">XMP</a> metadata only)</td></tr>
-<tr><td>INX</td><td>R</td><td>Adobe InDesign Interchange (XML-based, <a href="TagNames/XMP.html">XMP</a> metadata only)</td></tr>
-<tr><td><a href="TagNames/ITC.html">ITC</a></td><td>R</td><td>iTunes Cover Flow artwork</td></tr>
-<tr><td>J2C, JPC</td><td>R</td><td>JPEG 2000 codestream</td></tr>
-<tr><td><a href="TagNames/Jpeg2000.html">JP2, JPF, J2K, JPM, JPX</a></td><td>R/W</td><td>JPEG 2000 image [Compound/Extended]</td></tr>
-<tr><td><a href="TagNames/JPEG.html">JPEG, JPG</a></td><td>R/W</td><td>Joint Photographic Experts Group image (<a href="#JPEG">see table below</a>)</td></tr>
-<tr><td>K25</td><td>R</td><td>Kodak DC25 RAW (<a href="TagNames/EXIF.html">TIFF</a>-based)</td></tr>
-<tr><td>KDC</td><td>R</td><td>Kodak Digital Camera RAW (<a href="TagNames/EXIF.html">TIFF</a>-based)</td></tr>
-<tr><td><a href="TagNames/iWork.html">KEY, KTH</a></td><td>R</td><td>Apple iWork '09 Keynote presentation/Theme</td></tr>
-<tr><td>LA</td><td>R</td><td>Lossless Audio (<a href="TagNames/RIFF.html">RIFF</a>-based)</td></tr>
-<tr><td><a href="TagNames/LNK.html">LNK</a></td><td>R</td><td>Microsoft Shell Link (Windows shortcut)</td></tr>
-<tr><td><a href="TagNames/M2TS.html">M2TS, MTS, M2T, TS</a></td><td>R</td><td>MPEG-2 Transport Stream (used for AVCHD video)</td></tr>
-<tr><td>M4A, M4B, M4P, M4V</td><td>R</td><td>MPEG-4 Audio/Video (<a href="TagNames/QuickTime.html">Quicktime</a>-based)</td></tr>
-<tr><td>MEF</td><td>R/W</td><td>Mamiya (RAW) Electronic Format (<a href="TagNames/EXIF.html">TIFF</a>-based)</td></tr>
-<tr><td><a href="TagNames/MIE.html">MIE</a></td><td>R/W/C</td><td>Meta Information Encapsulation (<a href="MIE1.1-20070121.pdf">MIE specification</a>)</td></tr>
-<tr><td><a href="TagNames/MIFF.html">MIFF, MIF</a></td><td>R</td><td>Magick Image File Format</td></tr>
-<tr><td><a href="TagNames/Matroska.html">MKA, MKV, MKS</a></td><td>R</td><td>Matroska Audio/Video/Subtitle</td></tr>
-<tr><td>MODD</td><td>R</td><td>Sony Picture Motion metadata (XML <a href="TagNames/PLIST.html">PLIST</a>-based)</td></tr>
-<tr><td><a href="TagNames/Leaf.html">MOS</a></td><td>R/W</td><td>Creo Leaf Mosaic (<a href="TagNames/EXIF.html">TIFF</a>-based)</td></tr>
-<tr><td><a href="TagNames/QuickTime.html">MOV, QT</a></td><td>R</td><td>Apple QuickTime Movie</td></tr>
-<tr><td><a href="TagNames/MPEG.html#Audio">MP3</a></td><td>R</td><td>MPEG-1 layer 3 audio (uses <a href="TagNames/ID3.html">ID3</a> information)</td></tr>
-<tr><td>MP4</td><td>R</td><td>Motion Picture Experts Group version 4 (<a href="TagNames/QuickTime.html">Quicktime</a>-based)</td></tr>
-<tr><td><a href="TagNames/MPC.html">MPC</a></td><td>R</td><td>Musepack Audio</td></tr>
-<tr><td><a href="TagNames/MPEG.html">MPEG, MPG, M2V</a></td><td>R</td><td>Motion Picture Experts Group version 1 or 2</td></tr>
-<tr><td>MPO</td><td>R/W</td><td>Extended Multi-Picture format (<a href="TagNames/JPEG.html">JPEG</a> with <a href="TagNames/MPF.html">MPF</a> extensions)</td></tr>
-<tr><td><a href="TagNames/QuickTime.html">MQV</a></td><td>R</td><td>Sony Mobile QuickTime Video</td></tr>
-<tr><td><a href="TagNames/MinoltaRaw.html">MRW</a></td><td>R/W</td><td>Minolta RAW</td></tr>
-<tr><td><a href="TagNames/MXF.html">MXF</a></td><td>R</td><td>Material Exchange Format</td></tr>
-<tr><td>NEF</td><td>R/W</td><td>Nikon (RAW) Electronic Format (<a href="TagNames/EXIF.html">TIFF</a>-based)</td></tr>
-<tr><td><a href="TagNames/iWork.html">NMBTEMPLATE</a></td><td>R</td><td>Apple iWork '09 Numbers Template</td></tr>
-<tr><td>NRW</td><td>R/W</td><td>Nikon RAW (2) (<a href="TagNames/EXIF.html">TIFF</a>-based)</td></tr>
-<tr><td><a href="TagNames/iWork.html">NUMBERS</a></td><td>R</td><td>Apple iWork '09 Numbers spreadsheet</td></tr>
-<tr><td>ODB, ODC, ODF, ODG,<br>ODI, ODP, ODS, ODT</td><td>R</td><td>Open Document Database/Chart/Formula/Graphics/<br>Image/Presentation/Spreadsheet/Text (ZIP/XML-based)</td></tr>
-<tr><td>OFR</td><td>R</td><td>OptimFROG audio (<a href="TagNames/RIFF.html">RIFF</a>-based)</td></tr>
-<tr><td><a href="TagNames/Ogg.html">OGG, OGV</a></td><td>R</td><td>Ogg bitstream container</td></tr>
-<tr><td>ORF</td><td>R/W</td><td>Olympus RAW Format (<a href="TagNames/EXIF.html">TIFF</a>-based)</td></tr>
-<tr><td><a href="TagNames/Font.html">OTF</a></td><td>R</td><td>Open Type Font</td></tr>
-<tr><td>PAC</td><td>R</td><td>Lossless Predictive Audio Compression (<a href="TagNames/RIFF.html">RIFF</a>-based)</td></tr>
-<tr><td><a href="TagNames/iWork.html">PAGES</a></td><td>R</td><td>Apple iWork '09 Pages document</td></tr>
-<tr><td><a href="TagNames/PhotoCD.html">PCD</a></td><td>R</td><td>Kodak Photo CD Image Pac</td></tr>
-<tr><td><a href="TagNames/PDF.html">PDF</a></td><td>R/W</td><td>Adobe Portable Document Format</td></tr>
-<tr><td>PEF</td><td>R/W</td><td>Pentax (RAW) Electronic Format (<a href="TagNames/EXIF.html">TIFF</a>-based)</td></tr>
-<tr><td><a href="TagNames/Font.html">PFA, PFB</a></td><td>R</td><td>PostScript Font ASCII/Binary</td></tr>
-<tr><td><a href="TagNames/Font.html">PFM</a></td><td>R</td><td>Printer Font Metrics</td></tr>
-<tr><td><a href="TagNames/PGF.html">PGF</a></td><td>R</td><td>Progressive Graphics File</td></tr>
-<tr><td><a href="TagNames/PICT.html">PICT, PCT</a></td><td>R</td><td>Apple Picture file</td></tr>
-<tr><td><a href="TagNames/PLIST.html">PLIST</a></td><td>R</td><td>Apple Property List (binary and XML formats)</td></tr>
-<tr><td><a href="TagNames/Sony.html#PMP">PMP</a></td><td>R</td><td>Sony DSC-F1 Cyber-Shot image</td></tr>
-<tr><td><a href="TagNames/PNG.html">PNG</a>, <a href="TagNames/MNG.html">JNG, MNG</a></td><td>R/W</td><td>Portable/JPEG/Multiple-image Network Graphics</td></tr>
-<tr><td>PPM, PBM, PGM</td><td>R/W</td><td>Portable Pixel/Bit/Gray Map</td></tr>
-<tr><td>PPT, PPS, POT</td><td>R</td><td>Microsoft PowerPoint Presentation/Slideshow/Template (<a href="TagNames/FlashPix.html">FPX</a>-like)</td></tr>
-<tr><td><a href="TagNames/OOXML.html">POTX, POTM</a></td><td>R</td><td>Office Open XML Presentation Template [Macro-enabled]</td></tr>
-<tr><td><a href="TagNames/OOXML.html">PPSX, PPSM</a></td><td>R</td><td>Office Open XML Presentation Slideshow [Macro-enabled]</td></tr>
-<tr><td><a href="TagNames/OOXML.html">PPTX, PPTM</a></td><td>R</td><td>Office Open XML Presentation [Macro-enabled]</td></tr>
-<tr><td><a href="TagNames/Photoshop.html">PSD, PSB</a></td><td>R/W</td><td>PhotoShop Drawing / Large Document</td></tr>
-<tr><td><a href="TagNames/PSP.html">PSP, PSPIMAGE</a></td><td>R</td><td>Paint Shop Pro</td></tr>
-<tr><td><a href="TagNames/QuickTime.html">QTIF, QTI, QIF</a></td><td>R</td><td>QuickTime Image File</td></tr>
-<tr><td><a href="TagNames/Real.html#Audio">RA</a></td><td>R</td><td>Real Audio</td></tr>
-<tr><td><a href="TagNames/FujiFilm.html#RAF">RAF</a></td><td>R/W</td><td>FujiFilm RAW Format</td></tr>
-<tr><td><a href="TagNames/Real.html#Metafile">RAM, RPM</a></td><td>R</td><td>Real Audio/Plug-in Metafile</td></tr>
-<tr><td><a href="TagNames/ZIP.html#RAR">RAR</a></td><td>R</td><td>RAR Archive</td></tr>
-<tr><td><a href="TagNames/KyoceraRaw.html">RAW</a></td><td>R</td><td>Kyocera Contax N Digital RAW</td></tr>
-<tr><td><a href="TagNames/PanasonicRaw.html">RAW</a></td><td>R/W</td><td>Panasonic RAW (<a href="TagNames/EXIF.html">TIFF</a>-based)</td></tr>
-<tr><td><a href="TagNames/RIFF.html">RIFF, RIF</a></td><td>R</td><td>Resource Interchange File Format</td></tr>
-<tr><td><a href="TagNames/Real.html">RM, RV, RMVB</a></td><td>R</td><td>Real Media/Video [Variable Bitrate]</td></tr>
-<tr><td><a href="TagNames/RSRC.html">RSRC</a></td><td>R</td><td>Mac OS Resource</td></tr>
-<tr><td><a href="TagNames/RTF.html">RTF</a></td><td>R</td><td>Rich Text Format</td></tr>
-<tr><td><a href="TagNames/PanasonicRaw.html">RW2</a></td><td>R/W</td><td>Panasonic RAW 2 (<a href="TagNames/EXIF.html">TIFF</a>-based)</td></tr>
-<tr><td><a href="TagNames/PanasonicRaw.html">RWL</a></td><td>R/W</td><td>Leica RAW (<a href="TagNames/EXIF.html">TIFF</a>-based)</td></tr>
-<tr><td><a href="TagNames/Rawzor.html">RWZ</a></td><td>R</td><td>Rawzor compressed image</td></tr>
-<tr><td><a href="TagNames/EXE.html#ELF">SO</a></td><td>R</td><td>Unix ELF executable and Shared Object files</td></tr>
-<tr><td>SR2</td><td>R/W</td><td>Sony RAW 2 (<a href="TagNames/EXIF.html">TIFF</a>-based)</td></tr>
-<tr><td>SRF</td><td>R</td><td>Sony RAW Format (<a href="TagNames/EXIF.html">TIFF</a>-based)</td></tr>
-<tr><td>SRW</td><td>R/W</td><td>Samsung RAW format (<a href="TagNames/EXIF.html">TIFF</a>-based)</td></tr>
-<tr><td><a href="TagNames/XMP.html#SVG">SVG</a></td><td>R</td><td>Scalable Vector Graphics (XML-based)</td></tr>
-<tr><td><a href="TagNames/Flash.html">SWF</a></td><td>R</td><td>Shockwave Flash</td></tr>
-<tr><td>THM</td><td>R/W</td><td>Canon Thumbnail (<a href="TagNames/JPEG.html">JPEG</a>)</td></tr>
-<tr><td><a href="TagNames/OOXML.html">THMX</a></td><td>R</td><td>Office Open XML Theme</td></tr>
-<tr><td><a href="TagNames/EXIF.html">TIFF, TIF</a></td><td>R/W</td><td>Tagged Image File Format</td></tr>
-<tr><td><a href="TagNames/Font.html">TTF, TTC</a></td><td>R</td><td>True Type Font/Collection</td></tr>
-<tr><td>VOB</td><td>R</td><td>Video Object (<a href="TagNames/MPEG.html">MPEG</a>-based)</td></tr>
-<tr><td><a href="TagNames/CanonVRD.html">VRD</a></td><td>R/W/C</td><td>Canon DPP Recipe Data</td></tr>
-<tr><td>VSD</td><td>R</td><td>Microsoft Visio Drawing (<a href="TagNames/FlashPix.html">FPX</a>-like)</td></tr>
-<tr><td>WAV</td><td>R</td><td>Windows digital audio WAVeform (<a href="TagNames/RIFF.html">RIFF</a>-based)</td></tr>
-<tr><td>WEBM</td><td>R</td><td>Google Web Movie (<a href="TagNames/Matroska.html">MKV</a>-based)</td></tr>
-<tr><td>WEBP</td><td>R</td><td>Google Web Picture (<a href="TagNames/RIFF.html">RIFF</a>-based)</td></tr>
-<tr><td>WMA, WMV</td><td>R</td><td>Windows Media Audio/Video (<a href="TagNames/ASF.html">ASF</a>-based)</td></tr>
-<tr><td>WV</td><td>R</td><td>WavePack lossless audio (<a href="TagNames/RIFF.html">RIFF</a>-based)</td></tr>
-<tr><td><a href="TagNames/SigmaRaw.html">X3F</a></td><td>R/W</td><td>Sigma/Foveon RAW</td></tr>
-<tr><td><a href="TagNames/GIMP.html">XCF</a></td><td>R</td><td>GIMP native image format</td></tr>
-<tr><td>XLS, XLT</td><td>R</td><td>Microsoft Excel Spreadsheet/Template (<a href="TagNames/FlashPix.html">FPX</a>-like)</td></tr>
-<tr><td><a href="TagNames/OOXML.html">XLSX, XLSM, XLSB</a></td><td>R</td><td>Office Open XML Spreadsheet [Macro-enabled/Binary]</td></tr>
-<tr><td><a href="TagNames/OOXML.html">XLTX, XLTM</a></td><td>R</td><td>Office Open XML Spreadsheet Template [Macro-enabled]</td></tr>
-<tr><td><a href="TagNames/XMP.html">XMP</a></td><td>R/W/C</td><td>Extensible Metadata Platform sidecar file</td></tr>
-<tr><td><a href="TagNames/ZIP.html">ZIP</a></td><td>R</td><td>ZIP archive</td></tr>
-</table></blockquote>
-
+<p>ExifTool can <b>R</b>ead, <b>W</b>rite and/or <b>C</b>reate files in the following formats. 
+Also listed are the support levels for EXIF, IPTC, XMP, ICC_Profile and other metadata types
+for each file format.</p>
+<blockquote class=s><table class='norm tight sm bm'>
+<tr><th>File Type</th><th>Support</th><th>Description</th><th><a href="TagNames/EXIF.html">EXIF</a></th><th><a href="TagNames/IPTC.html">IPTC</a></th><th><a href="TagNames/XMP.html">XMP</a></th><th><a href="TagNames/ICC_Profile.html">ICC</a><span class=sup>1</span></th><th>Other</th></tr>
+<tr><td>3FR</td><td>R</td><td>Hasselblad RAW (<a href="TagNames/EXIF.html">TIFF</a>-based)</td><td>R</td><td>R</td><td>R</td><td>R</td><td>-</td></tr>
+<tr><td>3G2, 3GP2</td><td>R/W</td><td>3rd Gen. Partnership Project 2 a/v (<a href="TagNames/QuickTime.html">QuickTime</a>-based)</td><td>R<span class=sup>2</span></td><td>R<span class=sup>2</span></td><td>R/W/C</td><td>-</td><td>R/W <a href="TagNames/QuickTime.html">QuickTime</a><span class=sup>3</span></td></tr>
+<tr><td>3GP, 3GPP</td><td>R/W</td><td>3rd Gen. Partnership Project a/v (<a href="TagNames/QuickTime.html">QuickTime</a>-based)</td><td>R<span class=sup>2</span></td><td>R<span class=sup>2</span></td><td>R/W/C</td><td>-</td><td>R/W <a href="TagNames/QuickTime.html">QuickTime</a><span class=sup>3</span></td></tr>
+<tr><td><a href="TagNames/DICOM.html">ACR</a></td><td>R</td><td>American College of Radiology ACR-NEMA (DICOM-like)</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/DICOM.html">DICOM</a></td></tr>
+<tr><td><a href="TagNames/Font.html">AFM, ACFM, AMFM</a></td><td>R</td><td>Adobe [Composite/Multiple Master] Font Metrics</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/Font.html">Font</a></td></tr>
+<tr><td>AI, AIT</td><td>R/W</td><td>Adobe Illustrator [Template] (<a href="TagNames/PostScript.html">PS</a> or <a href="TagNames/PDF.html">PDF</a>)</td><td>R/W/C<span class=sup>4</span></td><td>R/W/C<span class=sup>4</span></td><td>R/W/C</td><td>R/W/C<span class=sup>4</span></td><td>R/W/C <a href="TagNames/PDF.html">PDF</a> <a href="TagNames/PostScript.html">PostScript</a>, R <a href="TagNames/Photoshop.html">Photoshop</a></td></tr>
+<tr><td><a href="TagNames/AIFF.html">AIFF, AIF, AIFC</a></td><td>R</td><td>Audio Interchange File Format [Compressed]</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/AIFF.html">AIFF</a> <a href="TagNames/ID3.html">ID3</a></td></tr>
+<tr><td><a href="TagNames/APE.html">APE</a></td><td>R</td><td>Monkey's Audio</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/APE.html">APE</a> <a href="TagNames/ID3.html">ID3</a></td></tr>
+<tr><td>ARW</td><td>R/W</td><td>Sony Alpha RAW (<a href="TagNames/EXIF.html">TIFF</a>-based)</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W <a href="TagNames/Sony.html">Sony</a> <a href="TagNames/SonyIDC.html">SonyIDC</a></td></tr>
+<tr><td><a href="TagNames/ASF.html">ASF</a></td><td>R</td><td>Microsoft Advanced Systems Format</td><td>-</td><td>-</td><td>R</td><td>-</td><td>R <a href="TagNames/ASF.html">ASF</a></td></tr>
+<tr><td>AVI</td><td>R</td><td>Audio Video Interleaved (<a href="TagNames/RIFF.html">RIFF</a>-based)</td><td>R<span class=sup>2</span></td><td>-</td><td>R</td><td>-</td><td>R <a href="TagNames/RIFF.html">RIFF</a></td></tr>
+<tr><td><a href="TagNames/BMP.html">BMP, DIB</a></td><td>R</td><td>Windows BitMaP / Device Independent Bitmap</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/BMP.html">BMP</a></td></tr>
+<tr><td><a href="TagNames/EXIF.html">BTF</a></td><td>R</td><td>BigTIFF (64-bit Tagged Image File Format)</td><td>R</td><td>R</td><td>R</td><td>R</td><td>-</td></tr>
+<tr><td><a href="TagNames/EXE.html#CHM">CHM</a></td><td>R</td><td>Microsoft Compiled HTML format</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/EXE.html#CHM">EXE</a></td></tr>
+<tr><td>COS</td><td>R</td><td>Capture One Settings (XML-based)</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R XML</td></tr>
+<tr><td>CR2</td><td>R/W</td><td>Canon RAW 2 (<a href="TagNames/EXIF.html">TIFF</a>-based)</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C <a href="TagNames/CanonVRD.html">CanonVRD</a>, R/W <a href="TagNames/Canon.html">Canon</a></td></tr>
+<tr><td><a href="TagNames/CanonRaw.html">CRW, CIFF</a></td><td>R/W</td><td>Canon RAW Camera Image File Format (<a href="canon_raw.html">CRW spec.</a>)</td><td>-</td><td>-</td><td>R/W/C</td><td>-</td><td>R/W/C <a href="TagNames/CanonVRD.html">CanonVRD</a>, R/W <a href="TagNames/CanonRaw.html">CanonRaw</a></td></tr>
+<tr><td>CS1</td><td>R/W</td><td>Sinar CaptureShop 1-shot RAW (<a href="TagNames/Photoshop.html">PSD</a>-based)</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R <a href="TagNames/Photoshop.html">Photoshop</a></td></tr>
+<tr><td><a href="TagNames/DICOM.html">DCM, DC3, DIC, DICM</a></td><td>R</td><td>DICOM - Digital Imaging and Communications in Medicine</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/DICOM.html">DICOM</a></td></tr>
+<tr><td>DCP</td><td>R/W</td><td>DNG Camera Profile (<a href="TagNames/DNG.html">DNG</a>-like)</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>-</td></tr>
+<tr><td>DCR</td><td>R</td><td>Kodak Digital Camera RAW (<a href="TagNames/EXIF.html">TIFF</a>-based)</td><td>R</td><td>R</td><td>R</td><td>R</td><td>-</td></tr>
+<tr><td><a href="TagNames/Font.html">DFONT</a></td><td>R</td><td>Macintosh Data Fork Font</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/Font.html">Font</a></td></tr>
+<tr><td>DIVX</td><td>R</td><td>DivX media format (<a href="TagNames/ASF.html">ASF</a>-based)</td><td>-</td><td>-</td><td>R</td><td>-</td><td>R <a href="TagNames/ASF.html">ASF</a></td></tr>
+<tr><td><a href="TagNames/DjVu.html">DJVU, DJV</a></td><td>R</td><td>DjVu image (AIFF-like)</td><td>-</td><td>-</td><td>R</td><td>-</td><td>R <a href="TagNames/DjVu.html">DJVU</a></td></tr>
+<tr><td><a href="TagNames/DNG.html">DNG</a></td><td>R/W</td><td>Digital Negative (<a href="TagNames/EXIF.html">TIFF</a>-based)</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>-</td></tr>
+<tr><td>DOC, DOT</td><td>R</td><td>Microsoft Word Document/Template (<a href="TagNames/FlashPix.html">FPX</a>-like)</td><td>-</td><td>-</td><td>R</td><td>R</td><td>R <a href="TagNames/FlashPix.html">FlashPix</a></td></tr>
+<tr><td><a href="TagNames/OOXML.html">DOCX, DOCM</a></td><td>R</td><td>Office Open XML Document [Macro-enabled]</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/OOXML.html">XML</a> <a href="TagNames/ZIP.html">ZIP</a></td></tr>
+<tr><td><a href="TagNames/OOXML.html">DOTX, DOTM</a></td><td>R</td><td>Office Open XML Document Template [Macro-enabled]</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/OOXML.html">XML</a> <a href="TagNames/ZIP.html">ZIP</a></td></tr>
+<tr><td><a href="TagNames/DPX.html">DPX</a></td><td>R</td><td>Digital Picture Exchange</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/DPX.html">DPX</a></td></tr>
+<tr><td><a href="TagNames/EXE.html#MachO">DYLIB</a></td><td>R</td><td>Mac OS X Mach-O executable and library files</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/EXE.html#MachO">EXE</a></td></tr>
+<tr><td><a href="TagNames/DV.html">DV</a></td><td>R</td><td>Digital Video</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/DV.html">DV</a></td></tr>
+<tr><td>DVB</td><td>R/W</td><td>Digital Video Broadcasting (<a href="TagNames/QuickTime.html">QuickTime</a>-based)</td><td>R<span class=sup>2</span></td><td>R<span class=sup>2</span></td><td>R/W/C</td><td>-</td><td>R/W <a href="TagNames/QuickTime.html">QuickTime</a><span class=sup>3</span></td></tr>
+<tr><td>EIP</td><td>R</td><td>Capture One Enhanced Image Package (<a href="TagNames/ZIP.html">ZIP</a>-based)</td><td>R</td><td>-</td><td>-</td><td>-</td><td>R XML <a href="TagNames/ZIP.html">ZIP</a></td></tr>
+<tr><td><a href="TagNames/PostScript.html">EPS, EPSF, PS</a></td><td>R/W</td><td>[Encapsulated] PostScript Format</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C <a href="TagNames/PostScript.html">PostScript</a>, R <a href="TagNames/Photoshop.html">Photoshop</a></td></tr>
+<tr><td>ERF</td><td>R/W</td><td>Epson RAW Format (<a href="TagNames/EXIF.html">TIFF</a>-based)</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W <a href="TagNames/Olympus.html">Olympus</a></td></tr>
+<tr><td><a href="TagNames/EXE.html">EXE, DLL</a></td><td>R</td><td>DOS/Windows executable and library files</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/EXE.html">EXE</a></td></tr>
+<tr><td><a href="TagNames/EXIF.html">EXIF</a></td><td>R/W/C</td><td>Exchangable Image File Format metadata (<a href="TagNames/EXIF.html">TIFF</a>-based)</td><td>R/W/C</td><td>-</td><td>-</td><td>-</td><td>-</td></tr>
+<tr><td><a href="TagNames/OpenEXR.html">EXR</a></td><td>R</td><td>Open EXR (Extended Range)</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/OpenEXR.html">OpenEXR</a></td></tr>
+<tr><td>EXV</td><td>R/W/C</td><td>Exiv2 metadata file (<a href="TagNames/JPEG.html">JPEG</a>-based)</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td><a href="#JPEG">Supported JPEG Meta Information</a></td></tr>
+<tr><td>F4A, F4B, F4P, F4V</td><td>R/W</td><td>Adobe Flash Player 9+ Audio/Video (<a href="TagNames/QuickTime.html">QuickTime</a>-based)</td><td>R<span class=sup>2</span></td><td>R<span class=sup>2</span></td><td>R/W/C</td><td>-</td><td>R/W <a href="TagNames/QuickTime.html">QuickTime</a><span class=sup>3</span></td></tr>
+<tr><td>FFF</td><td>R/W</td><td>Hasselblad Flexible File Format (<a href="TagNames/EXIF.html">TIFF</a>-based)</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>-</td></tr>
+<tr><td><a href="TagNames/FLIR.html#FFF">FFF</a></td><td>R</td><td>FLIR Systems thermal image File Format</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/FLIR.html#FFF">FLIR</a></td></tr>
+<tr><td>FLA</td><td>R</td><td>Macromedia/Adobe Flash project (<a href="TagNames/FlashPix.html">FPX</a>-like)</td><td>-</td><td>-</td><td>R</td><td>R</td><td>R <a href="TagNames/FlashPix.html">FlashPix</a></td></tr>
+<tr><td><a href="TagNames/FLAC.html">FLAC</a></td><td>R</td><td>Free Lossless Audio Codec</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/FLAC.html">FLAC</a> <a href="TagNames/ID3.html">ID3</a></td></tr>
+<tr><td><a href="TagNames/Flash.html#FLV">FLV</a></td><td>R</td><td>Flash Video</td><td>-</td><td>-</td><td>R</td><td>-</td><td>R <a href="TagNames/Flash.html#FLV">Flash</a></td></tr>
+<tr><td><a href="TagNames/FLIR.html#FPF">FPF</a></td><td>R</td><td>FLIR Public image Format</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/FLIR.html#FPF">FLIR</a></td></tr>
+<tr><td><a href="TagNames/FlashPix.html">FPX</a></td><td>R</td><td>FlashPix image</td><td>-</td><td>-</td><td>R</td><td>R</td><td>R <a href="TagNames/FlashPix.html">FlashPix</a></td></tr>
+<tr><td><a href="TagNames/GIF.html">GIF</a></td><td>R/W</td><td>Compuserve Graphics Interchange Format</td><td>-</td><td>-</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C <a href="TagNames/GIF.html">GIF</a></td></tr>
+<tr><td><a href="TagNames/ZIP.html#GZIP">GZ, GZIP</a></td><td>R</td><td>GNU ZIP compressed archive</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/ZIP.html#GZIP">ZIP</a></td></tr>
+<tr><td>HDP, WDP, JXR</td><td>R/W</td><td>Windows HD Photo / Media Photo / JPEG XR (<a href="TagNames/EXIF.html">TIFF</a>-based)</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>-</td></tr>
+<tr><td><a href="TagNames/Radiance.html">HDR</a></td><td>R</td><td>Radiance RGBE High Dynamic-Range</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/Radiance.html">Radiance</a></td></tr>
+<tr><td><a href="TagNames/HTML.html">HTML, HTM, XHTML</a></td><td>R</td><td>[Extensible] HyperText Markup Language</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/HTML.html">HTML</a></td></tr>
+<tr><td><a href="TagNames/ICC_Profile.html">ICC, ICM</a></td><td>R/W/C<span class=sup>1</span></td><td>International Color Consortium color profile</td><td>-</td><td>-</td><td>-</td><td>R/W/C</td><td>-</td></tr>
+<tr><td>IDML</td><td>R</td><td>Adobe InDesign Markup Language (ZIP/XML-based)</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R XML <a href="TagNames/ZIP.html">ZIP</a></td></tr>
+<tr><td><a href="TagNames/PhaseOne.html">IIQ</a></td><td>R/W</td><td>Phase One Intelligent Image Quality RAW (<a href="TagNames/EXIF.html">TIFF</a>-based)</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R <a href="TagNames/PhaseOne.html">PhaseOne</a></td></tr>
+<tr><td>IND, INDD, INDT</td><td>R/W</td><td>Adobe InDesign Document/Template</td><td>-</td><td>-</td><td>R/W/C</td><td>-</td><td>-</td></tr>
+<tr><td>INX</td><td>R</td><td>Adobe InDesign Interchange (XML-based)</td><td>-</td><td>-</td><td>R</td><td>-</td><td>-</td></tr>
+<tr><td><a href="TagNames/ITC.html">ITC</a></td><td>R</td><td>iTunes Cover Flow artwork</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/ITC.html">ITC</a></td></tr>
+<tr><td>J2C, JPC</td><td>R</td><td>JPEG 2000 codestream</td><td>R<span class=sup>2</span></td><td>R<span class=sup>2</span></td><td>R</td><td>R</td><td>R <a href="TagNames/Jpeg2000.html">Jpeg2000</a> <a href="TagNames/Photoshop.html">Photoshop</a><span class=sup>2</span></td></tr>
+<tr><td><a href="TagNames/Jpeg2000.html">JP2, JPF, J2K, JPM, JPX</a></td><td>R/W</td><td>JPEG 2000 image [Compound/Extended]</td><td>R/W/C<span class=sup>2</span></td><td>R/W/C<span class=sup>2</span></td><td>R/W/C</td><td>R</td><td>R/W/C <a href="TagNames/Jpeg2000.html">Jpeg2000</a>, R <a href="TagNames/Photoshop.html">Photoshop</a><span class=sup>2</span></td></tr>
+<tr><td><a href="TagNames/JPEG.html">JPEG, JPG</a></td><td>R/W</td><td>Joint Photographic Experts Group image</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td><a href="#JPEG">Supported JPEG Meta Information</a></td></tr>
+<tr><td>K25</td><td>R</td><td>Kodak DC25 RAW (<a href="TagNames/EXIF.html">TIFF</a>-based)</td><td>R</td><td>R</td><td>R</td><td>R</td><td>-</td></tr>
+<tr><td>KDC</td><td>R</td><td>Kodak Digital Camera RAW (<a href="TagNames/EXIF.html">TIFF</a>-based)</td><td>R</td><td>R</td><td>R</td><td>R</td><td>R <a href="TagNames/Kodak.html">Kodak</a></td></tr>
+<tr><td><a href="TagNames/iWork.html">KEY, KTH</a></td><td>R</td><td>Apple iWork '09 Keynote presentation/Theme</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/iWork.html">XML</a> <a href="TagNames/ZIP.html">ZIP</a></td></tr>
+<tr><td>LA</td><td>R</td><td>Lossless Audio (<a href="TagNames/RIFF.html">RIFF</a>-based)</td><td>R<span class=sup>2</span></td><td>-</td><td>R</td><td>-</td><td>R <a href="TagNames/RIFF.html">RIFF</a></td></tr>
+<tr><td><a href="TagNames/LNK.html">LNK</a></td><td>R</td><td>Microsoft Shell Link (Windows shortcut)</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/LNK.html">LNK</a></td></tr>
+<tr><td><a href="TagNames/M2TS.html">M2TS, MTS, M2T, TS</a></td><td>R</td><td>MPEG-2 Transport Stream (used for AVCHD video)</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/M2TS.html">M2TS</a> <a href="TagNames/H264.html">H264</a></td></tr>
+<tr><td>M4A, M4B, M4P, M4V</td><td>R/W</td><td>MPEG-4 Audio/Video (<a href="TagNames/QuickTime.html">QuickTime</a>-based)</td><td>R<span class=sup>2</span></td><td>R<span class=sup>2</span></td><td>R/W/C</td><td>-</td><td>R/W <a href="TagNames/QuickTime.html">QuickTime</a><span class=sup>3</span></td></tr>
+<tr><td>MEF</td><td>R/W</td><td>Mamiya (RAW) Electronic Format (<a href="TagNames/EXIF.html">TIFF</a>-based)</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>-</td></tr>
+<tr><td><a href="TagNames/MIE.html">MIE</a></td><td>R/W/C</td><td>Meta Information Encapsulation (<a href="MIE1.1-20070121.pdf">MIE specification</a>)</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C <a href="TagNames/MIE.html">MIE</a></td></tr>
+<tr><td><a href="TagNames/MIFF.html">MIFF, MIF</a></td><td>R</td><td>Magick Image File Format</td><td>R</td><td>R</td><td>R</td><td>R</td><td>R <a href="TagNames/MIFF.html">MIFF</a> <a href="TagNames/Photoshop.html">Photoshop</a></td></tr>
+<tr><td><a href="TagNames/Matroska.html">MKA, MKV, MKS</a></td><td>R</td><td>Matroska Audio/Video/Subtitle</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/Matroska.html">Matroska</a></td></tr>
+<tr><td>MODD</td><td>R</td><td>Sony Picture Motion metadata (XML <a href="TagNames/PLIST.html">PLIST</a>-based)</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/PLIST.html">PLIST</a></td></tr>
+<tr><td><a href="TagNames/Leaf.html">MOS</a></td><td>R/W</td><td>Creo Leaf Mosaic (<a href="TagNames/EXIF.html">TIFF</a>-based)</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R <a href="TagNames/Leaf.html">Leaf</a></td></tr>
+<tr><td><a href="TagNames/QuickTime.html">MOV, QT</a></td><td>R/W</td><td>Apple QuickTime Movie</td><td>R</td><td>R</td><td>R/W/C</td><td>-</td><td>R/W <a href="TagNames/QuickTime.html">QuickTime</a><span class=sup>3</span></td></tr>
+<tr><td><a href="TagNames/MPEG.html#Audio">MP3</a></td><td>R</td><td>MPEG-1 layer 3 audio (uses <a href="TagNames/ID3.html">ID3</a> information)</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/MPEG.html">MPEG</a> <a href="TagNames/ID3.html">ID3</a> <a href="TagNames/APE.html">APE</a></td></tr>
+<tr><td>MP4</td><td>R/W</td><td>Motion Picture Experts Group version 4 (<a href="TagNames/QuickTime.html">QuickTime</a>-based)</td><td>R<span class=sup>2</span></td><td>R<span class=sup>2</span></td><td>R/W/C</td><td>-</td><td>R/W <a href="TagNames/QuickTime.html">QuickTime</a><span class=sup>3</span></td></tr>
+<tr><td><a href="TagNames/MPC.html">MPC</a></td><td>R</td><td>Musepack Audio</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/MPC.html">MPC</a> <a href="TagNames/ID3.html">ID3</a> <a href="TagNames/APE.html">APE</a></td></tr>
+<tr><td><a href="TagNames/MPEG.html">MPEG, MPG, M2V</a></td><td>R</td><td>Motion Picture Experts Group version 1 or 2</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/MPEG.html">MPEG</a></td></tr>
+<tr><td>MPO</td><td>R/W</td><td>Extended Multi-Picture format (<a href="TagNames/JPEG.html">JPEG</a> with <a href="TagNames/MPF.html">MPF</a> extensions)</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td><a href="#JPEG">Supported JPEG Meta Information</a></td></tr>
+<tr><td><a href="TagNames/QuickTime.html">MQV</a></td><td>R/W</td><td>Sony Mobile QuickTime Video</td><td>R<span class=sup>2</span></td><td>R<span class=sup>2</span></td><td>R/W/C</td><td>-</td><td>R/W <a href="TagNames/QuickTime.html">QuickTime</a><span class=sup>3</span></td></tr>
+<tr><td><a href="TagNames/MinoltaRaw.html">MRW</a></td><td>R/W</td><td>Minolta RAW</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W <a href="TagNames/MinoltaRaw.html">MinoltaRaw</a> <a href="TagNames/Minolta.html">Minolta</a></td></tr>
+<tr><td><a href="TagNames/MXF.html">MXF</a></td><td>R</td><td>Material Exchange Format</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/MXF.html">MXF</a></td></tr>
+<tr><td>NEF</td><td>R/W</td><td>Nikon (RAW) Electronic Format (<a href="TagNames/EXIF.html">TIFF</a>-based)</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W <a href="TagNames/Nikon.html">Nikon</a> <a href="TagNames/NikonCapture.html">NikonCapture</a></td></tr>
+<tr><td><a href="TagNames/iWork.html">NMBTEMPLATE</a></td><td>R</td><td>Apple iWork '09 Numbers Template</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/iWork.html">XML</a> <a href="TagNames/ZIP.html">ZIP</a></td></tr>
+<tr><td>NRW</td><td>R/W</td><td>Nikon RAW (2) (<a href="TagNames/EXIF.html">TIFF</a>-based)</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W <a href="TagNames/Nikon.html">Nikon</a> <a href="TagNames/NikonCapture.html">NikonCapture</a></td></tr>
+<tr><td><a href="TagNames/iWork.html">NUMBERS</a></td><td>R</td><td>Apple iWork '09 Numbers spreadsheet</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/iWork.html">XML</a> <a href="TagNames/ZIP.html">ZIP</a></td></tr>
+<tr><td>ODB, ODC, ODF, ODG,<br>ODI, ODP, ODS, ODT</td><td>R</td><td>Open Document Database/Chart/Formula/Graphics/<br>Image/Presentation/Spreadsheet/Text (ZIP/XML-based)</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R XML <a href="TagNames/ZIP.html">ZIP</a></td></tr>
+<tr><td>OFR</td><td>R</td><td>OptimFROG audio (<a href="TagNames/RIFF.html">RIFF</a>-based)</td><td>R<span class=sup>2</span></td><td>-</td><td>R</td><td>-</td><td>R <a href="TagNames/RIFF.html">RIFF</a></td></tr>
+<tr><td><a href="TagNames/Ogg.html">OGG, OGV</a></td><td>R</td><td>Ogg bitstream container</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/FLAC.html">FLAC</a> <a href="TagNames/ID3.html">ID3</a> <a href="TagNames/Theora.html">Theora</a> <a href="TagNames/Vorbis.html">Vorbis</a></td></tr>
+<tr><td>ORF</td><td>R/W</td><td>Olympus RAW Format (<a href="TagNames/EXIF.html">TIFF</a>-based)</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W <a href="TagNames/Olympus.html">Olympus</a></td></tr>
+<tr><td><a href="TagNames/Font.html">OTF</a></td><td>R</td><td>Open Type Font</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/Font.html">Font</a></td></tr>
+<tr><td>PAC</td><td>R</td><td>Lossless Predictive Audio Compression (<a href="TagNames/RIFF.html">RIFF</a>-based)</td><td>R<span class=sup>2</span></td><td>-</td><td>R</td><td>-</td><td>R <a href="TagNames/RIFF.html">RIFF</a></td></tr>
+<tr><td><a href="TagNames/iWork.html">PAGES</a></td><td>R</td><td>Apple iWork '09 Pages document</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/iWork.html">XML</a> <a href="TagNames/ZIP.html">ZIP</a></td></tr>
+<tr><td><a href="TagNames/PhotoCD.html">PCD</a></td><td>R</td><td>Kodak Photo CD Image Pac</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/PhotoCD.html">PhotoCD</a></td></tr>
+<tr><td><a href="TagNames/PDF.html">PDF</a></td><td>R/W</td><td>Adobe Portable Document Format</td><td>R<span class=sup>2</span></td><td>R<span class=sup>2</span></td><td>R/W/C</td><td>R<span class=sup>2</span></td><td>R/W/C <a href="TagNames/PDF.html">PDF</a>, R <a href="TagNames/Photoshop.html">Photoshop</a></td></tr>
+<tr><td>PEF</td><td>R/W</td><td>Pentax (RAW) Electronic Format (<a href="TagNames/EXIF.html">TIFF</a>-based)</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W <a href="TagNames/Pentax.html">Pentax</a></td></tr>
+<tr><td><a href="TagNames/Font.html">PFA, PFB</a></td><td>R</td><td>PostScript Font ASCII/Binary</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/Font.html">Font</a></td></tr>
+<tr><td><a href="TagNames/Font.html">PFM</a></td><td>R</td><td>Printer Font Metrics</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/Font.html">Font</a></td></tr>
+<tr><td><a href="TagNames/PGF.html">PGF</a></td><td>R</td><td>Progressive Graphics File</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/PGF.html">PGF</a> <a href="TagNames/PNG.html">PNG</a></td></tr>
+<tr><td><a href="TagNames/PICT.html">PICT, PCT</a></td><td>R</td><td>Apple Picture file</td><td>-</td><td>-</td><td>-</td><td>R</td><td>R <a href="TagNames/PICT.html">PICT</a> <a href="TagNames/Photoshop.html">Photoshop</a></td></tr>
+<tr><td><a href="TagNames/PLIST.html">PLIST</a></td><td>R</td><td>Apple Property List (binary and XML formats)</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/PLIST.html">PLIST</a></td></tr>
+<tr><td><a href="TagNames/Sony.html#PMP">PMP</a></td><td>R</td><td>Sony DSC-F1 Cyber-Shot image</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/Sony.html#PMP">Sony</a></td></tr>
+<tr><td><a href="TagNames/PNG.html">PNG</a>, <a href="TagNames/MNG.html">JNG, MNG</a></td><td>R/W</td><td>Portable/JPEG/Multiple-image Network Graphics</td><td>R/W/C<span class=sup>2</span></td><td>R/W/C<span class=sup>2</span></td><td>R/W/C</td><td>R/W/C</td><td>R/W/C <a href="TagNames/PNG.html">PNG</a></td></tr>
+<tr><td>PPM, PBM, PGM</td><td>R/W</td><td>Portable Pixel/Bit/Gray Map</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R PPM</td></tr>
+<tr><td>PPT, PPS, POT</td><td>R</td><td>PowerPoint Presentation/Slideshow/Template (<a href="TagNames/FlashPix.html">FPX</a>-like)</td><td>-</td><td>-</td><td>R</td><td>R</td><td>R <a href="TagNames/FlashPix.html">FlashPix</a></td></tr>
+<tr><td><a href="TagNames/OOXML.html">POTX, POTM</a></td><td>R</td><td>Office Open XML Presentation Template [Macro-enabled]</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/OOXML.html">XML</a> <a href="TagNames/ZIP.html">ZIP</a></td></tr>
+<tr><td><a href="TagNames/OOXML.html">PPSX, PPSM</a></td><td>R</td><td>Office Open XML Presentation Slideshow [Macro-enabled]</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/OOXML.html">XML</a> <a href="TagNames/ZIP.html">ZIP</a></td></tr>
+<tr><td><a href="TagNames/OOXML.html">PPTX, PPTM</a></td><td>R</td><td>Office Open XML Presentation [Macro-enabled]</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/OOXML.html">XML</a> <a href="TagNames/ZIP.html">ZIP</a></td></tr>
+<tr><td><a href="TagNames/Photoshop.html">PSD, PSB</a></td><td>R/W</td><td>PhotoShop Drawing / Large Document</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R <a href="TagNames/Photoshop.html">Photoshop</a></td></tr>
+<tr><td><a href="TagNames/PSP.html">PSP, PSPIMAGE</a></td><td>R</td><td>Paint Shop Pro</td><td>R</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/PSP.html">PSP</a></td></tr>
+<tr><td><a href="TagNames/QuickTime.html">QTIF, QTI, QIF</a></td><td>R/W</td><td>QuickTime Image File</td><td>R<span class=sup>2</span></td><td>R<span class=sup>2</span></td><td>R/W/C</td><td>-</td><td>R/W <a href="TagNames/QuickTime.html">QuickTime</a><span class=sup>3</span></td></tr>
+<tr><td><a href="TagNames/Real.html#Audio">RA</a></td><td>R</td><td>Real Audio</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/Real.html#Audio">Real</a></td></tr>
+<tr><td><a href="TagNames/FujiFilm.html#RAF">RAF</a></td><td>R/W</td><td>FujiFilm RAW Format</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W <a href="TagNames/FujiFilm.html">FujiFilm</a></td></tr>
+<tr><td><a href="TagNames/Real.html#Metafile">RAM, RPM</a></td><td>R</td><td>Real Audio/Plug-in Metafile</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/Real.html#Metafile">Real</a></td></tr>
+<tr><td><a href="TagNames/ZIP.html#RAR">RAR</a></td><td>R</td><td>RAR Archive</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/ZIP.html#RAR">ZIP</a></td></tr>
+<tr><td><a href="TagNames/KyoceraRaw.html">RAW</a></td><td>R</td><td>Kyocera Contax N Digital RAW</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/KyoceraRaw.html">KyoceraRaw</a></td></tr>
+<tr><td><a href="TagNames/PanasonicRaw.html">RAW</a></td><td>R/W</td><td>Panasonic RAW (<a href="TagNames/EXIF.html">TIFF</a>-based)</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W <a href="TagNames/PanasonicRaw.html">PanasonicRaw</a> <a href="TagNames/Panasonic.html">Panasonic</a></td></tr>
+<tr><td><a href="TagNames/RIFF.html">RIFF, RIF</a></td><td>R</td><td>Resource Interchange File Format</td><td>R<span class=sup>2</span></td><td>-</td><td>R</td><td>-</td><td>R <a href="TagNames/RIFF.html">RIFF</a></td></tr>
+<tr><td><a href="TagNames/Real.html">RM, RV, RMVB</a></td><td>R</td><td>Real Media/Video [Variable Bitrate]</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/Real.html">Real</a></td></tr>
+<tr><td><a href="TagNames/RSRC.html">RSRC</a></td><td>R</td><td>Mac OS Resource</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/RSRC.html">RSRC</a> <a href="TagNames/Photoshop.html">Photoshop</a> <a href="TagNames/PostScript.html">PostScript</a> <a href="TagNames/Font.html">Font</a></td></tr>
+<tr><td><a href="TagNames/RTF.html">RTF</a></td><td>R</td><td>Rich Text Format</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/RTF.html">RTF</a></td></tr>
+<tr><td><a href="TagNames/PanasonicRaw.html">RW2</a></td><td>R/W</td><td>Panasonic RAW 2 (<a href="TagNames/EXIF.html">TIFF</a>-based)</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W <a href="TagNames/PanasonicRaw.html">PanasonicRaw</a> <a href="TagNames/Panasonic.html">Panasonic</a></td></tr>
+<tr><td><a href="TagNames/PanasonicRaw.html">RWL</a></td><td>R/W</td><td>Leica RAW (<a href="TagNames/EXIF.html">TIFF</a>-based)</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W <a href="TagNames/PanasonicRaw.html">PanasonicRaw</a> <a href="TagNames/Panasonic.html">Panasonic</a></td></tr>
+<tr><td><a href="TagNames/Rawzor.html">RWZ</a></td><td>R</td><td>Rawzor compressed image</td><td>R</td><td>R</td><td>R</td><td>R</td><td>R <a href="TagNames/Rawzor.html">Rawzor</a></td></tr>
+<tr><td><a href="TagNames/EXE.html#ELF">SO</a></td><td>R</td><td>Unix ELF executable and Shared Object files</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/EXE.html#ELF">EXE</a></td></tr>
+<tr><td>SR2</td><td>R/W</td><td>Sony RAW 2 (<a href="TagNames/EXIF.html">TIFF</a>-based)</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W <a href="TagNames/Sony.html">Sony</a></td></tr>
+<tr><td>SRF</td><td>R</td><td>Sony RAW Format (<a href="TagNames/EXIF.html">TIFF</a>-based)</td><td>R</td><td>R</td><td>R</td><td>R</td><td>R <a href="TagNames/Sony.html">Sony</a></td></tr>
+<tr><td>SRW</td><td>R/W</td><td>Samsung RAW format (<a href="TagNames/EXIF.html">TIFF</a>-based)</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W <a href="TagNames/Samsung.html">Samsung</a></td></tr>
+<tr><td><a href="TagNames/XMP.html#SVG">SVG</a></td><td>R</td><td>Scalable Vector Graphics (XML-based)</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/XMP.html#SVG">SVG</a></td></tr>
+<tr><td><a href="TagNames/Flash.html">SWF</a></td><td>R</td><td>Shockwave Flash</td><td>-</td><td>-</td><td>R</td><td>-</td><td>R <a href="TagNames/Flash.html">Flash</a></td></tr>
+<tr><td>THM</td><td>R/W</td><td>Canon Thumbnail (<a href="TagNames/JPEG.html">JPEG</a>)</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td><a href="#JPEG">Supported JPEG Meta Information</a></td></tr>
+<tr><td><a href="TagNames/OOXML.html">THMX</a></td><td>R</td><td>Office Open XML Theme</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/OOXML.html">XML</a> <a href="TagNames/ZIP.html">ZIP</a></td></tr>
+<tr><td><a href="TagNames/EXIF.html">TIFF, TIF</a></td><td>R/W</td><td>Tagged Image File Format</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C <a href="TagNames/GeoTiff.html">GeoTiff</a><span class=sup>1</span></td></tr>
+<tr><td><a href="TagNames/Font.html">TTF, TTC</a></td><td>R</td><td>True Type Font/Collection</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/Font.html">Font</a></td></tr>
+<tr><td><a href="TagNames/Torrent.html">TORRENT</a></td><td>R</td><td>BitTorrent description file</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/Torrent.html">Torrent</a></td></tr>
+<tr><td>VOB</td><td>R</td><td>Video Object (<a href="TagNames/MPEG.html">MPEG</a>-based)</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/MPEG.html">MPEG</a></td></tr>
+<tr><td><a href="TagNames/CanonVRD.html">VRD</a></td><td>R/W/C</td><td>Canon DPP Recipe Data</td><td>-</td><td>-</td><td>R/W/C</td><td>-</td><td>R/W/C <a href="TagNames/CanonVRD.html">CanonVRD</a></td></tr>
+<tr><td>VSD</td><td>R</td><td>Microsoft Visio Drawing (<a href="TagNames/FlashPix.html">FPX</a>-like)</td><td>-</td><td>-</td><td>R</td><td>R</td><td>R <a href="TagNames/FlashPix.html">FlashPix</a></td></tr>
+<tr><td>WAV</td><td>R</td><td>Windows digital audio WAVeform (<a href="TagNames/RIFF.html">RIFF</a>-based)</td><td>R<span class=sup>2</span></td><td>-</td><td>R</td><td>-</td><td>R <a href="TagNames/RIFF.html">RIFF</a></td></tr>
+<tr><td>WEBM</td><td>R</td><td>Google Web Movie (<a href="TagNames/Matroska.html">MKV</a>-based)</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/Matroska.html">MKV</a></td></tr>
+<tr><td>WEBP</td><td>R</td><td>Google Web Picture (<a href="TagNames/RIFF.html">RIFF</a>-based)</td><td>R<span class=sup>2</span></td><td>-</td><td>R</td><td>-</td><td>R <a href="TagNames/RIFF.html">RIFF</a></td></tr>
+<tr><td>WMA, WMV</td><td>R</td><td>Windows Media Audio/Video (<a href="TagNames/ASF.html">ASF</a>-based)</td><td>-</td><td>-</td><td>R</td><td>-</td><td>R <a href="TagNames/ASF.html">ASF</a></td></tr>
+<tr><td>WV</td><td>R</td><td>WavePack lossless audio (<a href="TagNames/RIFF.html">RIFF</a>-based)</td><td>R<span class=sup>2</span></td><td>-</td><td>R</td><td>-</td><td>R <a href="TagNames/RIFF.html">RIFF</a></td></tr>
+<tr><td><a href="TagNames/SigmaRaw.html">X3F</a></td><td>R/W</td><td>Sigma/Foveon RAW</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W/C</td><td>R/W <a href="TagNames/Sigma.html">Sigma</a>, R <a href="TagNames/SigmaRaw.html">SigmaRaw</a></td></tr>
+<tr><td><a href="TagNames/GIMP.html">XCF</a></td><td>R</td><td>GIMP native image format</td><td>R</td><td>R</td><td>R</td><td>R</td><td>R <a href="TagNames/GIMP.html">GIMP</a></td></tr>
+<tr><td>XLS, XLT</td><td>R</td><td>Microsoft Excel Spreadsheet/Template (<a href="TagNames/FlashPix.html">FPX</a>-like)</td><td>-</td><td>-</td><td>R</td><td>R</td><td>R <a href="TagNames/FlashPix.html">FlashPix</a></td></tr>
+<tr><td><a href="TagNames/OOXML.html">XLSX, XLSM, XLSB</a></td><td>R</td><td>Office Open XML Spreadsheet [Macro-enabled/Binary]</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/OOXML.html">XML</a> <a href="TagNames/ZIP.html">ZIP</a></td></tr>
+<tr><td><a href="TagNames/OOXML.html">XLTX, XLTM</a></td><td>R</td><td>Office Open XML Spreadsheet Template [Macro-enabled]</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/OOXML.html">XML</a> <a href="TagNames/ZIP.html">ZIP</a></td></tr>
+<tr><td><a href="TagNames/XMP.html">XMP</a></td><td>R/W/C</td><td>Extensible Metadata Platform sidecar file</td><td>-</td><td>-</td><td>R/W/C</td><td>-</td><td>-</td></tr>
+<tr><td><a href="TagNames/ZIP.html">ZIP</a></td><td>R</td><td>ZIP archive</td><td>-</td><td>-</td><td>-</td><td>-</td><td>R <a href="TagNames/ZIP.html">ZIP</a></td></tr>
+</table><span class=sm><span class=sup>1</span> Block write only,
+<span class=sup>2</span> Non-standard format,
+<span class=sup>3</span> Writes only some date/time tags,
+<span class=sup>4</span> Only for PostScript-format file type</span></blockquote>
 <h3><a name="JPEG">Supported JPEG Meta Information</a></h3>
 <p>ExifTool can <b>R</b>ead, <b>W</b>rite and/or <b>C</b>reate the following types
 of meta information in JPEG images:</p>
-<blockquote><table class='norm tight'>
+<blockquote><table class='norm tight sm'>
 <tr><th>JPEG Meta Information</th><th>Support</th><th>Description</th></tr>
 <tr><td>APP0 - <a href="TagNames/JFIF.html">JFIF</a></td><td>R/W/C</td><td>JPEG File Interchange Format</td></tr>
 <tr><td>APP0 - <a href="TagNames/JFIF.html#Extension">JFXX</a></td><td>R</td><td>Extended JFIF</td></tr>
@@ -414,7 +424,7 @@ of meta information in JPEG images:</p>
 <tr><td>APP3 - <a href="TagNames/Kodak.html#Meta">Kodak Meta</a></td><td>R/W</td><td>Kodak Meta information (EXIF-like)</td></tr>
 <tr><td>APP3 - <a href="TagNames/Stim.html">Stim</a></td><td>R</td><td>Stereo Still Image format</td></tr>
 <tr><td>APP3 - PreviewImage</td><td>R</td><td>Samsung/HP preview image (multi-segment)</td></tr>
-<tr><td>APP4 - <a href="TagNames/JPEG.html#Scalado">Scalado</a></td><td>R</td><td>(presumably written by <a href="http://www.scalado.com/">Scalado</a> mobile software)</td></tr>
+<tr><td>APP4 - <a href="TagNames/Scalado.html">Scalado</a></td><td>R</td><td>(presumably written by <a href="http://www.scalado.com/">Scalado</a> mobile software)</td></tr>
 <tr><td>APP4 - <a href="TagNames/FlashPix.html">FPXR</a></td><td>R</td><td>FlashPix Ready in non-standard location (multi-segment)</td></tr>
 <tr><td>APP4 - PreviewImage</td><td>R</td><td>(continued from APP3)</td></tr>
 <tr><td>APP5 - <a href="TagNames/Ricoh.html#RMETA">Ricoh RMETA</a></td><td>R</td><td>Ricoh custom fields</td></tr>
@@ -422,9 +432,12 @@ of meta information in JPEG images:</p>
 <tr><td>APP6 - <a href="TagNames/JPEG.html#EPPIM">EPPIM</a></td><td>R</td><td>Toshiba PrintIM</td></tr>
 <tr><td>APP6 - <a href="TagNames/JPEG.html#NITF">NITF</a></td><td>R</td><td>National Imagery Transmission Format</td></tr>
 <tr><td>APP6 - <a href="TagNames/HP.html#TDHD">HP TDHD</a></td><td>R</td><td>Hewlett-Packard Photosmart R837 TDHD information</td></tr>
+<tr><td>APP7 - <a href="TagNames/Pentax.html">Pentax</a></td><td>R</td><td>Pentax APP7 maker notes</td></tr>
 <tr><td>APP7 - <a href="TagNames/Qualcomm.html">Qualcomm</a></td><td>R</td><td>Qualcomm Camera Attributes</td></tr>
 <tr><td>APP8 - <a href="TagNames/JPEG.html#SPIFF">SPIFF</a></td><td>R</td><td>Still Picture Interchange File Format</td></tr>
+<tr><td>APP9 - <a href="TagNames/JPEG.html#MediaJukebox">Media Jukebox</a></td><td>R</td><td>Media Jukebox XML information</td></tr>
 <tr><td>APP10 - Comment</td><td>R</td><td>PhotoStudio Unicode Comment</td></tr>
+<tr><td>APP11 - <a href="TagNames/JPEG.html#HDR">JPEG-HDR</a></td><td>R</td><td>JPEG-HDR compressed ratio image</td></tr>
 <tr><td>APP12 - <a href="TagNames/APP12.html#PictureInfo">Picture Info</a></td><td>R</td><td>ASCII-based Picture Information</td></tr>
 <tr><td>APP12 - <a href="TagNames/APP12.html#Ducky">Ducky</a></td><td>R/W/C</td><td>Photoshop "Save for Web"</td></tr>
 <tr><td>APP13 - <a href="TagNames/Photoshop.html">Photoshop IRB</a></td><td>R/W/C</td><td>Image Resource Block (multi-segment, includes <a href="TagNames/IPTC.html">IPTC</a>)</td></tr>
@@ -508,7 +521,7 @@ executable.  (But note that the characters <code>/\?*:|"&lt;&gt;</code> may not
 be used because they are invalid in Windows file names.)  In this way, the
 behaviour of the drag-and-drop application can be customized.  For example:</p>
 
-<blockquote><table class='norm'>
+<blockquote><table class=norm>
 <tr><th>Executable Name</th><th>Operation</th></tr>
 <tr><td><pre>exiftool(-k).exe</pre></td>
 <td>Print meta information in window and pause before terminating.</td></tr>
@@ -655,7 +668,7 @@ shortcuts in a <a href="config.html">configuration file</a> called
 "<code>.ExifTool_config</code>" in their home directory or exiftool application
 directory.  Here is a simple example that defines two shortcuts:</p>
 
-<blockquote><table class='box'><tr><td><pre class='blk'>
+<blockquote><table class=box><tr><td><pre class=blk>
 %Image::ExifTool::UserDefined::Shortcuts = (
     MyShortcut =&gt; ['createdate','exposuretime','aperture'],
     MyAlias =&gt; 'FocalLengthIn35mmFormat',
@@ -681,21 +694,21 @@ with a '<code>.</code>' in the Windows GUI, but it can be done with the
 <p>ExifTool classifies tags into groups in five different families.
 These groups are:</p>
 
-<blockquote><table class='norm'>
+<blockquote><table class=norm>
 <tr><th>Family</th><th>Group Names</th></tr>
 <tr><td><b>0 (Information&nbsp;Type)</b></td>
-<td>AFCP, AIFF, APE, APP0, APP1, APP12, APP13, APP14, APP15, APP4, APP5, APP6,
-APP8, ASF, CanonVRD, Composite, DICOM, DNG, DV, DjVu, Ducky, EXE, EXIF,
-ExifTool, FLAC, FLIR, File, Flash, FlashPix, Font, FotoStation, GIF, GIMP,
-GeoTiff, H264, HTML, ICC_Profile, ID3, IPTC, ITC, JFIF, JPEG, Jpeg2000, LNK,
-Leaf, M2TS, MIE, MIFF, MNG, MPC, MPEG, MPF, MXF, MakerNotes, Matroska, Meta,
-Ogg, OpenEXR, PDF, PICT, PLIST, PNG, PSP, PanasonicRaw, PhotoCD,
-PhotoMechanic, Photoshop, PostScript, PrintIM, QuickTime, RAF, RIFF, RSRC,
-RTF, Radiance, Rawzor, Real, SVG, SigmaRaw, Stim, Theora, Vorbis, XML, XMP,
-ZIP
+<td class=sm>AFCP, AIFF, APE, APP0, APP1, APP11, APP12, APP13, APP14, APP15, APP4, APP5,
+APP6, APP8, ASF, CanonVRD, Composite, DICOM, DNG, DV, DjVu, Ducky, EXE,
+EXIF, ExifTool, FLAC, FLIR, File, Flash, FlashPix, Font, FotoStation, GIF,
+GIMP, GeoTiff, H264, HTML, ICC_Profile, ID3, IPTC, ITC, JFIF, JPEG,
+Jpeg2000, LNK, Leaf, M2TS, MIE, MIFF, MNG, MPC, MPEG, MPF, MXF, MakerNotes,
+Matroska, Meta, Ogg, OpenEXR, PDF, PICT, PLIST, PNG, PSP, PanasonicRaw,
+PhotoCD, PhotoMechanic, Photoshop, PostScript, PrintIM, QuickTime, RAF,
+RIFF, RSRC, RTF, Radiance, Rawzor, Real, SVG, SigmaRaw, Stim, Theora,
+Torrent, Vorbis, XML, XMP, ZIP
 </td></tr>
 <tr><td><b>1&nbsp;(Specific&nbsp;Location)</b></td>
-<td>AC3, AFCP, AIFF, APE, ASF, AVI1, Adobe, AdobeCM, AdobeDNG, CIFF, Canon,
+<td class=sm>AC3, AFCP, AIFF, APE, ASF, AVI1, Adobe, AdobeCM, AdobeDNG, CIFF, Canon,
 CanonCustom, CanonRaw, CanonVRD, Casio, Chapter#, Composite, DICOM, DNG, DV,
 DjVu, DjVu-Meta, Ducky, EPPIM, EXE, EXIF, ExifIFD, ExifTool, FLAC, File,
 Flash, FlashPix, FLIR, Font, FotoStation, FujiFilm, FujiIFD, GE, GIF, GIMP,
@@ -703,22 +716,23 @@ GPS, GeoTiff, GlobParamIFD, GraphConv, H264, HP, HTML, HTML-dc, HTML-ncc,
 HTML-office, HTML-prod, HTML-vw96, HTTP-equiv, ICC-chrm, ICC-clrt,
 ICC-header, ICC-meas, ICC-meta, ICC-view, ICC_Profile, ICC_Profile#, ID3,
 ID3v1, ID3v1_Enh, ID3v2_2, ID3v2_3, ID3v2_4, IFD0, IFD1, IPTC, IPTC#, ITC,
-InteropIFD, JFIF, JPEG, JVC, Jpeg2000, KDC_IFD, Kodak, KodakBordersIFD,
-KodakEffectsIFD, KodakIFD, KyoceraRaw, LNK, Leaf, LeafSubIFD, Leica, M2TS,
-MAC, MIE-Audio, MIE-Camera, MIE-Canon, MIE-Doc, MIE-Extender, MIE-Flash,
-MIE-GPS, MIE-Geo, MIE-Image, MIE-Lens, MIE-Main, MIE-MakerNotes, MIE-Meta,
-MIE-Orient, MIE-Preview, MIE-Thumbnail, MIE-UTM, MIE-Unknown, MIE-Video,
-MIFF, MNG, MPC, MPEG, MPF0, MPImage, MXF, MakerNotes, MakerUnknown,
-Matroska, MetaIFD, Microsoft, Minolta, MinoltaRaw, NITF, Nikon,
-NikonCapture, NikonCustom, NikonScan, Ocad, Ogg, Olympus, OpenEXR, PDF,
-PICT, PLIST, PNG, PSP, Panasonic, PanasonicRaw, Pentax, PhaseOne, PhotoCD,
-PhotoMechanic, Photoshop, PictureInfo, PostScript, PreviewIFD, PrintIM,
-ProfileIFD, Qualcomm, QuickTime, RAF, RAF2, RIFF, RMETA, RSRC, RTF,
-Radiance, Rawzor, Real, Real-CONT, Real-MDPR, Real-PROP, Real-RA3, Real-RA4,
-Real-RA5, Real-RJMD, Reconyx, Ricoh, SPIFF, SR2, SR2DataIFD, SR2SubIFD,
-SRF#, SVG, Samsung, Sanyo, Scalado, Sigma, SigmaRaw, Sony, SonyIDC, Stim,
-SubIFD, System, Theora, Track#, Version0, Vorbis, XML, XMP, XMP-DICOM,
-XMP-GPano, XMP-MP, XMP-MP1, XMP-PixelLive, XMP-aas, XMP-acdsee, XMP-album,
+InteropIFD, JFIF, JPEG, JPEG-HDR, JVC, Jpeg2000, KDC_IFD, Kodak,
+KodakBordersIFD, KodakEffectsIFD, KodakIFD, KyoceraRaw, LNK, Leaf,
+LeafSubIFD, Leica, M2TS, MAC, MIE-Audio, MIE-Camera, MIE-Canon, MIE-Doc,
+MIE-Extender, MIE-Flash, MIE-GPS, MIE-Geo, MIE-Image, MIE-Lens, MIE-Main,
+MIE-MakerNotes, MIE-Meta, MIE-Orient, MIE-Preview, MIE-Thumbnail, MIE-UTM,
+MIE-Unknown, MIE-Video, MIFF, MNG, MPC, MPEG, MPF0, MPImage, MXF,
+MakerNotes, MakerUnknown, Matroska, MediaJukebox, MetaIFD, Microsoft,
+Minolta, MinoltaRaw, NITF, Nikon, NikonCapture, NikonCustom, NikonScan,
+Ocad, Ogg, Olympus, OpenEXR, PDF, PICT, PLIST, PNG, PSP, Panasonic,
+PanasonicRaw, Pentax, PhaseOne, PhotoCD, PhotoMechanic, Photoshop,
+PictureInfo, PostScript, PreviewIFD, PrintIM, ProfileIFD, Qualcomm,
+QuickTime, RAF, RAF2, RIFF, RMETA, RSRC, RTF, Radiance, Rawzor, Real,
+Real-CONT, Real-MDPR, Real-PROP, Real-RA3, Real-RA4, Real-RA5, Real-RJMD,
+Reconyx, Ricoh, SPIFF, SR2, SR2DataIFD, SR2SubIFD, SRF#, SVG, Samsung,
+Sanyo, Scalado, Sigma, SigmaRaw, Sony, SonyIDC, Stim, SubIFD, System,
+Theora, Torrent, Track#, Version0, Vorbis, XML, XMP, XMP-DICOM, XMP-GPano,
+XMP-MP, XMP-MP1, XMP-PixelLive, XMP-aas, XMP-acdsee, XMP-album,
 XMP-apple-fi, XMP-aux, XMP-cc, XMP-cell, XMP-crs, XMP-dc, XMP-dex,
 XMP-digiKam, XMP-dwc, XMP-exif, XMP-expressionmedia, XMP-extensis, XMP-fpv,
 XMP-ics, XMP-iptcCore, XMP-iptcExt, XMP-lr, XMP-mediapro, XMP-microsoft,
@@ -761,7 +775,7 @@ a '<code>=</code>' symbol (or if the <code>-tagsFromFile</code> or
 a value or set a value from file. The following table outlines the different
 write syntaxes:</p>
 
-<blockquote><table class='norm'>
+<blockquote><table class=norm>
 <tr><th>Syntax</th><th>Result</th></tr>
 <tr><td>-TAG=</td><td>Deletes all occurrences of TAG</td></tr>
 <tr><td>-all=</td><td>Deletes all meta information!</td></tr>
@@ -841,6 +855,25 @@ writing.</li>
 
 <h2><font color='#cc6600'><a name="problems">Known Problems</a></font></h2>
 <ul>
+<li>In <b>Windows</b>, ExifTool will not process files with <b>Unicode
+characters in the file name</b>.  This is due to an underlying lack of support
+for Unicode filenames in the Windows standard C I/O libraries.</li>
+<li>Memory available to ExifTool in the <b>Windows EXE version</b> is limited to
+a few hundred MB.  This limitation has been known to cause <b>unreasonably long
+processing times</b> (almost 7 minutes) for some large EPS files (> 200 MB) which
+are processed much faster by the Perl version (&lt; 6 seconds).</li>
+<li><b>Apple</b> Spotlight and Preview (OS X 10.8.5) and <b>Adobe</b> Photoshop
+CC (version 14.0) <b>ignore XMP in PNG images</b> if it comes after the image
+data, which is where ExifTool adds new XMP. This should be considered as a bug
+in the Apple and Adobe software since XMP is allowed to exist after the image
+data according to the XMP and PNG specifications. <i class=grn>[ExifTool 9.40
+provides the <a href="ExifTool.html#PNGEarlyXMP">PNGEarlyXMP API option</a> to
+allow writing XMP before the IDAT chunk, but there are caveats associated with
+its use]</i></li>
+<li>There is a bug in the <b>Apple</b> RAW file support (OS X 10.4.11) which
+prevents some edited <b>Pentax PEF</b> images from being displayed properly. 
+Other software such as the Pentax Silkypix software and dcraw have no problems
+with these images. <i class=grn>[This bug is fixed in OS X 10.5.4]</i></li>
 <li>There is a bug in a number of <b>Adobe</b> utilities which causes some
 edited <b>Sony ARW</b> images to be displayed with the wrong tone curve. This
 problem has been observed in Photoshop CS4 Camera Raw 5.6, DNG Converter 5.6 and
@@ -848,23 +881,16 @@ Lightroom 2.6 with ARW images from the A500, A550, A700, A850 and A900. Other
 software such as the Sony IDC utility, Apple RAW utilities, dcraw and Capture
 One have no problems with edited images. <i class=grn>[This bug is fixed in
 Camera Raw 6.3 and LR 3.3]</i></li>
-<li>There is a bug in the <b>Apple</b> RAW file support (OS X 10.4.11) which
-prevents some edited <b>Pentax PEF</b> images from being displayed properly. 
-Other software such as the Pentax Silkypix software and dcraw have no problems
-with these images. <i class=grn>[This bug is fixed in OS X 10.5.4]</i></li>
-<li>In <b>Windows</b>, ExifTool will not process files with <b>Unicode
-characters in the file name</b>.  This is due to an underlying lack of support
-for Unicode filenames in the Windows standard C I/O libraries.</li>
 </ul>
 
 <h2><font color='#cc6600'><a name="security">Security Issues</a></font></h2>
 <p>Some ExifTool options (<code>-if</code>, <code>-p</code>, and copying
-arguments like <code>"-DSTTAG&lt;SRCTAG"</code>) have the ability to execute Perl
-code from within command-line arguments.  This becomes a problem if ExifTool is
-executed from another application that blindly passes untrusted file names on
-the command line, since they may be interpreted as ExifTool options if they
-contain a leading dash.  To be secure, the calling application must ensure that
-input file names do not start with a dash (U+002D) or a Unicode minus sign
+arguments like <code>"-DSTTAG&lt;SRCTAG"</code>) have the ability to execute
+Perl code from within command-line arguments.  This may be a security problem if
+ExifTool is executed from another application that blindly passes untrusted file
+names on the command line (since they may be interpreted as ExifTool options if
+they have a leading dash).  To be secure, the calling application must ensure
+that input file names do not start with a dash (U+002D) or a Unicode minus sign
 (U+2212).  The easiest way to accomplish this is to prefix input file names with
 a known directory name, ie) <code>"./FILENAME"</code>.</p>
 
@@ -933,7 +959,7 @@ feature.</p>
 greatly improved by taking advantage of ExifTool's batch processing capabilities
 (the ability to process multiple files or entire directories with a single
 command) to reduce the number of executed commands when performing complex
-operations or processing multiple files.<span class='sm'><sup>&dagger;</sup></span>
+operations or processing multiple files.<span class=sm><sup>&dagger;</sup></span>
 <i>[One exiftool user <a href="http://www.christian-etter.de/?p=458">documented
 a 60x speed increase</a> by processing a large number of files with a single
 command instead of running exiftool separately on each file.]</i> Also, the
@@ -962,7 +988,7 @@ the <code>-if</code> or <code>-fileOrder</code> option because these will add
 the extra step of extracting tags from the file.  Without these the write
 operation is accomplished with a single pass of each file.</p>
 
-<blockquote><span class='sm'><sup>&dagger;</sup></span> <span class=lt>However,
+<blockquote><span class=sm><sup>&dagger;</sup></span> <span class=lt>However,
 note that when the <code>-csv</code> option is used, information from all files
 is buffered in memory before the CSV output is written.  This may be very memory
 intensive and result in poor performance when reading a large number of files in
@@ -976,8 +1002,8 @@ The Image::ExifTool module can be used in any Perl script to provide easy access
 to meta information.  Here is an example of a very simple script that uses
 Image::ExifTool to print out all recognized meta information in a file:</p>
 
-<blockquote><table class='box'><tr><td><pre class='blk'>
-<span class='com'>#!/usr/bin/perl -w</span>
+<blockquote><table class=box><tr><td><pre class=blk>
+<span class=com>#!/usr/bin/perl -w</span>
 use Image::ExifTool ':Public';
 my $file = shift or die "Please specify filename";
 my $info = <a href="ExifTool.html#ImageInfo">ImageInfo</a>($file);
@@ -996,6 +1022,7 @@ binary data.  The simple script above does not handle this case.</p>
 <li><a href="http://owl.phy.queensu.ca/~phil/exiftool/">ExifTool Home Page</a>
 (<a href="http://softdroid.net/exiftool-f%d1%96l">Ukrainian</a> or <a href="http://science.webhostinggeeks.com/exiftool">Serbo-Croatian</a> translation)</li>
 <li><a href="faq.html">ExifTool FAQ</a></li>
+<li><a href="http://u88.n24.queensu.ca/exiftool/forum/">ExifTool Forum</a></li>
 <li><a href="TagNames/index.html">ExifTool Tag Names</a></li>
 <li><a href="history.html">ExifTool Revision History</a> (<a href="http://owl.phy.queensu.ca/~phil/exiftool/rss.xml">RSS feed</a>)</li>
 <li><a href="exiftool_pod.html">exiftool Application Documentation</a> (<a href="http://owl.phy.queensu.ca/~phil/exiftool/exiftool_pod.pdf">download in PDF format</a>)</li>
@@ -1004,6 +1031,7 @@ binary data.  The simple script above does not handle this case.</p>
 <li><a href="config.html">Sample ExifTool Configuration File</a> (custom user-defined tags)</li>
 <li><a href="metafiles.html">Working with Metadata Sidecar Files</a></li>
 <li><a href="struct.html">Reading/Writing Structured Information</a></li>
+<li><a href="mistakes.html">Common Mistakes when using ExifTool</a></li>
 <li><a href="writing.html">Comments on the Subject of Writing Meta Information</a></li>
 <li><a href="standards.html">Problems with current Metadata Standards</a></li>
 <li><a href="under.html">"Under the Hood" of ExifTool</a></li>
@@ -1011,12 +1039,19 @@ binary data.  The simple script above does not handle this case.</p>
 <li><a href="MIE1.1-20070121.pdf">MIE 1.1 File Format Specification (pdf)</a></li>
 <li><a href="http://owl.phy.queensu.ca/~phil/exiftool/sample_images.html">JPEG Image Samples</a> (and
     <a href="http://owl.phy.queensu.ca/~phil/exiftool/makernote_types.html">Table of Makernote Types</a>)</li>
-<li><a href="http://u88.n24.queensu.ca/exiftool/forum/">ExifTool Forum</a></li>
 <li><a href="http://search.cpan.org/dist/Image-ExifTool/">Image::ExifTool at CPAN</a> (CPAN Search)</li>
 <li><a href="https://rt.cpan.org/Public/Dist/Display.html?Name=Image-ExifTool">ExifTool Bug Reports</a> (CPAN Request Tracker)</li>
 <li><a href="http://www.cpantesters.org/distro/I/Image-ExifTool.html">ExifTool Test Reports</a> (CPAN Testers)</li>
 </ul>
 
+<p><b><a name="user_docs">User-contributed Documentation</a></b></p>
+<ul>
+<li><a href="http://www.youtube.com/results?search_query=avpreserve+exiftool">ExifTool Tutorial</a> (video in 4 parts by <a href="http://www.avpreserve.com">AVPreserve</a>)</li>
+<li><a href="http://www.youtube.com/watch?v=K9PAD7GqUag">Using the ExifTool on Linux to read/write Exif Tags to your photo collection</a> (video by <a href="http://www.linuxbyexample.org">Linux By Example</a>)</li>
+<li><a href="http://www.youtube.com/watch?v=WchknYwbFJY">Working with jpg Metadata Comments - Exiftool - BASH - Linux Command Line</a> (video by <a href="http://www.linuxbyexample.org">Linux By Example</a>)</li>
+<li><a href="http://sourceforge.net/projects/exiftool1line/files/">Useful one-line ExifTool commands</a> (.txt file)</li>
+</ul>
+
 <h3><a name="related">Related Utilities</a></h3>
 
 <p>Below are some free utilities which take advantage of the ExifTool engine:</p>
@@ -1041,6 +1076,7 @@ binary data.  The simple script above does not handle this case.</p>
 <li><a href="http://www.kula-shaker.ru/autojpegtrunk-english">AutoJpegTrunk</a>: Tool to remove all metadata from JPEG images</li>
 <li><a href="http://www.advancedrenamer.com/">AdvancedRenamer</a>: Rename files and folders from metadata</li>
 <li><a href="http://www.proxel.se/exif.html">Proxel EXIF Tool</a>: Photoshop plugin based on ExifTool</li>
+<li><a href="http://fhotolab.de/wp/?page_id=795">EXIFCopy</a>: Copy all EXIF information between files</li>
 </ul>
 
 <p><b><a name="related_mac">Mac OS X</a></b></p>
@@ -1090,6 +1126,7 @@ three droplets to extract information [exiftool must be installed] (thanks to Ro
 <li><a href="http://www.resourcespace.org/">ResourceSpace</a>: Open source digital asset management system</li>
 <li><a href="http://owl.phy.queensu.ca/~phil/exiftool/fix_corrupted_nef.html">fix_corrupted_nef</a>: Utility to fix Nikon D4/D600/D800/D800E NEF images corrupted by Nikon Transfer 1</li>
 <li><a href="http://panorama.dyndns.org/index.php?lang=en&subject=pyExifToolGUI&texttag=pyExifToolGUI">pyExifToolGUI</a>: Python-based graphical frontend for ExifTool</li>
+<li><a href="https://github.com/avpreserve/mdqc">MDQC</a>: <a href="http://www.avpreserve.com/avpsresources/tools/">AVPreserve tool</a> for metadata quality control across large numbers of digital assets</li>
 </ul>
 
 <p><b><a name="related_online">Online</a></b></p>
@@ -1102,6 +1139,7 @@ three droplets to extract information [exiftool must be installed] (thanks to Ro
 <ul>
 <li><a href="http://regex.info/blog/lightroom-goodies/gps">Jeffrey's Geoencoding Plugin for Lightroom</a>: Geoencode your photos from within Lightroom</li>
 <li><a href="http://regex.info/blog/lightroom-goodies/metadata-wrangler/">Metadata Wrangler</a>: Strip selected metadata components from images as they are exported</li>
+<li><a href="http://www.robcole.com/Rob/ProductsAndServices/ExifMetaLrPlugin/">ExifMeta</a>: Make all exif metadata available in Lightroom for lib filtering and smart collections</li>
 <li><a href="http://chaoliu12.wordpress.com/fullmetaexport-lightroom-plugin/">FullMetaExport</a>: Export JPEG images from Lightroom with full metadata</li>
 <li><a href="http://www.essl.de/wp/2012/05/24/lenstagger-now-with-analog-camera-film-support/">LensTagger</a>:  Add EXIF information like aperture and focal length for manual lenses</li>
 <li><a href="http://tim.jagenberg.info/projects/deaspect/">DeAspect:</a> Remove aspect ratio information from DNG, CR2 and ORF images to restore full image</li>
@@ -1109,6 +1147,7 @@ three droplets to extract information [exiftool must be installed] (thanks to Ro
 
 <p><b><a name="related_prog">Programming</a></b></p>
 <ul>
+<li><a href="http://owl.phy.queensu.ca/~phil/cpp_exiftool/">C++ ExifTool</a>: Performance-oriented C++ interface for the exiftool application (by Phil Harvey)</li>
 <li><a href="http://owl.phy.queensu.ca/~phil/exiftool/get_tags.sit">Download</a> sample AppleScript to extract tags into AppleScript record (thanks to Rob Lewis)</li>
 <li><a href="http://owl.phy.queensu.ca/~phil/exiftool/ExifToolWrapper.zip">Download</a> example of a simple Visual C++ wrapper for exiftool (thanks Mark Borg and &#40643;&#29790;&#26124;)</li>
 <li><a href="http://owl.phy.queensu.ca/~phil/exiftool/ExifToolWrapper_cs.zip">Download</a> C# version of simple exiftool wrapper (thanks Willem Semmelink)</li>
@@ -1117,7 +1156,9 @@ three droplets to extract information [exiftool must be installed] (thanks to Ro
 <li><a href="http://gitorious.org/mini_exiftool">MiniExiftool</a>: Ruby library wrapper for ExifTool</li>
 <li><a href="https://github.com/mceachen/exiftoolr">exiftoolr</a>: Another Ruby wrapper for ExifTool</li>
 <li><a href="http://smarnach.github.com/pyexiftool/">pyexiftool</a>: Python wrapper for ExifTool</li>
+<li><a href="http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,5262.0.html">ExifToolWrapper</a>: .NET wrapper for ExifTool</li>
 <li><a href="https://github.com/romainneutron/PHPExiftool">PHPExiftool</a>: PHP wrapper for ExifTool (in development)</li>
+<li><a href="http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,5381.0.html">ExifTool_PHP_StayOpen</a>: ExifTool PHP fast processing script using -stayOpen and Gearman</li>
 <li><a href="http://sourceforge.net/projects/moss/">Moss</a>: Collection of Java utilities which includes an exiftool interface</li>
 <li><a href="http://im4java.sourceforge.net">im4java</a>: Java interface to ImageMagick, ExifTool, and other image utilities</li>
 <li><a href="http://www.thebuzzmedia.com/software/exiftool-enhanced-java-integration-for-exiftool/">Java ExifTool</a>: Enhanced Java Integration for ExifTool</li>
@@ -1125,11 +1166,6 @@ three droplets to extract information [exiftool must be installed] (thanks to Ro
 <li><a href="http://u88.n24.queensu.ca/~bogdan/articles/delphi01.html">How to call ExifTool from Delphi</a>, by Bogdan Hrastnik</li>
 </ul>
 
-<p>Also notable, but not directly based on ExifTool:</p>
-
-<ul><li><a href="http://www.photome.de/">PhotoME</a>: Windows utility to read/write meta information</li>
-</ul>
-
 <h3><a name="references">References</a></h3>
 
 <p>The following sources were very useful in helping to decode various types of
@@ -1155,16 +1191,9 @@ information:</p>
 <li><a href="http://www.gvsoft.homedns.org/exif/">http://www.gvsoft.homedns.org/exif/</a></li>
 </ul>
 
-<h3><a name="videos">How-To Videos</a></h3>
-<ul>
-<li><a href="http://www.youtube.com/watch?v=K9PAD7GqUag">Using the ExifTool on Linux to read/write Exif Tags to your photo collection</a></li>
-<li><a href="http://www.youtube.com/watch?v=WchknYwbFJY">Working with jpg Metadata Comments - Exiftool - BASH - Linux Command Line</a></li>
-</ul>
-
 <h3><a name="other_links">Other Links</a></h3>
 <ul>
 <li><a href="http://www.ebv4linux.de/modules.php?name=News&file=article&sid=26">An interview with Phil Harvey</a> (in German), (<a href="http://owl.phy.queensu.ca/~phil/exiftool/PhilHarveyInterview.pdf">English translation in PDF format</a>)</li>
-<li><a href="http://metadatamadness.blogspot.com/">Pepper's "Metadata Madness" blog</a> <i>(Pepper is my cat)</i></li>
 </ul>
 
 <h2><a name="boldly">Boldly Go where No Man has Gone Before...</a></h2>
@@ -1254,13 +1283,13 @@ often as my email.)  Otherwise, if you must contact me directly, my e-mail
 address is on the first line of the README file in the full distribution. 
 Thanks. &nbsp; - <i>Phil Harvey</i></p>
 
-<div class='wide'><table class='links'><tr>
-<th><a href="install.html" class='wt'>&nbsp;Installing&nbsp;</a></th>
-<th><a href="TagNames/index.html" class='wt'>&nbsp;Tag&nbsp;Names&nbsp;</a></th>
-<th><a href="#links" class='wt'>&nbsp;Resources&nbsp;</a></th>
-<th><a href="history.html" class='wt'>&nbsp;History&nbsp;</a></th>
-<th><a href="http://u88.n24.queensu.ca/exiftool/forum/" class='wt'>&nbsp;Forum&nbsp;</a></th>
-<th class='rt'><a href="faq.html" class='wt'>&nbsp;FAQ&nbsp;</a></th>
+<div class=wide><table class=links><tr>
+<th><a href="install.html" class=wt>&nbsp;Installing&nbsp;</a></th>
+<th><a href="TagNames/index.html" class=wt>&nbsp;Tag&nbsp;Names&nbsp;</a></th>
+<th><a href="#links" class=wt>&nbsp;Resources&nbsp;</a></th>
+<th><a href="history.html" class=wt>&nbsp;History&nbsp;</a></th>
+<th><a href="http://u88.n24.queensu.ca/exiftool/forum/" class=wt>&nbsp;Forum&nbsp;</a></th>
+<th class=rt><a href="faq.html" class=wt>&nbsp;FAQ&nbsp;</a></th>
 </tr></table></div>
 </body>
 </html>
@@ -161,13 +161,19 @@ password.)</span></li>
 </ol>
 <p>You can now run exiftool by typing "<code>exiftool</code>" in a Terminal window.</p>
 
-<p class=lt>(Note: Both OS X installation techniques outlined above place
+<p class=lt><b>Notes:</b></p><ul class=lt><li>Both OS X installation techniques outlined above place
 exiftool and its lib directory in /usr/bin, while the standard Unix
 "<code>make install</code>" described below puts "<code>exiftool</code>" in
 /usr/bin and the individual libraries in /Library/Perl/#.#.#, where "#.#.#" is
 your Perl version. If both sets of libraries exist, /usr/bin/lib takes
 precedence for exiftool, but /Library/Perl/#.#.# is the default for any other
-Perl scripts.)</p>
+Perl scripts.</li>
+<li>In OS X 10.8 or later, you may see this message when you try to open the install package:
+<blockquote class=red>"ExifTool-#.##.pkg" can't be opened because it is from an
+unidentified developer.</blockquote> The solution is to set "Allow applications downloaded
+from" to "Anywhere" in the General "Security &amp; Privacy" System Preferences.
+(<a href="http://news.softpedia.com/news/Fix-OS-X-Error-Application-Can-t-Be-Opened-Because-it-Is-from-an-Unidentified-Developer-407375.shtml">Read
+here</a> for a full description.)</li></ul>
 
 <h3>Uninstalling</h3>
 <ol type='i'>
@@ -43,16 +43,16 @@ exiftool, and the method you choose depends on your circumstances and
 preferences. Below are a number of example commands which write an output XMP
 file from information in a source file of any type.</p>
 
-<p class=a>1. Copy same-named tags from all information types to preferred locations in XMP:</p>
+<p class=a><a name="EX1">1.</a> Copy same-named tags from all information types to preferred locations in XMP:</p>
 <p class=b>(<code><i>SRC</i>.<i>EXT</i></code> is the source file name and
 extension, and <code><i>DST</i></code> is the destination file name)</p>
 <pre>exiftool -tagsfromfile <i>SRC</i>.<i>EXT</i> <i>DST</i>.xmp</pre>
 
-<p class=a>2. Rewrite source file to destination XMP file:</p>
+<p class=a><a name="EX2">2.</a> Rewrite source file to destination XMP file:</p>
 <p class=b>(same effect as above, but the command will exit with an error if the output XMP file already exists)</p>
 <pre>exiftool <i>SRC</i>.<i>EXT</i> -o <i>DST</i>.xmp</pre>
 
-<p class=a>3. Copy XMP, preserving original locations:</p>
+<p class=a><a name="EX3">3.</a> Copy XMP, preserving original locations:</p>
 <p class=b>(ie. copies XMP tags only to the same namespaces in the destination file)</p>
 <pre>exiftool -tagsfromfile <i>SRC</i>.<i>EXT</i> -all:all <i>DST</i>.xmp</pre>
 <p class=c>Advanced: Notice that <code>-all:all</code> is used above instead of
@@ -60,35 +60,43 @@ extension, and <code><i>DST</i></code> is the destination file name)</p>
 is an XMP file).  This is because <code>-all:all</code> preserves the family 1 group
 (ie. XMP namespace) while <code>-xmp:all</code> would copy tags to the preferred XMP
 namespace, which may be different for XMP tags that exist in multiple namespaces.
-To get the best of both worlds, <code>"-xmp:all>all:all"</code> may be used to
+To get the best of both worlds, <code>"-all:all&lt;xmp:all"</code> may be used to
 avoid the inefficiencies of assigning tags which aren't copied, while still
 preserving the family 1 group.</p>
 
-<p class=a>4. Rewrite source to XMP file, preserving locations:</p>
+<p class=a><a name="EX4">4.</a> Rewrite source to XMP file, preserving locations:</p>
 <p class=b>(same effect as above, but the command will fail if the XMP file already exists)</p>
 <pre>exiftool <i>SRC</i>.<i>EXT</i> -o <i>DST</i>.xmp -all:all</pre>
 
-<p class=a>5. Generate XMP from EXIF and IPTC using standard tag name mappings:</p>
+<p class=a><a name="EX5">5.</a> Generate XMP from EXIF and IPTC using standard tag name mappings:</p>
 <p class=b> (the <code>.args</code> files are available in the full ExifTool distribution)</p>
 <pre>exiftool -tagsfromfile <i>SRC</i>.<i>EXT</i> -@ exif2xmp.args -@ iptc2xmp.args <i>DST</i>.xmp</pre>
 
-<p class=a>6. Copy XMP as a block to an XMP file:</p>
+<p class=a><a name="EX6">6.</a> Copy XMP as a block to an XMP file:</p>
 <p class=b>(writing as a block is the only way to transfer unknown or non-writable XMP tags)</p>
 <pre>exiftool -tagsfromfile <i>SRC</i>.<i>EXT</i> -xmp <i>DST</i>.xmp</pre>
+<p class=c>Note that this will not deal with extended XMP segments in JPEG
+images if they exist.</p>
 
-<p>7. Extract XMP as a block and write to output XMP file: <span class=lt>(same effect as above)</span></p>
+<p><a name="EX7">7.</a> Extract XMP as a block and write to output XMP file: <span class=lt>(same effect as above)</span></p>
 <pre>exiftool -xmp -b <i>SRC</i>.<i>EXT</i> > <i>DST</i>.xmp</pre>
+<p class=c>As with the previous command, this command will not copy extended XMP
+segments in JPEG images, but in this case the <code>-a</code> option may be
+added to also extract extended XMP blocks.  However, the result would be a
+non-standard XMP file that ExifTool could read but other utilities may not.</p>
 
-<p class=a>8. Extract XMP as a block to an output text file with .xmp extension:</p>
+<p class=a><a name="EX8">8.</a> Extract XMP as a block to an output text file with .xmp extension:</p>
 <p class=b>(same effect as above, but the destination file name will be the same
 as the source file, and this command will fail if the XMP file exists while the
 previous command will overwrite an existing file)</p>
 <pre>exiftool -xmp -b -w xmp <i>SRC</i>.<i>EXT</i></pre>
+<p class=c>The advantage of this command is that it may be applied to multiple
+source files or entire directories.</p>
 
-<p>9. Restore all XMP tags from an XMP sidecar file to XMP in a JPG image:</p>
+<p><a name="EX9">9.</a> Restore all XMP tags from an XMP sidecar file to XMP in a JPG image:</p>
 <pre>exiftool -tagsfromfile <i>SRC</i>.xmp -all:all <i>DST</i>.jpg</pre>
 
-<p class=a>10. Restore XMP as a block from an XMP sidecar file to a JPG image:</p>
+<p class=a><a name="EX10">10.</a> Restore XMP as a block from an XMP sidecar file to a JPG image:</p>
 <p class=b>(same effect as above except that any non-writable XMP tags would be
 copied by this command, and the 2 kB of padding recommended by the XMP
 specification is not added when copying as a block)</p>
@@ -96,43 +104,70 @@ specification is not added when copying as a block)</p>
 
 <h4>Batch Processing</h4>
 
-<p>When batch-generating sidecar files from many images, the <code>-o</code>
-form of the command is easier to use:</p>
+<p>Multiple files may be processed in a single command by specifying multiple
+file and/or directory names on the command line.  The examples below demonstrate
+how to process all files with a specific extension in an entire directory tree.</p>
 
+<p class=a><a name="EX11">11.</a> Create XMP sidecar files for all files with extension EXT in a
+directory tree:</p>
+<p class=b>(when batch-generating sidecar files from many images, the <code>-o</code>
+form of the command is easier to use, but can not be used to modify
+existing XMP files)</p>
 <pre>exiftool -ext <i>EXT</i> -o %d%f.xmp -r <i>DIR</i></pre>
-
-<p>where <code><i>DIR</i></code> is the name of the directory containing the
-images.  Multiple <code>-ext</code> options may be used to process different
-file types in a single command.</p>
-
-<p>However, this technique can not be used to add information to XMP
-sidecar files that already exist.  For this, the <code>-tagsFromFile</code>
-form must be used:</p>
-
+<p class=c>where <code><i>DIR</i></code> is the name of the directory containing
+the images.  The <code>-r</code> option causes sub-directories to be recursively
+processed.  Multiple <code>-ext</code> options may be used to process different
+file types in a single command.  With this command, same-named tags from any type
+of metadata will be written to the preferred XMP namespace in the output XMP
+file.  To copy only XMP tags, <code>-xmp:all</code> may be added to the command.
+(See example 14 for more about this.)</p>
+
+<p class=a><a name="EX12">12.</a> Copy tags to sidecar files that already exist:</p>
+<p class=b>(same as above, but copies only to existing XMP files)</p>
 <pre>exiftool -ext xmp -tagsfromfile %d%f.<i>EXT</i> -r <i>DIR</i></pre>
-
-<p>But note that this command searches for the XMP files instead of the image
-files, so it will not generate new XMP sidecar files if some images don't
-have them.  For this, the advanced (ie. tricky and confusing to use)
-<code>-srcfile</code> option comes in handy:</p>
-
+<p class=c>This command will add tags from the source files to information that
+already exists in the XMP files, but note that this command searches for the XMP
+files instead of the image files, so it will not generate new XMP sidecar files
+if some images don't have them.  For this, the advanced (ie. tricky and
+confusing to use) <code>-srcfile</code> option comes in handy:</p>
+
+<p class=a><a name="EX13">13.</a> Copy tags to sidecar files, generating new files if necessary:</p>
+<p class=b>(same as above, but also creates new XMP files if they don't exist)</p>
 <pre>exiftool -ext <i>EXT</i> -tagsfromfile @ -srcfile %d%f.xmp -r <i>DIR</i></pre>
-
-<p>The <code>-srcfile</code> option also allows multiple files to be specified,
-in which case the first existing file is processed.  This feature allows a
-sidecar file to be used only if it already exists. For example, this command
-writes to a sidecar XMP file if it exists, or the original file otherwise:</p>
-
+<p class=c>Note that as with the previous two commands, this command will
+commute metadata from other groups to the preferred location in XMP.</p>
+
+<p class=a><a name="EX14">14.</a> Copy only XMP tags to the same namespace in sidecar files:</p>
+<p class=b>(same as above, but copies only XMP and preserves specific tag locations)</p>
+<pre>exiftool -ext <i>EXT</i> -tagsfromfile @ "-all:all&lt;xmp:all" -srcfile %d%f.xmp -r <i>DIR</i></pre>
+<p class=c>In this command, if "<code>-xmp:all</code>" was used instead of
+<code>"-all:all&lt;xmp:all"</code>, then all XMP tags would have been copied to
+their preferred namespaces in the sidecar file.  But by writing to the
+destination group of "<code>all</code>", the specific location (ie. XMP
+namespace) of each tag is preserved.</p>
+
+<p class=a><a name="EX15">15.</a> Copy XMP from sidecar files back to the same locations in the source files:</p>
+<p class=b>(the inverse of the previous command)</p>
+<pre>exiftool -ext <i>EXT</i> -tagsfromfile %d%f.xmp -all:all -r <i>DIR</i></pre>
+<p class=c>Here,
+<code>-all:all</code> copies all metadata (in this case only XMP, since the
+sidecar XMP file contains no other types) to the same specific locations in the
+target files (extension <code><i>EXT</i></code>).</p>
+
+<p class=a><a name="EX16">16.</a> Write a tag to XMP sidecar if it exists, or the original file otherwise:</p>
 <pre>exiftool -ext <i>EXT</i> -artist="Phil" -srcfile %d%f.xmp -srcfile @ <i>DIR</i></pre>
+<p class=c>When multiple <code>-srcfile</code> options are used, the first
+existing file is processed.  If none of the specified source files exists, then
+the first one in the list is created (however, this won't happen with this
+example since one of the specified source files is "<code>@</code>", which
+represents the original file name).</p>
 
-<p>Any of these commands may be used to process sidecar files stored in a
-directory other than that of the original images by specifying a directory name
-instead of "<code>%d</code>" in the filename format string.  For example,</p>
-
+<p class=a><a name="EX17">17.</a> Create XMP sidecar file in another directory:</p>
 <pre>exiftool -ext <i>EXT</i> -o <i>DSTDIR</i>/%f.xmp -r <i>SRCDIR</i></pre>
-
-<p>will output XMP files to <code><i>DSTDIR</i></code> with information
-from images in <code><i>SRCDIR</i></code>.</p>
+<p class=c>By specifying a directory name instead of <code>%d</code>, this
+command writes XMP files to <code><i>DSTDIR</i></code> instead of the original
+source directory. The same technique may be used in any of the above commands to
+write XMP to a sidecar file in a different directory.</p>
 
 <h4>Via the API</h4>
 
@@ -207,19 +242,20 @@ exiftool -o out.exif -exif <i>SRCFILE</i></pre>
 tag in each of the above commands (the "<code>-exif</code>" argument) that
 causes the EXIF information to be extracted as a block.  JPEG, PNG, JP2, MIE and
 MIFF files all support storage of EXIF data blocks in this format, although
-exiftool does not current write MIFF images.</p>
+exiftool does not currently write MIFF images.</p>
 
 <p>Tags may also be copied individually to and from an EXIF file, but remember
-that this will not copy "unsafe" tags unless they are specified explicitly. This
-technique must be used when creating an EXIF sidecar file if the source file
-does not contain EXIF:</p>
+that this will not copy "unsafe" tags unless they are specified explicitly.  The
+following command creates an EXIF file from the metadata in a source file:</p>
 
 <pre>exiftool -o out.exif -all -unsafe <i>SRCFILE</i>
 </pre>
 
-<p>or for all files in a directory:</p>
+<p>This technique works for any type of source file, provided the file contains
+at least one tag with the same name as an EXIF tag.  Below is an example of how
+to apply this to all files in a directory:</p>
 
-<pre>exiftool -o %f.exif -all -unsafe <i>DIR</i>
+<pre>exiftool -o %d%f.exif -all -unsafe <i>DIR</i>
 </pre>
 
 <hr>
@@ -260,7 +296,7 @@ which may be useful if disk space is at a premium.</p>
 
 <hr>
 <i>Created Nov 12, 2008</i><br>
-<i>Last revised Oct 7, 2012</i>
+<i>Last revised Jan 29, 2014</i>
 <p class='lf'><a href="index.html">&lt;-- Back to ExifTool home page</a></p>
 </body>
 </html>
@@ -115,6 +115,10 @@ definition is unclear in the case of zoom lenses where the maximum aperture
 varies across the zoom range.  Some manufacturers (Canon, Nikon, Sony) store the
 maximum aperture at the specific focal length, but others (Olympus, Pentax)
 store the absolute maximum aperture of the lens.</li>
+<li>EXIF is not extensible, and is missing definitions for storing some
+information that could be very useful to camera owners (ie. camera orientation,
+sensor temperature, face detection, auto-focus points, image stabilization,
+flash exposure compensation, etc).</li>
 </ol>
 
 <p><b>Simple solutions:</b></p>
@@ -143,6 +147,8 @@ this to allow UTF-16 surrogate pairs may be a good idea.</li>
 <li>Allow ApertureValue and MaxApertureValue to be stored as signed SRATIONAL.</li>
 <li>Define whether MaxApertureValue is taken at the current focal length of
 a zoom lens, or over the entire zoom range.</li>
+<li>Expand the standard to include additional useful information available from
+modern digital cameras.</li>
 </ol>
 
 <a name="PhotoInfo"></a>
@@ -271,7 +277,7 @@ inside a JPEG segment.</p>
 </ol>
 <hr>
 <i>Created Sep 17, 2009</i><br>
-<i>Last revised Jan 8, 2013</i>
+<i>Last revised Dec 7, 2013</i>
 <p class='lf'><a href="index.html">&lt;-- Back to ExifTool home page</a></p>
 </body>
 </html>
@@ -69,11 +69,13 @@ conversion, so for these tags the "Raw" value is the same as the "ValueConv"
 value.  This value may be seen by using the <code>-v</code> option.</li></ol>
 
 <ol start=0><li>The "<b>Binary</b>" value is actual binary data stored in the
-file. This data is displayed in hexadecimal form with the <code>-v3</code>
+file.  This data is displayed in hexadecimal form with the <code>-v3</code>
 option, or by using the <code>-htmlDump</code> feature.  Note that this value is
 not related to the <code>-b</code> (<code>-binary</code>) option, which actually
 returns the "ValueConv" value and is used for tags where this value can not be
-presented in a simple text format.</li></ol>
+presented in a simple text format.  The Writable column in the
+<a href="TagNames/index.html">Tag Name documentation</a>
+gives the format of this binary data for writable tags.</li></ol>
 
 <p>Below are some examples of these different values for a few tags:</p>
 
@@ -91,6 +93,10 @@ presented in a simple text format.</li></ol>
 <a name="philophies"></a>
 <h2>Underlying Philosophies</h2>
 
+<p>You have the right to know about the metadata contained in your images.  A main
+goal of the Exiftool project is to make this information freely available, both to
+the general public and as a resource for other developers.</p>
+
 <p>In the design of exiftool, there have been a number of underlying philosophies
 which have helped to influence the overall development:</p>
 
@@ -114,7 +120,7 @@ which have helped to influence the overall development:</p>
 </ol>
 
 <hr>
-<i>Last revised June 21, 2012</i>
+<i>Last revised Dec 24, 2013</i>
 <p class='lf'><a href="index.html">&lt;-- Back to ExifTool home page</a></p>
 </body>
 </html>
@@ -24,7 +24,7 @@
 #
 #               May also be used for string i/o (just pass a scalar reference)
 #
-# Legal:        Copyright (c) 2003-2013 Phil Harvey (phil at owl.phy.queensu.ca)
+# Legal:        Copyright (c) 2003-2014 Phil Harvey (phil at owl.phy.queensu.ca)
 #               This library is free software; you can redistribute it and/or
 #               modify it under the same terms as Perl itself.
 #------------------------------------------------------------------------------
@@ -3,7 +3,7 @@
 #
 # Description:  Buffer to support random access reading of sequential file
 #
-# Legal:        Copyright (c) 2003-2013 Phil Harvey (phil at owl.phy.queensu.ca)
+# Legal:        Copyright (c) 2003-2014 Phil Harvey (phil at owl.phy.queensu.ca)
 #               This library is free software; you can redistribute it and/or
 #               modify it under the same terms as Perl itself.
 #------------------------------------------------------------------------------
@@ -217,7 +217,7 @@ Nothing.
 
 =head1 AUTHOR
 
-Copyright 2003-2013 Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014 Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -477,7 +477,7 @@ main purpose of encryption, so this really can't be considered a bug.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -5,7 +5,7 @@
 #
 # Revisions:    12/26/2005 - P. Harvey Created
 #
-# References:   1) http://www.tocarte.com/media/axs_afcp_spec.pdf
+# References:   1) http://web.archive.org/web/20080828211305/http://www.tocarte.com/media/axs_afcp_spec.pdf
 #------------------------------------------------------------------------------
 
 package Image::ExifTool::AFCP;
@@ -14,7 +14,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.04';
+$VERSION = '1.06';
 
 sub ProcessAFCP($$);
 
@@ -28,6 +28,10 @@ incompatible with some file formats.
 
 ExifTool will read and write (but not create) AFCP IPTC information in JPEG
 and TIFF images.
+
+See
+L<http://web.archive.org/web/20080828211305/http://www.tocarte.com/media/axs_afcp_spec.pdf>
+for the AFCP specification.
     },
     IPTC => { SubDirectory => { TagTable => 'Image::ExifTool::IPTC::Main' } },
     TEXT => 'Text',
@@ -65,7 +69,7 @@ and TIFF images.
 # - returns Fixup reference in dirInfo hash when writing
 sub ProcessAFCP($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my $curPos = $raf->Tell();
     my $offset = $$dirInfo{Offset} || 0;    # offset from end of file
@@ -115,14 +119,14 @@ NoAFCP: for (;;) {
         $$dirInfo{DirLen} = $endPos - ($startPos + $fix);
 
         $rtnVal = 1;
-        my $verbose = $exifTool->Options('Verbose');
-        my $out = $exifTool->Options('TextOut');
+        my $verbose = $et->Options('Verbose');
+        my $out = $et->Options('TextOut');
         my $outfile = $$dirInfo{OutFile};
         if ($outfile) {
             # allow all AFCP information to be deleted
-            if ($exifTool->{DEL_GROUP}->{AFCP}) {
+            if ($$et{DEL_GROUP}{AFCP}) {
                 $verbose and print $out "  Deleting AFCP\n";
-                ++$exifTool->{CHANGED};
+                ++$$et{CHANGED};
                 last;
             }
             $dirBuff = $valBuff = '';
@@ -131,13 +135,13 @@ NoAFCP: for (;;) {
             $fixup or $fixup = $$dirInfo{Fixup} = new Image::ExifTool::Fixup;
             $vers = substr($buff, 4, 2); # get version number
         } else {
-            $exifTool->DumpTrailer($dirInfo) if $verbose or $exifTool->{HTML_DUMP};
+            $et->DumpTrailer($dirInfo) if $verbose or $$et{HTML_DUMP};
         }
         # read AFCP directory data
         my $numEntries = Get16u(\$buff, 6);
         my $dir;
         unless ($raf->Read($dir, 12 * $numEntries) == 12 * $numEntries) {
-            $exifTool->Error('Error reading AFCP directory', 1);
+            $et->Error('Error reading AFCP directory', 1);
             last;
         }
         if ($verbose > 2 and not $outfile) {
@@ -146,11 +150,11 @@ NoAFCP: for (;;) {
             Image::ExifTool::HexDump(\$dat, undef,
                 Addr   => $$dirInfo{DataPos},
                 Width  => 12,
-                Prefix => $exifTool->{INDENT},
+                Prefix => $$et{INDENT},
                 Out => $out,
             );
         }
-        $fix and $exifTool->Warn("Adjusted AFCP offsets by $fix", 1);
+        $fix and $et->Warn("Adjusted AFCP offsets by $fix", 1);
 #
 # process AFCP directory
 #
@@ -167,7 +171,7 @@ NoAFCP: for (;;) {
             {
                 if ($outfile) {
                     # rewrite this information
-                    my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+                    my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
                     if ($tagInfo and $$tagInfo{SubDirectory}) {
                         my %subdirInfo = (
                             DataPt => \$buff,
@@ -177,7 +181,7 @@ NoAFCP: for (;;) {
                             Parent => 'AFCP',
                         );
                         my $subTable = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
-                        my $newDir = $exifTool->WriteDirectory(\%subdirInfo, $subTable);
+                        my $newDir = $et->WriteDirectory(\%subdirInfo, $subTable);
                         if (defined $newDir) {
                             $size = length $newDir;
                             $buff = $newDir;
@@ -188,7 +192,7 @@ NoAFCP: for (;;) {
                     $valBuff .= $buff;
                 } else {
                     # extract information
-                    $exifTool->HandleTag($tagTablePtr, $tag, $buff,
+                    $et->HandleTag($tagTablePtr, $tag, $buff,
                         DataPt => \$buff,
                         Size => $size,
                         Index => $index,
@@ -196,7 +200,7 @@ NoAFCP: for (;;) {
                     );
                 }
             } else {
-                $exifTool->Warn("Bad AFCP directory");
+                $et->Warn("Bad AFCP directory");
                 $rtnVal = -1 if $outfile;
                 last;
             }
@@ -258,7 +262,7 @@ scanning for AFCP information.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -18,7 +18,7 @@ use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::ID3;
 
-$VERSION = '1.04';
+$VERSION = '1.05';
 
 # information for time/date-based tags (time zero is Jan 1, 1904)
 my %timeInfo = (
@@ -131,24 +131,24 @@ my %timeInfo = (
 # Returns: 1 on success
 sub ProcessComment($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirLen = $$dirInfo{DirLen};
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     return 0 unless $dirLen > 2;
     my $numComments = unpack('n',$$dataPt);
     my $pos = 2;
     my $i;
-    $verbose and $exifTool->VerboseDir('Comment', $numComments);
+    $verbose and $et->VerboseDir('Comment', $numComments);
     for ($i=0; $i<$numComments; ++$i) {
         last if $pos + 8 > $dirLen;
         my ($time, $markerID, $size) = unpack("x${pos}Nnn", $$dataPt);
-        $exifTool->HandleTag($tagTablePtr, 0, $time);
-        $exifTool->HandleTag($tagTablePtr, 1, $markerID) if $markerID;
+        $et->HandleTag($tagTablePtr, 0, $time);
+        $et->HandleTag($tagTablePtr, 1, $markerID) if $markerID;
         $pos += 8;
         last if $pos + $size > $dirLen;
         my $val = substr($$dataPt, $pos, $size);
-        $exifTool->HandleTag($tagTablePtr, 2, $val);
+        $et->HandleTag($tagTablePtr, 2, $val);
         ++$size if $size & 0x01;    # account for padding byte if necessary
         $pos += $size;
     }
@@ -160,7 +160,7 @@ sub ProcessComment($$$)
 # Returns: 1 on success, 0 if this wasn't a valid AIFF file
 sub ProcessAIFF($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my ($buff, $err, $tagTablePtr, $page, $type);
 
@@ -176,18 +176,18 @@ sub ProcessAIFF($$)
         $pos += 4;
         $buff = substr($buff, 4) . $buf2;
         $tagTablePtr = GetTagTable('Image::ExifTool::DjVu::Main');
-        $exifTool->SetFileType('DJVU');
+        $et->SetFileType('DJVU');
         # modifiy FileType to indicate a multi-page document
-        $exifTool->{VALUE}->{FileType} .= " (multi-page)" if $buf2 eq 'DJVM';
+        $$et{VALUE}{FileType} .= " (multi-page)" if $buf2 eq 'DJVM';
         $type = 'DjVu';
     } else {
         return 0 unless $buff =~ /^FORM....(AIF(F|C))/s;
-        $exifTool->SetFileType($1);
+        $et->SetFileType($1);
         $tagTablePtr = GetTagTable('Image::ExifTool::AIFF::Main');
         $type = 'AIFF';
     }
     SetByteOrder('MM');
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
 #
 # Read through the IFF chunks
 #
@@ -195,21 +195,21 @@ sub ProcessAIFF($$)
         $raf->Read($buff, 8) == 8 or last;
         $pos += 8;
         my ($tag, $len) = unpack('a4N', $buff);
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
-        $exifTool->VPrint(0, "AIFF '$tag' chunk ($len bytes of data):\n");
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
+        $et->VPrint(0, "AIFF '$tag' chunk ($len bytes of data):\n");
         # AIFF chunks are padded to an even number of bytes
         my $len2 = $len + ($len & 0x01);
         if ($tagInfo) {
             if ($$tagInfo{TypeOnly}) {
                 $len = $len2 = 4;
                 $page = ($page || 0) + 1;
-                $exifTool->VPrint(0, $exifTool->{INDENT} . "Page $page:\n");
+                $et->VPrint(0, $$et{INDENT} . "Page $page:\n");
             }
             $raf->Read($buff, $len2) >= $len or $err=1, last;
             unless ($$tagInfo{SubDirectory} or $$tagInfo{Binary}) {
                 $buff =~ s/\0+$//;  # remove trailing nulls
             }
-            $exifTool->HandleTag($tagTablePtr, $tag, $buff,
+            $et->HandleTag($tagTablePtr, $tag, $buff,
                 DataPt => \$buff,
                 DataPos => $pos,
                 Start => 0,
@@ -223,7 +223,7 @@ sub ProcessAIFF($$)
         }
         $pos += $len2;
     }
-    $err and $exifTool->Warn("Error reading $type file (corrupted?)");
+    $err and $et->Warn("Error reading $type file (corrupted?)");
     return 1;
 }
 
@@ -246,7 +246,7 @@ information from AIFF (Audio Interchange File Format) audio files.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -15,7 +15,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.02';
+$VERSION = '1.03';
 
 # APE metadata blocks
 %Image::ExifTool::APE::Main = (
@@ -24,7 +24,7 @@ $VERSION = '1.02';
         Tags found in Monkey's Audio (APE) information.  Only a few common tags are
         listed below, but ExifTool will extract any tag found.  ExifTool supports
         APEv1 and APEv2 tags, as well as ID3 information in APE files, and will also
-        read APE metadata from MP3 files.
+        read APE metadata from MP3 and MPC files.
     },
     Album   => { },
     Artist  => { },
@@ -93,25 +93,25 @@ sub MakeTag($$)
 # Returns: 1 on success, 0 if this wasn't a valid APE file
 sub ProcessAPE($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
 
     # must first check for leading/trailing ID3 information
-    unless ($exifTool->{DoneID3}) {
+    unless ($$et{DoneID3}) {
         require Image::ExifTool::ID3;
-        Image::ExifTool::ID3::ProcessID3($exifTool, $dirInfo) and return 1;
+        Image::ExifTool::ID3::ProcessID3($et, $dirInfo) and return 1;
     }
     my $raf = $$dirInfo{RAF};
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     my ($buff, $i, $header, $tagTablePtr, $dataPos, $oldIndent);
 
-    $exifTool->{DoneAPE} = 1;
+    $$et{DoneAPE} = 1;
 
     # check APE signature and process audio information
     # unless this is some other type of file
-    unless ($exifTool->{VALUE}->{FileType}) {
+    unless ($$et{VALUE}{FileType}) {
         $raf->Read($buff, 32) == 32 or return 0;
         $buff =~ /^(MAC |APETAGEX)/ or return 0;
-        $exifTool->SetFileType();
+        $et->SetFileType();
         SetByteOrder('II');
 
         if ($buff =~ /^APETAGEX/) {
@@ -133,7 +133,7 @@ sub ProcessAPE($$)
                     }
                 }
             }
-            $exifTool->ProcessDirectory( { DataPt => \$buff }, $table) if $table;
+            $et->ProcessDirectory( { DataPt => \$buff }, $table) if $table;
         }
     }
     # look for APE trailer unless we already found an APE header
@@ -141,7 +141,7 @@ sub ProcessAPE($$)
         # look for the APE trailer footer...
         my $footPos = -32;
         # (...but before the ID3v1 trailer if it exists)
-        $footPos -= 128 if $exifTool->{DoneID3} == 2;
+        $footPos -= 128 if $$et{DoneID3} == 2;
         $raf->Seek($footPos, 2)     or return 1;
         $raf->Read($buff, 32) == 32 or return 1;
         $buff =~ /^APETAGEX/        or return 1;
@@ -158,10 +158,10 @@ sub ProcessAPE($$)
         $raf->Read($buff, $size) == $size)
     {
         if ($verbose) {
-            $oldIndent = $$exifTool{INDENT};
-            $$exifTool{INDENT} .= '| ';
-            $exifTool->VerboseDir("APEv$version", $count, $size);
-            $exifTool->VerboseDump(\$buff, DataPos => $raf->Tell() - $size);
+            $oldIndent = $$et{INDENT};
+            $$et{INDENT} .= '| ';
+            $et->VerboseDir("APEv$version", $count, $size);
+            $et->VerboseDump(\$buff, DataPos => $raf->Tell() - $size);
         }
         $tagTablePtr = GetTagTable('Image::ExifTool::APE::Main');
         $dataPos = $raf->Tell() - $size;
@@ -197,11 +197,11 @@ sub ProcessAPE($$)
                     my $t = "$tag Desc";
                     my $v = $1;
                     MakeTag($t, $tagTablePtr) unless $$tagTablePtr{$t};
-                    $exifTool->HandleTag($tagTablePtr, $t, $v);
+                    $et->HandleTag($tagTablePtr, $t, $v);
                 }
             }
         }
-        $exifTool->HandleTag($tagTablePtr, $tag, $val,
+        $et->HandleTag($tagTablePtr, $tag, $val,
             Index => $i,
             DataPt => \$buff,
             DataPos => $dataPos,
@@ -210,8 +210,8 @@ sub ProcessAPE($$)
         );
         $pos += $len;
     }
-    $i == $count or $exifTool->Warn('Bad APE trailer');
-    $$exifTool{INDENT} = $oldIndent if defined $oldIndent;
+    $i == $count or $et->Warn('Bad APE trailer');
+    $$et{INDENT} = $oldIndent if defined $oldIndent;
     return 1;
 }
 
@@ -238,7 +238,7 @@ Currently doesn't parse MAC header unless it is at the start of the file.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -14,7 +14,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.11';
+$VERSION = '1.12';
 
 sub ProcessAPP12($$$);
 sub ProcessDucky($$$);
@@ -134,11 +134,11 @@ sub WriteDucky($$$);
 # Returns: New directory data or undefined on error
 sub WriteDucky($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    $exifTool or return 1;    # allow dummy access to autoload this package
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    $et or return 1;    # allow dummy access to autoload this package
     my $dataPt = $$dirInfo{DataPt};
     my $pos = $$dirInfo{DirStart};
-    my $newTags = $exifTool->GetNewTagInfoHash($tagTablePtr);
+    my $newTags = $et->GetNewTagInfoHash($tagTablePtr);
     my @addTags = sort { $a <=> $b } keys(%$newTags);
     my ($dirEnd, %doneTags);
     if ($dataPt) {
@@ -158,7 +158,7 @@ sub WriteDucky($$$)
             $len = Get16u($dataPt, $pos + 2);
             $pos += 4;
             if ($pos + $len > $dirEnd) {
-                $exifTool->Warn('Invalid Ducky block length');
+                $et->Warn('Invalid Ducky block length');
                 return undef;
             }
             $val = substr($$dataPt, $pos, $len);
@@ -171,11 +171,11 @@ sub WriteDucky($$$)
         $doneTags{$tag} = 1;
         my $tagInfo = $$newTags{$tag};
         if ($tagInfo) {
-            my $nvHash = $exifTool->GetNewValueHash($tagInfo);
+            my $nvHash = $et->GetNewValueHash($tagInfo);
             my $isNew;
             if (defined $val) {
-                if ($exifTool->IsOverwriting($nvHash, $val)) {
-                    $exifTool->VerboseValue("- Ducky:$$tagInfo{Name}", $val);
+                if ($et->IsOverwriting($nvHash, $val)) {
+                    $et->VerboseValue("- Ducky:$$tagInfo{Name}", $val);
                     $isNew = 1;
                 }
             } else {
@@ -183,10 +183,10 @@ sub WriteDucky($$$)
                 $isNew = 1;
             }
             if ($isNew) {
-                $val = $exifTool->GetNewValues($nvHash);
-                ++$exifTool->{CHANGED};
+                $val = $et->GetNewValues($nvHash);
+                ++$$et{CHANGED};
                 next unless defined $val;   # next if tag is being deleted
-                $exifTool->VerboseValue("+ Ducky:$$tagInfo{Name}", $val);
+                $et->VerboseValue("+ Ducky:$$tagInfo{Name}", $val);
             }
         }
         $newData .= pack('nn', $tag, length $val) . $val;
@@ -207,7 +207,7 @@ sub WriteDucky($$$)
 #      c) N bytes: block data
 sub ProcessDucky($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $pos = $$dirInfo{DirStart};
     my $dirEnd = $pos + $$dirInfo{DirLen};
@@ -219,11 +219,11 @@ sub ProcessDucky($$$)
         my $len = Get16u($dataPt, $pos + 2);
         $pos += 4;
         if ($pos + $len > $dirEnd) {
-            $exifTool->Warn('Invalid Ducky block length');
+            $et->Warn('Invalid Ducky block length');
             last;
         }
         my $val = substr($$dataPt, $pos, $len);
-        $exifTool->HandleTag($tagTablePtr, $tag, $val,
+        $et->HandleTag($tagTablePtr, $tag, $val,
             DataPt => $dataPt,
             DataPos => $$dirInfo{DataPos},
             Start => $pos,
@@ -240,7 +240,7 @@ sub ProcessDucky($$$)
 # Returns: 1 on success, 0 if this wasn't a recognized APP12
 sub ProcessAPP12($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirStart = $$dirInfo{DirStart} || 0;
     my $dirLen = $$dirInfo{DirLen} || (length($$dataPt) - $dirStart);
@@ -250,7 +250,7 @@ sub ProcessAPP12($$$)
     } else {
         pos($$dataPt) = $$dirInfo{DirStart};
     }
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     my $success = 0;
     my $section = '';
     pos($$dataPt) = 0;
@@ -263,16 +263,16 @@ sub ProcessAPP12($$$)
         my $token = $1;
         # was this a section name?
         if ($token =~ /^\[(.*)\]/) {
-            $exifTool->VerboseDir($1) if $verbose;
+            $et->VerboseDir($1) if $verbose;
             $section = ($token =~ /\[(\S+) ?Info\]/i) ? $1 : '';
             $success = 1;
             next;
         }
-        $exifTool->VerboseDir($$dirInfo{DirName}) if $verbose and not $success;
+        $et->VerboseDir($$dirInfo{DirName}) if $verbose and not $success;
         $success = 1;
         my ($tag, $val) = ($token =~ /(\S+)=(.+)/);
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
-        $verbose and $exifTool->VerboseInfo($tag, $tagInfo, Value => $val);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
+        $verbose and $et->VerboseInfo($tag, $tagInfo, Value => $val);
         unless ($tagInfo) {
             # add new tag to table
             $tagInfo = { Name => ucfirst $tag };
@@ -280,7 +280,7 @@ sub ProcessAPP12($$$)
             $$tagInfo{Groups} = { 2 => 'Camera' } if $section =~ /camera/i;
             AddTagToTable($tagTablePtr, $tag, $tagInfo);
         }
-        $exifTool->FoundTag($tagInfo, $val);
+        $et->FoundTag($tagInfo, $val);
     }
     return $success;
 }
@@ -305,7 +305,7 @@ APP12 meta information.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -17,10 +17,12 @@ use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Exif;
 use Image::ExifTool::RIFF;
 
-$VERSION = '1.19';
+$VERSION = '1.21';
 
-sub ProcessMetadata($$$);
+sub ProcessASF($$;$);
 sub ProcessContentDescription($$$);
+sub ProcessExtendedContentDescription($$$);
+sub ProcessMetadata($$$);
 sub ProcessPicture($$$);
 sub ProcessCodecList($$$);
 
@@ -62,7 +64,7 @@ my %advancedContentEncryption = (
 
 # ASF top level objects
 %Image::ExifTool::ASF::Main = (
-    PROCESS_PROC => \&Image::ExifTool::ASF::ProcessASF,
+    PROCESS_PROC => \&ProcessASF,
     NOTES => q{
         The ASF format is used by Windows WMA and WMV files, and DIVX videos.  Tag
         ID's aren't listed because they are huge 128-bit GUID's that would ruin the
@@ -85,7 +87,7 @@ my %advancedContentEncryption = (
 
 # ASF header objects
 %Image::ExifTool::ASF::Header = (
-    PROCESS_PROC => \&Image::ExifTool::ASF::ProcessASF,
+    PROCESS_PROC => \&ProcessASF,
     '8CABDCA1-A947-11CF-8EE4-00C00C205365' => {
         Name => 'FileProperties',
         SubDirectory => { TagTable => 'Image::ExifTool::ASF::FileProperties' },
@@ -245,8 +247,8 @@ my %advancedContentEncryption = (
     Lyrics => {},
     Lyrics_Synchronised => {},
     MCDI => {},
-    MediaClassPrimaryID => {},
-    MediaClassSecondaryID => {},
+    MediaClassPrimaryID => { ValueConv => 'Image::ExifTool::ASF::GetGUID($val)' },
+    MediaClassSecondaryID => { ValueConv => 'Image::ExifTool::ASF::GetGUID($val)' },
     MediaCredits => {},
     MediaIsDelay => {},
     MediaIsFinale => {},
@@ -403,8 +405,8 @@ my %advancedContentEncryption = (
         Name => 'StreamType',
         Format => 'binary[16]',
         RawConv => sub { # set ASF_STREAM_TYPE for use in conditional tags
-            my ($val, $exifTool) = @_;
-            $exifTool->{ASF_STREAM_TYPE} = $streamType{GetGUID($val)} || '';
+            my ($val, $et) = @_;
+            $$et{ASF_STREAM_TYPE} = $streamType{GetGUID($val)} || '';
             return $val;
         },
         ValueConv => 'Image::ExifTool::ASF::GetGUID($val)',
@@ -462,7 +464,7 @@ my %advancedContentEncryption = (
 );
 
 %Image::ExifTool::ASF::HeaderExtension = (
-    PROCESS_PROC => \&Image::ExifTool::ASF::ProcessASF,
+    PROCESS_PROC => \&ProcessASF,
     '14E6A5CB-C672-4332-8399-A96952065B5A' => 'ExtendedStreamProps',
     'A08649CF-4775-4670-8A16-6E35357566CD' => 'AdvancedMutualExcl',
     'D1465A40-5A79-4338-B71B-E36B8FD6C249' => 'GroupMutualExclusion',
@@ -471,11 +473,19 @@ my %advancedContentEncryption = (
     '7C4346A9-EFE0-4BFC-B229-393EDE415C85' => 'LanguageList',
     'C5F8CBEA-5BAF-4877-8467-AA8C44FA4CCA' => {
         Name => 'Metadata',
-        SubDirectory => { TagTable => 'Image::ExifTool::ASF::Metadata' },
+        SubDirectory => {
+            # have seen some tags same as ExtendedDescr, so use this table - PH
+            TagTable => 'Image::ExifTool::ASF::ExtendedDescr',
+            ProcessProc => \&ProcessMetadata,
+        },
     },
     '44231C94-9498-49D1-A141-1D134E457054' => {
         Name => 'MetadataLibrary',
-        SubDirectory => { TagTable => 'Image::ExifTool::ASF::Metadata' },
+        SubDirectory => {
+            # have seen some tags same as ExtendedDescr, so use this table - PH
+            TagTable => 'Image::ExifTool::ASF::ExtendedDescr',
+            ProcessProc => \&ProcessMetadata,
+        },
     },
     'D6E229DF-35DA-11D1-9034-00A0C90349BE' => 'IndexParameters',
     '6B203BAD-3F11-48E4-ACA8-D7613DE2CFA7' => 'TimecodeIndexParms',
@@ -484,10 +494,6 @@ my %advancedContentEncryption = (
     'ABD3D211-A9BA-11cf-8EE6-00C00C205365' => 'Reserved1',
 );
 
-%Image::ExifTool::ASF::Metadata = (
-    PROCESS_PROC => \&Image::ExifTool::ASF::ProcessMetadata,
-);
-
 %Image::ExifTool::ASF::CodecList = (
     PROCESS_PROC => \&ProcessCodecList,
     VideoCodecName => {},
@@ -505,7 +511,9 @@ my %advancedContentEncryption = (
 sub GetGUID($)
 {
     # must do some byte swapping
-    my $buff = unpack('H*',pack('NnnNN',unpack('VvvNN',$_[0])));
+    my $val = shift;
+    return $val unless length($val) == 16;
+    my $buff = unpack('H*',pack('NnnNN',unpack('VvvNN',$val)));
     $buff =~ s/(.{8})(.{4})(.{4})(.{4})/$1-$2-$3-$4-/;
     return uc($buff);
 }
@@ -516,7 +524,7 @@ sub GetGUID($)
 # Returns: 1 on success
 sub ProcessContentDescription($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirLen = $$dirInfo{DirLen};
     return 0 if $dirLen < 10;
@@ -527,8 +535,8 @@ sub ProcessContentDescription($$$)
         my $len = shift @len;
         next unless $len;
         return 0 if $pos + $len > $dirLen;
-        my $val = $exifTool->Decode(substr($$dataPt,$pos,$len),'UCS2','II');
-        $exifTool->HandleTag($tagTablePtr, $tag, $val);
+        my $val = $et->Decode(substr($$dataPt,$pos,$len),'UCS2','II');
+        $et->HandleTag($tagTablePtr, $tag, $val);
         $pos += $len;
     }
     return 1;
@@ -540,12 +548,12 @@ sub ProcessContentDescription($$$)
 # Returns: 1 on success
 sub ProcessContentBranding($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirLen = $$dirInfo{DirLen};
     return 0 if $dirLen < 40;
     # decode banner image type
-    $exifTool->HandleTag($tagTablePtr, 0, unpack('V', $$dataPt));
+    $et->HandleTag($tagTablePtr, 0, unpack('V', $$dataPt));
     # decode banner image, banner URL and copyright URL
     my $pos = 4;
     my $tag;
@@ -556,7 +564,7 @@ sub ProcessContentBranding($$$)
         next unless $size;
         return 0 if $pos + $size > $dirLen;
         my $val = substr($$dataPt, $pos, $size);
-        $exifTool->HandleTag($tagTablePtr, $tag, $val);
+        $et->HandleTag($tagTablePtr, $tag, $val);
         $pos += $size;
     }
     return 1;
@@ -569,10 +577,10 @@ sub ProcessContentBranding($$$)
 # Returns: converted value
 sub ReadASF($$$$$)
 {
-    my ($exifTool, $dataPt, $pos, $format, $size) = @_;
+    my ($et, $dataPt, $pos, $format, $size) = @_;
     my @vals;
     if ($format == 0) { # unicode string
-        $vals[0] = $exifTool->Decode(substr($$dataPt,$pos,$size),'UCS2','II');
+        $vals[0] = $et->Decode(substr($$dataPt,$pos,$size),'UCS2','II');
     } elsif ($format == 2) { # 4-byte boolean
         @vals = ReadValue($dataPt, $pos, 'int32u', undef, $size);
         foreach (@vals) {
@@ -596,12 +604,12 @@ sub ReadASF($$$$$)
 # Returns: 1 on success
 sub ProcessExtendedContentDescription($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirLen = $$dirInfo{DirLen};
     return 0 if $dirLen < 2;
     my $count = Get16u($dataPt, 0);
-    $exifTool->VerboseDir($dirInfo, $count);
+    $et->VerboseDir($dirInfo, $count);
     my $pos = 2;
     my $i;
     for ($i=0; $i<$count; ++$i) {
@@ -613,13 +621,48 @@ sub ProcessExtendedContentDescription($$$)
         $tag =~ s/^WM\///; # remove leading "WM/"
         $pos += $nameLen;
         my ($dType, $dLen) = unpack("x${pos}v2", $$dataPt);
-        my $val = ReadASF($exifTool,$dataPt,$pos+4,$dType,$dLen);
-        $exifTool->HandleTag($tagTablePtr, $tag, $val,
+        $pos += 4;
+        return 0 if $pos + $dLen > $dirLen;
+        my $val = ReadASF($et,$dataPt,$pos,$dType,$dLen);
+        $et->HandleTag($tagTablePtr, $tag, $val,
+            DataPt => $dataPt,
+            Start  => $pos,
+            Size   => $dLen,
+        );
+        $pos += $dLen;
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process ASF metadata library (similar to ProcessExtendedContentDescription above)
+# Inputs: 0) ExifTool object reference, 1) dirInfo ref, 2) tag table reference
+# Returns: 1 on success
+sub ProcessMetadata($$$)
+{
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirLen = $$dirInfo{DirLen};
+    return 0 if $dirLen < 2;
+    my $count = Get16u($dataPt, 0);
+    $et->VerboseDir($dirInfo, $count);
+    my $pos = 2;
+    my $i;
+    for ($i=0; $i<$count; ++$i) {
+        return 0 if $pos + 12 > $dirLen;
+        my ($index, $stream, $nameLen, $dType, $dLen) = unpack("x${pos}v4V", $$dataPt);
+        $pos += 12;
+        return 0 if $pos + $nameLen + $dLen > $dirLen;
+        my $tag = Image::ExifTool::Decode(undef,substr($$dataPt,$pos,$nameLen),'UCS2','II','Latin');
+        $tag =~ s/^WM\///; # remove leading "WM/"
+        $pos += $nameLen;
+        my $val = ReadASF($et,$dataPt,$pos,$dType,$dLen);
+        $et->HandleTag($tagTablePtr, $tag, $val,
             DataPt => $dataPt,
-            Start  => $pos + 4,
+            Start  => $pos,
             Size   => $dLen,
         );
-        $pos += 4 + $dLen;
+        $pos += $dLen;
     }
     return 1;
 }
@@ -630,24 +673,25 @@ sub ProcessExtendedContentDescription($$$)
 # Returns: 1 on success
 sub ProcessPicture($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirStart = $$dirInfo{DirStart};
     my $dirLen = $$dirInfo{DirLen};
     return 0 unless $dirLen > 9;
     # extract picture type and length
     my ($type, $picLen) = unpack("x${dirStart}CV", $$dataPt);
-    $exifTool->HandleTag($tagTablePtr, 0, $type);
+    $et->VerboseDir('Picture');
+    $et->HandleTag($tagTablePtr, 0, $type);
     # extract mime type and description strings (null-terminated unicode strings)
     my $n = $dirLen - 5 - $picLen;
     return 0 if $n & 0x01 or $n < 4;
     my $str = substr($$dataPt, $dirStart+5, $n);
     if ($str =~ /^((?:..)*?)\0\0((?:..)*?)\0\0/s) {
         my ($mime, $desc) = ($1, $2);
-        $exifTool->HandleTag($tagTablePtr, 1, $exifTool->Decode($mime,'UCS2','II'));
-        $exifTool->HandleTag($tagTablePtr, 2, $exifTool->Decode($desc,'UCS2','II')) if length $desc;
+        $et->HandleTag($tagTablePtr, 1, $et->Decode($mime,'UCS2','II'));
+        $et->HandleTag($tagTablePtr, 2, $et->Decode($desc,'UCS2','II')) if length $desc;
     }
-    $exifTool->HandleTag($tagTablePtr, 3, substr($$dataPt, $dirStart+5+$n, $picLen));
+    $et->HandleTag($tagTablePtr, 3, substr($$dataPt, $dirStart+5+$n, $picLen));
     return 1;
 }
 
@@ -657,12 +701,12 @@ sub ProcessPicture($$$)
 # Returns: 1 on success
 sub ProcessCodecList($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirLen = $$dirInfo{DirLen};
     return 0 if $dirLen < 20;
     my $count = Get32u($dataPt, 16);
-    $exifTool->VerboseDir($dirInfo, $count);
+    $et->VerboseDir($dirInfo, $count);
     my $pos = 20;
     my $i;
     my %codecType = ( 1 => 'Video', 2 => 'Audio' );
@@ -673,13 +717,13 @@ sub ProcessCodecList($$$)
         my $nameLen = Get16u($dataPt, $pos + 2) * 2;
         $pos += 4;
         return 0 if $pos + $nameLen + 2 > $dirLen;
-        my $name = $exifTool->Decode(substr($$dataPt,$pos,$nameLen),'UCS2','II');
-        $exifTool->HandleTag($tagTablePtr, "${type}Name", $name);
+        my $name = $et->Decode(substr($$dataPt,$pos,$nameLen),'UCS2','II');
+        $et->HandleTag($tagTablePtr, "${type}Name", $name);
         my $descLen = Get16u($dataPt, $pos + $nameLen) * 2;
         $pos += $nameLen + 2;
         return 0 if $pos + $descLen + 2 > $dirLen;
-        my $desc = $exifTool->Decode(substr($$dataPt,$pos,$descLen),'UCS2','II');
-        $exifTool->HandleTag($tagTablePtr, "${type}Description", $desc);
+        my $desc = $et->Decode(substr($$dataPt,$pos,$descLen),'UCS2','II');
+        $et->HandleTag($tagTablePtr, "${type}Description", $desc);
         my $infoLen = Get16u($dataPt, $pos + $descLen);
         $pos += $descLen + 2 + $infoLen;
     }
@@ -687,45 +731,14 @@ sub ProcessCodecList($$$)
 }
 
 #------------------------------------------------------------------------------
-# Process ASF metadata library
-# Inputs: 0) ExifTool object reference, 1) dirInfo ref, 2) tag table reference
-# Returns: 1 on success
-sub ProcessMetadata($$$)
-{
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    my $dataPt = $$dirInfo{DataPt};
-    my $dirLen = $$dirInfo{DirLen};
-    return 0 if $dirLen < 2;
-    my $count = Get16u($dataPt, 0);
-    $exifTool->VerboseDir($dirInfo, $count);
-    my $pos = 2;
-    my $i;
-    for ($i=0; $i<$count; ++$i) {
-        return 0 if $pos + 12 > $dirLen;
-        my ($index, $stream, $nameLen, $dType, $dLen) = unpack("x${pos}v4V", $$dataPt);
-        $pos += 12;
-        return 0 if $pos + $nameLen + $dLen > $dirLen;
-        my $tag = Image::ExifTool::Decode(undef,substr($$dataPt,$pos,$nameLen),'UCS2','II','Latin');
-        my $val = ReadASF($exifTool,$dataPt,$pos+$nameLen,$dType,$dLen);
-        $exifTool->HandleTag($tagTablePtr, $tag, $val,
-            DataPt => $dataPt,
-            Start  => $pos,
-            Size   => $dLen,
-        );
-        $pos += $nameLen + $dLen;
-    }
-    return 1;
-}
-
-#------------------------------------------------------------------------------
 # Extract information from a ASF file
 # Inputs: 0) ExifTool object reference, 1) dirInfo reference, 2) tag table ref
 # Returns: 1 on success, 0 if this wasn't a valid ASF file
 sub ProcessASF($$;$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $raf = $$dirInfo{RAF};
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     my $rtnVal = 0;
     my $pos = 0;
     my ($buff, $err, @parentTable, @childEnd);
@@ -733,13 +746,13 @@ sub ProcessASF($$;$)
     for (;;) {
         last unless $raf->Read($buff, 24) == 24;
         $pos += 24;
-        my $tag = GetGUID($buff);
+        my $tag = GetGUID(substr($buff,0,16));
         unless ($tagTablePtr) {
             # verify this is a valid ASF file
             last unless $tag eq '75B22630-668E-11CF-A6D9-00AA0062CE6C';
-            my $fileType = $exifTool->{FILE_EXT};
+            my $fileType = $$et{FILE_EXT};
             $fileType = 'ASF' unless $fileType and $fileType =~ /^(ASF|WMV|WMA|DIVX)$/;
-            $exifTool->SetFileType($fileType);
+            $et->SetFileType($fileType);
             SetByteOrder('II');
             $tagTablePtr = GetTagTable('Image::ExifTool::ASF::Main');
             $rtnVal = 1;
@@ -752,9 +765,9 @@ sub ProcessASF($$;$)
         if ($size > 0x7fffffff) {
             if ($size > 0x7fffffff * 4294967296) {
                 $err = 'Invalid ASF object size';
-            } elsif ($exifTool->Options('LargeFileSupport')) {
+            } elsif ($et->Options('LargeFileSupport')) {
                 if ($raf->Seek($size, 1)) {
-                    $exifTool->VPrint(0, "  Skipped large ASF object ($size bytes)\n");
+                    $et->VPrint(0, "  Skipped large ASF object ($size bytes)\n");
                     $pos += $size;
                     next;
                 }
@@ -768,10 +781,10 @@ sub ProcessASF($$;$)
         if (@childEnd and $pos >= $childEnd[-1]) {
             pop @childEnd;
             $tagTablePtr = pop @parentTable;
-            $exifTool->{INDENT} = substr($exifTool->{INDENT},0,-2);
+            $$et{INDENT} = substr($$et{INDENT},0,-2);
         }
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
-        $verbose and $exifTool->VerboseInfo($tag, $tagInfo);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
+        $verbose and $et->VerboseInfo($tag, $tagInfo);
         if ($tagInfo) {
             my $subdir = $$tagInfo{SubDirectory};
             if ($subdir) {
@@ -781,7 +794,7 @@ sub ProcessASF($$;$)
                         my $s = $$subdir{Size};
                         if ($verbose > 2) {
                             $raf->Read($buff, $s) == $s or $err = 'Truncated file', last;
-                            $exifTool->VerboseDump(\$buff);
+                            $et->VerboseDump(\$buff);
                         } elsif (not $raf->Seek($s, 1)) {
                             $err = 'Seek error';
                             last;
@@ -792,8 +805,8 @@ sub ProcessASF($$;$)
                         $tagTablePtr = $subTable;
                         $pos += $$subdir{Size};
                         if ($verbose) {
-                            $exifTool->{INDENT} .= '| ';
-                            $exifTool->VerboseDir($$tagInfo{Name});
+                            $$et{INDENT} .= '| ';
+                            $et->VerboseDir($$tagInfo{Name});
                         }
                         next;
                     }
@@ -804,9 +817,9 @@ sub ProcessASF($$;$)
                         DirLen => $size,
                         DirName => $$tagInfo{Name},
                     );
-                    $exifTool->VerboseDump(\$buff) if $verbose > 2;
-                    unless ($exifTool->ProcessDirectory(\%subdirInfo, $subTable)) {
-                        $exifTool->Warn("Error processing $$tagInfo{Name} directory");
+                    $et->VerboseDump(\$buff) if $verbose > 2;
+                    unless ($et->ProcessDirectory(\%subdirInfo, $subTable, $$subdir{ProcessProc})) {
+                        $et->Warn("Error processing $$tagInfo{Name} directory");
                     }
                     $pos += $size;
                     next;
@@ -818,14 +831,14 @@ sub ProcessASF($$;$)
         }
         if ($verbose > 2) {
             $raf->Read($buff, $size) == $size or $err = 'Truncated file', last;
-            $exifTool->VerboseDump(\$buff);
+            $et->VerboseDump(\$buff);
         } elsif (not $raf->Seek($size, 1)) { # skip the block
             $err = 'Seek error';
             last;
         }
         $pos += $size;
     }
-    $err and $exifTool->Warn($err);
+    $err and $et->Warn($err);
     return $rtnVal;
 }
 
@@ -849,7 +862,7 @@ Windows Media Audio (WMA) and Windows Media Video (WMV) files.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -0,0 +1,113 @@
+#------------------------------------------------------------------------------
+# File:         Apple.pm
+#
+# Description:  Apple EXIF maker notes tags
+#
+# Revisions:    2013-09-13 - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Apple;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool::PLIST;
+
+$VERSION = '1.01';
+
+%Image::ExifTool::Apple::Main = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    WRITABLE => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    NOTES => 'Tags extracted from maker notes of images from the iPhone 5 with iOS 7.',
+    # 0x0001 - int32s: seen 0, 1
+    0x0003 => {
+        Name => 'RunTime',
+        SubDirectory => { TagTable => 'Image::ExifTool::Apple::RunTime' },
+    },
+    # 0x0004 - int32s: normally 1, but 0 for low-light images
+    # 0x0005 - int32s: seen values 147-247, and 100 for blank images
+    # 0x0006 - int32s: seen values 186-241, and 20 for blank images
+    # 0x0007 - int32s: seen 1
+    0x000a => {
+        Name => 'HDRImageType',
+        Writable => 'int32s',
+        PrintConv => {
+            3 => 'HDR Image',
+            4 => 'Original Image',
+        },
+    },
+);
+
+# PLIST-format CMTime structure (ref PH)
+# (CMTime ref https://developer.apple.com/library/ios/documentation/CoreMedia/Reference/CMTime/Reference/reference.html)
+%Image::ExifTool::Apple::RunTime = (
+    PROCESS_PROC => \&Image::ExifTool::PLIST::ProcessBinaryPLIST,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    NOTES => q{
+        This PLIST-format information contains the elements of a CMTime structure
+        representing the amount of time the phone has been running since the last
+        boot, not including standby time.
+    },
+    timescale => { Name => 'RunTimeScale' }, # (seen 1000000000 --> ns)
+    epoch     => { Name => 'RunTimeEpoch' }, # (seen 0)
+    value     => { Name => 'RunTimeValue' }, # (should divide by RunTimeScale to get seconds)
+    flags => {
+        Name => 'RunTimeFlags',
+        PrintConv => { BITMASK => {
+            0 => 'Valid',
+            1 => 'Has been rounded',
+            2 => 'Positive infinity',
+            3 => 'Negative infinity',
+            4 => 'Indefinite',
+        }},
+    },
+);
+
+# Apple composite tags
+%Image::ExifTool::Apple::Composite = (
+    GROUPS => { 2 => 'Camera' },
+    RunTimeSincePowerUp => {
+        Require => {
+            0 => 'Apple:RunTimeValue',
+            1 => 'Apple:RunTimeScale',
+        },
+        ValueConv => '$val[1] ? $val[0] / $val[1] : undef',
+        PrintConv => 'ConvertDuration($val)',
+    },
+);
+
+# add our composite tags
+Image::ExifTool::AddCompositeTags('Image::ExifTool::Apple');
+
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Apple - Apple EXIF maker notes tags
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to interpret
+Apple maker notes in EXIF information.
+
+=head1 AUTHOR
+
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Apple Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
@@ -15,7 +15,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.07';
+$VERSION = '1.08';
 
 # BMP chunks
 %Image::ExifTool::BMP::Main = (
@@ -112,7 +112,7 @@ $VERSION = '1.07';
 # Returns: 1 on success, 0 if this wasn't a valid BMP file
 sub ProcessBMP($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my ($buff, $tagTablePtr);
 
@@ -123,7 +123,7 @@ sub ProcessBMP($$)
     my $len = Get32u(\$buff, 14);
     return 0 unless $len == 12 or $len >= 40;
     return 0 unless $raf->Seek(-4, 1) and $raf->Read($buff, $len) == $len;
-    $exifTool->SetFileType();   # set the FileType tag
+    $et->SetFileType();   # set the FileType tag
     my %dirInfo = (
         DataPt => \$buff,
         DirStart => 0,
@@ -134,7 +134,7 @@ sub ProcessBMP($$)
     } else {
         $tagTablePtr = GetTagTable('Image::ExifTool::BMP::Main');
     }
-    $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+    $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
     return 1;
 }
 
@@ -157,7 +157,7 @@ This module contains definitions required by Image::ExifTool to read BMP
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -445,7 +445,7 @@ compression ability).
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 Copyright 2002, Leon Bottou and Yann Le Cun
 Copyright 2001, AT&T
 Copyright 1999-2001, LizardTech Inc.
@@ -15,7 +15,7 @@ use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Exif;
 
-$VERSION = '1.05';
+$VERSION = '1.06';
 
 my $maxOffset = 0x7fffffff; # currently supported maximum data offset/size
 
@@ -25,10 +25,10 @@ my $maxOffset = 0x7fffffff; # currently supported maximum data offset/size
 # Returns: 1 on success, otherwise returns 0 and sets a Warning
 sub ProcessBigIFD($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $raf = $$dirInfo{RAF};
-    my $verbose = $exifTool->{OPTIONS}->{Verbose};
-    my $htmlDump = $exifTool->{HTML_DUMP};
+    my $verbose = $$et{OPTIONS}{Verbose};
+    my $htmlDump = $$et{HTML_DUMP};
     my $dirName = $$dirInfo{DirName};
     my $dirStart = $$dirInfo{DirStart};
 
@@ -36,38 +36,38 @@ sub ProcessBigIFD($$$)
 
     # loop through IFD chain
     for (;;) {
-        if ($dirStart > $maxOffset and not $exifTool->Options('LargeFileSupport')) {
-            $exifTool->Warn('Huge offsets not supported (LargeFileSupport not set)');
+        if ($dirStart > $maxOffset and not $et->Options('LargeFileSupport')) {
+            $et->Warn('Huge offsets not supported (LargeFileSupport not set)');
             last;
         }
         unless ($raf->Seek($dirStart, 0)) {
-            $exifTool->Warn("Bad $dirName offset");
+            $et->Warn("Bad $dirName offset");
             return 0;
         }
         my ($dirBuff, $index);
         unless ($raf->Read($dirBuff, 8) == 8) {
-            $exifTool->Warn("Truncated $dirName count");
+            $et->Warn("Truncated $dirName count");
             return 0;
         }
         my $numEntries = Image::ExifTool::Get64u(\$dirBuff, 0);
-        $verbose > 0 and $exifTool->VerboseDir($dirName, $numEntries);
+        $verbose > 0 and $et->VerboseDir($dirName, $numEntries);
         my $bsize = $numEntries * 20;
         if ($bsize > $maxOffset) {
-            $exifTool->Warn('Huge directory counts not yet supported');
+            $et->Warn('Huge directory counts not yet supported');
             last;
         }
         my $bufPos = $raf->Tell();
         unless ($raf->Read($dirBuff, $bsize) == $bsize) {
-            $exifTool->Warn("Truncated $dirName directory");
+            $et->Warn("Truncated $dirName directory");
             return 0;
         }
         my $nextIFD;
         $raf->Read($nextIFD, 8) == 8 or undef $nextIFD; # try to read next IFD pointer
         if ($htmlDump) {
-            $exifTool->HDump($bufPos-8, 8, "$dirName entries", "Entry count: $numEntries");
+            $et->HDump($bufPos-8, 8, "$dirName entries", "Entry count: $numEntries");
             if (defined $nextIFD) {
                 my $tip = sprintf("Offset: 0x%.8x", Image::ExifTool::Get64u(\$nextIFD, 0));
-                $exifTool->HDump($bufPos + 20 * $numEntries, 8, "Next IFD", $tip, 0);
+                $et->HDump($bufPos + 20 * $numEntries, 8, "Next IFD", $tip, 0);
             }
         }
         # loop through all entries in this BigTIFF IFD
@@ -78,30 +78,30 @@ sub ProcessBigIFD($$$)
             my $count = Image::ExifTool::Get64u(\$dirBuff, $entry+4);
             my $formatSize = $Image::ExifTool::Exif::formatSize[$format];
             unless (defined $formatSize) {
-                $exifTool->HDump($bufPos+$entry,20,"[invalid IFD entry]",
-                         "Bad format value: $format", 1);
+                $et->HDump($bufPos+$entry,20,"[invalid IFD entry]",
+                           "Bad format value: $format", 1);
                 # warn unless the IFD was just padded with zeros
-                $exifTool->Warn(sprintf("Unknown format ($format) for $dirName tag 0x%x",$tagID));
+                $et->Warn(sprintf("Unknown format ($format) for $dirName tag 0x%x",$tagID));
                 return 0; # assume corrupted IFD
             }
             my $formatStr = $Image::ExifTool::Exif::formatName[$format];
             my $size = $count * $formatSize;
-            my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID);
+            my $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID);
             next unless defined $tagInfo or $verbose;
             my $valuePtr = $entry + 12;
             my ($valBuff, $valBase, $rational);
             if ($size > 8) {
                 if ($size > $maxOffset) {
-                    $exifTool->Warn("Can't handle $dirName entry $index (huge size)");
+                    $et->Warn("Can't handle $dirName entry $index (huge size)");
                     next;
                 }
                 $valuePtr = Image::ExifTool::Get64u(\$dirBuff, $valuePtr);
-                if ($valuePtr > $maxOffset and not $exifTool->Options('LargeFileSupport')) {
-                    $exifTool->Warn("Can't handle $dirName entry $index (LargeFileSupport not set)");
+                if ($valuePtr > $maxOffset and not $et->Options('LargeFileSupport')) {
+                    $et->Warn("Can't handle $dirName entry $index (LargeFileSupport not set)");
                     next;
                 }
                 unless ($raf->Seek($valuePtr, 0) and $raf->Read($valBuff, $size) == $size) {
-                    $exifTool->Warn("Error reading $dirName entry $index");
+                    $et->Warn("Error reading $dirName entry $index");
                     next;
                 }
                 $valBase = 0;
@@ -111,7 +111,7 @@ sub ProcessBigIFD($$$)
             }
             if (defined $tagInfo and not $tagInfo) {
                 # GetTagInfo() required the value for a Condition
-                $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID, \$valBuff);
+                $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID, \$valBuff);
             }
             my $val = ReadValue(\$valBuff, 0, $formatStr, $count, $size, \$rational);
             if ($htmlDump) {
@@ -148,16 +148,16 @@ sub ProcessBigIFD($$$)
                     }
                 }
                 $tip .= "Value: $tval";
-                $exifTool->HDump($entry+$bufPos, 20, "$dname $colName", $tip, 1);
+                $et->HDump($entry+$bufPos, 20, "$dname $colName", $tip, 1);
                 if ($size > 8) {
                     # add value data block
                     my $flg = ($tagInfo and $$tagInfo{SubDirectory} and $$tagInfo{MakerNotes}) ? 4 : 0;
-                    $exifTool->HDump($valuePtr,$size,"$tagName value",'SAME', $flg);
+                    $et->HDump($valuePtr,$size,"$tagName value",'SAME', $flg);
                 }
             }
             if ($tagInfo and $$tagInfo{SubIFD}) {
                 # process all SubIFD's as BigTIFF
-                $verbose > 0 and $exifTool->VerboseInfo($tagID, $tagInfo,
+                $verbose > 0 and $et->VerboseInfo($tagID, $tagInfo,
                     Table   => $tagTablePtr,
                     Index   => $index,
                     Value   => $val,
@@ -180,10 +180,10 @@ sub ProcessBigIFD($$$)
                         DirName  => $subdirName,
                         Parent   => $dirInfo,
                     );
-                    $exifTool->ProcessDirectory(\%subdirInfo, $tagTablePtr, \&ProcessBigIFD);
+                    $et->ProcessDirectory(\%subdirInfo, $tagTablePtr, \&ProcessBigIFD);
                 }
             } else {
-                my $tagKey = $exifTool->HandleTag($tagTablePtr, $tagID, $val,
+                my $tagKey = $et->HandleTag($tagTablePtr, $tagID, $val,
                     Index   => $index,
                     DataPt  => \$valBuff,
                     DataPos => $valBase + $valuePtr,
@@ -193,12 +193,12 @@ sub ProcessBigIFD($$$)
                     TagInfo => $tagInfo,
                     RAF     => $raf,
                 );
-                $tagKey and $exifTool->SetGroup($tagKey, $dirName);
+                $tagKey and $et->SetGroup($tagKey, $dirName);
             }
         }
         last unless $dirName =~ /^(IFD|SubIFD)(\d*)$/;
         $dirName = $1 . (($2 || 0) + 1);
-        defined $nextIFD or $exifTool->Warn("Bad $dirName pointer"), return 0;
+        defined $nextIFD or $et->Warn("Bad $dirName pointer"), return 0;
         $dirStart = Image::ExifTool::Get64u(\$nextIFD, 0);
         $dirStart or last;
     }
@@ -211,23 +211,23 @@ sub ProcessBigIFD($$$)
 # Returns: 1 on success, 0 if this wasn't a valid BigTIFF image
 sub ProcessBTF($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my $buff;
 
     return 0 unless $raf->Read($buff, 16) == 16;
     return 0 unless $buff =~ /^(MM\0\x2b\0\x08\0\0|II\x2b\0\x08\0\0\0)/;
     if ($$dirInfo{OutFile}) {
-        $exifTool->Error('ExifTool does not support writing of BigTIFF images');
+        $et->Error('ExifTool does not support writing of BigTIFF images');
         return 1;
     }
-    $exifTool->SetFileType('BTF'); # set the FileType tag
+    $et->SetFileType('BTF'); # set the FileType tag
     SetByteOrder(substr($buff, 0, 2));
     my $offset = Image::ExifTool::Get64u(\$buff, 8);
-    if ($exifTool->{HTML_DUMP}) {
+    if ($$et{HTML_DUMP}) {
         my $o = (GetByteOrder() eq 'II') ? 'Little' : 'Big';
-        $exifTool->HDump(0, 8, "BigTIFF header", "Byte order: $o endian", 0);
-        $exifTool->HDump(8, 8, "IFD0 pointer", sprintf("Offset: 0x%.8x",$offset), 0);
+        $et->HDump(0, 8, "BigTIFF header", "Byte order: $o endian", 0);
+        $et->HDump(8, 8, "IFD0 pointer", sprintf("Offset: 0x%.8x",$offset), 0);
     }
     my %dirInfo = (
         RAF      => $raf,
@@ -237,7 +237,7 @@ sub ProcessBTF($$)
         Parent   => 'BigTIFF',
     );
     my $tagTablePtr = GetTagTable('Image::ExifTool::Exif::Main');
-    $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr, \&ProcessBigIFD);
+    $et->ProcessDirectory(\%dirInfo, $tagTablePtr, \&ProcessBigIFD);
     return 1;
 }
 
@@ -260,7 +260,7 @@ information in BigTIFF images.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -32,12 +32,12 @@ use Image::ExifTool::XMP;
 use Image::ExifTool::Canon;
 use Image::ExifTool::Nikon;
 
-$VERSION = '2.60';
+$VERSION = '2.72';
 @ISA = qw(Exporter);
 
 sub NumbersFirst;
 
-my $numbersFirst = 1;   # set to -1 to sort numbers last
+my $numbersFirst = 1;   # set to -1 to sort numbers last, or 2 to put negative numbers last
 
 # list of all tables in plug-in modules
 my @pluginTables = ('Image::ExifTool::MWG::Composite');
@@ -69,6 +69,10 @@ my %tweakOrder = (
    'Kodak::TextualInfo' => 'Kodak::IFD',
    'Kodak::Processing' => 'Kodak::TextualInfo',
     Leaf    => 'Kodak',
+    Nikon   => 'Minolta',
+    NikonCustom => 'Nikon',
+    NikonCapture => 'NikonCustom',
+    Olympus => 'NikonCapture',
     Minolta => 'Leaf',
     Pentax  => 'Panasonic',
     SonyIDC => 'Sony',
@@ -80,7 +84,6 @@ my %tweakOrder = (
     MinoltaRaw => 'KyoceraRaw',
     KyoceraRaw => 'CanonRaw',
     SigmaRaw => 'PanasonicRaw',
-    Olympus => 'NikonCapture',
     PhotoMechanic => 'FotoStation',
     Microsoft     => 'PhotoMechanic',
    'Microsoft::MP'=> 'Microsoft::MP1',
@@ -88,10 +91,6 @@ my %tweakOrder = (
    'Nikon::CameraSettingsD300' => 'Nikon::ShotInfoD300b',
    'Pentax::LensData' => 'Pentax::LensInfo2',
    'Sony::SRF2' => 'Sony::SRF',
-   'Samsung::PictureWizard' => 'Samsung::Type2', # (necessary because Samsung doesn't have a main table)
-   'Samsung::INFO' => 'Samsung::PictureWizard', # (ditto)
-   'Samsung::MP4' => 'Samsung::INFO', # (ditto)
-   'Samsung::Thumbnail' => 'Samsung::MP4', # (ditto)
     DarwinCore => 'AFCP',
    'MWG::Regions' => 'MWG::Composite',
    'MWG::Keywords' => 'MWG::Regions',
@@ -119,6 +118,7 @@ my %formatOK = (
     resize   => 1,
     digits   => 1,
     int16uRev => 1,
+    int32uRev => 1,
     rational32u => 1,
     rational32s => 1,
     pstring     => 1,
@@ -215,6 +215,14 @@ reason for this is to make the tag names more consistent across different
 types of meta information.  To determine a tag name, either consult this
 documentation or run C<exiftool -s> on a file containing the information in
 question.
+
+(This documentation is the result of years of research, testing and reverse
+engineering, and is the most complete metadata tag list available anywhere
+on the internet.  It is provided not only for ExifTool users, but more
+importantly as a public service to help augment the collective knowledge,
+and is often used as a primary source of information in the development of
+other metadata software.  Please help keep this documentation as accurate
+and complete as possible, and feed back any new discoveries to the source.)
 },
     EXIF => q{
 EXIF stands for "Exchangeable Image File Format".  This type of information
@@ -232,8 +240,8 @@ other tags which are not part of the EXIF specification, but may co-exist
 with EXIF tags in some images.  Tags which are part of the EXIF 2.3
 specification have an underlined B<Tag Name> in the HTML version of this
 documentation.  See
-L<http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-008-2012_E.pdf> for the
-official EXIF 2.3 specification.
+L<http://www.cipa.jp/std/documents/e/DC-008-2012_E.pdf> for the official
+EXIF 2.3 specification.
 },
     GPS => q{
 These GPS tags are part of the EXIF standard, and are stored in a separate
@@ -254,8 +262,9 @@ or by suffixing the tag name with a C<#> character).
 
 When adding GPS information to an image, it is important to set all of the
 following tags: GPSLatitude, GPSLatitudeRef, GPSLongitude, GPSLongitudeRef,
-GPSAltitude and GPSAltitudeRef.  ExifTool will write the required
-GPSVersionID tag automatically if new a GPS IFD is added to an image.
+and GPSAltitude and GPSAltitudeRef if the altitude is known.  ExifTool will
+write the required GPSVersionID tag automatically if new a GPS IFD is added
+to an image.
 },
     XMP => q{
 XMP stands for "Extensible Metadata Platform", an XML/RDF-based metadata
@@ -336,8 +345,8 @@ The tags listed below are part of the International Press Telecommunications
 Council (IPTC) and the Newspaper Association of America (NAA) Information
 Interchange Model (IIM).  This is an older meta information format, slowly
 being phased out in favor of XMP -- the newer IPTCCore specification uses
-XMP format.  IPTC information may be embedded in JPG, TIFF, PNG, MIFF, PS,
-PDF, PSD, XCF and DNG images.
+XMP format.  IPTC information may be found in JPG, TIFF, PNG, MIFF, PS, PDF,
+PSD, XCF and DNG images.
 
 IPTC information is separated into different records, each of which has its
 own set of tags.  See
@@ -385,7 +394,9 @@ been decoded.  Use the Unknown (-u) option to extract PrintIM information.
     GeoTiff => q{
 ExifTool extracts the following tags from GeoTIFF images.  See
 L<http://www.remotesensing.org/geotiff/spec/geotiffhome.html> for the
-complete GeoTIFF specification.
+complete GeoTIFF specification.  These tags are not writable individually,
+but they may be copied en mass via the containing GeoTiffDirectory,
+GeoTiffDoubleParams and GeoTiffAsciiParams tags.
 },
     JFIF => q{
 The following information is extracted from the JPEG JFIF header.  See
@@ -446,11 +457,11 @@ extension level 3, including support for RC4, AES-128 and AES-256
 encryption.  A Password option is provided to allow processing of
 password-protected PDF files.
 
-When writing PDF files, ExifTool uses an incremental update.  This has the
-advantages of being fast and reversible.  The original PDF can be easily
-recovered by deleting the C<PDF-update> pseudo-group (with
-C<-PDF-update:all=> on the command line).  But there are two main
-disadvantages to this technique:
+ExifTool may be used to write native PDF and XMP metadata to PDF files. It
+uses an incremental update technique that has the advantages of being both
+fast and reversible.  The original PDF can be easily recovered by deleting
+the C<PDF-update> pseudo-group (with C<-PDF-update:all=> on the command
+line).  However, there are two main disadvantages to this technique:
 
 1) A linearized PDF file is no longer linearized after the update, so it
 must be subsequently re-linearized if this is required.
@@ -489,9 +500,10 @@ be written without modifying the file itself.
     Composite => q{
 The values of the composite tags are B<Derived From> the values of other
 tags.  These are convenience tags which are calculated after all other
-information is extracted.  User-defined Composite tags, useful for
-custom-formatting of tag values, may created in the L<ExifTool configuration
-file|../config.html>.
+information is extracted.  Only a few of these tags are writable directly,
+the others are changed by writing the corresponding B<Derived From> tags.
+User-defined Composite tags, useful for custom-formatting of tag values, may
+created in the L<ExifTool configuration file|../config.html>.
 },
     Shortcuts => q{
 Shortcut tags are convenience tags that represent one or more other tag
@@ -519,7 +531,7 @@ L<Image::ExifTool::BuildTagLookup|Image::ExifTool::BuildTagLookup>.
 
 ~head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -534,10 +546,18 @@ L<Image::ExifTool(3pm)|Image::ExifTool>
 
 # notes for Shortcuts tags
 my %shortcutNotes = (
+    AllDates => q{
+        contrary to the shortcut name, this represents only the common EXIF
+        date/time tags.  To access all date/time tags, use Time:All instead
+    },
     MakerNotes => q{
         useful when copying tags between files to either copy the maker notes as a
         block or prevent it from being copied
     },
+    ColorSpaceTags => q{
+        standard tags which carry color space information.  Useful for preserving
+        color space when deleting all other metadata
+    },
     CommonIFD0 => q{
         common metadata tags found in IFD0 of TIFF-format images.  Used to simpify
         deletion of all metadata from these images.  See
@@ -619,8 +639,8 @@ sub new
 # loop through all tables, accumulating TagLookup and TagName information
 #
     my (%tagNameInfo, %id, %longID, %longName, %shortName, %tableNum,
-        %tagLookup, %tagExists, %tableWritable, %sepTable, %structs,
-        %compositeModules, %isPlugin, %flattened, %structLookup);
+        %tagLookup, %tagExists, %noLookup, %tableWritable, %sepTable,
+        %structs, %compositeModules, %isPlugin, %flattened, %structLookup);
     $self->{TAG_NAME_INFO} = \%tagNameInfo;
     $self->{ID_LOOKUP} = \%id;
     $self->{LONG_ID} = \%longID;
@@ -648,7 +668,7 @@ sub new
     }
 
     my $tableNum = 0;
-    my $exifTool = new Image::ExifTool;
+    my $et = new Image::ExifTool;
     my ($tableName, $tag);
     # create lookup for short table names
     foreach $tableName (@tableNames) {
@@ -722,6 +742,7 @@ sub new
             $id{$tableName} = 'Tag ID';
         }
         $caseInsensitive = $isXMP;
+        $numbersFirst = 2;
         $numbersFirst = -1 if $$table{VARS} and $$table{VARS}{ALPHA_FIRST};
         my @keys = sort NumbersFirst TagTableKeys($table);
         $numbersFirst = 1;
@@ -758,6 +779,10 @@ TagID:  foreach $tagID (@keys) {
                 {
                     warn "Warning: Invalid tag name $short '$name'\n";
                 }
+                # validate list type
+                if ($$tagInfo{List} and $$tagInfo{List} !~ /^(1|Alt|Bag|Seq|array|string)$/) {
+                    warn "Warning: Unknown List type ($$tagInfo{List}) for $name in $tableName\n";
+                }
                 # accumulate information for consistency check of BinaryData tables
                 if ($processBinaryData and $$table{WRITABLE}) {
                     # can't currently write tag if Condition accesses $valPt
@@ -814,7 +839,7 @@ TagID:  foreach $tagID (@keys) {
                 }
                 # validate some characteristics of obvious date/time tags
                 if ($$tagInfo{PrintConv} and $$tagInfo{PrintConv} eq '$self->ConvertDateTime($val)') {
-                    my @g = $exifTool->GetGroup($tagInfo);
+                    my @g = $et->GetGroup($tagInfo);
                     warn "$short $name should be in 'Time' group!\n" unless $g[2] eq 'Time';
                     if ($writable and not $$tagInfo{Shift} and $g[0] ne 'Composite' and
                         $short ne 'PostScript')
@@ -888,7 +913,7 @@ TagID:  foreach $tagID (@keys) {
                 }
                 my $writeGroup;
                 if ($short eq 'Extra') {
-                    my @g = $exifTool->GetGroup($tagInfo);
+                    my @g = $et->GetGroup($tagInfo);
                     $writeGroup = $$tagInfo{WriteOnly} ? '-' : $g[1];
                 } else {
                     $writeGroup = $$tagInfo{WriteGroup};
@@ -1172,16 +1197,20 @@ TagID:  foreach $tagID (@keys) {
 # add this tag to the tag lookup unless NO_LOOKUP is set or shortcut or plug-in tag
 #
                 next if $shortcut or $isPlugin;
-                next if $$vars{NO_LOOKUP};
-                # count our tags
+                # count tags
                 if ($$tagInfo{SubDirectory}) {
+                    next if $$vars{NO_LOOKUP};
                     $subdirs{$lcName} or $subdirs{$lcName} = 0;
                     ++$subdirs{$lcName};
                 } else {
                     ++$count{'total tags'};
-                    unless ($tagExists{$lcName} and (not $subdirs{$lcName} or $subdirs{$lcName} == $tagExists{$lcName})) {
-                        ++$count{'unique tag names'};
+                    unless ($tagExists{$lcName} and
+                        (not $subdirs{$lcName} or $subdirs{$lcName} == $tagExists{$lcName}))
+                    {
+                        ++$count{'unique tag names'} unless $noLookup{$lcName};
                     }
+                    # don't add to tag lookup if specified
+                    $$vars{NO_LOOKUP} and $noLookup{$lcName} = 1, next;
                 }
                 $tagExists{$lcName} or $tagExists{$lcName} = 0;
                 ++$tagExists{$lcName};
@@ -1220,10 +1249,12 @@ TagID:  foreach $tagID (@keys) {
 # save TagName information
 #
             my $tagIDstr;
-            if ($tagID =~ /^\d+(\.\d+)?$/) {
-                if (defined $hexID) {
+            if ($tagID =~ /^(-)?\d+(\.\d+)?$/) {
+                if ($1) {
+                    $tagIDstr = $tagID;
+                } elsif (defined $hexID) {
                     $tagIDstr = $hexID ? sprintf('0x%.4x',$tagID) : $tagID;
-                } elsif (not $1 and not $binaryTable and not $isIPTC and
+                } elsif (not $2 and not $binaryTable and not $isIPTC and
                          not ($short =~ /^CanonCustom/ and $tagID < 256))
                 {
                     $tagIDstr = sprintf('0x%.4x',$tagID);
@@ -1477,8 +1508,11 @@ sub NumbersFirst
     ($bNum, $bDec) = ($1, $3) if $b =~ /^(-?[0-9]+)(\.(\d*))?$/;
     if ($a =~ /^(-?[0-9]+)(\.(\d*))?$/) {
         if (defined $bNum) {
+            $bNum += 1e9 if $numbersFirst == 2 and $bNum < 0;
+            my $aInt = $1;
+            $aInt += 1e9 if $numbersFirst == 2 and $aInt < 0;
             # compare integer part as a number
-            $rtnVal = $1 <=> $bNum;
+            $rtnVal = $aInt <=> $bNum;
             unless ($rtnVal) {
                 my $aDec = $3 || 0;
                 $bDec or $bDec = 0;
@@ -1494,8 +1528,8 @@ sub NumbersFirst
     } else {
         my ($a2, $b2) = ($a, $b);
         # expand numbers to 3 digits (with restrictions to avoid messing up ascii-hex tags)
-        $a2 =~ s/(\d+)/sprintf("%.3d",$1)/eg if $a2 =~ /^(APP)?[.0-9 ]*$/ and length($a2)<16;
-        $b2 =~ s/(\d+)/sprintf("%.3d",$1)/eg if $b2 =~ /^(APP)?[.0-9 ]*$/ and length($b2)<16;
+        $a2 =~ s/(\d+)/sprintf("%.3d",$1)/eg if $a2 =~ /^(APP|DMC-\w+ )?[.0-9 ]*$/ and length($a2)<16;
+        $b2 =~ s/(\d+)/sprintf("%.3d",$1)/eg if $b2 =~ /^(APP|DMC-\w+ )?[.0-9 ]*$/ and length($b2)<16;
         $caseInsensitive and $rtnVal = (lc($a2) cmp lc($b2));
         $rtnVal or $rtnVal = ($a2 cmp $b2);
     }
@@ -1866,7 +1900,7 @@ sub WriteTagNames($$)
                 $notes =~ s/(^[ \t]+|[ \t]+$)//mg;
             }
             my $head = $tableName;
-            $head =~ s/.* //;
+            $head =~ s/^.* //s;
             close HTMLFILE;
             if (OpenHtmlFile($htmldir, $tableName, 1)) {
                 print HTMLFILE '<p>', Doc2Html($notes), "</p>\n" if $notes;
@@ -2002,11 +2036,11 @@ sub WriteTagNames($$)
             $wID = $podIdLen;
             my $longTag = $self->{LONG_NAME}->{$tableName};
             if ($wTag < $longTag) {
-                $wasLong = 1;
                 if ($wID - $longTag + $wTag >= 6) { # don't let ID column get too narrow
                     $wID -= $longTag - $wTag;
                     $wTag = $longTag;
                 }
+                $wasLong = 1 if $wID <= $self->{LONG_ID}->{$tableName};
             }
         } elsif ($composite) {
             $wTag += $wID - $wReq;
@@ -2063,7 +2097,7 @@ sub WriteTagNames($$)
             my $wTag2 = $wTag;
             if (not $id) {
                 $idStr = '  ';
-            } elsif ($tagIDstr =~ /^\d+(\.\d+)?$/) {
+            } elsif ($tagIDstr =~ /^-?\d+(\.\d+)?$/) {
                 $w = $wID - 3;
                 $idStr = sprintf "  %${w}g    ", $tagIDstr;
                 $align = " class=r";
@@ -2262,7 +2296,14 @@ sub WriteTagNames($$)
                             next;
                         }
                         # make text in square brackets small
-                        /^\[/ and push(@values, "<span class=s>$_</span>"), next;
+                        if (/^\[/) {
+                            if (s/^\[!HTML\]//) {
+                                push @values, $_;
+                            } else {
+                                push @values, "<span class=s>$_</span>";
+                            }
+                            next;
+                        }
                         /=/ and push(@values, $_), next;
                         my @names = split;
                         my $suffix = ' Tags';
@@ -2377,7 +2418,7 @@ WriteTagNames().
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -65,6 +65,8 @@
 #              49) http://www.listware.net/201101/digikam-users/49795-digikam-users-re-lens-recognition.html
 #              50) http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,3833.0.html
 #              51) http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,4110.0.html
+#              52) Iliah Borg private communication
+#              53) Niels Kristian Bech Jensen private communication
 #              JD) Jens Duttke private communication
 #------------------------------------------------------------------------------
 
@@ -80,7 +82,7 @@ sub ProcessSerialData($$$);
 sub ProcessFilters($$$);
 sub SwapWords($);
 
-$VERSION = '3.09';
+$VERSION = '3.27';
 
 # Note: Removed 'USM' from 'L' lenses since it is redundant - PH
 # (or is it?  Ref 32 shows 5 non-USM L-type lenses)
@@ -141,7 +143,8 @@ $VERSION = '3.09';
     28 => 'Canon EF 80-200mm f/4.5-5.6 or Tamron Lens', #32
     28.1 => 'Tamron SP AF 28-105mm f/2.8 LD Aspherical IF', #15
     28.2 => 'Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical [IF] Macro', #4
-    28.3 => 'Tamron AF 70-300mm f/4.5-5.6 Di LD 1:2 Macro Zoom', #11
+  # 28.3 => 'Tamron AF 70-300mm f/4.5-5.6 Di LD 1:2 Macro Zoom', #11
+    28.3 => 'Tamron AF 70-300mm f/4-5.6 Di LD 1:2 Macro', #exiv2 patch
     28.4 => 'Tamron AF Aspherical 28-200mm f/3.8-5.6', #14
     29 => 'Canon EF 50mm f/1.8 II',
     30 => 'Canon EF 35-105mm f/4.5-5.6', #32
@@ -179,6 +182,7 @@ $VERSION = '3.09';
     51 => 'Canon EF-S 18-135mm f/3.5-5.6 IS', #PH
     52 => 'Canon EF-S 18-55mm f/3.5-5.6 IS II', #PH
     53 => 'Canon EF-S 18-55mm f/3.5-5.6 III', #Jon Charnas
+    54 => 'Canon EF-S 55-250mm f/4-5.6 IS II', #Exiv2
     94 => 'Canon TS-E 17mm f/4L', #42
     95 => 'Canon TS-E 24.0mm f/3.5 L II', #43
     124 => 'Canon MP-E 65mm f/2.8 1-5x Macro Photo', #9
@@ -207,7 +211,7 @@ $VERSION = '3.09';
     137.3 => 'Sigma 18-250mm f/3.5-6.3 DC OS HSM', #PH (also Sigma 18-250mm f/3.5-6.3 DC Macro OS HSM)
     137.4 => 'Sigma 24-70mm f/2.8 IF EX DG HSM', #PH
     137.5 => 'Sigma 18-125mm f/3.8-5.6 DC OS HSM', #PH
-    137.6 => 'Sigma 17-70mm f/2.8-4 DC Macro OS HSM', #http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,2819.0.html
+    137.6 => 'Sigma 17-70mm f/2.8-4 DC Macro OS HSM', #http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,2819.0.html (Contemporary version has this ID - PH)
     137.7 => 'Sigma 17-50mm f/2.8 OS HSM', #PH (from Exiv2)
     137.8 => 'Sigma 18-200mm f/3.5-6.3 II DC OS HSM', #PH
     137.9 => 'Tamron AF 18-270mm f/3.5-6.3 Di II VC PZD', #(model B008)http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,3090.0.html
@@ -216,6 +220,7 @@ $VERSION = '3.09';
    '137.12' => 'Tamron SP 60mm f/2 Macro Di II', #50 (model G005)
    '137.13' => 'Sigma 10-20mm f/3.5 EX DC HSM', #Gerald Erdmann
    '137.14' => 'Tamron SP 24-70mm f/2.8 Di VC USD', #PH
+   '137.15' => 'Sigma 18-35mm f/1.8 DC HSM', #David Monro
     138 => 'Canon EF 28-80mm f/2.8-4L', #32
     139 => 'Canon EF 400mm f/2.8L',
     140 => 'Canon EF 500mm f/4.5L', #32
@@ -282,6 +287,7 @@ $VERSION = '3.09';
     174 => 'Canon EF 135mm f/2L or Sigma Lens', #9
     174.1 => 'Sigma 70-200mm f/2.8 EX DG APO OS HSM', #PH (probably version II of this lens)
     174.2 => 'Sigma 50-500mm f/4.5-6.3 APO DG OS HSM', #http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,4031.0.html
+    174.3 => 'Sigma 150-500mm f/5-6.3 APO DG OS HSM', #47
     175 => 'Canon EF 400mm f/2.8L', #32
     176 => 'Canon EF 24-85mm f/3.5-4.5 USM',
     177 => 'Canon EF 300mm f/4L IS', #9
@@ -292,6 +298,7 @@ $VERSION = '3.09';
     182 => 'Canon EF 100-400mm f/4.5-5.6L IS + 2x',
     183 => 'Canon EF 100-400mm f/4.5-5.6L IS or Sigma Lens',
     183.1 => 'Sigma 150mm f/2.8 EX DG OS HSM APO Macro', #50
+    183.2 => 'Sigma 105mm f/2.8 EX DG OS HSM Macro', #50
     184 => 'Canon EF 400mm f/2.8L + 2x', #15
     185 => 'Canon EF 600mm f/4L IS', #32
     186 => 'Canon EF 70-200mm f/4L', #9
@@ -305,7 +312,8 @@ $VERSION = '3.09';
     195 => 'Canon EF 35-105mm f/4.5-5.6 USM', #32
     196 => 'Canon EF 75-300mm f/4-5.6 USM', #15/32
     197 => 'Canon EF 75-300mm f/4-5.6 IS USM',
-    198 => 'Canon EF 50mm f/1.4 USM', #9
+    198 => 'Canon EF 50mm f/1.4 USM or Zeiss Lens',
+    198.1 => 'Zeiss Otus 55mm f/1.4 ZE', #Jos Roost (seen only on Sony camera)
     199 => 'Canon EF 28-80mm f/3.5-5.6 USM', #32
     200 => 'Canon EF 75-300mm f/4-5.6 USM', #32
     201 => 'Canon EF 28-80mm f/3.5-5.6 USM', #32
@@ -315,7 +323,8 @@ $VERSION = '3.09';
     210 => 'Canon EF 28-90mm f/4-5.6 USM', #32
     211 => 'Canon EF 28-200mm f/3.5-5.6 USM', #15
     212 => 'Canon EF 28-105mm f/4-5.6 USM', #15
-    213 => 'Canon EF 90-300mm f/4.5-5.6 USM',
+    213 => 'Canon EF 90-300mm f/4.5-5.6 USM or Tamron Lens',
+    213.1 => 'Tamron SP 150-600mm F/5-6.3 Di VC USD', #topic5565 (Model A011)
     214 => 'Canon EF-S 18-55mm f/3.5-5.6 USM', #PH/34
     215 => 'Canon EF 55-200mm f/4.5-5.6 II USM',
     224 => 'Canon EF 70-200mm f/2.8L IS', #11
@@ -359,14 +368,19 @@ $VERSION = '3.09';
     494 => 'Canon EF 600mm f/4.0L IS II USM', #PH
     495 => 'Canon EF 24-70mm f/2.8L II USM', #PH
     496 => 'Canon EF 200-400mm f/4L IS USM', #PH
+    499 => 'Canon EF 200-400mm f/4L IS USM + 1.4x', #50
     502 => 'Canon EF 28mm f/2.8 IS USM', #PH
     503 => 'Canon EF 24mm f/2.8 IS USM', #PH
     504 => 'Canon EF 24-70mm f/4L IS USM', #PH
     505 => 'Canon EF 35mm f/2 IS USM', #PH
+    # (STM lenses seem to start with 0x10xx)
     4142 => 'Canon EF-S 18-135mm f/3.5-5.6 IS STM',
     4143 => 'Canon EF-M 18-55mm f/3.5-5.6 IS STM',
     4144 => 'Canon EF 40mm f/2.8 STM', #50
     4145 => 'Canon EF-M 22mm f/2 STM', #34
+    4146 => 'Canon EF-S 18-55mm f/3.5-5.6 IS STM', #PH
+    4147 => 'Canon EF-M 11-22mm f/4-5.6 IS STM', #42
+    4148 => 'Canon EF-S 55-250mm f/4-5.6 IS STM', #42
 );
 
 # Canon model ID numbers (PH)
@@ -543,10 +557,24 @@ $VERSION = '3.09';
     0x3380000 => 'PowerShot N',
     0x3390000 => 'IXUS 245 HS / IXY 430F', # (apparently no PowerShot equivalent)
     0x3400000 => 'PowerShot SX280 HS',
+    0x3410000 => 'PowerShot SX270 HS',
+    0x3420000 => 'PowerShot A3500 IS',
     0x3430000 => 'PowerShot A2600',
+    0x3450000 => 'PowerShot A1400',
     0x3460000 => 'PowerShot ELPH 130 IS / IXUS 140 / IXY 110F',
+    0x3470000 => 'PowerShot ELPH 115 IS / IXUS 132/135 / IXY 90F',
     0x3490000 => 'PowerShot ELPH 330 HS / IXUS 255 HS / IXY 610F',
-    # ? => 'PowerShot ELPH 115 IS / IXUS 132 / IXY 90F',
+    0x3510000 => 'PowerShot A2500',
+    0x3540000 => 'PowerShot G16',
+    0x3550000 => 'PowerShot S120',
+    0x3560000 => 'PowerShot SX170 IS',
+    0x3580000 => 'PowerShot SX510 HS',
+    0x3590000 => 'PowerShot S200 (new)',
+    0x3610000 => 'PowerShot N100',
+    0x3640000 => 'PowerShot G1 X Mark II',
+    0x3650000 => 'PowerShot D30',
+    0x3660000 => 'PowerShot SX700 HS',
+    0x3670000 => 'PowerShot SX600 HS',
     0x4040000 => 'PowerShot G1',
     0x6040000 => 'PowerShot S100 / Digital IXUS / IXY Digital',
 
@@ -580,6 +608,7 @@ $VERSION = '3.09';
     0x4007da8f => 'HF M30/M31/M36/M300/M306', # (LEGRIA/VIXIA)
     0x4007da90 => 'HF S20/S21/S200', # (LEGRIA/VIXIA)
     0x4007da92 => 'FS31/FS36/FS37/FS300/FS305/FS306/FS307',
+    0x4007dda9 => 'HF G25', # (LEGRIA)
 
     # NOTE: some pre-production models may have a model name of
     # "Canon EOS Kxxx", where "xxx" is the last 3 digits of the model ID below.
@@ -620,9 +649,13 @@ $VERSION = '3.09';
     0x80000297 => 'WFT-E2 II',
     0x80000298 => 'WFT-E4 II',
     0x80000301 => 'EOS Rebel T4i / 650D / Kiss X6i',
-    0x80000302 => '6D', #25
+    0x80000302 => 'EOS 6D', #25
+    0x80000324 => 'EOS-1D C', # (NC)
+    0x80000325 => 'EOS 70D',
     0x80000326 => 'EOS Rebel T5i / 700D / Kiss X7i',
+    0x80000327 => 'EOS Rebel T5 / 1200D / Kiss X70',
     0x80000331 => 'EOS M',
+    0x80000355 => 'EOS M2',
     0x80000346 => 'EOS Rebel SL1 / 100D / Kiss X7',
 );
 
@@ -947,6 +980,11 @@ my %binaryDataAttrs = (
             SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo60D' },
         },
         {
+            Name => 'CanonCameraInfo70D',
+            Condition => '$$self{Model} =~ /EOS 70D$/',
+            SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo70D' },
+        },
+        {
             Name => 'CanonCameraInfo450D',
             Condition => '$$self{Model} =~ /\b(450D|REBEL XSi|Kiss X2)\b/',
             SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo450D' },
@@ -968,7 +1006,7 @@ my %binaryDataAttrs = (
         },
         {
             Name => 'CanonCameraInfo650D',
-            Condition => '$$self{Model} =~ /\b(650D|REBEL T4i|Kiss X6i)\b/',
+            Condition => '$$self{Model} =~ /\b(650D|REBEL T4i|Kiss X6i|700D|Rebel T5i|Kiss X7i)\b/',
             SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo650D' },
         },
         {
@@ -1278,7 +1316,7 @@ my %binaryDataAttrs = (
         OffsetPair => 1, # (just used as a flag, since this tag has no pair)
         # this is an offset to the original decision data block
         # (offset relative to start of file in JPEG images, but NOT DNG images!)
-        IsOffset => '$val and $$exifTool{FILE_TYPE} ne "JPEG"',
+        IsOffset => '$val and $$et{FILE_TYPE} ne "JPEG"',
         Protected => 2,
         DataTag => 'OriginalDecisionData',
     },
@@ -1491,13 +1529,13 @@ my %binaryDataAttrs = (
             Name => 'ColorData5',
             SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData5' },
         },
-        {   # (int16u[1273]) - 600D
-            Condition => '$count == 1273',
+        {   # (int16u[1273|1275]) - 600D (1273), 1200D (1275)
+            Condition => '$count == 1273 or $count == 1275',
             Name => 'ColorData6',
             SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData6' },
         },
         {   # (int16u[1312|1313|1316])
-            # 1DX/5DmkIII/650D/700D/M (1312), 6D/100D (1313),
+            # 1DX/5DmkIII/650D/700D/M (1312), 6D/70D/100D (1313),
             # 1DX firmware 1.x (1316)
             Condition => '$count == 1312 or $count == 1313 or $count == 1316',
             Name => 'ColorData7',
@@ -1539,7 +1577,9 @@ my %binaryDataAttrs = (
     0x4013 => { #PH
         Name => 'AFMicroAdj', # (AFMicroAdjust)
         SubDirectory => {
-            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+            # Canon DPP 3.13 is known to truncate this data to 0x14 bytes (from 0x2c),
+            # so specifically check for 0x2c to avoid giving a warning in this case
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size,0x2c)',
             TagTable => 'Image::ExifTool::Canon::AFMicroAdj',
         },
     },
@@ -1668,6 +1708,7 @@ my %binaryDataAttrs = (
            16 => 'Pan Focus', #PH
            # 137 - Single?
            256 => 'AF + MF', #PH (NC, EOS M)
+           512 => 'Movie Snap Focus', #48
            519 => 'Movie Servo AF', #PH (NC, EOS M)
         },
     },
@@ -1682,7 +1723,8 @@ my %binaryDataAttrs = (
             5 => 'TIF+JPEG', # (1D) (unconfirmed)
             6 => 'CR2', # +THM? (1D,30D,350D)
             7 => 'CR2+JPEG', # (S30)
-            9 => 'Video', # (S95 MOV)
+            9 => 'MOV', # (S95 MOV)
+            10 => 'MP4', # (SX280 MP4)
         },
     },
     10 => {
@@ -3446,7 +3488,7 @@ my %ciMaxFocal = (
         Name => 'FirmwareVersionLookAhead',
         Hidden => 1,
         # look ahead to check location of FirmwareVersion string
-        Format => 'undef[0x242]',
+        Format => 'undef[0x248]',
         RawConv => q{
             my $t = substr($val, 0x22c, 6); # 1 = firmware 4.5.4/4.5.6
             $t =~ /^\d+\.\d+\.\d+/ and $$self{CanonFirm} = 1, return undef;
@@ -3454,6 +3496,8 @@ my %ciMaxFocal = (
             $t =~ /^\d+\.\d+\.\d+/ and $$self{CanonFirm} = 2, return undef;
             $t = substr($val, 0x23c, 6);    # 3 = firmware 1.0.3/1.0.7
             $t =~ /^\d+\.\d+\.\d+/ and $$self{CanonFirm} = 3, return undef;
+            $t = substr($val, 0x242, 6);    # 4 = firmware 1.2.1
+            $t =~ /^\d+\.\d+\.\d+/ and $$self{CanonFirm} = 4, return undef;
             $self->Warn('Unrecognized CameraInfo5DmkIII firmware version');
             $$self{CanonFirm} = 0;
             return undef;   # not a real tag
@@ -3471,6 +3515,7 @@ my %ciMaxFocal = (
         Hook => q{
             $varSize -= 3 if $$self{CanonFirm} == 1;
             $varSize -= 2 if $$self{CanonFirm} == 2;
+            $varSize += 6 if $$self{CanonFirm} == 4;
         },
     },
     0x7d => {
@@ -4064,7 +4109,76 @@ my %ciMaxFocal = (
         ValueConvInv => '$val + 1',
     },
     0x321 => {
-        Name => 'PictureStyleInfo2',
+        Name => 'PictureStyleInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::Canon::PSInfo2' },
+    },
+);
+
+# Canon camera information for 70D (MakerNotes tag 0x0d) (ref PH)
+%Image::ExifTool::Canon::CameraInfo70D = (
+    %binaryDataAttrs,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    IS_SUBDIR => [ 0x3cf ],
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'CameraInfo tags for the EOS 70D.',
+    0x03 => { %ciFNumber },
+    0x04 => { %ciExposureTime },
+    0x06 => { %ciISO },
+    0x1b => { %ciCameraTemperature },
+    0x23 => { %ciFocalLength },
+    # 0x36 - focal length again?
+    0x84 => {
+        Name => 'CameraOrientation',
+        PrintConv => {
+            0 => 'Horizontal (normal)',
+            1 => 'Rotate 90 CW',
+            2 => 'Rotate 270 CW',
+        },
+    },
+    0x93 => {
+        Name => 'FocusDistanceUpper',
+        %focusDistanceByteSwap,
+    },
+    0x95 => {
+        Name => 'FocusDistanceLower',
+        %focusDistanceByteSwap,
+    },
+    0xc7 => {
+        Name => 'ColorTemperature',
+        Format => 'int16u',
+    },
+    0x166 => {
+        Name => 'LensType',
+        Format => 'int16uRev', # value is big-endian
+        SeparateTable => 1,
+        ValueConvInv => 'int($val)', # (must truncate decimal part)
+        PrintConv => \%canonLensTypes,
+    },
+    0x168 => { %ciMinFocal },
+    0x16a => { %ciMaxFocal },
+    0x25e => {  # (at this location for firmware 6.1.2, 1.0.4 and 1.1.1)
+        Name => 'FirmwareVersion',
+        Format => 'string[6]',
+        Writable => 0,
+    },
+    0x2b3 => {
+        Name => 'FileIndex',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val + 1',
+        ValueConvInv => '$val - 1',
+    },
+    0x2bf => { #(NC)
+        Name => 'DirectoryIndex',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val - 1',
+        ValueConvInv => '$val + 1',
+    },
+    0x3cf => { #48
+        Name => 'PictureStyleInfo',
         SubDirectory => { TagTable => 'Image::ExifTool::Canon::PSInfo2' },
     },
 );
@@ -4470,12 +4584,12 @@ my %ciMaxFocal = (
     PRIORITY => 0,
     IS_SUBDIR => [ 0x390 ],
     GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
-    NOTES => 'CameraInfo tags for the EOS 650D.',
+    NOTES => 'CameraInfo tags for the EOS 650D and 700D.',
     0x03 => { %ciFNumber },
     0x04 => { %ciExposureTime },
     0x06 => { %ciISO },
     0x1b => { %ciCameraTemperature }, # (1DX/5DmkIII + 0)
-    0x20 => { %ciFocalLength }, # (1DX/5DmkIII + 0)
+    0x23 => { %ciFocalLength }, # (1DX/5DmkIII + 3)
     # 0x35 - seems to be the same as 0x54
     0x7d => { # (1DX/5DmkIII + 3)
         Name => 'CameraOrientation',
@@ -4518,14 +4632,35 @@ my %ciMaxFocal = (
     },
     0x129 => { %ciMinFocal },
     0x12b => { %ciMaxFocal },
-    0x21b => { # (version 1.0.1)
+    0x21b => { # (650D version 1.0.1)
         Name => 'FirmwareVersion',
+        Condition => '$$self{Model} =~ /(650D|REBEL T4i|Kiss X6i)\b/',
+        Notes => '650D',
+        Format => 'string[6]',
+        Writable => 0,
+        RawConv => '$val=~/^\d+\.\d+\.\d+\s*$/ ? $val : undef',
+    },
+    0x220 => { # (700D version 1.1.1/2.1.1)
+        Name => 'FirmwareVersion',
+        Condition => '$$self{Model} =~ /(700D|Rebel T5i|Kiss X7i)\b/',
+        Notes => '700D',
         Format => 'string[6]',
         Writable => 0,
         RawConv => '$val=~/^\d+\.\d+\.\d+\s*$/ ? $val : undef',
     },
     0x270 => { # (NC)
         Name => 'FileIndex',
+        Condition => '$$self{Model} =~ /(650D|REBEL T4i|Kiss X6i)\b/',
+        Notes => '650D',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val + 1',
+        ValueConvInv => '$val - 1',
+    },
+    0x274 => { # (NC)
+        Name => 'FileIndex',
+        Condition => '$$self{Model} =~ /(700D|Rebel T5i|Kiss X7i)\b/',
+        Notes => '700D',
         Groups => { 2 => 'Image' },
         Format => 'int32u',
         ValueConv => '$val + 1',
@@ -4533,6 +4668,17 @@ my %ciMaxFocal = (
     },
     0x27c => { # (NC)
         Name => 'DirectoryIndex',
+        Condition => '$$self{Model} =~ /(650D|REBEL T4i|Kiss X6i)\b/',
+        Notes => '650D',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val - 1',
+        ValueConvInv => '$val + 1',
+    },
+    0x280 => { # (NC)
+        Name => 'DirectoryIndex',
+        Condition => '$$self{Model} =~ /(700D|Rebel T5i|Kiss X7i)\b/',
+        Notes => '700D',
         Groups => { 2 => 'Image' },
         Format => 'int32u',
         ValueConv => '$val - 1',
@@ -4818,41 +4964,90 @@ my %ciMaxFocal = (
         PrintConv => '"$val C"',
         PrintConvInv => '$val=~s/ ?C//; $val',
     },
-    466 => { # [-3]
-        Name => 'CameraTemperature',
-        Condition => '$$self{CameraInfoCount} == 469',
-        Notes => '100HS, 300HS, 500HS, A1200, A2200, A3200 and A3300',
-        PrintConv => '"$val C"',
-        PrintConvInv => '$val=~s/ ?C//; $val',
-    },
-    503 => { # [-3]
-        Name => 'CameraTemperature',
-        Condition => '$$self{CameraInfoCount} == 506',
-        Notes => 'A800',
-        PrintConv => '"$val C"',
-        PrintConvInv => '$val=~s/ ?C//; $val',
-    },
-    506 => { # [-3]
-        Name => 'CameraTemperature',
-        Condition => '$$self{CameraInfoCount} == 509',
-        Notes => 'SX230HS',
-        PrintConv => '"$val C"',
-        PrintConvInv => '$val=~s/ ?C//; $val',
-    },
-    520 => { # [-3]
-        Name => 'CameraTemperature',
-        Condition => '$$self{CameraInfoCount} == 523',
-        Notes => '310HS, 510HS, G1X, S100 (new), SX40HS and SX150',
-        PrintConv => '"$val C"',
-        PrintConvInv => '$val=~s/ ?C//; $val',
-    },
-    524 => { # [-3]
+    -3 => {
         Name => 'CameraTemperature',
-        Condition => '$$self{CameraInfoCount} == 527',
-        Notes => '110HS, 520HS, A2300, A2400, A3400, A4000, D20 and SX260HS',
+        Condition => '$$self{CameraInfoCount} > 400',
+        Notes => '3 entries from end of record for most newer camera models',
         PrintConv => '"$val C"',
         PrintConvInv => '$val=~s/ ?C//; $val',
     },
+#    466 => { # [-3]
+#        Name => 'CameraTemperature',
+#        Condition => '$$self{CameraInfoCount} == 469',
+#        Notes => '100HS, 300HS, 500HS, A1200, A2200, A3200 and A3300',
+#        PrintConv => '"$val C"',
+#        PrintConvInv => '$val=~s/ ?C//; $val',
+#    },
+#    503 => { # [-3]
+#        Name => 'CameraTemperature',
+#        Condition => '$$self{CameraInfoCount} == 506',
+#        Notes => 'A800',
+#        PrintConv => '"$val C"',
+#        PrintConvInv => '$val=~s/ ?C//; $val',
+#    },
+#    506 => { # [-3]
+#        Name => 'CameraTemperature',
+#        Condition => '$$self{CameraInfoCount} == 509',
+#        Notes => 'SX230HS',
+#        PrintConv => '"$val C"',
+#        PrintConvInv => '$val=~s/ ?C//; $val',
+#    },
+#    520 => { # [-3]
+#        Name => 'CameraTemperature',
+#        Condition => '$$self{CameraInfoCount} == 523',
+#        Notes => '310HS, 510HS, G1X, S100 (new), SX40HS and SX150',
+#        PrintConv => '"$val C"',
+#        PrintConvInv => '$val=~s/ ?C//; $val',
+#    },
+#    524 => { # [-3]
+#        Name => 'CameraTemperature',
+#        Condition => '$$self{CameraInfoCount} == 527',
+#        Notes => '110HS, 520HS, A2300, A2400, A3400, A4000, D20 and SX260HS',
+#        PrintConv => '"$val C"',
+#        PrintConvInv => '$val=~s/ ?C//; $val',
+#    },
+#    532 => { # [-3]
+#        Name => 'CameraTemperature',
+#        Condition => '$$self{CameraInfoCount} == 535',
+#        Notes => 'S110 (new), G15, SX50, SX160IS and SX500IS',
+#        PrintConv => '"$val C"',
+#        PrintConvInv => '$val=~s/ ?C//; $val',
+#    },
+#    547 => { # [-3]
+#        Name => 'CameraTemperature',
+#        Condition => '$$self{CameraInfoCount} == 550',
+#        Notes => '130IS, A1400, A2500 and A2600',
+#        PrintConv => '"$val C"',
+#        PrintConvInv => '$val=~s/ ?C//; $val',
+#    },
+#    549 => { # [-3]
+#        Name => 'CameraTemperature',
+#        Condition => '$$self{CameraInfoCount} == 552',
+#        Notes => '115IS, 130IS, SX270, SX280, 330HS and A3500',
+#        PrintConv => '"$val C"',
+#        PrintConvInv => '$val=~s/ ?C//; $val',
+#    },
+#    552 => { # [-3]
+#        Name => 'CameraTemperature',
+#        Condition => '$$self{CameraInfoCount} == 555',
+#        Notes => 'S200 (new)',
+#        PrintConv => '"$val C"',
+#        PrintConvInv => '$val=~s/ ?C//; $val',
+#    },
+#    850 => { # [-3]
+#        Name => 'CameraTemperature',
+#        Condition => '$$self{CameraInfoCount} == 853',
+#        Notes => 'N',
+#        PrintConv => '"$val C"',
+#        PrintConvInv => '$val=~s/ ?C//; $val',
+#    },
+#    895 => { # [-3]
+#        Name => 'CameraTemperature',
+#        Condition => '$$self{CameraInfoCount} == 898',
+#        Notes => 'G1XmkII, N100, SX600HS and SX700HS',
+#        PrintConv => '"$val C"',
+#        PrintConvInv => '$val=~s/ ?C//; $val',
+#    },
 );
 
 # unknown Canon camera information (MakerNotes tag 0x0d) - PH
@@ -5090,11 +5285,11 @@ my %ciMaxFocal = (
             -559038737 => 'n/a', # (0xdeadbeef)
         },
     },
-    0x90 => { Name => 'ContrastUnknown',        %psInfo, Unknown => 1 },
-    0x94 => { Name => 'SharpnessUnknown',       %psInfo, Unknown => 1 },
-    0x98 => { Name => 'SaturationUnknown',      %psInfo, Unknown => 1 },
-    0x9c => { Name => 'ColorToneUnknown',       %psInfo, Unknown => 1 },
-    0xa0 => { Name => 'FilterEffectUnknown',    %psInfo, Unknown => 1,
+    0x90 => { Name => 'ContrastAuto',          %psInfo },
+    0x94 => { Name => 'SharpnessAuto',         %psInfo },
+    0x98 => { Name => 'SaturationAuto',        %psInfo },
+    0x9c => { Name => 'ColorToneAuto',         %psInfo },
+    0xa0 => { Name => 'FilterEffectAuto',      %psInfo,
         PrintConv => {
             0 => 'None',
             1 => 'Yellow',
@@ -5104,7 +5299,7 @@ my %ciMaxFocal = (
             -559038737 => 'n/a', # (0xdeadbeef)
         },
     },
-    0xa4 => { Name => 'ToningEffectUnknown',    %psInfo, Unknown => 1,
+    0xa4 => { Name => 'ToningEffectAuto',      %psInfo,
         PrintConv => {
             0 => 'None',
             1 => 'Sepia',
@@ -6287,7 +6482,10 @@ my %ciMaxFocal = (
         Notes => 'B, C, A, Temperature',
         SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib' }
     },
-    # 0xc5-0xc7: looks like black levels (ref 37)
+    0xc4 => { #52
+        Name => 'PerChannelBlackLevel',
+        Format => 'int16u[4]',
+    },
     # 0xc8-0x1c7: some sort of color table (ref 37)
     0x248 => { #37
         Name => 'FlashOutput',
@@ -6333,8 +6531,11 @@ my %ciMaxFocal = (
     FIRST_ENTRY => 0,
     GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
     IS_SUBDIR => [ 0x3f, 0xa8 ],
+    DATAMEMBER => [ 0x00 ],
     0x00 => {
         Name => 'ColorDataVersion',
+        DataMember => 'ColorDataVersion',
+        RawConv => '$$self{ColorDataVersion} = $val',
         PrintConv => {
             2 => '2 (1DmkIII)',
             3 => '3 (40D)',
@@ -6359,6 +6560,7 @@ my %ciMaxFocal = (
         Notes => 'B, C, A, Temperature',
         SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib' }
     },
+    0x0e7 => { Name => 'AverageBlackLevel',     Format => 'int16u[4]' }, #52
     0x280 => { #PH
         Name => 'RawMeasuredRGGB',
         Format => 'int32u[4]',
@@ -6367,6 +6569,68 @@ my %ciMaxFocal = (
         ValueConv => \&SwapWords,
         ValueConvInv => \&SwapWords,
     },
+    0x2b4 => { #52
+        Name => 'PerChannelBlackLevel',
+        Condition => '$$self{ColorDataVersion} == 4 or $$self{ColorDataVersion} == 5',
+        Format => 'int16u[4]',
+    },
+    0x2b8 => { #52
+        Name => 'NormalWhiteLevel',
+        Condition => '$$self{ColorDataVersion} == 4 or $$self{ColorDataVersion} == 5',
+        Format => 'int16u',
+        RawConv => '$val || undef',
+    },
+    0x2b9 => { #52
+        Name => 'SpecularWhiteLevel',
+        Condition => '$$self{ColorDataVersion} == 4 or $$self{ColorDataVersion} == 5',
+        Format => 'int16u',
+    },
+    0x2ba => { #52
+        Name => 'LinearityUpperMargin',
+        Condition => '$$self{ColorDataVersion} == 4 or $$self{ColorDataVersion} == 5',
+        Format => 'int16u',
+    },
+    0x2cb => { #52
+        Name => 'PerChannelBlackLevel',
+        Condition => '$$self{ColorDataVersion} == 6 or $$self{ColorDataVersion} == 7',
+        Format => 'int16u[4]',
+    },
+    0x2cf => [{ #52
+        Name => 'NormalWhiteLevel',
+        Condition => '$$self{ColorDataVersion} == 6 or $$self{ColorDataVersion} == 7',
+        Format => 'int16u',
+        RawConv => '$val || undef',
+    },{
+        Name => 'PerChannelBlackLevel',
+        Condition => '$$self{ColorDataVersion} == 9',
+        Format => 'int16u[4]',
+    }],
+    0x2d0 => { #52
+        Name => 'SpecularWhiteLevel',
+        Condition => '$$self{ColorDataVersion} == 6 or $$self{ColorDataVersion} == 7',
+        Format => 'int16u',
+    },
+    0x2d1 => { #52
+        Name => 'LinearityUpperMargin',
+        Condition => '$$self{ColorDataVersion} == 6 or $$self{ColorDataVersion} == 7',
+        Format => 'int16u',
+    },
+    0x2d3 => { #52
+        Name => 'NormalWhiteLevel',
+        Condition => '$$self{ColorDataVersion} == 9',
+        Format => 'int16u',
+        RawConv => '$val || undef',
+    },
+    0x2d4 => { #52
+        Name => 'SpecularWhiteLevel',
+        Condition => '$$self{ColorDataVersion} == 9',
+        Format => 'int16u',
+    },
+    0x2d5 => { #52
+        Name => 'LinearityUpperMargin',
+        Condition => '$$self{ColorDataVersion} == 9',
+        Format => 'int16u',
+    },
 );
 
 # color coefficients (ref PH)
@@ -6494,10 +6758,10 @@ my %ciMaxFocal = (
     0x100=> { Name => 'CameraColorCalibration15', %cameraColorCalibration2 },
 );
 
-# Color data (MakerNotes tag 0x4001, count=1273) (ref PH)
+# Color data (MakerNotes tag 0x4001, count=1273|1275) (ref PH)
 %Image::ExifTool::Canon::ColorData6 = (
     %binaryDataAttrs,
-    NOTES => 'These tags are used by the EOS 600D.',
+    NOTES => 'These tags are used by the EOS 600D and 1200D.',
     FORMAT => 'int16s',
     FIRST_ENTRY => 0,
     GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
@@ -6505,7 +6769,7 @@ my %ciMaxFocal = (
     0x00 => {
         Name => 'ColorDataVersion',
         PrintConv => {
-            10 => '10 (600D)',
+            10 => '10 (600D/1200D)',
         },
     },
     0x3f => { Name => 'WB_RGGBLevelsAsShot',     Format => 'int16s[4]' },
@@ -6565,6 +6829,7 @@ my %ciMaxFocal = (
         Notes => 'B, C, A, Temperature',
         SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib' }
     },
+    0x0fb => { Name => 'AverageBlackLevel',     Format => 'int16u[4]' }, #52
     0x194 => { #PH
         Name => 'RawMeasuredRGGB',
         Format => 'int32u[4]',
@@ -6573,6 +6838,10 @@ my %ciMaxFocal = (
         ValueConv => \&SwapWords,
         ValueConvInv => \&SwapWords,
     },
+    0x1df => { Name => 'PerChannelBlackLevel',  Format => 'int16u[4]' }, #52
+    0x1e3 => { Name => 'NormalWhiteLevel',      Format => 'int16u',  RawConv => '$val || undef' }, #52
+    0x1e4 => { Name => 'SpecularWhiteLevel',    Format => 'int16u' }, #52
+    0x1e5 => { Name => 'LinearityUpperMargin',  Format => 'int16u' }, #52
 );
 
 # Color data (MakerNotes tag 0x4001, count=1312,1313,1316) (ref PH)
@@ -6586,7 +6855,7 @@ my %ciMaxFocal = (
     0x00 => {
         Name => 'ColorDataVersion',
         PrintConv => {
-            10 => '10 (1DX/5DmkIII/6D/100D/650D/700D/M)',
+            10 => '10 (1DX/5DmkIII/6D/70D/100D/650D/700D/M)',
         },
     },
     # not really sure about the AsShot, Auto and Measured values any more - PH
@@ -6657,6 +6926,7 @@ my %ciMaxFocal = (
         Notes => 'B, C, A, Temperature',
         SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib' }
     },
+    0x114 => { Name => 'AverageBlackLevel',     Format => 'int16u[4]' }, #52
     0x1ad => {
         Name => 'RawMeasuredRGGB',
         Format => 'int32u[4]',
@@ -6665,6 +6935,10 @@ my %ciMaxFocal = (
         ValueConv => \&SwapWords,
         ValueConvInv => \&SwapWords,
     },
+    0x1f8 => { Name => 'PerChannelBlackLevel',  Format => 'int16u[4]' }, #52
+    0x1fc => { Name => 'NormalWhiteLevel',      Format => 'int16u',  RawConv => '$val || undef' }, #52
+    0x1fd => { Name => 'SpecularWhiteLevel',    Format => 'int16u' }, #52
+    0x1fe => { Name => 'LinearityUpperMargin',  Format => 'int16u' }, #52
 );
 
 # Unknown color data (MakerNotes tag 0x4001)
@@ -6832,6 +7106,12 @@ my %ciMaxFocal = (
 );
 
 # Creative filter information (MakerNotes tag 0x4024) (ref PH)
+my %filterConv = (
+    PrintConv => {
+        -1 => 'Off',
+        OTHER => sub { my $val=shift; return "On ($val)" },
+    },
+);
 %Image::ExifTool::Canon::FilterInfo = (
     PROCESS_PROC => \&ProcessFilters,
     GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
@@ -6839,33 +7119,38 @@ my %ciMaxFocal = (
     0x101 => {
         Name => 'GrainyBWFilter',
         Description => 'Grainy B/W Filter',
-        PrintConv => '$val == -1 ? "Off" : "On ($val)"',
-        PrintConvInv => '$val =~ /([-+]?\d+)/ ? $1 : -1',
-    },
-    0x201 => {
-        Name => 'SoftFocusFilter',
-        PrintConv => '$val == -1 ? "Off" : "On ($val)"',
-        PrintConvInv => '$val =~ /([-+]?\d+)/ ? $1 : -1',
+        %filterConv,
     },
-    0x301 => {
-        Name => 'ToyCameraFilter',
-        PrintConv => '$val == -1 ? "Off" : "On ($val)"',
-        PrintConvInv => '$val =~ /([-+]?\d+)/ ? $1 : -1',
-    },
-    0x401 => {
-        Name => 'MiniatureFilter',
-        PrintConv => '$val == -1 ? "Off" : "On ($val)"',
-        PrintConvInv => '$val =~ /([-+]?\d+)/ ? $1 : -1',
-    },
-    0x0402 => {
+    0x201 => { Name => 'SoftFocusFilter',   %filterConv },
+    0x301 => { Name => 'ToyCameraFilter',   %filterConv },
+    0x401 => { Name => 'MiniatureFilter',   %filterConv },
+    0x402 => {
         Name => 'MiniatureFilterOrientation',
         PrintConv => {
             0 => 'Horizontal',
             1 => 'Vertical',
         },
     },
-    0x403=> 'MiniatureFilterPosition',
-    # 0x404 - value: 0, 345, 518, ... (miniature filter width maybe?)
+    0x403 => 'MiniatureFilterPosition',
+    0x404 => 'MiniatureFilterParameter', # but what is the meaning?
+    0x501 => { Name => 'FisheyeFilter',     %filterConv }, # (M2)
+    0x601 => { Name => 'PaintingFilter',    %filterConv }, # (M2)
+    0x701 => { Name => 'WatercolorFilter',  %filterConv }, # (M2)
+);
+
+# Canon UUID atoms (ref PH, SX280)
+%Image::ExifTool::Canon::uuid = (
+    GROUPS => { 0 => 'MakerNotes', 1 => 'Canon', 2 => 'Video' },
+    NOTES => q{
+        Tags extracted from the uuid atom of MP4 videos from cameras such as the
+        SX280.
+    },
+    CNCV => 'CompressorVersion',
+    # CNDM - 4 bytes - 0xff,0xd8,0xff,0xd9
+    CNTH => {
+        Name => 'CanonCNTH',
+        SubDirectory => { TagTable => 'Image::ExifTool::Canon::CNTH' },
+    },
 );
 
 # Canon CNTH atoms (ref PH)
@@ -6879,6 +7164,7 @@ my %ciMaxFocal = (
         Name => 'ThumbnailImage',
         Format => 'undef',
         Notes => 'the full THM image, embedded metadata is extracted as the first sub-document',
+        SetBase => 1,
         RawConv => q{
             $$self{DOC_NUM} = ++$$self{DOC_COUNT};
             $self->ExtractInfo(\$val, { ReEntry => 1 });
@@ -7278,10 +7564,10 @@ sub ValidateAFInfo($$$)
 # Returns: reference to original decision data (or undef if no data)
 sub ReadODD($$)
 {
-    my ($exifTool, $offset) = @_;
+    my ($et, $offset) = @_;
     return undef unless $offset;
     my ($raf, $buff, $buf2, $i, $warn);
-    return undef unless defined($raf = $$exifTool{RAF});
+    return undef unless defined($raf = $$et{RAF});
     # the data block is a variable length and starts with 0xffffffff
     # followed a 4-byte (int32u) version number
     my $pos = $raf->Tell();
@@ -7359,14 +7645,14 @@ sub ReadODD($$)
         }
         SetByteOrder($oldOrder);
         unless ($err) {
-            if ($exifTool->Options('HtmlDump')) {
-                $exifTool->HDump($offset, length $buff, '[OriginalDecisionData]', undef);
+            if ($et->Options('HtmlDump')) {
+                $et->HDump($offset, length $buff, '[OriginalDecisionData]', undef);
             }
             $raf->Seek($pos, 0);    # restore original file position
             return \$buff;
         }
     }
-    $exifTool->Warn($warn || 'Invalid original decision data');
+    $et->Warn($warn || 'Invalid original decision data');
     $raf->Seek($pos, 0);    # restore original file position
     return undef;
 }
@@ -7428,21 +7714,21 @@ sub PrintFocalRange(@)
 # (does not yet extract Rational values)
 sub ProcessSerialData($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $offset = $$dirInfo{DirStart};
     my $size = $$dirInfo{DirLen};
     my $base = $$dirInfo{Base} || 0;
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     my $dataPos = $$dirInfo{DataPos} || 0;
 
     # temporarily set Unknown option so GetTagInfo() will return existing unknown tags
     # (require to maintain serial data synchronization)
-    my $unknown = $exifTool->Options(Unknown => 1);
+    my $unknown = $et->Options(Unknown => 1);
     # but disable unknown tag generation (because processing ends when we run out of tags)
-    $$exifTool{NO_UNKNOWN} = 1;
+    $$et{NO_UNKNOWN} = 1;
 
-    $verbose and $exifTool->VerboseDir('SerialData', undef, $size);
+    $verbose and $et->VerboseDir('SerialData', undef, $size);
 
     # get default format ('int8u' unless specified)
     my $defaultFormat = $$tagTablePtr{FORMAT} || 'int8u';
@@ -7450,7 +7736,7 @@ sub ProcessSerialData($$$)
     my ($index, %val);
     my $pos = 0;
     for ($index=0; $$tagTablePtr{$index} and $pos <= $size; ++$index) {
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $index) or last;
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $index) or last;
         my $format = $$tagInfo{Format};
         my $count = 1;
         if ($format) {
@@ -7473,7 +7759,7 @@ sub ProcessSerialData($$$)
         my $val = ReadValue($dataPt, $pos+$offset, $format, $count, $size-$pos);
         last unless defined $val;
         if ($verbose) {
-            $exifTool->VerboseInfo($index, $tagInfo,
+            $et->VerboseInfo($index, $tagInfo,
                 Index  => $index,
                 Table  => $tagTablePtr,
                 Value  => $val,
@@ -7487,22 +7773,22 @@ sub ProcessSerialData($$$)
         }
         $val{$index} = $val;
         if ($$tagInfo{SubDirectory}) {
-            my $subTablePtr = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
+            my $subTablePtr = GetTagTable($$tagInfo{SubDirectory}{TagTable});
             my %dirInfo = (
                 DataPt => \$val,
                 DataPos => $dataPos + $pos,
                 DirStart => 0,
                 DirLen => length($val),
             );
-            $exifTool->ProcessDirectory(\%dirInfo, $subTablePtr);
+            $et->ProcessDirectory(\%dirInfo, $subTablePtr);
         } elsif (not $$tagInfo{Unknown} or $unknown) {
             # don't extract zero-length information
-            $exifTool->FoundTag($tagInfo, $val) if $count;
+            $et->FoundTag($tagInfo, $val) if $count;
         }
         $pos += $len;
     }
-    $exifTool->Options(Unknown => $unknown);    # restore Unknown option
-    delete $$exifTool{NO_UNKNOWN};
+    $et->Options(Unknown => $unknown);    # restore Unknown option
+    delete $$et{NO_UNKNOWN};
     return 1;
 }
 
@@ -7609,17 +7895,17 @@ sub CanonEvInv($)
 # Returns: 1 on success
 sub ProcessFilters($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $pos = $$dirInfo{DirStart};
     my $dirLen = $$dirInfo{DirLen};
     my $dataPos = $$dirInfo{DataPos} || 0;
     my $end = $pos + $dirLen;
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
 
     return 0 if $dirLen < 8;
     my $numFilters = Get32u($dataPt, $pos + 4);
-    $verbose and $exifTool->VerboseDir('Creative Filter', $numFilters);
+    $verbose and $et->VerboseDir('Creative Filter', $numFilters);
     $pos += 8;
     my ($i, $j, $err);
     for ($i=0; $i<$numFilters; ++$i) {
@@ -7627,16 +7913,16 @@ sub ProcessFilters($$$)
         # 4 bytes - filter number
         # 4 bytes - filter data length
         # 4 bytes - number of parameters:
-        # |  4 bytes - paramter ID
-        # |  4 bytes - paramter value count
-        # |  4 bytes * count - paramter values (NC)
+        # |  4 bytes - parameter ID
+        # |  4 bytes - parameter value count
+        # |  4 bytes * count - parameter values (NC)
         $pos + 12 > $end and $err = "Truncated data for filter $i", last;
         my $fnum = Get32u($dataPt, $pos); # (is this an index or an ID?)
         my $size = Get32u($dataPt, $pos + 4);
         my $nparm = Get32u($dataPt, $pos + 8);
         my $nxt = $pos + 4 + $size;
         $nxt > $end and $err = "Invalid size ($size) for filter $i", last;
-        $verbose and $exifTool->VerboseDir("Filter $fnum", $nparm, $size);
+        $verbose and $et->VerboseDir("Filter $fnum", $nparm, $size);
         $pos += 12;
         for ($j=0; $j<$nparm; ++$j) {
             $pos + 12 > $end and $err = "Truncated data for filter $i param $j", last;
@@ -7645,7 +7931,7 @@ sub ProcessFilters($$$)
             $pos += 8;
             $pos + 4 * $count > $end and $err = "Truncated value for filter $i param $j", last;
             my $val = ReadValue($dataPt, $pos, 'int32s', $count, 4 * $count);
-            $exifTool->HandleTag($tagTablePtr, $tag, $val,
+            $et->HandleTag($tagTablePtr, $tag, $val,
                 DataPt  => $dataPt,
                 DataPos => $dataPos,
                 Start   => $pos,
@@ -7655,7 +7941,7 @@ sub ProcessFilters($$$)
         }
         $pos = $nxt;    # step to next filter
     }
-    $err and $exifTool->Warn($err, 1);
+    $err and $et->Warn($err, 1);
     return 1;
 }
 
@@ -7665,13 +7951,13 @@ sub ProcessFilters($$$)
 # Returns: data block (may be empty if no Exif data) or undef on error
 sub WriteCanon($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    $exifTool or return 1;    # allow dummy access to autoload this package
-    my $dirData = Image::ExifTool::Exif::WriteExif($exifTool, $dirInfo, $tagTablePtr);
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    $et or return 1;    # allow dummy access to autoload this package
+    my $dirData = Image::ExifTool::Exif::WriteExif($et, $dirInfo, $tagTablePtr);
     # add footer which is written by some Canon models (format of a TIFF header)
     if (defined $dirData and length $dirData and $$dirInfo{Fixup}) {
         $dirData .= GetByteOrder() . Set16u(42) . Set32u(0);
-        $dirInfo->{Fixup}->AddFixup(length($dirData) - 4);
+        $$dirInfo{Fixup}->AddFixup(length($dirData) - 4);
     }
     return $dirData;
 }
@@ -7696,7 +7982,7 @@ Canon maker notes in EXIF information.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -19,7 +19,7 @@ use Image::ExifTool qw(:DataAccess);
 use Image::ExifTool::Canon;
 use Image::ExifTool::Exif;
 
-$VERSION = '1.45';
+$VERSION = '1.46';
 
 sub ProcessCanonCustom($$$);
 sub ProcessCanonCustom2($$$);
@@ -2285,27 +2285,27 @@ sub ConvertPfnInv($)
 # Returns: 1 on success
 sub ProcessCanonCustom2($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $offset = $$dirInfo{DirStart};
     my $size = $$dirInfo{DirLen};
     my $write = $$dirInfo{Write};
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     my $newTags;
 
     # first entry in array must be the size
     my $len = Get16u($dataPt, $offset);
     unless ($len == $size and $len >= 8) {
-        $exifTool->Warn("Invalid CanonCustom2 data");
+        $et->Warn("Invalid CanonCustom2 data");
         return 0;
     }
     # get group count
     my $count = Get32u($dataPt, $offset + 4);
     if ($write) {
-        $newTags = $exifTool->GetNewTagInfoHash($tagTablePtr);
-        $exifTool->VPrint(0, "  Rewriting CanonCustom2\n");
+        $newTags = $et->GetNewTagInfoHash($tagTablePtr);
+        $et->VPrint(0, "  Rewriting CanonCustom2\n");
     } elsif ($verbose) {
-        $exifTool->VerboseDir('CanonCustom2', $count);
+        $et->VerboseDir('CanonCustom2', $count);
     }
     my $pos = $offset + 8;
     my $end = $offset + $size;
@@ -2320,7 +2320,7 @@ sub ProcessCanonCustom2($$$)
         my $recPos = $pos;
         my $recEnd = $pos + $recLen;
         if ($verbose and not $write) {
-            $exifTool->VerboseDir("CanonCustom2 group $recNum", $recCount);
+            $et->VerboseDir("CanonCustom2 group $recNum", $recCount);
         }
         my ($i, $num, $tag);
         for ($i=0; $recPos + 8 < $recEnd; ++$i, $recPos+=4*$num) {
@@ -2333,18 +2333,18 @@ sub ProcessCanonCustom2($$$)
                 # write new value
                 my $tagInfo = $$newTags{$tag};
                 next unless $tagInfo;
-                my $nvHash = $exifTool->GetNewValueHash($tagInfo);
-                next unless $exifTool->IsOverwriting($nvHash, $val);
-                my $newVal = $exifTool->GetNewValues($nvHash);
+                my $nvHash = $et->GetNewValueHash($tagInfo);
+                next unless $et->IsOverwriting($nvHash, $val);
+                my $newVal = $et->GetNewValues($nvHash);
                 next unless defined $newVal;    # can't delete from a custom table
                 WriteValue($newVal, 'int32s', $num, $dataPt, $recPos);
-                $exifTool->VerboseValue("- CanonCustom:$$tagInfo{Name}", $val);
-                $exifTool->VerboseValue("+ CanonCustom:$$tagInfo{Name}", $newVal);
-                ++$exifTool->{CHANGED};
+                $et->VerboseValue("- CanonCustom:$$tagInfo{Name}", $val);
+                $et->VerboseValue("+ CanonCustom:$$tagInfo{Name}", $newVal);
+                ++$$et{CHANGED};
             } else {
                 # save extracted tag
                 my $oldInfo = $$tagTablePtr{$tag};
-                $exifTool->HandleTag($tagTablePtr, $tag, $val,
+                $et->HandleTag($tagTablePtr, $tag, $val,
                     Index  => $i,
                     Format => 'int32u',
                     Count  => $num,
@@ -2361,7 +2361,7 @@ sub ProcessCanonCustom2($$$)
         $pos += $recLen - 8;
     }
     if ($pos != $end) {
-        $exifTool->Warn('Possibly corrupted CanonCustom2 data');
+        $et->Warn('Possibly corrupted CanonCustom2 data');
         return 0;
     }
     return 1;
@@ -2373,8 +2373,8 @@ sub ProcessCanonCustom2($$$)
 # Returns: New custom data block or undefined on error
 sub WriteCanonCustom2($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    $exifTool or return 1;    # allow dummy access to autoload this package
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    $et or return 1;    # allow dummy access to autoload this package
     my $dataPt = $$dirInfo{DataPt};
     # edit a copy of the custom function 2 data
     my $buff = substr($$dataPt, $$dirInfo{DirStart}, $$dirInfo{DirLen});
@@ -2384,7 +2384,7 @@ sub WriteCanonCustom2($$$)
         DirLen   => $$dirInfo{DirLen},
         Write    => 1,
     );
-    ProcessCanonCustom2($exifTool, \%dirInfo, $tagTablePtr) or return undef;
+    ProcessCanonCustom2($et, \%dirInfo, $tagTablePtr) or return undef;
     return $buff;
 }
 
@@ -2394,26 +2394,26 @@ sub WriteCanonCustom2($$$)
 # Returns: 1 on success
 sub ProcessCanonCustom($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $offset = $$dirInfo{DirStart};
     my $size = $$dirInfo{DirLen};
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
 
     # first entry in array must be the size
     my $len = Get16u($dataPt,$offset);
-    unless ($len == $size or ($$exifTool{Model}=~/\bD60\b/ and $len+2 == $size)) {
-        $exifTool->Warn("Invalid CanonCustom data");
+    unless ($len == $size or ($$et{Model}=~/\bD60\b/ and $len+2 == $size)) {
+        $et->Warn("Invalid CanonCustom data");
         return 0;
     }
-    $verbose and $exifTool->VerboseDir('CanonCustom', $size/2-1);
+    $verbose and $et->VerboseDir('CanonCustom', $size/2-1);
     my $pos;
     for ($pos=2; $pos<$size; $pos+=2) {
         # ($pos is position within custom directory)
         my $val = Get16u($dataPt,$offset+$pos);
         my $tag = ($val >> 8);
         $val = ($val & 0xff);
-        $exifTool->HandleTag($tagTablePtr, $tag, $val,
+        $et->HandleTag($tagTablePtr, $tag, $val,
             Index  => $pos/2-1,
             Format => 'int8u',
             Count  => 1,
@@ -2429,7 +2429,7 @@ sub ProcessCanonCustom($$$)
 # Returns: error string or undef (and may modify value) on success
 sub CheckCanonCustom($$$)
 {
-    my ($exifTool, $tagInfo, $valPtr) = @_;
+    my ($et, $tagInfo, $valPtr) = @_;
     return Image::ExifTool::CheckValue($valPtr, 'int8u');
 }
 
@@ -2439,8 +2439,8 @@ sub CheckCanonCustom($$$)
 # Returns: New custom data block or undefined on error
 sub WriteCanonCustom($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    $exifTool or return 1;    # allow dummy access to autoload this package
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    $et or return 1;    # allow dummy access to autoload this package
     my $dataPt = $$dirInfo{DataPt};
     my $dirStart = $$dirInfo{DirStart} || 0;
     my $dirLen = $$dirInfo{DirLen} || length($$dataPt) - $dirStart;
@@ -2450,26 +2450,26 @@ sub WriteCanonCustom($$$)
 
     # first entry in array must be the size
     my $len = Get16u($dataPt, 0);
-    unless ($len == $dirLen or ($$exifTool{Model}=~/\bD60\b/ and $len+2 == $dirLen)) {
-        $exifTool->Warn("Invalid CanonCustom data");
+    unless ($len == $dirLen or ($$et{Model}=~/\bD60\b/ and $len+2 == $dirLen)) {
+        $et->Warn("Invalid CanonCustom data");
         return undef;
     }
-    my $newTags = $exifTool->GetNewTagInfoHash($tagTablePtr);
+    my $newTags = $et->GetNewTagInfoHash($tagTablePtr);
     my $pos;
     for ($pos=2; $pos<$dirLen; $pos+=2) {
         my $val = Get16u($dataPt, $pos);
         my $tag = ($val >> 8);
         my $tagInfo = $$newTags{$tag};
         next unless $tagInfo;
-        my $nvHash = $exifTool->GetNewValueHash($tagInfo);
+        my $nvHash = $et->GetNewValueHash($tagInfo);
         $val = ($val & 0xff);
-        next unless $exifTool->IsOverwriting($nvHash, $val);
-        my $newVal = $exifTool->GetNewValues($nvHash);
+        next unless $et->IsOverwriting($nvHash, $val);
+        my $newVal = $et->GetNewValues($nvHash);
         next unless defined $newVal;    # can't delete from a custom table
         Set16u(($newVal & 0xff) + ($tag << 8), $dataPt, $pos);
-        $exifTool->VerboseValue("- $dirName:$$tagInfo{Name}", $val);
-        $exifTool->VerboseValue("+ $dirName:$$tagInfo{Name}", $newVal);
-        ++$exifTool->{CHANGED};
+        $et->VerboseValue("- $dirName:$$tagInfo{Name}", $val);
+        $et->VerboseValue("+ $dirName:$$tagInfo{Name}", $newVal);
+        ++$$et{CHANGED};
     }
     return $newData;
 }
@@ -2496,7 +2496,7 @@ Image::ExifTool to read this information.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -21,7 +21,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Exif;
 use Image::ExifTool::Canon;
 
-$VERSION = '1.55';
+$VERSION = '1.56';
 
 sub WriteCRW($$);
 sub ProcessCanonRaw($$$);
@@ -634,13 +634,13 @@ sub AUTOLOAD
 # Returns: 1 on success
 sub ProcessCanonRaw($$$)
 {
-    my ($exifTool, $dirInfo, $rawTagTable) = @_;
+    my ($et, $dirInfo, $rawTagTable) = @_;
     my $blockStart = $$dirInfo{DirStart};
     my $blockSize = $$dirInfo{DirLen};
     my $raf = $$dirInfo{RAF} or return 0;
     my $buff;
-    my $verbose = $exifTool->Options('Verbose');
-    my $buildMakerNotes = $exifTool->Options('MakerNotes');
+    my $verbose = $et->Options('Verbose');
+    my $buildMakerNotes = $et->Options('MakerNotes');
 
     # 4 bytes at end of block give directory position within block
     $raf->Seek($blockStart+$blockSize-4, 0) or return 0;
@@ -652,7 +652,7 @@ sub ProcessCanonRaw($$$)
     # read the directory (10 bytes per entry)
     $raf->Read($buff, 10 * $entries) == 10 * $entries or return 0;
 
-    $verbose and $exifTool->VerboseDir('CIFF', $entries);
+    $verbose and $et->VerboseDir('CIFF', $entries);
     my $index;
     for ($index=0; $index<$entries; ++$index) {
         my $pt = 10 * $index;
@@ -661,13 +661,13 @@ sub ProcessCanonRaw($$$)
         my $valuePtr = Get32u(\$buff, $pt+6);
         my $ptr = $valuePtr + $blockStart;  # all pointers relative to block start
         if ($tag & 0x8000) {
-            $exifTool->Warn('Bad CRW directory entry');
+            $et->Warn('Bad CRW directory entry');
             return 1;
         }
         my $tagID = $tag & 0x3fff;          # get tag ID
         my $tagType = ($tag >> 8) & 0x38;   # get tag type
         my $valueInDir = ($tag & 0x4000);   # flag for value in directory
-        my $tagInfo = $exifTool->GetTagInfo($rawTagTable, $tagID);
+        my $tagInfo = $et->GetTagInfo($rawTagTable, $tagID);
         if (($tagType==0x28 or $tagType==0x30) and not $valueInDir) {
             # this type of tag specifies a raw subdirectory
             my $name;
@@ -684,13 +684,13 @@ sub ProcessCanonRaw($$$)
             );
             if ($verbose) {
                 my $fakeInfo = { Name => $name, SubDirectory => { } };
-                $exifTool->VerboseInfo($tagID, $fakeInfo,
+                $et->VerboseInfo($tagID, $fakeInfo,
                     'Index'  => $index,
                     'Size'   => $size,
                     'Start'  => $ptr,
                 );
             }
-            $exifTool->ProcessDirectory(\%subdirInfo, $rawTagTable);
+            $et->ProcessDirectory(\%subdirInfo, $rawTagTable);
             next;
         }
         my ($valueDataPos, $count, $subdir);
@@ -714,21 +714,21 @@ sub ProcessCanonRaw($$$)
             $valueDataPos = $ptr;
             if ($size <= 512 or ($verbose > 2 and $size <= 65536)
                 or ($tagInfo and ($$tagInfo{SubDirectory}
-                or grep(/^$$tagInfo{Name}$/i, $exifTool->GetRequestedTags()) )))
+                or grep(/^$$tagInfo{Name}$/i, $et->GetRequestedTags()) )))
             {
                 # read value if size is small or specifically requested
                 # or if this is a SubDirectory
                 unless ($raf->Seek($ptr, 0) and $raf->Read($value, $size) == $size) {
-                    $exifTool->Warn(sprintf("Error reading %d bytes from 0x%x",$size,$ptr));
+                    $et->Warn(sprintf("Error reading %d bytes from 0x%x",$size,$ptr));
                     next;
                 }
             } else {
                 $value = "Binary data $size bytes";
                 if ($tagInfo) {
-                    if ($exifTool->Options('Binary') or $verbose) {
+                    if ($et->Options('Binary') or $verbose) {
                         # read the value anyway
                         unless ($raf->Seek($ptr, 0) and $raf->Read($value, $size) == $size) {
-                            $exifTool->Warn(sprintf("Error reading %d bytes from 0x%x",$size,$ptr));
+                            $et->Warn(sprintf("Error reading %d bytes from 0x%x",$size,$ptr));
                             next;
                         }
                     }
@@ -750,7 +750,7 @@ sub ProcessCanonRaw($$$)
         if ($verbose) {
             my $val = $value;
             $format and $val = ReadValue(\$val, 0, $format, $count, $size);
-            $exifTool->VerboseInfo($tagID, $tagInfo,
+            $et->VerboseInfo($tagID, $tagInfo,
                 Table   => $rawTagTable,
                 Index   => $index,
                 Value   => $val,
@@ -763,7 +763,7 @@ sub ProcessCanonRaw($$$)
         }
         if ($buildMakerNotes) {
             # build maker notes information if requested
-            BuildMakerNotes($exifTool, $tagID, $tagInfo, \$value, $format, $count);
+            BuildMakerNotes($et, $tagID, $tagInfo, \$value, $format, $count);
         }
         next unless defined $tagInfo;
 
@@ -798,15 +798,15 @@ sub ProcessCanonRaw($$$)
             );
             #### eval Validate ($dirData, $subdirStart, $size)
             if (defined $$subdir{Validate} and not eval $$subdir{Validate}) {
-                $exifTool->Warn("Invalid $name data");
+                $et->Warn("Invalid $name data");
             } else {
-                $exifTool->ProcessDirectory(\%subdirInfo, $newTagTable, $$subdir{ProcessProc});
+                $et->ProcessDirectory(\%subdirInfo, $newTagTable, $$subdir{ProcessProc});
             }
         } else {
             # convert to specified format if necessary
             $format and $value = ReadValue(\$value, 0, $format, $count, $size);
             # save the information
-            $exifTool->FoundTag($tagInfo, $value);
+            $et->FoundTag($tagInfo, $value);
             delete $$tagInfo{RawConv} if $delRawConv;
         }
     }
@@ -819,10 +819,10 @@ sub ProcessCanonRaw($$$)
 # Returns: 1 if this was a valid Canon RAW file
 sub ProcessCRW($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my ($buff, $sig);
     my $raf = $$dirInfo{RAF};
-    my $buildMakerNotes = $exifTool->Options('MakerNotes');
+    my $buildMakerNotes = $et->Options('MakerNotes');
 
     $raf->Read($buff,2) == 2      or return 0;
     SetByteOrder($buff)           or return 0;
@@ -835,10 +835,10 @@ sub ProcessCRW($$)
     my $filesize = $raf->Tell()   or return 0;
 
     # initialize maker note data if building maker notes
-    $buildMakerNotes and InitMakerNotes($exifTool);
+    $buildMakerNotes and InitMakerNotes($et);
 
     # set the FileType tag unless already done (ie. APP0 CIFF record in JPEG image)
-    $exifTool->SetFileType();
+    $et->SetFileType();
 
     # build directory information for main raw directory
     my %dirInfo = (
@@ -852,20 +852,20 @@ sub ProcessCRW($$)
 
     # process the raw directory
     my $rawTagTable = GetTagTable('Image::ExifTool::CanonRaw::Main');
-    my $oldIndent = $$exifTool{INDENT};
-    $$exifTool{INDENT} .= '| ';
-    unless (ProcessCanonRaw($exifTool, \%dirInfo, $rawTagTable)) {
-        $exifTool->Warn('CRW file format error');
+    my $oldIndent = $$et{INDENT};
+    $$et{INDENT} .= '| ';
+    unless (ProcessCanonRaw($et, \%dirInfo, $rawTagTable)) {
+        $et->Warn('CRW file format error');
     }
-    $$exifTool{INDENT} = $oldIndent;
+    $$et{INDENT} = $oldIndent;
 
     # finish building maker notes if necessary
-    $buildMakerNotes and SaveMakerNotes($exifTool);
+    $buildMakerNotes and SaveMakerNotes($et);
 
     # process trailers if they exist in CRW file (not in CIFF information!)
-    if ($$exifTool{FILE_TYPE} eq 'CRW') {
+    if ($$et{FILE_TYPE} eq 'CRW') {
         my $trailInfo = Image::ExifTool::IdentifyTrailer($raf);
-        $exifTool->ProcessTrailers($trailInfo) if $trailInfo;
+        $et->ProcessTrailers($trailInfo) if $trailInfo;
     }
 
     return 1;
@@ -898,7 +898,7 @@ tags.)
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -20,7 +20,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.20';
+$VERSION = '1.22';
 
 sub ProcessCanonVRD($$;$);
 sub WriteCanonVRD($$;$);
@@ -998,19 +998,19 @@ sub ToneCurvePrintInv($)
 # Returns: Reading: 1 on success; Writing: modified edit data, or undef if nothing changed
 sub ProcessEditData($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    $exifTool or return 1;    # allow dummy access
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    $et or return 1;    # allow dummy access
     my $dataPt = $$dirInfo{DataPt};
     my $pos = $$dirInfo{DirStart};
     my $dataPos = $$dirInfo{DataPos};
     my $outfile = $$dirInfo{OutFile};
     my $dirLen = $$dirInfo{DirLen};
     my $dirEnd = $pos + $dirLen;
-    my $verbose = $exifTool->Options('Verbose');
-    my $out = $exifTool->Options('TextOut');
-    my $oldChanged = $$exifTool{CHANGED};
+    my $verbose = $et->Options('Verbose');
+    my $out = $et->Options('TextOut');
+    my $oldChanged = $$et{CHANGED};
 
-    $exifTool->VerboseDir('VRD Edit Data', 0, $dirLen) unless $outfile;
+    $et->VerboseDir('VRD Edit Data', 0, $dirLen) unless $outfile;
 
     # loop through all records in the edit data
     my ($recNum, $recLen, $err);
@@ -1023,19 +1023,19 @@ sub ProcessEditData($$$)
         }
         $pos += 4;          # move to start of record
         if ($pos + $recLen > $dirEnd) {
-            $exifTool->Warn('Possibly corrupt CanonVRD Edit record');
+            $et->Warn('Possibly corrupt CanonVRD Edit record');
             $err = 1;
             last;
         }
         if ($verbose > 1 and not $outfile) {
-            printf $out "$$exifTool{INDENT}CanonVRD Edit record ($recLen bytes at offset 0x%x)\n",
+            printf $out "$$et{INDENT}CanonVRD Edit record ($recLen bytes at offset 0x%x)\n",
                    $pos + $dataPos;
             if ($recNum and $verbose > 2) {
                 my %parms = (
                     Start  => $pos,
                     Addr   => $pos + $dataPos,
                     Out    => $out,
-                    Prefix => $$exifTool{INDENT},
+                    Prefix => $$et{INDENT},
                 );
                 $parms{MaxLen} = $verbose == 3 ? 96 : 2048 if $verbose < 5;
                 Image::ExifTool::HexDump($dataPt, $recLen, %parms);
@@ -1079,17 +1079,17 @@ sub ProcessEditData($$$)
                 if ($outfile) {
                     # rewrite this section of the VRD edit information
                     $verbose and print $out "  Rewriting Canon $subName\n";
-                    my $newVal = $exifTool->WriteDirectory(\%subdirInfo, $subTable);
+                    my $newVal = $et->WriteDirectory(\%subdirInfo, $subTable);
                     substr($$dataPt, $pos+$start, $dirLen) = $newVal if $newVal;
                 } else {
-                    $exifTool->VPrint(0, "$$exifTool{INDENT}$subName (SubDirectory) -->\n");
-                    $exifTool->VerboseDump(\$editData,
+                    $et->VPrint(0, "$$et{INDENT}$subName (SubDirectory) -->\n");
+                    $et->VerboseDump(\$editData,
                         Start => $start,
                         Addr  => $dataPos + $pos + $start,
                         Len   => $dirLen,
                     );
                     # extract tags from this section of the VRD edit information
-                    $exifTool->ProcessDirectory(\%subdirInfo, $subTable);
+                    $et->ProcessDirectory(\%subdirInfo, $subTable);
                 }
             }
             # next section starts at the end of this one
@@ -1097,7 +1097,7 @@ sub ProcessEditData($$$)
         }
     }
     if ($outfile) {
-        return undef if $oldChanged == $$exifTool{CHANGED};
+        return undef if $oldChanged == $$et{CHANGED};
         return substr($$dataPt, $$dirInfo{DirStart}, $dirLen);
     }
     return $err ? 0 : 1;
@@ -1109,31 +1109,31 @@ sub ProcessEditData($$$)
 # Returns: 1 on success
 sub ProcessIHL($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dataPos = $$dirInfo{DataPos};
     my $pos = $$dirInfo{DirStart};
     my $dirLen = $$dirInfo{DirLen};
     my $dirEnd = $pos + $dirLen;
 
-    $exifTool->VerboseDir('VRD IHL', 0, $dirLen);
+    $et->VerboseDir('VRD IHL', 0, $dirLen);
 
     SetByteOrder('II'); # (make up your mind, Canon!)
     while ($pos + 48 <= $dirEnd) {
         my $hdr = substr($$dataPt, $pos, 48);
         unless ($hdr =~ /^IHL Created Optional Item Data\0\0/) {
-            $exifTool->Warn('Possibly corrupted VRD IHL data');
+            $et->Warn('Possibly corrupted VRD IHL data');
             last;
         }
         my $tag  = Get32u($dataPt, $pos + 36);
         my $size = Get32u($dataPt, $pos + 40); # size of data in IHL record
         my $next = Get32u($dataPt, $pos + 44); # size of complete IHL record
         if ($size > $next or $pos + 48 + $next > $dirEnd) {
-            $exifTool->Warn(sprintf('Bad size for VRD IHL tag 0x%.4x', $tag));
+            $et->Warn(sprintf('Bad size for VRD IHL tag 0x%.4x', $tag));
             last;
         }
         $pos += 48;
-        $exifTool->HandleTag($tagTablePtr, $tag, substr($$dataPt, $pos, $size),
+        $et->HandleTag($tagTablePtr, $tag, substr($$dataPt, $pos, $size),
             DataPt  => $dataPt,
             DataPos => $dataPos,
             Start   => $pos,
@@ -1150,13 +1150,13 @@ sub ProcessIHL($$$)
 # Returns: 1 on success
 sub ProcessIHLExif($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    $$exifTool{DOC_NUM} = 1;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    $$et{DOC_NUM} = 1;
     # the IHL-edited maker notes may look messed up, but the offsets should be OK
-    my $oldFix = $exifTool->Options(FixBase => 0);
-    my $rtnVal = $exifTool->ProcessTIFF($dirInfo, $tagTablePtr);
-    $exifTool->Options(FixBase => $oldFix);
-    delete $$exifTool{DOC_NUM};
+    my $oldFix = $et->Options(FixBase => 0);
+    my $rtnVal = $et->ProcessTIFF($dirInfo, $tagTablePtr);
+    $et->Options(FixBase => $oldFix);
+    delete $$et{DOC_NUM};
     return $rtnVal;
 }
 
@@ -1166,41 +1166,41 @@ sub ProcessIHLExif($$$)
 # Returns: 1 if this was a Canon VRD file, 0 otherwise, -1 on write error
 sub ProcessVRD($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my $buff;
     my $num = $raf->Read($buff, 0x1c);
 
     # initialize write directories if necessary
-    $exifTool->InitWriteDirs(\%vrdMap, 'XMP') if $$dirInfo{OutFile};
+    $et->InitWriteDirs(\%vrdMap, 'XMP') if $$dirInfo{OutFile};
 
     if (not $num and $$dirInfo{OutFile}) {
         # create new VRD file from scratch
-        my $newVal = $exifTool->GetNewValues('CanonVRD');
+        my $newVal = $et->GetNewValues('CanonVRD');
         if ($newVal) {
-            $exifTool->VPrint(0, "  Writing CanonVRD as a block\n");
+            $et->VPrint(0, "  Writing CanonVRD as a block\n");
             Write($$dirInfo{OutFile}, $newVal) or return -1;
-            ++$exifTool->{CHANGED};
+            ++$$et{CHANGED};
         } else {
             # allow VRD to be created from individual tags
-            if ($$exifTool{ADD_DIRS}{CanonVRD}) {
+            if ($$et{ADD_DIRS}{CanonVRD}) {
                 my $newVal = '';
-                if (ProcessCanonVRD($exifTool, { OutFile => \$newVal }) > 0) {
+                if (ProcessCanonVRD($et, { OutFile => \$newVal }) > 0) {
                     Write($$dirInfo{OutFile}, $newVal) or return -1;
-                    ++$exifTool->{CHANGED};
+                    ++$$et{CHANGED};
                     return 1;
                 }
             }
-            $exifTool->Error('No CanonVRD information to write');
+            $et->Error('No CanonVRD information to write');
         }
     } else {
         $num == 0x1c or return 0;
         $buff =~ /^CANON OPTIONAL DATA\0/ or return 0;
-        $exifTool->SetFileType();
+        $et->SetFileType();
         $$dirInfo{DirName} = 'CanonVRD';    # set directory name for verbose output
-        my $result = ProcessCanonVRD($exifTool, $dirInfo);
+        my $result = ProcessCanonVRD($et, $dirInfo);
         return $result if $result < 0;
-        $result or $exifTool->Warn('Format error in VRD file');
+        $result or $et->Warn('Format error in VRD file');
     }
     return 1;
 }
@@ -1212,13 +1212,13 @@ sub ProcessVRD($$)
 # Notes: Increments ExifTool CHANGED flag if changed
 sub WriteCanonVRD($$;$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    $exifTool or return 1;    # allow dummy access
-    my $nvHash = $exifTool->GetNewValueHash($Image::ExifTool::Extra{CanonVRD});
-    return undef unless $exifTool->IsOverwriting($nvHash);
-    my $val = $exifTool->GetNewValues($nvHash);
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    $et or return 1;    # allow dummy access
+    my $nvHash = $et->GetNewValueHash($Image::ExifTool::Extra{CanonVRD});
+    my $val = $et->GetNewValues($nvHash);
     $val = '' unless defined $val;
-    ++$exifTool->{CHANGED};
+    return undef unless $et->IsOverwriting($nvHash, $val);
+    ++$$et{CHANGED};
     return $val;
 }
 
@@ -1230,12 +1230,12 @@ sub WriteCanonVRD($$;$)
 # - updates DirLen to trailer length
 sub ProcessCanonVRD($$;$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $raf = $$dirInfo{RAF};
     my $offset = $$dirInfo{Offset} || 0;
     my $outfile = $$dirInfo{OutFile};
-    my $verbose = $exifTool->Options('Verbose');
-    my $out = $exifTool->Options('TextOut');
+    my $verbose = $et->Options('Verbose');
+    my $out = $et->Options('TextOut');
     my ($buff, $footer, $header, $created, $err);
     my ($blockLen, $blockType, $size, %didDir);
 
@@ -1266,14 +1266,14 @@ sub ProcessCanonVRD($$;$)
             $header =~ /^CANON OPTIONAL DATA\0/ and
             $raf->Read($buff, $size) == $size)
     {
-        $exifTool->Warn('Bad CanonVRD trailer');
+        $et->Warn('Bad CanonVRD trailer');
         return 0;
     }
     # extract CanonVRD block if copying tags, or if requested
-    if (($exifTool->{TAGS_FROM_FILE} and not $exifTool->{EXCL_TAG_LOOKUP}{canonvrd}) or
-        $exifTool->{REQ_TAG_LOOKUP}{canonvrd})
+    if (($$et{TAGS_FROM_FILE} and not $$et{EXCL_TAG_LOOKUP}{canonvrd}) or
+        $$et{REQ_TAG_LOOKUP}{canonvrd})
     {
-        $exifTool->FoundTag('CanonVRD', $header . $buff . $footer);
+        $et->FoundTag('CanonVRD', $header . $buff . $footer);
     }
     # set variables returned in dirInfo hash
     $$dirInfo{DataPos} = $raf->Tell() - $size - 0x1c;
@@ -1282,35 +1282,35 @@ sub ProcessCanonVRD($$;$)
     if ($outfile) {
         $verbose and not $created and printf $out "  Rewriting CanonVRD trailer\n";
         # delete CanonVRD information if specified
-        if ($exifTool->{DEL_GROUP}->{CanonVRD} or $exifTool->{DEL_GROUP}->{Trailer} or
+        if ($$et{DEL_GROUP}{CanonVRD} or $$et{DEL_GROUP}{Trailer} or
             # also delete if writing as a block (will get added back again later)
-            $exifTool->{NEW_VALUE}->{$Image::ExifTool::Extra{CanonVRD}})
+            $$et{NEW_VALUE}{$Image::ExifTool::Extra{CanonVRD}})
         {
-            if ($exifTool->{FILE_TYPE} eq 'VRD') {
-                my $newVal = $exifTool->GetNewValues('CanonVRD');
+            if ($$et{FILE_TYPE} eq 'VRD') {
+                my $newVal = $et->GetNewValues('CanonVRD');
                 if ($newVal) {
                     $verbose and printf $out "  Writing CanonVRD as a block\n";
                     Write($outfile, $newVal) or return -1;
-                    ++$exifTool->{CHANGED};
+                    ++$$et{CHANGED};
                 } else {
-                    $exifTool->Error("Can't delete all CanonVRD information from a VRD file");
+                    $et->Error("Can't delete all CanonVRD information from a VRD file");
                 }
             } else {
                 $verbose and printf $out "  Deleting CanonVRD trailer\n";
-                ++$exifTool->{CHANGED};
+                ++$$et{CHANGED};
             }
             return 1;
         }
         # write now and return if CanonVRD was set as a block
-        my $val = $exifTool->GetNewValues('CanonVRD');
+        my $val = $et->GetNewValues('CanonVRD');
         if ($val) {
             $verbose and print $out "  Writing CanonVRD as a block\n";
             Write($outfile, $val) or return -1;
-            ++$exifTool->{CHANGED};
+            ++$$et{CHANGED};
             return 1;
         }
-    } elsif ($verbose or $exifTool->{HTML_DUMP}) {
-        $exifTool->DumpTrailer($dirInfo) if $$dirInfo{RAF};
+    } elsif ($verbose or $$et{HTML_DUMP}) {
+        $et->DumpTrailer($dirInfo) if $$dirInfo{RAF};
     }
 
     $tagTablePtr = GetTagTable('Image::ExifTool::CanonVRD::Main');
@@ -1332,7 +1332,7 @@ sub ProcessCanonVRD($$;$)
         }
         $pos += 8;          # move to start of block
         if ($pos + $blockLen > $size) {
-            $exifTool->Warn('Possibly corrupt CanonVRD block');
+            $et->Warn('Possibly corrupt CanonVRD block');
             last;
         }
         if ($verbose > 1 and not $outfile) {
@@ -1343,7 +1343,7 @@ sub ProcessCanonVRD($$;$)
                     Start  => $pos,
                     Addr   => $pos + $vrdPos,
                     Out    => $out,
-                    Prefix => $$exifTool{INDENT},
+                    Prefix => $$et{INDENT},
                 );
                 $parms{MaxLen} = $verbose == 3 ? 96 : 2048 if $verbose < 5;
                 Image::ExifTool::HexDump($dataPt, $blockLen, %parms);
@@ -1351,7 +1351,7 @@ sub ProcessCanonVRD($$;$)
         }
         my $tagInfo = $$tagTablePtr{$blockType};
         unless ($tagInfo) {
-            unless ($exifTool->Options('Unknown')) {
+            unless ($et->Options('Unknown')) {
                 $pos += $blockLen;  # step to next block
                 next;
             }
@@ -1381,19 +1381,19 @@ sub ProcessCanonVRD($$;$)
                 # set flag indicating we did this directory
                 $didDir{$$tagInfo{Name}} = 1;
                 my $dat;
-                if ($$exifTool{NEW_VALUE}{$tagInfo}) {
+                if ($$et{NEW_VALUE}{$tagInfo}) {
                     # write as a block
-                    $exifTool->VPrint(0, "Writing $$tagInfo{Name} as a block\n");
-                    $dat = $exifTool->GetNewValues($tagInfo);
+                    $et->VPrint(0, "Writing $$tagInfo{Name} as a block\n");
+                    $dat = $et->GetNewValues($tagInfo);
                     $dat = '' unless defined $dat;
-                    ++$$exifTool{CHANGED};
+                    ++$$et{CHANGED};
                 } else {
-                    $dat = $exifTool->WriteDirectory(\%subdirInfo, $subTablePtr);
+                    $dat = $et->WriteDirectory(\%subdirInfo, $subTablePtr);
                 }
                 # update data with new directory
                 if (defined $dat) {
                     my $buf2;
-                    if (length $dat or $$exifTool{FILE_TYPE} !~ /^(CRW|VRD)$/) {
+                    if (length $dat or $$et{FILE_TYPE} !~ /^(CRW|VRD)$/) {
                         # replace with new block (updating the block length word)
                         $buf2 = substr($$dataPt, 0, $pos - 4) . Set32u(length $dat) . $dat;
                     } else {
@@ -1412,18 +1412,18 @@ sub ProcessCanonVRD($$;$)
                 }
             } else {
                 # extract as a block if requested
-                $exifTool->ProcessDirectory(\%subdirInfo, $subTablePtr);
+                $et->ProcessDirectory(\%subdirInfo, $subTablePtr);
             }
         } else {
-            $exifTool->HandleTag($tagTablePtr, $blockType, substr($$dataPt, $pos, $blockLen));
+            $et->HandleTag($tagTablePtr, $blockType, substr($$dataPt, $pos, $blockLen));
         }
         $pos += $blockLen;  # step to next block
     }
     if ($outfile) {
         # create XMP block if necessary (CRW/VRD files only)
-        if ($$exifTool{ADD_DIRS}{CanonVRD} and not $didDir{XMP}) {
+        if ($$et{ADD_DIRS}{CanonVRD} and not $didDir{XMP}) {
             my $subTablePtr = GetTagTable('Image::ExifTool::XMP::Main');
-            my $dat = $exifTool->WriteDirectory({ Parent => 'CanonVRD' }, $subTablePtr);
+            my $dat = $et->WriteDirectory({ Parent => 'CanonVRD' }, $subTablePtr);
             if ($dat) {
                 $$dataPt .= Set32u(0xffff00f6) . Set32u(length $dat) . $dat;
                 # update the new VRD length in the header/footer
@@ -1463,7 +1463,7 @@ trailer in JPEG, CRW, CR2 and TIFF images.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -17,7 +17,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::XMP;
 use Image::ExifTool::ZIP;
 
-$VERSION = '1.03';
+$VERSION = '1.04';
 
 # CaptureOne COS XML tags
 # - tags are added dynamically when encountered
@@ -65,11 +65,11 @@ sub HandleCOSAttrs($$$$)
 # Returns: 1 if valid tag was found
 sub FoundCOS($$$$;$)
 {
-    my ($exifTool, $tagTablePtr, $props, $val, $attrs) = @_;
+    my ($et, $tagTablePtr, $props, $val, $attrs) = @_;
 
     my $tag = $$props[-1];
     unless ($$tagTablePtr{$tag}) {
-        $exifTool->VPrint(0, "  | [adding $tag]\n");
+        $et->VPrint(0, "  | [adding $tag]\n");
         my $name = ucfirst $tag;
         $name =~ tr/-_a-zA-Z0-9//dc;
         return 0 unless length $tag;
@@ -84,10 +84,10 @@ sub FoundCOS($$$$;$)
         AddTagToTable($tagTablePtr, $tag, \%tagInfo);
     }
     # convert from UTF8 to ExifTool Charset
-    $val = $exifTool->Decode($val, "UTF8");
+    $val = $et->Decode($val, "UTF8");
     # un-escape XML character entities
     $val = Image::ExifTool::XMP::UnescapeXML($val);
-    $exifTool->HandleTag($tagTablePtr, $tag, $val);
+    $et->HandleTag($tagTablePtr, $tag, $val);
     return 0;
 }
 
@@ -97,7 +97,7 @@ sub FoundCOS($$$$;$)
 # Returns: 1 on success, 0 if this wasn't a valid XML file
 sub ProcessCOS($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
 
     # process using XMP module, but override handling of attributes and tags
     $$dirInfo{XMPParseOpts} = {
@@ -105,7 +105,7 @@ sub ProcessCOS($$)
         FoundProc => \&FoundCOS,
     };
     my $tagTablePtr = GetTagTable('Image::ExifTool::CaptureOne::Main');
-    my $success = $exifTool->ProcessDirectory($dirInfo, $tagTablePtr);
+    my $success = $et->ProcessDirectory($dirInfo, $tagTablePtr);
     delete $$dirInfo{XMLParseArgs};
     return $success;
 }
@@ -119,11 +119,11 @@ sub ProcessCOS($$)
 #   ZIP     - reference to Archive::Zip object for this file
 sub ProcessEIP($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $zip = $$dirInfo{ZIP};
     my ($file, $buff, $status, $member, %parseFile);
 
-    $exifTool->SetFileType('EIP');
+    $et->SetFileType('EIP');
 
     # must catch all Archive::Zip warnings
     local $SIG{'__WARN__'} = \&Image::ExifTool::ZIP::WarnProc;
@@ -159,10 +159,10 @@ sub ProcessEIP($$)
         # get filename of this ZIP member
         $file = $member->fileName();
         next unless defined $file;
-        $exifTool->VPrint(0, "File: $file\n");
+        $et->VPrint(0, "File: $file\n");
         # set the document number and extract ZIP tags
-        $$exifTool{DOC_NUM} = ++$docNum;
-        Image::ExifTool::ZIP::HandleMember($exifTool, $member);
+        $$et{DOC_NUM} = ++$docNum;
+        Image::ExifTool::ZIP::HandleMember($et, $member);
         if (%parseFile) {
             next unless $parseFile{$file};
         } else {
@@ -173,7 +173,7 @@ sub ProcessEIP($$)
         # extract the contents of the file
         # Note: this could use a LOT of memory here for RAW images...
         ($buff, $status) = $zip->contents($member);
-        $status and $exifTool->Warn("Error extracting $file"), next;
+        $status and $et->Warn("Error extracting $file"), next;
         if ($file =~ /\.cos$/i) {
             # process Capture One Settings files
             my %dirInfo = (
@@ -181,18 +181,18 @@ sub ProcessEIP($$)
                 DirLen => length $buff,
                 DataLen => length $buff,
             );
-            ProcessCOS($exifTool, \%dirInfo);
+            ProcessCOS($et, \%dirInfo);
         } else {
             # set HtmlDump error if necessary because it doesn't work with embedded files
-            if ($$exifTool{HTML_DUMP}) {
-                $$exifTool{HTML_DUMP}{Error} = "Sorry, can't dump images embedded in ZIP files";
+            if ($$et{HTML_DUMP}) {
+                $$et{HTML_DUMP}{Error} = "Sorry, can't dump images embedded in ZIP files";
             }
             # process IIQ, JPEG and TIFF images
-            $exifTool->ExtractInfo(\$buff, { ReEntry => 1 });
+            $et->ExtractInfo(\$buff, { ReEntry => 1 });
         }
         undef $buff;    # (free memory now)
     }
-    delete $$exifTool{DOC_NUM};
+    delete $$et{DOC_NUM};
     return 1;
 }
 
@@ -221,7 +221,7 @@ settings files (COS).
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -9,7 +9,7 @@
 # References:   1) http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html
 #               2) Joachim Loehr private communication
 #               3) http://homepage3.nifty.com/kamisaka/makernote/makernote_casio.htm
-#               4) http://www.gvsoft.homedns.org/exif/makernote-casio.html
+#               4) http://gvsoft.homedns.org/exif/makernote-casio-type1.html
 #               5) Robert Chi private communication (EX-F1)
 #               6) http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,3701.html
 #               JD) Jens Duttke private communication
@@ -1987,7 +1987,7 @@ Casio maker notes in EXIF information.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -14,7 +14,7 @@ use strict;
 use vars qw($VERSION %csType);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.07';
+$VERSION = '1.08';
 
 my %charsetTable;   # character set tables we've loaded
 
@@ -117,7 +117,7 @@ sub LoadCharset($)
 sub Decompose($$$;$)
 {
     local $_;
-    my ($exifTool, $val, $charset) = @_; # ($byteOrder assigned later if required)
+    my ($et, $val, $charset) = @_; # ($byteOrder assigned later if required)
     my $type = $csType{$charset};
     my (@uni, $conv);
 
@@ -125,7 +125,7 @@ sub Decompose($$$;$)
         $conv = LoadCharset($charset);
         unless ($conv) {
             # (shouldn't happen)
-            $exifTool->Warn("Invalid character set $charset") if $exifTool;
+            $et->Warn("Invalid character set $charset") if $et;
             return \@uni;   # error!
         }
     } elsif ($type == 0x100) {
@@ -140,9 +140,9 @@ sub Decompose($$$;$)
             # (somehow the meaning of "U0" was reversed in Perl 5.10.0!)
             @uni = unpack($] < 5.010000 ? 'U0U*' : 'C0U*', $val);
             # issue warning if we had errors
-            if ($Image::ExifTool::evalWarning and $exifTool and not $$exifTool{WarnBadUTF8}) {
-                $exifTool->Warn('Malformed UTF-8 character(s)');
-                $$exifTool{WarnBadUTF8} = 1;
+            if ($Image::ExifTool::evalWarning and $et and not $$et{WarnBadUTF8}) {
+                $et->Warn('Malformed UTF-8 character(s)');
+                $$et{WarnBadUTF8} = 1;
             }
         }
         return \@uni;       # all done!
@@ -274,9 +274,9 @@ sub Decompose($$$;$)
 sub Recompose($$;$$)
 {
     local $_;
-    my ($exifTool, $uni, $charset) = @_; # ($byteOrder assigned later if required)
+    my ($et, $uni, $charset) = @_; # ($byteOrder assigned later if required)
     my ($outVal, $conv, $inv);
-    $charset or $charset = $$exifTool{OPTIONS}{Charset};
+    $charset or $charset = $$et{OPTIONS}{Charset};
     my $csType = $csType{$charset};
     if ($csType == 0x100) {     # UTF8 (also treat ASCII as UTF8)
         if ($] >= 5.006001) {
@@ -293,14 +293,14 @@ sub Recompose($$;$$)
     if ($csType & 0x801) {
         $conv = LoadCharset($charset);
         unless ($conv) {
-            $exifTool->Warn("Missing charset $charset") if $exifTool;
+            $et->Warn("Missing charset $charset") if $et;
             return '';
         }
         $inv = $unicode2byte{$charset};
         # generate inverse lookup if necessary
         unless ($inv) {
             if (not $csType or $csType & 0x802) {
-                $exifTool->Warn("Invalid destination charset $charset") if $exifTool;
+                $et->Warn("Invalid destination charset $charset") if $et;
                 return '';
             }
             # prepare table to convert from Unicode to 1-byte characters
@@ -321,9 +321,9 @@ sub Recompose($$;$$)
             # different character with this byte value
             next if $_ < 0x100 and not $$conv{$_};
             $_ = ord('?');  # set invalid characters to '?'
-            if ($exifTool and not $$exifTool{EncodingError}) {
-                $exifTool->Warn("Some character(s) could not be encoded in $charset");
-                $$exifTool{EncodingError} = 1;
+            if ($et and not $$et{EncodingError}) {
+                $et->Warn("Some character(s) could not be encoded in $charset");
+                $$et{EncodingError} = 1;
             }
         }
         # repack as an 8-bit string and truncate at null
@@ -384,7 +384,7 @@ when decoding certain types of information.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -20,7 +20,7 @@ use strict;
 use vars qw($VERSION %uid);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.16';
+$VERSION = '1.18';
 
 # DICOM VR (Value Representation) format conversions
 my %dicomFormat = (
@@ -3407,6 +3407,9 @@ my %implicitVR = (
     '1.2.840.10008.5.1.4.1.1.12.3' => 'X-Ray Angiographic Bi-Plane Image Storage ',
     '1.2.840.10008.5.1.4.1.1.13.1.1' => 'X-Ray 3D Angiographic Image Storage',
     '1.2.840.10008.5.1.4.1.1.13.1.2' => 'X-Ray 3D Craniofacial Image Storage',
+    '1.2.840.10008.5.1.4.1.1.13.1.3' => 'Breast Tomosynthesis Image Storage',
+    '1.2.840.10008.5.1.4.1.1.14.1' => 'Intravascular Optical Coherence Tomography Image Storage - For Presentation',
+    '1.2.840.10008.5.1.4.1.1.14.2' => 'Intravascular Optical Coherence Tomography Image Storage - For Processing',
     '1.2.840.10008.5.1.4.1.1.20' => 'Nuclear Medicine Image Storage',
     '1.2.840.10008.5.1.4.1.1.66' => 'Raw Data Storage',
     '1.2.840.10008.5.1.4.1.1.66.1' => 'Spatial Registration Storage',
@@ -3427,6 +3430,17 @@ my %implicitVR = (
     '1.2.840.10008.5.1.4.1.1.77.1.5.2' => 'Ophthalmic Photography 16 Bit Image Storage',
     '1.2.840.10008.5.1.4.1.1.77.1.5.3' => 'Stereometric Relationship Storage',
     '1.2.840.10008.5.1.4.1.1.77.1.5.4' => 'Ophthalmic Tomography Image Storage',
+    '1.2.840.10008.5.1.4.1.1.77.1.6' => 'VL Whole Slide Microscopy Image Storage',
+    '1.2.840.10008.5.1.4.1.1.78.1' => 'Lensometry Measurements Storage',
+    '1.2.840.10008.5.1.4.1.1.78.2' => 'Autorefraction Measurements Storage',
+    '1.2.840.10008.5.1.4.1.1.78.3' => 'Keratometry Measurements Storage',
+    '1.2.840.10008.5.1.4.1.1.78.4' => 'Subjective Refraction Measurements Storage',
+    '1.2.840.10008.5.1.4.1.1.78.5' => 'Visual Acuity Measurements Storage',
+    '1.2.840.10008.5.1.4.1.1.78.6' => 'Spectacle Prescription Report Storage',
+    '1.2.840.10008.5.1.4.1.1.78.7' => 'Ophthalmic Axial Measurements Storage',
+    '1.2.840.10008.5.1.4.1.1.78.8' => 'Intraocular Lens Calculations Storage',
+    '1.2.840.10008.5.1.4.1.1.79.1' => 'Macular Grid Thickness and Volume Report Storage SOP Class',
+    '1.2.840.10008.5.1.4.1.1.80.1' => 'Ophthalmic Visual Field Static Perimetry Measurements Storage',
     '1.2.840.10008.5.1.4.1.1.88.1' => 'Text SR Storage - Trial (Retired)',
     '1.2.840.10008.5.1.4.1.1.88.2' => 'Audio SR Storage - Trial (Retired)',
     '1.2.840.10008.5.1.4.1.1.88.3' => 'Detail SR Storage - Trial (Retired)',
@@ -3439,6 +3453,8 @@ my %implicitVR = (
     '1.2.840.10008.5.1.4.1.1.88.59' => 'Key Object Selection Document',
     '1.2.840.10008.5.1.4.1.1.88.65' => 'Chest CAD SR',
     '1.2.840.10008.5.1.4.1.1.88.67' => 'X-Ray Radiation Dose SR Storage',
+    '1.2.840.10008.5.1.4.1.1.88.69' => 'Colon CAD SR',
+    '1.2.840.10008.5.1.4.1.1.88.70' => 'Implantation Plan SR Document Storage',
     '1.2.840.10008.5.1.4.1.1.104.1' => 'Encapsulated PDF Storage',
     '1.2.840.10008.5.1.4.1.1.104.2' => 'Encapsulated CDA Storage',
     '1.2.840.10008.5.1.4.1.1.128' => 'Positron Emission Tomography Image Storage',
@@ -3476,14 +3492,37 @@ my %implicitVR = (
     '1.2.840.10008.5.1.4.34.4.3' => 'Unified Procedure Step - Pull SOP Class',
     '1.2.840.10008.5.1.4.34.4.4' => 'Unified Procedure Step - Event SOP Class',
     '1.2.840.10008.5.1.4.34.5' => 'Unified Worklist and Procedure Step SOP Instance',
+    '1.2.840.10008.5.1.4.34.6.1' => 'Unified Procedure Step - Push SOP Class',
+    '1.2.840.10008.5.1.4.34.6.2' => 'Unified Procedure Step - Watch SOP Class',
+    '1.2.840.10008.5.1.4.34.6.3' => 'Unified Procedure Step - Pull SOP Class',
+    '1.2.840.10008.5.1.4.34.6.4' => 'Unified Procedure Step - Event SOP Class',
+    '1.2.840.10008.5.1.4.34.7' => 'RT Beams Delivery Instruction Storage',
+    '1.2.840.10008.5.1.4.34.8' => 'RT Conventional Machine Verification',
+    '1.2.840.10008.5.1.4.34.9' => 'RT Ion Machine Verification',
     '1.2.840.10008.5.1.4.37.1' => 'General Relevant Patient Information Query',
     '1.2.840.10008.5.1.4.37.2' => 'Breast Imaging Relevant Patient Information Query',
     '1.2.840.10008.5.1.4.37.3' => 'Cardiac Relevant Patient Information Query',
     '1.2.840.10008.5.1.4.38.1' => 'Hanging Protocol Storage',
     '1.2.840.10008.5.1.4.38.2' => 'Hanging Protocol Information Model - FIND',
     '1.2.840.10008.5.1.4.38.3' => 'Hanging Protocol Information Model - MOVE',
+    '1.2.840.10008.5.1.4.39.1' => 'Color Palette Storage',
+    '1.2.840.10008.5.1.4.39.2' => 'Color Palette Information Model - FIND',
+    '1.2.840.10008.5.1.4.39.3' => 'Color Palette Information Model - MOVE',
+    '1.2.840.10008.5.1.4.39.4' => 'Color Palette Information Model - GET',
     '1.2.840.10008.5.1.4.41' => 'Product Characteristics Query SOP Class',
     '1.2.840.10008.5.1.4.42' => 'Substance Approval Query SOP Class',
+    '1.2.840.10008.5.1.4.43.1' => 'Generic Implant Template Storage',
+    '1.2.840.10008.5.1.4.43.2' => 'Generic Implant Template Information Model - FIND',
+    '1.2.840.10008.5.1.4.43.3' => 'Generic Implant Template Information Model - MOVE',
+    '1.2.840.10008.5.1.4.43.4' => 'Generic Implant Template Information Model - GET',
+    '1.2.840.10008.5.1.4.44.1' => 'Implant Assembly Template Storage',
+    '1.2.840.10008.5.1.4.44.2' => 'Implant Assembly Template Information Model - FIND',
+    '1.2.840.10008.5.1.4.44.3' => 'Implant Assembly Template Information Model - MOVE',
+    '1.2.840.10008.5.1.4.44.4' => 'Implant Assembly Template Information Model - GET',
+    '1.2.840.10008.5.1.4.45.1' => 'Implant Template Group Storage',
+    '1.2.840.10008.5.1.4.45.2' => 'Implant Template Group Information Model - FIND',
+    '1.2.840.10008.5.1.4.45.3' => 'Implant Template Group Information Model - MOVE',
+    '1.2.840.10008.5.1.4.45.4' => 'Implant Template Group Information Model - GET',
     '1.2.840.10008.15.0.3.1' => 'dicomDeviceName',
     '1.2.840.10008.15.0.3.2' => 'dicomDescription',
     '1.2.840.10008.15.0.3.3' => 'dicomManufacturer',
@@ -3531,10 +3570,10 @@ my %implicitVR = (
 # Returns: 1 on success, 0 if this wasn't a valid DICOM file
 sub ProcessDICM($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
-    my $unknown = $exifTool->Options('Unknown');
-    my $verbose = $exifTool->Options('Verbose');
+    my $unknown = $et->Options('Unknown');
+    my $verbose = $et->Options('Verbose');
     my ($hdr, $buff, $implicit, $vr, $len);
 #
 # identify the DICOM or ACR-NEMA file
@@ -3545,7 +3584,7 @@ sub ProcessDICM($$)
     if ($buff eq 'DICM') {
         # file meta information transfer syntax is explicit little endian
         SetByteOrder('II');
-        $exifTool->SetFileType('DICOM');
+        $et->SetFileType('DICOM');
     } else {
         # test for a RAW DCM image (ACR-NEMA format, ie. no header)
         foreach ('II','MM','') {
@@ -3575,7 +3614,7 @@ sub ProcessDICM($$)
             last;   # success!
         }
         $raf->Seek(0, 0) or return 0;   # rewind to start of file
-        $exifTool->SetFileType('ACR');
+        $et->SetFileType('ACR');
     }
 #
 # process the meta information
@@ -3597,7 +3636,7 @@ sub ProcessDICM($$)
             # 1.2.840.10008.1.2.x = explicit VR little endian
             # 1.2.840.10008.1.2.1.99 = deflated
             unless ($transferSyntax =~ /^1\.2\.840\.10008\.1\.2(\.\d+)?(\.\d+)?/) {
-                $exifTool->Warn("Unrecognized transfer syntax $transferSyntax");
+                $et->Warn("Unrecognized transfer syntax $transferSyntax");
                 last;
             }
             if (not $1) {
@@ -3607,7 +3646,7 @@ sub ProcessDICM($$)
                 $group = Get16u(\$buff, 0); # must get group again
             } elsif ($1 eq '.1' and $2 and $2 eq '.99') {
                 # inflate compressed data stream
-                if (eval 'require Compress::Zlib') {
+                if (eval { require Compress::Zlib }) {
                     # must use undocumented zlib feature to disable zlib header information
                     # because DICOM deflated data doesn't have the zlib header (ref 3)
                     my $wbits = -Compress::Zlib::MAX_WBITS();
@@ -3623,7 +3662,7 @@ sub ProcessDICM($$)
                                 $data .= $buf;
                                 last if $stat == Compress::Zlib::Z_STREAM_END();
                             } else {
-                                $exifTool->Warn('Error inflating compressed data stream');
+                                $et->Warn('Error inflating compressed data stream');
                                 return 1;
                             }
                         }
@@ -3634,11 +3673,11 @@ sub ProcessDICM($$)
                         $raf->Read($buff, 8) == 8 or last;
                         $group = Get16u(\$buff, 0);
                     } else {
-                        $exifTool->Warn('Error initializing inflation');
+                        $et->Warn('Error initializing inflation');
                         return 1;
                     }
                 } else {
-                    $exifTool->Warn('Install Compress::Zlib to decode compressed data stream');
+                    $et->Warn('Install Compress::Zlib to decode compressed data stream');
                     return 1;
                 }
             }
@@ -3669,8 +3708,8 @@ sub ProcessDICM($$)
             $len = 0;   # don't read value if undefined length
             if ($verbose) {
                 # start list of items in verbose output
-                $exifTool->VPrint(0, "$exifTool->{INDENT}+ [List of items]\n");
-                $exifTool->{INDENT} .= '| ';
+                $et->VPrint(0, "$$et{INDENT}+ [List of items]\n");
+                $$et{INDENT} .= '| ';
             }
         }
         # read the element value
@@ -3724,8 +3763,8 @@ sub ProcessDICM($$)
             # treat large data elements as binary data
             my $binData;
             my $lcTag = $tagInfo ? lc($$tagInfo{Name}) : 'unknown';
-            if ($exifTool->{REQ_TAG_LOOKUP}{$lcTag} or
-                ($exifTool->{OPTIONS}{Binary} and not $exifTool->{EXCL_TAG_LOOKUP}{$lcTag}))
+            if ($$et{REQ_TAG_LOOKUP}{$lcTag} or
+                ($$et{OPTIONS}{Binary} and not $$et{EXCL_TAG_LOOKUP}{$lcTag}))
             {
                 $binData = $buff;   # must make a copy
             } else {
@@ -3763,7 +3802,7 @@ sub ProcessDICM($$)
         }
 
         # handle the new tag information
-        $exifTool->HandleTag($tagTablePtr, $tag, $val,
+        $et->HandleTag($tagTablePtr, $tag, $val,
             DataPt => \$buff,
             DataPos => $pos - $len,
             Format => $format,
@@ -3773,9 +3812,9 @@ sub ProcessDICM($$)
         );
 
         # stop indenting for list if we reached EndOfItems tag
-        $exifTool->{INDENT} =~ s/..$// if $verbose and $tag eq 'FFFE,E00D';
+        $$et{INDENT} =~ s/..$// if $verbose and $tag eq 'FFFE,E00D';
     }
-    $err and $exifTool->Warn('Error reading DICOM file (corrupted?)');
+    $err and $et->Warn('Error reading DICOM file (corrupted?)');
     return 1;
 }
 
@@ -3807,7 +3846,7 @@ No translation of special characters sets is done.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -17,7 +17,7 @@ use Image::ExifTool::Exif;
 use Image::ExifTool::MakerNotes;
 use Image::ExifTool::CanonRaw;
 
-$VERSION = '1.19';
+$VERSION = '1.21';
 
 sub ProcessOriginalRaw($$$);
 sub ProcessAdobeData($$$);
@@ -143,7 +143,7 @@ sub WriteAdobeStuff($$$);
 # Returns: 1 on success, otherwise returns 0 and sets a Warning
 sub ProcessOriginalRaw($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $start = $$dirInfo{DirStart};
     my $end = $start + $$dirInfo{DirLen};
@@ -155,7 +155,7 @@ sub ProcessOriginalRaw($$$)
         last if $pos + 4 > $end;
         my $val = Get32u($dataPt, $pos);
         $val or $pos += 4, next; # ignore zero values
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $index);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $index);
         $tagInfo or $err = "Missing DNG tag $index", last;
         if ($index & 0x02) {
             # extract a simple file type (tags 2, 3, 6 and 7)
@@ -169,10 +169,10 @@ sub ProcessOriginalRaw($$$)
             my $tag = $$tagInfo{Name};
             # only extract this information if requested (because it takes time)
             my $lcTag = lc $tag;
-            if (($exifTool->{OPTIONS}{Binary} and not $exifTool->{EXCL_TAG_LOOKUP}{$lcTag}) or
-                $exifTool->{REQ_TAG_LOOKUP}{$lcTag})
+            if (($$et{OPTIONS}{Binary} and not $$et{EXCL_TAG_LOOKUP}{$lcTag}) or
+                $$et{REQ_TAG_LOOKUP}{$lcTag})
             {
-                unless (eval 'require Compress::Zlib') {
+                unless (eval { require Compress::Zlib }) {
                     $err = 'Install Compress::Zlib to extract compressed images';
                     last;
                 }
@@ -208,9 +208,9 @@ sub ProcessOriginalRaw($$$)
                 $pos += $len;   # skip over this block
             }
         }
-        $exifTool->FoundTag($tagInfo, $val);
+        $et->FoundTag($tagInfo, $val);
     }
-    $exifTool->Warn($err || 'Bad OriginalRawFileData') if defined $err;
+    $et->Warn($err || 'Bad OriginalRawFileData') if defined $err;
     return 1;
 }
 
@@ -220,23 +220,23 @@ sub ProcessOriginalRaw($$$)
 # Returns: 1 on success
 sub ProcessAdobeData($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dataPos = $$dirInfo{DataPos};
     my $pos = $$dirInfo{DirStart};
     my $end = $$dirInfo{DirLen} + $pos;
     my $outfile = $$dirInfo{OutFile};
-    my $verbose = $exifTool->Options('Verbose');
-    my $htmlDump = $exifTool->Options('HtmlDump');
+    my $verbose = $et->Options('Verbose');
+    my $htmlDump = $et->Options('HtmlDump');
 
     return 0 unless $$dataPt =~ /^Adobe\0/;
     unless ($outfile) {
-        $exifTool->VerboseDir($dirInfo);
+        $et->VerboseDir($dirInfo);
         # don't parse makernotes if FastScan > 1
-        my $fast = $exifTool->Options('FastScan');
+        my $fast = $et->Options('FastScan');
         return 1 if $fast and $fast > 1;
     }
-    $htmlDump and $exifTool->HDump($dataPos, 6, 'Adobe DNGPrivateData header');
+    $htmlDump and $et->HDump($dataPos, 6, 'Adobe DNGPrivateData header');
     SetByteOrder('MM'); # always big endian
     $pos += 6;
     while ($pos + 8 <= $end) {
@@ -247,15 +247,15 @@ sub ProcessAdobeData($$$)
         if ($htmlDump) {
             my $name = "Adobe$tag";
             $name =~ tr/ //d;
-            $exifTool->HDump($dataPos + $pos - 8, 8, "$name header", "Data Size: $size bytes");
+            $et->HDump($dataPos + $pos - 8, 8, "$name header", "Data Size: $size bytes");
             # dump non-EXIF format data
             unless ($tag =~ /^(MakN|SR2 )$/) {
-                $exifTool->HDump($dataPos + $pos, $size, "$name data");
+                $et->HDump($dataPos + $pos, $size, "$name data");
             }
         }
         if ($verbose and not $outfile) {
-            $tagInfo or $exifTool->VPrint(0, "$$exifTool{INDENT}Unsupported DNGAdobeData record: ($tag)\n");
-            $exifTool->VerboseInfo($tag,
+            $tagInfo or $et->VPrint(0, "$$et{INDENT}Unsupported DNGAdobeData record: ($tag)\n");
+            $et->VerboseInfo($tag,
                 ref $tagInfo eq 'HASH' ? $tagInfo : undef,
                 DataPt => $dataPt,
                 DataPos => $dataPos,
@@ -272,7 +272,7 @@ sub ProcessAdobeData($$$)
                         # copy value across to outfile
                         $value = substr($$dataPt, $pos, $size);
                     } else {
-                        $exifTool->HandleTag($tagTablePtr, $tag, substr($$dataPt, $pos, $size));
+                        $et->HandleTag($tagTablePtr, $tag, substr($$dataPt, $pos, $size));
                     }
                     last;
                 }
@@ -295,12 +295,12 @@ sub ProcessAdobeData($$$)
             );
             if ($outfile) {
                 $dirInfo{Proc} = $processProc;  # WriteAdobeStuff() calls this to do the actual writing
-                $value = $exifTool->WriteDirectory(\%dirInfo, $subTable, \&WriteAdobeStuff);
+                $value = $et->WriteDirectory(\%dirInfo, $subTable, \&WriteAdobeStuff);
                 # use old directory if an error occurred
                 defined $value or $value = substr($$dataPt, $pos, $size);
             } else {
                 # override process proc for MakN
-                $exifTool->ProcessDirectory(\%dirInfo, $subTable, $processProc);
+                $et->ProcessDirectory(\%dirInfo, $subTable, $processProc);
             }
             last;
         }
@@ -313,7 +313,7 @@ sub ProcessAdobeData($$$)
         $pos += $size;
         ++$pos if $size & 0x01; # (darn padding)
     }
-    $pos == $end or $exifTool->Warn("$pos $end Adobe private data is corrupt");
+    $pos == $end or $et->Warn("$pos $end Adobe private data is corrupt");
     return 1;
 }
 
@@ -326,12 +326,12 @@ sub ProcessAdobeData($$$)
 #   pulled the bonehead move of reformatting the CRW information
 sub ProcessAdobeCRW($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $start = $$dirInfo{DirStart};
     my $end = $start + $$dirInfo{DirLen};
-    my $verbose = $exifTool->Options('Verbose');
-    my $buildMakerNotes = $exifTool->Options('MakerNotes');
+    my $verbose = $et->Options('Verbose');
+    my $buildMakerNotes = $et->Options('MakerNotes');
     my $outfile = $$dirInfo{OutFile};
     my ($newTags, $oldChanged);
 
@@ -341,16 +341,16 @@ sub ProcessAdobeCRW($$$)
     return 0 unless $byteOrder =~ /^(II|MM)$/;
 
     # initialize maker note data if building maker notes
-    $buildMakerNotes and Image::ExifTool::CanonRaw::InitMakerNotes($exifTool);
+    $buildMakerNotes and Image::ExifTool::CanonRaw::InitMakerNotes($et);
 
     my $entries = Get16u($dataPt, $start + 2);
     my $pos = $start + 4;
-    $exifTool->VerboseDir($dirInfo, $entries) unless $outfile;
+    $et->VerboseDir($dirInfo, $entries) unless $outfile;
     if ($outfile) {
         # get hash of new tags
-        $newTags = $exifTool->GetNewTagInfoHash($tagTablePtr);
+        $newTags = $et->GetNewTagInfoHash($tagTablePtr);
         $$outfile = substr($$dataPt, $start, 4);
-        $oldChanged = $exifTool->{CHANGED};
+        $oldChanged = $$et{CHANGED};
     }
     # loop through entries in Adobe CRW information
     my $index;
@@ -365,7 +365,7 @@ sub ProcessAdobeCRW($$$)
         my $tagType = ($tag >> 8) & 0x38;   # get tag type
         my $format = $Image::ExifTool::CanonRaw::crwTagFormat{$tagType};
         my $count;
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID, \$value);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID, \$value);
         if ($tagInfo) {
             $format = $$tagInfo{Format} if $$tagInfo{Format};
             $count = $$tagInfo{Count};
@@ -405,9 +405,9 @@ sub ProcessAdobeCRW($$$)
                     );
                     #### eval Validate ($dirData, $subdirStart, $size)
                     if (defined $$subdir{Validate} and not eval $$subdir{Validate}) {
-                        $exifTool->Warn("Invalid $name data");
+                        $et->Warn("Invalid $name data");
                     } else {
-                        $subdir = $exifTool->WriteDirectory(\%subdirInfo, $newTagTable);
+                        $subdir = $et->WriteDirectory(\%subdirInfo, $newTagTable);
                         if (defined $subdir and length $subdir) {
                             if ($subdirStart) {
                                 # add header before data directory
@@ -418,9 +418,9 @@ sub ProcessAdobeCRW($$$)
                         }
                     }
                 } elsif ($$newTags{$tagID}) {
-                    my $nvHash = $exifTool->GetNewValueHash($tagInfo);
-                    if ($exifTool->IsOverwriting($nvHash, $val)) {
-                        my $newVal = $exifTool->GetNewValues($nvHash);
+                    my $nvHash = $et->GetNewValueHash($tagInfo);
+                    if ($et->IsOverwriting($nvHash, $val)) {
+                        my $newVal = $et->GetNewValues($nvHash);
                         my $verboseVal;
                         $verboseVal = $newVal if $verbose > 1;
                         # convert to specified format if necessary
@@ -428,10 +428,10 @@ sub ProcessAdobeCRW($$$)
                             $newVal = WriteValue($newVal, $format, $count);
                         }
                         if (defined $newVal) {
-                            $exifTool->VerboseValue("- CanonRaw:$$tagInfo{Name}", $value);
-                            $exifTool->VerboseValue("+ CanonRaw:$$tagInfo{Name}", $verboseVal);
+                            $et->VerboseValue("- CanonRaw:$$tagInfo{Name}", $value);
+                            $et->VerboseValue("+ CanonRaw:$$tagInfo{Name}", $verboseVal);
                             $value = $newVal;
-                            ++$exifTool->{CHANGED};
+                            ++$$et{CHANGED};
                         }
                     }
                 }
@@ -441,7 +441,7 @@ sub ProcessAdobeCRW($$$)
             # (verified that there is no padding here)
             $$outfile .= Set16u($tag) . Set32u(length($value)) . $value;
         } else {
-            $exifTool->HandleTag($tagTablePtr, $tagID, $val,
+            $et->HandleTag($tagTablePtr, $tagID, $val,
                 Index   => $index,
                 DataPt  => $dataPt,
                 DataPos => $$dirInfo{DataPos},
@@ -451,31 +451,31 @@ sub ProcessAdobeCRW($$$)
             );
             if ($buildMakerNotes) {
                 # build maker notes information if requested
-                Image::ExifTool::CanonRaw::BuildMakerNotes($exifTool, $tagID, $tagInfo,
+                Image::ExifTool::CanonRaw::BuildMakerNotes($et, $tagID, $tagInfo,
                                                            \$value, $format, $count);
             }
         }
         # (we lost the directory structure, but the second tag 0x0805
         # should be in the ImageDescription directory)
-        $exifTool->{DIR_NAME} = 'ImageDescription' if $tagID == 0x0805;
+        $$et{DIR_NAME} = 'ImageDescription' if $tagID == 0x0805;
         SetByteOrder('MM');
         $pos += $size;
     }
     if ($outfile and (not defined $$outfile or $index != $entries or
-        $exifTool->{CHANGED} ==  $oldChanged))
+        $$et{CHANGED} ==  $oldChanged))
     {
-        $exifTool->{CHANGED} = $oldChanged; # nothing changed
+        $$et{CHANGED} = $oldChanged; # nothing changed
         undef $$outfile;    # rewrite old directory
     }
     if ($index != $entries) {
-        $exifTool->Warn('Truncated CRW notes');
+        $et->Warn('Truncated CRW notes');
     } elsif ($pos < $end) {
-        $exifTool->Warn($end-$pos . ' extra bytes at end of CRW notes');
+        $et->Warn($end-$pos . ' extra bytes at end of CRW notes');
     }
     # finish building maker notes if necessary
     if ($buildMakerNotes) {
         SetByteOrder($byteOrder);
-        Image::ExifTool::CanonRaw::SaveMakerNotes($exifTool);
+        Image::ExifTool::CanonRaw::SaveMakerNotes($et);
     }
     return 1;
 }
@@ -487,7 +487,7 @@ sub ProcessAdobeCRW($$$)
 # Notes: data has 4 byte header (2 for byte order and 2 for entry count)
 sub ProcessAdobeMRW($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirLen = $$dirInfo{DirLen};
     my $dirStart = $$dirInfo{DirStart};
@@ -499,7 +499,7 @@ sub ProcessAdobeMRW($$$)
     $buff .= substr($$dataPt, $dirStart + 4, $dirLen - 4);
     my $raf = new File::RandomAccess(\$buff);
     my %dirInfo = ( RAF => $raf, OutFile => $outfile );
-    my $rtnVal = Image::ExifTool::MinoltaRaw::ProcessMRW($exifTool, \%dirInfo);
+    my $rtnVal = Image::ExifTool::MinoltaRaw::ProcessMRW($et, \%dirInfo);
     if ($outfile and defined $$outfile and length $$outfile) {
         # remove MRW header and add Adobe header
         $$outfile = substr($$dataPt, $dirStart, 4) . substr($$outfile, 8);
@@ -513,7 +513,7 @@ sub ProcessAdobeMRW($$$)
 # Returns: 1 on success, otherwise returns 0 and sets a Warning
 sub ProcessAdobeRAF($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     return 0 if $$dirInfo{OutFile}; # (can't write this yet)
     my $dataPt = $$dirInfo{DataPt};
     my $pos = $$dirInfo{DirStart};
@@ -524,10 +524,10 @@ sub ProcessAdobeRAF($$$)
     if ($pos + 2 <= $dirEnd and SetByteOrder(substr($$dataPt, $pos, 2))) {
         $pos += 2;
     } else {
-        $exifTool->Warn('Invalid DNG RAF data');
+        $et->Warn('Invalid DNG RAF data');
         return 0;
     }
-    $exifTool->VerboseDir($dirInfo);
+    $et->VerboseDir($dirInfo);
     # make fake RAF object for processing (same acronym, different meaning)
     my $raf = new File::RandomAccess($dataPt);
     my $num = '';
@@ -545,12 +545,12 @@ sub ProcessAdobeRAF($$$)
             RAF      => $raf,
             DirStart => $pos - $len,
         );
-        $$exifTool{SET_GROUP1} = "RAF$num";
-        $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr) or $warn = 1;
-        delete $$exifTool{SET_GROUP1};
+        $$et{SET_GROUP1} = "RAF$num";
+        $et->ProcessDirectory(\%dirInfo, $tagTablePtr) or $warn = 1;
+        delete $$et{SET_GROUP1};
         $num = ($num || 1) + 1;
     }
-    $warn and $exifTool->Warn('Possibly corrupt RAF information');
+    $warn and $et->Warn('Possibly corrupt RAF information');
     return 1;
 }
 
@@ -561,7 +561,7 @@ sub ProcessAdobeRAF($$$)
 # Notes: data has 6 byte header (2 for byte order and 4 for original offset)
 sub ProcessAdobeSR2($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     return 0 if $$dirInfo{OutFile}; # (can't write this yet)
     my $dataPt = $$dirInfo{DataPt};
     my $start = $$dirInfo{DirStart};
@@ -572,7 +572,7 @@ sub ProcessAdobeSR2($$$)
     my $originalPos = Get32u($dataPt, $start + 2);
     return 0 unless SetByteOrder(substr($$dataPt, $start, 2));
 
-    $exifTool->VerboseDir($dirInfo);
+    $et->VerboseDir($dirInfo);
     my $dataPos = $$dirInfo{DataPos};
     my $dirStart = $start + 6;  # pointer to maker note directory
     my $dirLen = $len - 6;
@@ -589,11 +589,11 @@ sub ProcessAdobeSR2($$$)
         DirLen    => $dirLen,
         Parent    => $$dirInfo{DirName},
     );
-    if ($exifTool->Options('HtmlDump')) {
-        $exifTool->HDump($dataPos + $start, 6, 'Adobe SR2 data');
+    if ($et->Options('HtmlDump')) {
+        $et->HDump($dataPos + $start, 6, 'Adobe SR2 data');
     }
     # parse the SR2 directory
-    $exifTool->ProcessDirectory(\%subdirInfo, $tagTablePtr);
+    $et->ProcessDirectory(\%subdirInfo, $tagTablePtr);
     return 1;
 }
 
@@ -604,7 +604,7 @@ sub ProcessAdobeSR2($$$)
 # Notes: data has 2 byte header (byte order of the data)
 sub ProcessAdobeIFD($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     return 0 if $$dirInfo{OutFile}; # (can't write this yet)
     my $dataPt = $$dirInfo{DataPt};
     my $pos = $$dirInfo{DirStart};
@@ -619,7 +619,7 @@ sub ProcessAdobeIFD($$$)
     # - byte order of IFD entires is always big-endian, but byte order of data changes
     SetByteOrder('MM');     # IFD structure is always big-endian
     my $entries = Get16u($dataPt, $pos + 2);
-    $exifTool->VerboseDir($dirInfo, $entries);
+    $et->VerboseDir($dirInfo, $entries);
     $pos += 4;
 
     my $end = $pos + $$dirInfo{DirLen};
@@ -632,7 +632,7 @@ sub ProcessAdobeIFD($$$)
         my $count = Get32u($dataPt, $pos+4);
         if ($format < 1 or $format > 13) {
             # warn unless the IFD was just padded with zeros
-            $format and $exifTool->Warn(
+            $format and $et->Warn(
                 sprintf("Unknown format ($format) for $$dirInfo{DirName} tag 0x%x",$tagID));
             return 0; # must be corrupted
         }
@@ -641,7 +641,7 @@ sub ProcessAdobeIFD($$$)
         my $formatStr = $Image::ExifTool::Exif::formatName[$format];
         SetByteOrder($dataOrder);   # data stored in native order
         my $val = ReadValue($dataPt, $pos + 8, $formatStr, $count, $size);
-        $exifTool->HandleTag($tagTablePtr, $tagID, $val,
+        $et->HandleTag($tagTablePtr, $tagID, $val,
             Index   => $index,
             DataPt  => $dataPt,
             DataPos => $dataPos,
@@ -651,7 +651,7 @@ sub ProcessAdobeIFD($$$)
         $pos += 8 + $size;
     }
     if ($index < $entries) {
-        $exifTool->Warn("Truncated $$dirInfo{DirName} directory");
+        $et->Warn("Truncated $$dirInfo{DirName} directory");
         return 0;
     }
     return 1;
@@ -664,7 +664,7 @@ sub ProcessAdobeIFD($$$)
 # Notes: data has 6 byte header (2 for byte order and 4 for original offset)
 sub ProcessAdobeMakN($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $start = $$dirInfo{DirStart};
     my $len = $$dirInfo{DirLen};
@@ -675,13 +675,13 @@ sub ProcessAdobeMakN($$$)
     my $originalPos = Get32u($dataPt, $start + 2);
     return 0 unless SetByteOrder(substr($$dataPt, $start, 2));
 
-    $exifTool->VerboseDir($dirInfo) unless $outfile;
+    $et->VerboseDir($dirInfo) unless $outfile;
     my $dataPos = $$dirInfo{DataPos};
     my $dirStart = $start + 6;  # pointer to maker note directory
     my $dirLen = $len - 6;
 
     my $hdr = substr($$dataPt, $dirStart, $dirLen < 48 ? $dirLen : 48);
-    my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, 'MakN', \$hdr);
+    my $tagInfo = $et->GetTagInfo($tagTablePtr, 'MakN', \$hdr);
     return 0 unless $tagInfo and $$tagInfo{SubDirectory};
     my $subdir = $$tagInfo{SubDirectory};
     my $subTable = GetTagTable($$subdir{TagTable});
@@ -701,14 +701,14 @@ sub ProcessAdobeMakN($$$)
         Parent    => $$dirInfo{DirName},
     );
     # look for start of maker notes IFD
-    my $loc = Image::ExifTool::MakerNotes::LocateIFD($exifTool,\%subdirInfo);
+    my $loc = Image::ExifTool::MakerNotes::LocateIFD($et,\%subdirInfo);
     unless (defined $loc) {
-        $exifTool->Warn('Maker notes could not be parsed');
+        $et->Warn('Maker notes could not be parsed');
         return 0;
     }
-    if ($exifTool->Options('HtmlDump')) {
-        $exifTool->HDump($dataPos + $start, 6, 'Adobe MakN data');
-        $exifTool->HDump($dataPos + $dirStart, $loc, "$$tagInfo{Name} header") if $loc;
+    if ($et->Options('HtmlDump')) {
+        $et->HDump($dataPos + $start, 6, 'Adobe MakN data');
+        $et->HDump($dataPos + $dirStart, $loc, "$$tagInfo{Name} header") if $loc;
     }
 
     my $fix = 0;
@@ -721,11 +721,11 @@ sub ProcessAdobeMakN($$$)
     if ($outfile) {
         # rewrite the maker notes directory
         my $fixup = $subdirInfo{Fixup} = new Image::ExifTool::Fixup;
-        my $oldChanged = $$exifTool{CHANGED};
-        my $buff = $exifTool->WriteDirectory(\%subdirInfo, $subTable);
+        my $oldChanged = $$et{CHANGED};
+        my $buff = $et->WriteDirectory(\%subdirInfo, $subTable);
         # nothing to do if error writing directory or nothing changed
-        unless (defined $buff and $exifTool->{CHANGED} != $oldChanged) {
-            $exifTool->{CHANGED} = $oldChanged;
+        unless (defined $buff and $$et{CHANGED} != $oldChanged) {
+            $$et{CHANGED} = $oldChanged;
             return 1;
         }
         # deleting maker notes if directory is empty
@@ -752,10 +752,10 @@ sub ProcessAdobeMakN($$$)
         $$outfile = $header . $buff;
     } else {
         # parse the maker notes directory
-        $exifTool->ProcessDirectory(\%subdirInfo, $subTable, $$subdir{ProcessProc});
+        $et->ProcessDirectory(\%subdirInfo, $subTable, $$subdir{ProcessProc});
         # extract maker notes as a block if specified
-        if ($exifTool->Options('MakerNotes') or
-            $exifTool->{REQ_TAG_LOOKUP}{lc($$tagInfo{Name})})
+        if ($et->Options('MakerNotes') or
+            $$et{REQ_TAG_LOOKUP}{lc($$tagInfo{Name})})
         {
             my $val;
             if ($$tagInfo{MakerNotes}) {
@@ -764,16 +764,16 @@ sub ProcessAdobeMakN($$$)
                 $subdirInfo{DirStart} = $dirStart;
                 $subdirInfo{DirLen}   = $dirLen;
                 # rebuild the maker notes to identify all offsets that require fixing up
-                $val = Image::ExifTool::Exif::RebuildMakerNotes($exifTool, $subTable, \%subdirInfo);
+                $val = Image::ExifTool::Exif::RebuildMakerNotes($et, $subTable, \%subdirInfo);
                 if (not defined $val and $dirLen > 4) {
-                    $exifTool->Warn('Error rebuilding maker notes (may be corrupt)');
+                    $et->Warn('Error rebuilding maker notes (may be corrupt)');
                 }
             } else {
                 # extract this directory as a block if specified
                 return 1 unless $$tagInfo{Writable};
             }
             $val = substr($$dataPt, 20) unless defined $val;
-            $exifTool->FoundTag($tagInfo, $val);
+            $et->FoundTag($tagInfo, $val);
         }
     }
     return 1;
@@ -785,12 +785,12 @@ sub ProcessAdobeMakN($$$)
 # Returns: new data block (may be empty if directory is deleted) or undef on error
 sub WriteAdobeStuff($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    $exifTool or return 1;    # allow dummy access
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    $et or return 1;    # allow dummy access
     my $proc = $$dirInfo{Proc} || \&ProcessAdobeData;
     my $buff;
     $$dirInfo{OutFile} = \$buff;
-    &$proc($exifTool, $dirInfo, $tagTablePtr) or undef $buff;
+    &$proc($et, $dirInfo, $tagTablePtr) or undef $buff;
     return $buff;
 }
 
@@ -813,7 +813,7 @@ information in DNG (Digital Negative) images.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -0,0 +1,151 @@
+#------------------------------------------------------------------------------
+# File:         DPX.pm
+#
+# Description:  Read DPX meta information
+#
+# Revisions:    2013-09-19 - P. Harvey created
+#
+# References:   1) http://www.cineon.com/ff_draft.php
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::DPX;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.01';
+
+# DPX tags
+%Image::ExifTool::DPX::Main = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' },
+    NOTES => 'Tags extracted from DPX (Digital Picture Exchange) images.',
+    0   => { Name => 'ByteOrder',     Format => 'undef[4]', PrintConv => { SDPX => 'Big-endian', XPDS => 'Little-endian' } },
+    8   => { Name => 'HeaderVersion', Format => 'string[8]' },
+    # 24 => { Name => 'GenericHeaderSize', Format => 'int32u' }, # = 1664
+    # 28 => { Name => 'IndustryStandardHeaderSize', Format => 'int32u' }, # = 384
+    16  => { Name => 'DPXFileSize',   Format => 'int32u' },
+    20  => { Name => 'DittoKey',      Format => 'int32u', PrintConv => { 0 => 'Same', 1 => 'New' } },
+    36  => { Name => 'ImageFileName', Format => 'string[100]' },
+    136 => {
+        Name => 'CreateDate',
+        Format => 'string[24]',
+        Groups => { 2 => 'Time' },
+        ValueConv => '$val =~ s/(\d{4}:\d{2}:\d{2}):/$1 /; $val',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    160 => { Name => 'Creator',       Format => 'string[100]', Groups => { 2 => 'Author' } },
+    260 => { Name => 'Project',       Format => 'string[200]' },
+    460 => { Name => 'Copyright',     Format => 'string[200]', Groups => { 2 => 'Author' } },
+    660 => { Name => 'EncryptionKey', Format => 'int32u', PrintConv => 'sprintf("%.8x",$val)' },
+    768 => {
+        Name => 'Orientation',
+        Format => 'int16u',
+        PrintConv => {
+            0 => 'Horizontal (normal)',
+            1 => 'Mirror vertical',
+            2 => 'Mirror horizontal',
+            3 => 'Rotate 180',
+            4 => 'Mirror horizontal and rotate 270 CW',
+            5 => 'Rotate 90 CW',
+            6 => 'Rotate 270 CW',
+            7 => 'Mirror horizontal and rotate 90 CW',
+        },
+    },
+    770 => { Name => 'ImageElements', Format => 'int16u' },
+    772 => { Name => 'ImageWidth',    Format => 'int32u' },
+    776 => { Name => 'ImageHeight',   Format => 'int32u' },
+    780 => { Name => 'DataSign',      Format => 'int32u', PrintConv => { 0 => 'Unsigned', 1 => 'Signed' } },
+    803 => { Name => 'BitDepth',      Format => 'int8u' },
+    820 => { Name => 'ImageDescription',  Format => 'string[32]' },
+    892 => { Name => 'Image2Description', Format => 'string[32]', RawConv => '$val=~/[^\xff]/ ? $val : undef' },
+    964 => { Name => 'Image3Description', Format => 'string[32]', RawConv => '$val=~/[^\xff]/ ? $val : undef' },
+    1036=> { Name => 'Image4Description', Format => 'string[32]', RawConv => '$val=~/[^\xff]/ ? $val : undef' },
+    1108=> { Name => 'Image5Description', Format => 'string[32]', RawConv => '$val=~/[^\xff]/ ? $val : undef' },
+    1180=> { Name => 'Image6Description', Format => 'string[32]', RawConv => '$val=~/[^\xff]/ ? $val : undef' },
+    1252=> { Name => 'Image7Description', Format => 'string[32]', RawConv => '$val=~/[^\xff]/ ? $val : undef' },
+    1324=> { Name => 'Image8Description', Format => 'string[32]', RawConv => '$val=~/[^\xff]/ ? $val : undef' },
+    # 1408=> { Name => 'XOffset',           Format => 'int32u' },
+    # 1412=> { Name => 'YOffset',           Format => 'int32u' },
+    # 1416=> { Name => 'XCenter',           Format => 'float' },
+    # 1420=> { Name => 'YCenter',           Format => 'float' },
+    # 1424=> { Name => 'XOriginalSize',     Format => 'int32u' },
+    # 1428=> { Name => 'YOriginalSize',     Format => 'int32u' },
+    1432=> { Name => 'SourceFileName',    Format => 'string[100]' },
+    1532=> { Name => 'SourceCreateDate',  Format => 'string[24]' },
+    1556=> { Name => 'InputDeviceName',   Format => 'string[32]' },
+    1588=> { Name => 'InputDeviceSerialNumber', Format => 'string[32]' },
+    # 1620=> { Name => 'AspectRatio',       Format => 'int32u' },
+    1732 => { Name => 'FrameID',          Format => 'string[32]' },
+    1764 => { Name => 'SlateInformation', Format => 'string[100]' },
+    2048 => { Name => 'UserID',           Format => 'string[32]' },
+);
+
+#------------------------------------------------------------------------------
+# Extract EXIF information from a DPX image
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid DPX file
+sub ProcessDPX($$)
+{
+    my ($et, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $buff;
+
+    # verify this is a valid DPX file
+    return 0 unless $raf->Read($buff, 2080) == 2080;
+    return 0 unless $buff =~ /^(SDPX|XPDS)/;
+    SetByteOrder($1 eq 'SDPX' ? 'MM' : 'II');
+    $et->SetFileType();   # set the FileType tag
+    my $hdrLen = Get32u(\$buff,24) + Get32u(\$buff,28);
+    $hdrLen == 2048 or $et->Warn("Unexpected DPX header length ($hdrLen)");
+    my %dirInfo = (
+        DataPt => \$buff,
+        DirStart => 0,
+        DirLen => length($buff),
+    );
+    my $tagTablePtr = GetTagTable('Image::ExifTool::DPX::Main');
+    $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
+
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::DPX - Read DPX meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to read
+metadata from DPX (Digital Picture Exchange) images.
+
+=head1 AUTHOR
+
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.cineon.com/ff_draft.php>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/DPX Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
@@ -15,7 +15,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.00';
+$VERSION = '1.01';
 
 # DV profiles (ref 1)
 my @dvProfiles = (
@@ -159,7 +159,7 @@ my @dvTags = (
 # Returns: 1 on success, 0 if this wasn't a valid DV file
 sub ProcessDV($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     local $_;
     my $raf = $$dirInfo{RAF};
     my ($buff, $start, $profile, $tag, $i, $j);
@@ -179,7 +179,7 @@ sub ProcessDV($$)
     # must at least have a full DIF header
     return 0 if $start + 80 * 6 > $len;
 
-    $exifTool->SetFileType();
+    $et->SetFileType();
 
     my $pos = $start;
     my $dsf = Get8u(\$buff, $pos + 3) & 0x80 >> 7;
@@ -194,13 +194,13 @@ sub ProcessDV($$)
             $profile = $_;
             last;
         }
-        $profile or $exifTool->Warn("Unrecognized DV profile"), return 1;
+        $profile or $et->Warn("Unrecognized DV profile"), return 1;
     }
     my $tagTablePtr = GetTagTable('Image::ExifTool::DV::Main');
 
     # calculate total bit rate and duration
     my $byteRate = $$profile{FrameSize} * $$profile{FrameRate};
-    my $fileSize = $$exifTool{VALUE}{FileSize};
+    my $fileSize = $$et{VALUE}{FileSize};
     $$profile{TotalBitrate} = 8 * $byteRate;
     $$profile{Duration} = $fileSize / $byteRate if defined $fileSize;
 
@@ -270,7 +270,7 @@ sub ProcessDV($$)
     # save our metadata
     foreach $tag (@dvTags) {
         next unless defined $$profile{$tag};
-        $exifTool->HandleTag($tagTablePtr, $tag, $$profile{$tag});
+        $et->HandleTag($tagTablePtr, $tag, $$profile{$tag});
     }
 
     return 1;
@@ -295,7 +295,7 @@ information from DV (raw Digital Video) files.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -14,7 +14,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool::XMP;
 
-$VERSION = '1.00';
+$VERSION = '1.01';
 
 my %dateTimeInfo = (
     # NOTE: Do NOT put "Groups" here because Groups hash must not be common!
@@ -79,6 +79,7 @@ my %dateTimeInfo = (
             latestAgeOrHighestStage     => { },
             latestEonOrHighestEonothem  => { },
             latestEpochOrHighestSeries  => { },
+            latestEraOrHighestErathem   => { },
             latestPeriodOrHighestSystem => { },
             lithostratigraphicTerms     => { },
             lowestBiostratigraphicZone  => { },
@@ -99,6 +100,7 @@ my %dateTimeInfo = (
             identificationQualifier     => { },
             identificationReferences    => { },
             identificationRemarks       => { },
+            identificationVerificationStatus => { },
             identifiedBy                => { },
             typeStatus                  => { },
         },
@@ -135,15 +137,15 @@ my %dateTimeInfo = (
             individualCount             => { },
             individualID                => { },
             lifeStage                   => { },
-            occurrenceRemarks           => { },
             occurrenceDetails           => { },
             occurrenceID                => { },
+            occurrenceRemarks           => { },
             occurrenceStatus            => { },
             otherCatalogNumbers         => { },
             preparations                => { },
             previousIdentifications     => { },
-            recordNumber                => { },
             recordedBy                  => { },
+            recordNumber                => { },
             reproductiveCondition       => { },
             sex                         => { },
         },
@@ -199,10 +201,12 @@ my %dateTimeInfo = (
             nameAccordingToID           => { },
             namePublishedIn             => { },
             namePublishedInID           => { },
+            namePublishedInYear         => { },
             nomenclaturalCode           => { },
             nomenclaturalStatus         => { },
             order                       => { },
             originalNameUsage           => { },
+            originalNameUsageID         => { },
             parentNameUsage             => { },
             parentNameUsageID           => { },
             phylum                      => { },
@@ -239,15 +243,16 @@ my %dateTimeInfo = (
             county                      => { },
             decimalLatitude             => { },
             decimalLongitude            => { },
-            footprintSRS                => { },
             footprintSpatialFit         => { },
+            footprintSRS                => { },
             footprintWKT                => { },
             geodeticDatum               => { },
+            georeferencedBy             => { },
+            georeferencedDate           => { },
             georeferenceProtocol        => { },
             georeferenceRemarks         => { },
             georeferenceSources         => { },
             georeferenceVerificationStatus => { },
-            georeferencedBy             => { },
             higherGeography             => { },
             higherGeographyID           => { },
             island                      => { },
@@ -265,8 +270,8 @@ my %dateTimeInfo = (
             municipality                => { },
             pointRadiusSpatialFit       => { },
             stateProvince               => { },
-            verbatimCoordinateSystem    => { },
             verbatimCoordinates         => { },
+            verbatimCoordinateSystem    => { },
             verbatimDepth               => { },
             verbatimElevation           => { },
             verbatimLatitude            => { },
@@ -296,7 +301,7 @@ This file contains tag definitions for the Darwin Core XMP namespace.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -18,7 +18,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.03';
+$VERSION = '1.05';
 
 sub ParseAnt($);
 sub ProcessAnt($$$);
@@ -28,7 +28,10 @@ sub ProcessBZZ($$$);
 # DjVu chunks that we parse (ref 4)
 %Image::ExifTool::DjVu::Main = (
     GROUPS => { 2 => 'Image' },
-    NOTES => 'Information is extracted from the following chunks in DjVu images.',
+    NOTES => q{
+        Information is extracted from the following chunks in DjVu images. See
+        L<http://www.djvu.org/> for the DjVu specification.
+    },
     INFO => {
         SubDirectory => { TagTable => 'Image::ExifTool::DjVu::Info' },
     },
@@ -246,7 +249,7 @@ Tok: for (;;) {
 # Returns: 1 on success
 sub ProcessAnt($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
 
     # quick pre-scan to check for metadata or XMP
@@ -264,10 +267,10 @@ sub ProcessAnt($$$)
         next if ref $tag or not defined $$tagTablePtr{$tag};
         if ($tag eq 'metadata') {
             # ProcessMeta() takes array reference
-            $exifTool->HandleTag($tagTablePtr, $tag, $ant);
+            $et->HandleTag($tagTablePtr, $tag, $ant);
         } else {
             next if ref $$ant[0];   # only process simple values
-            $exifTool->HandleTag($tagTablePtr, $tag, $$ant[0]);
+            $et->HandleTag($tagTablePtr, $tag, $$ant[0]);
         }
     }
     return 1;
@@ -280,10 +283,10 @@ sub ProcessAnt($$$)
 # Notes: input dirInfo DataPt is a reference to a list of pre-parsed metadata entries
 sub ProcessMeta($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     return 0 unless ref $$dataPt eq 'ARRAY';
-    $exifTool->VerboseDir('Metadata', scalar @$$dataPt);
+    $et->VerboseDir('Metadata', scalar @$$dataPt);
     my ($item, $err);
     foreach $item (@$$dataPt) {
         # make sure item is a simple tag/value pair
@@ -296,9 +299,9 @@ sub ProcessMeta($$$)
             length $name or $err = 1, next;
             AddTagToTable($tagTablePtr, $$item[0], { Name => ucfirst($name) });
         }
-        $exifTool->HandleTag($tagTablePtr, $$item[0], $$item[1]);
+        $et->HandleTag($tagTablePtr, $$item[0], $$item[1]);
     }
-    $err and $exifTool->Warn('Ignored invalid metadata entry(s)');
+    $err and $et->Warn('Ignored invalid metadata entry(s)');
     return 1;
 }
 
@@ -308,24 +311,24 @@ sub ProcessMeta($$$)
 # Returns: 1 on success
 sub ProcessBZZ($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     require Image::ExifTool::BZZ;
     my $buff = Image::ExifTool::BZZ::Decode($$dirInfo{DataPt});
     unless (defined $buff) {
-        $exifTool->Warn("Error decoding $$dirInfo{DirName}");
+        $et->Warn("Error decoding $$dirInfo{DirName}");
         return 0;
     }
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     if ($verbose >= 3) {
         # dump the decoded data in very verbose mode
-        $exifTool->VerboseDir("Decoded $$dirInfo{DirName}", 0, length $buff);
-        $exifTool->VerboseDump(\$buff);
+        $et->VerboseDir("Decoded $$dirInfo{DirName}", 0, length $buff);
+        $et->VerboseDump(\$buff);
     }
     $$dirInfo{DataPt} = \$buff;
     $$dirInfo{DataLen} = $$dirInfo{DirLen} = length $buff;
     # process the data using the default process proc for this table
     my $processProc = $$tagTablePtr{PROCESS_PROC} or return 0;
-    return &$processProc($exifTool, $dirInfo, $tagTablePtr);
+    return &$processProc($et, $dirInfo, $tagTablePtr);
 }
 
 1;  # end
@@ -348,7 +351,7 @@ Image::ExifTool::AIFF.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -21,7 +21,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.06';
+$VERSION = '1.07';
 
 sub ProcessPEResources($$);
 sub ProcessPEVersion($$);
@@ -726,16 +726,16 @@ my %languageCode = (
 # Returns: 1 on success, 0 if this wasn't a valid CHM file
 sub ProcessCHM($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my $buff;
 
     return 0 unless $raf->Read($buff, 56) == 56 and
         $buff =~ /^ITSF.{20}\x10\xfd\x01\x7c\xaa\x7b\xd0\x11\x9e\x0c\0\xa0\xc9\x22\xe6\xec/s;
     my $tagTablePtr = GetTagTable('Image::ExifTool::EXE::CHM');
-    $exifTool->SetFileType();
+    $et->SetFileType();
     SetByteOrder('II');
-    $exifTool->ProcessDirectory({ DataPt => \$buff }, $tagTablePtr);
+    $et->ProcessDirectory({ DataPt => \$buff }, $tagTablePtr);
     return 1;
 }
 
@@ -746,7 +746,7 @@ sub ProcessCHM($$)
 #          1) end pos (rounded up to nearest 4 bytes)
 sub ReadUnicodeStr($$;$)
 {
-    my ($dataPt, $pos, $exifTool) = @_;
+    my ($dataPt, $pos, $et) = @_;
     my $len = length $$dataPt;
     my $str = '';
     while ($pos + 2 <= $len) {
@@ -756,7 +756,7 @@ sub ReadUnicodeStr($$;$)
         $str .= $ch;
     }
     $pos += 2 if $pos & 0x03;
-    my $to = $exifTool ? $exifTool->Options('Charset') : 'UTF8';
+    my $to = $et ? $et->Options('Charset') : 'UTF8';
     return (Image::ExifTool::Decode(undef,$str,'UCS2','II',$to), $pos);
 }
 
@@ -766,7 +766,7 @@ sub ReadUnicodeStr($$;$)
 # Returns: true on success
 sub ProcessPEVersion($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $pos = $$dirInfo{DirStart};
     my $end = $pos + $$dirInfo{DirLen};
@@ -783,7 +783,7 @@ sub ProcessPEVersion($$)
         ($string, $strEnd) = ReadUnicodeStr($dataPt, $pos + 6);
         return 0 if $strEnd + $valLen > $end;
         unless ($index or $string eq 'VS_VERSION_INFO') {
-            $exifTool->Warn('Invalid Version Info block');
+            $et->Warn('Invalid Version Info block');
             return 0;
         }
         if ($string eq 'VS_VERSION_INFO') {
@@ -791,7 +791,7 @@ sub ProcessPEVersion($$)
             $$dirInfo{DirStart} = $strEnd;
             $$dirInfo{DirLen} = $valLen;
             my $subTablePtr = GetTagTable('Image::ExifTool::EXE::PEVersion');
-            $exifTool->ProcessDirectory($dirInfo, $subTablePtr);
+            $et->ProcessDirectory($dirInfo, $subTablePtr);
             $pos = $strEnd + $valLen;
         } elsif ($string eq 'StringFileInfo' and $valLen == 0) {
             $pos += $len;
@@ -814,8 +814,8 @@ sub ProcessPEVersion($$)
                         $char = substr($string, 4);
                         $string = substr($string, 0, 4);
                     }
-                    $exifTool->HandleTag($tagTablePtr, 'LanguageCode', uc $string);
-                    $exifTool->HandleTag($tagTablePtr, 'CharacterSet', uc $char) if $char;
+                    $et->HandleTag($tagTablePtr, 'LanguageCode', uc $string);
+                    $et->HandleTag($tagTablePtr, 'CharacterSet', uc $char) if $char;
                     next;
                 }
                 my $tag = $string;
@@ -828,11 +828,11 @@ sub ProcessPEVersion($$)
                 }
                 # get tag value (converted to current Charset)
                 if ($valLen) {
-                    ($string, $pt) = ReadUnicodeStr($dataPt, $pt, $exifTool);
+                    ($string, $pt) = ReadUnicodeStr($dataPt, $pt, $et);
                 } else {
                     $string = '';
                 }
-                $exifTool->HandleTag($tagTablePtr, $tag, $string);
+                $et->HandleTag($tagTablePtr, $tag, $string);
             }
         } else {
             $pos += $len + $valLen;
@@ -848,12 +848,12 @@ sub ProcessPEVersion($$)
 # Returns: true on success
 sub ProcessPEResources($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my $base = $$dirInfo{Base};
     my $dirStart = $$dirInfo{DirStart} + $base;
     my $level = $$dirInfo{Level} || 0;
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     my ($buff, $buf2, $item);
 
     return 0 if $level > 10;    # protect against deep recursion
@@ -873,7 +873,7 @@ sub ProcessPEResources($$)
             my $resType = $resourceType{$name} || sprintf('Unknown (0x%x)', $name);
             # ignore everything but the Version resource unless verbose
             if ($verbose) {
-                $exifTool->VPrint(0, "$resType resource:\n");
+                $et->VPrint(0, "$resType resource:\n");
             } else {
                 next unless $resType eq 'Version';
             }
@@ -883,7 +883,7 @@ sub ProcessPEResources($$)
             # descend into next directory level
             $$dirInfo{DirStart} = $entryPos & 0x7fffffff;
             $$dirInfo{Level} = $level + 1;
-            ProcessPEResources($exifTool, $dirInfo) or return 0;
+            ProcessPEResources($et, $dirInfo) or return 0;
             --$$dirInfo{Level};
         } elsif ($$dirInfo{ResType} eq 'Version' and $level == 2 and
             not $$dirInfo{GotVersion}) # (only process first Version resource)
@@ -903,12 +903,12 @@ sub ProcessPEResources($$)
             }
             return 0 unless $filePos;
             $raf->Seek($filePos, 0) and $raf->Read($buf2, $len) == $len or return 0;
-            ProcessPEVersion($exifTool, {
+            ProcessPEVersion($et, {
                 DataPt   => \$buf2,
                 DataLen  => $len,
                 DirStart => 0,
                 DirLen   => $len,
-            }) or $exifTool->Warn('Possibly corrupt Version resource');
+            }) or $et->Warn('Possibly corrupt Version resource');
             $$dirInfo{GotVersion} = 1;  # set flag so we don't do this again
         }
     }
@@ -921,7 +921,7 @@ sub ProcessPEResources($$)
 # Returns: true on success
 sub ProcessPEDict($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my $dataPt = $$dirInfo{DataPt};
     my $dirLen = length($$dataPt);
@@ -945,7 +945,7 @@ sub ProcessPEDict($$)
         ) if $name eq ".rsrc\0\0\0" and not %dirInfo;
     }
     # process the first resource section
-    ProcessPEResources($exifTool, \%dirInfo) or return 0 if %dirInfo;
+    ProcessPEResources($et, \%dirInfo) or return 0 if %dirInfo;
     return 1;
 }
 
@@ -955,7 +955,7 @@ sub ProcessPEDict($$)
 # Returns: 1 on success, 0 if this wasn't a valid EXE file
 sub ProcessEXE($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my ($buff, $buf2, $type, $tagTablePtr, %dirInfo);
 
@@ -1016,7 +1016,7 @@ sub ProcessEXE($$)
                     my $machine = $Image::ExifTool::EXE::Main{0}{PrintConv}{Get16u(\$buff, 4)} || '';
                     my $winType = $machine =~ /64/ ? 'Win64' : 'Win32';
                     my $flags = Get16u(\$buff, 22);
-                    $exifTool->SetFileType($winType . ' ' . ($flags & 0x2000 ? 'DLL' : 'EXE'));
+                    $et->SetFileType($winType . ' ' . ($flags & 0x2000 ? 'DLL' : 'EXE'));
                     # read the rest of the optional header if necessary
                     my $optSize = Get16u(\$buff, 20);
                     my $more = $optSize + 24 - $size;
@@ -1027,11 +1027,11 @@ sub ProcessEXE($$)
                             my $magic = Get16u(\$buff, 24);
                             # verify PE32/PE32+ magic number
                             unless ($magic == 0x10b or $magic == 0x20b) {
-                                $exifTool->Warn('Unknown PE magic number');
+                                $et->Warn('Unknown PE magic number');
                                 return 1;
                             }
                         } else {
-                            $exifTool->Warn('Error reading optional header');
+                            $et->Warn('Error reading optional header');
                         }
                     }
                     # process PE COFF file header
@@ -1043,7 +1043,7 @@ sub ProcessEXE($$)
                         DirStart => 4,
                         DirLen => $size,
                     );
-                    $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+                    $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
                     # process data dictionary
                     my $num = Get16u(\$buff, 6);    # NumberOfSections
                     if ($raf->Read($buff, 40 * $num) == 40 * $num) {
@@ -1051,7 +1051,7 @@ sub ProcessEXE($$)
                             RAF => $raf,
                             DataPt => \$buff,
                         );
-                        ProcessPEDict($exifTool, \%dirInfo) or $exifTool->Warn('Error processing PE data dictionary');
+                        ProcessPEDict($et, \%dirInfo) or $et->Warn('Error processing PE data dictionary');
                     }
                     return 1;
                 }
@@ -1070,24 +1070,24 @@ sub ProcessEXE($$)
         $tagTablePtr = GetTagTable('Image::ExifTool::EXE::MachO');
         if ($1 eq "\xca\xfe\xba\xbe") {
             SetByteOrder('MM');
-            $exifTool->SetFileType('Mach-O fat binary executable');
+            $et->SetFileType('Mach-O fat binary executable');
             my $count = Get32u(\$buff, 4);  # get architecture count
             my $more = $count * 20 - ($size - 8);
             if ($more > 0) {
                 unless ($raf->Read($buf2, $more) == $more) {
-                    $exifTool->Warn('Error reading fat-arch headers');
+                    $et->Warn('Error reading fat-arch headers');
                     return 1;
                 }
                 $buff .= $buf2;
                 $size += $more;
             }
-            $exifTool->HandleTag($tagTablePtr, 2, $count);
+            $et->HandleTag($tagTablePtr, 2, $count);
             my $i;
             for ($i=0; $i<$count; ++$i) {
                 my $cpuType = Get32s(\$buff, 8 + $i * 20);
                 my $cpuSubtype = Get32u(\$buff, 12 + $i * 20);
-                $exifTool->HandleTag($tagTablePtr, 3, $cpuType);
-                $exifTool->HandleTag($tagTablePtr, 4, "$cpuType $cpuSubtype");
+                $et->HandleTag($tagTablePtr, 3, $cpuType);
+                $et->HandleTag($tagTablePtr, 4, "$cpuType $cpuSubtype");
             }
             # load first Mach-O header to get the object file type
             my $offset = Get32u(\$buff, 16);
@@ -1095,18 +1095,18 @@ sub ProcessEXE($$)
                 if ($buf2 =~ /^(\xfe\xed\xfa(\xce|\xcf)|(\xce|\xcf)\xfa\xed\xfe)/) {
                     SetByteOrder($buf2 =~ /^\xfe\xed/ ? 'MM' : 'II');
                     my $objType = Get32s(\$buf2, 12);
-                    $exifTool->HandleTag($tagTablePtr, 5, $objType);
+                    $et->HandleTag($tagTablePtr, 5, $objType);
                 } elsif ($buf2 =~ /^!<arch>\x0a/) {
                     # .a libraries use this magic number
-                    $exifTool->HandleTag($tagTablePtr, 5, -1);
+                    $et->HandleTag($tagTablePtr, 5, -1);
                 } else {
-                    $exifTool->Warn('Unrecognized object file type');
+                    $et->Warn('Unrecognized object file type');
                 }
             } else {
-                $exifTool->Warn('Error reading file');
+                $et->Warn('Error reading file');
             }
        } elsif ($size >= 16) {
-            $exifTool->SetFileType('Mach-O executable');
+            $et->SetFileType('Mach-O executable');
             my $info = {
                 "\xfe\xed\xfa\xce" => ['32 bit', 'Big endian'],
                 "\xce\xfa\xed\xfe" => ['32 bit', 'Little endian'],
@@ -1118,11 +1118,11 @@ sub ProcessEXE($$)
             my $cpuType = Get32s(\$buff, 4);
             my $cpuSubtype = Get32s(\$buff, 8);
             my $objType = Get32s(\$buff, 12);
-            $exifTool->HandleTag($tagTablePtr, 0, $$info[0]);
-            $exifTool->HandleTag($tagTablePtr, 1, $$info[1]);
-            $exifTool->HandleTag($tagTablePtr, 3, $cpuType);
-            $exifTool->HandleTag($tagTablePtr, 4, "$cpuType $cpuSubtype");
-            $exifTool->HandleTag($tagTablePtr, 5, $objType);
+            $et->HandleTag($tagTablePtr, 0, $$info[0]);
+            $et->HandleTag($tagTablePtr, 1, $$info[1]);
+            $et->HandleTag($tagTablePtr, 3, $cpuType);
+            $et->HandleTag($tagTablePtr, 4, "$cpuType $cpuSubtype");
+            $et->HandleTag($tagTablePtr, 5, $objType);
         }
         return 1;
 #
@@ -1130,7 +1130,7 @@ sub ProcessEXE($$)
 #
     } elsif ($buff =~ /^Joy!peff/ and $size > 12) {
         # ref http://developer.apple.com/documentation/mac/pdf/MacOS_RT_Architectures.pdf
-        $exifTool->SetFileType('Classic MacOS executable');
+        $et->SetFileType('Classic MacOS executable');
         SetByteOrder('MM');
         $tagTablePtr = GetTagTable('Image::ExifTool::EXE::PEF');
         %dirInfo = (
@@ -1140,13 +1140,13 @@ sub ProcessEXE($$)
             DirStart => 0,
             DirLen => $size,
         );
-        $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
         return 1;
 #
 # ELF (Unix)
 #
     } elsif ($buff =~ /^\x7fELF/ and $size >= 16) {
-        $exifTool->SetFileType("ELF executable");
+        $et->SetFileType("ELF executable");
         SetByteOrder(Get8u(\$buff,5) == 1 ? 'II' : 'MM');
         $tagTablePtr = GetTagTable('Image::ExifTool::EXE::ELF');
         %dirInfo = (
@@ -1156,7 +1156,7 @@ sub ProcessEXE($$)
             DirStart => 0,
             DirLen => $size,
         );
-        $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
         return 1;
 #
 # various scripts (perl, sh, etc...)
@@ -1170,7 +1170,7 @@ sub ProcessEXE($$)
         $type = 'Static library',
     }
     return 0 unless $type;
-    $exifTool->SetFileType($type);
+    $et->SetFileType($type);
     return 1;
 }
 
@@ -1194,7 +1194,7 @@ library files.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -34,7 +34,7 @@
 #              22) http://tools.ietf.org/html/draft-ietf-fax-tiff-fx-extension1-01
 #              23) MetaMorph Stack (STK) Image File Format:
 #                  --> ftp://ftp.meta.moleculardevices.com/support/stack/STK.doc
-#              24) http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-008-2010_E.pdf (Exif 2.3)
+#              24) http://www.cipa.jp/std/documents/e/DC-008-2012_E.pdf (Exif 2.3)
 #              25) Vesa Kivisto private communication (7D)
 #              26) Jeremy Brown private communication
 #              27) Gregg Lee private communication
@@ -51,7 +51,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::MakerNotes;
 
-$VERSION = '3.51';
+$VERSION = '3.62';
 
 sub ProcessExif($$$);
 sub WriteExif($$$);
@@ -89,7 +89,7 @@ sub BINARY_DATA_LIMIT { return 10 * 1024 * 1024; }
     'rational64u' => 5,  # RATIONAL
     'int8s'       => 6,  # SBYTE
     'undef'       => 7,  # UNDEFINED
-    'binary'      => 7,  # (treat binary data as undef)
+    'binary'      => 7,  # (same as undef)
     'int16s'      => 8,  # SSHORT
     'int32s'      => 9,  # SLONG
     'rational64s' => 10, # SRATIONAL
@@ -769,6 +769,7 @@ my %sampleFormat = (
         SubDirectory => {
             DirName => 'GlobParamIFD',
             Start => '$val',
+            MaxSubdirs => 1,
         },
     },
     0x191 => { #3
@@ -1180,6 +1181,7 @@ my %sampleFormat = (
             TagTable => 'Image::ExifTool::Kodak::IFD',
             DirName => 'KodakIFD',
             Start => '$val',
+            MaxSubdirs => 1,
         },
     },
     0x8298 => {
@@ -1394,13 +1396,20 @@ my %sampleFormat = (
     0x87ac => 'ImageLayer',
     0x87af => {
         Name => 'GeoTiffDirectory',
-        Format => 'binary',
+        Format => 'undef',
         Binary => 1,
+        Notes => q{
+            these "GeoTiff" tags may read and written as a block, but they aren't
+            extracted unless specifically requested.  Byte order changes are handled
+            automatically when copying between TIFF images with different byte order
+        },
+        RawConv => '$val . GetByteOrder()', # save byte order
     },
     0x87b0 => {
         Name => 'GeoTiffDoubleParams',
-        Format => 'binary',
+        Format => 'undef',
         Binary => 1,
+        RawConv => '$val . GetByteOrder()', # save byte order
     },
     0x87b1 => {
         Name => 'GeoTiffAsciiParams',
@@ -1435,6 +1444,7 @@ my %sampleFormat = (
             DirName => 'GPS',
             TagTable => 'Image::ExifTool::GPS::Main',
             Start => '$val',
+            MaxSubdirs => 1,
         },
     },
     0x8827 => {
@@ -1508,6 +1518,7 @@ my %sampleFormat = (
         Notes => 'called DateTimeDigitized by the EXIF spec.',
         PrintConv => '$self->ConvertDateTime($val)',
     },
+    # 0x9009 - undef[44] written by Google Plus uploader - PH
     0x9101 => {
         Name => 'ComponentsConfiguration',
         Format => 'int8u',
@@ -1671,8 +1682,8 @@ my %sampleFormat = (
     0x927c => \@Image::ExifTool::MakerNotes::Main,
     0x9286 => {
         Name => 'UserComment',
-        # may consider forcing a Format of 'undef' for this tag because I have
-        # seen other applications write it incorrectly as 'string' or 'int8u'
+        # I have seen other applications write it incorrectly as 'string' or 'int8u'
+        Format => 'undef',
         RawConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val,1)',
     },
     0x9290 => {
@@ -1707,6 +1718,7 @@ my %sampleFormat = (
     0x935c => { #3/19
         Name => 'ImageSourceData',
         Binary => 1,
+        Protected => 1, # (because this can be hundreds of megabytes)
     },
     0x9c9b => {
         Name => 'XPTitle',
@@ -1773,6 +1785,7 @@ my %sampleFormat = (
         SubDirectory => {
             DirName => 'InteropIFD',
             Start => '$val',
+            MaxSubdirs => 1,
         },
     },
     0xa20b => {
@@ -2129,6 +2142,7 @@ my %sampleFormat = (
         # must set Writable here so this tag will be saved with MakerNotes option
         Writable => 'undef',
         WriteGroup => 'IFD0',
+        Binary => 1,
         # (don't make Binary/Protected because we can't copy individual PrintIM tags anyway)
         Description => 'Print Image Matching',
         SubDirectory => {
@@ -2136,6 +2150,11 @@ my %sampleFormat = (
         },
         PrintConvInv => '$val =~ /^PrintIM/ ? $val : undef',    # quick validation
     },
+    0xc573 => { #PH
+        Name => 'OriginalFileName',
+        Notes => 'used by some obscure software', # (possibly Swizzy Photosmacker?)
+        # (it is a 'string', but obscure, so don't make it writable)
+    },
     0xc580 => { #20
         Name => 'USPTOOriginalContentType',
         PrintConv => {
@@ -2242,12 +2261,21 @@ my %sampleFormat = (
         {
             Condition => '$$valPt =~ /^Adobe\0/',
             Name => 'DNGAdobeData',
+            Flags => [ 'Binary', 'Protected' ],
+            Writable => 'undef', # (writable directory!) (to make it possible to delete this mess)
+            WriteGroup => 'IFD0',
             NestedHtmlDump => 1,
             SubDirectory => { TagTable => 'Image::ExifTool::DNG::AdobeData' },
             Format => 'undef',  # written incorrectly as int8u (change to undef for speed)
         },
         {
-            Condition => '$$valPt =~ /^(PENTAX |SAMSUNG)\0/',
+            # Pentax/Samsung models that write AOC maker notes in JPG images:
+            # K-5,K-7,K-m,K-x,K-r,K10D,K20D,K100D,K110D,K200D,K2000,GX10,GX20
+            # (Note: the following expression also appears in WriteExif.pl)
+            Condition => q{
+                $$valPt =~ /^(PENTAX |SAMSUNG)\0/ and
+                $$self{Model} =~ /\b(K(-[57mrx]|(10|20|100|110|200)D|2000)|GX(10|20))\b/
+            },
             Name => 'MakerNotePentax',
             MakerNotes => 1,    # (causes "MakerNotes header" to be identified in HtmlDump output)
             Binary => 1,
@@ -2264,9 +2292,27 @@ my %sampleFormat = (
             Format => 'undef',  # written incorrectly as int8u (change to undef for speed)
         },
         {
-            Name => 'DNGPrivateData',
+            # must duplicate the above tag with a different name for more recent
+            # Pentax models which use the "PENTAX" instead of the "AOC" maker notes
+            # in JPG images (needed when copying maker notes from DNG to JPG)
+            Condition => '$$valPt =~ /^(PENTAX |SAMSUNG)\0/',
+            Name => 'MakerNotePentax5',
+            MakerNotes => 1,
             Binary => 1,
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Pentax::Main',
+                Start => '$valuePtr + 10',
+                Base => '$start - 10',
+                ByteOrder => 'Unknown',
+            },
+            Format => 'undef',
+        },
+        {
+            Name => 'DNGPrivateData',
+            Flags => [ 'Binary', 'Protected' ],
             Format => 'undef',
+            Writable => 'undef',
+            WriteGroup => 'IFD0',
         },
     ],
     0xc635 => {
@@ -3005,9 +3051,7 @@ my %sampleFormat = (
     },
     LensID => {
         Groups => { 2 => 'Camera' },
-        Require => {
-            0 => 'LensType',
-        },
+        Require => 'LensType',
         Desire => {
             1 => 'FocalLength',
             2 => 'MaxAperture',
@@ -3017,6 +3061,7 @@ my %sampleFormat = (
             6 => 'LensModel',
             7 => 'LensFocalRange',
             8 => 'LensSpec',
+            9 => 'LensType2',
         },
         Notes => q{
             attempt to identify the actual lens from all lenses with a given LensType.
@@ -3030,7 +3075,16 @@ my %sampleFormat = (
             return undef;
         },
         ValueConv => '$val',
-        PrintConv => 'Image::ExifTool::Exif::PrintLensID($self, $prt[0], $prt[8], @val)',
+        PrintConv => q{
+            my $pcv;
+            # use LensType2 instead of LensType if available and valid (Sony E-mount lenses)
+            if ($val[9] and $val[9] & 0x8000) {
+                $val[0] = $val[9];
+                $prt[0] = $prt[9];
+                $pcv = $$self{TAG_INFO}{LensType2}{PrintConv};
+            }
+            Image::ExifTool::Exif::PrintLensID($self, $prt[0], $pcv, $prt[8], @val);
+        },
     },
 );
 
@@ -3058,11 +3112,11 @@ sub AUTOLOAD
 # - sets TIFF_TYPE and FileType if identified
 sub IdentifyRawFile($$)
 {
-    my ($exifTool, $comp) = @_;
-    if ($$exifTool{FILE_TYPE} eq 'TIFF' and not $$exifTool{IdentifiedRawFile}) {
+    my ($et, $comp) = @_;
+    if ($$et{FILE_TYPE} eq 'TIFF' and not $$et{IdentifiedRawFile}) {
         if ($compression{$comp} and $compression{$comp} =~ /^\w+ ([A-Z]{3}) Compressed$/) {
-            $exifTool->OverrideFileType($$exifTool{TIFF_TYPE} = $1);
-            $$exifTool{IdentifiedRawFile} = 1;
+            $et->OverrideFileType($$et{TIFF_TYPE} = $1);
+            $$et{IdentifiedRawFile} = 1;
         }
     }
 }
@@ -3099,7 +3153,7 @@ sub CalculateLV($$$)
 # Returns: 35mm conversion factor (or undefined if it can't be calculated)
 sub CalcScaleFactor35efl
 {
-    my $exifTool = shift;
+    my $et = shift;
     my $res = $_[7];    # save resolution units (in case they have been converted to string)
     my $sensXY = $_[4];
     Image::ExifTool::ToFloat(@_);
@@ -3112,11 +3166,11 @@ sub CalcScaleFactor35efl
     my $diag = shift;
     my $sens = shift;
     # calculate Canon sensor size using a dedicated algorithm
-    if ($$exifTool{Make} eq 'Canon') {
+    if ($$et{Make} eq 'Canon') {
         require Image::ExifTool::Canon;
         my $canonDiag = Image::ExifTool::Canon::CalcSensorDiag(
-            $exifTool->{RATIONAL}{FocalPlaneXResolution},
-            $exifTool->{RATIONAL}{FocalPlaneYResolution},
+            $$et{RATIONAL}{FocalPlaneXResolution},
+            $$et{RATIONAL}{FocalPlaneYResolution},
         );
         $diag = $canonDiag if $canonDiag;
     }
@@ -3204,20 +3258,21 @@ sub ConvertFraction($)
 # Returns: text encoded according to Charset option (with trailing spaces removed)
 sub ConvertExifText($$;$)
 {
-    my ($exifTool, $val, $asciiFlex) = @_;
+    my ($et, $val, $asciiFlex) = @_;
     return $val if length($val) < 8;
     my $id = substr($val, 0, 8);
     my $str = substr($val, 8);
     # Note: allow spaces instead of nulls in the ID codes because
     # it is fairly common for camera manufacturers to get this wrong
-    if ($id =~ /^(ASCII)?[\0 ]+$/) {
+    # (also handle Canon ZoomBrowser EX 4.5 null followed by 7 bytes of garbage)
+    if ($id =~ /^(ASCII)?(\0|[\0 ]+$)/) {
         # truncate at null terminator (shouldn't have a null based on the
         # EXIF spec, but it seems that few people actually read the spec)
         $str =~ s/\0.*//s;
         # allow ASCII text to contain any other specified encoding
         if ($asciiFlex) {
-            my $enc = $exifTool->Options('CharsetEXIF');
-            $str = $exifTool->Decode($str, $enc) if $enc;
+            my $enc = $et->Options('CharsetEXIF');
+            $str = $et->Decode($str, $enc) if $enc;
         }
     # by the EXIF spec, the following string should be "UNICODE\0", but
     # apparently Kodak sometimes uses "Unicode\0" in the APP3 "Meta" information.
@@ -3226,11 +3281,11 @@ sub ConvertExifText($$;$)
     } elsif ($id =~ /^UNICODE[\0 ]$/) {
         # MicrosoftPhoto writes as little-endian even in big-endian EXIF,
         # so we must guess at the true byte ordering
-        $str = $exifTool->Decode($str, 'UCS2', 'Unknown');
+        $str = $et->Decode($str, 'UTF16', 'Unknown');
     } elsif ($id =~ /^JIS[\0 ]{5}$/) {
-        $str = $exifTool->Decode($str, 'JIS', 'Unknown');
+        $str = $et->Decode($str, 'JIS', 'Unknown');
     } else {
-        $exifTool->Warn("Invalid EXIF text encoding");
+        $et->Warn('Invalid EXIF text encoding');
         $str = $id . $str;
     }
     $str =~ s/ +$//;    # trim trailing blanks
@@ -3457,19 +3512,19 @@ sub GetLensInfo($;$)
 
 #------------------------------------------------------------------------------
 # Attempt to identify the specific lens if multiple lenses have the same LensType
-# Inputs: 0) ExifTool object ref, 1) LensType print value, 2) LensSpec print value
-#         3) LensType numerical value, 4) FocalLength, 5) MaxAperture,
-#         6) MaxApertureValue, 7) MinFocalLength, 8) MaxFocalLength, 9) LensModel,
-#         10) LensFocalRange, 11) LensSpec, 12) optional PrintConv hash ref
+# Inputs: 0) ExifTool object ref, 1) LensType print value, 2) PrintConv hash ref,
+#         3) LensSpec print value, 4) LensType numerical value, 5) FocalLength,
+#         6) MaxAperture, 7) MaxApertureValue, 8) MinFocalLength, 9) MaxFocalLength,
+#         10) LensModel, 11) LensFocalRange, 12) LensSpec
 sub PrintLensID($$@)
 {
-    my ($exifTool, $lensTypePrt, $lensSpecPrt, $lensType, $focalLength,
+    my ($et, $lensTypePrt, $printConv, $lensSpecPrt, $lensType, $focalLength,
         $maxAperture, $maxApertureValue, $shortFocal, $longFocal, $lensModel,
-        $lensFocalRange, $lensSpec, $printConv) = @_;
+        $lensFocalRange, $lensSpec) = @_;
     # the rest of the logic relies on the LensType lookup:
     return undef unless defined $lensType;
     # get print conversion hash if necessary
-    $printConv or $printConv = $exifTool->{TAG_INFO}{LensType}{PrintConv};
+    $printConv or $printConv = $$et{TAG_INFO}{LensType}{PrintConv};
     # just copy LensType PrintConv value if it was a lens name
     # (Olympus or Panasonic -- just exclude things like Nikon and Leaf LensType)
     unless (ref $printConv eq 'HASH') {
@@ -3488,7 +3543,17 @@ sub PrintLensID($$@)
     if ($lensFocalRange and $lensFocalRange =~ /^(\d+)(?: (?:to )?(\d+))?$/) {
         ($shortFocal, $longFocal) = ($1, $2 || $1);
     }
-    if ($shortFocal and $longFocal) {
+    if ($$et{Make} eq 'SONY') {
+        if (($lensType & 0xff00) == 0xef00) {
+            # patch for Metabones Canon adapter on a Sony camera (ref Jos Roost)
+            # (note: the adapter kills the high byte for 2-byte LensType values,
+            # so the reported lens will be incorrect for these)
+            require Image::ExifTool::Canon;
+            $printConv = \%Image::ExifTool::Canon::canonLensTypes;
+            $lensType &= 0xff;
+            $lensTypePrt = $$printConv{$lensType} if $$printConv{$lensType};
+        }
+    } elsif ($shortFocal and $longFocal) {
         # Canon (and some other makes) include makernote information
         # which allows better lens identification
         require Image::ExifTool::Canon;
@@ -3519,6 +3584,12 @@ sub PrintLensID($$@)
         if ($sf0) {
             next if abs($sf - $sf0) > 0.5 or abs($sa - $sa0) > 0.15 or
                     abs($lf - $lf0) > 0.5 or abs($la - $la0) > 0.15;
+            # the basic parameters match, but also check against additional lens features
+            # for Sony E lenses -- the full LensSpec string should match with end of LensType
+            $lensSpecPrt and $lens =~ /\Q$lensSpecPrt\E$/ and @best = ( $lens ), last;
+            # exactly-matching Sony E lens should have been found above, so skip
+            # any not-exactly-matching Sony E-lenses
+            next if $lens =~ /^Sony E /;
             push @best, $lens;
             next;
         }
@@ -3625,34 +3696,34 @@ sub ExifTime($)
 #          Returns undef if there was an error loading the image
 sub ExtractImage($$$$)
 {
-    my ($exifTool, $offset, $len, $tag) = @_;
-    my $dataPt = \$exifTool->{EXIF_DATA};
-    my $dataPos = $exifTool->{EXIF_POS};
+    my ($et, $offset, $len, $tag) = @_;
+    my $dataPt = \$$et{EXIF_DATA};
+    my $dataPos = $$et{EXIF_POS};
     my $image;
 
     # no image if length is zero, and don't try to extract binary from XMP file
-    return undef if not $len or $$exifTool{FILE_TYPE} eq 'XMP';
+    return undef if not $len or $$et{FILE_TYPE} eq 'XMP';
 
     # take data from EXIF block if possible
     if (defined $dataPos and $offset>=$dataPos and $offset+$len<=$dataPos+length($$dataPt)) {
         $image = substr($$dataPt, $offset-$dataPos, $len);
     } else {
-        $image = $exifTool->ExtractBinary($offset, $len, $tag);
+        $image = $et->ExtractBinary($offset, $len, $tag);
         return undef unless defined $image;
         # patch for incorrect ThumbnailOffset in some Sony DSLR-A100 ARW images
-        if ($tag and $tag eq 'ThumbnailImage' and $$exifTool{TIFF_TYPE} eq 'ARW' and
-            $$exifTool{Model} eq 'DSLR-A100' and $offset < 0x10000 and
+        if ($tag and $tag eq 'ThumbnailImage' and $$et{TIFF_TYPE} eq 'ARW' and
+            $$et{Model} eq 'DSLR-A100' and $offset < 0x10000 and
             $image !~ /^(Binary data|\xff\xd8\xff)/)
         {
-            my $try = $exifTool->ExtractBinary($offset + 0x10000, $len, $tag);
+            my $try = $et->ExtractBinary($offset + 0x10000, $len, $tag);
             if (defined $try and $try =~ /^\xff\xd8\xff/) {
                 $image = $try;
-                $exifTool->{VALUE}->{ThumbnailOffset} += 0x10000;
-                $exifTool->Warn('Adjusted incorrect A100 ThumbnailOffset', 1);
+                $$et{VALUE}{ThumbnailOffset} += 0x10000;
+                $et->Warn('Adjusted incorrect A100 ThumbnailOffset', 1);
             }
         }
     }
-    return $exifTool->ValidateImage(\$image, $tag);
+    return $et->ValidateImage(\$image, $tag);
 }
 
 #------------------------------------------------------------------------------
@@ -3663,7 +3734,7 @@ sub ExtractImage($$$$)
 # Returns: 1 on success, otherwise returns 0 and sets a Warning
 sub ProcessExif($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dataPos = $$dirInfo{DataPos} || 0;
     my $dataLen = $$dirInfo{DataLen};
@@ -3673,23 +3744,23 @@ sub ProcessExif($$$)
     my $base = $$dirInfo{Base} || 0;
     my $firstBase = $base;
     my $raf = $$dirInfo{RAF};
-    my $verbose = $exifTool->Options('Verbose');
-    my $htmlDump = $exifTool->{HTML_DUMP};
+    my $verbose = $et->Options('Verbose');
+    my $htmlDump = $$et{HTML_DUMP};
     my $success = 1;
     my ($tagKey, $dirSize, $makerAddr, $strEnc);
-    my $inMakerNotes = $tagTablePtr->{GROUPS}{0} eq 'MakerNotes';
+    my $inMakerNotes = $$tagTablePtr{GROUPS}{0} eq 'MakerNotes';
 
     # set encoding to assume for strings
-    $strEnc = $exifTool->Options('CharsetEXIF') if $$tagTablePtr{GROUPS}{0} eq 'EXIF';
+    $strEnc = $et->Options('CharsetEXIF') if $$tagTablePtr{GROUPS}{0} eq 'EXIF';
 
     # ignore non-standard EXIF while in strict MWG compatibility mode
     if ($Image::ExifTool::MWG::strict and $dirName eq 'IFD0' and
         $tagTablePtr eq \%Image::ExifTool::Exif::Main and
-        $$exifTool{FILE_TYPE} =~ /^(JPEG|TIFF|PSD)$/)
+        $$et{FILE_TYPE} =~ /^(JPEG|TIFF|PSD)$/)
     {
-        my $path = $exifTool->MetadataPath();
+        my $path = $et->MetadataPath();
         unless ($path =~ /^(JPEG-APP1-IFD0|TIFF-IFD0|PSD-EXIFInfo-IFD0)$/) {
-            $exifTool->Warn("Ignored non-standard EXIF at $path");
+            $et->Warn("Ignored non-standard EXIF at $path");
             return 1;
         }
     }
@@ -3709,7 +3780,7 @@ sub ProcessExif($$$)
         if ($dirSize > $dirLen) {
             if ($verbose > 0 and not $$dirInfo{SubIFD}) {
                 my $short = $dirSize - $dirLen;
-                $exifTool->Warn("Short directory size (missing $short bytes)");
+                $et->Warn("Short directory size (missing $short bytes)");
             }
             undef $dirSize if $dirEnd > $dataLen; # read from file if necessary
         }
@@ -3740,18 +3811,18 @@ sub ProcessExif($$$)
             }
         }
         unless ($success) {
-            $exifTool->Warn("Bad $name directory");
+            $et->Warn("Bad $name directory");
             return 0;
         }
         $numEntries = Get16u($dataPt, $dirStart);
         $dirSize = 2 + 12 * $numEntries;
         $dirEnd = $dirStart + $dirSize;
     }
-    $verbose > 0 and $exifTool->VerboseDir($dirName, $numEntries);
+    $verbose > 0 and $et->VerboseDir($dirName, $numEntries);
     my $bytesFromEnd = $dataLen - $dirEnd;
     if ($bytesFromEnd < 4) {
         unless ($bytesFromEnd==2 or $bytesFromEnd==0) {
-            $exifTool->Warn("Illegal $name directory size ($numEntries entries)");
+            $et->Warn("Illegal $name directory size ($numEntries entries)");
             return 0;
         }
     }
@@ -3759,7 +3830,7 @@ sub ProcessExif($$$)
     if (defined $$dirInfo{MakerNoteAddr}) {
         $makerAddr = $$dirInfo{MakerNoteAddr};
         delete $$dirInfo{MakerNoteAddr};
-        if (Image::ExifTool::MakerNotes::FixBase($exifTool, $dirInfo)) {
+        if (Image::ExifTool::MakerNotes::FixBase($et, $dirInfo)) {
             $base = $$dirInfo{Base};
             $dataPos = $$dirInfo{DataPos};
         }
@@ -3768,28 +3839,28 @@ sub ProcessExif($$$)
         my $longName = $name eq 'MakerNotes' ? ($$dirInfo{Name} || $name) : $name;
         if (defined $makerAddr) {
             my $hdrLen = $dirStart + $dataPos + $base - $makerAddr;
-            $exifTool->HDump($makerAddr, $hdrLen, "MakerNotes header", $longName) if $hdrLen > 0;
+            $et->HDump($makerAddr, $hdrLen, "MakerNotes header", $longName) if $hdrLen > 0;
         }
         unless ($$dirInfo{NoDumpEntryCount}) {
-            $exifTool->HDump($dirStart + $dataPos + $base, 2, "$longName entries",
-                             "Entry count: $numEntries");
+            $et->HDump($dirStart + $dataPos + $base, 2, "$longName entries",
+                       "Entry count: $numEntries");
         }
         my $tip;
         if ($bytesFromEnd >= 4) {
             my $nxt = ($name =~ /^(.*?)(\d+)$/) ? $1 . ($2 + 1) : 'Next IFD';
             $tip = sprintf("$nxt offset: 0x%.4x", Get32u($dataPt, $dirEnd));
         }
-        $exifTool->HDump($dirEnd + $dataPos + $base, 4, "Next IFD", $tip, 0);
+        $et->HDump($dirEnd + $dataPos + $base, 4, "Next IFD", $tip, 0);
     }
 
     # patch for Canon EOS 40D firmware 1.0.4 bug (incorrect directory counts)
     # (must do this before parsing directory or CameraSettings offset will be suspicious)
-    if ($inMakerNotes and $$exifTool{Model} eq 'Canon EOS 40D') {
+    if ($inMakerNotes and $$et{Model} eq 'Canon EOS 40D') {
         my $entry = $dirStart + 2 + 12 * ($numEntries - 1);
         my $fmt = Get16u($dataPt, $entry + 2);
         if ($fmt < 1 or $fmt > 13) {
-            $exifTool->HDump($entry+$dataPos+$base,12,"[invalid IFD entry]",
-                     "Bad format type: $fmt", 1);
+            $et->HDump($entry+$dataPos+$base,12,"[invalid IFD entry]",
+                       "Bad format type: $fmt", 1);
             # adjust the number of directory entries
             --$numEntries;
             $dirEnd -= 12;
@@ -3801,18 +3872,18 @@ sub ProcessExif($$$)
     my $warnCount = 0;
     for ($index=0; $index<$numEntries; ++$index) {
         if ($warnCount > 10) {
-            $exifTool->Warn("Too many warnings -- $name parsing aborted", 2) and return 0;
+            $et->Warn("Too many warnings -- $name parsing aborted", 2) and return 0;
         }
         my $entry = $dirStart + 2 + 12 * $index;
         my $tagID = Get16u($dataPt, $entry);
         my $format = Get16u($dataPt, $entry+2);
         my $count = Get32u($dataPt, $entry+4);
         if ($format < 1 or $format > 13) {
-            $exifTool->HDump($entry+$dataPos+$base,12,"[invalid IFD entry]",
-                     "Bad format type: $format", 1);
+            $et->HDump($entry+$dataPos+$base,12,"[invalid IFD entry]",
+                       "Bad format type: $format", 1);
             # warn unless the IFD was just padded with zeros
             if ($format) {
-                $exifTool->Warn("Bad format ($format) for $name entry $index", $inMakerNotes);
+                $et->Warn("Bad format ($format) for $name entry $index", $inMakerNotes);
                 ++$warnCount;
             }
             return 0 unless $index; # assume corrupted IFD if this is our first entry
@@ -3823,7 +3894,7 @@ sub ProcessExif($$$)
         my $valueDataPos = $dataPos;
         my $valueDataLen = $dataLen;
         my $valuePtr = $entry + 8;      # pointer to value within $$dataPt
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID);
         my ($origFormStr, $bad, $rational);
         # hack to patch incorrect count in Kodak SubIFD3 tags
         if ($count < 2 and ref $$tagTablePtr{$tagID} eq 'HASH' and $$tagTablePtr{$tagID}{FixCount}) {
@@ -3840,7 +3911,7 @@ sub ProcessExif($$$)
         my $readSize = $size;
         if ($size > 4) {
             if ($size > 0x7fffffff) {
-                $exifTool->Warn(sprintf("Invalid size (%u) for %s tag 0x%.4x", $size, $name, $tagID));
+                $et->Warn(sprintf("Invalid size (%u) for %s tag 0x%.4x", $size, $name, $tagID));
                 ++$warnCount;
                 next;
             }
@@ -3857,7 +3928,7 @@ sub ProcessExif($$$)
             $valuePtr < 8 and not $$dirInfo{ZeroOffsetOK} and $suspect = $warnCount;
             # convert offset to pointer in $$dataPt
             if ($$dirInfo{EntryBased} or (ref $$tagTablePtr{$tagID} eq 'HASH' and
-                $tagTablePtr->{$tagID}{EntryBased}))
+                $$tagTablePtr{$tagID}{EntryBased}))
             {
                 $valuePtr += $entry;
             } else {
@@ -3879,14 +3950,14 @@ sub ProcessExif($$$)
                             last unless $$tagInfo{Binary};      # must read non-binary data
                             last if $$tagInfo{SubDirectory};    # must read SubDirectory data
                             my $lcTag = lc($$tagInfo{Name});
-                            if ($exifTool->{OPTIONS}{Binary} and
-                                not $exifTool->{EXCL_TAG_LOOKUP}{$lcTag})
+                            if ($$et{OPTIONS}{Binary} and
+                                not $$et{EXCL_TAG_LOOKUP}{$lcTag})
                             {
                                 # read binary data if specified unless tagsFromFile won't use it
-                                last unless $$exifTool{TAGS_FROM_FILE} and $$tagInfo{Protected};
+                                last unless $$et{TAGS_FROM_FILE} and $$tagInfo{Protected};
                             }
                             # must read if tag is specified by name
-                            last if $exifTool->{REQ_TAG_LOOKUP}{$lcTag};
+                            last if $$et{REQ_TAG_LOOKUP}{$lcTag};
                         } else {
                             # must read value if needed for a condition
                             last if defined $tagInfo;
@@ -3903,7 +3974,7 @@ sub ProcessExif($$$)
                             ($raf->Seek($base + $valuePtr + $dataPos,0) and
                              $raf->Read($buff,$size) == $size))
                     {
-                        $exifTool->Warn("Error reading value for $name entry $index", $inMakerNotes);
+                        $et->Warn("Error reading value for $name entry $index", $inMakerNotes);
                         return 0 unless $inMakerNotes or $htmlDump;
                         ++$warnCount;
                         $buff = '' unless defined $buff;
@@ -3915,12 +3986,16 @@ sub ProcessExif($$$)
                     $valueDataPos = $valuePtr + $dataPos;
                     $valuePtr = 0;
                 } else {
-                    my ($tagStr, $tmpInfo);
+                    my ($tagStr, $tmpInfo, $leicaTrailer);
                     if ($tagInfo) {
                         $tagStr = $$tagInfo{Name};
+                        $leicaTrailer = $$tagInfo{LeicaTrailer};
                     } elsif (defined $tagInfo) {
-                        $tmpInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID, \ '', $formatStr, $count);
-                        $tagStr = $$tmpInfo{Name} if $tmpInfo;
+                        $tmpInfo = $et->GetTagInfo($tagTablePtr, $tagID, \ '', $formatStr, $count);
+                        if ($tmpInfo) {
+                            $tagStr = $$tmpInfo{Name};
+                            $leicaTrailer = $$tmpInfo{LeicaTrailer};
+                        }
                     }
                     if ($tagInfo and $$tagInfo{ChangeBase}) {
                         # adjust base offset for this tag only
@@ -3930,23 +4005,23 @@ sub ProcessExif($$$)
                     }
                     $tagStr or $tagStr = sprintf("tag 0x%.4x",$tagID);
                     # allow PreviewImage to run outside EXIF data
-                    if ($tagStr eq 'PreviewImage' and $exifTool->{RAF}) {
-                        my $pos = $exifTool->{RAF}->Tell();
-                        $buff = $exifTool->ExtractBinary($base + $valuePtr + $dataPos, $size, 'PreviewImage');
-                        $exifTool->{RAF}->Seek($pos, 0);
+                    if ($tagStr eq 'PreviewImage' and $$et{RAF}) {
+                        my $pos = $$et{RAF}->Tell();
+                        $buff = $et->ExtractBinary($base + $valuePtr + $dataPos, $size, 'PreviewImage');
+                        $$et{RAF}->Seek($pos, 0);
                         $valueDataPt = \$buff;
                         $valueDataPos = $valuePtr + $dataPos;
                         $valueDataLen = $size;
                         $valuePtr = 0;
-                    } elsif ($tagStr eq 'MakerNoteLeica6' and $exifTool->{RAF}) {
+                    } elsif ($leicaTrailer and $$et{RAF}) {
                         if ($verbose > 0) {
-                            $exifTool->VPrint(0, "$$exifTool{INDENT}$index) $tagStr --> (outside APP1 segment)\n");
+                            $et->VPrint(0, "$$et{INDENT}$index) $tagStr --> (outside APP1 segment)\n");
                         }
-                        if ($exifTool->Options('FastScan')) {
-                            $exifTool->Warn('Ignored Leica MakerNote trailer');
+                        if ($et->Options('FastScan')) {
+                            $et->Warn('Ignored Leica MakerNote trailer');
                         } else {
                             require Image::ExifTool::Fixup;
-                            $$exifTool{LeicaTrailer} = {
+                            $$et{LeicaTrailer} = {
                                 TagInfo => $tagInfo || $tmpInfo,
                                 Offset  => $base + $valuePtr + $dataPos,
                                 Size    => $size,
@@ -3954,7 +4029,7 @@ sub ProcessExif($$$)
                             };
                         }
                     } else {
-                        $exifTool->Warn("Bad $name offset for $tagStr");
+                        $et->Warn("Bad $name offset for $tagStr");
                         ++$warnCount;
                     }
                     unless (defined $buff) {
@@ -3969,7 +4044,7 @@ sub ProcessExif($$$)
             # warn about suspect offsets if they didn't already cause another warning
             if (defined $suspect and $suspect == $warnCount) {
                 my $tagStr = $tagInfo ? $$tagInfo{Name} : sprintf('tag 0x%.4x', $tagID);
-                if ($exifTool->Warn("Suspicious $name offset for $tagStr", $inMakerNotes)) {
+                if ($et->Warn("Suspicious $name offset for $tagStr", $inMakerNotes)) {
                     ++$warnCount;
                     next unless $verbose;
                 }
@@ -3996,7 +4071,7 @@ sub ProcessExif($$$)
                         $tagInfo = {
                             Name => $tag,
                             Condition => '$$self{TIFF_TYPE} ne "DCR"',
-                            ValueConv => '$_=$val;s/.*: //;$_', # remove descr
+                            ValueConv => '$_=$val;s/^.*: //;$_', # remove descr
                             PSRaw => 1, # (just as flag to avoid adding this again)
                         };
                         AddTagToTable($tagTablePtr, $tagID, $tagInfo);
@@ -4013,14 +4088,14 @@ sub ProcessExif($$$)
                 # GetTagInfo() required the value for a Condition
                 my $tmpVal = substr($$valueDataPt, $valuePtr, $readSize < 128 ? $readSize : 128);
                 # (use original format name in this call -- $formatStr may have been changed to int8u)
-                $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID, \$tmpVal,
-                                                 $formatName[$format], $count);
+                $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID, \$tmpVal,
+                                           $formatName[$format], $count);
             }
         }
         # make sure we are handling the 'ifd' format properly
         if (($format == 13 or $format == 18) and (not $tagInfo or not $$tagInfo{SubIFD})) {
             my $str = sprintf('%s tag 0x%.4x IFD format not handled', $dirName, $tagID);
-            $exifTool->Warn($str, $inMakerNotes);
+            $et->Warn($str, $inMakerNotes);
         }
         if (defined $tagInfo) {
             my $readFormat = $$tagInfo{Format};
@@ -4041,7 +4116,7 @@ sub ProcessExif($$$)
             }
             # verify that offset-type values are integral
             if (($$tagInfo{IsOffset} or $$tagInfo{SubIFD}) and not $intFormat{$formatStr}) {
-                $exifTool->Warn("Wrong format ($formatStr) for $name $$tagInfo{Name}");
+                $et->Warn("Wrong format ($formatStr) for $name $$tagInfo{Name}");
                 next unless $verbose;
                 $wrongFormat = 1;
             }
@@ -4053,13 +4128,14 @@ sub ProcessExif($$$)
             # (avoids long delays when processing some corrupted files)
             if ($count > 100000 and $formatStr !~ /^(undef|string|binary)$/) {
                 my $tagName = $tagInfo ? $$tagInfo{Name} : sprintf('tag 0x%.4x', $tagID);
-                next if $exifTool->Warn("Ignoring $dirName $tagName with excessive count", 2);
+                my $minor = $count > 2000000 ? 0 : 2;
+                next if $et->Warn("Ignoring $dirName $tagName with excessive count", $minor);
             }
             # convert according to specified format
             $val = ReadValue($valueDataPt,$valuePtr,$formatStr,$count,$readSize,\$rational);
             # re-code if necessary
             if ($strEnc and $formatStr eq 'string' and defined $val) {
-                $val = $exifTool->Decode($val, $strEnc);
+                $val = $et->Decode($val, $strEnc);
             }
         }
 
@@ -4086,7 +4162,7 @@ sub ProcessExif($$$)
                           "Format: $fstr\nSize: $size bytes\n";
                 if ($size > 4) {
                     my $offPt = Get32u($dataPt,$entry+8);
-                    my $actPt = $valuePtr + $valueDataPos + $base - ($$exifTool{EXIF_POS} || 0);
+                    my $actPt = $valuePtr + $valueDataPos + $base - ($$et{EXIF_POS} || 0);
                     $tip .= sprintf("Value offset: 0x%.4x\n", $offPt);
                     # highlight tag name (red for bad size)
                     my $style = ($bad or not defined $tval) ? 'V' : 'H';
@@ -4112,7 +4188,7 @@ sub ProcessExif($$$)
                     } elsif ($tagInfo and Image::ExifTool::IsInt($tval)) {
                         if ($$tagInfo{IsOffset} or $$tagInfo{SubIFD}) {
                             $tval = sprintf('0x%.4x', $tval);
-                            my $actPt = $val + $base - ($$exifTool{EXIF_POS} || 0);
+                            my $actPt = $val + $base - ($$et{EXIF_POS} || 0);
                             if ($actPt != $val) {
                                 $tval .= sprintf("\nActual offset: 0x%.4x", $actPt);
                                 my $sign = $actPt < $val ? '-' : '';
@@ -4124,7 +4200,7 @@ sub ProcessExif($$$)
                     }
                 }
                 $tip .= "Value: $tval";
-                $exifTool->HDump($entry+$dataPos+$base, 12, "$dname $colName", $tip, 1);
+                $et->HDump($entry+$dataPos+$base, 12, "$dname $colName", $tip, 1);
                 next if $valueDataLen < 0;  # don't process bad pointer entry
                 if ($size > 4) {
                     my $exifDumpPos = $valuePtr + $valueDataPos + $base;
@@ -4137,12 +4213,12 @@ sub ProcessExif($$$)
                         }
                     }
                     # add value data block (underlining maker notes data)
-                    $exifTool->HDump($exifDumpPos,$size,"$tagName value",'SAME', $flag);
+                    $et->HDump($exifDumpPos,$size,"$tagName value",'SAME', $flag);
                 }
             } else {
                 my $fstr = $formatName[$format];
                 $fstr = "$origFormStr read as $fstr" if $origFormStr;
-                $exifTool->VerboseInfo($tagID, $tagInfo,
+                $et->VerboseInfo($tagID, $tagInfo,
                     Table   => $tagTablePtr,
                     Index   => $index,
                     Value   => $tval,
@@ -4164,7 +4240,7 @@ sub ProcessExif($$$)
             # don't process empty subdirectories
             unless ($size) {
                 unless ($$tagInfo{MakerNotes} or $inMakerNotes) {
-                    $exifTool->Warn("Empty $$tagInfo{Name} data", 1);
+                    $et->Warn("Empty $$tagInfo{Name} data", 1);
                 }
                 next;
             }
@@ -4175,8 +4251,8 @@ sub ProcessExif($$$)
                 # limit the number of subdirectories we parse
                 my $over = @values - $$subdir{MaxSubdirs};
                 if ($over > 0) {
-                    $exifTool->Warn("Ignoring $over $tagStr directories");
-                    pop @values while $over--;
+                    $et->Warn("Ignoring $over $tagStr directories");
+                    splice @values, $$subdir{MaxSubdirs};
                 }
                 $val = shift @values;
             }
@@ -4199,7 +4275,7 @@ sub ProcessExif($$$)
                     #### eval Start ($valuePtr, $val)
                     my $newStart = eval($$subdir{Start});
                     unless (Image::ExifTool::IsInt($newStart)) {
-                        $exifTool->Warn("Bad value for $tagStr");
+                        $et->Warn("Bad value for $tagStr");
                         last;
                     }
                     # convert back to relative to $subdirDataPt
@@ -4251,7 +4327,7 @@ sub ProcessExif($$$)
                     #### eval OffsetPt ($valuePtr)
                     my $pos = eval $$subdir{OffsetPt};
                     if ($pos + 4 > $subdirDataLen) {
-                        $exifTool->Warn("Bad $tagStr OffsetPt");
+                        $et->Warn("Bad $tagStr OffsetPt");
                         last;
                     }
                     SetByteOrder($newByteOrder);
@@ -4275,7 +4351,7 @@ sub ProcessExif($$$)
                                 $msg .= " (directory end is $end but EXIF size is only $subdirDataLen)";
                             }
                         }
-                        $exifTool->Warn($msg);
+                        $et->Warn($msg);
                         last;
                     }
                 }
@@ -4305,7 +4381,7 @@ sub ProcessExif($$$)
                 # (remember: some cameras incorrectly write maker notes in IFD0)
                 if ($$tagInfo{MakerNotes}) {
                     # don't parse makernotes if FastScan > 1
-                    my $fast = $exifTool->Options('FastScan');
+                    my $fast = $et->Options('FastScan');
                     last if $fast and $fast > 1;
                     $subdirInfo{MakerNoteAddr} = $valuePtr + $valueDataPos + $base;
                     $subdirInfo{NoFixBase} = 1 if defined $$subdir{Base};
@@ -4314,7 +4390,7 @@ sub ProcessExif($$$)
                 # unless the tag is writable as a block in which case group 1 may
                 # have been set automatically
                 if ($$tagInfo{Groups} and not $$tagInfo{Writable}) {
-                    $subdirInfo{DirName} = $tagInfo->{Groups}{1};
+                    $subdirInfo{DirName} = $$tagInfo{Groups}{1};
                     # number multiple subdirectories
                     $subdirInfo{DirName} =~ s/\d*$/$dirNum/ if $dirNum;
                 }
@@ -4324,39 +4400,39 @@ sub ProcessExif($$$)
                 #### eval Validate ($val, $dirData, $subdirStart, $size)
                 my $ok = 0;
                 if (defined $$subdir{Validate} and not eval $$subdir{Validate}) {
-                    $exifTool->Warn("Invalid $tagStr data");
+                    $et->Warn("Invalid $tagStr data");
                     $invalid = 1;
                 } else {
                     if (not $subdirInfo{DirName} and $inMakerNotes) {
                         $subdirInfo{DirName} = $$tagInfo{Name};
                     }
                     # process the subdirectory
-                    $ok = $exifTool->ProcessDirectory(\%subdirInfo, $newTagTable, $$subdir{ProcessProc});
+                    $ok = $et->ProcessDirectory(\%subdirInfo, $newTagTable, $$subdir{ProcessProc});
                 }
                 # print debugging information if there were errors
                 if (not $ok and $verbose > 1 and $subdirStart != $valuePtr) {
-                    my $out = $exifTool->Options('TextOut');
-                    printf $out "%s    (SubDirectory start = 0x%x)\n", $exifTool->{INDENT}, $subdirStart;
+                    my $out = $et->Options('TextOut');
+                    printf $out "%s    (SubDirectory start = 0x%x)\n", $$et{INDENT}, $subdirStart;
                 }
                 SetByteOrder($oldByteOrder);    # restore original byte swapping
 
                 @values or last;
                 $val = shift @values;           # continue with next subdir
             }
-            my $doMaker = $exifTool->Options('MakerNotes');
-            next unless $doMaker or $exifTool->{REQ_TAG_LOOKUP}{lc($tagStr)} or
+            my $doMaker = $et->Options('MakerNotes');
+            next unless $doMaker or $$et{REQ_TAG_LOOKUP}{lc($tagStr)} or
                         $$tagInfo{BlockExtract};
             # extract as a block if specified
             if ($$tagInfo{MakerNotes}) {
                 # save maker note byte order (if it was significant and valid)
                 if ($$subdir{ByteOrder} and not $invalid) {
-                    $exifTool->{MAKER_NOTE_BYTE_ORDER} =
-                        defined ($exifTool->{UnknownByteOrder}) ?
-                                 $exifTool->{UnknownByteOrder} : $newByteOrder;
+                    $$et{MAKER_NOTE_BYTE_ORDER} =
+                        defined ($$et{UnknownByteOrder}) ?
+                                 $$et{UnknownByteOrder} : $newByteOrder;
                 }
                 if ($doMaker and $doMaker eq '2') {
                     # extract maker notes without rebuilding (no fixup information)
-                    delete $exifTool->{MAKER_NOTE_FIXUP};
+                    delete $$et{MAKER_NOTE_FIXUP};
                 } elsif (not $$tagInfo{NotIFD}) {
                     # this is a pain, but we must rebuild EXIF-typemaker notes to
                     # include all the value data if data was outside the maker notes
@@ -4375,12 +4451,12 @@ sub ProcessExif($$$)
                         TagInfo    => $tagInfo,
                     );
                     $makerDirInfo{FixBase} = 1 if $$subdir{FixBase};
-                    # rebuild maker notes (creates $exifTool->{MAKER_NOTE_FIXUP})
-                    my $val2 = RebuildMakerNotes($exifTool, $newTagTable, \%makerDirInfo);
+                    # rebuild maker notes (creates $$et{MAKER_NOTE_FIXUP})
+                    my $val2 = RebuildMakerNotes($et, $newTagTable, \%makerDirInfo);
                     if (defined $val2) {
                         $val = $val2;
                     } elsif ($size > 4) {
-                        $exifTool->Warn('Error rebuilding maker notes (may be corrupt)');
+                        $et->Warn('Error rebuilding maker notes (may be corrupt)');
                     }
                 }
             } else {
@@ -4390,13 +4466,13 @@ sub ProcessExif($$$)
         }
  #..............................................................................
         # convert to absolute offsets if this tag is an offset
-        #### eval IsOffset ($val, $exifTool)
+        #### eval IsOffset ($val, $et)
         if ($$tagInfo{IsOffset} and eval $$tagInfo{IsOffset}) {
             my $offsetBase = $$tagInfo{IsOffset} eq '2' ? $firstBase : $base;
-            $offsetBase += $$exifTool{BASE};
+            $offsetBase += $$et{BASE};
             # handle offsets which use a wrong base (Minolta A200)
             if ($$tagInfo{WrongBase}) {
-                my $self = $exifTool;
+                my $self = $et;
                 #### eval WrongBase ($self)
                 $offsetBase += eval $$tagInfo{WrongBase} || 0;
             }
@@ -4407,12 +4483,12 @@ sub ProcessExif($$$)
             $val = join(' ', @vals);
         }
         # save the value of this tag
-        $tagKey = $exifTool->FoundTag($tagInfo, $val);
+        $tagKey = $et->FoundTag($tagInfo, $val);
         if (defined $tagKey) {
             # set the group 1 name for tags in specified tables
-            $exifTool->SetGroup($tagKey, $dirName) if $$tagTablePtr{SET_GROUP1};
+            $et->SetGroup($tagKey, $dirName) if $$tagTablePtr{SET_GROUP1};
             # save original components of rational numbers (used when copying)
-            $$exifTool{RATIONAL}{$tagKey} = $rational if defined $rational;
+            $$et{RATIONAL}{$tagKey} = $rational if defined $rational;
         }
     }
 
@@ -4431,12 +4507,12 @@ sub ProcessExif($$$)
             $newDirInfo{DirName} .= $ifdNum + 1;
             # must validate SubIFD1 because the nextIFD pointer is invalid for some RAW formats
             if ($newDirInfo{DirName} ne 'SubIFD1' or ValidateIFD(\%newDirInfo)) {
-                $exifTool->{INDENT} =~ s/..$//; # keep indent the same
-                my $cur = pop @{$$exifTool{PATH}};
-                $exifTool->ProcessDirectory(\%newDirInfo, $tagTablePtr) or $success = 0;
-                push @{$$exifTool{PATH}}, $cur;
-            } elsif ($verbose or $exifTool->{TIFF_TYPE} eq 'TIFF') {
-                $exifTool->Warn('Ignored bad IFD linked from SubIFD');
+                $$et{INDENT} =~ s/..$//; # keep indent the same
+                my $cur = pop @{$$et{PATH}};
+                $et->ProcessDirectory(\%newDirInfo, $tagTablePtr) or $success = 0;
+                push @{$$et{PATH}}, $cur;
+            } elsif ($verbose or $$et{TIFF_TYPE} eq 'TIFF') {
+                $et->Warn('Ignored bad IFD linked from SubIFD');
             }
         }
     }
@@ -4462,7 +4538,7 @@ EXIF and TIFF meta information.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -4473,7 +4549,7 @@ under the same terms as Perl itself.
 
 =item L<http://www.exif.org/Exif2-2.PDF>
 
-=item L<http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-008-2010_E.pdf>
+=item L<http://www.cipa.jp/std/documents/e/DC-008-2012_E.pdf>
 
 =item L<http://partners.adobe.com/asn/developer/pdfs/tn/TIFF6.pdf>
 
@@ -14,7 +14,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.04';
+$VERSION = '1.05';
 
 sub ProcessBitStream($$$);
 
@@ -139,17 +139,17 @@ Image::ExifTool::AddCompositeTags('Image::ExifTool::FLAC');
 # - can handle arbitrarily wide values (ie. 8-byte or larger integers)
 sub ProcessBitStream($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt   = $$dirInfo{DataPt};
     my $dataPos  = $$dirInfo{DataPos};
     my $dirStart = $$dirInfo{DirStart} || 0;
     my $dirLen   = $$dirInfo{DirLen} || (length($$dataPt) - $dirStart);
-    my $verbose  = $exifTool->Options('Verbose');
+    my $verbose  = $et->Options('Verbose');
     my $byteOrder = GetByteOrder();
     my $tag;
 
     if ($verbose) {
-        $exifTool->VPrint(0, "  + [BitStream directory, $dirLen bytes, '$byteOrder' order]\n");
+        $et->VPrint(0, "  + [BitStream directory, $dirLen bytes, '$byteOrder' order]\n");
     }
     foreach $tag (sort keys %$tagTablePtr) {
         next unless $tag =~ /^Bit(\d+)-?(\d+)?/;
@@ -198,7 +198,7 @@ sub ProcessBitStream($$$)
             $val /= 2;
             $mask >>= 1;
         }
-        $exifTool->HandleTag($tagTablePtr, $tag, $val,
+        $et->HandleTag($tagTablePtr, $tag, $val,
             DataPt  => $dataPt,
             DataPos => $dataPos,
             Start   => $dirStart + $i1,
@@ -215,21 +215,21 @@ sub ProcessBitStream($$$)
 # Returns: 1 on success, 0 if this wasn't a valid Ogg FLAC file
 sub ProcessFLAC($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
 
     # must first check for leading/trailing ID3 information
-    unless ($exifTool->{DoneID3}) {
+    unless ($$et{DoneID3}) {
         require Image::ExifTool::ID3;
-        Image::ExifTool::ID3::ProcessID3($exifTool, $dirInfo) and return 1;
+        Image::ExifTool::ID3::ProcessID3($et, $dirInfo) and return 1;
     }
     my $raf = $$dirInfo{RAF};
-    my $verbose = $exifTool->Options('Verbose');
-    my $out = $exifTool->Options('TextOut');
+    my $verbose = $et->Options('Verbose');
+    my $out = $et->Options('TextOut');
     my ($buff, $err);
 
     # check FLAC signature
     $raf->Read($buff, 4) == 4 and $buff eq 'fLaC' or return 0;
-    $exifTool->SetFileType();
+    $et->SetFileType();
     SetByteOrder('MM');
     my $tagTablePtr = GetTagTable('Image::ExifTool::FLAC::Main');
     for (;;) {
@@ -242,15 +242,15 @@ sub ProcessFLAC($$)
         my $tag  = $flag & 0x7f;    # tag bits
         if ($verbose) {
             print $out "FLAC metadata block, type $tag:\n";
-            $exifTool->VerboseDump(\$buff, DataPos => $raf->Tell() - $size);
+            $et->VerboseDump(\$buff, DataPos => $raf->Tell() - $size);
         }
-        $exifTool->HandleTag($tagTablePtr, $tag, undef,
+        $et->HandleTag($tagTablePtr, $tag, undef,
             DataPt  => \$buff,
             DataPos => $raf->Tell() - $size,
         );
         last if $last;   # all done if  is set
     }
-    $err and $exifTool->Warn('Format error in FLAC file');
+    $err and $et->Warn('Format error in FLAC file');
     return 1;
 }
 
@@ -273,7 +273,7 @@ information from Free Lossless Audio Codec (FLAC) audio files.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -10,6 +10,7 @@
 #               3) http://www.workswell.cz/manuals/flir/hardware/A3xx_and_A6xx_models/Streaming_format_ThermoVision.pdf
 #               4) http://support.flir.com/DocDownload/Assets/62/English/1557488%24A.pdf
 #               5) http://code.google.com/p/dvelib/source/browse/trunk/flirPublicFormat/fpfConverter/Fpfimg.h?spec=svn3&r=3
+#               6) http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,5538.0.html
 #               JD) Jens Duttke private communication
 #
 # Glossary:     FLIR = Forward Looking Infra Red
@@ -22,10 +23,12 @@ use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Exif;
 
-$VERSION = '1.01';
+$VERSION = '1.08';
 
 sub ProcessFLIR($$;$);
 sub ProcessFLIRText($$$);
+sub ProcessMeasInfo($$$);
+sub GetImageType($$$);
 
 my %temperatureInfo = (
     Writable => 'rational64u',
@@ -39,6 +42,11 @@ my %floatKelvin = (
     PrintConv => 'sprintf("%.1f C",$val)',
 );
 
+# commonly used tag information elements
+my %float1f = ( Format => 'float', PrintConv => 'sprintf("%.1f",$val)' );
+my %float2f = ( Format => 'float', PrintConv => 'sprintf("%.2f",$val)' );
+my %float8g = ( Format => 'float', PrintConv => 'sprintf("%.8g",$val)' );
+
 # FLIR makernotes tags (ref PH)
 %Image::ExifTool::FLIR::Main = (
     WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
@@ -87,7 +95,8 @@ my %floatKelvin = (
     PROCESS_PROC => \&ProcessFLIR,
     NOTES => q{
         Information extracted from FLIR FFF images and the FLIR APP1 segment of JPEG
-        images.
+        images.  These tags may also be extracted from the first frame of an FLIR
+        SEQ file, even though SEQ is not listed as a supported file type.
     },
     # 0 = free (ref 3)
     0x01 => {
@@ -97,14 +106,27 @@ my %floatKelvin = (
     # 2 = GainMap (ref 3)
     # 3 = OffsMap (ref 3)
     # 4 = DeadMap (ref 3)
-    # 5 = GainDeadMap (ref 3)
-    # 6 = CoarseMap (ref 3)
+    0x05 => { #6
+        Name => 'GainDeadData',
+        SubDirectory => { TagTable => 'Image::ExifTool::FLIR::GainDeadData' },
+    }, 
+    0x06 => { #6
+        Name => 'CoarseData',
+        SubDirectory => { TagTable => 'Image::ExifTool::FLIR::CoarseData' },
+    },       
     # 7 = ImageMap (ref 3)
+    0x0e => {
+        Name => 'EmbeddedImage',
+        SubDirectory => { TagTable => 'Image::ExifTool::FLIR::EmbeddedImage' },
+    },
     0x20 => {
         Name => 'CameraInfo', # (BasicData - ref 3)
         SubDirectory => { TagTable => 'Image::ExifTool::FLIR::CameraInfo' },
     },
-    # 0x21 - ToolInfo (spot tool, line tool, area tool) (Measure - ref 3)
+    0x21 => { #6
+        Name => 'MeasurementInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::FLIR::MeasInfo' },
+    },
     0x22 => {
         Name => 'PaletteInfo', # (ColorPal - ref 3)
         SubDirectory => { TagTable => 'Image::ExifTool::FLIR::PaletteInfo' },
@@ -123,12 +145,30 @@ my %floatKelvin = (
         },
     },
     # 0x27: 01 00 08 00 10 00 00 00
+    0x28 => {
+        Name => 'PaintData',
+        SubDirectory => { TagTable => 'Image::ExifTool::FLIR::PaintData' },
+    },       
+    0x2a => {
+        Name => 'PiP',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::FLIR::PiP',
+            ByteOrder => 'LittleEndian',
+        },
+    },
     0x2b => {
         Name => 'GPSInfo',
         SubDirectory => { TagTable => 'Image::ExifTool::FLIR::GPSInfo' },
     },
+    0x2c => {
+        Name => 'MeterLink',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::FLIR::MeterLink' ,
+            ByteOrder => 'LittleEndian'
+        },
+    },
     0x2e => {
-        Name => 'ParamInfo',
+        Name => 'ParameterInfo',
         SubDirectory => { TagTable => 'Image::ExifTool::FLIR::ParamInfo' },
     },
 );
@@ -175,32 +215,8 @@ my %floatKelvin = (
     # 0x0e-0x0f: 0
     16 => {
         Name => 'RawThermalImageType',
-        # this is actually the location of the image, but extract the
-        # image type as a separate tag because it may be useful
         Format => 'undef[$size-0x20]',
-        Notes => 'TIFF or PNG',
-        RawConv => sub {
-            my ($val, $self) = @_;
-            my ($w, $h) = @$self{'RawThermalImageWidth','RawThermalImageHeight'};
-            my $type = 'DAT';
-            # add TIFF header only if this looks like 16-bit raw data
-            # (note: MakeTiffHeader currently works only for little-endian,
-            #  and I haven't seen any big-endian samples, but check anwyay)
-            if ($val =~ /^\x89PNG\r\n\x1a\n/) {
-                $type = 'PNG';
-            } elsif (length $val != $w * $h * 2) {
-                $self->Warn('Unrecognized FLIR raw data format');
-            } elsif (GetByteOrder() eq 'II') {
-                require Image::ExifTool::Sony;
-                $val = Image::ExifTool::Sony::MakeTiffHeader($w,$h,1,16) . $val;
-                $type = 'TIFF';
-            } else {
-                $self->Warn("Don't yet support big-endian TIFF RawThermalImage");
-            }
-            # save image data
-            $$self{RawThermalImage} = $val;
-            return $type;
-        },
+        RawConv => 'Image::ExifTool::FLIR::GetImageType($self, $val, "RawThermalImage")',
     },
     16.1 => {
         Name => 'RawThermalImage',
@@ -208,11 +224,142 @@ my %floatKelvin = (
     },
 );
 
+# GainDeadMap record (ref 6) (see RawData above)
+%Image::ExifTool::FLIR::GainDeadData = (
+    GROUPS => { 0 => 'APP1', 2 => 'Image' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    FORMAT => 'int16u',
+    FIRST_ENTRY => 0,
+    NOTES => 'Information found in FFF-format .GAN calibration image files.',
+    0x00 => {
+        Name => 'GainDeadMapByteOrder',
+        Hidden => 1,
+        RawConv => 'ToggleByteOrder() if $val >= 0x0100; undef',
+    },
+    0x01 => {
+        Name => 'GainDeadMapImageWidth',
+        RawConv => '$$self{GainDeadMapImageWidth} = $val',
+    },
+    0x02 => {
+        Name => 'GainDeadMapImageHeight',
+        RawConv => '$$self{GainDeadMapImageHeight} = $val',
+    },
+    16 => {
+        Name => 'GainDeadMapImageType',
+        Format => 'undef[$size-0x20]',
+        RawConv => 'Image::ExifTool::FLIR::GetImageType($self, $val, "GainDeadMapImage")',
+    },
+    16.1 => {
+        Name => 'GainDeadMapImage',
+        RawConv => '\$$self{GainDeadMapImage}',
+    },
+);
+
+# CoarseMap record (ref 6) (see RawData above)
+%Image::ExifTool::FLIR::CoarseData = (
+    GROUPS => { 0 => 'APP1', 2 => 'Image' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    FORMAT => 'int16u',
+    FIRST_ENTRY => 0,
+    NOTES => 'Information found in FFF-format .CRS correction image files.',
+    0x00 => {
+        Name => 'CoarseMapByteOrder',
+        Hidden => 1,
+        RawConv => 'ToggleByteOrder() if $val >= 0x0100; undef',
+    },
+    0x01 => {
+        Name => 'CoarseMapImageWidth',
+        RawConv => '$$self{CoarseMapImageWidth} = $val',
+    },
+    0x02 => {
+        Name => 'CoarseMapImageHeight',
+        RawConv => '$$self{CoarseMapImageHeight} = $val',
+    },
+    16 => {
+        Name => 'CoarseMapImageType',
+        Format => 'undef[$size-0x20]',
+        RawConv => 'Image::ExifTool::FLIR::GetImageType($self, $val, "CoarseMapImage")',
+    },
+    16.1 => {
+        Name => 'CoarseMapImage',
+        RawConv => '\$$self{CoarseMapImage}',
+    },
+);
+
+# "Paint colors" record (ref PH)
+%Image::ExifTool::FLIR::PaintData = (
+    GROUPS => { 0 => 'APP1', 2 => 'Image' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    FORMAT => 'int16u',
+    FIRST_ENTRY => 0,
+    NOTES => 'Information generated by FLIR Tools "Paint colors" tool.',
+    0x01 => {
+        Name => 'PaintByteOrder',
+        Hidden => 1,
+        RawConv => 'ToggleByteOrder() if $val >= 0x0100; undef',
+    },
+    0x05 => {
+        Name => 'PaintImageWidth',
+        RawConv => '$$self{PaintImageWidth} = $val',
+    },
+    0x06 => {
+        Name => 'PaintImageHeight',
+        RawConv => '$$self{PaintImageHeight} = $val',
+    },
+    20 => {
+        Name => 'PaintImageType',
+        Format => 'undef[$size-0x28]',
+        RawConv => 'Image::ExifTool::FLIR::GetImageType($self, $val, "PaintImage")',
+    },
+    20.1 => {
+        Name => 'PaintImage',
+        RawConv => '\$$self{PaintImage}',
+    },
+);
+
+# FLIR embedded image (ref 1)
+%Image::ExifTool::FLIR::EmbeddedImage = (
+    GROUPS => { 0 => 'APP1', 2 => 'Image' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    FORMAT => 'int16u',
+    FIRST_ENTRY => 0,
+    0 => {
+        # use this tag only to determine the byte order
+        # (the value should be 0x0003 if the byte order is correct)
+        Name => 'EmbeddedImageByteOrder',
+        Format => 'int16u',
+        Hidden => 1,
+        RawConv => 'ToggleByteOrder() if $val >= 0x0100; undef',
+    },
+    1 => 'EmbeddedImageWidth',
+    2 => 'EmbeddedImageHeight',
+    16 => {
+        Name => 'EmbeddedImageType',
+        Format => 'undef[4]',
+        RawConv => '$val =~ /^\x89PNG/s ? "PNG" : ($val =~ /^\xff\xd8\xff/ ? "JPG" : "DAT")',
+        Notes => q{
+            "PNG" for PNG image in Y Cb Cr colors, "JPG" for a JPEG image, or "DAT" for
+            other image data
+        },
+    },
+    16.1 => {
+        Name => 'EmbeddedImage',
+        Format => 'undef[$size-0x20]',
+        Binary => 1,
+    },
+);
+
 # FLIR camera record (ref PH)
 %Image::ExifTool::FLIR::CameraInfo = (
     GROUPS => { 0 => 'APP1', 2 => 'Camera' },
     PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
     FIRST_ENTRY => 0,
+    NOTES => q{
+        FLIR camera information.  The Planck tags are variables used in the
+        temperature calculation.  See
+        L<http://u88.n24.queensu.ca/exiftool/forum/index.php?topic=4898.msg23972#msg23972>
+        for details.
+    },
     0x00 => {
         # use this tag only to determine the byte order
         # (the value should be 0x0002 if the byte order is correct)
@@ -225,12 +372,12 @@ my %floatKelvin = (
     # 0x04 - int16u: image height
     # 0x0c - int32u: image width - 1
     # 0x10 - int32u: image height - 1
-    0x20 => { Name => 'Emissivity',     Format => 'float', PrintConv => 'sprintf("%.2f",$val)' },
+    0x20 => { Name => 'Emissivity',                   %float2f },
     0x24 => { Name => 'ObjectDistance', Format => 'float', PrintConv => 'sprintf("%.2f m",$val)' },
     0x28 => { Name => 'ReflectedApparentTemperature', %floatKelvin },
     0x2c => { Name => 'AtmosphericTemperature',       %floatKelvin },
     0x30 => { Name => 'IRWindowTemperature',          %floatKelvin },
-    0x34 => { Name => 'IRWindowTransmission', Format => 'float', PrintConv => 'sprintf("%.2f",$val)' },
+    0x34 => { Name => 'IRWindowTransmission',         %float2f },
     # 0x38: 0
     0x3c => {
         Name => 'RelativeHumidity',
@@ -242,8 +389,9 @@ my %floatKelvin = (
     # 0x44,0x48,0x4c: 0
     # 0x50 - int32u: 1
     # 0x54: 0
-    # 0x58,0x5c: ?
-    # 0x60 - float: 1,1.5,1.54
+    0x58 => { Name => 'PlanckR1', %float8g }, #1
+    0x5c => { Name => 'PlanckB',  %float8g }, #1
+    0x60 => { Name => 'PlanckF',  %float8g }, #1
     # 0x64,0x68,0x6c: 0
     # 0x70 - float: 0.006568
     # 0x74 - float: 0.012620
@@ -252,28 +400,33 @@ my %floatKelvin = (
     # 0x80 - float: 1.89999
     # 0x84,0x88: 0
     # 0x8c - float: 0,4,6
-    0x90 => { Name => 'CameraTemperatureRangeMax', %floatKelvin, Groups => { 2 => 'Camera' } },
-    0x94 => { Name => 'CameraTemperatureRangeMin', %floatKelvin, Groups => { 2 => 'Camera' } },
+    0x90 => { Name => 'CameraTemperatureRangeMax', %floatKelvin },
+    0x94 => { Name => 'CameraTemperatureRangeMin', %floatKelvin },
     0x98 => { Name => 'UnknownTemperature1', %floatKelvin, Unknown => 1 }, # 50 degrees over camera max
     0x9c => { Name => 'UnknownTemperature2', %floatKelvin, Unknown => 1 }, # usually 10 or 20 degrees below camera min
     0xa0 => { Name => 'UnknownTemperature3', %floatKelvin, Unknown => 1 }, # same as camera max
     0xa4 => { Name => 'UnknownTemperature4', %floatKelvin, Unknown => 1 }, # same as camera min
     0xa8 => { Name => 'UnknownTemperature5', %floatKelvin, Unknown => 1 }, # usually 50 or 88 degrees over camera max
     0xac => { Name => 'UnknownTemperature6', %floatKelvin, Unknown => 1 }, # usually 10, 20 or 40 degrees below camera min
-    0xd4 => { Name => 'CameraModel',        Format => 'string[32]', Groups => { 2 => 'Camera' } },
-    0xf4 => { Name => 'CameraPartNumber',   Format => 'string[16]', Groups => { 2 => 'Camera' } }, #1
-    0x104 => { Name => 'CameraSerialNumber',Format => 'string[16]', Groups => { 2 => 'Camera' } }, #1
-    0x114 => { Name => 'CameraSoftware',    Format => 'string[16]', Groups => { 2 => 'Camera' } }, #1/PH (NC)
-    0x170 => { Name => 'LensModel',         Format => 'string[32]', Groups => { 2 => 'Camera' } },
+    0xd4 => { Name => 'CameraModel',        Format => 'string[32]' },
+    0xf4 => { Name => 'CameraPartNumber',   Format => 'string[16]' }, #1
+    0x104 => { Name => 'CameraSerialNumber',Format => 'string[16]' }, #1
+    0x114 => { Name => 'CameraSoftware',    Format => 'string[16]' }, #1/PH (NC)
+    0x170 => { Name => 'LensModel',         Format => 'string[32]' },
     # note: it seems that FLIR updated their lenses at some point, so lenses with the same
     # name may have different part numbers (ie. the FOL38 is either 1196456 or T197089)
-    0x190 => { Name => 'LensPartNumber',    Format => 'string[16]', Groups => { 2 => 'Camera' } },
-    0x1a0 => { Name => 'LensSerialNumber',  Format => 'string[16]', Groups => { 2 => 'Camera' } },
+    0x190 => { Name => 'LensPartNumber',    Format => 'string[16]' },
+    0x1a0 => { Name => 'LensSerialNumber',  Format => 'string[16]' },
+    0x1b4 => { Name => 'FieldOfView',       Format => 'float', PrintConv => 'sprintf("%.1f deg", $val)' }, #1
     # 0x1d0 - int16u: 0,12,24,25,46
     # 0x1d2 - int16u: 170,180,190,380,760,52320
-    0x1ec => { Name => 'FilterModel',       Format => 'string[16]', Groups => { 2 => 'Camera' } },
-    0x1fc => { Name => 'FilterPartNumber',  Format => 'string[32]', Groups => { 2 => 'Camera' } },
-    0x21c => { Name => 'FilterSerialNumber',Format => 'string[32]', Groups => { 2 => 'Camera' } },
+    0x1ec => { Name => 'FilterModel',       Format => 'string[16]' },
+    0x1fc => { Name => 'FilterPartNumber',  Format => 'string[32]' },
+    0x21c => { Name => 'FilterSerialNumber',Format => 'string[32]' },
+    0x308 => { Name => 'PlanckO',           Format => 'int16s' }, #1
+    0x30c => { Name => 'PlanckR2',          %float8g }, #1
+    0x338 => { Name => 'RawValueMedian',    Format => 'int16u', Groups => { 2 => 'Image' } },
+    0x33c => { Name => 'RawValueRange',     Format => 'int16u', Groups => { 2 => 'Image' } },
     0x384 => {
         Name => 'DateTimeOriginal',
         Description => 'Date/Time Original',
@@ -287,9 +440,41 @@ my %floatKelvin = (
         },
         PrintConv => '$self->ConvertDateTime($val)',
     },
+    0x390 => { Name => 'FocusStepCount', Format => 'int16u' },
+    0x45c => { Name => 'FocusDistance',  Format => 'float', PrintConv => 'sprintf("%.1f m",$val)' },
     # 0x43c - string: either "Live" or the file name
 );
 
+# FLIR measurement tools record (ref 6)
+%Image::ExifTool::FLIR::MeasInfo = (
+    GROUPS => { 0 => 'APP1', 2 => 'Image' },
+    PROCESS_PROC => \&ProcessMeasInfo,
+    FORMAT => 'int16u',
+    VARS => { NO_ID => 1 },
+    NOTES => q{
+        Tags listed below are only for the first measurement tool, however multiple
+        measurements may be added, and information is extracted for all of them. 
+        Tags for subsequent measurements are generated as required with the prefixes
+        "Meas2", "Meas3", etc.
+    },
+    Meas1Type => {
+        PrintConv => {
+            1 => 'Spot',
+            2 => 'Area',
+            3 => 'Ellipse',
+            4 => 'Line',
+            5 => 'Endpoint', #PH (NC, FLIR Tools v2.0 for Mac generates an empty one of these after each Line)
+            6 => 'Alarm', #PH seen params: "0 1 0 1 9142 0 9142 0" (called "Isotherm" by Mac version)
+            7 => 'Unused', #PH (NC) (or maybe "Free"?)
+            8 => 'Difference',
+        },
+    },
+    Meas1Params => {
+        Notes => 'Spot=X,Y; Area=X1,Y1,W,H; Ellipse=XC,YC,X1,Y1,X2,Y2; Line=X1,Y1,X2,Y2',
+    },
+    Meas1Label => { },
+);
+
 # FLIR palette record (ref PH/JD)
 %Image::ExifTool::FLIR::PaletteInfo = (
     GROUPS => { 0 => 'APP1', 2 => 'Image' },
@@ -299,9 +484,9 @@ my %floatKelvin = (
         Name => 'PaletteColors',
         RawConv => '$$self{PaletteColors} = $val',
     },
-    0x06 => { Name => 'AboveColor', Format => 'int8u[3]', Notes => 'Y Cr Cb color components' }, #JD
-    0x09 => { Name => 'BelowColor', Format => 'int8u[3]' }, #JD
-    0x0c => { Name => 'OverflowColor', Format => 'int8u[3]' }, #JD
+    0x06 => { Name => 'AboveColor',     Format => 'int8u[3]', Notes => 'Y Cr Cb color components' }, #JD
+    0x09 => { Name => 'BelowColor',     Format => 'int8u[3]' }, #JD
+    0x0c => { Name => 'OverflowColor',  Format => 'int8u[3]' }, #JD
     0x0f => { Name => 'UnderflowColor', Format => 'int8u[3]' }, #JD
     0x12 => { Name => 'Isotherm1Color', Format => 'int8u[3]' }, #JD
     0x15 => { Name => 'Isotherm2Color', Format => 'int8u[3]' }, #JD
@@ -368,6 +553,36 @@ my %floatKelvin = (
     # (there could be more, and we will generate these on the fly if necessary)
 );
 
+# FLIR Picture in Picture record (ref 1)
+%Image::ExifTool::FLIR::PiP = (
+    GROUPS => { 0 => 'APP1', 2 => 'Image' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    FIRST_ENTRY => 0,
+    NOTES => 'FLIR Picture in Picture tags.',
+    FORMAT => 'int16s',
+    0x00 => {
+        Name => 'Real2IR',
+        Format => 'float',
+    },
+    2 => {
+        Name => 'OffsetX',
+        Notes => 'offset from of insertion point from center',
+        PrintConv => 'sprintf("%+d",$val)', # (add sign for direct use with IM convert)
+    },
+    3 => {
+        Name => 'OffsetY',
+        PrintConv => 'sprintf("%+d",$val)',
+    },
+    4 => {
+        Name => 'PiPX1',
+        Description => 'PiP X1',
+        Notes => 'crop size for radiometric image',
+    },
+    5 => { Name => 'PiPX2', Description => 'PiP X2' },
+    6 => { Name => 'PiPY1', Description => 'PiP Y1' },
+    7 => { Name => 'PiPY2', Description => 'PiP Y2' },
+);
+
 # FLIR GPS record (ref PH/JD)
 %Image::ExifTool::FLIR::GPSInfo = (
     GROUPS => { 0 => 'APP1', 2 => 'Image' },
@@ -379,6 +594,174 @@ my %floatKelvin = (
     },
 );
 
+# humidity meter information
+# (ref http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,5325.0.html)
+# The %Image::ExifTool::UserDefined hash defines new tags to be added to existing tables.
+%Image::ExifTool::FLIR::MeterLink = (
+    GROUPS => { 0 => 'APP1', 2 => 'Image' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    FIRST_ENTRY => 0,
+    NOTES => 'Tags containing Meterlink humidity meter information.',
+    26 => {
+        Name => 'Reading1Units',
+        DataMember => 'Reading1Units',
+        RawConv => '$$self{Reading1Units} = $val',
+        PrintHex => 1,
+        PrintConv => {
+            0x0d => 'C',
+            0x1b => '%',
+            0x1d => 'Relative',
+            0x24 => 'g/kg',
+        },
+    },
+    28 => {
+        Name => 'Reading1Description',
+        DataMember => 'Reading1Description',
+        RawConv => '$$self{Reading1Description} = $val',
+        PrintConv => {
+            0 => 'Humidity',
+            3 => 'Moisture', # Pinless Moisture Readings with INTernal sensor
+            7 => 'Dew Point',
+            8 => 'Air Temperature',
+            9 => 'IR Temperature',
+            11 => 'Difference Temperature', # Difference Temp: IR-Temp and DewPoint
+        },
+    },
+    32 => {
+        Name => 'Reading1Device',
+        Format => 'string[16]',
+    },
+    96 => {
+        Name => 'Reading1Value',
+        Format => 'double',
+        # convert Kelvin -> Celcius and kg/kg -> g/kg
+        ValueConv => q{
+            return $val - 273.15 if $$self{Reading1Units} == 0x0d and $$self{Reading1Description} != 11;
+            return $val *= 1000 if $$self{Reading1Units} == 0x24;
+            return $val;
+        },
+    },
+    # add 100 for subsequent readings
+    126 => {
+        Name => 'Reading2Units',
+        DataMember => 'Reading2Units',
+        RawConv => '$$self{Reading2Units} = $val',
+        PrintHex => 1,
+        PrintConv => {
+            0x0d => 'C',
+            0x1b => '%',
+            0x1d => 'rel',
+            0x24 => 'g/kg',
+        },
+    },
+    128 => {
+        Name => 'Reading2Description',
+        DataMember => 'Reading2Description',
+        RawConv => '$$self{Reading2Description} = $val',
+        PrintConv => {
+            0 => 'Humidity',
+            3 => 'Moisture',
+            7 => 'Dew Point',
+            8 => 'Air Temperature',
+            9 => 'IR Temperature',
+            11 => 'Difference Temperature', # Difference Temp: IR-Temp and DewPoint
+        },
+    },
+    132 => {
+        Name => 'Reading2Device',
+        Format => 'string[16]',
+    },
+    196 => {
+        Name => 'Reading2Value',
+        Format => 'double',
+        # convert Kelvin -> Celcius and kg/kg -> g/kg
+        ValueConv => q{
+            return $val - 273.15 if $$self{Reading2Units} == 0x0d and $$self{Reading2Description} != 11;
+            return $val *= 1000 if $$self{Reading2Units} == 0x24;
+            return $val;
+        },
+    },
+    226 => {
+        Name => 'Reading3Units',
+        DataMember => 'Reading3Units',
+        RawConv => '$$self{Reading3Units} = $val',
+        PrintHex => 1,
+        PrintConv => {
+            0x0d => 'C',
+            0x1b => '%',
+            0x1d => 'rel',
+            0x24 => 'g/kg',
+        },
+    },
+    228 => {
+        Name => 'Reading3Description',
+        DataMember => 'Reading3Description',
+        RawConv => '$$self{Reading3Description} = $val',
+        PrintConv => {
+            0 => 'Humidity',
+            3 => 'Moisture',
+            7 => 'Dew Point',
+            8 => 'Air Temperature',
+            9 => 'IR Temperature',
+            11 => 'Difference Temperature', # Difference Temp: IR-Temp and DewPoint
+        },
+    },
+    232 => {
+        Name => 'Reading3Device',
+        Format => 'string[16]',
+    },
+    296 => {
+        Name => 'Reading3Value',
+        Format => 'double',
+        # convert Kelvin -> Celcius and kg/kg -> g/kg
+        ValueConv => q{
+            return $val - 273.15 if $$self{Reading3Units} == 0x0d and $$self{Reading3Description} != 11;
+            return $val *= 1000 if $$self{Reading3Units} == 0x24;
+            return $val;
+        },
+    },
+    
+    326 => {
+        Name => 'Reading4Units',
+        DataMember => 'Reading4Units',
+        RawConv => '$$self{Reading4Units} = $val',
+        PrintHex => 1,
+        PrintConv => {
+            0x0d => 'C',
+            0x1b => '%',
+            0x1d => 'rel',
+            0x24 => 'g/kg',
+        },
+    },
+    328 => {
+        Name => 'Reading4Description',
+        DataMember => 'Reading4Description',
+        RawConv => '$$self{Reading4Description} = $val',
+        PrintConv => {
+            0 => 'Humidity',
+            3 => 'Moisture',
+            7 => 'Dew Point',
+            8 => 'Air Temperature',
+            9 => 'IR Temperature',
+            11 => 'Difference Temperature', # Difference Temp: IR-Temp and DewPoint
+        },
+    },
+    332 => {
+        Name => 'Reading4Device',
+        Format => 'string[16]',
+    },
+    396 => {
+        Name => 'Reading4Value',
+        Format => 'double',
+        # convert Kelvin -> Celcius and kg/kg -> g/kg
+        ValueConv => q{
+            return $val - 273.15 if $$self{Reading4Units} == 0x0d and $$self{Reading4Description} != 11;
+            return $val *= 1000 if $$self{Reading4Units} == 0x24;
+            return $val;
+        },
+    },
+);
+
 # FLIR public image format (ref 4/5)
 %Image::ExifTool::FLIR::FPF = (
     GROUPS => { 0 => 'FLIR', 2 => 'Image' },
@@ -421,16 +804,16 @@ my %floatKelvin = (
     0x140 => { Name => 'FilterModel',       Format => 'string[32]', Groups => { 2 => 'Camera' } },
     0x150 => { Name => 'FilterPartNumber',  Format => 'string[32]', Groups => { 2 => 'Camera' } },
     0x180 => { Name => 'FilterSerialNumber',Format => 'string[32]', Groups => { 2 => 'Camera' } },
-    0x1e0 => { Name => 'Emissivity',        Format => 'float', PrintConv => 'sprintf("%.2f",$val)' },
+    0x1e0 => { Name => 'Emissivity',        %float2f },
     0x1e4 => { Name => 'ObjectDistance',    Format => 'float', PrintConv => 'sprintf("%.2f m",$val)' },
     0x1e8 => { Name => 'ReflectedApparentTemperature', %floatKelvin },
     0x1ec => { Name => 'AtmosphericTemperature',       %floatKelvin },
     0x1f0 => { Name => 'RelativeHumidity',  Format => 'float', PrintConv => 'sprintf("%.1f %%",$val*100)' },
-    0x1f4 => { Name => 'ComputedAtmosphericTrans', Format => 'float', PrintConv => 'sprintf("%.2f",$val)' },
-    0x1f8 => { Name => 'EstimatedAtmosphericTrans',Format => 'float', PrintConv => 'sprintf("%.2f",$val)' },
+    0x1f4 => { Name => 'ComputedAtmosphericTrans', %float2f },
+    0x1f8 => { Name => 'EstimatedAtmosphericTrans',%float2f },
     0x1fc => { Name => 'ReferenceTemperature', %floatKelvin },
-    0x200 => { Name => 'IRWindowTemperature',  %floatKelvin },
-    0x204 => { Name => 'IRWindowTransmission', Format => 'float', PrintConv => 'sprintf("%.2f",$val)' },
+    0x200 => { Name => 'IRWindowTemperature',  %floatKelvin, Groups => { 2 => 'Camera' } },
+    0x204 => { Name => 'IRWindowTransmission', %float2f,     Groups => { 2 => 'Camera' } },
     0x248 => {
         Name => 'DateTimeOriginal',
         Description => 'Date/Time Original',
@@ -439,21 +822,347 @@ my %floatKelvin = (
         ValueConv => 'sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2d.%.3d",split(" ",$val))',
         PrintConv => '$self->ConvertDateTime($val)',
     },
-    # Notes (based on ref 4): 
+    # Notes (based on ref 4):
     # 1) The above date/time structure is documented to be 32 bytes for FPFVersion 1, but in
     #    fact it is only 28.  Maybe this is why the full header length of my FPFVersion 2
     #    sample is 892 bytes instead of 896.  If this was a documentation error, we are OK,
     #    but if the alignment was really different in version 1, then the temperatures below
     #    will be mis-aligned.  I don't have any version 1 samples to check this.
     # 2) The following temperatures may not always be in Kelvin
-    0x2a4 => { Name => 'CameraScaleMin',    Format => 'float', PrintConv => 'sprintf("%.1f",$val)' },
-    0x2a8 => { Name => 'CameraScaleMax',    Format => 'float', PrintConv => 'sprintf("%.1f",$val)' },
-    0x2ac => { Name => 'CalculatedScaleMin',Format => 'float', PrintConv => 'sprintf("%.1f",$val)' },
-    0x2b0 => { Name => 'CalculatedScaleMax',Format => 'float', PrintConv => 'sprintf("%.1f",$val)' },
-    0x2b4 => { Name => 'ActualScaleMin',    Format => 'float', PrintConv => 'sprintf("%.1f",$val)' },
-    0x2b8 => { Name => 'ActualScaleMax',    Format => 'float', PrintConv => 'sprintf("%.1f",$val)' },
+    0x2a4 => { Name => 'CameraScaleMin',    %float1f },
+    0x2a8 => { Name => 'CameraScaleMax',    %float1f },
+    0x2ac => { Name => 'CalculatedScaleMin',%float1f },
+    0x2b0 => { Name => 'CalculatedScaleMax',%float1f },
+    0x2b4 => { Name => 'ActualScaleMin',    %float1f },
+    0x2b8 => { Name => 'ActualScaleMax',    %float1f },
 );
 
+# top-level user data written by FLIR cameras in MP4 videos
+%Image::ExifTool::FLIR::UserData = (
+    GROUPS => { 1 => 'FLIR', 2 => 'Camera' },
+    NOTES => q{
+        Tags written by some FLIR cameras in a top-level (!) "udta" atom of MP4
+        videos.
+    },
+    uuid => [
+        {
+            Name => 'FLIR_Parts',
+            Condition => '$$valPt=~/^\x43\xc3\x99\x3b\x0f\x94\x42\x4b\x82\x05\x6b\x66\x51\x3f\x48\x5d/s',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::FLIR::Parts',
+                Start => 16,
+            },
+        },
+        {
+            Name => 'FLIR_Serial',
+            Condition => '$$valPt=~/^\x57\xf5\xb9\x3e\x51\xe4\x48\xaf\xa0\xd9\xc3\xef\x1b\x37\xf7\x12/s',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::FLIR::SerialNums',
+                Start => 16,
+            },
+        },
+        {
+            Name => 'FLIR_Params',
+            Condition => '$$valPt=~/^\x41\xe5\xdc\xf9\xe8\x0a\x41\xce\xad\xfe\x7f\x0c\x58\x08\x2c\x19/s',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::FLIR::Params',
+                Start => 16,
+            },
+        },
+        {
+            Name => 'FLIR_UnknownUUID',
+            Condition => '$$valPt=~/^\x57\x45\x20\x50\x2c\xbb\x44\xad\xae\x54\x15\xe9\xb8\x39\xd9\x03/s',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::FLIR::UnknownUUID',
+                Start => 16,
+            },
+        },
+        {
+            Name => 'FLIR_GPS',
+            Condition => '$$valPt=~/^\x7f\x2e\x21\x00\x8b\x46\x49\x18\xaf\xb1\xde\x70\x9a\x74\xf6\xf5/s',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::FLIR::GPS_UUID',
+                Start => 16,
+            },
+        },
+        {
+            Name => 'FLIR_MoreInfo',
+            Condition => '$$valPt=~/^\x2b\x45\x2f\xdc\x74\x35\x40\x94\xba\xee\x22\xa6\xb2\x3a\x7c\xf8/s',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::FLIR::MoreInfo',
+                Start => 16,
+            },
+        },
+        {
+            Name => 'SoftwareComponents',
+            Condition => '$$valPt=~/^\x78\x3f\xc7\x83\x0c\x95\x4b\x00\x8c\xc7\xac\xf1\xec\xb4\xd3\x9a/s',
+            Unknown => 1,
+            ValueConv => 'join " ", unpack "x20N4xZ*", $val',
+        },
+        {
+            Name => 'FLIR_Unknown',
+            Condition => '$$valPt=~/^\x52\xae\xda\x45\x17\x1e\x48\xb1\x92\x47\x93\xa4\x21\x4e\x43\xf5/s',
+            Unknown => 1,
+            ValueConv => 'unpack "x20C*", $val',
+        },
+        {
+            Name => 'Units',
+            Condition => '$$valPt=~/^\xf8\xab\x72\x1e\x84\x73\x44\xa0\xb8\xc8\x1b\x04\x82\x6e\x07\x24/s',
+            List => 1,
+            RawConv => 'my @a = split "\0", substr($val, 20); \@a',
+        },
+        {
+            Name => 'ThumbnailImage',
+            Groups => { 2 => 'Image' },
+            Condition => '$$valPt=~/^\x91\xaf\x9b\x93\x45\x9b\x44\x56\x98\xd1\x5e\x76\xea\x01\x04\xac....\xff\xd8\xff/s',
+            RawConv => 'substr($val, 20)',
+            Binary => 1,
+        },
+    ],
+);
+
+# uuid 43c3993b0f94424b82056b66513f485d box of MP4 videos (ref PH)
+%Image::ExifTool::FLIR::Parts = (
+    GROUPS => { 0 => 'MakerNotes', 1 => 'FLIR', 2 => 'Camera' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    FORMAT => 'undef',
+    NOTES => q{
+        Tags extracted from the "uuid" box with ID 43c3993b0f94424b82056b66513f485d
+        in FLIR MP4 videos.
+    },
+    4 => [
+        {
+            Name => 'BAHPVer',
+            Condition => '$$valPt =~ /^bahpver\0/',
+            Format => 'undef[$size]',
+            RawConv => 'join " ", split "\0", substr($val, 8)',
+        },
+        {
+            Name => 'BALPVer',
+            Condition => '$$valPt =~ /^balpver\0/',
+            Format => 'undef[$size]',
+            ValueConv => 'join " ", split "\0", substr($val, 8)',
+        },
+        {
+            Name => 'Battery',
+            Condition => '$$valPt =~ /^battery\0/',
+            Format => 'undef[$size]',
+            ValueConv => 'join " ", split "\0", substr($val, 8)',
+        },
+        {
+            Name => 'BAVPVer',
+            Condition => '$$valPt =~ /^bavpver\0/',
+            Format => 'undef[$size]',
+            ValueConv => 'join " ", split "\0", substr($val, 8)',
+            # (the first string corresponds with a lens part number)
+        },
+        {
+            Name => 'CamCore',
+            Condition => '$$valPt =~ /^camcore\0/',
+            Format => 'undef[$size]',
+            ValueConv => 'join " ", split "\0", substr($val, 8)',
+        },
+        {
+            Name => 'DetectorBoard',
+            Condition => '$$valPt =~ /^det_board\0/',
+            Format => 'undef[$size]',
+            ValueConv => 'join " ", split "\0", substr($val, 10)',
+        },
+        {
+            Name => 'Detector',
+            Condition => '$$valPt =~ /^detector\0/',
+            Format => 'undef[$size]',
+            ValueConv => 'join " ", split "\0", substr($val, 9)',
+        },
+        {
+            Name => 'GIDCVer',
+            Condition => '$$valPt =~ /^gidcver\0/',
+            Format => 'undef[$size]',
+            ValueConv => 'join " ", split "\0", substr($val, 8)',
+        },
+        {
+            Name => 'GIDPVer',
+            Condition => '$$valPt =~ /^gidpver\0/',
+            Format => 'undef[$size]',
+            ValueConv => 'join " ", split "\0", substr($val, 8)',
+        },
+        {
+            Name => 'GIPC_CPLD',
+            Condition => '$$valPt =~ /^gipccpld\0/',
+            Format => 'undef[$size]',
+            ValueConv => 'join " ", split "\0", substr($val, 9)',
+        },
+        {
+            Name => 'GIPCVer',
+            Condition => '$$valPt =~ /^gipcver\0/',
+            Format => 'undef[$size]',
+            ValueConv => 'join " ", split "\0", substr($val, 8)',
+        },
+        {
+            Name => 'GIXIVer',
+            Condition => '$$valPt =~ /^gixiver\0/',
+            Format => 'undef[$size]',
+            ValueConv => 'join " ", split "\0", substr($val, 8)',
+        },
+        {
+            Name => 'MainBoard',
+            Condition => '$$valPt =~ /^mainboard\0/',
+            Format => 'undef[$size]',
+            ValueConv => 'join " ", split "\0", substr($val, 10)',
+        },
+        {
+            Name => 'Optics',
+            Condition => '$$valPt =~ /^optics\0/',
+            Format => 'undef[$size]',
+            ValueConv => 'join " ", split "\0", substr($val, 7)',
+        },
+        {
+            Name => 'PartNumber',
+            Format => 'undef[$size]',
+            ValueConv => 'join " ", split "\0", $val',
+        },
+    ],
+);
+
+# uuid 57f5b93e51e448afa0d9c3ef1b37f712 box of MP4 videos (ref PH)
+%Image::ExifTool::FLIR::SerialNums = (
+    GROUPS => { 0 => 'MakerNotes', 1 => 'FLIR', 2 => 'Camera' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    FIRST_ENTRY => 0,
+    NOTES => q{
+        Tags extracted from the "uuid" box with ID 57f5b93e51e448afa0d9c3ef1b37f712
+        in FLIR MP4 videos.
+    },
+    # (not sure if these offsets are constant)
+    0x0c => { Name => 'UnknownSerial1',     Format => 'string[33]', Unknown => 1 },
+    0x2d => { Name => 'UnknownSerial2',     Format => 'string[33]', Unknown => 1 },
+    0x4e => { Name => 'UnknownSerial3',     Format => 'string[33]', Unknown => 1 },
+    0x6f => { Name => 'UnknownSerial4',     Format => 'string[11]', Unknown => 1 },
+    0x7b => { Name => 'UnknownNumber',      Format => 'string[3]',  Unknown => 1 },
+    0x7e => { Name => 'CameraSerialNumber', Format => 'string[9]' },
+);
+
+# uuid 41e5dcf9e80a41ceadfe7f0c58082c19 box of MP4 videos (ref PH)
+%Image::ExifTool::FLIR::Params = (
+    GROUPS => { 0 => 'MakerNotes', 1 => 'FLIR', 2 => 'Camera' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    FORMAT => 'float',
+    FIRST_ENTRY => 0,
+    NOTES => q{
+        Tags extracted from the "uuid" box with ID 41e5dcf9e80a41ceadfe7f0c58082c19
+        in FLIR MP4 videos.
+    },
+    1 => { Name => 'ReflectedApparentTemperature', %floatKelvin },
+    2 => { Name => 'AtmosphericTemperature',       %floatKelvin },
+    3 => { Name => 'Emissivity',                   %float2f },
+    4 => { Name => 'ObjectDistance',   PrintConv => 'sprintf("%.2f m",$val)' },
+    5 => { Name => 'RelativeHumidity', PrintConv => 'sprintf("%.1f %%",$val*100)' },
+    6 => { Name => 'EstimatedAtmosphericTrans',    %float2f },
+    7 => { Name => 'IRWindowTemperature',          %floatKelvin },
+    8 => { Name => 'IRWindowTransmission',         %float2f },
+);
+
+# uuid 574520502cbb44adae5415e9b839d903 box of MP4 videos (ref PH)
+%Image::ExifTool::FLIR::UnknownUUID = (
+    GROUPS => { 0 => 'MakerNotes', 1 => 'FLIR', 2 => 'Camera' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    FORMAT => 'float',
+    FIRST_ENTRY => 0,
+    NOTES => q{
+        Tags extracted from the "uuid" box with ID 574520502cbb44adae5415e9b839d903
+        in FLIR MP4 videos.
+    },
+    # 1 - 1
+    # 2 - 0
+    # 3 - 0
+);
+
+# uuid 7f2e21008b464918afb1de709a74f6f5 box of MP4 videos (ref PH)
+%Image::ExifTool::FLIR::GPS_UUID = (
+    GROUPS => { 0 => 'MakerNotes', 1 => 'FLIR', 2 => 'Location' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    FORMAT => 'float',
+    FIRST_ENTRY => 0,
+    NOTES => q{
+        Tags extracted from the "uuid" box with ID 7f2e21008b464918afb1de709a74f6f5
+        in FLIR MP4 videos.
+    },
+    1 => {
+        Name => 'GPSLatitude',
+        RawConv => 'require Image::ExifTool::GPS; $val', # to load Composite tags and routines
+        PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
+    },
+    2 => {
+        Name => 'GPSLongitude',
+        PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
+    },
+    3 => {
+        Name => 'GPSAltitude',
+        PrintConv => '$val=int($val*100+0.5)/100;"$val m"',
+    },
+    # 4 - int32u: 0x0001bf74
+    # 5 - int32u: 0
+    # 6 - int32u: 1
+);
+
+# uuid 2b452fdc74354094baee22a6b23a7cf8 box of MP4 videos (ref PH)
+%Image::ExifTool::FLIR::MoreInfo = (
+    GROUPS => { 0 => 'MakerNotes', 1 => 'FLIR', 2 => 'Camera' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    FIRST_ENTRY => 0,
+    NOTES => q{
+        Tags extracted from the "uuid" box with ID 2b452fdc74354094baee22a6b23a7cf8
+        in FLIR MP4 videos.
+    },
+    5 => { Name => 'LensModel', Format => 'string[6]' },
+    11 => { Name => 'UnknownTemperature1', %floatKelvin, Unknown => 1 }, # (-14.9 C)
+    15 => { Name => 'UnknownTemperature2', %floatKelvin, Unknown => 1 }, # (60.0 C)
+);
+
+# FLIR composite tags (ref 1)
+%Image::ExifTool::FLIR::Composite = (
+    GROUPS => { 1 => 'FLIR', 2 => 'Camera' },
+    PeakSpectralSensitivity => {
+        Require => 'FLIR:PlanckB',
+        ValueConv => '14387.6515/$val',
+        PrintConv => 'sprintf("%.1f um", $val)',
+    },
+);
+
+# add our composite tags
+Image::ExifTool::AddCompositeTags('Image::ExifTool::FLIR');
+
+#------------------------------------------------------------------------------
+# Get image type from raw image data
+# Inputs: 0) ExifTool ref, 1) image data, 2) tag name
+# Returns: image type (PNG, JPG, TIFF or undef)
+# - image itself is stored in $$et{$tag}
+sub GetImageType($$$)
+{
+    my ($et, $val, $tag) = @_;
+    my ($w, $h) = @$et{"${tag}Width","${tag}Height"};
+    my $type = 'DAT';
+    # add TIFF header only if this looks like 16-bit raw data
+    # (note: MakeTiffHeader currently works only for little-endian,
+    #  and I haven't seen any big-endian samples, but check anwyay)
+    if ($val =~ /^\x89PNG\r\n\x1a\n/) {
+        $type = 'PNG';
+    } elsif ($val =~ /^\xff\xd8\xff/) { # (haven't seen this, but just in case - PH)
+        $type = 'JPG';
+    } elsif (length $val != $w * $h * 2) {
+        $et->Warn("Unrecognized FLIR $tag data format");
+    } elsif (GetByteOrder() eq 'II') {
+        require Image::ExifTool::Sony;
+        $val = Image::ExifTool::Sony::MakeTiffHeader($w,$h,1,16) . $val;
+        $type = 'TIFF';
+    } else {
+        $et->Warn("Don't yet support big-endian TIFF $tag");
+    }
+    # save image data
+    $$et{$tag} = $val;
+    return $type;
+}
+
 #------------------------------------------------------------------------------
 # Unescape FLIR Unicode character
 # Inputs: 0) escaped character code
@@ -474,14 +1183,14 @@ sub UnescapeFLIR($)
 # Returns: 1 on success
 sub ProcessFLIRText($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirStart = $$dirInfo{DirStart} || 0;
     my $dirLen = $$dirInfo{DirLen};
 
     return 0 if $dirLen < 12;
 
-    $exifTool->VerboseDir('FLIR Text');
+    $et->VerboseDir('FLIR Text');
 
     my $dat = substr($$dataPt, $dirStart+12, $dirLen-12);
     $dat =~ s/\0.*//s; # truncate at null
@@ -490,7 +1199,7 @@ sub ProcessFLIRText($$$)
     if ($tagTablePtr eq \%Image::ExifTool::FLIR::ParamInfo and
         $dat =~ /# (Generated) at (.*?)[\n\r]/)
     {
-        $exifTool->HandleTag($tagTablePtr, $1, $2);
+        $et->HandleTag($tagTablePtr, $1, $2);
     }
 
     for (;;) {
@@ -499,32 +1208,95 @@ sub ProcessFLIRText($$$)
         if ($3 eq 'unicode' and $val =~ /\\/) {
             # convert escaped Unicode characters (backslash followed by 4 hex digits)
             $val =~ s/\\([0-9a-fA-F]{4}|.)/UnescapeFLIR($1)/sge;
-            $exifTool->Decode($val, 'UTF8');
+            $et->Decode($val, 'UTF8');
         }
         $$tagTablePtr{$tag} or AddTagToTable($tagTablePtr, $tag, { Name => $tag });
-        $exifTool->HandleTag($tagTablePtr, $tag, $val);
+        $et->HandleTag($tagTablePtr, $tag, $val);
     }
 
     return 1;
 }
 
 #------------------------------------------------------------------------------
+# Process FLIR measurement tool record (ref 6)
+# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+# (code-driven decoding isn't pretty, but sometimes it is necessary)
+sub ProcessMeasInfo($$$)
+{
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirStart = $$dirInfo{DirStart} || 0;
+    my $dataPos = $$dirInfo{DataPos};
+    my $dirEnd = $dirStart + $$dirInfo{DirLen};
+    my $verbose = $et->Options('Verbose');
+
+    my $pos = $dirStart + 12;
+    return 0 if $pos > $dirEnd;
+    ToggleByteOrder() if Get16u($dataPt, $dirStart) >= 0x100;
+    my ($i, $t, $p);
+    for ($i=1; ; ++$i) {
+        last if $pos + 2 > $dirEnd;
+        my $recLen = Get16u($dataPt, $pos);
+        last if $recLen < 0x28 or $pos + $recLen > $dirEnd;
+        my $pre = 'Meas' . $i;
+        $et->VerboseDir("MeasInfo $i", undef, $recLen);
+        if ($verbose > 2) {
+            Image::ExifTool::HexDump($dataPt, $recLen,
+                Start=>$pos, Prefix=>$$et{INDENT}, DataPos=>$dataPos);
+        }
+        my $coordLen = Get16u($dataPt, $pos+4);
+        # generate tag table entries for this tool if necessary
+        foreach $t ('Type', 'Params', 'Label') {
+            my $tag = $pre . $t;
+            last if $$tagTablePtr{$tag};
+            my $tagInfo = { Name => $tag };
+            $$tagInfo{PrintConv} = $$tagTablePtr{"Meas1$t"}{PrintConv};
+            AddTagToTable($tagTablePtr, $tag, $tagInfo);
+        }
+        # extract measurement tool type
+        $et->HandleTag($tagTablePtr, "${pre}Type", undef, 
+            DataPt=>$dataPt, DataPos=>$dataPos, Start=>$pos+0x0a, Size=>2);
+        last if $pos + 0x24 + $coordLen > $dirEnd;
+        # extract measurement parameters
+        $et->HandleTag($tagTablePtr, "${pre}Params", undef, 
+            DataPt=>$dataPt, DataPos=>$dataPos, Start=>$pos+0x24, Size=>$coordLen);
+        my @uni;
+        # extract label (sometimes-null-terminated Unicode)
+        for ($p=0x24+$coordLen; $p<$recLen-1; $p+=2) {
+            my $ch = Get16u($dataPt, $p+$pos);
+            # FLIR Tools v2.0 for Mac doesn't properly null-terminate these strings,
+            # so end the string at any funny character
+            last if $ch < 0x20 or $ch > 0x7f;
+            push @uni, $ch;
+        }
+        # convert to the ExifTool character set
+        require Image::ExifTool::Charset;
+        my $val = Image::ExifTool::Charset::Recompose($et, \@uni);
+        $et->HandleTag($tagTablePtr, "${pre}Label", $val,
+            DataPt=>$dataPt, DataPos=>$dataPos, Start=>$pos+0x24+$coordLen, Size=>2*scalar(@uni));
+        $pos += $recLen;    # step to next record
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
 # Process FLIR FFF record (ref PH/1/3)
 # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
 # Returns: 1 if this was a valid FFF record
 sub ProcessFLIR($$;$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $raf = $$dirInfo{RAF} || new File::RandomAccess($$dirInfo{DataPt});
-    my $verbose = $exifTool->Options('Verbose');
-    my $out = $exifTool->Options('TextOut');
+    my $verbose = $et->Options('Verbose');
+    my $out = $et->Options('TextOut');
     my ($i, $buff, $rec);
 
     # read and verify FFF header
     $raf->Read($buff, 0x40) == 0x40 and $buff =~ /^FFF\0/ or return 0;
 
     # set file type if reading from FFF file ($tagTablePtr will not be defined)
-    $exifTool->SetFileType() unless $tagTablePtr;
+    $et->SetFileType() unless $tagTablePtr;
 
     # FLIR file header (ref 3)
     # 0x00 - string[4] file format ID = "FFF\0"
@@ -542,7 +1314,7 @@ sub ProcessFLIR($$;$)
     # (in my samples FLIR APP1 is big-endian, FFF files are little-endian)
     my $ver = Get32u(\$buff, 0x14);
     if ($ver != 100) {
-        $ver == 0x64000000 or $exifTool->Warn('Unsupported FLIR FFF version'), return 1;
+        $ver == 0x64000000 or $et->Warn('Unsupported FLIR FFF version'), return 1;
         ToggleByteOrder();
     }
 
@@ -550,13 +1322,13 @@ sub ProcessFLIR($$;$)
     my $pos = Get32u(\$buff, 0x18);
     my $num = Get32u(\$buff, 0x1c);
     unless ($raf->Seek($pos) and $raf->Read($buff, $num * 0x20) == $num * 0x20) {
-        $exifTool->Warn('Truncated FLIR FFF directory');
+        $et->Warn('Truncated FLIR FFF directory');
         return 1;
     }
 
     unless ($tagTablePtr) {
         $tagTablePtr = GetTagTable('Image::ExifTool::FLIR::FFF');
-        $$exifTool{SET_GROUP0} = 'FLIR'; # (set group 0 to 'FLIR' for FFF files)
+        $$et{SET_GROUP0} = 'FLIR'; # (set group 0 to 'FLIR' for FFF files)
     }
 
     for ($i=0; $i<$num; ++$i) {
@@ -579,26 +1351,26 @@ sub ProcessFLIR($$;$)
         my $recLen = Get32u(\$buff, $entry + 0x10);
 
         $verbose and printf $out "%sFLIR Record 0x%.2x, offset 0x%.4x, length 0x%.4x\n",
-                                 $$exifTool{INDENT}, $recType, $recPos, $recLen;
+                                 $$et{INDENT}, $recType, $recPos, $recLen;
 
         unless ($raf->Seek($recPos) and $raf->Read($rec, $recLen) == $recLen) {
-            $exifTool->Warn('Invalid FLIR record');
+            $et->Warn('Invalid FLIR record');
             last;
         }
         if ($$tagTablePtr{$recType}) {
-            $exifTool->HandleTag($tagTablePtr, $recType, undef,
+            $et->HandleTag($tagTablePtr, $recType, undef,
                 DataPt  => \$rec,
                 DataPos => $recPos,
                 Start   => 0,
                 Size    => $recLen,
             );
         } elsif ($verbose > 2) {
-            my %parms = ( DataPos => $recPos, Prefix => $$exifTool{INDENT} );
+            my %parms = ( DataPos => $recPos, Prefix => $$et{INDENT} );
             $parms{MaxLen} = 96 if $verbose < 4;
             Image::ExifTool::HexDump(\$rec, $recLen, %parms);
         }
     }
-    delete $$exifTool{SET_GROUP0};
+    delete $$et{SET_GROUP0};
     return 1;
 }
 
@@ -608,7 +1380,7 @@ sub ProcessFLIR($$;$)
 # Returns: 1 if this was a valid FFF file
 sub ProcessFPF($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my $buff;
 
@@ -619,8 +1391,8 @@ sub ProcessFPF($$)
     ToggleByteOrder() unless Get32u(\$buff, 0x20) & 0xffff;
 
     my $tagTablePtr = GetTagTable('Image::ExifTool::FLIR::FPF');
-    $exifTool->SetFileType();
-    $exifTool->ProcessDirectory( { DataPt => \$buff, Parent => 'FPF' }, $tagTablePtr);
+    $et->SetFileType();
+    $et->ProcessDirectory( { DataPt => \$buff, Parent => 'FPF' }, $tagTablePtr);
     return 1;
 }
 
@@ -643,7 +1415,7 @@ Systems Inc. thermal image files (FFF, FPF and JPEG format).
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -662,8 +1434,15 @@ under the same terms as Perl itself.
 
 =item L<http://code.google.com/p/dvelib/source/browse/trunk/flirPublicFormat/fpfConverter/Fpfimg.h?spec=svn3&r=3>
 
+=item L<http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,5538.0.html>
+
 =back
 
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Tomas for his hard work in decoding much of this information, and
+to Jens Duttke for getting me started on this format.
+
 =head1 SEE ALSO
 
 L<Image::ExifTool::TagNames/FLIR Tags>,
@@ -342,7 +342,7 @@ linear list when ApplyFixups() is called.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -26,7 +26,7 @@ use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::FLAC;
 
-$VERSION = '1.09';
+$VERSION = '1.11';
 
 sub ProcessMeta($$$;$);
 
@@ -289,14 +289,14 @@ my %isStruct = ( 0x03 => 1, 0x08 => 1, 0x10 => 1 );
 # Notes: Updates DataPos in dirInfo if extracting single value
 sub ProcessMeta($$$;$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr, $single) = @_;
+    my ($et, $dirInfo, $tagTablePtr, $single) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dataPos = $$dirInfo{DataPos};
     my $dirLen = $$dirInfo{DirLen} || length($$dataPt);
     my $pos = $$dirInfo{Pos} || 0;
     my ($type, $val, $rec);
 
-    $exifTool->VerboseDir('Meta') unless $single;
+    $et->VerboseDir('Meta') unless $single;
 
 Record: for ($rec=0; ; ++$rec) {
         last if $pos >= $dirLen;
@@ -341,7 +341,7 @@ Record: for ($rec=0; ; ++$rec) {
             $val = substr($$dataPt, $pos + 2, $len);
             $pos += 2 + $len;
         } elsif ($isStruct{$type}) {   # object, mixed array or typed object
-            $exifTool->VPrint(1, "  + [$amfType[$type]]\n");
+            $et->VPrint(1, "  + [$amfType[$type]]\n");
             my $getName;
             $val = '';  # dummy value
             if ($type == 0x08) {        # mixed array
@@ -356,14 +356,14 @@ Record: for ($rec=0; ; ++$rec) {
                 last Record if $pos + 2 > $dirLen;
                 my $len = Get16u($dataPt, $pos);
                 if ($pos + 2 + $len > $dirLen) {
-                    $exifTool->Warn("Truncated $amfType[$type] record");
+                    $et->Warn("Truncated $amfType[$type] record");
                     last Record;
                 }
                 my $tag = substr($$dataPt, $pos + 2, $len);
                 $pos += 2 + $len;
                 # first string of a typed object is the object name
                 if ($getName) {
-                    $exifTool->VPrint(1,"  | (object name '$tag')\n");
+                    $et->VPrint(1,"  | (object name '$tag')\n");
                     undef $getName;
                     next; # (ignore name for now)
                 }
@@ -385,7 +385,7 @@ Record: for ($rec=0; ; ++$rec) {
                 # add structure name to start of tag name
                 $tag = $structName . ucfirst($tag) if defined $structName;
                 $$dirInfo{StructName} = $tag;       # set new structure name
-                my ($t, $v) = ProcessMeta($exifTool, $dirInfo, $subTablePtr, 1);
+                my ($t, $v) = ProcessMeta($et, $dirInfo, $subTablePtr, 1);
                 $$dirInfo{StructName} = $structName;# restore original structure name
                 $pos = $$dirInfo{Pos};  # update to new position in packet
                 # all done if this value contained tags
@@ -395,9 +395,9 @@ Record: for ($rec=0; ; ++$rec) {
                 last if $t == 0x09; # (end of object)
                 if (not $$subTablePtr{$tag} and $tag =~ /^\w+$/) {
                     AddTagToTable($subTablePtr, $tag, { Name => ucfirst($tag) });
-                    $exifTool->VPrint(1, "  | (adding $tag)\n");
+                    $et->VPrint(1, "  | (adding $tag)\n");
                 }
-                $exifTool->HandleTag($subTablePtr, $tag, $v,
+                $et->HandleTag($subTablePtr, $tag, $v,
                     DataPt  => $dataPt,
                     DataPos => $dataPos,
                     Start   => $valPos,
@@ -422,7 +422,7 @@ Record: for ($rec=0; ; ++$rec) {
             my $structName = $$dirInfo{StructName};
             for ($i=0; $i<$num; ++$i) {
                 $$dirInfo{StructName} = $structName . $i if defined $structName;
-                my ($t, $v) = ProcessMeta($exifTool, $dirInfo, $tagTablePtr, 1);
+                my ($t, $v) = ProcessMeta($et, $dirInfo, $tagTablePtr, 1);
                 last Record unless defined $v;
                 # save value unless contained in a sub-structure
                 push @vals, $v unless $isStruct{$t};
@@ -440,7 +440,7 @@ Record: for ($rec=0; ; ++$rec) {
       # } elsif ($type == 0x11) {   # AMF3 data (can't add support for this without a test sample)
         } else {
             my $t = $amfType[$type] || sprintf('type 0x%x',$type);
-            $exifTool->Warn("AMF $t record not yet supported");
+            $et->Warn("AMF $t record not yet supported");
             undef $type;    # (so we don't print another warning)
             last;           # can't continue
         }
@@ -449,17 +449,17 @@ Record: for ($rec=0; ; ++$rec) {
             # only process certain Meta packets
             if ($type == 0x02 and not $rec) {
                 my $verb = $processMetaPacket{$val} ? 'processing' : 'ignoring';
-                $exifTool->VPrint(0, "  | ($verb $val information)\n");
+                $et->VPrint(0, "  | ($verb $val information)\n");
                 last unless $processMetaPacket{$val};
             } else {
                 # give verbose indication if we ignore a lone value
                 my $t = $amfType[$type] || sprintf('type 0x%x',$type);
-                $exifTool->VPrint(1, "  | (ignored lone $t value '$val')\n");
+                $et->VPrint(1, "  | (ignored lone $t value '$val')\n");
             }
         }
     }
     if (not defined $val and defined $type) {
-        $exifTool->Warn(sprintf("Truncated AMF record 0x%x",$type));
+        $et->Warn(sprintf("Truncated AMF record 0x%x",$type));
     }
     return 1 unless $single;    # all done
     $$dirInfo{Pos} = $pos;      # update position
@@ -472,15 +472,15 @@ Record: for ($rec=0; ; ++$rec) {
 # Returns: 1 on success, 0 if this wasn't a valid Flash Video file
 sub ProcessFLV($$)
 {
-    my ($exifTool, $dirInfo) = @_;
-    my $verbose = $exifTool->Options('Verbose');
+    my ($et, $dirInfo) = @_;
+    my $verbose = $et->Options('Verbose');
     my $raf = $$dirInfo{RAF};
     my $buff;
 
     $raf->Read($buff, 9) == 9 or return 0;
     $buff =~ /^FLV\x01/ or return 0;
     SetByteOrder('MM');
-    $exifTool->SetFileType();
+    $et->SetFileType();
     my ($flags, $offset) = unpack('x4CN', $buff);
     $raf->Seek($offset-9, 1) or return 1 if $offset > 9;
     $flags &= 0x05; # only look for audio/video
@@ -491,10 +491,10 @@ sub ProcessFLV($$)
         my $len = unpack('x4N', $buff);
         my $type = $len >> 24;
         $len &= 0x00ffffff;
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $type);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $type);
         if ($verbose > 1) {
             my $name = $tagInfo ? $$tagInfo{Name} : "type $type";
-            $exifTool->VPrint(1, "FLV $name packet, len $len\n");
+            $et->VPrint(1, "FLV $name packet, len $len\n");
         }
         undef $buff;
         if ($tagInfo and $$tagInfo{SubDirectory}) {
@@ -507,19 +507,19 @@ sub ProcessFLV($$)
                     if ($len>=1 and $raf->Read($buff, 1) == 1) {
                         $len -= 1;
                     } else {
-                        $exifTool->Warn("Bad $$tagInfo{Name} packet");
+                        $et->Warn("Bad $$tagInfo{Name} packet");
                         last;
                     }
                 }
             } elsif ($raf->Read($buff, $len) == $len) {
                 $len = 0;
             } else {
-                $exifTool->Warn('Truncated Meta packet');
+                $et->Warn('Truncated Meta packet');
                 last;
             }
         }
         if (defined $buff) {
-            $exifTool->HandleTag($tagTablePtr, $type, undef,
+            $et->HandleTag($tagTablePtr, $type, undef,
                 DataPt  => \$buff,
                 DataPos => $raf->Tell() - length($buff),
             );
@@ -535,8 +535,8 @@ sub ProcessFLV($$)
 # Inputs: 0) ExifTool object ref, 1) tag name, 2) tag value
 sub FoundFlashTag($$$)
 {
-    my ($exifTool, $tag, $val) = @_;
-    $exifTool->HandleTag(\%Image::ExifTool::Flash::Main, $tag, $val);
+    my ($et, $tag, $val) = @_;
+    $et->HandleTag(\%Image::ExifTool::Flash::Main, $tag, $val);
 }
 
 #------------------------------------------------------------------------------
@@ -557,7 +557,7 @@ sub ReadCompressed($$$$)
     # uncompress if necessary
     if ($inflate) {
         unless (ref $inflate) {
-            unless (eval 'require Compress::Zlib') {
+            unless (eval { require Compress::Zlib }) {
                 $_[3] = 'Install Compress::Zlib to extract compressed information';
                 return 0;
             }
@@ -596,7 +596,7 @@ sub ReadCompressed($$$$)
 # Returns: 1 on success, 0 if this wasn't a valid Flash file
 sub ProcessSWF($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my ($buff, $hasMeta);
 
@@ -605,16 +605,16 @@ sub ProcessSWF($$)
     my ($compressed, $vers) = ($1 eq 'C' ? 1 : 0, ord($2));
 
     SetByteOrder('II');
-    $exifTool->SetFileType();
+    $et->SetFileType();
     GetTagTable('Image::ExifTool::Flash::Main');  # make sure table is initialized
 
-    FoundFlashTag($exifTool, FlashVersion => $vers);
-    FoundFlashTag($exifTool, Compressed => $compressed);
+    FoundFlashTag($et, FlashVersion => $vers);
+    FoundFlashTag($et, Compressed => $compressed);
 
     # read the next 64 bytes of the file (and inflate if necessary)
     $buff = '';
     unless (ReadCompressed($raf, $buff, 64, $compressed)) {
-        $exifTool->Warn($compressed) if $compressed;
+        $et->Warn($compressed) if $compressed;
         return 1;
     }
 
@@ -623,7 +623,7 @@ sub ProcessSWF($$)
     my $totBits = 5 + $nBits * 4;           # total bits in Rect structure
     my $nBytes = int(($totBits + 7) / 8);   # byte length of Rect structure
     if (length $buff < $nBytes + 4) {
-        $exifTool->Warn('Truncated Flash file');
+        $et->Warn('Truncated Flash file');
         return 1;
     }
     my $bits = unpack("B$totBits", $buff);
@@ -633,14 +633,14 @@ sub ProcessSWF($$)
     map { $_ = unpack('N', pack('B32', '0' x (32 - length $_) . $_)) } @vals;
 
     # calculate and store ImageWidth/Height
-    FoundFlashTag($exifTool, ImageWidth  => ($vals[1] - $vals[0]) / 20);
-    FoundFlashTag($exifTool, ImageHeight => ($vals[3] - $vals[2]) / 20);
+    FoundFlashTag($et, ImageWidth  => ($vals[1] - $vals[0]) / 20);
+    FoundFlashTag($et, ImageHeight => ($vals[3] - $vals[2]) / 20);
 
     # get frame rate and count
     @vals = unpack("x${nBytes}v2", $buff);
-    FoundFlashTag($exifTool, FrameRate => $vals[0] / 256);
-    FoundFlashTag($exifTool, FrameCount => $vals[1]);
-    FoundFlashTag($exifTool, Duration => $vals[1] * 256 / $vals[0]) if $vals[0];
+    FoundFlashTag($et, FrameRate => $vals[0] / 256);
+    FoundFlashTag($et, FrameCount => $vals[1]);
+    FoundFlashTag($et, Duration => $vals[1] * 256 / $vals[0]) if $vals[0];
 
     # scan through the tags to find FileAttributes and XMP
     $buff = substr($buff, $nBytes + 4);
@@ -651,13 +651,13 @@ sub ProcessSWF($$)
         my $pos = 2;
         my $tag = $code >> 6;
         my $size = $code & 0x3f;
-        $exifTool->VPrint(1, "SWF tag $tag ($size bytes):\n");
+        $et->VPrint(1, "SWF tag $tag ($size bytes):\n");
         last unless $tag == 69 or $tag == 77 or $hasMeta;
         # read enough to get a complete short record
         if ($pos + $size > $buffLen) {
             # (read 2 extra bytes if available to get next tag word)
             unless (ReadCompressed($raf, $buff, $size + 2, $compressed)) {
-                $exifTool->Warn($compressed) if $compressed;
+                $et->Warn($compressed) if $compressed;
                 return 1;
             }
             $buffLen = length $buff;
@@ -671,23 +671,23 @@ sub ProcessSWF($$)
             last if $size > 1000000; # don't read anything huge
             if ($pos + $size > $buffLen) {
                 unless (ReadCompressed($raf, $buff, $size + 2, $compressed)) {
-                    $exifTool->Warn($compressed) if $compressed;
+                    $et->Warn($compressed) if $compressed;
                     return 1;
                 }
                 $buffLen = length $buff;
                 last if $pos + $size > $buffLen;
             }
-            $exifTool->VPrint(1, "  [extended size $size bytes]\n");
+            $et->VPrint(1, "  [extended size $size bytes]\n");
         }
         if ($tag == 69) {       # FileAttributes
             last unless $size;
             my $flags = Get8u(\$buff, $pos);
-            FoundFlashTag($exifTool, $tag => $flags);
+            FoundFlashTag($et, $tag => $flags);
             last unless $flags & 0x10;  # only continue if we have metadata (XMP)
             $hasMeta = 1;
         } elsif ($tag == 77) {  # Metadata
             my $val = substr($buff, $pos, $size);
-            FoundFlashTag($exifTool, $tag => $val);
+            FoundFlashTag($et, $tag => $val);
             last;
         }
         last if $pos + 2 > $buffLen;
@@ -721,7 +721,7 @@ will add AMF3 support.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -19,7 +19,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Exif;
 use Image::ExifTool::ASF;   # for GetGUID()
 
-$VERSION = '1.21';
+$VERSION = '1.22';
 
 sub ProcessFPX($$);
 sub ProcessFPXR($$$);
@@ -1010,7 +1010,7 @@ Image::ExifTool::AddCompositeTags('Image::ExifTool::FlashPix');
 # Returns: list of hyperlinks
 sub ProcessHyperlinks($$)
 {
-    my ($val, $exifTool) = @_;
+    my ($val, $et) = @_;
 
     # process as an array of VT_VARIANT's
     my $dirEnd = length $val;
@@ -1020,7 +1020,7 @@ sub ProcessHyperlinks($$)
     my ($i, @vals);
     for ($i=0; $i<$num; ++$i) {
         # read VT_BLOB entries as an array of VT_VARIANT's
-        my $value = ReadFPXValue($exifTool, \$val, $valPos, VT_VARIANT, $dirEnd);
+        my $value = ReadFPXValue($et, \$val, $valPos, VT_VARIANT, $dirEnd);
         last unless defined $value;
         push @vals, $value;
     }
@@ -1041,7 +1041,7 @@ sub ProcessHyperlinks($$)
 #          value offset to end of value if successful, or returns undef on error
 sub ReadFPXValue($$$$$;$$)
 {
-    my ($exifTool, $dataPt, $valPos, $type, $dirEnd, $noPad, $codePage) = @_;
+    my ($et, $dataPt, $valPos, $type, $dirEnd, $noPad, $codePage) = @_;
     my @vals;
 
     my $format = $oleFormat{$type & 0x0fff};
@@ -1077,7 +1077,7 @@ sub ReadFPXValue($$$$$;$$)
             if ($format eq 'VT_VARIANT') {
                 my $subType = Get32u($dataPt, $valPos);
                 $valPos += $size;
-                $val = ReadFPXValue($exifTool, $dataPt, $valPos, $subType, $dirEnd, $noPad, $codePage);
+                $val = ReadFPXValue($et, $dataPt, $valPos, $subType, $dirEnd, $noPad, $codePage);
                 last unless defined $val;
                 push @vals, $val;
                 next;   # avoid adding $size to $valPos again
@@ -1102,13 +1102,13 @@ sub ReadFPXValue($$$$$;$$)
                 $val = substr($$dataPt, $valPos + 4, $len);
                 if ($format eq 'VT_LPWSTR') {
                     # convert wide string from Unicode
-                    $val = $exifTool->Decode($val, 'UCS2');
+                    $val = $et->Decode($val, 'UCS2');
                 } elsif ($codePage) {
                     my $charset = $Image::ExifTool::charsetName{"cp$codePage"};
                     if ($charset) {
-                        $val = $exifTool->Decode($val, $charset);
+                        $val = $et->Decode($val, $charset);
                     } elsif ($codePage eq 1200) {   # UTF-16, little endian
-                        $val = $exifTool->Decode(undef, 'UCS2', 'II');
+                        $val = $et->Decode(undef, 'UCS2', 'II');
                     }
                 }
                 $val =~ s/\0.*//s;  # truncate at null terminator
@@ -1130,7 +1130,7 @@ sub ReadFPXValue($$$$$;$$)
             push @vals, $val;
         }
         # join VT_ values with commas unless we want an array
-        @vals = ( join $exifTool->Options('ListSep'), @vals ) if @vals > 1 and not wantarray;
+        @vals = ( join $et->Options('ListSep'), @vals ) if @vals > 1 and not wantarray;
         last;   # didn't really want to loop
     }
     $_[2] = $valPos;    # return updated value position
@@ -1152,7 +1152,7 @@ sub ReadFPXValue($$$$$;$$)
 #        so this routine is entirely based on observations from sample files
 sub ProcessContents($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $isFLA;
 
@@ -1169,13 +1169,13 @@ sub ProcessContents($$$)
         $$dirInfo{DirStart} = pos($$dataPt) - 36;
         if ($$dataPt =~ /<\0\?\0x\0p\0a\0c\0k\0e\0t\0 \0e\0n\0d\0=\0['"]\0[wr]\0['"]\0\?\0>\0?/g) {
             $$dirInfo{DirLen} = pos($$dataPt) - $$dirInfo{DirStart};
-            Image::ExifTool::XMP::ProcessXMP($exifTool, $dirInfo, $tagTablePtr);
+            Image::ExifTool::XMP::ProcessXMP($et, $dirInfo, $tagTablePtr);
             # override format if not already FLA but XMP-dc:Format indicates it is
-            $isFLA = 1 if $$exifTool{FILE_TYPE} ne 'FLA' and $$exifTool{VALUE}{Format} and
-                          $$exifTool{VALUE}{Format} eq 'application/vnd.adobe.fla';
+            $isFLA = 1 if $$et{FILE_TYPE} ne 'FLA' and $$et{VALUE}{Format} and
+                          $$et{VALUE}{Format} eq 'application/vnd.adobe.fla';
         }
     }
-    $exifTool->OverrideFileType('FLA') if $isFLA;
+    $et->OverrideFileType('FLA') if $isFLA;
     return 1;
 }
 
@@ -1199,27 +1199,27 @@ sub CheckBOM($$)
 # Returns: 1 on success
 sub ProcessProperties($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $pos = $$dirInfo{DirStart} || 0;
     my $dirLen = $$dirInfo{DirLen} || length($$dataPt) - $pos;
     my $dirEnd = $pos + $dirLen;
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     my $n;
 
     if ($dirLen < 48) {
-        $exifTool->Warn('Truncated FPX properties');
+        $et->Warn('Truncated FPX properties');
         return 0;
     }
     # check and set our byte order if necessary
     unless (CheckBOM($dataPt, $pos)) {
-        $exifTool->Warn('Bad FPX property byte order mark');
+        $et->Warn('Bad FPX property byte order mark');
         return 0;
     }
     # get position of start of section
     $pos = Get32u($dataPt, $pos + 44);
     if ($pos < 48) {
-        $exifTool->Warn('Bad FPX property section offset');
+        $et->Warn('Bad FPX property section offset');
         return 0;
     }
     for ($n=0; $n<2; ++$n) {
@@ -1230,9 +1230,9 @@ sub ProcessProperties($$$)
         my $size = Get32u($dataPt, $pos);
         last unless $size;
         my $numEntries = Get32u($dataPt, $pos + 4);
-        $verbose and $exifTool->VerboseDir('Property Info', $numEntries, $size);
+        $verbose and $et->VerboseDir('Property Info', $numEntries, $size);
         if ($pos + 8 + 8 * $numEntries > $dirEnd) {
-            $exifTool->Warn('Truncated property list');
+            $et->Warn('Truncated property list');
             last;
         }
         my $index;
@@ -1262,7 +1262,7 @@ sub ProcessProperties($$$)
                     $name =~ s/(^| )([a-z])/\U$2/g; # start with uppercase
                     $name =~ tr/-_a-zA-Z0-9//dc;    # remove illegal characters
                     next unless length $name;
-                    $exifTool->VPrint(0, "$$exifTool{INDENT}\[adding $name]\n") if $verbose;
+                    $et->VPrint(0, "$$et{INDENT}\[adding $name]\n") if $verbose;
                     AddTagToTable($tagTablePtr, $tag, { Name => $name });
                 }
                 next;
@@ -1273,8 +1273,8 @@ sub ProcessProperties($$$)
                 $tag = $dictionary{$tag};
                 $custom = 1;
             }
-            my @vals = ReadFPXValue($exifTool, $dataPt, $valPos, $type, $dirEnd, undef, $codePage);
-            @vals or $exifTool->Warn('Error reading property value');
+            my @vals = ReadFPXValue($et, $dataPt, $valPos, $type, $dirEnd, undef, $codePage);
+            @vals or $et->Warn('Error reading property value');
             $val = @vals > 1 ? \@vals : $vals[0];
             my $format = $type & 0x0fff;
             my $flags = $type & 0xf000;
@@ -1286,25 +1286,25 @@ sub ProcessProperties($$$)
             if (not $custom and ($tag == 1 or $tag == 0x80000000)) {
                 # get tagInfo from SummaryInfo table
                 my $summaryTable = GetTagTable('Image::ExifTool::FlashPix::SummaryInfo');
-                $tagInfo = $exifTool->GetTagInfo($summaryTable, $tag);
+                $tagInfo = $et->GetTagInfo($summaryTable, $tag);
                 if ($tag == 1) {
                     $val += 0x10000 if $val < 0; # (may be incorrectly stored as int16s)
                     $codePage = $val;            # save code page for translating values
                 }
             } elsif ($$tagTablePtr{$tag}) {
-                $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+                $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
             } elsif ($$tagTablePtr{VARS} and not $custom) {
                 # mask off insignificant bits of tag ID if necessary
                 my $masked = $$tagTablePtr{VARS};
                 my $mask;
                 foreach $mask (keys %$masked) {
                     if ($masked->{$mask}->{$tag & $mask}) {
-                        $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag & $mask);
+                        $tagInfo = $et->GetTagInfo($tagTablePtr, $tag & $mask);
                         last;
                     }
                 }
             }
-            $exifTool->HandleTag($tagTablePtr, $tag, $val,
+            $et->HandleTag($tagTablePtr, $tag, $val,
                 DataPt  => $dataPt,
                 Start   => $valStart,
                 Size    => $valPos - $valStart,
@@ -1315,7 +1315,7 @@ sub ProcessProperties($$$)
             );
         }
         # issue warning if we hit end of property section prematurely
-        $exifTool->Warn('Truncated property data') if $index < $numEntries;
+        $et->Warn('Truncated property data') if $index < $numEntries;
         last unless $$dirInfo{Multi};
         $pos += $size;
     }
@@ -1354,14 +1354,14 @@ sub LoadChain($$$$$)
 # Returns: 1 on success
 sub ProcessFPXR($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirStart = $$dirInfo{DirStart};
     my $dirLen = $$dirInfo{DirLen};
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
 
     if ($dirLen < 13) {
-        $exifTool->Warn('FPXR segment to small');
+        $et->Warn('FPXR segment to small');
         return 0;
     }
 
@@ -1370,19 +1370,19 @@ sub ProcessFPXR($$$)
 
     if ($type == 1) {   # a "Contents List" segment
 
-        $vers != 0 and $exifTool->Warn("Untested FPXR version $vers");
-        if ($$exifTool{FPXR}) {
-            $exifTool->Warn('Multiple FPXR contents lists');
-            delete $$exifTool{FPXR};
+        $vers != 0 and $et->Warn("Untested FPXR version $vers");
+        if ($$et{FPXR}) {
+            $et->Warn('Multiple FPXR contents lists');
+            delete $$et{FPXR};
         }
         my $numEntries = unpack('x7n', $$dataPt);
         my @contents;
-        $verbose and $exifTool->VerboseDir('Contents List', $numEntries);
+        $verbose and $et->VerboseDir('Contents List', $numEntries);
         my $pos = 9;
         my $entry;
         for ($entry = 0; $entry < $numEntries; ++$entry) {
             if ($pos + 4 > $dirLen) {
-                $exifTool->Warn('Truncated FPXR contents');
+                $et->Warn('Truncated FPXR contents');
                 return 0;
             }
             my ($size, $default) = unpack("x${pos}Na", $$dataPt);
@@ -1391,14 +1391,14 @@ sub ProcessFPXR($$$)
             # (very odd, since the size word is big-endian),
             # and the first char must be '/'
             unless ($$dataPt =~ m{\G(/\0(..)*?)\0\0}sg) {
-                $exifTool->Warn('Invalid FPXR stream name');
+                $et->Warn('Invalid FPXR stream name');
                 return 0;
             }
             # convert stream pathname to ascii
             my $name = Image::ExifTool::Decode(undef, $1, 'UCS2', 'II', 'Latin');
             if ($verbose) {
                 my $psize = ($size == 0xffffffff) ? 'storage' : "$size bytes";
-                $exifTool->VPrint(0,"  |  $entry) Name: '$name' [$psize]\n");
+                $et->VPrint(0,"  |  $entry) Name: '$name' [$psize]\n");
             }
             # remove directory specification
             $name =~ s{.*/}{}s;
@@ -1406,7 +1406,7 @@ sub ProcessFPXR($$$)
             my $classID;
             if ($size == 0xffffffff) {
                 unless ($$dataPt =~ m{(.{16})}sg) {
-                    $exifTool->Warn('Truncated FPXR storage class ID');
+                    $et->Warn('Truncated FPXR storage class ID');
                     return 0;
                 }
                 # unpack class ID in case we want to use it sometime
@@ -1422,15 +1422,15 @@ sub ProcessFPXR($$$)
                 ClassID => $classID,
             };
         }
-        # save contents list as $exifTool member variable
+        # save contents list as $et member variable
         # (must do this last so we don't save list on error)
-        $$exifTool{FPXR} = \@contents;
+        $$et{FPXR} = \@contents;
 
     } elsif ($type == 2) {  # a "Stream Data" segment
 
         # get the contents list index and stream data offset
         my ($index, $offset) = unpack('x7nN', $$dataPt);
-        my $fpxr = $$exifTool{FPXR};
+        my $fpxr = $$et{FPXR};
         if ($fpxr and $$fpxr[$index]) {
             my $obj = $$fpxr[$index];
             # extract stream data (after 13-byte header)
@@ -1444,17 +1444,17 @@ sub ProcessFPXR($$$)
                 if ($pad >= 0) {
                     if ($pad) {
                         if ($pad > 0x10000) {
-                            $exifTool->Warn("Bad FPXR stream offset ($offset)");
+                            $et->Warn("Bad FPXR stream offset ($offset)");
                         } else {
                             # pad with default value to specified offset
-                            $exifTool->Warn("Padding FPXR stream with $pad default bytes",1);
+                            $et->Warn("Padding FPXR stream with $pad default bytes",1);
                             $$obj{Stream} .= ($$obj{Default} x $pad);
                         }
                     }
                     # concatenate data with this stream
                     $$obj{Stream} .= substr($$dataPt, $dirStart+13);
                 } else {
-                    $exifTool->Warn("Duplicate FPXR stream data at offset $offset");
+                    $et->Warn("Duplicate FPXR stream data at offset $offset");
                     substr($$obj{Stream}, $offset, -$pad) = substr($$dataPt, $dirStart+13);
                 }
             }
@@ -1462,62 +1462,62 @@ sub ProcessFPXR($$$)
             my $len = length $$obj{Stream};
             if ($len >= $$obj{Size}) {
                 if ($verbose) {
-                    $exifTool->VPrint(0, "  + [FPXR stream, Contents index $index, $len bytes]\n");
+                    $et->VPrint(0, "  + [FPXR stream, Contents index $index, $len bytes]\n");
                 }
                 if ($len > $$obj{Size}) {
-                    $exifTool->Warn('Extra data in FPXR segment (truncated)');
+                    $et->Warn('Extra data in FPXR segment (truncated)');
                     $$obj{Stream} = substr($$obj{Stream}, 0, $$obj{Size});
                 }
                 my $tag = $$obj{Name};
                 my $tagInfo;
                 unless ($$tagTablePtr{$tag}) {
                     # remove instance number or class ID from tag if necessary
-                    $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $1) if
+                    $tagInfo = $et->GetTagInfo($tagTablePtr, $1) if
                         ($tag =~ /(.*) \d{6}$/s and $$tagTablePtr{$1}) or
                         ($tag =~ /(.*)_[0-9a-f]{16}$/s and $$tagTablePtr{$1});
                 }
                 # save the data for this tag
-                $exifTool->HandleTag($tagTablePtr, $tag, $$obj{Stream},
+                $et->HandleTag($tagTablePtr, $tag, $$obj{Stream},
                     DataPt => \$$obj{Stream},
                     TagInfo => $tagInfo,
                 );
                 delete $$obj{Stream}; # done with this stream
             }
         # hack for improperly stored FujiFilm PreviewImage (stored with no contents list)
-        } elsif ($index == 512 and $dirLen > 60 and ($$exifTool{FujiPreview} or
+        } elsif ($index == 512 and $dirLen > 60 and ($$et{FujiPreview} or
             ($dirLen > 64 and substr($$dataPt, $dirStart+60, 4) eq "\xff\xd8\xff\xdb")))
         {
             # recombine PreviewImage, skipping unknown 60 byte header
-            if ($$exifTool{FujiPreview}) {
-                $$exifTool{FujiPreview} .= substr($$dataPt, $dirStart+60);
+            if ($$et{FujiPreview}) {
+                $$et{FujiPreview} .= substr($$dataPt, $dirStart+60);
             } else {
-                $$exifTool{FujiPreview} = substr($$dataPt, $dirStart+60);
+                $$et{FujiPreview} = substr($$dataPt, $dirStart+60);
             }
         } else {
             # (Kodak uses index 255 for a free segment in images from some cameras)
-            $exifTool->Warn("Unlisted FPXR segment (index $index)") if $index != 255;
+            $et->Warn("Unlisted FPXR segment (index $index)") if $index != 255;
         }
 
     } elsif ($type ne 3) {  # not a "Reserved" segment
 
-        $exifTool->Warn("Unknown FPXR segment (type $type)");
+        $et->Warn("Unknown FPXR segment (type $type)");
 
     }
 
     # clean up if this was the last FPXR segment
     if ($$dirInfo{LastFPXR}) {
-        if ($$exifTool{FPXR}) {
+        if ($$et{FPXR}) {
             my $obj;
             my $i = 0;
-            foreach $obj (@{$$exifTool{FPXR}}) {
-                $exifTool->Warn("Missing stream for FPXR object $i") if defined $$obj{Stream};
+            foreach $obj (@{$$et{FPXR}}) {
+                $et->Warn("Missing stream for FPXR object $i") if defined $$obj{Stream};
                 ++$i;
             }
-            delete $$exifTool{FPXR};    # delete our temporary variables
+            delete $$et{FPXR};    # delete our temporary variables
         }
-        if ($$exifTool{FujiPreview}) {
-            $exifTool->FoundTag('PreviewImage', $$exifTool{FujiPreview});
-            delete $$exifTool{FujiPreview};
+        if ($$et{FujiPreview}) {
+            $et->FoundTag('PreviewImage', $$et{FujiPreview});
+            delete $$et{FujiPreview};
         }
     }
     return 1;
@@ -1558,7 +1558,7 @@ sub SetDocNum($$;$$$)
 # Returns: 1 on success, 0 if this wasn't a valid FPX-format file
 sub ProcessFPX($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my ($buff, $out, %dumpParms, $oldIndent, $miniStreamBuff);
     my ($tag, %hier, %objIndex);
@@ -1569,14 +1569,14 @@ sub ProcessFPX($$)
     return 0 unless $buff =~ /^\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1/;
 
     # set FileType initially based on file extension (we may override this later)
-    my $fileType = $exifTool->{FILE_EXT};
+    my $fileType = $$et{FILE_EXT};
     $fileType = 'FPX' unless $fileType and $fpxFileType{$fileType};
-    $exifTool->SetFileType($fileType);
+    $et->SetFileType($fileType);
     SetByteOrder(substr($buff, 0x1c, 2) eq "\xff\xfe" ? 'MM' : 'II');
     my $tagTablePtr = GetTagTable('Image::ExifTool::FlashPix::Main');
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     # copy LargeFileSupport option to RAF for use in LoadChain
-    $$raf{LargeFileSupport} = $exifTool->Options('LargeFileSupport');
+    $$raf{LargeFileSupport} = $et->Options('LargeFileSupport');
 
     my $sectSize = 1 << Get16u(\$buff, 0x1e);
     my $miniSize = 1 << Get16u(\$buff, 0x20);
@@ -1589,7 +1589,7 @@ sub ProcessFPX($$)
     my $difCount   = Get32u(\$buff, 0x48);  # number of DIF sectors
 
     if ($verbose) {
-        $out = $exifTool->Options('TextOut');
+        $out = $et->Options('TextOut');
         $dumpParms{Out} = $out;
         $dumpParms{MaxLen} = 96 if $verbose == 3;
         print $out "  Sector size=$sectSize\n  FAT: Count=$fatCount\n";
@@ -1614,7 +1614,7 @@ sub ProcessFPX($$)
             unless ($raf->Seek($offset, 0) and
                     $raf->Read($fatSect, $sectSize) == $sectSize)
             {
-                $exifTool->Error("Error reading FAT from sector $sect");
+                $et->Error("Error reading FAT from sector $sect");
                 return 1;
             }
             $fat .= $fatSect;
@@ -1624,7 +1624,7 @@ sub ProcessFPX($$)
         # read next DIF (Dual Indirect FAT) sector
         my $offset = $difStart * $sectSize + HDR_SIZE;
         unless ($raf->Seek($offset, 0) and $raf->Read($buff, $sectSize) == $sectSize) {
-            $exifTool->Error("Error reading DIF sector $difStart");
+            $et->Error("Error reading DIF sector $difStart");
             return 1;
         }
         # set end of sector information in this DIF
@@ -1634,7 +1634,7 @@ sub ProcessFPX($$)
         $difStart = Get32u(\$buff, $endPos);
     }
     if ($fatCountCheck != $fatCount) {
-        $exifTool->Warn("Bad number of FAT sectors (expected $fatCount but found $fatCountCheck)");
+        $et->Warn("Bad number of FAT sectors (expected $fatCount but found $fatCountCheck)");
     }
 #
 # load the mini-FAT and the directory
@@ -1642,7 +1642,7 @@ sub ProcessFPX($$)
     my $miniFat = LoadChain($raf, $miniStart, \$fat, $sectSize, HDR_SIZE);
     my $dir = LoadChain($raf, $dirStart, \$fat, $sectSize, HDR_SIZE);
     unless (defined $miniFat and defined $dir) {
-        $exifTool->Error('Error reading mini-FAT or directory stream');
+        $et->Error('Error reading mini-FAT or directory stream');
         return 1;
     }
     if ($verbose) {
@@ -1657,9 +1657,9 @@ sub ProcessFPX($$)
 # process the directory
 #
     if ($verbose) {
-        $oldIndent = $exifTool->{INDENT};
-        $exifTool->{INDENT} .= '| ';
-        $exifTool->VerboseDir('FPX', undef, length $dir);
+        $oldIndent = $$et{INDENT};
+        $$et{INDENT} .= '| ';
+        $et->VerboseDir('FPX', undef, length $dir);
     }
     my $miniStream;
     $endPos = length($dir);
@@ -1672,7 +1672,7 @@ sub ProcessFPX($$)
         my $type = Get8u(\$dir, $pos + 0x42);
         next if $type == 0; # skip invalid entries
         if ($type > 5) {
-            $exifTool->Warn("Invalid directory entry type $type");
+            $et->Warn("Invalid directory entry type $type");
             last;   # rest of directory is probably garbage
         }
         # get entry name (note: this is supposed to be length in 2-byte
@@ -1690,7 +1690,7 @@ sub ProcessFPX($$)
         unless ($miniStream) {
             $miniStreamBuff = LoadChain($raf, $sect, \$fat, $sectSize, HDR_SIZE);
             unless (defined $miniStreamBuff) {
-                $exifTool->Warn('Error loading Mini-FAT stream');
+                $et->Warn('Error loading Mini-FAT stream');
                 last;
             }
             $miniStream = new File::RandomAccess(\$miniStreamBuff);
@@ -1698,10 +1698,10 @@ sub ProcessFPX($$)
 
         my $tagInfo;
         if ($$tagTablePtr{$tag}) {
-            $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+            $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
         } else {
             # remove instance number or class ID from tag if necessary
-            $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $1) if
+            $tagInfo = $et->GetTagInfo($tagTablePtr, $1) if
                 ($tag =~ /(.*) \d{6}$/s and $$tagTablePtr{$1}) or
                 ($tag =~ /(.*)_[0-9a-f]{16}$/s and $$tagTablePtr{$1});
         }
@@ -1738,7 +1738,7 @@ sub ProcessFPX($$)
             }
             unless (defined $buff) {
                 my $name = $tagInfo ? $$tagInfo{Name} : 'unknown';
-                $exifTool->Warn("Error reading $name stream");
+                $et->Warn("Error reading $name stream");
                 $buff = '';
             }
         } elsif ($typeStr eq 'ROOT') {
@@ -1755,7 +1755,7 @@ sub ProcessFPX($$)
             $extra .= " Left=$lSib" unless $lSib == FREE_SECT;
             $extra .= " Right=$rSib" unless $rSib == FREE_SECT;
             $extra .= " Child=$chld" unless $chld == FREE_SECT;
-            $exifTool->VerboseInfo($tag, $tagInfo,
+            $et->VerboseInfo($tag, $tagInfo,
                 Index  => $index,
                 Value  => $buff,
                 DataPt => \$buff,
@@ -1764,7 +1764,7 @@ sub ProcessFPX($$)
             );
         }
         if ($tagInfo and $buff) {
-            my $num = $$exifTool{NUM_FOUND};
+            my $num = $$et{NUM_FOUND};
             my $subdir = $$tagInfo{SubDirectory};
             if ($subdir) {
                 my %dirInfo = (
@@ -1774,21 +1774,21 @@ sub ProcessFPX($$)
                     Multi    => $$tagInfo{Multi},
                 );
                 my $subTablePtr = GetTagTable($$subdir{TagTable});
-                $exifTool->ProcessDirectory(\%dirInfo, $subTablePtr,  $$subdir{ProcessProc});
+                $et->ProcessDirectory(\%dirInfo, $subTablePtr,  $$subdir{ProcessProc});
             } else {
-                $exifTool->FoundTag($tagInfo, $buff);
+                $et->FoundTag($tagInfo, $buff);
             }
             # save object index number for all found tags
-            my $num2 = $$exifTool{NUM_FOUND};
+            my $num2 = $$et{NUM_FOUND};
             $objIndex{++$num} = $index while $num < $num2;
         }
     }
     # set document numbers for tags extracted from embedded documents
-    unless ($$exifTool{DOC_NUM}) {
+    unless ($$et{DOC_NUM}) {
         # initialize document number for all objects, beginning at root (index 0)
         SetDocNum(\%hier, 0);
         # set family 3 group name for all tags in embedded documents
-        my $order = $$exifTool{FILE_ORDER};
+        my $order = $$et{FILE_ORDER};
         my (@pri, $copy, $member);
         foreach $tag (keys %$order) {
             my $num = $$order{$tag};
@@ -1796,18 +1796,18 @@ sub ProcessFPX($$)
             my $obj = $hier{$objIndex{$num}} or next;
             my $docNums = $$obj{DocNum};
             next unless $docNums and @$docNums;
-            $$exifTool{TAG_EXTRA}{$tag}{G3} = join '-', @$docNums;
+            $$et{TAG_EXTRA}{$tag}{G3} = join '-', @$docNums;
             push @pri, $tag unless $tag =~ / /; # save keys for priority sub-doc tags
         }
         # swap priority sub-document tags with main document tags if they exist
         foreach $tag (@pri) {
             for ($copy=1; ;++$copy) {
                 my $key = "$tag ($copy)";
-                last unless defined $$exifTool{VALUE}{$key};
-                my $extra = $$exifTool{TAG_EXTRA}{$key};
+                last unless defined $$et{VALUE}{$key};
+                my $extra = $$et{TAG_EXTRA}{$key};
                 next if $extra and $$extra{G3}; # not Main if family 3 group is set
                 foreach $member ('PRIORITY','VALUE','FILE_ORDER','TAG_INFO','TAG_EXTRA') {
-                    my $pHash = $$exifTool{$member};
+                    my $pHash = $$et{$member};
                     my $t = $$pHash{$tag};
                     $$pHash{$tag} = $$pHash{$key};
                     $$pHash{$key} = $t;
@@ -1816,16 +1816,16 @@ sub ProcessFPX($$)
             }
         }
     }
-    $exifTool->{INDENT} = $oldIndent if $verbose;
+    $$et{INDENT} = $oldIndent if $verbose;
     # try to better identify the file type
-    if ($$exifTool{VALUE}{FileType} eq 'FPX') {
-        my $val = $$exifTool{CompObjUserType} || $$exifTool{Software};
+    if ($$et{VALUE}{FileType} eq 'FPX') {
+        my $val = $$et{CompObjUserType} || $$et{Software};
         if ($val) {
             my %type = ( Word => 'DOC', PowerPoint => 'PPT', Excel => 'XLS' );
             my $pat;
             foreach $pat (sort keys %type) {
                 next unless $val =~ /$pat/;
-                $exifTool->OverrideFileType($type{$pat});
+                $et->OverrideFileType($type{$pat});
                 last;
             }
         }
@@ -1853,7 +1853,7 @@ JPEG images.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -19,7 +19,7 @@ use strict;
 use vars qw($VERSION %ttLang);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.06';
+$VERSION = '1.07';
 
 sub ProcessOTF($$);
 
@@ -335,7 +335,7 @@ my %ttCharset = (
 # Returns: 1 on success, 0 if this wasn't a valid TrueType font collection
 sub ProcessTTC($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my ($buff, $i);
 
@@ -345,19 +345,19 @@ sub ProcessTTC($$)
     my $num = Get32u(\$buff, 8);
     # might as well put a limit on the number of fonts we will parse (< 256)
     return 0 unless $num < 0x100 and $raf->Read($buff, $num * 4) == $num * 4;
-    $exifTool->SetFileType('TTC');
+    $et->SetFileType('TTC');
     my $tagTablePtr = GetTagTable('Image::ExifTool::Font::Main');
-    $exifTool->HandleTag($tagTablePtr, 'numfonts', $num);
+    $et->HandleTag($tagTablePtr, 'numfonts', $num);
     # loop through all fonts in the collection
     for ($i=0; $i<$num; ++$i) {
         my $n = $i + 1;
-        $exifTool->VPrint(0, "Font $n:\n");
-        $$exifTool{SET_GROUP1} = "+$n";
+        $et->VPrint(0, "Font $n:\n");
+        $$et{SET_GROUP1} = "+$n";
         my $offset = Get32u(\$buff, $i * 4);
         $raf->Seek($offset, 0) or last;
-        ProcessOTF($exifTool, $dirInfo) or last;
+        ProcessOTF($et, $dirInfo) or last;
     }
-    delete $$exifTool{SET_GROUP1};
+    delete $$et{SET_GROUP1};
     return 1;
 }
 
@@ -367,7 +367,7 @@ sub ProcessTTC($$)
 # Returns: 1 on success, 0 if this wasn't a valid TrueType font file
 sub ProcessOTF($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my ($tbl, $buff, $pos, $i);
     my $base = $$dirInfo{Base} || 0;
@@ -375,17 +375,17 @@ sub ProcessOTF($$)
     return 0 unless $raf->Read($buff, 12) == 12;
     return 0 unless $buff =~ /^(\0\x01\0\0|OTTO|true|typ1|\xa5(kbd|lst))[\0\x01]/;
 
-    $exifTool->SetFileType($1 eq 'OTTO' ? 'OTF' : 'TTF');
+    $et->SetFileType($1 eq 'OTTO' ? 'OTF' : 'TTF');
     SetByteOrder('MM');
     my $numTables = Get16u(\$buff, 4);
     return 0 unless $numTables > 0 and $numTables < 0x200;
     my $len = $numTables * 16;
     return 0 unless $raf->Read($tbl, $len) == $len;
 
-    my $verbose = $exifTool->Options('Verbose');
-    my $oldIndent = $$exifTool{INDENT};
-    $$exifTool{INDENT} .= '| ';
-    $exifTool->VerboseDir('TrueType', $numTables) if $verbose;
+    my $verbose = $et->Options('Verbose');
+    my $oldIndent = $$et{INDENT};
+    $$et{INDENT} .= '| ';
+    $et->VerboseDir('TrueType', $numTables) if $verbose;
 
     for ($pos=0; $pos<$len; $pos+=16) {
         # look for 'name' table
@@ -394,27 +394,27 @@ sub ProcessOTF($$)
         my $offset = Get32u(\$tbl, $pos + 8);
         my $size   = Get32u(\$tbl, $pos + 12);
         unless ($raf->Seek($offset+$base, 0) and $raf->Read($buff, $size) == $size) {
-            $exifTool->Warn("Error reading '$tag' data");
+            $et->Warn("Error reading '$tag' data");
             next;
         }
         if ($verbose) {
             $tag =~ s/([\0-\x1f\x80-\xff])/sprintf('\x%.2x',ord $1)/ge;
             my $str = sprintf("%s%d) Tag '%s' (offset 0x%.4x, %d bytes)\n",
-                              $$exifTool{INDENT}, $pos/16, $tag, $offset, $size);
-            $exifTool->VPrint(0, $str);
-            $exifTool->VerboseDump(\$buff, Addr => $offset) if $verbose > 2;
+                              $$et{INDENT}, $pos/16, $tag, $offset, $size);
+            $et->VPrint(0, $str);
+            $et->VerboseDump(\$buff, Addr => $offset) if $verbose > 2;
             next unless $tag eq 'name';
         }
         next unless $size >= 8;
         my $entries = Get16u(\$buff, 2);
         my $recEnd = 6 + $entries * 12;
         if ($recEnd > $size) {
-            $exifTool->Warn('Truncated name record');
+            $et->Warn('Truncated name record');
             last;
         }
         my $strStart = Get16u(\$buff, 4);
         if ($strStart < $recEnd or $strStart > $size) {
-            $exifTool->Warn('Invalid string offset');
+            $et->Warn('Invalid string offset');
             last;
         }
         # parse language-tag record (in format 1 Naming table only) (ref 2)
@@ -430,15 +430,15 @@ sub ProcessOTF($$)
                     my $langPt = Get16u(\$buff, $pt + 2) + $strStart;
                     last if $langPt + $langLen > $size;
                     my $lang = substr($buff, $langPt, $langLen);
-                    $lang = $exifTool->Decode($lang,'UCS2','MM','UTF8');
+                    $lang = $et->Decode($lang,'UCS2','MM','UTF8');
                     $lang =~ tr/-_a-zA-Z0-9//dc;    # remove naughty characters
                     $langTag{$i + 0x8000} = $lang;
                 }
             }
         }
         my $tagTablePtr = GetTagTable('Image::ExifTool::Font::Name');
-        $$exifTool{INDENT} .= '| ';
-        $exifTool->VerboseDir('Name', $entries) if $verbose;
+        $$et{INDENT} .= '| ';
+        $et->VerboseDir('Name', $entries) if $verbose;
         for ($i=0; $i<$entries; ++$i) {
             my $pt = 6 + $i * 12;
             my $platform = Get16u(\$buff, $pt);
@@ -456,19 +456,19 @@ sub ProcessOTF($$)
                     $lang = $ttLang{$sys}{$langID} || $langTag{$langID};
                     $charset = $ttCharset{$sys}{$encoding};
                     if (not $charset) {
-                        if (not defined $charset and not $$exifTool{FontWarn}) {
-                            $exifTool->Warn("Unknown $sys character set ($encoding)");
-                            $$exifTool{FontWarn} = 1;
+                        if (not defined $charset and not $$et{FontWarn}) {
+                            $et->Warn("Unknown $sys character set ($encoding)");
+                            $$et{FontWarn} = 1;
                         }
                     } else {
                         # translate to ExifTool character set
-                        $val = $exifTool->Decode($val, $charset);
+                        $val = $et->Decode($val, $charset);
                     }
                 } else {
-                    $exifTool->Warn("Unknown platform ($platform) for name $nameID");
+                    $et->Warn("Unknown platform ($platform) for name $nameID");
                 }
                 # get the tagInfo for our specific language (use 'en' for default)
-                my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $nameID);
+                my $tagInfo = $et->GetTagInfo($tagTablePtr, $nameID);
                 if ($tagInfo and $lang and $lang ne 'en') {
                     my $langInfo = Image::ExifTool::GetLangInfo($tagInfo, $lang);
                     $tagInfo = $langInfo if $langInfo;
@@ -479,7 +479,7 @@ sub ProcessOTF($$)
                                "Enc=$encoding/" . ($charset || 'Unknown') . ', ' .
                                "Lang=$langID/" . ($lang || 'Unknown');
                 }
-                $exifTool->HandleTag($tagTablePtr, $nameID, $val,
+                $et->HandleTag($tagTablePtr, $nameID, $val,
                     TagInfo => $tagInfo,
                     DataPt  => \$buff,
                     DataPos => $offset,
@@ -490,10 +490,10 @@ sub ProcessOTF($$)
                 );
             }
         }
-        $$exifTool{INDENT} = $oldIndent . '| ';
+        $$et{INDENT} = $oldIndent . '| ';
         last unless $verbose;
     }
-    $$exifTool{INDENT} = $oldIndent;
+    $$et{INDENT} = $oldIndent;
     return 1;
 }
 
@@ -503,7 +503,7 @@ sub ProcessOTF($$)
 # Returns: 1 on success, 0 if this wasn't a recognized AFM-type file
 sub ProcessAFM($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my ($buff, $comment);
 
@@ -512,13 +512,13 @@ sub ProcessAFM($$)
     $raf->ReadLine($buff);
     return 0 unless $buff =~ /^Start(Comp|Master)?FontMetrics\s+\d+/;
     my $ftyp = $1 ? ($1 eq 'Comp' ? 'ACFM' : 'AMFM') : 'AFM';
-    $exifTool->SetFileType($ftyp, 'application/x-font-afm');
+    $et->SetFileType($ftyp, 'application/x-font-afm');
     my $tagTablePtr = GetTagTable('Image::ExifTool::Font::AFM');
 
     for (;;) {
         $raf->ReadLine($buff) or last;
         if (defined $comment and $buff !~ /^Comment\s/) {
-            $exifTool->FoundTag('Comment', $comment);
+            $et->FoundTag('Comment', $comment);
             undef $comment;
         }
         $buff =~ /^(\w+)\s+(.*?)[\x0d\x0a]/ or next;
@@ -532,7 +532,7 @@ sub ProcessAFM($$)
             $comment = defined($comment) ? "$comment\n$val" : $val;
             next;
         }
-        unless ($exifTool->HandleTag($tagTablePtr, $tag, $val)) {
+        unless ($et->HandleTag($tagTablePtr, $tag, $val)) {
             # end parsing if we start any subsection
             last if $tag =~ /^Start/ and $tag ne 'StartDirection';
         }
@@ -546,20 +546,20 @@ sub ProcessAFM($$)
 # Returns: 1 on success, 0 if this wasn't a recognized Font file
 sub ProcessFont($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my ($buff, $buf2, $rtnVal);
     return 0 unless $raf->Read($buff, 24) and $raf->Seek(0,0);
     if ($buff =~ /^(\0\x01\0\0|OTTO|true|typ1)[\0\x01]/) {        # OTF, TTF
-        $rtnVal = ProcessOTF($exifTool, $dirInfo);
+        $rtnVal = ProcessOTF($et, $dirInfo);
     } elsif ($buff =~ /^ttcf\0[\x01\x02]\0\0/) {                  # TTC
-        $rtnVal = ProcessTTC($exifTool, $dirInfo);
+        $rtnVal = ProcessTTC($et, $dirInfo);
     } elsif ($buff =~ /^Start(Comp|Master)?FontMetrics\s+\d+/s) { # AFM
-        $rtnVal = ProcessAFM($exifTool, $dirInfo);
+        $rtnVal = ProcessAFM($et, $dirInfo);
     } elsif ($buff =~ /^(.{6})?%!(PS-(AdobeFont-|Bitstream )|FontType1-)/s) {# PFA, PFB
-        $raf->Seek(6,0) and $exifTool->SetFileType('PFB') if $1;
+        $raf->Seek(6,0) and $et->SetFileType('PFB') if $1;
         require Image::ExifTool::PostScript;
-        $rtnVal = Image::ExifTool::PostScript::ProcessPS($exifTool, $dirInfo);
+        $rtnVal = Image::ExifTool::PostScript::ProcessPS($et, $dirInfo);
     } elsif ($buff =~ /^\0[\x01\x02]/ and $raf->Seek(0, 2) and    # PFM
              # validate file size
              $raf->Tell() > 117 and $raf->Tell() == unpack('x2V',$buff) and
@@ -571,18 +571,18 @@ sub ProcessFont($$)
              # incorrectly writes "Postscript\0", so ignore case
              $raf->Read($buf2, 11) == 11 and lc($buf2) eq "postscript\0")
     {
-        $exifTool->SetFileType('PFM');
+        $et->SetFileType('PFM');
         SetByteOrder('II');
         my $tagTablePtr = GetTagTable('Image::ExifTool::Font::Main');
         # process the PFM header
-        $exifTool->HandleTag($tagTablePtr, 'PFM', $buff);
+        $et->HandleTag($tagTablePtr, 'PFM', $buff);
         # extract the font names
         my $nameOff = Get32u(\$buff, 105);
         if ($raf->Seek($nameOff, 0) and $raf->Read($buff, 256) and
             $buff =~ /^([\x20-\xff]+)\0([\x20-\xff]+)\0/)
         {
-            $exifTool->HandleTag($tagTablePtr, 'fontname', $1);
-            $exifTool->HandleTag($tagTablePtr, 'postfont', $2);
+            $et->HandleTag($tagTablePtr, 'fontname', $1);
+            $et->HandleTag($tagTablePtr, 'postfont', $2);
         }
         $rtnVal = 1;
     } else {
@@ -611,7 +611,7 @@ types are OTF, TTF, TTC, DFONT, PFA, PFB, PFM, AFM, ACFM and AMFM.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -12,7 +12,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.01';
+$VERSION = '1.02';
 
 sub ProcessFotoStation($$);
 
@@ -118,14 +118,14 @@ my %cropConv = (
 # - updates DirLen to trailer length
 sub ProcessFotoStation($$)
 {
-    my ($exifTool, $dirInfo) = @_;
-    $exifTool or return 1;    # allow dummy access to autoload this package
+    my ($et, $dirInfo) = @_;
+    $et or return 1;    # allow dummy access to autoload this package
     my ($buff, $footer, $dirBuff, $tagTablePtr);
     my $raf = $$dirInfo{RAF};
     my $outfile = $$dirInfo{OutFile};
     my $offset = $$dirInfo{Offset} || 0;
-    my $verbose = $exifTool->Options('Verbose');
-    my $out = $exifTool->Options('TextOut');
+    my $verbose = $et->Options('Verbose');
+    my $out = $et->Options('TextOut');
     my $rtnVal = 0;
 
     $$dirInfo{DirLen} = 0;      # initialize returned trailer length
@@ -151,8 +151,8 @@ sub ProcessFotoStation($$)
         }
         unless ($outfile) {
             # print verbose trailer information
-            if ($verbose or $exifTool->{HTML_DUMP}) {
-                $exifTool->DumpTrailer({
+            if ($verbose or $$et{HTML_DUMP}) {
+                $et->DumpTrailer({
                     RAF => $raf,
                     DataPos => $$dirInfo{DataPos},
                     DirLen => $size + 10,
@@ -160,21 +160,22 @@ sub ProcessFotoStation($$)
                 });
             }
             # extract information for this tag
-            $exifTool->HandleTag($tagTablePtr, $tag, $buff,
-                                 DataPt => \$buff,
-                                 Start => 0,
-                                 Size => $size,
-                                 DataPos => $$dirInfo{DataPos});
+            $et->HandleTag($tagTablePtr, $tag, $buff,
+                DataPt => \$buff,
+                Start => 0,
+                Size => $size,
+                DataPos => $$dirInfo{DataPos},
+            );
             next;
         }
-        if ($exifTool->{DEL_GROUP}->{FotoStation}) {
+        if ($$et{DEL_GROUP}{FotoStation}) {
             $verbose and printf $out "  Deleting FotoStation trailer\n";
             $verbose = 0;   # no more verbose messages after this
-            ++$exifTool->{CHANGED};
+            ++$$et{CHANGED};
             next;
         }
         # rewrite this information
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
         if ($tagInfo) {
             my $newVal;
             my $tagName = $$tagInfo{Name};
@@ -188,18 +189,18 @@ sub ProcessFotoStation($$)
                     Parent => 'FotoStation',
                 );
                 my $subTable = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
-                $newVal = $exifTool->WriteDirectory(\%subdirInfo, $subTable);
+                $newVal = $et->WriteDirectory(\%subdirInfo, $subTable);
             } else {
-                my $nvHash = $exifTool->GetNewValueHash($tagInfo);
-                if ($exifTool->IsOverwriting($nvHash) > 0) {
-                    $newVal = $exifTool->GetNewValues($nvHash);
+                my $nvHash = $et->GetNewValueHash($tagInfo);
+                if ($et->IsOverwriting($nvHash) > 0) {
+                    $newVal = $et->GetNewValues($nvHash);
                     $newVal = '' unless defined $newVal;
                     if ($verbose > 1) {
                         my $n = length $newVal;
                         print $out "    - FotoStation:$tagName ($size bytes)\n" if $size;
                         print $out "    + FotoStation:$tagName ($n bytes)\n" if $n;
                     }
-                    ++$exifTool->{CHANGED};
+                    ++$$et{CHANGED};
                 }
             }
             if (defined $newVal) {
@@ -240,7 +241,7 @@ write information from the FotoWare FotoStation trailer.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -14,6 +14,8 @@
 #               6) http://forums.dpreview.com/forums/readflat.asp?forum=1012&thread=31350384
 #                  and http://forum.photome.de/viewtopic.php?f=2&t=353&p=742#p740
 #               7) Kai Lappalainen private communication
+#               8) http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,5223.0.html
+#               9) Iliah Borg private communication (LibRaw)
 #               JD) Jens Duttke private communication
 #------------------------------------------------------------------------------
 
@@ -24,7 +26,7 @@ use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Exif;
 
-$VERSION = '1.41';
+$VERSION = '1.45';
 
 sub ProcessFujiDir($$$);
 sub ProcessFaceRec($$$);
@@ -136,16 +138,17 @@ my %faceCategories = (
         Flags => 'PrintHex',
         Writable => 'int16u',
         PrintConv => {
-            0x0   => 'Normal',
-            0x080 => 'Medium High', #2
-            0x100 => 'High',
-            0x180 => 'Medium Low', #2
+            0x0   => 'Normal', # # ("Color 0", ref 8)
+            0x080 => 'Medium High', #2 ("Color +1", ref 8)
+            0x100 => 'High', # ("Color +2", ref 8)
+            0x180 => 'Medium Low', #2 ("Color -1", ref 8)
             0x200 => 'Low',
             0x300 => 'None (B&W)', #2
-            0x301 => 'B&W Green Filter', #PH (X100)
+            0x301 => 'B&W Red Filter', #PH/8
             0x302 => 'B&W Yellow Filter', #PH (X100)
-            0x303 => 'B&W Blue Filter', #PH (X100)
+            0x303 => 'B&W Green Filter', #PH/8
             0x310 => 'B&W Sepia', #PH (X100)
+            0x400 => 'Low 2', #8 ("Color -2")
             0x8000 => 'Film Simulation', #2
         },
     },
@@ -198,9 +201,11 @@ my %faceCategories = (
         Flags => 'PrintHex',
         Writable => 'int16u',
         PrintConv => {
-            0x000 => 'Normal',
-            0x100 => 'Strong',
-            0x200 => 'Weak',
+            0x000 => 'Normal', # ("NR 0, ref 8)
+            0x100 => 'Strong', # ("NR+2, ref 8)
+            0x180 => 'Medium Strong', #8 ("NR+1")
+            0x200 => 'Weak', # ("NR-2, ref 8)
+            0x280 => 'Medium Weak', #8 ("NR-1")
         },
     },
     0x1010 => {
@@ -234,6 +239,12 @@ my %faceCategories = (
             1 => 'Manual',
         },
     },
+    0x1022 => { #8
+        Name => 'AFPointSet',
+        Writable => 'int16u',
+        Notes => '"No" for manual and AF-multi focus modes',
+        PrintConv => { 0 => 'No', 1 => 'Yes' },
+    },
     0x1023 => { #2
         Name => 'FocusPixel',
         Writable => 'int16u',
@@ -277,6 +288,7 @@ my %faceCategories = (
             0x17 => 'Night (tripod)', #7
             0x18 => 'Pro Low-light', #7
             0x19 => 'Pro Focus', #7
+            0x1a => 'Portrait 2', #PH (NC, T500, maybe "Smile & Shoot"?)
             0x1b => 'Dog Face Detection', #7
             0x1c => 'Cat Face Detection', #7
             0x40 => 'Advanced Filter',
@@ -285,11 +297,11 @@ my %faceCategories = (
             0x300 => 'Manual',
         },
     },
-# this usually has a value of 1
-#    0x1032 => { #2
-#        Name => 'ShutterCount',
-#        Writable => 'int16u',
-#    },
+    0x1032 => { #8
+        Name => 'ExposureCount',
+        Writable => 'int16u',
+        Notes => 'number of exposures used for this image',
+    },
     0x1033 => { #6
         Name => 'EXRAuto',
         Writable => 'int16u',
@@ -308,6 +320,28 @@ my %faceCategories = (
             0x300 => 'DR (Dynamic Range priority)',
         },
     },
+    0x1040 => { #8
+        Name => 'ShadowTone',
+        Writable => 'int32s',
+        PrintConv => {
+            -32 => 'Hard',
+            -16 => 'Medium-hard',
+            0 => 'Normal',
+            16 => 'Medium-soft',
+            32 => 'Soft',
+        },
+    },
+    0x1041 => { #8
+        Name => 'HighlightTone',
+        Writable => 'int32s',
+        PrintConv => {
+            -32 => 'Hard',
+            -16 => 'Medium-hard',
+            0 => 'Normal',
+            16 => 'Medium-soft',
+            32 => 'Soft',
+        },
+    },
     0x1100 => {
         Name => 'AutoBracketing',
         Writable => 'int16u',
@@ -433,10 +467,44 @@ my %faceCategories = (
         PrintConv => '"$val%"',
         PrintConvInv => '$val=~s/\s*\%$//; $val',
     },
-    # 0x140b - DR value for AutoDR???? (ref 6) - values: 100
-    # 0x3820 - int16u video frame rate? - PH (HS20EXR)
-    # 0x3821 - int16u video frame width? - PH (HS20EXR)
-    # 0x3822 - int16u video frame height? - PH (HS20EXR)
+    0x1422 => { #8
+        Name => 'ImageStabilization',
+        Writable => 'int16u',
+        Count => 3,
+        PrintConv => [{
+            0 => 'None',
+            1 => 'Optical', #PH
+            2 => 'Sensor-shift', #PH
+            512 => 'Digital', #PH
+        },{
+            0 => 'Off',
+            1 => 'On (mode 1, continuous)',
+            2 => 'On (mode 2, shooting only)',
+        }],
+    },
+    0x1436 => { #8
+        Name => 'ImageGeneration',
+        Format => 'int16u',
+        PrintConv => {
+            0 => 'Original Image',
+            1 => 'Re-developed from RAW',
+        },
+    },
+    0x3820 => { #PH (HS20EXR MOV)
+        Name => 'FrameRate',
+        Writable => 'int16u',
+        Groups => { 2 => 'Video' },
+    },
+    0x3821 => { #PH (HS20EXR MOV)
+        Name => 'FrameWidth',
+        Writable => 'int16u',
+        Groups => { 2 => 'Video' },
+    },
+    0x3822 => { #PH (HS20EXR MOV)
+        Name => 'FrameHeight',
+        Writable => 'int16u',
+        Groups => { 2 => 'Video' },
+    },
     0x4100 => { #PH
         Name => 'FacesDetected',
         Writable => 'int16u',
@@ -644,8 +712,10 @@ my %faceCategories = (
         OffsetPair => 0xf007,  # point to associated offsets
     },
     # 0xf009 - values: 0, 3
-    # 0xf00a-0xf00c ?
-    # 0xf00d - similar to 0xf00e
+    0xf00a => 'BlackLevel', #9
+    # 0xf00b ?
+    0xf00c => 'WB_GRBLevelsStandard', #9 (GRBXGRBX; X=17 is standard illuminant A, X=21 is D65)
+    0xf00d => 'WB_GRBLevelsDaylight', #9
     0xf00e => 'WB_GRBLevels',
     # 0xf00f ?
 );
@@ -702,7 +772,7 @@ my %faceCategories = (
 # Returns: 1
 sub ProcessFaceRec($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dataPos = $$dirInfo{DataPos} + ($$dirInfo{Base} || 0);
     my $dirStart = $$dirInfo{DirStart};
@@ -710,7 +780,7 @@ sub ProcessFaceRec($$$)
     my $pos = $dirStart;
     my $end = $dirStart + $dirLen;
     my ($i, $n, $p, $val);
-    $exifTool->VerboseDir('FaceRecInfo');
+    $et->VerboseDir('FaceRecInfo');
     for ($i=1; ; ++$i) {
         last if $pos + 8 > $end;
         my $off = Get32u($dataPt, $pos) + $dirStart;
@@ -725,7 +795,7 @@ sub ProcessFaceRec($$$)
         $p = Get32u($dataPt, $off + 34) + $dirStart;
         last if $p < $dirStart or $p + $n > $end;
         $val = substr($$dataPt, $p, $n);
-        $exifTool->HandleTag($tagTablePtr, "Face${i}Name", $val,
+        $et->HandleTag($tagTablePtr, "Face${i}Name", $val,
             DataPt  => $dataPt,
             DataPos => $dataPos,
             Start   => $p,
@@ -736,13 +806,13 @@ sub ProcessFaceRec($$$)
         last if $p < $dirStart or $p + $n > $end;
         $val = substr($$dataPt, $p, $n);
         $val =~ s/(\d{4})(\d{2})(\d{2})/$1:$2:$2/;
-        $exifTool->HandleTag($tagTablePtr, "Face${i}Birthday", $val,
+        $et->HandleTag($tagTablePtr, "Face${i}Birthday", $val,
             DataPt  => $dataPt,
             DataPos => $dataPos,
             Start   => $p,
             Size    => $n,
         );
-        $exifTool->HandleTag($tagTablePtr, "Face${i}Category", undef,
+        $et->HandleTag($tagTablePtr, "Face${i}Category", undef,
             DataPt  => $dataPt,
             DataPos => $dataPos,
             Start   => $off + 46,
@@ -759,7 +829,7 @@ sub ProcessFaceRec($$$)
 # Returns: 1 if this was a valid FujiFilm directory
 sub ProcessFujiDir($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $raf = $$dirInfo{RAF};
     my $offset = $$dirInfo{DirStart};
     $raf->Seek($offset, 0) or return 0;
@@ -767,7 +837,7 @@ sub ProcessFujiDir($$$)
     $raf->Read($buff, 4) or return 0;
     my $entries = unpack 'N', $buff;
     $entries < 256 or return 0;
-    $exifTool->Options('Verbose') and $exifTool->VerboseDir('Fuji', $entries);
+    $et->Options('Verbose') and $et->VerboseDir('Fuji', $entries);
     SetByteOrder('MM');
     my $pos = $offset + 4;
     for ($index=0; $index<$entries; ++$index) {
@@ -776,7 +846,7 @@ sub ProcessFujiDir($$$)
         my ($tag, $len) = unpack 'nn', $buff;
         my ($val, $vbuf);
         $raf->Read($vbuf, $len) or return 0;
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
         if ($tagInfo and $$tagInfo{Format}) {
             $val = ReadValue(\$vbuf, 0, $$tagInfo{Format}, $$tagInfo{Count}, $len);
             next unless defined $val;
@@ -787,7 +857,7 @@ sub ProcessFujiDir($$$)
             # treat other unknown values as binary data
             $val = \$vbuf;
         }
-        $exifTool->HandleTag($tagTablePtr, $tag, $val,
+        $et->HandleTag($tagTablePtr, $tag, $val,
             Index   => $index,
             DataPt  => \$vbuf,
             DataPos => $pos,
@@ -805,7 +875,7 @@ sub ProcessFujiDir($$$)
 # Returns: 1 on success, 0 if this wasn't a valid RAF file, or -1 on write error
 sub WriteRAF($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my ($hdr, $jpeg, $outJpeg, $offset, $err, $buff);
 
@@ -818,31 +888,31 @@ sub WriteRAF($$)
     my ($jpos, $jlen) = unpack('x84NN', $hdr);
     # check to be sure the JPEG starts in the expected location
     if ($jpos > 0x94 or $jpos < 0x68 or $jpos & 0x03) {
-        $exifTool->Error("Unsupported or corrupted RAF image (version $ver)");
+        $et->Error("Unsupported or corrupted RAF image (version $ver)");
         return 1;
     }
     # check to make sure this version of RAF has been tested
     unless ($testedRAF{$ver}) {
-        $exifTool->Warn("RAF version $ver not yet tested", 1);
+        $et->Warn("RAF version $ver not yet tested", 1);
     }
     # read the embedded JPEG
     unless ($raf->Seek($jpos, 0) and $raf->Read($jpeg, $jlen) == $jlen) {
-        $exifTool->Error('Error reading RAF meta information');
+        $et->Error('Error reading RAF meta information');
         return 1;
     }
     # use same write directories as JPEG
-    $exifTool->InitWriteDirs('JPEG');
+    $et->InitWriteDirs('JPEG');
     # rewrite the embedded JPEG in memory
     my %jpegInfo = (
         Parent  => 'RAF',
         RAF     => new File::RandomAccess(\$jpeg),
         OutFile => \$outJpeg,
     );
-    $$exifTool{FILE_TYPE} = 'JPEG';
-    my $success = $exifTool->WriteJPEG(\%jpegInfo);
-    $$exifTool{FILE_TYPE} = 'RAF';
+    $$et{FILE_TYPE} = 'JPEG';
+    my $success = $et->WriteJPEG(\%jpegInfo);
+    $$et{FILE_TYPE} = 'RAF';
     unless ($success and $outJpeg) {
-        $exifTool->Error("Invalid RAF format");
+        $et->Error("Invalid RAF format");
         return 1;
     }
     return -1 if $success < 0;
@@ -863,13 +933,13 @@ sub WriteRAF($$)
             not $raf->Seek($jpos+$jlen, 0) or
             $raf->Read($buff, $oldPadLen) != $oldPadLen)
         {
-            $exifTool->Error('Bad RAF pointer at 0x5c');
+            $et->Error('Bad RAF pointer at 0x5c');
             return 1;
         }
         # make sure padding is only zero bytes (can be >100k for HS10)
         # (have seen non-null padding in X-Pro1)
         if ($buff =~ /[^\0]/) {
-            return 1 if $exifTool->Error('Non-null bytes found in padding', 2);
+            return 1 if $et->Error('Non-null bytes found in padding', 2);
         }
     }
     # calculate offset difference due to change in JPEG size
@@ -888,7 +958,7 @@ sub WriteRAF($$)
     Write($outfile, $outJpeg, $pad) or $err = 1;
     # copy over the rest of the RAF image
     unless ($raf->Seek($nextPtr, 0)) {
-        $exifTool->Error('Error reading RAF image');
+        $et->Error('Error reading RAF image');
         return 1;
     }
     while ($raf->Read($buff, 65536)) {
@@ -903,7 +973,7 @@ sub WriteRAF($$)
 # Returns: 1 if this was a valid RAF file
 sub ProcessRAF($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my ($buff, $jpeg, $warn, $offset);
 
     my $raf = $$dirInfo{RAF};
@@ -914,18 +984,18 @@ sub ProcessRAF($$)
     $raf->Seek($jpos, 0)              or return 0;
     $raf->Read($jpeg, $jlen) == $jlen or return 0;
 
-    $exifTool->SetFileType();
-    $exifTool->FoundTag('RAFVersion', substr($buff, 0x3c, 4));
+    $et->SetFileType();
+    $et->FoundTag('RAFVersion', substr($buff, 0x3c, 4));
 
     # extract information from embedded JPEG
     my %dirInfo = (
         Parent => 'RAF',
         RAF    => new File::RandomAccess(\$jpeg),
     );
-    $$exifTool{BASE} += $jpos;
-    my $rtnVal = $exifTool->ProcessJPEG(\%dirInfo);
-    $$exifTool{BASE} -= $jpos;
-    $exifTool->FoundTag('PreviewImage', \$jpeg) if $rtnVal;
+    $$et{BASE} += $jpos;
+    my $rtnVal = $et->ProcessJPEG(\%dirInfo);
+    $$et{BASE} -= $jpos;
+    $et->FoundTag('PreviewImage', \$jpeg) if $rtnVal;
 
     # extract information from Fuji RAF and TIFF directories
     my ($rafNum, $ifdNum) = ('','');
@@ -943,11 +1013,11 @@ sub ProcessRAF($$)
                 RAF  => $raf,
                 Base => $start,
             );
-            $$exifTool{SET_GROUP1} = "FujiIFD$ifdNum";
+            $$et{SET_GROUP1} = "FujiIFD$ifdNum";
             my $tagTablePtr = GetTagTable('Image::ExifTool::FujiFilm::IFD');
             # this is TIFF-format data only for some models, so no warning if it fails
-            $exifTool->ProcessTIFF(\%dirInfo, $tagTablePtr, \&Image::ExifTool::ProcessTIFF);
-            delete $$exifTool{SET_GROUP1};
+            $et->ProcessTIFF(\%dirInfo, $tagTablePtr, \&Image::ExifTool::ProcessTIFF);
+            delete $$et{SET_GROUP1};
             $ifdNum = ($ifdNum || 1) + 1;
         } else {
             # parse RAF directory
@@ -955,14 +1025,14 @@ sub ProcessRAF($$)
                 RAF      => $raf,
                 DirStart => $start,
             );
-            $$exifTool{SET_GROUP1} = "RAF$rafNum";
+            $$et{SET_GROUP1} = "RAF$rafNum";
             my $tagTablePtr = GetTagTable('Image::ExifTool::FujiFilm::RAF');
-            $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr) or $warn = 1;
-            delete $$exifTool{SET_GROUP1};
+            $et->ProcessDirectory(\%dirInfo, $tagTablePtr) or $warn = 1;
+            delete $$et{SET_GROUP1};
             $rafNum = ($rafNum || 1) + 1;
         }
     }
-    $warn and $exifTool->Warn('Possibly corrupt RAF information');
+    $warn and $et->Warn('Possibly corrupt RAF information');
 
     return $rtnVal;
 }
@@ -987,7 +1057,7 @@ FujiFilm maker notes in EXIF information, and to read/write FujiFilm RAW
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -67,7 +67,7 @@ General Imaging maker notes.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -19,7 +19,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.10';
+$VERSION = '1.11';
 
 # road map of directory locations in GIF images
 my %gifMap = (
@@ -112,11 +112,11 @@ my %gifMap = (
 #          an output file was specified and a write error occurred
 sub ProcessGIF($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $outfile = $$dirInfo{OutFile};
     my $raf = $$dirInfo{RAF};
-    my $verbose = $exifTool->Options('Verbose');
-    my $out = $exifTool->Options('TextOut');
+    my $verbose = $et->Options('Verbose');
+    my $out = $et->Options('TextOut');
     my ($a, $s, $ch, $length, $buff);
     my ($err, $newComment, $setComment, $nvComment);
     my ($addDirs, %doneDir);
@@ -133,19 +133,19 @@ sub ProcessGIF($$)
     SetByteOrder('II');
 
     if ($outfile) {
-        $exifTool->InitWriteDirs(\%gifMap, 'XMP'); # make XMP the preferred group for GIF
-        $addDirs = $exifTool->{ADD_DIRS};
+        $et->InitWriteDirs(\%gifMap, 'XMP'); # make XMP the preferred group for GIF
+        $addDirs = $$et{ADD_DIRS};
         # determine if we are editing the File:Comment tag
-        my $delGroup = $exifTool->{DEL_GROUP};
-        $newComment = $exifTool->GetNewValues('Comment', \$nvComment);
+        my $delGroup = $$et{DEL_GROUP};
+        $newComment = $et->GetNewValues('Comment', \$nvComment);
         $setComment = 1 if $nvComment or $$delGroup{File};
         # change to GIF 89a if adding comment, XMP or ICC_Profile
         $buff = 'GIF89a' if $$addDirs{XMP} or $$addDirs{ICC_Profile} or defined $newComment;
         Write($outfile, $buff, $s) or $err = 1;
     } else {
-        $exifTool->SetFileType();   # set file type
-        $exifTool->HandleTag($tagTablePtr, 'GIFVersion', $ver);
-        $exifTool->HandleTag($tagTablePtr, 'ScreenDescriptor', $s);
+        $et->SetFileType();   # set file type
+        $et->HandleTag($tagTablePtr, 'GIFVersion', $ver);
+        $et->HandleTag($tagTablePtr, 'ScreenDescriptor', $s);
     }
     my $flags = Get8u(\$s, 4);
     if ($flags & 0x80) { # does this image contain a color table?
@@ -180,7 +180,7 @@ Block:
                 Write($outfile, "\0") or $err = 1;  # empty chunk as terminator
                 undef $newComment;
                 undef $nvComment;   # delete any other extraneous comments
-                ++$exifTool->{CHANGED};     # increment file changed flag
+                ++$$et{CHANGED};     # increment file changed flag
             }
             # add application extension containing XMP block if necessary
             # (this will place XMP before the first non-extension block)
@@ -190,7 +190,7 @@ Block:
                 my $xmpTable = GetTagTable('Image::ExifTool::XMP::Main');
                 my %dirInfo = ( Parent => 'GIF' );
                 $verbose and print $out "Creating XMP application extension block:\n";
-                $buff = $exifTool->WriteDirectory(\%dirInfo, $xmpTable);
+                $buff = $et->WriteDirectory(\%dirInfo, $xmpTable);
                 if (defined $buff and length $buff) {
                     my $lz = pack('C*',1,reverse(0..255),0);
                     Write($outfile, "\x21\xff\x0bXMP DataXMP", $buff, $lz) or $err = 1;
@@ -206,7 +206,7 @@ Block:
                 my $iccTable = GetTagTable('Image::ExifTool::ICC_Profile::Main');
                 my %dirInfo = ( Parent => 'GIF' );
                 $verbose and print $out "Creating ICC_Profile application extension block:\n";
-                $buff = $exifTool->WriteDirectory(\%dirInfo, $iccTable);
+                $buff = $et->WriteDirectory(\%dirInfo, $iccTable);
                 if (defined $buff and length $buff) {
                     my $pos = 0;
                     Write($outfile, "\x21\xff\x0bICCRGBG1012") or $err = 1;
@@ -288,19 +288,19 @@ Block:
                 my $isOverwriting;
                 if ($setComment) {
                     if ($nvComment) {
-                        $isOverwriting = $exifTool->IsOverwriting($nvComment,$comment);
+                        $isOverwriting = $et->IsOverwriting($nvComment,$comment);
                         # get new comment again (may have been shifted)
-                        $newComment = $exifTool->GetNewValues($nvComment) if defined $newComment;
+                        $newComment = $et->GetNewValues($nvComment) if defined $newComment;
                     } else {
                         # group delete, or deleting additional comments after writing one
                         $isOverwriting = 1;
                     }
                 }
                 if ($isOverwriting) {
-                    ++$exifTool->{CHANGED};     # increment file changed flag
-                    $exifTool->VerboseValue('- Comment', $comment);
+                    ++$$et{CHANGED};     # increment file changed flag
+                    $et->VerboseValue('- Comment', $comment);
                     $comment = $newComment;
-                    $exifTool->VerboseValue('+ Comment', $comment) if defined $comment;
+                    $et->VerboseValue('+ Comment', $comment) if defined $comment;
                     undef $nvComment;   # just delete remaining comments
                 } else {
                     undef $setComment;  # leave remaining comments alone
@@ -323,10 +323,10 @@ Block:
                 undef $newComment;  # don't write the new comment again
             } else {
                 $rtnVal = 1;
-                $exifTool->FoundTag('Comment', $comment) if $comment;
+                $et->FoundTag('Comment', $comment) if $comment;
                 undef $comment;
                 # assume no more than one comment in FastScan mode
-                last if $exifTool->Options('FastScan');
+                last if $et->Options('FastScan');
             }
             next;
 
@@ -366,16 +366,16 @@ Block:
                 my $xmpTable = GetTagTable('Image::ExifTool::XMP::Main');
                 if ($outfile) {
                     if ($doneDir{XMP} and $doneDir{XMP} > 1) {
-                        $exifTool->Warn('Duplicate XMP block created');
+                        $et->Warn('Duplicate XMP block created');
                     }
-                    $buff = $exifTool->WriteDirectory(\%dirInfo, $xmpTable);
+                    $buff = $et->WriteDirectory(\%dirInfo, $xmpTable);
                     if (not defined $buff) {
                         # rewrite original XMP with landing zone (adding back null terminator)
                         Write($outfile, $hdr, $xmp, "\0") or $err = 1;
                         $doneDir{XMP} = 1;
                     } elsif (length $buff) {
                         if ($buff =~ /\0/) { # (check just to be safe)
-                            $exifTool->Error('XMP contained NULL character');
+                            $et->Error('XMP contained NULL character');
                         } else {
                             # write new XMP and landing zone
                             my $lz = pack('C*',1,reverse(0..255),0);
@@ -384,7 +384,7 @@ Block:
                         $doneDir{XMP} = 1;
                     } # else we are deleting the XMP
                 } else {
-                    $exifTool->ProcessDirectory(\%dirInfo, $xmpTable);
+                    $et->ProcessDirectory(\%dirInfo, $xmpTable);
                 }
                 next;
 
@@ -408,9 +408,9 @@ Block:
                 my $iccTable = GetTagTable('Image::ExifTool::ICC_Profile::Main');
                 if ($outfile) {
                     if ($doneDir{ICC_Profile} and $doneDir{ICC_Profile} > 1) {
-                        $exifTool->Warn('Duplicate ICC_Profile block created');
+                        $et->Warn('Duplicate ICC_Profile block created');
                     }
-                    $buff = $exifTool->WriteDirectory(\%dirInfo, $iccTable);
+                    $buff = $et->WriteDirectory(\%dirInfo, $iccTable);
                     # rewrite original ICC_Profile if nothing changed 
                     $buff = $icc_profile unless defined $buff;
                     if (length $buff) {
@@ -428,7 +428,7 @@ Block:
                         $doneDir{ICC_Profile} = 1;
                     } # else we are deleting the ICC profile
                 } else {
-                    $exifTool->ProcessDirectory(\%dirInfo, $iccTable);
+                    $et->ProcessDirectory(\%dirInfo, $iccTable);
                 }
                 next;
 
@@ -437,7 +437,7 @@ Block:
                 $raf->Read($buff, 5) == 5 or last;
                 # make sure this contains the expected data
                 if ($buff =~ /^\x03\x01(..)\0$/s) {
-                    $exifTool->HandleTag($tagTablePtr, 'ExtensionAnimation', $buff);
+                    $et->HandleTag($tagTablePtr, 'ExtensionAnimation', $buff);
                 }
                 $raf->Seek(-$length-5, 1) or last;  # seek back to start of block
 
@@ -473,7 +473,7 @@ Block:
                 $text .= $buff;
             }
             Write($outfile, "\0") or $err = 1 if $outfile;  # write terminator block
-            $exifTool->HandleTag($tagTablePtr, 'Text', $text);
+            $et->HandleTag($tagTablePtr, 'Text', $text);
             next;
         }
         Write($outfile, $ch, $s) or $err = 1 if $outfile;
@@ -487,8 +487,8 @@ Block:
         }
     }
     unless ($outfile) {
-        $exifTool->HandleTag($tagTablePtr, 'FrameCount', $frameCount) if $frameCount > 1;
-        $exifTool->HandleTag($tagTablePtr, 'Duration', $delayTime/100) if $delayTime;
+        $et->HandleTag($tagTablePtr, 'FrameCount', $frameCount) if $frameCount > 1;
+        $et->HandleTag($tagTablePtr, 'Duration', $delayTime/100) if $delayTime;
     }
 
     # set return value to -1 if we only had a write error
@@ -516,7 +516,7 @@ write GIF meta information.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -15,7 +15,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.01';
+$VERSION = '1.02';
 
 sub ProcessParasites($$$);
 
@@ -134,12 +134,12 @@ sub ProcessParasites($$$);
 # Returns: 1 on success
 sub ProcessParasites($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    my $unknown = $exifTool->Options('Unknown') || $exifTool->Options('Verbose');
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    my $unknown = $et->Options('Unknown') || $et->Options('Verbose');
     my $dataPt = $$dirInfo{DataPt};
     my $pos = $$dirInfo{DirStart} || 0;
     my $end = length $$dataPt;
-    $exifTool->VerboseDir('Parasites', undef, $end);
+    $et->VerboseDir('Parasites', undef, $end);
     for (;;) {
         last if $pos + 4 > $end;
         my $size = Get32u($dataPt, $pos);   # length of tag string
@@ -162,7 +162,7 @@ sub ProcessParasites($$$)
             $name = "GIMP-$name" unless length($name) > 1;
             AddTagToTable($tagTablePtr, $tag, { Name => $name, Unknown => 1 });
         }
-        $exifTool->HandleTag($tagTablePtr, $tag, undef,
+        $et->HandleTag($tagTablePtr, $tag, undef,
             DataPt => $dataPt,
             Start  => $pos,
             Size   => $size,
@@ -178,7 +178,7 @@ sub ProcessParasites($$$)
 # Returns: 1 on success, 0 if this wasn't a valid XCF file
 sub ProcessXCF($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my $buff;
 
@@ -186,25 +186,25 @@ sub ProcessXCF($$)
     return 0 unless $buff =~ /^gimp xcf /;
 
     my $tagTablePtr = GetTagTable('Image::ExifTool::GIMP::Main');
-    my $verbose = $exifTool->Options('Verbose');
-    $exifTool->SetFileType();
+    my $verbose = $et->Options('Verbose');
+    $et->SetFileType();
     SetByteOrder('MM');
 
     # process the XCF header
-    $exifTool->HandleTag($tagTablePtr, 'header', $buff);
+    $et->HandleTag($tagTablePtr, 'header', $buff);
 
     # loop through image properties
     for (;;) {
         $raf->Read($buff, 8) == 8 or last;
         my $tag  = Get32u(\$buff, 0) or last;
         my $size = Get32u(\$buff, 4);
-        $verbose and $exifTool->VPrint(0, "XCF property $tag ($size bytes):\n");
+        $verbose and $et->VPrint(0, "XCF property $tag ($size bytes):\n");
         unless ($$tagTablePtr{$tag}) {
             $raf->Seek($size, 1);
             next;
         }
         $raf->Read($buff, $size) == $size or last;
-        $exifTool->HandleTag($tagTablePtr, $tag, undef,
+        $et->HandleTag($tagTablePtr, $tag, undef,
             DataPt  => \$buff,
             DataPos => $raf->Tell() - $size,
             Size    => $size,
@@ -234,7 +234,7 @@ GIMP software.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -12,7 +12,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool::Exif;
 
-$VERSION = '1.38';
+$VERSION = '1.40';
 
 my %coordConv = (
     ValueConv    => 'Image::ExifTool::GPS::ToDegrees($val)',
@@ -38,6 +38,7 @@ my %coordConv = (
     0x0001 => {
         Name => 'GPSLatitudeRef',
         Writable => 'string',
+        Notes => 'tags 0x0001-0x0006 used for camera location according to MWG 2.0',
         Count => 2,
         PrintConv => {
             # extract N/S if written from Composite:GPSLatitude
@@ -209,6 +210,7 @@ my %coordConv = (
     0x0013 => {
         Name => 'GPSDestLatitudeRef',
         Writable => 'string',
+        Notes => 'tags 0x0013-0x001a used for subject location according to MWG 2.0',
         Count => 2,
         PrintConv => {
             N => 'North',
@@ -314,6 +316,7 @@ my %coordConv = (
         PrintConvInv => '$val=~s/\s*m$//; $val',
         Writable => 'rational64u',
     },
+    # 0xea1c - Nokia Lumina 1020 writes this (padding) in GPS IFD - PH
 );
 
 # Composite GPS tags
@@ -405,7 +408,7 @@ sub ConvertTimeStamp($)
 # Returns: DMS string
 sub ToDMS($$;$$)
 {
-    my ($exifTool, $val, $doPrintConv, $ref) = @_;
+    my ($et, $val, $doPrintConv, $ref) = @_;
     my ($fmt, $num, $sign);
 
     if ($ref) {
@@ -423,7 +426,7 @@ sub ToDMS($$;$$)
     }
     if ($doPrintConv) {
         if ($doPrintConv eq '1') {
-            $fmt = $exifTool->Options('CoordFormat');
+            $fmt = $et->Options('CoordFormat');
             if (not $fmt) {
                 $fmt = q{%d deg %d' %.2f"} . $ref;
             } elsif ($ref) {
@@ -489,7 +492,7 @@ GPS (Global Positioning System) meta information in EXIF data.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -4,8 +4,9 @@
 # Description:  Read GeoTiff meta information
 #
 # Revisions:    02/23/2004 - P. Harvey Created
-#               02/25/2004 - P. Harvey Added new codes from libgeotiff-1.2.1
-#               02/01/2007 - P. Harvey Added new codes from libgeotiff-1.2.3
+#               02/25/2004 - PH Added new codes from libgeotiff-1.2.1
+#               02/01/2007 - PH Added new codes from libgeotiff-1.2.3
+#               01/22/2014 - PH Added new code from libgeotiff-1.4.0
 #
 # Reference:    ftp://ftp.remotesensing.org/geotiff/libgeotiff/libgeotiff-1.1.4.tar.gz
 #------------------------------------------------------------------------------
@@ -16,7 +17,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.07';
+$VERSION = '1.10';
 
 # format codes for geoTiff directory entries
 my %geoTiffFormat = (
@@ -504,6 +505,7 @@ my %epsg_units = (
         PrintConv => \%epsg_units,
     },
     2061 => 'GeogPrimeMeridianLong',
+    2062 => 'GeogToWGS84',
     3072 => {
         Name => 'ProjectedCSType',
         PrintConv => {
@@ -2068,13 +2070,17 @@ my %epsg_units = (
 # Notes: byte order must be set before calling this routine
 sub ProcessGeoTiff($)
 {
-    my $exifTool = shift;
-    my $dirData = $exifTool->GetValue('GeoTiffDirectory', 'ValueConv') or return;
-    my $doubleData = $exifTool->GetValue('GeoTiffDoubleParams', 'ValueConv');
-    my $asciiData = $exifTool->GetValue('GeoTiffAsciiParams', 'ValueConv');
-    my $verbose = $exifTool->Options('Verbose');
+    my $et = shift;
+    my $dirData = $et->GetValue('GeoTiffDirectory', 'ValueConv') or return;
+
+    # avoid re-processing if another EXIF directory is found
+    $$et{DidGeoTiff} and $$et{DidGeoTiff} eq $dirData and return;
+    $$et{DidGeoTiff} = $dirData;
+
+    my $doubleData = $et->GetValue('GeoTiffDoubleParams', 'ValueConv');
+    my $asciiData = $et->GetValue('GeoTiffAsciiParams', 'ValueConv');
+    my $verbose = $et->Options('Verbose');
 
-    # restore or original EXIF byte order setting
     if (length($$dirData) >= 8 and
         length($$dirData) >= 8 * (Get16u($dirData,6) + 1))
     {
@@ -2084,30 +2090,38 @@ sub ProcessGeoTiff($)
         my $numEntries = Get16u($dirData,6);
 
         if ($verbose) {
-            $exifTool->{INDENT} .= '| ';
-            $exifTool->VerboseDir('GeoTiff',$numEntries);
+            $$et{INDENT} .= '| ';
+            $et->VerboseDir('GeoTiff',$numEntries);
         }
         # generate version number tag (not a real GeoTiff tag)
         my $tagTable = GetTagTable("Image::ExifTool::GeoTiff::Main");
-        my $tagInfo = $exifTool->GetTagInfo($tagTable, 1);
-        $tagInfo and $exifTool->FoundTag($tagInfo,"$version.$revision.$minorRev");
+        my $tagInfo = $et->GetTagInfo($tagTable, 1);
+        $tagInfo and $et->FoundTag($tagInfo,"$version.$revision.$minorRev");
 
         my $i;
         for ($i=0; $i<$numEntries; ++$i) {
             my $pt = 8 * ($i + 1);
             my $tag    = Get16u($dirData, $pt);
-            $tagInfo   = $exifTool->GetTagInfo($tagTable, $tag) or next;
+            $tagInfo   = $et->GetTagInfo($tagTable, $tag) or next;
             my $loc    = Get16u($dirData, $pt+2);
             my $count  = Get16u($dirData, $pt+4);
             my $offset = Get16u($dirData, $pt+6);
             my $format = $geoTiffFormat{$loc};
             my ($val, $dataPt);
             if ($format eq 'double') {          # in the double parms
+                if (not $doubleData or length($$doubleData) < 8*($offset+$count)) {
+                    $et->Warn("Missing double data for $$tagInfo{Name}");
+                    next;
+                }
                 $dataPt = $doubleData;
                 $offset *= 8;
                 $val = Image::ExifTool::ReadValue($dataPt, $offset, $format,
                                                   $count, length($$doubleData)-$offset);
             } elsif ($format eq 'string') {     # in the ASCII parms
+                if (not $asciiData or length($$asciiData) < $offset+$count) {
+                    $et->Warn("Missing string data for $$tagInfo{Name}");
+                    next;
+                }
                 $dataPt = $asciiData;
                 $val = substr($$dataPt, $offset, $count);
                 $val =~ s/(\0|\|)$//;   # remove trailing terminator (NULL or '|')
@@ -2116,10 +2130,10 @@ sub ProcessGeoTiff($)
                 $val = $offset;
                 $offset = $pt+6;
             } else {
-                $exifTool->Warn("Unknown GeoTiff location: $loc");
+                $et->Warn("Unknown GeoTiff location: $loc");
                 next;
             }
-            $verbose and $exifTool->VerboseInfo($tag, $tagInfo,
+            $verbose and $et->VerboseInfo($tag, $tagInfo,
                 'Table'  => $tagTable,
                 'Index'  => $i,
                 'Value'  => $val,
@@ -2129,19 +2143,20 @@ sub ProcessGeoTiff($)
                 'Count'  => $count,
                 'Size'   => $count * Image::ExifTool::FormatSize($format),
             );
-            $exifTool->FoundTag($tagInfo, $val);
+            $et->FoundTag($tagInfo, $val);
         }
         if ($verbose) {
-            $exifTool->{INDENT} =~ s/..$//;
+            $$et{INDENT} =~ s/..$//;
         }
     } else {
-        $exifTool->Warn('Bad GeoTIFF directory');
+        $et->Warn('Bad GeoTIFF directory');
+    }
+    # extract block tags only if requested
+    unless ($$et{OPTIONS}{RequestAll}) {
+        $et->DeleteTag('GeoTiffDirectory')    unless $$et{REQ_TAG_LOOKUP}{geotiffdirectory};
+        $et->DeleteTag('GeoTiffDoubleParams') unless $$et{REQ_TAG_LOOKUP}{geotiffdoubleparams};
+        $et->DeleteTag('GeoTiffAsciiParams')  unless $$et{REQ_TAG_LOOKUP}{geotiffasciiparams};
     }
-    # must delete these tags once we've processed this information
-    # (to avoid re-processing if another EXIF directory is found)
-    $exifTool->DeleteTag('GeoTiffDirectory');
-    $exifTool->DeleteTag('GeoTiffDoubleParams');
-    $exifTool->DeleteTag('GeoTiffAsciiParams');
 }
 
 
@@ -2166,7 +2181,7 @@ coordinates.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -22,7 +22,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:Public);
 
-$VERSION = '1.36';
+$VERSION = '1.40';
 
 sub JITTER() { return 2 }       # maximum time jitter
 
@@ -50,6 +50,7 @@ my %xmlTag = (
     sat         => 'nsats',     # GPX
     when        => 'time',      # KML
     coordinates => 'coords',    # KML
+    coord       => 'coords',    # KML, as written by Google Location History
     course      => 'dir',       # (written by Arduino)
     pitch       => 'pitch',     # (written by Arduino)
     roll        => 'roll',      # (written by Arduino)
@@ -108,16 +109,16 @@ my $secPerDay = 24 * 3600;      # a useful constant
 sub LoadTrackLog($$;$)
 {
     local ($_, $/, *EXIFTOOL_TRKFILE);
-    my ($exifTool, $val) = @_;
+    my ($et, $val) = @_;
     my ($raf, $from, $time, $isDate, $noDate, $noDateChanged, $lastDate, $dateFlarm);
     my ($nmeaStart, $fixSecs, @fixTimes, $lastFix, %nmea);
     my ($canCut, $cutPDOP, $cutHDOP, $cutSats);
 
-    unless (eval 'require Time::Local') {
+    unless (eval { require Time::Local }) {
         return 'Geotag feature requires Time::Local installed';
     }
     # add data to existing track
-    my $geotag = $exifTool->GetNewValues('Geotag') || { };
+    my $geotag = $et->GetNewValues('Geotag') || { };
     # get lookup for available information types
     my $has = $$geotag{Has};
     $has or $has = $$geotag{Has} = { 'pos' => 1 };
@@ -159,9 +160,9 @@ sub LoadTrackLog($$;$)
     $points or $points = $$geotag{Points} = { };
 
     # initialize cuts
-    my $maxHDOP = $exifTool->Options('GeoMaxHDOP');
-    my $maxPDOP = $exifTool->Options('GeoMaxPDOP');
-    my $minSats = $exifTool->Options('GeoMinSats');
+    my $maxHDOP = $et->Options('GeoMaxHDOP');
+    my $maxPDOP = $et->Options('GeoMaxPDOP');
+    my $minSats = $et->Options('GeoMinSats');
     my $isCut = $maxHDOP || $maxPDOP || $minSats;
 
     my $numPoints = 0;
@@ -206,6 +207,9 @@ sub LoadTrackLog($$;$)
         if ($format eq 'XML') {
             my ($arg, $tok, $td);
             s/\s*=\s*(['"])\s*/=$1/g;  # remove unnecessary white space in attributes
+            # Workaround for KML generated by Google Location History:
+            # lat/lon/alt are space-separated; we want commas.
+            s{(\S+)\s+(\S+)\s+(\S+)(</gx:coord>)}{$1,$2,$3$4};
             foreach $arg (split) {
                 # parse attributes (ie. GPX 'lat' and 'lon')
                 # (note: ignore namespace prefixes if they exist)
@@ -327,10 +331,10 @@ sub LoadTrackLog($$;$)
         } elsif ($nmea eq 'RMC') {
             #  $GPRMC,092204.999,A,4250.5589,S,14718.5084,E,0.00,89.68,211200,,*25
             #  $GPRMC,hhmmss.sss,A/V,ddmm.mmmm,N/S,ddmmm.mmmm,E/W,spd(knots),dir(deg),DDMMYY,,*cs
-            /^\$GPRMC,(\d{2})(\d{2})(\d+)(\.\d+)?,A,(\d+)(\d{2}\.\d+),([NS]),(\d+)(\d{2}\.\d+),([EW]),(\d*\.?\d*),(\d*\.?\d*),(\d{2})(\d{2})(\d+)/ or next;
+            /^\$GPRMC,(\d{2})(\d{2})(\d+)(\.\d+)?,A,(\d*?)(\d{1,2}\.\d+),([NS]),(\d*?)(\d{1,2}\.\d+),([EW]),(\d*\.?\d*),(\d*\.?\d*),(\d{2})(\d{2})(\d+)/ or next;
             next if $13 > 31 or $14 > 12 or $15 > 99;   # validate day/month/year
-            $fix{lat} = ($5 + $6/60) * ($7 eq 'N' ? 1 : -1);
-            $fix{lon} = ($8 + $9/60) * ($10 eq 'E' ? 1 : -1);
+            $fix{lat} = (($5 || 0) + $6/60) * ($7 eq 'N' ? 1 : -1);
+            $fix{lon} = (($8 || 0) + $9/60) * ($10 eq 'E' ? 1 : -1);
             $fix{speed} = $11 if length $11;
             $fix{track} = $12 if length $12;
             my $year = $15 + ($15 >= 70 ? 1900 : 2000);
@@ -343,9 +347,9 @@ sub LoadTrackLog($$;$)
         } elsif ($nmea eq 'GGA') {
             #  $GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,19.7,M,,,,0000*1F
             #  $GPGGA,hhmmss.sss,ddmm.mmmm,N/S,dddmm.mmmm,E/W,0=invalid,sats,hdop,alt,M,...
-            /^\$GPGGA,(\d{2})(\d{2})(\d+)(\.\d+)?,(\d+)(\d{2}\.\d+),([NS]),(\d+)(\d{2}\.\d+),([EW]),[1-6],(\d+)?,(\.\d+|\d+\.?\d*)?,(-?\d+\.?\d*)?,M?,/ or next;
-            $fix{lat} = ($5 + $6/60) * ($7 eq 'N' ? 1 : -1);
-            $fix{lon} = ($8 + $9/60) * ($10 eq 'E' ? 1 : -1);
+            /^\$GPGGA,(\d{2})(\d{2})(\d+)(\.\d+)?,(\d*?)(\d{1,2}\.\d+),([NS]),(\d*?)(\d{1,2}\.\d+),([EW]),[1-6],(\d+)?,(\.\d+|\d+\.?\d*)?,(-?\d+\.?\d*)?,M?,/ or next;
+            $fix{lat} = (($5 || 0) + $6/60) * ($7 eq 'N' ? 1 : -1);
+            $fix{lon} = (($8 || 0) + $9/60) * ($10 eq 'E' ? 1 : -1);
             $fix{nsats} = $11;
             $fix{hdop} = $12;
             $fix{alt} = $13;
@@ -358,9 +362,9 @@ sub LoadTrackLog($$;$)
         } elsif ($nmea eq 'GLL') {
             #  $GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D
             #  $GPGLL,ddmm.mmmm,N/S,dddmm.mmmm,E/W,hhmmss.sss,A/V*cs
-            /^\$GPGLL,(\d+)(\d{2}\.\d+),([NS]),(\d+)(\d{2}\.\d+),([EW]),(\d{2})(\d{2})(\d+)(\.\d+),A/ or next;
-            $fix{lat} = ($1 + $2/60) * ($3 eq 'N' ? 1 : -1);
-            $fix{lon} = ($4 + $5/60) * ($6 eq 'E' ? 1 : -1);
+            /^\$GPGLL,(\d*?)(\d{1,2}\.\d+),([NS]),(\d*?)(\d{1,2}\.\d+),([EW]),(\d{2})(\d{2})(\d+)(\.\d+),A/ or next;
+            $fix{lat} = (($1 || 0) + $2/60) * ($3 eq 'N' ? 1 : -1);
+            $fix{lon} = (($4 || 0) + $5/60) * ($6 eq 'E' ? 1 : -1);
             $secs = (($7 * 60) + $8) * 60 + $9;
             $secs += $10 if $10;    # add fractional seconds
 #
@@ -499,9 +503,9 @@ sub LoadTrackLog($$;$)
     # set date flags
     if ($noDate and not $$geotag{NoDate}) {
         if ($isDate) {
-            $exifTool->Warn('Fixes are date-less -- will use time-only interpolation');
+            $et->Warn('Fixes are date-less -- will use time-only interpolation');
         } else {
-            $exifTool->Warn('Some fixes are date-less -- may use time-only interpolation');
+            $et->Warn('Some fixes are date-less -- may use time-only interpolation');
         }
         $$geotag{NoDate} = 1;
     }
@@ -539,9 +543,9 @@ sub LoadTrackLog($$;$)
         $$fix{first} = 1;
         last;
     }
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     if ($verbose) {
-        my $out = $exifTool->Options('TextOut');
+        my $out = $et->Options('TextOut');
         print $out "Loaded $numPoints points from GPS track log $from\n";
         print $out "Ignored $cutPDOP points due to GeoMaxPDOP cut\n" if $cutPDOP;
         print $out "Ignored $cutHDOP points due to GeoMaxHDOP cut\n" if $cutHDOP;
@@ -572,8 +576,8 @@ sub LoadTrackLog($$;$)
 # Returns: sync time difference (and updates input time), or undef if no sync
 sub ApplySyncCorr($$)
 {
-    my ($exifTool, $time) = @_;
-    my $sync = $exifTool->GetNewValues('Geosync');
+    my ($et, $time) = @_;
+    my $sync = $et->GetNewValues('Geosync');
     if (ref $sync eq 'HASH') {
         my $syncTimes = $$sync{Times};
         if ($syncTimes) {
@@ -633,7 +637,7 @@ sub ScanOutwards($$$$$$)
 # Returns: reference to fix hash or undef
 sub FindFix($$$$$$$)
 {
-    my ($exifTool, $key, $times, $points, $i, $dir, $maxSecs) = @_;
+    my ($et, $key, $times, $points, $i, $dir, $maxSecs) = @_;
     my ($t,$p);
     if ($dir) {
         ($t,$p) = ScanOutwards($key, $times, $points, $i, $dir, $maxSecs);
@@ -651,8 +655,8 @@ sub FindFix($$$$$$$)
             ($t, $p) = ($t2, $p2);
         }
     }
-    if (defined $p and $$exifTool{OPTIONS}{Verbose} > 2) {
-        $exifTool->VPrint(2, "  Taking $key from fix:\n", PrintFix($points, $t))
+    if (defined $p and $$et{OPTIONS}{Verbose} > 2) {
+        $et->VPrint(2, "  Taking $key from fix:\n", PrintFix($points, $t))
     }
     return $p;
 }
@@ -666,17 +670,17 @@ sub FindFix($$$$$$$)
 sub SetGeoValues($$;$)
 {
     local $_;
-    my ($exifTool, $val, $writeGroup) = @_;
-    my $geotag = $exifTool->GetNewValues('Geotag');
-    my $verbose = $exifTool->Options('Verbose');
+    my ($et, $val, $writeGroup) = @_;
+    my $geotag = $et->GetNewValues('Geotag');
+    my $verbose = $et->Options('Verbose');
     my ($fix, $time, $fsec, $noDate, $secondTry, $iExt, $iDir);
 
     # remove date if none of our fixes had date information
     $val =~ s/^\S+\s+// if $val and $geotag and not $$geotag{IsDate};
 
     # maximum time (sec) from nearest GPS fix when position is still considered valid
-    my $geoMaxIntSecs = $exifTool->Options('GeoMaxIntSecs');
-    my $geoMaxExtSecs = $exifTool->Options('GeoMaxExtSecs');
+    my $geoMaxIntSecs = $et->Options('GeoMaxIntSecs');
+    my $geoMaxExtSecs = $et->Options('GeoMaxExtSecs');
 
     # use 30 minutes for a default
     defined $geoMaxIntSecs or $geoMaxIntSecs = 1800;
@@ -701,7 +705,7 @@ sub SetGeoValues($$;$)
             $err = 'GPS track is empty';
             last;
         }
-        unless (eval 'require Time::Local') {
+        unless (eval { require Time::Local }) {
             $err = 'Geotag feature requires Time::Local installed';
             last;
         }
@@ -738,13 +742,13 @@ sub SetGeoValues($$;$)
         $time %= $secPerDay if $noDate;
 
         # apply time synchronization if available
-        my $sync = ApplySyncCorr($exifTool, $time);
+        my $sync = ApplySyncCorr($et, $time);
 
         # save fractional seconds string
         $fsec = ($time =~ /(\.\d+)$/) ? $1 : '';
 
-        if ($exifTool->Options('Verbose') > 1 and not $secondTry) {
-            my $out = $exifTool->Options('TextOut');
+        if ($et->Options('Verbose') > 1 and not $secondTry) {
+            my $out = $et->Options('TextOut');
             my $str = "$fsec UTC";
             $str .= sprintf(" (incl. Geosync offset of %+.3f sec)", $sync) if defined $sync;
             unless ($tz) {
@@ -760,7 +764,7 @@ sub SetGeoValues($$;$)
             } else {
                 $fix = $$points{$$times[0]};
                 $iExt = 0;  $iDir = 1;
-                $exifTool->VPrint(2, "  Taking pos from fix:\n",
+                $et->VPrint(2, "  Taking pos from fix:\n",
                     PrintFix($points, $$times[0])) if $verbose > 2;
             }
         } elsif ($time > $$times[-1]) {
@@ -769,7 +773,7 @@ sub SetGeoValues($$;$)
             } else {
                 $fix = $$points{$$times[-1]};
                 $iExt = $#$times;  $iDir = -1;
-                $exifTool->VPrint(2, "  Taking pos from fix:\n",
+                $et->VPrint(2, "  Taking pos from fix:\n",
                     PrintFix($points, $$times[-1])) if $verbose > 2;
             }
         } else {
@@ -804,13 +808,13 @@ sub SetGeoValues($$;$)
                     $err or $err = 'Time is too far from nearest GPS fix';
                 } else {
                     $fix = $$points{$tn};
-                    $exifTool->VPrint(2, "  Taking pos from fix:\n",
+                    $et->VPrint(2, "  Taking pos from fix:\n",
                         PrintFix($points, $tn)) if $verbose > 2;
                 }
             } else {
                 my $f0 = $t1 == $t0 ? 0 : ($time - $t0) / ($t1 - $t0);
                 my $p0 = $$points{$t0};
-                $exifTool->VPrint(2, "  Interpolating pos between fixes (f=$f0):\n",
+                $et->VPrint(2, "  Interpolating pos between fixes (f=$f0):\n",
                     PrintFix($points, $t0, $t1)) if $verbose > 2;
                 $fix = { };
                 # loop through available fix information categories
@@ -849,7 +853,7 @@ Category:       foreach $category (qw{pos track alt orient}) {
                             }
                             # re-calculate the interpolation factor
                             $f = $f0b = $t1b == $t0b ? 0 : ($time - $t0b) / ($t1b - $t0b);
-                            $exifTool->VPrint(2, "  Interpolating $category between fixes (f=$f):\n",
+                            $et->VPrint(2, "  Interpolating $category between fixes (f=$f):\n",
                                 PrintFix($points, $t0b, $t1b)) if $verbose > 2;
                         }
                         # must interpolate cyclical values differently
@@ -889,7 +893,7 @@ Category:       foreach $category (qw{pos track alt orient}) {
             $gpsAlt = abs $$fix{alt};
             $gpsAltRef = ($$fix{alt} < 0 ? 1 : 0);
         } elsif ($$has{alt} and defined $iExt) {
-            my $tFix = FindFix($exifTool,'alt',$times,$points,$iExt,$iDir,$geoMaxExtSecs);
+            my $tFix = FindFix($et,'alt',$times,$points,$iExt,$iDir,$geoMaxExtSecs);
             if ($tFix) {
                 $gpsAlt = abs $$tFix{alt};
                 $gpsAltRef = ($$tFix{alt} < 0 ? 1 : 0);
@@ -904,44 +908,44 @@ Category:       foreach $category (qw{pos track alt orient}) {
             $exif = ($writeGroup =~ /^(exif|gps)$/i);
         }
         # (capture error messages by calling SetNewValue in list context)
-        @r = $exifTool->SetNewValue(GPSLatitude => $$fix{lat}, %opts);
-        @r = $exifTool->SetNewValue(GPSLongitude => $$fix{lon}, %opts);
-        @r = $exifTool->SetNewValue(GPSAltitude => $gpsAlt, %opts);
-        @r = $exifTool->SetNewValue(GPSAltitudeRef => $gpsAltRef, %opts);
+        @r = $et->SetNewValue(GPSLatitude => $$fix{lat}, %opts);
+        @r = $et->SetNewValue(GPSLongitude => $$fix{lon}, %opts);
+        @r = $et->SetNewValue(GPSAltitude => $gpsAlt, %opts);
+        @r = $et->SetNewValue(GPSAltitudeRef => $gpsAltRef, %opts);
         if ($$has{track}) {
             my $tFix = $fix;
             if (not defined $$fix{track} and defined $iExt) {
-                my $p = FindFix($exifTool,'track',$times,$points,$iExt,$iDir,$geoMaxExtSecs);
+                my $p = FindFix($et,'track',$times,$points,$iExt,$iDir,$geoMaxExtSecs);
                 $tFix = $p if $p;
             }
-            @r = $exifTool->SetNewValue(GPSTrack => $$tFix{track}, %opts);
-            @r = $exifTool->SetNewValue(GPSTrackRef => (defined $$tFix{track} ? 'T' : undef), %opts);
-            @r = $exifTool->SetNewValue(GPSSpeed => $$tFix{speed}, %opts);
-            @r = $exifTool->SetNewValue(GPSSpeedRef => (defined $$tFix{speed} ? 'N' : undef), %opts);
+            @r = $et->SetNewValue(GPSTrack => $$tFix{track}, %opts);
+            @r = $et->SetNewValue(GPSTrackRef => (defined $$tFix{track} ? 'T' : undef), %opts);
+            @r = $et->SetNewValue(GPSSpeed => $$tFix{speed}, %opts);
+            @r = $et->SetNewValue(GPSSpeedRef => (defined $$tFix{speed} ? 'N' : undef), %opts);
         }
         if ($$has{orient}) {
             my $tFix = $fix;
             if (not defined $$fix{dir} and defined $iExt) {
-                my $p = FindFix($exifTool,'dir',$times,$points,$iExt,$iDir,$geoMaxExtSecs);
+                my $p = FindFix($et,'dir',$times,$points,$iExt,$iDir,$geoMaxExtSecs);
                 $tFix = $p if $p;
             }
-            @r = $exifTool->SetNewValue(GPSImgDirection => $$tFix{dir}, %opts);
-            @r = $exifTool->SetNewValue(GPSImgDirectionRef => (defined $$tFix{dir} ? 'T' : undef), %opts);
+            @r = $et->SetNewValue(GPSImgDirection => $$tFix{dir}, %opts);
+            @r = $et->SetNewValue(GPSImgDirectionRef => (defined $$tFix{dir} ? 'T' : undef), %opts);
             # Note: GPSPitch and GPSRoll are non-standard, and must be user-defined
-            @r = $exifTool->SetNewValue(GPSPitch => $$tFix{pitch}, %opts);
-            @r = $exifTool->SetNewValue(GPSRoll => $$tFix{roll}, %opts);
+            @r = $et->SetNewValue(GPSPitch => $$tFix{pitch}, %opts);
+            @r = $et->SetNewValue(GPSRoll => $$tFix{roll}, %opts);
         }
         unless ($xmp) {
-            @r = $exifTool->SetNewValue(GPSLatitudeRef => ($$fix{lat} > 0 ? 'N' : 'S'), %opts);
-            @r = $exifTool->SetNewValue(GPSLongitudeRef => ($$fix{lon} > 0 ? 'E' : 'W'), %opts);
-            @r = $exifTool->SetNewValue(GPSDateStamp => $gpsDate, %opts);
-            @r = $exifTool->SetNewValue(GPSTimeStamp => $gpsTime, %opts);
+            @r = $et->SetNewValue(GPSLatitudeRef => ($$fix{lat} > 0 ? 'N' : 'S'), %opts);
+            @r = $et->SetNewValue(GPSLongitudeRef => ($$fix{lon} > 0 ? 'E' : 'W'), %opts);
+            @r = $et->SetNewValue(GPSDateStamp => $gpsDate, %opts);
+            @r = $et->SetNewValue(GPSTimeStamp => $gpsTime, %opts);
             # set options to edit XMP:GPSDateTime only if it already exists
             $opts{EditOnly} = 1;
             $opts{Group} = 'XMP';
         }
         unless ($exif) {
-            @r = $exifTool->SetNewValue(GPSDateTime => "$gpsDate $gpsTime", %opts);
+            @r = $et->SetNewValue(GPSDateTime => "$gpsDate $gpsTime", %opts);
         }
     } else {
         my %opts;
@@ -954,7 +958,7 @@ Category:       foreach $category (qw{pos track alt orient}) {
                     GPSTrack GPSTrackRef GPSSpeed GPSSpeedRef
                     GPSImgDirection GPSImgDirectionRef GPSPitch GPSRoll))
         {
-            my @r = $exifTool->SetNewValue($_, undef, %opts);
+            my @r = $et->SetNewValue($_, undef, %opts);
         }
     }
     return $err;
@@ -970,8 +974,8 @@ Category:       foreach $category (qw{pos track alt orient}) {
 #        correction to be implemented
 sub ConvertGeosync($$)
 {
-    my ($exifTool, $val) = @_;
-    my $sync = $exifTool->GetNewValues('Geosync') || { };
+    my ($et, $val) = @_;
+    my $sync = $et->GetNewValues('Geosync') || { };
     my ($syncFile, $gpsTime, $imgTime);
 
     if ($val =~ /(.*?)\@(.*)/) {
@@ -999,7 +1003,7 @@ sub ConvertGeosync($$)
             foreach $tag (@timeTags) {
                 if ($$info{$tag}) {
                     $imgTime = $$info{$tag};
-                    $exifTool->VPrint(2, "Geosyncing with $tag from '$syncFile'\n");
+                    $et->VPrint(2, "Geosyncing with $tag from '$syncFile'\n");
                     last;
                 }
             }
@@ -1053,15 +1057,15 @@ sub ConvertGeosync($$)
             $$sync{Points} or $$sync{Points} = { };
             $$sync{Points}{$imgSecs} = $$sync{Offset};
             # print verbose output
-            if ($exifTool->Options('Verbose') > 1) {
+            if ($et->Options('Verbose') > 1) {
                 # print GPS and image timestamps in UTC
                 my $gps = Image::ExifTool::ConvertUnixTime($gpsSecs);
                 my $img = Image::ExifTool::ConvertUnixTime($imgSecs);
                 $gps .= $1 if $gpsTime =~ /(\.\d+)/;
                 $img .= $1 if $imgTime =~ /(\.\d+)/;
-                $exifTool->VPrint(1, "Added Geosync point:\n",
-                                     "  GPS time stamp:  $gps UTC\n",
-                                     "  Image date/time: $img UTC\n");
+                $et->VPrint(1, "Added Geosync point:\n",
+                               "  GPS time stamp:  $gps UTC\n",
+                               "  Image date/time: $img UTC\n");
             }
             # save sorted list of image sync times if we have more than one
             my @times = keys %{$$sync{Points}};
@@ -1141,7 +1145,7 @@ user-defined tags, GPSPitch and GPSRoll, must be active.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -1170,4 +1174,3 @@ L<Image::ExifTool::TagNames/Extra Tags>,
 L<Image::ExifTool(3pm)|Image::ExifTool>
 
 =cut
-
@@ -24,7 +24,7 @@ use vars qw($VERSION %convMake);
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Exif;
 
-$VERSION = '1.08';
+$VERSION = '1.11';
 
 sub ProcessSEI($$);
 
@@ -35,6 +35,7 @@ my $parsePictureTiming; # flag to enable parsing of picture timing information (
     0x0103 => 'Panasonic',
     0x0108 => 'Sony',
     0x1011 => 'Canon',
+    0x1104 => 'JVC', #Rob Lewis
 );
 
 # information extracted from H.264 video streams
@@ -82,7 +83,11 @@ my $parsePictureTiming; # flag to enable parsing of picture timing information (
     # 0x10 - TitleTotalTime (ref 7)
     # 0x11 - TitleRemainTime (ref 7)
     # 0x12 - TitleChapterTotalNo (ref 7)
-    # 0x13 - TitleTimecode
+    0x13 => {
+        Name => 'TimeCode',
+        Notes => 'hours:minutes:seconds:frames',
+        ValueConv => 'sprintf("%.2x:%.2x:%.2x:%.2x",reverse unpack("C*",$val))',
+    },
     # 0x14 - TitleBinaryGroup
     # 0x15 - TitleCassetteNo (ref 7)
     # 0x16-0x17 - TitleSoftID (ref 7)
@@ -490,7 +495,7 @@ my $parsePictureTiming; # flag to enable parsing of picture timing information (
         Name => 'ExposureTime',
         Mask => 0x7fff, # (what is bit 0x8000 for?)
         RawConv => '$val == 0x7fff ? undef : $val', #7
-        ValueConv => '$val / 33640', #PH (conversion factor determined empirically)
+        ValueConv => '$val / 28125', #PH (Vixia HF G30, ref forum5588) (was $val/33640 until 9.49)
         PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
     },
 );
@@ -507,12 +512,21 @@ my $parsePictureTiming; # flag to enable parsing of picture timing information (
         RawConv => '$$self{Make} = ($Image::ExifTool::H264::convMake{$val} || "Unknown"); $val',
         PrintConv => \%convMake,
     },
-    # 1 => ModelIDCode according to ref 4/5 (I think not)
-    # vals: 0x3001 - Sony HDR-CX105E/TG3E/XR500V
+    # 1 => ModelIDCode according to ref 4/5 (I think not - PH)
+    # 1 => { Name => 'ModelIDCode', PrintConv => 'sprintf("%.4x",$val)' },
+    # vals: 0x0313 - various Pansonic HDC models
+    #       0x0345 - Panasonic HC-V7272
+    #       0x0414 - Panasonic AG-AF100
+    #       0x0591 - various Panasonic DMC models
+    #       0x3001 - various Sony DSC, HDR, NEX and SLT models
+    #       0x3003 - various Sony DSC models
+    #       0x3100 - various Sony DSC, ILCE, NEX and SLT models
     #       0x1000 - Sony HDR-UX1
-    #       0x3000 - Canon HF100 (30p)
     #       0x2000 - Canon HF100 (60i)
+    #       0x3000 - Canon HF100 (30p)
     #       0x3101 - Canon HFM300 (PH, all qualities and frame rates)
+    #       0x3102 - Canon HFS200
+    #       0x4300 - Canon HFG30
 );
 
 # camera info 0xe1 (ref 6)
@@ -694,7 +708,7 @@ sub DecodeScalingMatrices($)
 # Inputs) 0) ExifTool ref, 1) tag table ref, 2) data ref
 sub ParseSeqParamSet($$$)
 {
-    my ($exifTool, $tagTablePtr, $dataPt) = @_;
+    my ($et, $tagTablePtr, $dataPt) = @_;
     # initialize our bitstream object
     my $bstr = NewBitStream($dataPt) or return;
     my ($t, $i, $j, $n);
@@ -751,8 +765,8 @@ sub ParseSeqParamSet($$$)
     # quick validity checks (just in case)
     return unless $$bstr{Mask};
     if ($w>=160 and $w<=4096 and $h>=120 and $h<=3072) {
-        $exifTool->HandleTag($tagTablePtr, ImageWidth => $w);
-        $exifTool->HandleTag($tagTablePtr, ImageHeight => $h);
+        $et->HandleTag($tagTablePtr, ImageWidth => $w);
+        $et->HandleTag($tagTablePtr, ImageHeight => $h);
         # (whew! -- so much work just to get ImageSize!!)
     }
     # return now unless interested in picture timing information
@@ -783,15 +797,15 @@ sub ParseSeqParamSet($$$)
     $t = GetIntN($bstr, 1);         # timing_info_present_flag
     if ($t) {
         return if BitsLeft($bstr) < 65;
-        $$exifTool{VUI_units} = GetIntN($bstr, 32); # num_units_in_tick
-        $$exifTool{VUI_scale} = GetIntN($bstr, 32); # time_scale
+        $$et{VUI_units} = GetIntN($bstr, 32); # num_units_in_tick
+        $$et{VUI_scale} = GetIntN($bstr, 32); # time_scale
         GetIntN($bstr, 1);          # fixed_frame_rate_flag
     }
     my $hard;
     for ($j=0; $j<2; ++$j) {
         $t = GetIntN($bstr, 1);     # nal_/vcl_hrd_parameters_present_flag
         if ($t) {
-            $$exifTool{VUI_hard} = 1;
+            $$et{VUI_hard} = 1;
             $hard = 1;
             $n = GetGolomb($bstr);  # cpb_cnt_minus1
             GetIntN($bstr, 8);      # bit_rate_scale/cpb_size_scale
@@ -801,13 +815,13 @@ sub ParseSeqParamSet($$$)
                 GetIntN($bstr, 1);  # cbr_flag[SchedSelIdx]
             }
             GetIntN($bstr, 5);      # initial_cpb_removal_delay_length_minus1
-            $$exifTool{VUI_clen} = GetIntN($bstr, 5); # cpb_removal_delay_length_minus1
-            $$exifTool{VUI_dlen} = GetIntN($bstr, 5); # dpb_output_delay_length_minus1
-            $$exifTool{VUI_toff} = GetIntN($bstr, 5); # time_offset_length
+            $$et{VUI_clen} = GetIntN($bstr, 5); # cpb_removal_delay_length_minus1
+            $$et{VUI_dlen} = GetIntN($bstr, 5); # dpb_output_delay_length_minus1
+            $$et{VUI_toff} = GetIntN($bstr, 5); # time_offset_length
         }
     }
     GetIntN($bstr, 1) if $hard;     # low_delay_hrd_flag
-    $$exifTool{VUI_pic} = GetIntN($bstr, 1);    # pic_struct_present_flag
+    $$et{VUI_pic} = GetIntN($bstr, 1);    # pic_struct_present_flag
     # (don't yet decode the rest of the vui data)
 }
 
@@ -816,17 +830,17 @@ sub ParseSeqParamSet($$$)
 # Inputs) 0) ExifTool ref, 1) data ref
 sub ParsePictureTiming($$)
 {
-    my ($exifTool, $dataPt) = @_;
+    my ($et, $dataPt) = @_;
     my $bstr = NewBitStream($dataPt) or return;
     my ($i, $t, $n);
     # the specification is very odd on this point: the following delays
     # exist if the VUI hardware parameters are present, or if
     # "determined by the application, by some means not specified" -- WTF??
-    if ($$exifTool{VUI_hard}) {
-        GetIntN($bstr, $$exifTool{VUI_clen} + 1);   # cpb_removal_delay
-        GetIntN($bstr, $$exifTool{VUI_dlen} + 1);   # dpb_output_delay
+    if ($$et{VUI_hard}) {
+        GetIntN($bstr, $$et{VUI_clen} + 1);   # cpb_removal_delay
+        GetIntN($bstr, $$et{VUI_dlen} + 1);   # dpb_output_delay
     }
-    if ($$exifTool{VUI_pic}) {
+    if ($$et{VUI_pic}) {
         $t = GetIntN($bstr, 4);     # pic_struct
         # determine NumClockTS ($n)
         $n = { 0=>1, 1=>1, 2=>1, 3=>2, 4=>2, 5=>3, 6=>3, 7=>2, 8=>3 }->{$t};
@@ -858,8 +872,8 @@ sub ParsePictureTiming($$)
                     }
                 }
             }
-            if ($$exifTool{VUI_toff}) {
-                $o = GetIntN($bstr, $$exifTool{VUI_toff});  # time_offset
+            if ($$et{VUI_toff}) {
+                $o = GetIntN($bstr, $$et{VUI_toff});  # time_offset
             }
             last;   # only parse the first clock timestamp found
         }
@@ -872,7 +886,7 @@ sub ParsePictureTiming($$)
 # Returns: 1 if we processed payload type 5
 sub ProcessSEI($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $end = length($$dataPt);
     my $pos = 0;
@@ -899,7 +913,7 @@ sub ProcessSEI($$)
         if ($type == 1) {                   # picture timing information
             if ($parsePictureTiming) {
                 my $buff = substr($$dataPt, $pos, $size);
-                ParsePictureTiming($exifTool, $dataPt);
+                ParsePictureTiming($et, $dataPt);
             }
         } elsif ($type == 5) {              # unregistered user data
             last; # exit loop to process user data now
@@ -921,24 +935,24 @@ sub ProcessSEI($$)
 # unregistered user data payload (ref PH)
 #
     my $tagTablePtr = GetTagTable('Image::ExifTool::H264::MDPM');
-    my $oldIndent = $$exifTool{INDENT};
-    $$exifTool{INDENT} .= '| ';
+    my $oldIndent = $$et{INDENT};
+    $$et{INDENT} .= '| ';
     $end = $pos + $size;    # end of payload
     $pos += 20;             # skip UUID + "MDPM"
     my $num = Get8u($dataPt, $pos++);   # get entry count
     my $lastTag = 0;
-    $exifTool->VerboseDir('MDPM', $num) if $exifTool->Options('Verbose');
+    $et->VerboseDir('MDPM', $num) if $et->Options('Verbose');
     # walk through entries in the MDPM payload
     for ($index=0; $index<$num and $pos<$end; ++$index) {
         my $tag = Get8u($dataPt, $pos);
         if ($tag <= $lastTag) { # should be in numerical order (PH)
-            $exifTool->Warn('Entries in MDPM directory are out of sequence');
+            $et->Warn('Entries in MDPM directory are out of sequence');
             last;
         }
         $lastTag = $tag;
         my $buff = substr($$dataPt, $pos + 1, 4);
         my $from;
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
         if ($tagInfo) {
             # use our own print conversion for Unknown tags
             if ($$tagInfo{Unknown} and not $$tagInfo{SetPrintConv}) {
@@ -958,7 +972,7 @@ sub ProcessSEI($$)
                 ++$lastTag;
                 --$combine;
             }
-            $exifTool->HandleTag($tagTablePtr, $tag, undef,
+            $et->HandleTag($tagTablePtr, $tag, undef,
                 TagInfo => $tagInfo,
                 DataPt  => \$buff,
                 Size    => length($buff),
@@ -967,7 +981,7 @@ sub ProcessSEI($$)
         }
         $pos += 5;
     }
-    $$exifTool{INDENT} = $oldIndent;
+    $$et{INDENT} = $oldIndent;
     return 1;
 }
 
@@ -977,9 +991,9 @@ sub ProcessSEI($$)
 # Returns: 0 = done parsing, 1 = we want to parse more of these
 sub ParseH264Video($$)
 {
-    my ($exifTool, $dataPt) = @_;
-    my $verbose = $exifTool->Options('Verbose');
-    my $out = $exifTool->Options('TextOut');
+    my ($et, $dataPt) = @_;
+    my $verbose = $et->Options('Verbose');
+    my $out = $et->Options('TextOut');
     my $tagTablePtr = GetTagTable('Image::ExifTool::H264::Main');
     my %parseNalUnit = ( 0x06 => 1, 0x07 => 1 );    # NAL unit types to parse
     my $foundUserData;
@@ -1001,7 +1015,7 @@ sub ParseH264Video($$)
         my $nal_unit_type = Get8u($dataPt, $pos);
         ++$pos;
         # check forbidden_zero_bit
-        $nal_unit_type & 0x80 and $exifTool->Warn('H264 forbidden bit error'), last;
+        $nal_unit_type & 0x80 and $et->Warn('H264 forbidden bit error'), last;
         $nal_unit_type &= 0x1f;
         # ignore this NAL unit unless we will parse it
         $parseNalUnit{$nal_unit_type} or $verbose or $pos = $nextPos, next;
@@ -1024,31 +1038,31 @@ sub ParseH264Video($$)
 
         if ($nal_unit_type == 0x06) {       # sei_rbsp (supplemental enhancement info)
 
-            if ($$exifTool{GotNAL06}) {
+            if ($$et{GotNAL06}) {
                 # process only the first SEI unless ExtractEmbedded is set
-                next unless $exifTool->Options('ExtractEmbedded');
-                $$exifTool{DOC_NUM} = $$exifTool{GotNAL06};
+                next unless $et->Options('ExtractEmbedded');
+                $$et{DOC_NUM} = $$et{GotNAL06};
             }
-            $foundUserData = ProcessSEI($exifTool, { DataPt => \$buff } );
-            delete $$exifTool{DOC_NUM};
+            $foundUserData = ProcessSEI($et, { DataPt => \$buff } );
+            delete $$et{DOC_NUM};
             # keep parsing SEI's until we find the user data
             next unless $foundUserData;
-            $$exifTool{GotNAL06} = ($$exifTool{GotNAL06} || 0) + 1;
+            $$et{GotNAL06} = ($$et{GotNAL06} || 0) + 1;
 
         } elsif ($nal_unit_type == 0x07) {  # sequence_parameter_set_rbsp
 
             # process this NAL unit type only once
-            next if $$exifTool{GotNAL07};
-            $$exifTool{GotNAL07} = 1;
-            ParseSeqParamSet($exifTool, $tagTablePtr, \$buff);
+            next if $$et{GotNAL07};
+            $$et{GotNAL07} = 1;
+            ParseSeqParamSet($et, $tagTablePtr, \$buff);
         }
         # we were successful, so don't parse this NAL unit type again
         delete $parseNalUnit{$nal_unit_type};
     }
     # parse one extra H264 frame if we didn't find the user data in this one
     # (Panasonic cameras don't put the SEI in the first frame)
-    return 0 if $foundUserData or $$exifTool{ParsedH264};
-    $$exifTool{ParsedH264} = 1;
+    return 0 if $foundUserData or $$et{ParsedH264};
+    $$et{ParsedH264} = 1;
     return 1;
 }
 
@@ -1071,7 +1085,7 @@ information from H.264 video streams.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -12,7 +12,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.02';
+$VERSION = '1.03';
 
 sub ProcessHP($$$);
 sub ProcessTDHD($$$);
@@ -141,13 +141,13 @@ sub ProcessTDHD($$$);
 # Returns: 1 on success
 sub ProcessTDHD($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dataPos = $$dirInfo{DataPos};
     my $pos = $$dirInfo{DirStart};
     my $dirEnd = $pos + $$dirInfo{DirLen};
-    my $unknown = $exifTool->Options('Unknown') || $exifTool->Options('Verbose');
-    $exifTool->VerboseDir('TDHD', undef, $$dirInfo{DirLen});
+    my $unknown = $et->Options('Unknown') || $et->Options('Verbose');
+    $et->VerboseDir('TDHD', undef, $$dirInfo{DirLen});
     SetByteOrder('II');
     while ($pos + 12 < $dirEnd) {
         my $tag = substr($$dataPt, $pos, 4);
@@ -163,7 +163,7 @@ sub ProcessTDHD($$$)
                 DirStart => $pos,
                 DirLen   => $size,
             );
-            $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+            $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
         } else {
             if (not $$tagTablePtr{$tag} and $unknown) {
                 my $name = $tag;
@@ -184,7 +184,7 @@ sub ProcessTDHD($$$)
                 }
                 AddTagToTable($tagTablePtr, $tag, \%tagInfo);
             }
-            $exifTool->HandleTag($tagTablePtr, $tag, undef,
+            $et->HandleTag($tagTablePtr, $tag, undef,
                 DataPt  => $dataPt,
                 DataPos => $dataPos,
                 Start   => $pos,
@@ -202,7 +202,7 @@ sub ProcessTDHD($$$)
 # Returns: 1 on success, otherwise returns 0 and sets a Warning
 sub ProcessHP($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dataLen = $$dirInfo{DataLen};
     my $dirStart = $$dirInfo{DirStart} || 0;
@@ -216,7 +216,7 @@ sub ProcessHP($$$)
     my $tagID;
     # brute-force scan for PreviewImage
     if ($$tagTablePtr{PreviewImage} and $$dataPt =~ /(\xff\xd8\xff\xdb.*\xff\xd9)/gs) {
-        $exifTool->HandleTag($tagTablePtr, 'PreviewImage', $1);
+        $et->HandleTag($tagTablePtr, 'PreviewImage', $1);
         # truncate preview to speed subsequent tag scans
         my $buff = substr($$dataPt, 0, pos($$dataPt)-length($1));
         $dataPt = \$buff;
@@ -225,7 +225,7 @@ sub ProcessHP($$$)
     foreach $tagID (sort(TagTableKeys($tagTablePtr))) {
         next if $tagID eq 'PreviewImage';
         next unless $$dataPt =~ /$tagID:\s*([\x20-\x7f]+)/i;
-        $exifTool->HandleTag($tagTablePtr, $tagID, $1);
+        $et->HandleTag($tagTablePtr, $tagID, $1);
     }
     return 1;
 }
@@ -249,7 +249,7 @@ Hewlett-Packard maker notes.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -20,7 +20,7 @@ use Image::ExifTool::PostScript;
 use Image::ExifTool::XMP qw(EscapeXML UnescapeXML);
 require Exporter;
 
-$VERSION = '1.12';
+$VERSION = '1.14';
 @ISA = qw(Exporter);
 @EXPORT_OK = qw(EscapeHTML UnescapeHTML);
 
@@ -336,8 +336,8 @@ my %entityName; # look up entity names by number (built as necessary)
 # Returns: original string
 sub SetHTMLCharset($$)
 {
-    my ($val, $exifTool) = @_;
-    $$exifTool{HTMLCharset} = $htmlCharset{lc $1} if $val =~ /charset=['"]?([-\w]+)/;
+    my ($val, $et) = @_;
+    $$et{HTMLCharset} = $htmlCharset{lc $1} if $val =~ /charset=['"]?([-\w]+)/;
     return $val;
 }
 
@@ -403,20 +403,20 @@ sub UnescapeHTML($)
 # Returns: 1 on success, 0 if this wasn't a valid HTML file
 sub ProcessHTML($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my $buff;
 
     # validate HTML or XHTML file
     $raf->Read($buff, 256) or return 0;
-    $buff =~ /^<(!DOCTYPE\s+HTML|HTML|\?xml)/i or return 0;
+    $buff =~ /^\s*<(!DOCTYPE\s+HTML|HTML|\?xml)/i or return 0;
     $buff =~ /<(!DOCTYPE\s+)?HTML/i or return 0 if $1 eq '?xml';
-    $exifTool->SetFileType();
+    $et->SetFileType();
 
-    $raf->Seek(0,0) or $exifTool->Warn('Seek error'), return 1;
+    $raf->Seek(0,0) or $et->Warn('Seek error'), return 1;
 
     local $/ = Image::ExifTool::PostScript::GetInputRecordSeparator($raf);
-    $/ or $exifTool->Warn('Invalid HTML data'), return 1;
+    $/ or $et->Warn('Invalid HTML data'), return 1;
 
     # extract header information
     my $doc;
@@ -480,7 +480,7 @@ sub ProcessHTML($$)
             # isolate group name (separator is '.' in HTML, but ':' in ref 2)
             if ($tag =~ /^([\w-]+)[:.]([\w-]+)/) {
                 ($grp, $tag) = ($1, $2);
-                my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $grp);
+                my $tagInfo = $et->GetTagInfo($tagTablePtr, $grp);
                 if ($tagInfo and $$tagInfo{SubDirectory}) {
                     $table = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
                 } else {
@@ -488,12 +488,12 @@ sub ProcessHTML($$)
                 }
             }
         } elsif ($tag eq 'xml') {
-            $exifTool->VPrint(0, "Parsing XML\n");
+            $et->VPrint(0, "Parsing XML\n");
             # parse XML tags (quick-and-dirty)
             my $xml = $val;
             while ($xml =~ /<([\w-]+):([\w-]+)(\s.*?)?>([^<]*?)<\/\1:\2>/g) {
                 ($grp, $tag, $val) = ($1, $2, $4);
-                my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $grp);
+                my $tagInfo = $et->GetTagInfo($tagTablePtr, $grp);
                 next unless $tagInfo and $$tagInfo{SubDirectory};
                 $table = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
                 unless ($$table{$tag}) {
@@ -502,10 +502,10 @@ sub ProcessHTML($$)
                     $name =~ s/\s(.)/\U$1/g;     # capitalize all words in tag name
                     $name =~ tr/-_a-zA-Z0-9//dc; # remove illegal characters (also hex code wide chars)
                     AddTagToTable($table, $tag, { Name => $name });
-                    $exifTool->VPrint(0, "  [adding $tag '$name']\n");
+                    $et->VPrint(0, "  [adding $tag '$name']\n");
                 }
-                $val = $exifTool->Decode($val, $$exifTool{HTMLCharset}) if $$exifTool{HTMLCharset};
-                $exifTool->HandleTag($table, $tag, UnescapeXML($val));
+                $val = $et->Decode($val, $$et{HTMLCharset}) if $$et{HTMLCharset};
+                $et->HandleTag($table, $tag, UnescapeXML($val));
             }
             next;
         } else {
@@ -518,13 +518,13 @@ sub ProcessHTML($$)
             my $info = { Name => $name, Groups => { 0 => 'HTML' } };
             $info->{Groups}->{1} = ($grp eq 'http-equiv' ? 'HTTP-equiv' : "HTML-$grp") if $grp;
             AddTagToTable($table, $tag, $info);
-            $exifTool->VPrint(0, "  [adding $tag '$tagName']\n");
+            $et->VPrint(0, "  [adding $tag '$tagName']\n");
         }
         # recode if necessary
-        $val = $exifTool->Decode($val, $$exifTool{HTMLCharset}) if $$exifTool{HTMLCharset};
+        $val = $et->Decode($val, $$et{HTMLCharset}) if $$et{HTMLCharset};
         $val =~ s{\s*$/\s*}{ }sg;   # replace linefeeds and indenting spaces
         $val = UnescapeHTML($val);  # unescape HTML character references
-        $exifTool->HandleTag($table, $tag, $val);
+        $et->HandleTag($table, $tag, $val);
     }
     return 1;
 }
@@ -548,7 +548,7 @@ meta information from HTML documents.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -13,7 +13,7 @@ use vars qw($VERSION);
 use Image::ExifTool;    # only for FinishTiffDump()
 use Image::ExifTool::HTML qw(EscapeHTML);
 
-$VERSION = '1.31';
+$VERSION = '1.32';
 
 sub DumpTable($$$;$$$$$);
 sub Open($$$;@);
@@ -721,7 +721,7 @@ sub DumpTable($$$;$$$$$)
 #  is only compiled when needed)
 sub FinishTiffDump($$$)
 {
-    my ($self, $exifTool, $size) = @_;
+    my ($self, $et, $size) = @_;
     my ($tag, $key, $start, $blockInfo, $i);
 
     # list of all indirectly referenced TIFF data tags
@@ -741,17 +741,17 @@ sub FinishTiffDump($$$)
 
     # add TIFF data to html dump
     foreach $tag (keys %offsetPair) {
-        my $info = $exifTool->GetInfo($tag);
+        my $info = $et->GetInfo($tag);
         next unless %$info;
         # Panasonic hack: StripOffsets is not valid for Panasonic RW2 files,
         # and StripRowBytes is not valid for some RAW images
-        if ($tag eq 'StripOffsets' and $exifTool->{TAG_INFO}{$tag}{PanasonicHack}) {
+        if ($tag eq 'StripOffsets' and $$et{TAG_INFO}{$tag}{PanasonicHack}) {
             # use RawDataOffset instead if available since it is valid in RW2
-            my $info2 = $exifTool->GetInfo('RawDataOffset');
+            my $info2 = $et->GetInfo('RawDataOffset');
             $info2 = $info unless %$info2;
             my @keys = keys %$info2;
             my $offset = $$info2{$keys[0]};
-            my $raf = $$exifTool{RAF};
+            my $raf = $$et{RAF};
             # ignore StripByteCounts and assume raw data runs to the end of file
             if (@keys == 1 and $offset =~ /^\d+$/ and $raf) {
                 my $pos = $raf->Tell();
@@ -767,8 +767,8 @@ sub FinishTiffDump($$$)
         # loop through all offsets tags
         foreach $key (keys %$info) {
             my $name = Image::ExifTool::GetTagName($key);
-            my $grp1 = $exifTool->GetGroup($key, 1);
-            my $info2 = $exifTool->GetInfo($offsetPair{$tag}, { Group1 => $grp1 });
+            my $grp1 = $et->GetGroup($key, 1);
+            my $info2 = $et->GetInfo($offsetPair{$tag}, { Group1 => $grp1 });
             my $key2 = $offsetPair{$tag};
             $key2 .= $1 if $key =~ /( .*)/; # use same instance number as $tag
             next unless $$info2{$key2};
@@ -799,7 +799,7 @@ sub FinishTiffDump($$$)
                         next;
                     }
                 }
-                my $msg = $exifTool->GetGroup($key, 1) . ':' . $tag;
+                my $msg = $et->GetGroup($key, 1) . ':' . $tag;
                 $msg =~ s/(Offsets?|Start)$/ /;
                 if ($num > 1) {
                     $msg .= "$li-" if $li != $i;
@@ -823,7 +823,7 @@ sub FinishTiffDump($$$)
         }
     }
     my $diff = $size - $last;
-    if ($diff > 0 and ($last or $exifTool->Options('Unknown'))) {
+    if ($diff > 0 and ($last or $et->Options('Unknown'))) {
         if ($diff > 1 or $size & 0x01) {
             $self->Add($last, $diff, "[unknown data]", "Size: $diff bytes", 0x08);
         } else {
@@ -882,7 +882,7 @@ page.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -23,7 +23,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.26';
+$VERSION = '1.28';
 
 sub ProcessICC($$);
 sub ProcessICC_Profile($$$);
@@ -627,20 +627,20 @@ sub FormatICCTag($$$)
 # Returns: 1 on success
 sub ProcessMetadata($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirStart = $$dirInfo{DirStart};
     my $dirLen = $$dirInfo{DirLen};
     my $dirEnd = $dirStart + $dirLen;
     
     if ($dirLen < 16 or substr($$dataPt, $dirStart, 4) ne 'dict') {
-        $exifTool->Warn('Invalid ICC meta dictionary');
+        $et->Warn('Invalid ICC meta dictionary');
         return 0;
     }
     my $num = Get32u($dataPt, $dirStart + 8);
-    $exifTool->VerboseDir('Metadata', $num);
+    $et->VerboseDir('Metadata', $num);
     my $size = Get32u($dataPt, $dirStart + 12);
-    $size < 16 and $exifTool->Warn('Invalid ICC meta record size'), return 0;
+    $size < 16 and $et->Warn('Invalid ICC meta record size'), return 0;
     # NOTE: In the example the minimum offset is 20,
     # but this doesn't jive with the table (both in ref 5)
     my $minPtr = 16 + $size * $num;
@@ -648,7 +648,7 @@ sub ProcessMetadata($$$)
     for ($index=0; $index<$num; ++$index) {
         my $entry = $dirStart + 16 + $size * $index;
         if ($entry + $size > $dirEnd) {
-            $exifTool->Warn('Truncated ICC meta dictionary');
+            $et->Warn('Truncated ICC meta dictionary');
             last;
         }
         my $namePtr = Get32u($dataPt, $entry);
@@ -659,13 +659,13 @@ sub ProcessMetadata($$$)
         if ($namePtr < $minPtr or $namePtr + $nameLen > $dirLen or
             $valuePtr < $minPtr or $valuePtr + $valueLen > $dirLen)
         {
-            $exifTool->Warn('Corrupted ICC meta dictionary');
+            $et->Warn('Corrupted ICC meta dictionary');
             last;
         }
         my $tag = substr($dataPt, $dirStart + $namePtr, $nameLen);
         my $val = substr($dataPt, $dirStart + $valuePtr, $valueLen);
-        $tag = $exifTool->Decode($tag, 'UTF16', 'MM', 'UTF8');
-        $val = $exifTool->Decode($val, 'UTF16', 'MM');
+        $tag = $et->Decode($tag, 'UTF16', 'MM', 'UTF8');
+        $val = $et->Decode($val, 'UTF16', 'MM');
         # generate tagInfo if it doesn't exist
         unless ($$tagTablePtr{$tag}) {
             my $name = ucfirst $tag;
@@ -674,7 +674,7 @@ sub ProcessMetadata($$$)
             next unless length $name;
             AddTagToTable($tagTablePtr, $tag, { Name => $name });
         }
-        $exifTool->HandleTag($tagTablePtr, $tag, $val);
+        $et->HandleTag($tagTablePtr, $tag, $val);
     }
     return 1;
 }
@@ -686,17 +686,17 @@ sub ProcessMetadata($$$)
 #          or -1 if a write error occurred
 sub WriteICC($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     # first make sure this is a valid ICC file (or no file at all)
     my $raf = $$dirInfo{RAF};
     my $buff;
     return 0 if $raf->Read($buff, 24) and ValidateICC(\$buff);
     # now write the new ICC
-    $buff = WriteICC_Profile($exifTool, $dirInfo);
+    $buff = WriteICC_Profile($et, $dirInfo);
     if (defined $buff and length $buff) {
         Write($$dirInfo{OutFile}, $buff) or return -1;
     } else {
-        $exifTool->Error('No ICC information to write');
+        $et->Error('No ICC information to write');
     }
     return 1;
 }
@@ -709,16 +709,16 @@ sub WriteICC($$)
 # Notes: Increments ExifTool CHANGED flag if changed
 sub WriteICC_Profile($$;$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    $exifTool or return 1;    # allow dummy access
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    $et or return 1;    # allow dummy access
     my $dirName = $$dirInfo{DirName} || 'ICC_Profile';
     # (don't write AsShotICCProfile or CurrentICCProfile here)
     return undef unless $dirName eq 'ICC_Profile';
-    my $nvHash = $exifTool->GetNewValueHash($Image::ExifTool::Extra{$dirName});
-    return undef unless $exifTool->IsOverwriting($nvHash);
-    my $val = $exifTool->GetNewValues($nvHash);
+    my $nvHash = $et->GetNewValueHash($Image::ExifTool::Extra{$dirName});
+    my $val = $et->GetNewValues($nvHash);
     $val = '' unless defined $val;
-    ++$exifTool->{CHANGED};
+    return undef unless $et->IsOverwriting($nvHash, $val);
+    ++$$et{CHANGED};
     return $val;
 }
 
@@ -746,22 +746,22 @@ sub ValidateICC($)
 # Returns: 1 if this was an ICC file
 sub ProcessICC($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my $buff;
     $raf->Read($buff, 24) == 24 or return 0;
     # check to see if this is a valid ICC profile file
     return 0 if ValidateICC(\$buff);
-    $exifTool->SetFileType();
+    $et->SetFileType();
     # read the profile
     my $size = unpack('N', $buff);
     if ($size < 128 or $size & 0x80000000) {
-        $exifTool->Error("Bad ICC Profile length ($size)");
+        $et->Error("Bad ICC Profile length ($size)");
         return 1;
     }
     $raf->Seek(0, 0);
     unless ($raf->Read($buff, $size)) {
-        $exifTool->Error('Truncated ICC profile');
+        $et->Error('Truncated ICC profile');
         return 1;
     }
     my %dirInfo = (
@@ -771,7 +771,7 @@ sub ProcessICC($$)
         DirLen => $size,
     );
     my $tagTablePtr = GetTagTable('Image::ExifTool::ICC_Profile::Main');
-    return ProcessICC_Profile($exifTool, \%dirInfo, $tagTablePtr);
+    return ProcessICC_Profile($et, \%dirInfo, $tagTablePtr);
 }
 
 #------------------------------------------------------------------------------
@@ -781,21 +781,21 @@ sub ProcessICC($$)
 # Returns: 1 on success
 sub ProcessICC_Profile($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirStart = $$dirInfo{DirStart} || 0;
     my $dirLen = $$dirInfo{DirLen};
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
 
     return 0 if $dirLen < 4;
 
     # extract binary ICC_Profile data block if binary mode or requested
-    if ((($exifTool->{TAGS_FROM_FILE} and not $exifTool->{EXCL_TAG_LOOKUP}{icc_profile}) or
-        $exifTool->{REQ_TAG_LOOKUP}{icc_profile}) and
+    if ((($$et{TAGS_FROM_FILE} and not $$et{EXCL_TAG_LOOKUP}{icc_profile}) or
+        $$et{REQ_TAG_LOOKUP}{icc_profile}) and
         # (don't extract from AsShotICCProfile or CurrentICCProfile)
         (not $$dirInfo{Name} or $$dirInfo{Name} eq 'ICC_Profile'))
     {
-        $exifTool->FoundTag('ICC_Profile', substr($$dataPt, $dirStart, $dirLen));
+        $et->FoundTag('ICC_Profile', substr($$dataPt, $dirStart, $dirLen));
     }
 
     SetByteOrder('MM');     # ICC_Profile is always big-endian
@@ -803,7 +803,7 @@ sub ProcessICC_Profile($$$)
     # check length of table
     my $len = Get32u($dataPt, $dirStart);
     if ($len != $dirLen or $len < 128) {
-        $exifTool->Warn("Bad length ICC_Profile (length $len)");
+        $et->Warn("Bad length ICC_Profile (length $len)");
         return 0 if $len < 128 or $dirLen < $len;
     }
     my $pos = $dirStart + 128;  # position at start of table
@@ -811,18 +811,18 @@ sub ProcessICC_Profile($$$)
     if ($numEntries < 1 or $numEntries >= 0x100
         or $numEntries * 12 + 132 > $dirLen)
     {
-        $exifTool->Warn("Bad ICC_Profile table ($numEntries entries)");
+        $et->Warn("Bad ICC_Profile table ($numEntries entries)");
         return 0;
     }
 
     if ($verbose) {
-        $exifTool->VerboseDir('ICC_Profile', $numEntries, $dirLen);
+        $et->VerboseDir('ICC_Profile', $numEntries, $dirLen);
         my $fakeInfo = { Name=>'ProfileHeader', SubDirectory => { } };
-        $exifTool->VerboseInfo(undef, $fakeInfo);
+        $et->VerboseInfo(undef, $fakeInfo);
     }
     # increment ICC dir count
-    my $dirCount = $exifTool->{DIR_COUNT}->{ICC} = ($exifTool->{DIR_COUNT}->{ICC} || 0) + 1;
-    $exifTool->{SET_GROUP1} = '+' . $dirCount if $dirCount > 1;
+    my $dirCount = $$et{DIR_COUNT}{ICC} = ($$et{DIR_COUNT}{ICC} || 0) + 1;
+    $$et{SET_GROUP1} = '+' . $dirCount if $dirCount > 1;
     # process the header block
     my %subdirInfo = (
         Name     => 'ProfileHeader',
@@ -834,7 +834,7 @@ sub ProcessICC_Profile($$$)
         DirName  => 'Header',
     );
     my $newTagTable = GetTagTable('Image::ExifTool::ICC_Profile::Header');
-    $exifTool->ProcessDirectory(\%subdirInfo, $newTagTable);
+    $et->ProcessDirectory(\%subdirInfo, $newTagTable);
 
     $pos += 4;    # skip item count
     my $index;
@@ -843,17 +843,17 @@ sub ProcessICC_Profile($$$)
         my $offset = Get32u($dataPt, $pos + 4);
         my $size   = Get32u($dataPt, $pos + 8);
         $pos += 12;
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID);
         # unknown tags aren't generated automatically by GetTagInfo()
         # if the tagID's aren't numeric, so we must do this manually:
-        if (not $tagInfo and $exifTool->{OPTIONS}->{Unknown}) {
+        if (not $tagInfo and $$et{OPTIONS}{Unknown}) {
             $tagInfo = { Unknown => 1 };
             AddTagToTable($tagTablePtr, $tagID, $tagInfo);
         }
         next unless defined $tagInfo;
 
         if ($offset + $size > $dirLen) {
-            $exifTool->Warn("Bad ICC_Profile table (truncated)");
+            $et->Warn("Bad ICC_Profile table (truncated)");
             last;
         }
         my $valuePtr = $dirStart + $offset;
@@ -883,8 +883,8 @@ sub ProcessICC_Profile($$$)
                     my $strPos = Get32u($dataPt, $recPos + 8);
                     last if $strPos + $strLen > $size; 
                     my $str = substr($$dataPt, $valuePtr + $strPos, $strLen);
-                    $str = $exifTool->Decode($str, 'UTF16');
-                    $exifTool->HandleTag($tagTablePtr, $tagID, $str,
+                    $str = $et->Decode($str, 'UTF16');
+                    $et->HandleTag($tagTablePtr, $tagID, $str,
                         TagInfo => $langInfo || $tagInfo,
                         Table  => $tagTablePtr,
                         Index  => $index,
@@ -895,14 +895,14 @@ sub ProcessICC_Profile($$$)
                         Format => "type '$fmt'",
                     );
                 }
-                $exifTool->Warn("Corrupted $$tagInfo{Name} data") if $i < $count;
+                $et->Warn("Corrupted $$tagInfo{Name} data") if $i < $count;
                 next;
             }
         } else {
             $fmt = 'err ';
         }
         $value = FormatICCTag($dataPt, $valuePtr, $size) unless $subdir;
-        $verbose and $exifTool->VerboseInfo($tagID, $tagInfo,
+        $verbose and $et->VerboseInfo($tagID, $tagInfo,
             Table  => $tagTablePtr,
             Index  => $index,
             Value  => $value,
@@ -937,20 +937,20 @@ sub ProcessICC_Profile($$$)
             my $type = substr($$dataPt, $valuePtr, 4);
             #### eval Validate ($type)
             if (defined $$subdir{Validate} and not eval $$subdir{Validate}) {
-                $exifTool->Warn("Invalid $name data");
+                $et->Warn("Invalid $name data");
             } else {
-                $exifTool->ProcessDirectory(\%subdirInfo, $newTagTable, $$subdir{ProcessProc});
+                $et->ProcessDirectory(\%subdirInfo, $newTagTable, $$subdir{ProcessProc});
             }
         } elsif (defined $value) {
-            $exifTool->FoundTag($tagInfo, $value);
+            $et->FoundTag($tagInfo, $value);
         } else {
             $value = substr($$dataPt, $valuePtr, $size);
             # treat unsupported formats as binary data
             $$tagInfo{ValueConv} = '\$val' unless defined $$tagInfo{ValueConv};
-            $exifTool->FoundTag($tagInfo, $value);
+            $et->FoundTag($tagInfo, $value);
         }
     }
-    delete $exifTool->{SET_GROUP1};
+    delete $$et{SET_GROUP1};
     return 1;
 }
 
@@ -976,7 +976,7 @@ data created on one device into another device's native color space.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -16,7 +16,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.37';
+$VERSION = '1.41';
 
 sub ProcessID3v2($$$);
 sub ProcessPrivate($$$);
@@ -142,7 +142,7 @@ my %genre = (
      37 => 'Sound Clip',
      38 => 'Gospel',
      39 => 'Noise',
-     40 => 'AlternRock',
+     40 => 'Alt. Rock', # (was AlternRock)
      41 => 'Bass',
      42 => 'Soul',
      43 => 'Punk',
@@ -161,7 +161,7 @@ my %genre = (
      56 => 'Southern Rock',
      57 => 'Comedy',
      58 => 'Cult',
-     59 => 'Gangsta',
+     59 => 'Gangsta Rap', # (was Gansta)
      60 => 'Top 40',
      61 => 'Christian Rap',
      62 => 'Pop/Funk',
@@ -169,7 +169,7 @@ my %genre = (
      64 => 'Native American',
      65 => 'Cabaret',
      66 => 'New Wave',
-     67 => 'Psychadelic',
+     67 => 'Psychedelic', # (was misspelt)
      68 => 'Rave',
      69 => 'Showtunes',
      70 => 'Trailer',
@@ -187,8 +187,8 @@ my %genre = (
      81 => 'Folk-Rock',
      82 => 'National Folk',
      83 => 'Swing',
-     84 => 'Fast Fusion',
-     85 => 'Bebob',
+     84 => 'Fast-Fusion', # (was Fast Fusion)
+     85 => 'Bebop', # (was misspelt)
      86 => 'Latin',
      87 => 'Revival',
      88 => 'Celtic',
@@ -226,7 +226,7 @@ my %genre = (
     120 => 'Duet',
     121 => 'Punk Rock',
     122 => 'Drum Solo',
-    123 => 'Acapella',
+    123 => 'A Cappella', # (was Acapella)
     124 => 'Euro-House',
     125 => 'Dance Hall',
     # ref http://yar.hole.ru/MP3Tech/lamedoc/id3.html
@@ -237,21 +237,67 @@ my %genre = (
     130 => 'Terror',
     131 => 'Indie',
     132 => 'BritPop',
-    133 => 'Negerpunk',
+    133 => 'Afro-Punk', # (was Negerpunk)
     134 => 'Polsk Punk',
     135 => 'Beat',
-    136 => 'Christian Gangsta',
+    136 => 'Christian Gangsta Rap', # (was Christian Gangsta)
     137 => 'Heavy Metal',
     138 => 'Black Metal',
     139 => 'Crossover',
-    140 => 'Contemporary C',
+    140 => 'Contemporary Christian', # (was Contemporary C)
     141 => 'Christian Rock',
     142 => 'Merengue',
     143 => 'Salsa',
     144 => 'Thrash Metal',
     145 => 'Anime',
     146 => 'JPop',
-    147 => 'SynthPop',
+    147 => 'Synthpop', # (was SynthPop)
+    # ref http://alicja.homelinux.com/~mats/text/Music/MP3/ID3/Genres.txt
+    # (also used to update some Genres above)
+    148 => 'Abstract',
+    149 => 'Art Rock',
+    150 => 'Baroque',
+    151 => 'Bhangra',
+    152 => 'Big Beat',
+    153 => 'Breakbeat',
+    154 => 'Chillout',
+    155 => 'Downtempo',
+    156 => 'Dub',
+    157 => 'EBM',
+    158 => 'Eclectic',
+    159 => 'Electro',
+    160 => 'Electroclash',
+    161 => 'Emo',
+    162 => 'Experimental',
+    163 => 'Garage',
+    164 => 'Global',
+    165 => 'IDM',
+    166 => 'Illbient',
+    167 => 'Industro-Goth',
+    168 => 'Jam Band',
+    169 => 'Krautrock',
+    170 => 'Leftfield',
+    171 => 'Lounge',
+    172 => 'Math Rock',
+    173 => 'New Romantic',
+    174 => 'Nu-Breakz',
+    175 => 'Post-Punk',
+    176 => 'Post-Rock',
+    177 => 'Psytrance',
+    178 => 'Shoegaze',
+    179 => 'Space Rock',
+    180 => 'Trop Rock',
+    181 => 'World Music',
+    182 => 'Neoclassical',
+    183 => 'Audiobook',
+    184 => 'Audio Theatre',
+    185 => 'Neue Deutsche Welle',
+    186 => 'Podcast',
+    187 => 'Indie Rock',
+    188 => 'G-Funk',
+    189 => 'Dubstep',
+    190 => 'Garage Rock',
+    191 => 'Psybient',
     255 => 'None',
     # ID3v2 adds some text short forms...
     CR  => 'Cover',
@@ -754,8 +800,8 @@ Image::ExifTool::AddCompositeTags('Image::ExifTool::ID3');
 # Returns: converted text
 sub ConvertID3v1Text($$)
 {
-    my ($exifTool, $val) = @_;
-    return $exifTool->Decode($val, $exifTool->Options('CharsetID3'));
+    my ($et, $val) = @_;
+    return $et->Decode($val, $et->Options('CharsetID3'));
 }
 
 #------------------------------------------------------------------------------
@@ -786,10 +832,10 @@ sub ConvertTimeStamp($)
 # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
 sub ProcessSynText($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
 
-    $exifTool->VerboseDir('SynLyrics', 0, length $$dataPt);
+    $et->VerboseDir('SynLyrics', 0, length $$dataPt);
     return unless length $$dataPt > 6;
 
     my ($enc,$lang,$timeCode,$type) = unpack('Ca3CC', $$dataPt);
@@ -807,13 +853,13 @@ sub ProcessSynText($$$)
         $pat = '\0(....)';
     }
     my $desc = substr($$dataPt, 6, pos($$dataPt) - 6 - $termLen);
-    $desc = DecodeString($exifTool, $desc, $enc);
+    $desc = DecodeString($et, $desc, $enc);
 
-    my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, 'desc');
+    my $tagInfo = $et->GetTagInfo($tagTablePtr, 'desc');
     $tagInfo = Image::ExifTool::GetLangInfo($tagInfo, $lang) if $lang;
-    $exifTool->HandleTag($tagTablePtr, 'type', $type);
-    $exifTool->HandleTag($tagTablePtr, 'desc', $desc, TagInfo => $tagInfo);
-    $tagInfo = $exifTool->GetTagInfo($tagTablePtr, 'text');
+    $et->HandleTag($tagTablePtr, 'type', $type);
+    $et->HandleTag($tagTablePtr, 'desc', $desc, TagInfo => $tagInfo);
+    $tagInfo = $et->GetTagInfo($tagTablePtr, 'text');
     $tagInfo = Image::ExifTool::GetLangInfo($tagInfo, $lang) if $lang;
 
     for (;;) {
@@ -821,7 +867,7 @@ sub ProcessSynText($$$)
         last unless $$dataPt =~ /$pat/sg;
         my $time = unpack('N', $1);
         my $text = substr($$dataPt, $pos, pos($$dataPt) - $pos - 4 - $termLen);
-        $text = DecodeString($exifTool, $text, $enc);
+        $text = DecodeString($et, $text, $enc);
         my $timeStr;
         if ($timeCode == 2) { # time in ms
             $timeStr = sprintf('%.3f', $time / 1000);
@@ -829,7 +875,7 @@ sub ProcessSynText($$$)
             $timeStr = sprintf('%.4d', $time);
             $timeStr .= '?' if $timeCode != 1;
         }
-        $exifTool->HandleTag($tagTablePtr, 'text', "[$timeStr]$text", TagInfo => $tagInfo);
+        $et->HandleTag($tagTablePtr, 'text', "[$timeStr]$text", TagInfo => $tagInfo);
     }
 }
 
@@ -838,10 +884,10 @@ sub ProcessSynText($$$)
 # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
 sub ProcessPrivate($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my ($tag, $start);
-    $exifTool->VerboseDir('PRIV', 0, length $$dataPt);
+    $et->VerboseDir('PRIV', 0, length $$dataPt);
     if ($$dataPt =~ /^(.*?)\0/s) {
         $tag = $1;
         $start = length($tag) + 1;
@@ -857,13 +903,13 @@ sub ProcessPrivate($$$)
                 { Name => ucfirst($tag), Binary => 1 });
         }
     }
-    my $key = $exifTool->HandleTag($tagTablePtr, $tag, undef,
+    my $key = $et->HandleTag($tagTablePtr, $tag, undef,
         Size  => length($$dataPt) - $start,
         Start => $start,
         DataPt => $dataPt,
     );
     # set group1 name
-    $exifTool->SetGroup($key, $$exifTool{ID3_Ver}) if $key;
+    $et->SetGroup($key, $$et{ID3_Ver}) if $key;
 }
 
 #------------------------------------------------------------------------------
@@ -897,7 +943,7 @@ sub PrintGenre($)
 # Returns: Decoded string in scalar context, or list of strings in list context
 sub DecodeString($$;$)
 {
-    my ($exifTool, $val, $enc) = @_;
+    my ($et, $val, $enc) = @_;
     return '' unless length $val;
     unless (defined $enc) {
         $enc = unpack('C', $val);
@@ -909,7 +955,7 @@ sub DecodeString($$;$)
         # (must split before converting because conversion routines truncate at null)
         @vals = split "\0", $val;
         foreach $val (@vals) {
-            $val = $exifTool->Decode($val, $enc ? 'UTF8' : 'Latin');
+            $val = $et->Decode($val, $enc ? 'UTF8' : 'Latin');
         }
     } elsif ($enc == 1 or $enc == 2) {  # UTF-16 with BOM, or UTF-16BE
         my $bom = "\xfe\xff";
@@ -925,7 +971,7 @@ sub DecodeString($$;$)
                 $val = '';
             }
             $bom = $1 if $v =~ s/^(\xfe\xff|\xff\xfe)//;
-            push @vals, $exifTool->Decode($v, 'UCS2', $order{$bom});
+            push @vals, $et->Decode($v, 'UCS2', $order{$bom});
         }
     } else {
         $val =~ s/\0+$//;
@@ -954,15 +1000,15 @@ sub UnSyncSafe($)
 # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
 sub ProcessID3v2($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt  = $$dirInfo{DataPt};
     my $offset  = $$dirInfo{DirStart};
     my $size    = $$dirInfo{DirLen};
     my $vers    = $$dirInfo{Version};
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     my $len;    # frame data length
 
-    $verbose and $exifTool->VerboseDir($tagTablePtr->{GROUPS}->{1}, 0, $size);
+    $verbose and $et->VerboseDir($tagTablePtr->{GROUPS}->{1}, 0, $size);
 
     for (;;$offset+=$len) {
         my ($id, $flags, $hi);
@@ -986,7 +1032,7 @@ sub ProcessID3v2($$$)
                 my $oldLen = $len;
                 $len =  UnSyncSafe($len);
                 if (not defined $len or $offset + $len + 10 > $size) {
-                    $exifTool->Warn('Invalid ID3 frame size');
+                    $et->Warn('Invalid ID3 frame size');
                     last;
                 }
                 # check next ID to see if it makes sense
@@ -1000,9 +1046,9 @@ sub ProcessID3v2($$$)
             }
         }
         last if $offset + $len > $size;
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $id);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $id);
         unless ($tagInfo) {
-            next unless $verbose or $exifTool->Options('Unknown');
+            next unless $verbose or $et->Options('Unknown');
             $id =~ tr/-A-Za-z0-9_//dc;
             $id = 'unknown' unless length $id;
             unless ($$tagTablePtr{$id}) {
@@ -1028,7 +1074,7 @@ sub ProcessID3v2($$$)
             }
         }
         if ($flags{Encrypt}) {
-            $exifTool->WarnOnce('Encrypted frames currently not supported');
+            $et->WarnOnce('Encrypted frames currently not supported');
             next;
         }
         # extract the value
@@ -1039,41 +1085,41 @@ sub ProcessID3v2($$$)
 
         # read grouping identity
         if ($flags{GroupID}) {
-            length($val) >= 1 or $exifTool->Warn("Short $id frame"), next;
+            length($val) >= 1 or $et->Warn("Short $id frame"), next;
             $val = substr($val, 1); # (ignore it)
         }
         # read data length
         my $dataLen;
         if ($flags{DataLen} or $flags{Compress}) {
-            length($val) >= 4 or $exifTool->Warn("Short $id frame"), next;
+            length($val) >= 4 or $et->Warn("Short $id frame"), next;
             $dataLen = unpack('N', $val);   # save the data length word
             $val = substr($val, 4);
         }
         # uncompress data
         if ($flags{Compress}) {
-            if (eval 'require Compress::Zlib') {
+            if (eval { require Compress::Zlib }) {
                 my $inflate = Compress::Zlib::inflateInit();
                 my ($buff, $stat);
                 $inflate and ($buff, $stat) = $inflate->inflate($val);
                 if ($inflate and $stat == Compress::Zlib::Z_STREAM_END()) {
                     $val = $buff;
                 } else {
-                    $exifTool->Warn("Error inflating $id frame");
+                    $et->Warn("Error inflating $id frame");
                     next;
                 }
             } else {
-                $exifTool->WarnOnce('Install Compress::Zlib to decode compressed frames');
+                $et->WarnOnce('Install Compress::Zlib to decode compressed frames');
                 next;
             }
         }
         # validate data length
         if (defined $dataLen) {
             $dataLen = UnSyncSafe($dataLen);
-            defined $dataLen or $exifTool->Warn("Invalid length for $id frame"), next;
-            $dataLen == length($val) or $exifTool->Warn("Wrong length for $id frame"), next;
+            defined $dataLen or $et->Warn("Invalid length for $id frame"), next;
+            $dataLen == length($val) or $et->Warn("Wrong length for $id frame"), next;
         }
         unless ($tagInfo) {
-            $verbose and $exifTool->VerboseInfo($id, $tagInfo,
+            $verbose and $et->VerboseInfo($id, $tagInfo,
                 Table   => $tagTablePtr,
                 Value   => $val,
                 DataPt  => $dataPt,
@@ -1091,11 +1137,11 @@ sub ProcessID3v2($$$)
         my $valLen = length($val);  # actual value length (after decompression, etc)
         if ($id =~ /^(TXX|TXXX)$/) {
             # two encoded strings separated by a null
-            my @vals = DecodeString($exifTool, $val);
+            my @vals = DecodeString($et, $val);
             foreach (0..1) { $vals[$_] = '' unless defined $vals[$_]; }
             ($val = "($vals[0]) $vals[1]") =~ s/^\(\) //;
         } elsif ($id =~ /^T/ or $id =~ /^(IPL|IPLS)$/) {
-            $val = DecodeString($exifTool, $val);
+            $val = DecodeString($et, $val);
         } elsif ($id =~ /^(WXX|WXXX)$/) {
             # one encoded string and one Latin string separated by a null
             my $enc = unpack('C', $val);
@@ -1106,31 +1152,31 @@ sub ProcessID3v2($$$)
                 ($val, $url) = ($val =~ /^(..*?)\0(.*)/s);
             }
             unless (defined $val and defined $url) {
-                $exifTool->Warn("Invalid $id frame value");
+                $et->Warn("Invalid $id frame value");
                 next;
             }
-            $val = DecodeString($exifTool, $val);
+            $val = DecodeString($et, $val);
             $url =~ s/\0.*//s;
             $val = length($val) ? "($val) $url" : $url;
         } elsif ($id =~ /^W/) {
             $val =~ s/\0.*//s;  # truncate at null
         } elsif ($id =~ /^(COM|COMM|ULT|USLT)$/) {
-            $valLen > 4 or $exifTool->Warn("Short $id frame"), next;
+            $valLen > 4 or $et->Warn("Short $id frame"), next;
             $lang = substr($val,1,3);
-            my @vals = DecodeString($exifTool, substr($val,4), Get8u(\$val,0));
+            my @vals = DecodeString($et, substr($val,4), Get8u(\$val,0));
             foreach (0..1) { $vals[$_] = '' unless defined $vals[$_]; }
             $val = length($vals[0]) ? "($vals[0]) $vals[1]" : $vals[1];
         } elsif ($id eq 'USER') {
-            $valLen > 4 or $exifTool->Warn("Short $id frame"), next;
+            $valLen > 4 or $et->Warn("Short $id frame"), next;
             $lang = substr($val,1,3);
-            $val = DecodeString($exifTool, substr($val,4), Get8u(\$val,0));
+            $val = DecodeString($et, substr($val,4), Get8u(\$val,0));
         } elsif ($id =~ /^(CNT|PCNT)$/) {
-            $valLen >= 4 or $exifTool->Warn("Short $id frame"), next;
+            $valLen >= 4 or $et->Warn("Short $id frame"), next;
             my ($cnt, @xtra) = unpack('NC*', $val);
             $cnt = ($cnt << 8) + $_ foreach @xtra;
             $val = $cnt;
         } elsif ($id =~ /^(PIC|APIC)$/) {
-            $valLen >= 4 or $exifTool->Warn("Short $id frame"), next;
+            $valLen >= 4 or $et->Warn("Short $id frame"), next;
             my ($hdr, $attr);
             my $enc = unpack('C', $val);
             if ($enc == 1 or $enc == 2) {
@@ -1139,20 +1185,20 @@ sub ProcessID3v2($$$)
                 $hdr = ($id eq 'PIC') ? ".(...)(.)(.*?)\0"        : ".(.*?)\0(.)(.*?)\0";
             }
             # remove header (encoding, image format or MIME type, picture type, description)
-            $val =~ s/^$hdr//s or $exifTool->Warn("Invalid $id frame"), next;
-            my @attrs = ($1, ord($2), DecodeString($exifTool, $3, $enc));
+            $val =~ s/^$hdr//s or $et->Warn("Invalid $id frame"), next;
+            my @attrs = ($1, ord($2), DecodeString($et, $3, $enc));
             my $i = 1;
             foreach $attr (@attrs) {
                 # must store descriptions even if they are empty to maintain
                 # sync between copy numbers when multiple images
-                $exifTool->HandleTag($tagTablePtr, "$id-$i", $attr);
+                $et->HandleTag($tagTablePtr, "$id-$i", $attr);
                 ++$i;
             }
         } elsif ($id eq 'POP' or $id eq 'POPM') {
             # _email, 00, rating(1), counter(4-N)
             my ($email, $dat) = ($val =~ /^([^\0]*)\0(.*)$/s);
             unless (defined $dat and length($dat)) {
-                $exifTool->Warn("Invalid $id frame");
+                $et->Warn("Invalid $id frame");
                 next;
             }
             my ($rating, @xtra) = unpack('C*', $dat);
@@ -1161,13 +1207,13 @@ sub ProcessID3v2($$$)
             $val = "$email $rating $cnt";
         } elsif ($id eq 'OWNE') {
             # enc(1), _price, 00, _date(8), Seller
-            my @strs = DecodeString($exifTool, $val);
+            my @strs = DecodeString($et, $val);
             $strs[1] =~ s/^(\d{4})(\d{2})(\d{2})/$1:$2:$3 /s if $strs[1]; # format date
             $val = "@strs";
         } elsif ($id eq 'RVA' or $id eq 'RVAD') {
             my @dat = unpack('C*', $val);
             my $flag = shift @dat;
-            my $bits = shift @dat or $exifTool->Warn("Short $id frame"), next;
+            my $bits = shift @dat or $et->Warn("Short $id frame"), next;
             my $bytes = int(($bits + 7) / 8);
             my @parse = (['Right',0,2,0x01],['Left',1,3,0x02],['Back-right',4,6,0x04],
                          ['Back-left',5,7,0x08],['Center',8,9,0x10],['Bass',10,11,0x20]);
@@ -1213,20 +1259,20 @@ sub ProcessID3v2($$$)
             $val .= " ($id)" if $id;
         } elsif ($id eq 'PRIV') {
             # save version number to set group1 name for tag later
-            $exifTool->{ID3_Ver} = $tagTablePtr->{GROUPS}->{1};
-            $exifTool->HandleTag($tagTablePtr, $id, $val);
+            $$et{ID3_Ver} = $$tagTablePtr{GROUPS}{1};
+            $et->HandleTag($tagTablePtr, $id, $val);
             next;
         } elsif ($$tagInfo{Format} or $$tagInfo{SubDirectory}) {
-            $exifTool->HandleTag($tagTablePtr, $id, undef, DataPt => \$val);
+            $et->HandleTag($tagTablePtr, $id, undef, DataPt => \$val);
             next;
         } elsif (not $$tagInfo{Binary}) {
-            $exifTool->Warn("Don't know how to handle $id frame");
+            $et->Warn("Don't know how to handle $id frame");
             next;
         }
         if ($lang and $lang =~ /^[a-z]{3}$/i and $lang ne 'eng') {
             $tagInfo = Image::ExifTool::GetLangInfo($tagInfo, lc $lang);
         }
-        $exifTool->HandleTag($tagTablePtr, $id, $val,
+        $et->HandleTag($tagTablePtr, $id, $val,
             TagInfo => $tagInfo,
             DataPt  => $dataPt,
             DataPos => $$dirInfo{DataPos},
@@ -1244,10 +1290,10 @@ sub ProcessID3v2($$$)
 # - sets ExifTool DoneID3 to 1 when called, or to 2 if an ID3v1 trailer exists
 sub ProcessID3($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
 
-    return 0 if $exifTool->{DoneID3};  # avoid infinite recursion
-    $exifTool->{DoneID3} = 1;
+    return 0 if $$et{DoneID3};  # avoid infinite recursion
+    $$et{DoneID3} = 1;
 
     # allow this to be called with either RAF or DataPt
     my $raf = $$dirInfo{RAF} || new File::RandomAccess($$dirInfo{DataPt});
@@ -1264,17 +1310,17 @@ sub ProcessID3($$)
 #
     while ($buff =~ /^ID3/) {
         $rtnVal = 1;
-        $raf->Read($hBuff, 7) == 7 or $exifTool->Warn('Short ID3 header'), last;
+        $raf->Read($hBuff, 7) == 7 or $et->Warn('Short ID3 header'), last;
         my ($vers, $flags, $size) = unpack('nCN', $hBuff);
         $size = UnSyncSafe($size);
-        defined $size or $exifTool->Warn('Invalid ID3 header'), last;
+        defined $size or $et->Warn('Invalid ID3 header'), last;
         my $verStr = sprintf("2.%d.%d", $vers >> 8, $vers & 0xff);
         if ($vers >= 0x0500) {
-            $exifTool->Warn("Unsupported ID3 version: $verStr");
+            $et->Warn("Unsupported ID3 version: $verStr");
             last;
         }
         unless ($raf->Read($hBuff, $size) == $size) {
-            $exifTool->Warn('Truncated ID3 data');
+            $et->Warn('Truncated ID3 data');
             last;
         }
         # this flag only indicates use of unsynchronized frames in ID3v2.4
@@ -1285,10 +1331,10 @@ sub ProcessID3($$)
         my $pos = 10;
         if ($flags & 0x40) {
             # skip the extended header
-            $size >= 4 or $exifTool->Warn('Bad ID3 extended header'), last;
+            $size >= 4 or $et->Warn('Bad ID3 extended header'), last;
             my $len = unpack('N', $hBuff);
             if ($len > length($hBuff) - 4) {
-                $exifTool->Warn('Truncated ID3 extended header');
+                $et->Warn('Truncated ID3 extended header');
                 last;
             }
             $hBuff = substr($hBuff, $len + 4);
@@ -1321,7 +1367,7 @@ sub ProcessID3($$)
 # read ID3v1 trailer if it exists
 #
     if ($raf->Seek(-128, 2) and $raf->Read($tBuff, 128) == 128 and $tBuff =~ /^TAG/) {
-        $exifTool->{DoneID3} = 2;  # set to 2 as flag that trailer exists
+        $$et{DoneID3} = 2;  # set to 2 as flag that trailer exists
         %id3Trailer = (
             DataPt   => \$tBuff,
             DataPos  => $raf->Tell() - 128,
@@ -1341,7 +1387,7 @@ sub ProcessID3($$)
     if ($rtnVal) {
         # first process audio data if it exists
         if ($$dirInfo{RAF}) {
-            my $oldType = $exifTool->{FILE_TYPE};   # save file type
+            my $oldType = $$et{FILE_TYPE};   # save file type
             # check current file type first
             my @types = grep /^$oldType$/, @audioFormats;
             push @types, grep(!/^$oldType$/, @audioFormats);
@@ -1350,40 +1396,40 @@ sub ProcessID3($$)
                 # seek to end of ID3 header
                 $raf->Seek($hdrEnd, 0);
                 # set type for this file if we are successful
-                $exifTool->{FILE_TYPE} = $type;
+                $$et{FILE_TYPE} = $type;
                 my $module = $audioModule{$type} || $type;
                 require "Image/ExifTool/$module.pm" or next;
                 my $func = "Image::ExifTool::${module}::Process$type";
                 # process the file
                 no strict 'refs';
-                &$func($exifTool, $dirInfo) and last;
+                &$func($et, $dirInfo) and last;
                 use strict 'refs';
             }
-            $exifTool->{FILE_TYPE} = $oldType;      # restore original file type
+            $$et{FILE_TYPE} = $oldType;      # restore original file type
         }
         # set file type to MP3 if we didn't find audio data
-        $exifTool->SetFileType('MP3');
+        $et->SetFileType('MP3');
         # record the size of the ID3 metadata
-        $exifTool->FoundTag('ID3Size', $id3Len);
+        $et->FoundTag('ID3Size', $id3Len);
         # process ID3v2 header if it exists
         if (%id3Header) {
-            $exifTool->VPrint(0, "$id3Header{DirName}:\n");
-            $exifTool->ProcessDirectory(\%id3Header, $tagTablePtr);
+            $et->VPrint(0, "$id3Header{DirName}:\n");
+            $et->ProcessDirectory(\%id3Header, $tagTablePtr);
         }
         # process ID3v1 trailer if it exists
         if (%id3Trailer) {
-            $exifTool->VPrint(0, "ID3v1:\n");
+            $et->VPrint(0, "ID3v1:\n");
             SetByteOrder('MM');
             $tagTablePtr = GetTagTable('Image::ExifTool::ID3::v1');
-            $exifTool->ProcessDirectory(\%id3Trailer, $tagTablePtr);
+            $et->ProcessDirectory(\%id3Trailer, $tagTablePtr);
             # process "Enhanced TAG" information if available
             if ($id3Trailer{EnhancedTAG}) {
-                $exifTool->VPrint(0, "ID3v1 Enhanced TAG:\n");
+                $et->VPrint(0, "ID3v1 Enhanced TAG:\n");
                 $tagTablePtr = GetTagTable('Image::ExifTool::ID3::v1_Enh');
                 $id3Trailer{DataPt} = $id3Trailer{EnhancedTAG};
                 $id3Trailer{DataPos} -= 227; # (227 = length of Enhanced TAG block)
                 $id3Trailer{DirLen} = 227;
-                $exifTool->ProcessDirectory(\%id3Trailer, $tagTablePtr);
+                $et->ProcessDirectory(\%id3Trailer, $tagTablePtr);
             }
         }
     }
@@ -1398,13 +1444,13 @@ sub ProcessID3($$)
 # Returns: 1 on success, 0 if this wasn't a valid MP3 file
 sub ProcessMP3($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $rtnVal = 0;
 
     # must first check for leading/trailing ID3 information
     # (and process the rest of the file if found)
-    unless ($exifTool->{DoneID3}) {
-        $rtnVal = ProcessID3($exifTool, $dirInfo);
+    unless ($$et{DoneID3}) {
+        $rtnVal = ProcessID3($et, $dirInfo);
     }
 
     # check for MPEG A/V data if not already processed above
@@ -1416,26 +1462,26 @@ sub ProcessMP3($$)
 # (if found in the first $scanLen bytes)
 #
         # scan further into a file that should be an MP3
-        my $scanLen = ($$exifTool{FILE_EXT} and $$exifTool{FILE_EXT} eq 'MP3') ? 8192 : 256;
+        my $scanLen = ($$et{FILE_EXT} and $$et{FILE_EXT} eq 'MP3') ? 8192 : 256;
         if ($raf->Read($buff, $scanLen)) {
             require Image::ExifTool::MPEG;
             if ($buff =~ /\0\0\x01(\xb3|\xc0)/) {
                 # look for A/V headers in first 64kB
                 my $buf2;
                 $raf->Read($buf2, 0x10000 - $scanLen) and $buff .= $buf2;
-                $rtnVal = 1 if Image::ExifTool::MPEG::ParseMPEGAudioVideo($exifTool, \$buff);
+                $rtnVal = 1 if Image::ExifTool::MPEG::ParseMPEGAudioVideo($et, \$buff);
             } else {
                 # look for audio frame sync in first $scanLen bytes
                 # (set MP3 flag to 1 so this will fail unless layer 3 audio)
-                $rtnVal = 1 if Image::ExifTool::MPEG::ParseMPEGAudio($exifTool, \$buff, 1);
+                $rtnVal = 1 if Image::ExifTool::MPEG::ParseMPEGAudio($et, \$buff, 1);
             }
         }
     }
 
     # check for an APE trailer if this was a valid A/V file and we haven't already done it
-    if ($rtnVal and not $exifTool->{DoneAPE}) {
+    if ($rtnVal and not $$et{DoneAPE}) {
         require Image::ExifTool::APE;
-        Image::ExifTool::APE::ProcessAPE($exifTool, $dirInfo);
+        Image::ExifTool::APE::ProcessAPE($et, $dirInfo);
     }
     return $rtnVal;
 }
@@ -1460,7 +1506,7 @@ other types of audio files.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -15,7 +15,7 @@ use strict;
 use vars qw($VERSION $AUTOLOAD %iptcCharset);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.48';
+$VERSION = '1.51';
 
 %iptcCharset = (
     "\x1b%G"  => 'UTF8',
@@ -42,6 +42,7 @@ my %isStandardIPTC = (
     'MIE-IPTC'                  => 1,
     'EPS-Photoshop-IPTC'        => 1,
     'PS-Photoshop-IPTC'         => 1,
+    'EXV-APP13-Photoshop-IPTC'  => 1,
 );
 
 my %fileFormat = (
@@ -976,18 +977,18 @@ sub PrintCodedCharset($)
 # Returns: IPTC character set if translation required (or 'bad' if unknown)
 sub HandleCodedCharset($$)
 {
-    my ($exifTool, $val) = @_;
+    my ($et, $val) = @_;
     my $xlat = $iptcCharset{$val};
     unless ($xlat) {
         if ($val =~ /^\x1b\x25/) {
             # some unknown character set invoked
             $xlat = 'bad';  # flag unsupported coding
         } else {
-            $xlat = $exifTool->Options('CharsetIPTC');
+            $xlat = $et->Options('CharsetIPTC');
         }
     }
     # no need to translate if Charset is the same
-    undef $xlat if $xlat eq $exifTool->Options('Charset');
+    undef $xlat if $xlat eq $et->Options('Charset');
     return $xlat;
 }
 
@@ -998,17 +999,17 @@ sub HandleCodedCharset($$)
 # Updates value on return
 sub TranslateCodedString($$$$)
 {
-    my ($exifTool, $valPtr, $xlatPtr, $read) = @_;
+    my ($et, $valPtr, $xlatPtr, $read) = @_;
     if ($$xlatPtr eq 'bad') {
-        $exifTool->Warn('Some IPTC characters not converted (unsupported CodedCharacterSet)');
+        $et->Warn('Some IPTC characters not converted (unsupported CodedCharacterSet)');
         undef $$xlatPtr;
     } elsif (not $read) {
-        $$valPtr = $exifTool->Decode($$valPtr, undef, undef, $$xlatPtr);
+        $$valPtr = $et->Decode($$valPtr, undef, undef, $$xlatPtr);
     } elsif ($$valPtr !~ /[\x14\x15\x1b]/) {
-        $$valPtr = $exifTool->Decode($$valPtr, $$xlatPtr);
+        $$valPtr = $et->Decode($$valPtr, $$xlatPtr);
     } else {
         # don't yet support reading ISO 2022 shifted character sets
-        $exifTool->WarnOnce('Some IPTC characters not converted (ISO 2022 shifting not supported)');
+        $et->WarnOnce('Some IPTC characters not converted (ISO 2022 shifting not supported)');
     }
 }
 
@@ -1029,23 +1030,23 @@ sub IsStandardIPTC($)
 # Returns: 1 on success, 0 otherwise
 sub ProcessIPTC($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $pos = $$dirInfo{DirStart} || 0;
     my $dirLen = $$dirInfo{DirLen} || 0;
     my $dirEnd = $pos + $dirLen;
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     my $success = 0;
     my ($lastRec, $recordPtr, $recordName);
 
-    $verbose and $dirInfo and $exifTool->VerboseDir('IPTC', 0, $$dirInfo{DirLen});
+    $verbose and $dirInfo and $et->VerboseDir('IPTC', 0, $$dirInfo{DirLen});
 
     if ($tagTablePtr eq \%Image::ExifTool::IPTC::Main) {
         # calculate MD5 if Digest::MD5 is available (for standard IPTC only)
-        my $path = $exifTool->MetadataPath();
+        my $path = $et->MetadataPath();
         if (IsStandardIPTC($path)) {
             my $md5;
-            if (eval 'require Digest::MD5') {
+            if (eval { require Digest::MD5 }) {
                 if ($pos or $dirLen != length($$dataPt)) {
                     $md5 = Digest::MD5::md5(substr $$dataPt, $pos, $dirLen);
                 } else {
@@ -1055,26 +1056,26 @@ sub ProcessIPTC($$$)
                 # a zero digest indicates IPTC exists but we don't have Digest::MD5
                 $md5 = "\0" x 16;
             }
-            $exifTool->FoundTag('CurrentIPTCDigest', $md5);
-        } elsif ($Image::ExifTool::MWG::strict and $$exifTool{FILE_TYPE} =~ /^(JPEG|TIFF|PSD)$/) {
+            $et->FoundTag('CurrentIPTCDigest', $md5);
+        } elsif ($Image::ExifTool::MWG::strict and $$et{FILE_TYPE} =~ /^(JPEG|TIFF|PSD)$/) {
             # ignore non-standard IPTC while in strict MWG compatibility mode
-            $exifTool->Warn("Ignored non-standard IPTC at $path");
+            $et->Warn("Ignored non-standard IPTC at $path");
             return 1;
         }
         # set family 1 group name if multiple IPTC directories
-        my $dirCount = ($exifTool->{DIR_COUNT}->{IPTC} || 0) + 1;
-        $exifTool->{DIR_COUNT}->{IPTC} = $dirCount;
-        $exifTool->{SET_GROUP1} = '+' . $dirCount if $dirCount > 1;
+        my $dirCount = ($$et{DIR_COUNT}{IPTC} || 0) + 1;
+        $$et{DIR_COUNT}{IPTC} = $dirCount;
+        $$et{SET_GROUP1} = '+' . $dirCount if $dirCount > 1;
     }
     # begin by assuming default IPTC encoding
-    my $xlat = $exifTool->Options('CharsetIPTC');
-    undef $xlat if $xlat eq $exifTool->Options('Charset');
+    my $xlat = $et->Options('CharsetIPTC');
+    undef $xlat if $xlat eq $et->Options('Charset');
 
     # quick check for improperly byte-swapped IPTC
     if ($dirLen >= 4 and substr($$dataPt, $pos, 1) ne "\x1c" and
                          substr($$dataPt, $pos + 3, 1) eq "\x1c")
     {
-        $exifTool->Warn('IPTC data was improperly byte-swapped');
+        $et->Warn('IPTC data was improperly byte-swapped');
         my $newData = pack('N*', unpack('V*', substr($$dataPt, $pos, $dirLen) . "\0\0\0"));
         $dataPt = \$newData;
         $pos = 0;
@@ -1082,13 +1083,13 @@ sub ProcessIPTC($$$)
         # NOTE: MUST NOT access $dirInfo DataPt, DirStart or DataLen after this!
     }
     # extract IPTC as a block if specified
-    if ($exifTool->{REQ_TAG_LOOKUP}{iptc} or ($exifTool->{TAGS_FROM_FILE} and
-        not $exifTool->{EXCL_TAG_LOOKUP}{iptc}))
+    if ($$et{REQ_TAG_LOOKUP}{iptc} or ($$et{TAGS_FROM_FILE} and
+        not $$et{EXCL_TAG_LOOKUP}{iptc}))
     {
         if ($pos or $dirLen != length($$dataPt)) {
-            $exifTool->FoundTag('IPTC', substr($$dataPt, $pos, $dirLen));
+            $et->FoundTag('IPTC', substr($$dataPt, $pos, $dirLen));
         } else {
-            $exifTool->FoundTag('IPTC', $$dataPt);
+            $et->FoundTag('IPTC', $$dataPt);
         }
     }
     while ($pos + 5 <= $dirEnd) {
@@ -1101,7 +1102,7 @@ sub ProcessIPTC($$$)
                 my $remaining = substr($$dataPt, $pos, $dirEnd - $pos);
                 last unless $remaining =~ /[^\0]/;
             }
-            $exifTool->Warn(sprintf('Bad IPTC data tag (marker 0x%x)',$id));
+            $et->Warn(sprintf('Bad IPTC data tag (marker 0x%x)',$id));
             last;
         }
         $pos += 5;      # step to after field header
@@ -1109,7 +1110,7 @@ sub ProcessIPTC($$$)
         if ($len & 0x8000) {
             my $n = $len & 0x7fff; # get num bytes in length field
             if ($pos + $n > $dirEnd or $n > 8) {
-                $exifTool->VPrint(0, "Invalid extended IPTC entry (dataset $rec:$tag, len $len)\n");
+                $et->VPrint(0, "Invalid extended IPTC entry (dataset $rec:$tag, len $len)\n");
                 $success = 0;
                 last;
             }
@@ -1119,25 +1120,25 @@ sub ProcessIPTC($$$)
             }
         }
         if ($pos + $len > $dirEnd) {
-            $exifTool->VPrint(0, "Invalid IPTC entry (dataset $rec:$tag, len $len)\n");
+            $et->VPrint(0, "Invalid IPTC entry (dataset $rec:$tag, len $len)\n");
             $success = 0;
             last;
         }
         if (not defined $lastRec or $lastRec != $rec) {
             my $tableInfo = $tagTablePtr->{$rec};
             unless ($tableInfo) {
-                $exifTool->WarnOnce("Unrecognized IPTC record $rec (ignored)");
+                $et->WarnOnce("Unrecognized IPTC record $rec (ignored)");
                 $pos += $len;
                 next;   # ignore this entry
             }
             my $tableName = $tableInfo->{SubDirectory}->{TagTable};
             unless ($tableName) {
-                $exifTool->Warn("No table for IPTC record $rec!");
+                $et->Warn("No table for IPTC record $rec!");
                 last;   # this shouldn't happen
             }
             $recordName = $$tableInfo{Name};
             $recordPtr = Image::ExifTool::GetTagTable($tableName);
-            $exifTool->VPrint(0,$$exifTool{INDENT},"-- $recordName record --\n");
+            $et->VPrint(0,$$et{INDENT},"-- $recordName record --\n");
             $lastRec = $rec;
         }
         my $val = substr($$dataPt, $pos, $len);
@@ -1149,7 +1150,7 @@ sub ProcessIPTC($$$)
             AddTagToTable($recordPtr, $tag, { Unknown => 1 });
         }
 
-        my $tagInfo = $exifTool->GetTagInfo($recordPtr, $tag);
+        my $tagInfo = $et->GetTagInfo($recordPtr, $tag);
         my $format;
         # (could use $$recordPtr{FORMAT} if no Format below, but don't do this to
         #  be backward compatible with improperly written PhotoMechanic tags)
@@ -1171,11 +1172,11 @@ sub ProcessIPTC($$$)
                 $val =~ s/\0+$//;   # some braindead softwares add null terminators
                 if ($rec == 1) {
                     # handle CodedCharacterSet tag
-                    $xlat = HandleCodedCharset($exifTool, $val) if $tag == 90;
+                    $xlat = HandleCodedCharset($et, $val) if $tag == 90;
                 # translate characters if necessary and special characters exist
                 } elsif ($xlat and $rec < 7 and $val =~ /[\x80-\xff]/) {
                     # translate to specified character set
-                    TranslateCodedString($exifTool, \$val, \$xlat, 1);
+                    TranslateCodedString($et, \$val, \$xlat, 1);
                 }
             } elsif ($format =~ /^digits/) {
                 $val =~ s/\0+$//;
@@ -1183,7 +1184,7 @@ sub ProcessIPTC($$$)
                 warn("Invalid IPTC format: $format");
             }
         }
-        $verbose and $exifTool->VerboseInfo($tag, $tagInfo,
+        $verbose and $et->VerboseInfo($tag, $tagInfo,
             Table   => $tagTablePtr,
             Value   => $val,
             DataPt  => $dataPt,
@@ -1193,12 +1194,12 @@ sub ProcessIPTC($$$)
             Extra   => ", $recordName record",
             Format  => $format,
         );
-        $exifTool->FoundTag($tagInfo, $val) if $tagInfo;
+        $et->FoundTag($tagInfo, $val) if $tagInfo;
         $success = 1;
 
         $pos += $len;   # increment to next field
     }
-    delete $exifTool->{SET_GROUP1};
+    delete $$et{SET_GROUP1};
     return $success;
 }
 
@@ -1223,7 +1224,7 @@ image files.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -15,7 +15,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.01';
+$VERSION = '1.02';
 
 sub ProcessITC($$);
 
@@ -83,7 +83,7 @@ sub ProcessITC($$);
 # Returns: 1 on success, 0 if this wasn't a valid ITC file
 sub ProcessITC($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my $rtnVal = 0;
     my ($buff, $err, $pos, $tagTablePtr, %dirInfo);
@@ -105,7 +105,7 @@ sub ProcessITC($$)
             # (first block must be 'itch')
             last unless $tag eq 'itch';
             last unless $size >= 0x1c and $size < 0x10000;
-            $exifTool->SetFileType();
+            $et->SetFileType();
             SetByteOrder('MM');
             $rtnVal = 1;    # this is an ITC file
             $err = 1;       # format error unless we read to EOF
@@ -121,7 +121,7 @@ sub ProcessITC($$)
                 DataPos => $pos,
             );
             my $tagTablePtr = GetTagTable('Image::ExifTool::ITC::Header');
-            $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+            $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
         } elsif ($tag eq 'item') {
             # don't want to read the entire item data (includes image)
             $size > 12 or last;
@@ -141,7 +141,7 @@ sub ProcessITC($$)
             $pos = $raf->Tell();
             $raf->Read($buff, $len) == $len or last;
             unless ($len >= 0xb4 and substr($buff, 0xb0, 4) eq 'data') {
-                $exifTool->Warn('Parsing error. Please submit this ITC file for testing');
+                $et->Warn('Parsing error. Please submit this ITC file for testing');
                 last;
             }
             %dirInfo = (
@@ -150,25 +150,25 @@ sub ProcessITC($$)
                 DataPos => $pos,
             );
             $tagTablePtr = GetTagTable('Image::ExifTool::ITC::Item');
-            $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+            $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
             # extract embedded image
             $pos += $len;
             if ($size > 0) {
                 $tagTablePtr = GetTagTable('Image::ExifTool::ITC::Main');
-                my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, 'data');
-                my $image = $exifTool->ExtractBinary($pos, $size, $$tagInfo{Name});
-                $exifTool->FoundTag($tagInfo, \$image);
+                my $tagInfo = $et->GetTagInfo($tagTablePtr, 'data');
+                my $image = $et->ExtractBinary($pos, $size, $$tagInfo{Name});
+                $et->FoundTag($tagInfo, \$image);
                 # skip the rest of the block if necessary
                 $raf->Seek($pos+$size, 0) or last
             } elsif ($size < 0) {
                 last;
             }
         } else {
-            $exifTool->VPrint(0, "Unknown $tag block ($size bytes)\n");
+            $et->VPrint(0, "Unknown $tag block ($size bytes)\n");
             $raf->Seek($size-8, 1) or last;
         }
     }
-    $err and $exifTool->Warn('ITC file format error');
+    $err and $et->Warn('ITC file format error');
     return $rtnVal;
 }
 
@@ -191,7 +191,7 @@ information (including artwork images) from iTunes Cover Flow files.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -12,7 +12,7 @@ require Exporter;
 
 use vars qw($VERSION @ISA @EXPORT_OK);
 
-$VERSION = '1.02';
+$VERSION = '1.03';
 @ISA = qw(Exporter);
 @EXPORT_OK = qw(ReadCSV ReadJSON);
 
@@ -192,6 +192,11 @@ Tok: for (;;) {
             # unescape characters
             $rtnVal =~ s/\\u([0-9a-f]{4})/ToUTF8(hex $1)/ige;
             $rtnVal =~ s/\\(.)/$unescapeJSON{$1}||$1/sge;
+            # decode base64 (binary data) values
+            if ($rtnVal =~ /^base64:[A-Za-z0-9+\/]*={0,2}$/ and length($rtnVal) % 4 == 3) {
+                require Image::ExifTool::XMP;
+                $rtnVal = ${Image::ExifTool::XMP::DecodeBase64(substr($rtnVal,7))};
+            }
         } elsif ($tok eq ']' or $tok eq '}' or $tok eq ',') {
             # return undef for empty object, array, or list item
             # (empty list item actually not valid JSON)
@@ -296,7 +301,7 @@ stored as hash lookups of tag name/value for each SourceFile.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -14,7 +14,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.03';
+$VERSION = '1.04';
 
 # map for writing metadata to InDesign files (currently only write XMP)
 my %indMap = (
@@ -32,7 +32,7 @@ my $objectTrailerGUID = "\xfd\xce\xdb\x70\xf7\x86\x4b\x4f\xa4\xd3\xc7\x28\xb3\x4
 # Returns: 1 on success, 0 if this wasn't a valid InDesign file, or -1 on write error
 sub ProcessIND($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my $outfile = $$dirInfo{OutFile};
     my ($hdr, $buff, $buf2, $err, $writeLen, $foundXMP);
@@ -41,7 +41,7 @@ sub ProcessIND($$)
     return 0 unless $raf->Read($hdr, 16) == 16;
     return 0 unless $hdr eq $masterPageGUID;
     return 0 unless $raf->Read($buff, 8) == 8;
-    $exifTool->SetFileType($buff eq 'DOCUMENT' ? 'INDD' : 'IND');   # set the FileType tag
+    $et->SetFileType($buff eq 'DOCUMENT' ? 'INDD' : 'IND');   # set the FileType tag
 
     # read the master pages
     $raf->Seek(0, 0) or $err = 'Seek error', goto DONE;
@@ -73,13 +73,13 @@ sub ProcessIND($$)
     my $pages = Get32u($curPage, 280);
     $pages < 2 and $err = 'Invalid page count', goto DONE;
     my $pos = $pages * 4096;
-    if ($pos > 0x7fffffff and not $exifTool->Options('LargeFileSupport')) {
+    if ($pos > 0x7fffffff and not $et->Options('LargeFileSupport')) {
         $err = 'InDesign files larger than 2 GB not supported (LargeFileSupport not set)';
         goto DONE;
     }
     if ($outfile) {
         # make XMP the preferred group for writing
-        $exifTool->InitWriteDirs(\%indMap, 'XMP');
+        $et->InitWriteDirs(\%indMap, 'XMP');
 
         Write($outfile, $buff, $buf2) or $err = 1, goto DONE;
         my $result = Image::ExifTool::CopyBlock($raf, $outfile, $pos - 8192);
@@ -92,8 +92,8 @@ sub ProcessIND($$)
         $raf->Seek($pos, 0) or $err = 'Seek error', goto DONE;
     }
     # scan through the contiguous objects for XMP
-    my $verbose = $exifTool->Options('Verbose');
-    my $out = $exifTool->Options('TextOut');
+    my $verbose = $et->Options('Verbose');
+    my $out = $et->Options('TextOut');
     for (;;) {
         $raf->Read($hdr, 32) or last;
         unless (length($hdr) == 32 and $hdr =~ /^\Q$objectHeaderGUID/) {
@@ -126,11 +126,11 @@ sub ProcessIND($$)
                 if ($len > 300 * 1024 * 1024) {
                     my $msg = sprintf('Insanely large XMP (%.0f MB)', $len / (1024 * 1024));
                     if ($outfile) {
-                        $exifTool->Error($msg, 2) and $err = 1, last;
-                    } elsif ($exifTool->Options('IgnoreMinorErrors')) {
-                        $exifTool->Warn($msg);
+                        $et->Error($msg, 2) and $err = 1, last;
+                    } elsif ($et->Options('IgnoreMinorErrors')) {
+                        $et->Warn($msg);
                     } else {
-                        $exifTool->Warn("$msg. Ignored.", 1);
+                        $et->Warn("$msg. Ignored.", 1);
                         $err = 1;
                         last;
                     }
@@ -156,7 +156,7 @@ sub ProcessIND($$)
                     # make sure that XMP is writable
                     my $classID = Get32u(\$hdr, 20);
                     $classID & 0x40000000 or $err = 'XMP stream is not writable', last;
-                    my $xmp = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr);
+                    my $xmp = $et->WriteDirectory(\%dirInfo, $tagTablePtr);
                     if ($xmp and length $xmp) {
                         # write new xmp with leading length word
                         $buff = pack($streamInt32u, length $xmp) . $xmp;
@@ -164,13 +164,13 @@ sub ProcessIND($$)
                         Set32u(length($buff), \$hdr, 24);
                         Set32u(0xffffffff, \$hdr, 28);
                     } else {
-                        $$exifTool{CHANGED} = 0;    # didn't change anything
-                        $exifTool->Warn("Can't delete XMP as a block from InDesign file") if defined $xmp;
+                        $$et{CHANGED} = 0;    # didn't change anything
+                        $et->Warn("Can't delete XMP as a block from InDesign file") if defined $xmp;
                         # put length word back at start of stream
                         $buff = $lenWord . $buff;
                     }
                 } else {
-                    $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+                    $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
                 }
                 $len = 0;   # we got the full stream (nothing left to read)
             } else {
@@ -213,14 +213,14 @@ sub ProcessIND($$)
     }
 DONE:
     if (not $err) {
-        $exifTool->Warn('No XMP stream to edit') if $outfile and not $foundXMP;
+        $et->Warn('No XMP stream to edit') if $outfile and not $foundXMP;
         return 1;       # success!
     } elsif (not $outfile) {
         # issue warning on read error
-        $exifTool->Warn($err) unless $err eq '1';
+        $et->Warn($err) unless $err eq '1';
     } elsif ($err ne '1') {
         # set error and return success code
-        $exifTool->Error($err);
+        $et->Error($err);
     } else {
         return -1;      # write error
     }
@@ -256,7 +256,7 @@ the ability to handle large files like this is system dependent.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -11,10 +11,10 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.17';
+$VERSION = '1.22';
 
-sub ProcessScalado($$$);
 sub ProcessOcad($$$);
+sub ProcessJPEG_HDR($$$);
 
 # (this main JPEG table is for documentation purposes only)
 %Image::ExifTool::JPEG::Main = (
@@ -94,7 +94,7 @@ sub ProcessOcad($$$);
     APP4 => [{
         Name => 'Scalado',
         Condition => '$$valPt =~ /^SCALADO\0/',
-        SubDirectory => { TagTable => 'Image::ExifTool::JPEG::Scalado' },
+        SubDirectory => { TagTable => 'Image::ExifTool::Scalado::Main' },
       }, {
         Name => 'FPXR', # (non-standard location written by some HP models)
         Condition => '$$valPt =~ /^FPXR\0/',
@@ -124,21 +124,35 @@ sub ProcessOcad($$$);
         Condition => '$$valPt =~ /^TDHD\x01\0\0\0/',
         SubDirectory => { TagTable => 'Image::ExifTool::HP::TDHD' },
     }],
-    APP7 => {
+    APP7 => [{
+        Name => 'Pentax',
+        Condition => '$$valPt =~ /^PENTAX \0/',
+        SubDirectory => { TagTable => 'Image::ExifTool::Pentax::Main' },
+      }, {
         Name => 'Qualcomm',
         Condition => '$$valPt =~ /^\x1aQualcomm Camera Attributes/',
         SubDirectory => { TagTable => 'Image::ExifTool::Qualcomm::Main' },
-    },
+    }],
     APP8 => {
         Name => 'SPIFF',
         Condition => '$$valPt =~ /^SPIFF\0/',
         SubDirectory => { TagTable => 'Image::ExifTool::JPEG::SPIFF' },
     },
+    APP9 => {
+        Name => 'MediaJukebox',
+        Condition => '$$valPt =~ /^Media Jukebox\0/',
+        SubDirectory => { TagTable => 'Image::ExifTool::JPEG::MediaJukebox' },
+    },
     APP10 => {
         Name => 'Comment',
         Condition => '$$valPt =~ /^UNICODE\0/',
         Notes => 'PhotoStudio Unicode comment',
     },
+    APP11 => {
+        Name => 'JPEG-HDR',
+        Condition => '$$valPt =~ /^HDR_RI /',
+        SubDirectory => { TagTable => 'Image::ExifTool::JPEG::HDR' },
+    },
     APP12 => [{
         Name => 'PictureInfo',
         Condition => '$$valPt =~ /(\[picture info\]|Type=)/',
@@ -181,7 +195,7 @@ sub ProcessOcad($$$);
     },
     DQT => {
         Name => 'DefineQuantizationTable',
-        Notes => 'used to calculate the Extra:JPEGDigest tag value',
+        Notes => 'used to calculate the Extra JPEGDigest tag value',
     },
     Trailer => [{
         Name => 'AFCP',
@@ -318,6 +332,44 @@ sub ProcessOcad($$$);
     },
 );
 
+# Media Jukebox APP9 segment (ref PH)
+%Image::ExifTool::JPEG::MediaJukebox = (
+    GROUPS => { 0 => 'XML', 1 => 'MediaJukebox', 2 => 'Image' },
+    VARS => { NO_ID => 1 },
+    NOTES => 'Tags found in the XML metadata of the "Media Jukebox" APP9 segment.',
+    Date => {
+        Groups => { 2 => 'Time' },
+        # convert from days since Dec 30, 1899 to seconds since Jan 1, 1970
+        ValueConv => 'ConvertUnixTime(($val - (70 * 365 + 17 + 2)) * 24 * 3600)',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    Album        => { },
+    Caption      => { },
+    Keywords     => { },
+    Name         => { },
+    People       => { },
+    Places       => { },
+    Tool_Name    => { },
+    Tool_Version => { },
+);
+
+# JPEG-HDR APP11 information (ref PH, guessed from http://anyhere.com/gward/papers/cic05.pdf)
+%Image::ExifTool::JPEG::HDR = (
+    GROUPS => { 0 => 'APP11', 1 => 'JPEG-HDR', 2 => 'Image' },
+    PROCESS_PROC => \&ProcessJPEG_HDR,
+    TAG_PREFIX => '', # (no prefix for unknown tags)
+    NOTES => 'Information extracted from APP11 of a JPEG-HDR image.',
+    ver => 'JPEG-HDRVersion',
+    # (need names for the next 3 tags)
+    ln0 => { Description => 'Ln0' },
+    ln1 => { Description => 'Ln1' },
+    s2n => { Description => 'S2n' },
+    alp => { Name => 'Alpha' }, # (Alpha/Beta are saturation parameters)
+    bet => { Name => 'Beta' },
+    cor => { Name => 'CorrectionMethod' },
+    RatioImage => { Binary => 1, Notes => 'the embedded JPEG-compressed ratio image' },
+);
+
 # AdobeCM APP13 (no references)
 %Image::ExifTool::JPEG::AdobeCM = (
     PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
@@ -393,6 +445,7 @@ sub ProcessOcad($$$);
 %Image::ExifTool::JPEG::Ocad = (
     PROCESS_PROC => \&ProcessOcad,
     GROUPS => { 0 => 'APP0', 1 => 'Ocad', 2 => 'Image' },
+    TAG_PREFIX => 'Ocad',
     FIRST_ENTRY => 0,
     NOTES => q{
         Tags extracted from the JPEG APP0 "Ocad" segment (found in Photobucket
@@ -464,93 +517,43 @@ sub ProcessOcad($$$);
     },
 );
 
-# information written by Scalado software (PhotoFusion maybe?)
-%Image::ExifTool::JPEG::Scalado = (
-    GROUPS => { 0 => 'APP4', 1 => 'Scalado', 2 => 'Image' },
-    PROCESS_PROC => \&ProcessScalado,
-    TAG_PREFIX => 'Scalado',
-    FORMAT => 'int32s',
-    # I presume this was written by 
-    NOTES => q{
-        Tags extracted from the JPEG APP4 "SCALADO" segment (presumably written by
-        Scalado mobile software, L<http://www.scalado.com/>).
-    },
-    SPMO => {
-        Name => 'DataLength',
-        Unkown => 1,
-    },
-    WDTH => {
-        Name => 'PreviewImageWidth',
-        ValueConv => '$val ? abs($val) : undef',
-    },
-    HGHT => {
-        Name => 'PreviewImageHeight',
-        ValueConv => '$val ? abs($val) : undef',
-    },
-    QUAL => {
-        Name => 'PreviewQuality',
-        ValueConv => '$val ? abs($val) : undef',
-    },
-    # tags not yet decoded with observed values:
-    # CHKH: 0, -9010
-    # CHKL: -2664, -12852
-    # CLEN: -1024
-    # CSPC: -2232593
-    # DATA: (+ve data length)
-    # HDEC: 0
-    # MAIN: 0
-    # SCI0: (+ve data length)
-    # SCX1: (+ve data length)
-    # WDEC: 0
-);
-
 #------------------------------------------------------------------------------
 # Extract information from the JPEG APP0 Ocad segment
 # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
 # Returns: 1 on success
 sub ProcessOcad($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
-    $exifTool->VerboseDir('APP0 Ocad', undef, length $$dataPt);
+    $et->VerboseDir('APP0 Ocad', undef, length $$dataPt);
     for (;;) {
         last unless $$dataPt =~ /\$(\w+):([^\0\$]+)/g;
         my ($tag, $val) = ($1, $2);
         $val =~ s/^\s+//; $val =~ s/\s+$//;     # remove leading/trailing spaces
-        unless ($$tagTablePtr{$tag}) {
-            AddTagToTable($tagTablePtr, $tag, { Name => "Ocad_$tag" });
-        }
-        $exifTool->HandleTag($tagTablePtr, $tag, $val);
+        AddTagToTable($tagTablePtr, $tag) unless $$tagTablePtr{$tag};
+        $et->HandleTag($tagTablePtr, $tag, $val);
     }
     return 1;
 }
 
 #------------------------------------------------------------------------------
-# Extract information from the JPEG APP4 SCALADO segment
+# Extract information from the JPEG APP0 Ocad segment
 # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
 # Returns: 1 on success
-sub ProcessScalado($$$)
+sub ProcessJPEG_HDR($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
-    my $pos = 0;
-    my $end = length $$dataPt;
-    SetByteOrder('MM');
-    $exifTool->VerboseDir('APP4 SCALADO', undef, $end);
-    for (;;) {
-        last if $pos + 12 > $end;
-        my $tag = substr($$dataPt, $pos, 4);
-        my $unk = Get32u($dataPt, $pos + 4); # (what is this?)
-        $exifTool->HandleTag($tagTablePtr, $tag, undef,
-            DataPt  => $dataPt,
-            Start   => $pos + 8,
-            Size    => 4,
-            Extra   => ", unk $unk",
-        );
-        # shorten directory size by length of SPMO
-        $end -= Get32u($dataPt, $pos + 8) if $tag eq 'SPMO';
-        $pos += 12;
+    $$dataPt =~ /~\0/g or $et->Warn('Unrecognized JPEG-HDR format'), return 0;
+    my $pos = pos $$dataPt;
+    my $meta = substr($$dataPt, 7, $pos-9);
+    $et->VerboseDir('APP11 JPEG-HDR', undef, length $$dataPt);
+    while ($meta =~ /(\w+)=([^,\s]*)/g) {
+        my ($tag, $val) = ($1, $2);
+        AddTagToTable($tagTablePtr, $tag) unless $$tagTablePtr{$tag};
+        $et->HandleTag($tagTablePtr, $tag, $val);
     }
+    $et->HandleTag($tagTablePtr, 'RatioImage', substr($$dataPt, $pos));
     return 1;
 }
 
@@ -574,7 +577,7 @@ segments are included in the Image::ExifTool module itself.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -13,7 +13,7 @@ package Image::ExifTool::JPEGDigest;
 use strict;
 use vars qw($VERSION);
 
-$VERSION = '1.02';
+$VERSION = '1.04';
 
 # the print conversion for the JPEGDigest tag
 my %PrintConv = ( #JD
@@ -2446,10 +2446,10 @@ my %PrintConv = ( #JD
 # Inputs: 0) ExifTool object ref, 1) DQT segments array ref, 2) subsampling string
 sub Calculate($$$)
 {
-    my ($exifTool, $dqtList, $subSampling) = @_;
+    my ($et, $dqtList, $subSampling) = @_;
 
-    unless (eval 'require Digest::MD5') {
-        $exifTool->Warn('Digest::MD5 must be installed to calculate JPEGDigest');
+    unless (eval { require Digest::MD5 }) {
+        $et->Warn('Digest::MD5 must be installed to calculate JPEGDigest');
         return;
     }
     # create a string of DQT tables (in indexed order), separated by zero bytes
@@ -2469,7 +2469,7 @@ sub Calculate($$$)
     # add print conversion for JPEGDigest dynamically so it doesn't
     # bulk up the documentation and slow down loading unnecessarily
     $Image::ExifTool::Extra{JPEGDigest}{PrintConv} = \%PrintConv;
-    $exifTool->FoundTag('JPEGDigest', $md5);
+    $et->FoundTag('JPEGDigest', $md5);
 }
 
 
@@ -2492,7 +2492,7 @@ some image identification from JPEG data alone.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -13,7 +13,7 @@ use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Exif;
 
-$VERSION = '1.02';
+$VERSION = '1.03';
 
 sub ProcessJVCText($$$);
 
@@ -63,28 +63,28 @@ sub ProcessJVCText($$$);
 # Returns: 1 on success, otherwise returns 0 and sets a Warning
 sub ProcessJVCText($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirStart = $$dirInfo{DirStart} || 0;
     my $dataLen = $$dirInfo{DataLen};
     my $dirLen = $$dirInfo{DirLen} || $dataLen - $dirStart;
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
 
     my $data = substr($$dataPt, $dirStart, $dirLen);
     # validate text maker notes
     unless ($data =~ /^VER:/) {
-        $exifTool->Warn('Bad JVC text maker notes');
+        $et->Warn('Bad JVC text maker notes');
         return 0;
     }
     while ($data =~ m/([A-Z]+):(.{3,4})/sg) {
         my ($tag, $val) = ($1, $2);
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
-        $exifTool->VerboseInfo($tag, $tagInfo,
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
+        $et->VerboseInfo($tag, $tagInfo,
             Table  => $tagTablePtr,
             Value  => $val,
         ) if $verbose;
         unless ($tagInfo) {
-            next unless $exifTool->{OPTIONS}->{Unknown};
+            next unless $$et{OPTIONS}{Unknown};
             $tagInfo = {
                 Name => "JVC_Text_$tag",
                 Unknown => 1,
@@ -93,7 +93,7 @@ sub ProcessJVCText($$$)
             # add tag information to table
             AddTagToTable($tagTablePtr, $tag, $tagInfo);
         }
-        $exifTool->FoundTag($tagInfo, $val);
+        $et->FoundTag($tagInfo, $val);
     }
     return 1;
 }
@@ -117,7 +117,7 @@ notes.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -16,7 +16,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.22';
+$VERSION = '1.23';
 
 sub ProcessJpeg2000Box($$$);
 
@@ -201,7 +201,7 @@ my %j2cMarker = (
    'xml '=> {
         Name => 'XML',
         Writable => 'undef',
-        Flags => [ 'Binary', 'Protected' ],
+        Flags => [ 'Binary', 'Protected', 'BlockExtract' ],
         List => 1,
         Notes => q{
             by default, the XML data in this tag is parsed using the ExifTool XMP module
@@ -501,26 +501,26 @@ my %j2cMarker = (
 # Returns: 1 on success
 sub CreateNewBoxes($$)
 {
-    my ($exifTool, $outfile) = @_;
-    my $addTags = $$exifTool{AddJp2Tags};
-    my $addDirs = $$exifTool{AddJp2Dirs};
-    delete $$exifTool{AddJp2Tags};
-    delete $$exifTool{AddJp2Dirs};
+    my ($et, $outfile) = @_;
+    my $addTags = $$et{AddJp2Tags};
+    my $addDirs = $$et{AddJp2Dirs};
+    delete $$et{AddJp2Tags};
+    delete $$et{AddJp2Dirs};
     my ($tag, $dirName);
     # add JPEG2000 tags
     foreach $tag (sort keys %$addTags) {
         my $tagInfo = $$addTags{$tag};
-        my $nvHash = $exifTool->GetNewValueHash($tagInfo);
+        my $nvHash = $et->GetNewValueHash($tagInfo);
         # (native JPEG2000 information is always preferred, so don't check IsCreating)
-        next unless $$tagInfo{List} or $exifTool->IsOverwriting($nvHash) > 0;
+        next unless $$tagInfo{List} or $et->IsOverwriting($nvHash) > 0;
         next if $$nvHash{EditOnly};
-        my @vals = $exifTool->GetNewValues($nvHash);
+        my @vals = $et->GetNewValues($nvHash);
         my $val;
         foreach $val (@vals) {
             my $boxhdr = pack('N', length($val) + 8) . $$tagInfo{TagID};
             Write($outfile, $boxhdr, $val) or return 0;
-            ++$$exifTool{CHANGED};
-            $exifTool->VerboseValue("+ Jpeg2000:$$tagInfo{Name}", $val);
+            ++$$et{CHANGED};
+            $et->VerboseValue("+ Jpeg2000:$$tagInfo{Name}", $val);
         }
     }
     # add UUID boxes
@@ -538,7 +538,7 @@ sub CreateNewBoxes($$)
             # remove "UUID-" from start of directory name to allow appropriate
             # directories to be written as a block
             $dirInfo{DirName} =~ s/^UUID-//;
-            my $newdir = $exifTool->WriteDirectory(\%dirInfo, $tagTable, $$subdir{WriteProc});
+            my $newdir = $et->WriteDirectory(\%dirInfo, $tagTable, $$subdir{WriteProc});
             if (defined $newdir and length $newdir) {
                 my $boxhdr = pack('N', length($newdir) + 24) . 'uuid' . $uuid{$dirName};
                 Write($outfile, $boxhdr, $newdir) or return 0;
@@ -556,7 +556,7 @@ sub CreateNewBoxes($$)
 #          (or JP2 box or undef when writing from buffer)
 sub ProcessJpeg2000Box($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dataLen = $$dirInfo{DataLen};
     my $dataPos = $$dirInfo{DataPos};
@@ -576,8 +576,8 @@ sub ProcessJpeg2000Box($$$)
         }
     } else {
         # (must not set verbose flag when writing!)
-        $verbose = $exifTool->{OPTIONS}->{Verbose};
-        $exifTool->VerboseDir($$dirInfo{DirName}) if $verbose;
+        $verbose = $$et{OPTIONS}{Verbose};
+        $et->VerboseDir($$dirInfo{DirName}) if $verbose;
     }
     # loop through all contained boxes
     my ($pos, $boxLen);
@@ -589,7 +589,7 @@ sub ProcessJpeg2000Box($$$)
             unless ($n == 8) {
                 $n and $err = '', last;
                 if ($outfile) {
-                    CreateNewBoxes($exifTool, $outfile) or $err = 1;
+                    CreateNewBoxes($et, $outfile) or $err = 1;
                 }
                 last;
             }
@@ -613,7 +613,7 @@ sub ProcessJpeg2000Box($$$)
         } elsif ($boxLen == 0) {
             if ($raf) {
                 if ($outfile) {
-                    CreateNewBoxes($exifTool, $outfile) or $err = 1;
+                    CreateNewBoxes($et, $outfile) or $err = 1;
                     # copy over the rest of the file
                     Write($outfile, $$dataPt) or $err = 1;
                     while ($raf->Read($buff, 65536)) {
@@ -621,7 +621,7 @@ sub ProcessJpeg2000Box($$$)
                     }
                 } elsif ($verbose) {
                     my $msg = sprintf("offset 0x%.4x to end of file", $dataPos + $base + $pos);
-                    $exifTool->VPrint(0, "$$exifTool{INDENT}- Tag '$boxID' ($msg)\n");
+                    $et->VPrint(0, "$$et{INDENT}- Tag '$boxID' ($msg)\n");
                 }
                 last;   # (ignore the rest of the file when reading)
             }
@@ -630,7 +630,7 @@ sub ProcessJpeg2000Box($$$)
             $boxLen -= 8;
         }
         $boxLen < 0 and $err = 'Invalid JPEG 2000 box length', last;
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $boxID);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $boxID);
         unless (defined $tagInfo or $verbose) {
             # no need to process this box
             if ($raf) {
@@ -661,34 +661,34 @@ sub ProcessJpeg2000Box($$$)
         if (defined $tagInfo and not $tagInfo) {
             # GetTagInfo() required the value for a Condition
             my $tmpVal = substr($$dataPt, $valuePtr, $boxLen < 128 ? $boxLen : 128);
-            $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $boxID, \$tmpVal);
+            $tagInfo = $et->GetTagInfo($tagTablePtr, $boxID, \$tmpVal);
         }
         # delete all UUID boxes and any writable box if deleting all information
         if ($outfile and $tagInfo) {
-            if ($boxID eq 'uuid' and $exifTool->{DEL_GROUP}->{'*'}) {
-                $exifTool->VPrint(0, "  Deleting $$tagInfo{Name}\n");
-                ++$exifTool->{CHANGED};
+            if ($boxID eq 'uuid' and $$et{DEL_GROUP}{'*'}) {
+                $et->VPrint(0, "  Deleting $$tagInfo{Name}\n");
+                ++$$et{CHANGED};
                 next;
             } elsif ($$tagInfo{Writable}) {
                 my $isOverwriting;
-                if ($exifTool->{DEL_GROUP}->{Jpeg2000}) {
+                if ($$et{DEL_GROUP}{Jpeg2000}) {
                     $isOverwriting = 1;
                 } else {
-                    my $nvHash = $exifTool->GetNewValueHash($tagInfo);
-                    $isOverwriting = $exifTool->IsOverwriting($nvHash);
+                    my $nvHash = $et->GetNewValueHash($tagInfo);
+                    $isOverwriting = $et->IsOverwriting($nvHash);
                 }
                 if ($isOverwriting) {
                     my $val = substr($$dataPt, $valuePtr, $boxLen);
-                    $exifTool->VerboseValue("- Jpeg2000:$$tagInfo{Name}", $val);
-                    ++$exifTool->{CHANGED};
+                    $et->VerboseValue("- Jpeg2000:$$tagInfo{Name}", $val);
+                    ++$$et{CHANGED};
                     next;
                 } elsif (not $$tagInfo{List}) {
-                    delete $$exifTool{AddJp2Tags}{$boxID};
+                    delete $$et{AddJp2Tags}{$boxID};
                 }
             }
         }
         if ($verbose) {
-            $exifTool->VerboseInfo($boxID, $tagInfo,
+            $et->VerboseInfo($boxID, $tagInfo,
                 Table  => $tagTablePtr,
                 DataPt => $dataPt,
                 Size   => $boxLen,
@@ -721,11 +721,11 @@ sub ProcessJpeg2000Box($$$)
             my $subTable = GetTagTable($$subdir{TagTable}) || $tagTablePtr;
             if ($outfile) {
                 # remove this directory from our create list
-                delete $exifTool->{AddJp2Dirs}->{$$tagInfo{Name}};
+                delete $$et{AddJp2Dirs}{$$tagInfo{Name}};
                 my $newdir;
                 # only edit writable UUID boxes
                 if ($uuid{$$tagInfo{Name}}) {
-                    $newdir = $exifTool->WriteDirectory(\%subdirInfo, $subTable, $$subdir{WriteProc});
+                    $newdir = $et->WriteDirectory(\%subdirInfo, $subTable, $$subdir{WriteProc});
                     next if defined $newdir and not length $newdir; # next if deleting the box
                 }
                 # use old box data if not changed
@@ -735,17 +735,9 @@ sub ProcessJpeg2000Box($$$)
                 $boxhdr .= substr($$dataPt, $valuePtr, $prefixLen) if $prefixLen;
                 Write($outfile, $boxhdr, $newdir) or $err = 1;
             } else {
-                # extract writable directories if specified
-                if ($$tagInfo{Writable}) {
-                    my $lcTag = lc $$tagInfo{Name};
-                    if ($$exifTool{REQ_TAG_LOOKUP}{$lcTag} or
-                        ($exifTool->{TAGS_FROM_FILE} and not $exifTool->{EXCL_TAG_LOOKUP}{$lcTag}))
-                    {
-                        $exifTool->FoundTag($tagInfo, substr($$dataPt, $valuePtr, $boxLen));
-                        next;
-                    }
-                }
-                unless ($exifTool->ProcessDirectory(\%subdirInfo, $subTable, $$subdir{ProcessProc})) {
+                # extract as a block if specified
+                $subdirInfo{BlockInfo} = $tagInfo if $$tagInfo{BlockExtract};
+                unless ($et->ProcessDirectory(\%subdirInfo, $subTable, $$subdir{ProcessProc})) {
                     if ($subTable eq $tagTablePtr) {
                         $err = 'JPEG 2000 format error';
                     } else {
@@ -760,9 +752,9 @@ sub ProcessJpeg2000Box($$$)
             my $rational;
             my $val = ReadValue($dataPt, $valuePtr, $$tagInfo{Format}, undef, $boxLen, \$rational);
             if (defined $val) {
-                my $key = $exifTool->FoundTag($tagInfo, $val);
+                my $key = $et->FoundTag($tagInfo, $val);
                 # save Rational value
-                $$exifTool{RATIONAL}{$key} = $rational if defined $rational and defined $key;
+                $$et{RATIONAL}{$key} = $rational if defined $rational and defined $key;
             }
         } elsif ($outfile) {
             my $boxhdr = pack('N', $boxLen + 8) . $boxID;
@@ -772,10 +764,10 @@ sub ProcessJpeg2000Box($$$)
     if (defined $err) {
         $err or $err = 'Truncated JPEG 2000 box';
         if ($outfile) {
-            $exifTool->Error($err) unless $err eq '1';
+            $et->Error($err) unless $err eq '1';
             return $raf ? -1 : undef;
         }
-        $exifTool->Warn($err);
+        $et->Warn($err);
     }
     return $outBuff if $outfile and not $raf;
     return 1;
@@ -788,7 +780,7 @@ sub ProcessJpeg2000Box($$$)
 sub ProcessJP2($$)
 {
     local $_;
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my $outfile = $$dirInfo{OutFile};
     my $hdr;
@@ -800,24 +792,24 @@ sub ProcessJP2($$)
     {
         return 0 unless $hdr =~ /^\xff\x4f\xff\x51\0/;  # check for JP2 codestream format
         if ($outfile) {
-            $exifTool->Error('Writing of J2C files is not yet supported');
+            $et->Error('Writing of J2C files is not yet supported');
             return 0
         }
         # add J2C markers if not done already
         unless ($Image::ExifTool::jpegMarker{0x4f}) {
             $Image::ExifTool::jpegMarker{$_} = $j2cMarker{$_} foreach keys %j2cMarker;
         }
-        $exifTool->SetFileType('J2C');
+        $et->SetFileType('J2C');
         $raf->Seek(0,0);
-        return $exifTool->ProcessJPEG($dirInfo);    # decode with JPEG processor
+        return $et->ProcessJPEG($dirInfo);    # decode with JPEG processor
     }
     if ($outfile) {
         Write($outfile, $hdr) or return -1;
-        $exifTool->InitWriteDirs(\%jp2Map);
+        $et->InitWriteDirs(\%jp2Map);
         # save list of directories to create
-        my %addDirs = %{$$exifTool{ADD_DIRS}};
-        $$exifTool{AddJp2Dirs} = \%addDirs;
-        $$exifTool{AddJp2Tags} = $exifTool->GetNewTagInfoHash(\%Image::ExifTool::Jpeg2000::Main);
+        my %addDirs = %{$$et{ADD_DIRS}};
+        $$et{AddJp2Dirs} = \%addDirs;
+        $$et{AddJp2Tags} = $et->GetNewTagInfoHash(\%Image::ExifTool::Jpeg2000::Main);
     } else {
         my ($buff, $fileType);
         # recognize JPX and JPM as unique types of JP2
@@ -826,7 +818,7 @@ sub ProcessJP2($$)
             $fileType = 'JPM' if $1 eq 'jpm ';
         }
         $raf->Seek(-length($buff), 1) if defined $buff;
-        $exifTool->SetFileType($fileType);
+        $et->SetFileType($fileType);
     }
     SetByteOrder('MM'); # JPEG 2000 files are big-endian
     my %dirInfo = (
@@ -835,7 +827,7 @@ sub ProcessJP2($$)
         OutFile => $$dirInfo{OutFile},
     );
     my $tagTablePtr = GetTagTable('Image::ExifTool::Jpeg2000::Main');
-    return $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+    return $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
 }
 
 1;  # end
@@ -857,7 +849,7 @@ files.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -23,7 +23,7 @@ use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Exif;
 
-$VERSION = '1.32';
+$VERSION = '1.33';
 
 sub ProcessKodakIFD($$$);
 sub ProcessKodakText($$$);
@@ -1879,7 +1879,7 @@ sub CalculateRGBLevels(@)
 # Returns: 1 on success
 sub ProcessKodakText($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirStart = $$dirInfo{DirStart} || 0;
     my $dirLen = $$dirInfo{DirLen} || length($$dataPt) - $dirStart;
@@ -1887,12 +1887,12 @@ sub ProcessKodakText($$$)
     $data =~ s/\0.*//s;     # truncate at null if it exists
     my @lines = split /[\n\r]+/, $data;
     my ($line, $success, @other, $tagInfo);
-    $exifTool->VerboseDir('Kodak Text');
+    $et->VerboseDir('Kodak Text');
     foreach $line (@lines) {
         if ($line =~ /(.*?):\s*(.*)/) {
             my ($tag, $val) = ($1, $2);
             if ($$tagTablePtr{$tag}) {
-                $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+                $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
             } else {
                 my $tagName = $tag;
                 $tagName =~ s/([A-Z])\s+([A-Za-z])/${1}_\U$2/g;
@@ -1903,7 +1903,7 @@ sub ProcessKodakText($$$)
                 $tagInfo = { Name => $tagName };
                 AddTagToTable($tagTablePtr, $tag, $tagInfo);
             }
-            $exifTool->HandleTag($tagTablePtr, $tag, $val, TagInfo => $tagInfo);
+            $et->HandleTag($tagTablePtr, $tag, $val, TagInfo => $tagInfo);
             $success = 1;
         } else {
             # strip off leading/trailing white space and ignore blank lines
@@ -1912,11 +1912,11 @@ sub ProcessKodakText($$$)
     }
     if ($success) {
         if (@other) {
-            $tagInfo = $exifTool->GetTagInfo($tagTablePtr, '_other_info');
-            $exifTool->FoundTag($tagInfo, \@other);
+            $tagInfo = $et->GetTagInfo($tagTablePtr, '_other_info');
+            $et->FoundTag($tagInfo, \@other);
         }
     } else {
-        $exifTool->Warn("Can't parse Kodak TextualInfo data", 1);
+        $et->Warn("Can't parse Kodak TextualInfo data", 1);
     }
     return $success;
 }
@@ -1927,21 +1927,21 @@ sub ProcessKodakText($$$)
 # Returns: 1 on success, otherwise returns 0 and sets a Warning
 sub ProcessKodakIFD($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dirStart = $$dirInfo{DirStart} || 0;
     return 1 if $dirStart <= 0 or $dirStart + 2 > $$dirInfo{DataLen};
     my $byteOrder = substr(${$$dirInfo{DataPt}}, $dirStart, 2);
     unless (Image::ExifTool::SetByteOrder($byteOrder)) {
-        $exifTool->Warn("Invalid Kodak $$dirInfo{Name} directory");
+        $et->Warn("Invalid Kodak $$dirInfo{Name} directory");
         return 1;
     }
     $$dirInfo{DirStart} += 2;   # skip byte order mark
     $$dirInfo{DirLen} -= 2;
-    if ($exifTool->{HTML_DUMP}) {
+    if ($$et{HTML_DUMP}) {
         my $base = $$dirInfo{Base} + $$dirInfo{DataPos};
-        $exifTool->HDump($dirStart+$base, 2, "Byte Order Mark");
+        $et->HDump($dirStart+$base, 2, "Byte Order Mark");
     }
-    return Image::ExifTool::Exif::ProcessExif($exifTool, $dirInfo, $tagTablePtr);
+    return Image::ExifTool::Exif::ProcessExif($et, $dirInfo, $tagTablePtr);
 }
 
 #------------------------------------------------------------------------------
@@ -1950,14 +1950,14 @@ sub ProcessKodakIFD($$$)
 # Returns: Exif data block (may be empty if no Exif data) or undef on error
 sub WriteKodakIFD($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dirStart = $$dirInfo{DirStart} || 0;
     return '' if $dirStart <= 0 or $dirStart + 2 > $$dirInfo{DataLen};
     my $byteOrder = substr(${$$dirInfo{DataPt}}, $dirStart, 2);
     return '' unless Image::ExifTool::SetByteOrder($byteOrder);
     $$dirInfo{DirStart} += 2;   # skip byte order mark
     $$dirInfo{DirLen} -= 2;
-    my $buff = Image::ExifTool::Exif::WriteExif($exifTool, $dirInfo, $tagTablePtr);
+    my $buff = Image::ExifTool::Exif::WriteExif($et, $dirInfo, $tagTablePtr);
     return $buff unless defined $buff and length $buff;
     # apply one-time fixup for length of byte order mark
     if ($$dirInfo{Fixup}) {
@@ -1987,7 +1987,7 @@ interpret Kodak maker notes EXIF meta information.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -14,7 +14,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.02';
+$VERSION = '1.03';
 
 sub ProcessRAW($$);
 
@@ -111,7 +111,7 @@ sub ReverseString($) { pack('C*',reverse unpack('C*',shift)) }
 # Returns: 1 if this was a valid Kyocera RAW image
 sub ProcessRAW($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my $size = 156; # size of header
     my $buff;
@@ -119,7 +119,7 @@ sub ProcessRAW($$)
     $raf->Read($buff, $size) == $size or return 0;
     # validate Make string ('KYOCERA' reversed)
     substr($buff, 0x19, 7) eq 'ARECOYK' or return 0;
-    $exifTool->SetFileType();
+    $et->SetFileType();
     SetByteOrder('MM');
     my %dirInfo = (
         DataPt => \$buff,
@@ -129,7 +129,7 @@ sub ProcessRAW($$)
         DirLen => $size,
     );
     my $tagTablePtr = GetTagTable('Image::ExifTool::KyoceraRaw::Main');
-    $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+    $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
     return 1;
 }
 
@@ -152,7 +152,7 @@ meta information from Kyocera Contax N Digital RAW images.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -15,7 +15,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.05';
+$VERSION = '1.06';
 
 sub ProcessItemID($$$);
 sub ProcessLinkInfo($$$);
@@ -460,7 +460,7 @@ sub GetString($$;$)
 # Returns: 1 on success
 sub ProcessItemID($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dataLen = length $$dataPt;
     my $pos = 0;
@@ -468,7 +468,7 @@ sub ProcessItemID($$$)
         DataPt  => $dataPt,
         DataPos => $$dirInfo{DataPos},
     );
-    $exifTool->VerboseDir('ItemID', undef, $dataLen);
+    $et->VerboseDir('ItemID', undef, $dataLen);
     for (;;) {
         last if $pos + 4 >= $dataLen;
         my $size = Get16u($dataPt, $pos);
@@ -478,7 +478,7 @@ sub ProcessItemID($$$)
             Name => sprintf('Item%.4x', $tag),
             SubDirectory => { TagTable => 'Image::ExifTool::LNK::UnknownData' },
         }) unless $$tagTablePtr{$tag};
-        $exifTool->HandleTag($tagTablePtr, $tag, undef, %opts, Start => $pos, Size => $size);
+        $et->HandleTag($tagTablePtr, $tag, undef, %opts, Start => $pos, Size => $size);
         $pos += $size;
     }
 }
@@ -489,7 +489,7 @@ sub ProcessItemID($$$)
 # Returns: 1 on success
 sub ProcessLinkInfo($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dataLen = length $$dataPt;
     return 0 if $dataLen < 0x20;
@@ -501,13 +501,13 @@ sub ProcessLinkInfo($$$)
         Size    => 4, # (typical value size)
     );
     my ($off, $unicode, $pos, $val, $size);
-    $exifTool->VerboseDir('LinkInfo', undef, $dataLen);
+    $et->VerboseDir('LinkInfo', undef, $dataLen);
     if ($lif & 0x01) {
         # read Volume ID
         $off = Get32u($dataPt, 0x0c);
         if ($off + 0x20 <= $dataLen) {
             # my $len = Get32u($dataPt, $off);
-            $exifTool->HandleTag($tagTablePtr, 'DriveType', undef, %opts, Start=>$off+4);
+            $et->HandleTag($tagTablePtr, 'DriveType', undef, %opts, Start=>$off+4);
             $pos = Get32u($dataPt, $off + 0x0c);
             if ($pos == 0x14) {
                 # use VolumeLabelOffsetUnicode instead
@@ -518,8 +518,8 @@ sub ProcessLinkInfo($$$)
             $val = GetString($dataPt, $pos, $unicode);
             if (defined $val) {
                 $size = length $val;
-                $val = $exifTool->Decode($val, 'UCS2') if $unicode;
-                $exifTool->HandleTag($tagTablePtr, 'VolumeLabel', $val, %opts, Start=>$pos, Size=>$size);
+                $val = $et->Decode($val, 'UCS2') if $unicode;
+                $et->HandleTag($tagTablePtr, 'VolumeLabel', $val, %opts, Start=>$pos, Size=>$size);
             }
         }
         # read local base path
@@ -533,8 +533,8 @@ sub ProcessLinkInfo($$$)
         $val = GetString($dataPt, $pos, $unicode);
         if (defined $val) {
             $size = length $val;
-            $val = $exifTool->Decode($val, 'UCS2') if $unicode;
-            $exifTool->HandleTag($tagTablePtr, 'LocalBasePath', $val, %opts, Start=>$pos, Size=>$size);
+            $val = $et->Decode($val, 'UCS2') if $unicode;
+            $et->HandleTag($tagTablePtr, 'LocalBasePath', $val, %opts, Start=>$pos, Size=>$size);
         }
     }
     if ($lif & 0x02) {
@@ -552,8 +552,8 @@ sub ProcessLinkInfo($$$)
             $val = GetString($dataPt, $pos, $unicode);
             if (defined $val) {
                 $size = length $val;
-                $val = $exifTool->Decode($val, 'UCS2') if $unicode;
-                $exifTool->HandleTag($tagTablePtr, 'NetName', $val, %opts, Start=>$pos, Size=>$size);
+                $val = $et->Decode($val, 'UCS2') if $unicode;
+                $et->HandleTag($tagTablePtr, 'NetName', $val, %opts, Start=>$pos, Size=>$size);
             }
             my $flg = Get32u($dataPt, $off + 0x04);
             if ($flg & 0x01) {
@@ -567,13 +567,13 @@ sub ProcessLinkInfo($$$)
                 $val = GetString($dataPt, $pos, $unicode);
                 if (defined $val) {
                     $size = length $val;
-                    $val = $exifTool->Decode($val, 'UCS2') if $unicode;
-                    $exifTool->HandleTag($tagTablePtr, 'DeviceName', $val, %opts, Start=>$pos, Size=>$size);
+                    $val = $et->Decode($val, 'UCS2') if $unicode;
+                    $et->HandleTag($tagTablePtr, 'DeviceName', $val, %opts, Start=>$pos, Size=>$size);
                 }
             }
             if ($flg & 0x02) {
                 $val = Get32u($dataPt, $off + 0x10);
-                $exifTool->HandleTag($tagTablePtr, 'NetProviderType', $val, %opts, Start=>$off + 0x10);
+                $et->HandleTag($tagTablePtr, 'NetProviderType', $val, %opts, Start=>$off + 0x10);
             }
         }
     }
@@ -586,7 +586,7 @@ sub ProcessLinkInfo($$$)
 # Returns: 1 on success, 0 if this wasn't a valid LNK file
 sub ProcessLNK($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my ($buff, $buf2, $len, $i);
 
@@ -599,7 +599,7 @@ sub ProcessLNK($$)
         $raf->Read($buf2, $len - 0x4c) == $len - 0x4c or return 0;
         $buff .= $buf2;
     }
-    $exifTool->SetFileType('Windows Shortcut');
+    $et->SetFileType('Windows Shortcut');
     SetByteOrder('II');
 
     my $tagTablePtr = GetTagTable('Image::ExifTool::LNK::Main');
@@ -609,7 +609,7 @@ sub ProcessLNK($$)
         DataLen => length $buff,
         DirLen => length $buff,
     );
-    $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+    $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
 
     my $flags = Get32u(\$buff, 0x14);
 
@@ -618,7 +618,7 @@ sub ProcessLNK($$)
         $raf->Read($buff, 2) or return 1;
         $len = unpack('v', $buff);
         $raf->Read($buff, $len) == $len or return 1;
-        $exifTool->HandleTag($tagTablePtr, 0x10000, undef,
+        $et->HandleTag($tagTablePtr, 0x10000, undef,
             DataPt  => \$buff,
             DataPos => $raf->Tell() - $len,
             Size    => $len,
@@ -632,7 +632,7 @@ sub ProcessLNK($$)
         return 1 if $len < 4;
         $raf->Read($buf2, $len - 4) == $len - 4 or return 1;
         $buff .= $buf2;
-        $exifTool->HandleTag($tagTablePtr, 0x20000, undef,
+        $et->HandleTag($tagTablePtr, 0x20000, undef,
             DataPt  => \$buff,
             DataPos => $raf->Tell() - $len,
             Size    => $len,
@@ -650,8 +650,8 @@ sub ProcessLNK($$)
         $len *= 2 if $flags & 0x80;  # characters are 2 bytes if Unicode flag is set   
         $raf->Read($buff, $len) or return 1;
         my $val;
-        $val = $exifTool->Decode($buff, 'UCS2') if $flags & 0x80;
-        $exifTool->HandleTag($tagTablePtr, 0x30000 | $mask, $val,
+        $val = $et->Decode($buff, 'UCS2') if $flags & 0x80;
+        $et->HandleTag($tagTablePtr, 0x30000 | $mask, $val,
             DataPt  => \$buff,
             DataPos => $raf->Tell() - $len,
             Size    => $len,
@@ -671,7 +671,7 @@ sub ProcessLNK($$)
         unless (ref $tagInfo eq 'HASH' and $$tagInfo{SubDirectory}) {
             $tagInfo = $$tagTablePtr{0xa0000000};
         }
-        $exifTool->HandleTag($tagTablePtr, $tag, undef,
+        $et->HandleTag($tagTablePtr, $tag, undef,
             DataPt  => \$buff,
             DataPos => $raf->Tell() - $len - 4,
             TagInfo => $tagInfo,
@@ -699,7 +699,7 @@ information MS Shell Link (Windows shortcut) files.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -1568,7 +1568,7 @@ and values.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -7339,7 +7339,7 @@ and values.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -544,7 +544,7 @@ and values.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -559,7 +559,7 @@ and values.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -3492,6 +3492,7 @@ $VERSION = '1.12';
    'SubSecTimeOriginal' => 'Subsegundos DateTimeOriginal',
    'SubTileBlockSize' => 'Tamaño Bloque Submosaico',
    'SubTitle' => 'Subtitulo',
+   'Subtitle' => 'Subtitulo',
    'SubTitleDescription' => 'Descripción Subtitulo',
    'SubfileType' => 'Nuevo Tipo Subarchivo',
    'SubimageColor' => {
@@ -3998,7 +3999,7 @@ and values.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -2838,7 +2838,7 @@ and values.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -11,7 +11,7 @@ package Image::ExifTool::Lang::fr;
 use strict;
 use vars qw($VERSION);
 
-$VERSION = '1.21';
+$VERSION = '1.22';
 
 %Image::ExifTool::Lang::fr::Translate = (
    'AEAperture' => 'Ouverture AE',
@@ -354,7 +354,7 @@ $VERSION = '1.21';
    'AIServoTrackingSensitivity' => {
       Description => 'Sensibili. de suivi AI Servo',
       PrintConv => {
-        'Fast' => 'Schnell',
+        'Fast' => 'Rapide',
         'Medium Fast' => 'Moyenne rapide',
         'Medium Slow' => 'Moyenne lent',
         'Moderately fast' => 'Moyennement rapide',
@@ -420,6 +420,24 @@ $VERSION = '1.21';
         'On' => 'Activé',
       },
     },
+   'AdvancedSceneMode' => {
+      PrintConv => {
+        'Color Select' => 'Désaturation partielle',
+        'Cross Process' => 'Dévelop. croisé',
+        'Dynamic Monochrome' => 'Monochrome dynamique',
+        'Expressive' => 'Expressif',
+        'High Dynamic' => 'Dynamique haute',
+        'High Key' => 'Tons clairs',
+        'Impressive Art' => 'Impressionisme',
+        'Low Key' => 'Clair-obscur',
+        'Miniature' => 'Effet miniature',
+        'Retro' => 'Rétro',
+        'Sepia' => 'Sépia',
+        'Soft' => 'Mise au point douce',
+        'Star' => 'Filtre étoile',
+        'Toy Effect' => 'Effet jouet',
+      },
+    },
    'Advisory' => 'Adversité',
    'AnalogBalance' => 'Balance analogique',
    'Annotations' => 'Annotations Photoshop',
@@ -4702,7 +4720,7 @@ and values.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -7121,6 +7121,7 @@ $VERSION = '1.10';
       },
     },
    'SubsystemVersion' => 'Versione sottosistema',
+   'SubTitle' => 'Sottotitolo',
    'Subtitle' => 'Sottotitolo',
    'Suffix' => 'Suffisso',
    'SuggestedPalette' => 'Tavolozza suggerita',
@@ -7899,7 +7900,7 @@ and values.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -5798,7 +5798,7 @@ and values.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -2315,7 +2315,7 @@ and values.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -11,7 +11,7 @@ package Image::ExifTool::Lang::nl;
 use strict;
 use vars qw($VERSION);
 
-$VERSION = '1.09';
+$VERSION = '1.10';
 
 %Image::ExifTool::Lang::nl::Translate = (
    'AEBAutoCancel' => {
@@ -1000,7 +1000,7 @@ $VERSION = '1.09';
       PrintConv => {
         'Landscape' => 'Landschap',
         'Manual' => 'Handmatig',
-        'Night' => 'Nachtszene',
+        'Night' => 'Nachtscene',
         'Portrait' => 'Portret',
       },
     },
@@ -1522,7 +1522,7 @@ $VERSION = '1.09';
    'GPSDestDistanceRef' => {
       Description => 'Referentie voor de afstand tot de bestemming',
       PrintConv => {
-        'Miles' => 'Meilen',
+        'Miles' => 'Mijlen',
         'Nautical Miles' => 'Knopen',
       },
     },
@@ -1530,7 +1530,7 @@ $VERSION = '1.09';
    'GPSDestLatitudeRef' => {
       Description => 'Referentie voor de breedte van het doel',
       PrintConv => {
-        'North' => 'Nordelijke breedte',
+        'North' => 'Noordelijke breedte',
         'South' => 'Zuidelijke breedte',
       },
     },
@@ -1539,7 +1539,7 @@ $VERSION = '1.09';
       Description => 'Referentie voor de lengte van het doel',
       PrintConv => {
         'East' => 'Oostelijke lengte',
-        'West' => 'Westlijke Lengte',
+        'West' => 'Westlijke lengte',
       },
     },
    'GPSDifferential' => {
@@ -1594,7 +1594,7 @@ $VERSION = '1.09';
       PrintConv => {
         'km/h' => 'Kilometer per uur',
         'knots' => 'Knopen',
-        'mph' => 'Meilen per uur',
+        'mph' => 'Mijl per uur',
       },
     },
    'GPSStatus' => {
@@ -2611,7 +2611,7 @@ $VERSION = '1.09';
       Description => 'Scene opname type',
       PrintConv => {
         'Landscape' => 'Landschap',
-        'Night' => 'Nachtszene',
+        'Night' => 'Nachtscene',
         'Portrait' => 'Portret',
         'Standard' => 'Standaard',
       },
@@ -2651,7 +2651,7 @@ $VERSION = '1.09';
     },
    'SceneSelect' => {
       PrintConv => {
-        'Night' => 'Nachtszene',
+        'Night' => 'Nachtscene',
         'Off' => 'Uit',
       },
     },
@@ -2893,7 +2893,7 @@ $VERSION = '1.09';
         'Passive Matrix Display' => 'Passieve matrixdisplay',
         'Photo CD' => 'Photo-CD',
         'Photo Image Setter' => 'Fotofilmbelichter',
-        'Photographic Paper Printer' => 'Photopapier printer',
+        'Photographic Paper Printer' => 'Fotopapier printer',
         'Projection Television' => 'Projectietelevisie',
         'Reflective Scanner' => 'Reflectieve Scanner',
         'Thermal Wax Printer' => 'Thermische was printer',
@@ -3202,15 +3202,15 @@ and values.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
 
 =head1 ACKNOWLEDGEMENTS
 
-Thanks to Jens Duttke, Peter Moonen and Herman Beld for providing this
-translation.
+Thanks to Jens Duttke, Peter Moonen, Herman Beld and Peter van der Laan for
+providing this translation.
 
 =head1 SEE ALSO
 
@@ -11,7 +11,7 @@ package Image::ExifTool::Lang::pl;
 use strict;
 use vars qw($VERSION);
 
-$VERSION = '1.07';
+$VERSION = '1.09';
 
 %Image::ExifTool::Lang::pl::Translate = (
    'AEAperture' => 'Priorytet AE',
@@ -453,6 +453,8 @@ $VERSION = '1.07';
    'FrameSize' => 'Wielkość kadru',
    'FreeByteCounts' => 'Liczba wolnych bajtów',
    'FreeOffsets' => 'Wolne offsety',
+   'GDALMetadata' => 'Metadane GDAL',
+   'GDALNoData' => 'Brak danych GDAL',
    'GPSAltitude' => 'Wysokość',
    'GPSAltitudeRef' => {
       Description => 'Wysokość odniesienia',
@@ -479,6 +481,7 @@ $VERSION = '1.07';
         'No Correction' => 'Pomiar bez korekcji różnicowej',
       },
     },
+   'GPSHPositioningError' => 'Błąd poziomy wyznaczenia pozycji',
    'GPSImgDirection' => 'Kierunek obrazu',
    'GPSImgDirectionRef' => 'Wartość odniesienia dla kierunku obrazu',
    'GPSInfo' => 'Wskaźnik GPS Info IFD',
@@ -578,6 +581,12 @@ $VERSION = '1.07';
         'Portrait' => 'Portret',
       },
     },
+   'ImageType' => {
+      Description => 'Rodzaj obrazu',
+      PrintConv => {
+        'Page' => 'Strona',
+      },
+    },
    'ImageUniqueID' => 'Unikalny kod ID zdjęcia',
    'ImageWidth' => 'Szerokość obrazu',
    'Index' => 'Indeks',
@@ -604,6 +613,9 @@ $VERSION = '1.07';
    'Lens' => 'Obiektyw',
    'LensID' => 'ID obiektywu',
    'LensInfo' => 'Informacja o obiektywie',
+   'LensMake' => 'Producent obiektywu',
+   'LensModel' => 'Model obiektywu',
+   'LensSerialNumber' => 'Numer seryjny obiektywu',
    'LightReading' => 'Pomiar światła',
    'LightSource' => {
       Description => 'Źródło światła',
@@ -752,6 +764,20 @@ $VERSION = '1.07';
         'None' => 'Brak',
       },
     },
+   'PixelFormat' => {
+      Description => 'Format zapisu koloru',
+      PrintConv => {
+        '128-bit PRGBA Float' => '128-bitów PRGBA (zapis zmienno przecinkowy)',
+        '128-bit RGB Float' => '128-bitów RGB (zapis zmienno przecinkowy)',
+        '128-bit RGBA Float' => '128-bitów RGBA (zapis zmienno przecinkowy)',
+        '16-bit Gray' => '16-bitów Szarość',
+        '32-bit Gray Float' => '32-bity Szarość (zapis zmienno przecinkowy)',
+        '48-bit RGB Fixed Point' => '48-bitów RGB (zapis stałopozycyjny)',
+        '8-bit Gray' => '8-bitów Szarość',
+        '96-bit RGB Fixed Point' => '96-bitów RGB (zapis stałopozycyjny)',
+        'Black & White' => 'Czarno Biały',
+      },
+    },
    'PlanarConfiguration' => {
       Description => 'Układ danych obrazu',
       PrintConv => {
@@ -1014,6 +1040,7 @@ $VERSION = '1.07';
    'Track' => 'Ścieżka',
    'TransferFunction' => 'Funkcja transferu',
    'Transformation' => {
+      Description => 'Przekształcenie',
       PrintConv => {
         'Horizontal (normal)' => '0° (góra/lewo)',
         'Mirror horizontal' => '0° (góra/prawo)',
@@ -1027,6 +1054,7 @@ $VERSION = '1.07';
     },
    'TransmissionReference' => 'Odnośnik transmisji',
    'TvExposureTimeSetting' => 'Ustawienia czasu ekspozycji TV',
+   'Uncompressed' => 'Nieskompresowany',
    'UniqueCameraModel' => 'Unikatowy model aparatu',
    'Unknown' => 'Nieznany',
    'Urgency' => 'Priorytet',
@@ -1122,7 +1150,7 @@ and values.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -751,7 +751,7 @@ and values.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -621,7 +621,7 @@ and values.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -526,7 +526,7 @@ and values.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -1312,7 +1312,7 @@ and values.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -785,7 +785,7 @@ and values.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -13,7 +13,7 @@ use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Exif;
 
-$VERSION = '1.04';
+$VERSION = '1.05';
 
 sub ProcessLeaf($$$);
 
@@ -394,17 +394,17 @@ sub ProcessLeaf($$$);
 # Returns: 1 on success, otherwise returns 0 and sets a Warning
 sub ProcessLeaf($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirStart = $$dirInfo{DirStart} || 0;
     my $dirLen = $$dirInfo{DirLen} || $$dirInfo{DataLen} - $dirStart;
     my $dirEnd = $dirStart + $dirLen;
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     my $pos = $dirStart;
     my $hdrLen = 52;    # header length for PKTS information
     my $success;
 
-    $verbose and $exifTool->VerboseDir('Leaf');
+    $verbose and $et->VerboseDir('Leaf');
     for (;;) {
         last if $pos + $hdrLen > $dirEnd;
         my $header = substr($$dataPt, $pos, $hdrLen);
@@ -413,13 +413,13 @@ sub ProcessLeaf($$$)
         my $size = Get32u(\$header, 48);
         $pos += $hdrLen;
         if ($pos + $size > $dirEnd) {
-            $exifTool->Warn('Truncated Leaf data');
+            $et->Warn('Truncated Leaf data');
             last;
         }
         my $tag = substr($header, 8, 40);
         $tag =~ s/\0.*//s;
         next unless $tag;
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
         # generate tag info for unknown tags
         my $val;
         if ($tagInfo and $$tagInfo{Format}) {
@@ -437,7 +437,7 @@ sub ProcessLeaf($$$)
                     SubDirectory => { TagTable => 'Image::ExifTool::Leaf::Unknown' },
                 };
             } elsif ($tagTablePtr ne \%Image::ExifTool::Leaf::Main or
-                     $exifTool->Options('Unknown'))
+                     $et->Options('Unknown'))
             {
                 $tagInfo = {
                     Name => $name,
@@ -450,7 +450,7 @@ sub ProcessLeaf($$$)
             $tagInfo and AddTagToTable($tagTablePtr, $tag, $tagInfo);
         }
         if ($verbose) {
-            $exifTool->VerboseInfo($tag, $tagInfo,
+            $et->VerboseInfo($tag, $tagInfo,
                 Table   => $tagTablePtr,
                 Value   => $val,
                 DataPt  => $dataPt,
@@ -469,16 +469,16 @@ sub ProcessLeaf($$$)
                     DirName => 'Leaf PKTS',
                 );
                 my $subTable = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
-                $exifTool->ProcessDirectory(\%subdirInfo, $subTable);
+                $et->ProcessDirectory(\%subdirInfo, $subTable);
             } else {
                 $val =~ tr/\n/ /;   # translate newlines to spaces
                 $val =~ s/\0+$//;   # remove null terminators
-                $exifTool->FoundTag($tagInfo, $val);
+                $et->FoundTag($tagInfo, $val);
             }
         }
         $pos += $size;
     }
-    $success or $exifTool->Warn('Bad format Leaf data');
+    $success or $et->Warn('Bad format Leaf data');
     return $success;
 }
 
@@ -502,7 +502,7 @@ Capture.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -31,7 +31,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.09';
+$VERSION = '1.11';
 
 # program map table "stream_type" lookup (ref 6/1)
 my %streamType = (
@@ -233,11 +233,11 @@ my %noSyntax = (
 # Reference: http://www.atsc.org/standards/a_52b.pdf
 sub ParseAC3Audio($$)
 {
-    my ($exifTool, $dataPt) = @_;
+    my ($et, $dataPt) = @_;
     if ($$dataPt =~ /\x0b\x77..(.)/sg) {
         my $sampleRate = ord($1) >> 6;
         my $tagTablePtr = GetTagTable('Image::ExifTool::M2TS::AC3');
-        $exifTool->HandleTag($tagTablePtr, AudioSampleRate => $sampleRate);
+        $et->HandleTag($tagTablePtr, AudioSampleRate => $sampleRate);
     }
 }
 
@@ -249,14 +249,14 @@ sub ParseAC3Audio($$)
 #       is somewhat easier to extract it from the descriptor instead
 sub ParseAC3Descriptor($$)
 {
-    my ($exifTool, $dataPt) = @_;
+    my ($et, $dataPt) = @_;
     return if length $$dataPt < 3;
     my @v = unpack('C3', $$dataPt);
     my $tagTablePtr = GetTagTable('Image::ExifTool::M2TS::AC3');
-    # $exifTool->HandleTag($tagTablePtr, 'AudioSampleRate', $v[0] >> 5);
-    $exifTool->HandleTag($tagTablePtr, 'AudioBitrate', $v[1] >> 2);
-    $exifTool->HandleTag($tagTablePtr, 'SurroundMode', $v[1] & 0x03);
-    $exifTool->HandleTag($tagTablePtr, 'AudioChannels', ($v[2] >> 1) & 0x0f);
+    # $et->HandleTag($tagTablePtr, 'AudioSampleRate', $v[0] >> 5);
+    $et->HandleTag($tagTablePtr, 'AudioBitrate', $v[1] >> 2);
+    $et->HandleTag($tagTablePtr, 'SurroundMode', $v[1] & 0x03);
+    $et->HandleTag($tagTablePtr, 'AudioChannels', ($v[2] >> 1) & 0x0f);
     # don't (yet) decode any more (language codes, etc)
 }
 
@@ -268,12 +268,12 @@ sub ParseAC3Descriptor($$)
 #          -1=can't parse yet because we don't know the type
 sub ParsePID($$$$$)
 {
-    my ($exifTool, $pid, $type, $pidName, $dataPt) = @_;
+    my ($et, $pid, $type, $pidName, $dataPt) = @_;
     # can't parse until we know the type (Program Map Table may be later in the stream)
     return -1 unless defined $type;   
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     if ($verbose > 1) {
-        my $out = $exifTool->Options('TextOut');
+        my $out = $et->Options('TextOut');
         printf $out "Parsing stream 0x%.4x (%s)\n", $pid, $pidName;
         my %parms = ( Out => $out );
         $parms{MaxLen} = 96 if $verbose < 4;
@@ -283,20 +283,20 @@ sub ParsePID($$$$$)
     if ($type == 0x01 or $type == 0x02) {
         # MPEG-1/MPEG-2 Video
         require Image::ExifTool::MPEG;
-        Image::ExifTool::MPEG::ParseMPEGAudioVideo($exifTool, $dataPt);
+        Image::ExifTool::MPEG::ParseMPEGAudioVideo($et, $dataPt);
     } elsif ($type == 0x03 or $type == 0x04) {
         # MPEG-1/MPEG-2 Audio
         require Image::ExifTool::MPEG;
-        Image::ExifTool::MPEG::ParseMPEGAudio($exifTool, $dataPt);
+        Image::ExifTool::MPEG::ParseMPEGAudio($et, $dataPt);
     } elsif ($type == 0x1b) {
         # H.264 Video
         require Image::ExifTool::H264;
-        $more = Image::ExifTool::H264::ParseH264Video($exifTool, $dataPt);
+        $more = Image::ExifTool::H264::ParseH264Video($et, $dataPt);
         # force parsing additional H264 frames with ExtractEmbedded option
-        $more = 1 if $exifTool->Options('ExtractEmbedded');
+        $more = 1 if $et->Options('ExtractEmbedded');
     } elsif ($type == 0x81 or $type == 0x87 or $type == 0x91) {
         # AC-3 audio
-        ParseAC3Audio($exifTool, $dataPt);
+        ParseAC3Audio($et, $dataPt);
     }
     return $more;
 }
@@ -307,13 +307,13 @@ sub ParsePID($$$$$)
 # Returns: 1 on success, 0 if this wasn't a valid M2TS file
 sub ProcessM2TS($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my ($buff, $pLen, $upkPrefix, $j, $fileType, $eof);
     my (%pmt, %pidType, %data, %sectLen);
     my ($startTime, $endTime, $backScan, $maxBack);
-    my $verbose = $exifTool->Options('Verbose');
-    my $out = $exifTool->Options('TextOut');
+    my $verbose = $et->Options('Verbose');
+    my $out = $et->Options('TextOut');
 
     # read first packet
     return 0 unless $raf->Read($buff, 8) == 8;
@@ -327,7 +327,7 @@ sub ProcessM2TS($$)
         $pLen = 192; # 188-byte transport packet + leading 4-byte timecode (ref 4)
         $upkPrefix = 'x4N';
     }
-    $exifTool->SetFileType($fileType);
+    $et->SetFileType($fileType);
     SetByteOrder('MM');
     $raf->Seek(0,0);        # rewind to start
     my $tagTablePtr = GetTagTable('Image::ExifTool::M2TS::Main');
@@ -359,7 +359,7 @@ sub ProcessM2TS($$)
                 last if $backScan < $maxBack;
             } else {
                 undef $endTime;
-                last if $exifTool->Options('FastScan');
+                last if $et->Options('FastScan');
                 $verbose and print "[Starting backscan for last PCR]\n";
                 # calculate position of last complete packet
                 my $fwdPos = $raf->Tell();
@@ -385,7 +385,7 @@ sub ProcessM2TS($$)
         my $prefix = unpack("x${pos}N", $buff); # (use unpack instead of Get32u for speed)
         # validate sync byte
         unless (($prefix & 0xff000000) == 0x47000000) {
-            $exifTool->Warn('Synchronization error') unless defined $backScan;
+            $et->Warn('Synchronization error') unless defined $backScan;
             last;
         }
       # my $transport_error_indicator    = $prefix & 0x00800000;
@@ -412,7 +412,7 @@ sub ProcessM2TS($$)
         # handle adaptation field
         if ($adaptation_field_exists) {
             my $len = Get8u(\$buff, $pos++);
-            $pos + $len > $pEnd and $exifTool->Warn('Invalid adaptation field length'), last;
+            $pos + $len > $pEnd and $et->Warn('Invalid adaptation field length'), last;
             # read PCR value for calculation of Duration
             if ($len > 6) {
                 my $flags = Get8u(\$buff, $pos);
@@ -443,7 +443,7 @@ sub ProcessM2TS($$)
                 # skip to start of section
                 my $pointer_field = Get8u(\$buff, $pos);
                 $pos += 1 + $pointer_field;
-                $pos >= $pEnd and $exifTool->Warn('Bad pointer field'), last;
+                $pos >= $pEnd and $et->Warn('Bad pointer field'), last;
                 $buf2 = substr($buff, $pEnd-$pLen, $pLen);
                 $pos -= $pEnd - $pLen;
             } else {
@@ -461,7 +461,7 @@ sub ProcessM2TS($$)
                 delete $sectLen{$pid};
             }
             my $slen = length($buf2);   # section length
-            $pos + 8 > $slen and $exifTool->Warn("Truncated payload"), last;
+            $pos + 8 > $slen and $et->Warn("Truncated payload"), last;
             # validate table ID
             my $table_id = Get8u(\$buf2, $pos);
             my $name = ($tableID{$table_id} || sprintf('Unknown (0x%x)',$table_id)) . ' Table';
@@ -474,9 +474,9 @@ sub ProcessM2TS($$)
             }
             # validate section syntax indicator for parsed tables (PAT, PMT)
             my $section_syntax_indicator = Get8u(\$buf2, $pos + 1) & 0xc0;
-            $section_syntax_indicator == 0x80 or $exifTool->Warn("Bad $name"), last;
+            $section_syntax_indicator == 0x80 or $et->Warn("Bad $name"), last;
             my $section_length = Get16u(\$buf2, $pos + 1) & 0x0fff;
-            $section_length > 1021 and $exifTool->Warn("Invalid $name length"), last;
+            $section_length > 1021 and $et->Warn("Invalid $name length"), last;
             if ($slen < $section_length + 3) { # (3 bytes for table_id + section_length)
                 # must wait until we have the full section
                 $data{$pid} = substr($buf2, $pos);
@@ -501,26 +501,22 @@ sub ProcessM2TS($$)
                     my $program_number = Get16u(\$buf2, $pos);
                     my $program_map_PID = Get16u(\$buf2, $pos + 2) & 0x1fff;
                     $pmt{$program_map_PID} = $program_number; # save our PMT PID's
-                    if (not $pidName{$program_map_PID} or $verbose > 1) {
-                        my $str = "Program $program_number Map";
-                        $pidName{$program_map_PID} = $str;
-                        $needPID{$program_map_PID} = 1 unless $didPID{$program_map_PID};
-                        $verbose and printf $out "  PID(0x%.4x) --> $str\n", $program_map_PID;
-                    }
+                    my $str = "Program $program_number Map";
+                    $pidName{$program_map_PID} = $str;
+                    $needPID{$program_map_PID} = 1 unless $didPID{$program_map_PID};
+                    $verbose and printf $out "  PID(0x%.4x) --> $str\n", $program_map_PID;
                     $pos += 4;
                 }
             } else {
                 # decode PMT (Program Map Table)
-                $pos + 4 > $slen and $exifTool->Warn('Truncated PMT'), last;
+                $pos + 4 > $slen and $et->Warn('Truncated PMT'), last;
                 my $pcr_pid = Get16u(\$buf2, $pos) & 0x1fff;
                 my $program_info_length = Get16u(\$buf2, $pos + 2) & 0x0fff;
-                if (not $pidName{$pcr_pid} or $verbose > 1) {
-                    my $str = "Program $program_number Clock Reference";
-                    $pidName{$pcr_pid} = $str;
-                    $verbose and printf $out "  PID(0x%.4x) --> $str\n", $pcr_pid;
-                }
+                my $str = "Program $program_number Clock Reference";
+                $pidName{$pcr_pid} = $str;
+                $verbose and printf $out "  PID(0x%.4x) --> $str\n", $pcr_pid;
                 $pos += 4;
-                $pos + $program_info_length > $slen and $exifTool->Warn('Truncated program info'), last;
+                $pos + $program_info_length > $slen and $et->Warn('Truncated program info'), last;
                 # dump program information descriptors if verbose
                 if ($verbose > 1) { for ($j=0; $j<$program_info_length-2; ) {
                     my $descriptor_tag = Get8u(\$buf2, $pos + $j);
@@ -537,23 +533,23 @@ sub ProcessM2TS($$)
                     my $stream_type = Get8u(\$buf2, $pos);
                     my $elementary_pid = Get16u(\$buf2, $pos + 1) & 0x1fff;
                     my $es_info_length = Get16u(\$buf2, $pos + 3) & 0x0fff;
-                    if (not $pidName{$elementary_pid} or $verbose > 1) {
-                        my $str = $streamType{$stream_type};
-                        $str or $str = ($stream_type < 0x7f ? 'Reserved' : 'Private');
-                        $str = sprintf('%s (0x%.2x)', $str, $stream_type);
-                        $str = "Program $program_number $str";
-                        # save PID type and name string
-                        $pidName{$elementary_pid} = $str;
-                        $pidType{$elementary_pid} = $stream_type;
-                        $verbose and printf $out "  PID(0x%.4x) --> $str\n", $elementary_pid;
-                        if ($str =~ /(Audio|Video)/) {
-                            $exifTool->HandleTag($tagTablePtr, $1 . 'StreamType', $stream_type);
-                            # we want to parse all Audio and Video streams
-                            $needPID{$elementary_pid} = 1 unless $didPID{$elementary_pid};
+                    my $str = $streamType{$stream_type};
+                    $str or $str = ($stream_type < 0x7f ? 'Reserved' : 'Private');
+                    $str = sprintf('%s (0x%.2x)', $str, $stream_type);
+                    $str = "Program $program_number $str";
+                    $verbose and printf $out "  PID(0x%.4x) --> $str\n", $elementary_pid;
+                    if ($str =~ /(Audio|Video)/) {
+                        unless ($pidName{$elementary_pid}) {
+                            $et->HandleTag($tagTablePtr, $1 . 'StreamType', $stream_type)
                         }
+                        # we want to parse all Audio and Video streams
+                        $needPID{$elementary_pid} = 1 unless $didPID{$elementary_pid};
                     }
+                    # save PID type and name string
+                    $pidName{$elementary_pid} = $str;
+                    $pidType{$elementary_pid} = $stream_type;
                     $pos += 5;
-                    $pos + $es_info_length > $slen and $exifTool->Warn('Trunacted ES info'), $pos = $end, last;
+                    $pos + $es_info_length > $slen and $et->Warn('Trunacted ES info'), $pos = $end, last;
                     # parse elementary stream descriptors
                     for ($j=0; $j<$es_info_length-2; ) {
                         my $descriptor_tag = Get8u(\$buf2, $pos + $j);
@@ -570,7 +566,7 @@ sub ProcessM2TS($$)
                         # parse type-specific descriptor information (once)
                         unless ($didPID{$pid}) {
                             if ($descriptor_tag == 0x81) {  # AC-3
-                                ParseAC3Descriptor($exifTool, \$desc);
+                                ParseAC3Descriptor($et, \$desc);
                             }
                         }
                     }
@@ -585,7 +581,7 @@ sub ProcessM2TS($$)
             if ($payload_unit_start_indicator) {
                 if (defined $data{$pid}) {
                     # we must have a whole section, so parse now
-                    my $more = ParsePID($exifTool, $pid, $pidType{$pid}, $pidName{$pid}, \$data{$pid});
+                    my $more = ParsePID($et, $pid, $pidType{$pid}, $pidName{$pid}, \$data{$pid});
                     # start fresh even if we couldn't process this PID yet
                     delete $data{$pid};
                     unless ($more) {
@@ -611,7 +607,7 @@ sub ProcessM2TS($$)
                     next if $pos + 3 > $pEnd;
                     # validate PES syntax
                     my $syntax = Get8u(\$buff, $pos) & 0xc0;
-                    $syntax == 0x80 or $exifTool->Warn('Bad PES syntax'), next;
+                    $syntax == 0x80 or $et->Warn('Bad PES syntax'), next;
                     # skip PES header
                     my $pes_header_data_length = Get8u(\$buff, $pos + 2);
                     $pos += 3 + $pes_header_data_length;
@@ -627,7 +623,7 @@ sub ProcessM2TS($$)
             # unknown or H.264 streams where we save 1 kB
             my $saveLen = (not $pidType{$pid} or $pidType{$pid} == 0x1b) ? 1024 : 256;
             if (length($data{$pid}) >= $saveLen) {
-                my $more = ParsePID($exifTool, $pid, $pidType{$pid}, $pidName{$pid}, \$data{$pid});
+                my $more = ParsePID($et, $pid, $pidType{$pid}, $pidName{$pid}, \$data{$pid});
                 next if $more < 0;  # wait for program map table (hopefully not too long)
                 delete $data{$pid};
                 $more and $needPID{$pid} = -1, next; # parse more of these
@@ -647,7 +643,7 @@ sub ProcessM2TS($$)
     # calculate Duration if available
     if (defined $startTime and defined $endTime and $startTime != $endTime) {
         $endTime += 0x80000000 * 1200 if $startTime > $endTime; # handle 33-bit wrap
-        $exifTool->HandleTag($tagTablePtr, 'Duration', $endTime - $startTime);
+        $et->HandleTag($tagTablePtr, 'Duration', $endTime - $startTime);
     }
 
     if ($verbose) {
@@ -667,7 +663,7 @@ sub ProcessM2TS($$)
     # parse any remaining partial PID streams
     my $pid;
     foreach $pid (sort keys %data) {
-        ParsePID($exifTool, $pid, $pidType{$pid}, $pidName{$pid}, \$data{$pid});
+        ParsePID($et, $pid, $pidType{$pid}, $pidName{$pid}, \$data{$pid});
         delete $data{$pid};
     }
     return 1;
@@ -693,7 +689,7 @@ video.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -14,7 +14,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Exif;
 use Image::ExifTool::GPS;
 
-$VERSION = '1.39';
+$VERSION = '1.42';
 
 sub ProcessMIE($$);
 sub ProcessMIEGroup($$$);
@@ -805,7 +805,7 @@ sub GetLangInfo($$)
 sub HasZlib($$)
 {
     unless (defined $hasZlib) {
-        $hasZlib = eval 'require Compress::Zlib';
+        $hasZlib = eval { require Compress::Zlib };
         unless ($hasZlib) {
             $hasZlib = 0;
             $_[0]->Warn("Install Compress::Zlib to $_[1] compressed information");
@@ -873,7 +873,7 @@ sub ReadMIEValue($$$$$;$)
 # Returns: error string or undef (and possibly changes value) on success
 sub CheckMIE($$$)
 {
-    my ($exifTool, $tagInfo, $valPtr) = @_;
+    my ($et, $tagInfo, $valPtr) = @_;
     my $format = $$tagInfo{Writable} || $tagInfo->{Table}->{WRITABLE};
     my $err;
 
@@ -890,11 +890,11 @@ sub CheckMIE($$$)
     } elsif ($format !~ /^(utf|string|undef)/ and $$valPtr =~ /\)$/) {
         return 'Units not supported';
     } else {
-        if ($format eq 'string' and $exifTool->{OPTIONS}->{Charset} ne 'UTF8' and
+        if ($format eq 'string' and $$et{OPTIONS}{Charset} ne 'UTF8' and
             $$valPtr =~ /[\x80-\xff]/)
         {
             # convert from Charset to UTF-8
-            $$valPtr = $exifTool->Encode($$valPtr,'UTF8');
+            $$valPtr = $et->Encode($$valPtr,'UTF8');
         }
         $err = Image::ExifTool::CheckValue($valPtr, $format, $$tagInfo{Count});
     }
@@ -907,21 +907,21 @@ sub CheckMIE($$$)
 # Returns: undef on success, otherwise error message (empty message if nothing to write)
 sub WriteMIEGroup($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $outfile = $$dirInfo{OutFile};
     my $dirName = $$dirInfo{DirName};
     my $toWrite = $$dirInfo{ToWrite} || '';
     my $raf = $$dirInfo{RAF};
-    my $verbose = $exifTool->Options('Verbose');
-    my $optCompress = $exifTool->Options('Compress');
-    my $out = $exifTool->Options('TextOut');
+    my $verbose = $et->Options('Verbose');
+    my $optCompress = $et->Options('Compress');
+    my $out = $et->Options('TextOut');
     my ($msg, $err, $ok, $sync, $delGroup);
     my $tag = '';
     my $deletedTag = '';
 
     # count each MIE directory found and make name for this specific instance
     my ($grp1, %isWriting);
-    my $cnt = $exifTool->{MIE_COUNT};
+    my $cnt = $$et{MIE_COUNT};
     my $grp = $tagTablePtr->{GROUPS}->{1};
     my $n = $$cnt{'MIE-Main'} || 0;
     if ($grp eq 'MIE-Main') {
@@ -940,16 +940,16 @@ sub WriteMIEGroup($$$)
     $isWriting{"MIE$n"} = 1;        # ie. 'MIE1'
 
     # determine if we are deleting this group
-    if (%{$exifTool->{DEL_GROUP}}) {
-        $delGroup = 1 if $exifTool->{DEL_GROUP}->{MIE} or
-                         $exifTool->{DEL_GROUP}->{$grp} or
-                         $exifTool->{DEL_GROUP}->{$grp1} or
-                         $exifTool->{DEL_GROUP}->{"MIE$n"};
+    if (%{$$et{DEL_GROUP}}) {
+        $delGroup = 1 if $$et{DEL_GROUP}{MIE} or
+                         $$et{DEL_GROUP}{$grp} or
+                         $$et{DEL_GROUP}{$grp1} or
+                         $$et{DEL_GROUP}{"MIE$n"};
     }
 
     # prepare lookups and lists for writing
-    my $newTags = $exifTool->GetNewTagInfoHash($tagTablePtr);
-    my ($addDirs, $editDirs) = $exifTool->GetAddDirHash($tagTablePtr, $dirName);
+    my $newTags = $et->GetNewTagInfoHash($tagTablePtr);
+    my ($addDirs, $editDirs) = $et->GetAddDirHash($tagTablePtr, $dirName);
     my @editTags = sort keys %$newTags, keys %$editDirs;
     $verbose and print $out $raf ? 'Writing' : 'Creating', " $grp1:\n";
 
@@ -974,7 +974,7 @@ sub WriteMIEGroup($$$)
             if ($tagLen) {
                 $raf->Read($tag, $tagLen) == $tagLen or last;
                 $oldHdr .= $tag;    # add tag to element header
-                $exifTool->Warn("MIE tag '$tag' out of sequence") if $tag lt $lastTag;
+                $et->Warn("MIE tag '$tag' out of sequence") if $tag lt $lastTag;
                 # separate units from tag name if they exist
                 $units = $1 if $tag =~ s/\((.*)\)$//;
             } else {
@@ -1001,7 +1001,7 @@ sub WriteMIEGroup($$$)
                     my $free = ($format eq 0x80) ? ' free' : '';
                     print $out "    - $grp1:$tag ($valLen$free bytes)\n";
                 }
-                ++$exifTool->{CHANGED} if $delGroup;
+                ++$$et{CHANGED} if $delGroup;
                 next;
             }
         } else {
@@ -1022,7 +1022,7 @@ sub WriteMIEGroup($$$)
                 # create the new subdirectory or rewrite existing non-MIE directory
                 my $subTablePtr = GetTagTable($newInfo->{SubDirectory}->{TagTable});
                 unless ($subTablePtr) {
-                    $exifTool->Warn("No tag table for $newTag $$newInfo{Name}");
+                    $et->Warn("No tag table for $newTag $$newInfo{Name}");
                     next;
                 }
                 my %subdirInfo;
@@ -1032,12 +1032,12 @@ sub WriteMIEGroup($$$)
                 if ($newTag eq $tag) {
                     # make sure that either both or neither old and new tags are MIE groups
                     if ($isMieGroup xor ($format & 0xf3) == 0x10) {
-                        $exifTool->Warn("Tag '$tag' not expected type");
+                        $et->Warn("Tag '$tag' not expected type");
                         next;   # don't write our new tag
                     }
                     # uncompress existing directory into $oldVal since we are editing it
                     if ($format & 0x04) {
-                        last unless HasZlib($exifTool, 'edit');
+                        last unless HasZlib($et, 'edit');
                         $raf->Read($oldVal, $valLen) == $valLen or last MieElement;
                         my $stat;
                         my $inflate = Compress::Zlib::inflateInit();
@@ -1083,7 +1083,7 @@ sub WriteMIEGroup($$$)
                     $subdirInfo{Parent} = $dirName;
                     # don't compress elements of an already compressed group
                     $subdirInfo{IsCompressed} = $$dirInfo{IsCompressed} || $compress;
-                    $msg = WriteMIEGroup($exifTool, \%subdirInfo, $subTablePtr);
+                    $msg = WriteMIEGroup($et, \%subdirInfo, $subTablePtr);
                     last MieElement if $msg;
                     # message is defined but empty if nothing was written
                     if (defined $msg) {
@@ -1116,7 +1116,7 @@ sub WriteMIEGroup($$$)
                         );
                         # write Compact subdirectories if we will compress the data
                         if (($compress or $optCompress or $$dirInfo{IsCompressed}) and
-                            eval 'require Compress::Zlib')
+                            eval { require Compress::Zlib })
                         {
                             $subdirInfo{Compact} = 1;
                         }
@@ -1124,8 +1124,8 @@ sub WriteMIEGroup($$$)
                     $subdirInfo{Parent} = $dirName;
                     my $writeProc = $newInfo->{SubDirectory}->{WriteProc};
                     # reset processed lookup to avoid errors in case of multiple EXIF blocks
-                    $exifTool->{PROCESSED} = { };
-                    $newVal = $exifTool->WriteDirectory(\%subdirInfo, $subTablePtr, $writeProc);
+                    $$et{PROCESSED} = { };
+                    $newVal = $et->WriteDirectory(\%subdirInfo, $subTablePtr, $writeProc);
                     if (defined $newVal) {
                         if ($newVal eq '') {
                             next MieElement if $newTag eq $tag; # deleting the directory
@@ -1142,7 +1142,7 @@ sub WriteMIEGroup($$$)
 
                 # get the new tag information
                 $newInfo = $$newTags{$newTag};
-                my $nvHash = $exifTool->GetNewValueHash($newInfo);
+                my $nvHash = $et->GetNewValueHash($newInfo);
                 my @newVals;
 
                 # write information only to specified group
@@ -1157,13 +1157,13 @@ sub WriteMIEGroup($$$)
                         last if $$nvHash{CreateOnly};
                         $isOverwriting = -1;    # force processing list elements individually
                     } else {
-                        $isOverwriting = $exifTool->IsOverwriting($nvHash);
+                        $isOverwriting = $et->IsOverwriting($nvHash);
                         last unless $isOverwriting;
                     }
                     my ($val, $cmpVal);
                     if ($isOverwriting < 0 or $verbose > 1) {
                         # check to be sure we can uncompress the value if necessary
-                        HasZlib($exifTool, 'edit') or last if $format & 0x04;
+                        HasZlib($et, 'edit') or last if $format & 0x04;
                         # read the old value
                         $raf->Read($oldVal, $valLen) == $valLen or last MieElement;
                         # uncompress if necessary
@@ -1194,12 +1194,12 @@ sub WriteMIEGroup($$$)
                                 }
                                 # keep any list items that we aren't overwriting
                                 foreach $v (@vals) {
-                                    next if $exifTool->IsOverwriting($nvHash, $v);
+                                    next if $et->IsOverwriting($nvHash, $v);
                                     push @newVals, $v;
                                 }
                             } else {
                                 # test to see if we really want to overwrite the value
-                                $isOverwriting = $exifTool->IsOverwriting($nvHash, $val);
+                                $isOverwriting = $et->IsOverwriting($nvHash, $val);
                             }
                         }
                     }
@@ -1210,10 +1210,10 @@ sub WriteMIEGroup($$$)
                         }
                         if ($verbose > 1) {
                             $val .= "($units)" if defined $units;
-                            $exifTool->VerboseValue("- $grp1:$$newInfo{Name}", $val);
+                            $et->VerboseValue("- $grp1:$$newInfo{Name}", $val);
                         }
                         $deletedTag = $tag;     # remember that we deleted this tag
-                        ++$exifTool->{CHANGED}; # we deleted the old value
+                        ++$$et{CHANGED}; # we deleted the old value
                     } else {
                         if (defined $oldVal) {
                             # write original compressed value
@@ -1239,7 +1239,7 @@ sub WriteMIEGroup($$$)
                         and not $$nvHash{EditOnly}));
                 }
                 # get the new value to write (undef to delete)
-                push @newVals, $exifTool->GetNewValues($nvHash);
+                push @newVals, $et->GetNewValues($nvHash);
                 next unless @newVals;
                 $writable = $$newInfo{Writable} || $$tagTablePtr{WRITABLE};
                 if ($writable eq 'string') {
@@ -1292,13 +1292,13 @@ sub WriteMIEGroup($$$)
                 # convert value if necessary
                 if ($writable !~ /^(utf|string|undef)/) {
                     my $val3 = WriteValue($$valPt, $writable, $$newInfo{Count});
-                    defined $val3 or $exifTool->Warn("Error writing $newTag"), last;
+                    defined $val3 or $et->Warn("Error writing $newTag"), last;
                     $valPt = \$val3;
                 }
                 my $len = length $$valPt;
                 # compress value before writing if required
                 if (($compress or $optCompress) and not $$dirInfo{IsCompressed} and
-                    HasZlib($exifTool, 'write'))
+                    HasZlib($et, 'write'))
                 {
                     my $deflate = Compress::Zlib::deflateInit();
                     my $val4;
@@ -1319,7 +1319,7 @@ sub WriteMIEGroup($$$)
                             print $out "  [$newTag compression saved $saved bytes -- written uncompressed]\n";
                         }
                     } else {
-                        $exifTool->Warn("Error deflating $newTag (written uncompressed)");
+                        $et->Warn("Error deflating $newTag (written uncompressed)");
                     }
                 }
                 # calculate the DataLength code
@@ -1333,7 +1333,7 @@ sub WriteMIEGroup($$$)
                     $extLen = Set32u($len);
                     $len = 254;
                 } else {
-                    $exifTool->Warn("Can't write $newTag (DataLength > 2GB not yet suppported)");
+                    $et->Warn("Can't write $newTag (DataLength > 2GB not yet suppported)");
                     last; # don't write this tag
                 }
                 # write this element (with leading MIE group element if not done already)
@@ -1342,8 +1342,8 @@ sub WriteMIEGroup($$$)
                 $toWrite = '';
                 # we changed a tag unless just editing a subdirectory
                 unless ($$editDirs{$newTag}) {
-                    $exifTool->VerboseValue("+ $grp1:$$newInfo{Name}", $newVal);
-                    ++$exifTool->{CHANGED};
+                    $et->VerboseValue("+ $grp1:$$newInfo{Name}", $newVal);
+                    ++$$et{CHANGED};
                 }
                 last;   # didn't want to loop anyway
             }
@@ -1377,7 +1377,7 @@ sub WriteMIEGroup($$$)
         # descend into existing uncompressed MIE group
         if ($format == 0x10 or $format == 0x18) {
             my ($subTablePtr, $dirName);
-            my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+            my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
             if ($tagInfo and $$tagInfo{SubDirectory}) {
                 $dirName = $tagInfo->{SubDirectory}->{DirName};
                 my $subTable = $tagInfo->{SubDirectory}->{TagTable};
@@ -1396,7 +1396,7 @@ sub WriteMIEGroup($$$)
             );
             my $oldOrder = GetByteOrder();
             SetByteOrder($format & 0x08 ? 'II' : 'MM');
-            $msg = WriteMIEGroup($exifTool, \%subdirInfo, $subTablePtr);
+            $msg = WriteMIEGroup($et, \%subdirInfo, $subTablePtr);
             SetByteOrder($oldOrder);
             last if $msg;
             if (defined $msg) {
@@ -1434,17 +1434,17 @@ sub WriteMIEGroup($$$)
 # Notes: file pointer is positioned at the MIE end on entry
 sub ProcessMIEGroup($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $raf = $$dirInfo{RAF};
-    my $verbose = $exifTool->Options('Verbose');
-    my $out = $exifTool->Options('TextOut');
-    my $notUTF8 = ($exifTool->{OPTIONS}->{Charset} ne 'UTF8');
+    my $verbose = $et->Options('Verbose');
+    my $out = $et->Options('TextOut');
+    my $notUTF8 = ($$et{OPTIONS}{Charset} ne 'UTF8');
     my ($msg, $buff, $ok, $oldIndent, $mime);
     my $lastTag = '';
 
     # get group 1 names: $grp doesn't have numbers (ie. 'MIE-Doc'),
     # and $grp1 does (ie. 'MIE1-Doc1')
-    my $cnt = $exifTool->{MIE_COUNT};
+    my $cnt = $$et{MIE_COUNT};
     my $grp1 = $tagTablePtr->{GROUPS}->{1};
     my $n = $$cnt{'MIE-Main'} || 0;
     if ($grp1 eq 'MIE-Main') {
@@ -1456,12 +1456,12 @@ sub ProcessMIEGroup($$$)
         $grp1 .= $$cnt{$grp1} if $$cnt{$grp1} > 1;
     }
     # set group1 name for all tags extracted from this group
-    $exifTool->{SET_GROUP1} = $grp1;
+    $$et{SET_GROUP1} = $grp1;
 
     if ($verbose) {
-        $oldIndent = $exifTool->{INDENT};
-        $exifTool->{INDENT} .= '| ';
-        $exifTool->VerboseDir($grp1);
+        $oldIndent = $$et{INDENT};
+        $$et{INDENT} .= '| ';
+        $et->VerboseDir($grp1);
     }
     my $wasCompressed = $$dirInfo{WasCompressed};
 
@@ -1475,7 +1475,7 @@ sub ProcessMIEGroup($$$)
         my ($tag, $units);
         if ($tagLen) {
             $raf->Read($tag, $tagLen) == $tagLen or last;
-            $exifTool->Warn("MIE tag '$tag' out of sequence") if $tag lt $lastTag;
+            $et->Warn("MIE tag '$tag' out of sequence") if $tag lt $lastTag;
             $lastTag = $tag;
             # separate units from tag name if they exist
             $units = $1 if $tag =~ s/\((.*)\)$//;
@@ -1505,17 +1505,17 @@ sub ProcessMIEGroup($$$)
         # get tag information hash unless this is free space
         my ($tagInfo, $value);
         while ($format != 0x80) {
-            $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+            $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
             last if $tagInfo;
             # extract tags with locale code
             if ($tag =~ /\W/) {
                 if ($tag =~ /^(\w+)-([a-z]{2}_[A-Z]{2})$/) {
                     my ($baseTag, $langCode) = ($1, $2);
-                    $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $baseTag);
+                    $tagInfo = $et->GetTagInfo($tagTablePtr, $baseTag);
                     $tagInfo = GetLangInfo($tagInfo, $langCode) if $tagInfo;
                     last if $tagInfo;
                 } else {
-                    $exifTool->Warn('Invalid MIE tag name');
+                    $et->Warn('Invalid MIE tag name');
                     last;
                 }
             }
@@ -1535,14 +1535,14 @@ sub ProcessMIEGroup($$$)
             $raf->Read($value, $valLen) == $valLen or last;
             if ($format & 0x04) {
                 if ($verbose) {
-                    print $out "$$exifTool{INDENT}\[Tag '$tag' $valLen bytes compressed]\n";
+                    print $out "$$et{INDENT}\[Tag '$tag' $valLen bytes compressed]\n";
                 }
-                next unless HasZlib($exifTool, 'decode');
+                next unless HasZlib($et, 'decode');
                 my $stat;
                 my $inflate = Compress::Zlib::inflateInit();
                 $inflate and ($value, $stat) = $inflate->inflate($value);
                 unless ($inflate and $stat == Compress::Zlib::Z_STREAM_END()) {
-                    $exifTool->Warn("Error inflating $tag");
+                    $et->Warn("Error inflating $tag");
                     next;
                 }
                 $valLen = length $value;
@@ -1563,7 +1563,7 @@ sub ProcessMIEGroup($$$)
             }
             if ($verbose) {
                 my $order = ', byte order ' . GetByteOrder();
-                $exifTool->VerboseInfo($tag, $tagInfo, Size => $valLen, Extra => $order);
+                $et->VerboseInfo($tag, $tagInfo, Size => $valLen, Extra => $order);
             }
             my %subdirInfo = (
                 DirName => $dirName || $tag,
@@ -1576,9 +1576,9 @@ sub ProcessMIEGroup($$$)
 
             my $oldOrder = GetByteOrder();
             SetByteOrder($format & 0x08 ? 'II' : 'MM');
-            $msg = ProcessMIEGroup($exifTool, \%subdirInfo, $subTablePtr);
+            $msg = ProcessMIEGroup($et, \%subdirInfo, $subTablePtr);
             SetByteOrder($oldOrder);
-            $exifTool->{SET_GROUP1} = $grp1;    # restore this group1 name
+            $$et{SET_GROUP1} = $grp1;    # restore this group1 name
             last if $msg;
         } else {
             # process MIE data format types
@@ -1587,7 +1587,7 @@ sub ProcessMIEGroup($$$)
                 # extract tag value
                 my $val = ReadMIEValue(\$value, 0, $formatStr, undef, $valLen, \$rational);
                 unless (defined $val) {
-                    $exifTool->Warn("Error reading $tag value");
+                    $et->Warn("Error reading $tag value");
                     $val = '<err>';
                 }
                 # save type or mime type
@@ -1598,7 +1598,7 @@ sub ProcessMIEGroup($$$)
                     if ($s and $formatStr !~ /^(utf|string|undef)/) {
                         $count = $valLen / $s;
                     }
-                    $exifTool->VerboseInfo($lastTag, $tagInfo,
+                    $et->VerboseInfo($lastTag, $tagInfo,
                         DataPt  => \$value,
                         DataPos => $raf->Tell() - $valLen,
                         Size    => $valLen,
@@ -1625,17 +1625,17 @@ sub ProcessMIEGroup($$$)
                     }
                     # reset PROCESSED lookup for each MIE directory
                     # (there is no possibility of double-processing a MIE directory)
-                    $exifTool->{PROCESSED} = { };
+                    $$et{PROCESSED} = { };
                     my $processProc = $tagInfo->{SubDirectory}->{ProcessProc};
-                    delete $exifTool->{SET_GROUP1};
-                    delete $exifTool->{NO_LIST};
-                    $exifTool->ProcessDirectory(\%subdirInfo, $subTablePtr, $processProc);
-                    $exifTool->{SET_GROUP1} = $grp1;
-                    $exifTool->{NO_LIST} = 1;
+                    delete $$et{SET_GROUP1};
+                    delete $$et{NO_LIST};
+                    $et->ProcessDirectory(\%subdirInfo, $subTablePtr, $processProc);
+                    $$et{SET_GROUP1} = $grp1;
+                    $$et{NO_LIST} = 1;
                 } else {
                     # convert to specified character set if necessary
                     if ($notUTF8 and $formatStr =~ /^(utf|string)/) {
-                        $val = $exifTool->Decode($val, 'UTF8');
+                        $val = $et->Decode($val, 'UTF8');
                     }
                     if ($formatStr =~ /_list$/) {
                         # split list value into separate strings
@@ -1647,21 +1647,21 @@ sub ProcessMIEGroup($$$)
                         # add units to value if specified
                         $val .= "($units)" if defined $units;
                     }
-                    my $key = $exifTool->FoundTag($tagInfo, $val);
-                    $$exifTool{RATIONAL}{$key} = $rational if defined $rational and defined $key;
+                    my $key = $et->FoundTag($tagInfo, $val);
+                    $$et{RATIONAL}{$key} = $rational if defined $rational and defined $key;
                 }
             } else {
                 # skip over unknown information or free bytes
                 $raf->Seek($valLen, 1) or $msg = 'Seek error', last;
-                $verbose and $exifTool->VerboseInfo($tag, undef, Size => $valLen);
+                $verbose and $et->VerboseInfo($tag, undef, Size => $valLen);
             }
         }
     }
     # modify MIME type if necessary
-    $mime and not $$dirInfo{Parent} and $exifTool->ModifyMimeType($mime);
+    $mime and not $$dirInfo{Parent} and $et->ModifyMimeType($mime);
 
     $ok or $msg or $msg = 'Unexpected end of file';
-    $verbose and $exifTool->{INDENT} = $oldIndent;
+    $verbose and $$et{INDENT} = $oldIndent;
     return $msg;
 }
 
@@ -1672,8 +1672,8 @@ sub ProcessMIEGroup($$$)
 # - process as a trailer if "Trailer" flag set in dirInfo
 sub ProcessMIE($$)
 {
-    my ($exifTool, $dirInfo) = @_;
-    return 1 unless defined $exifTool;
+    my ($et, $dirInfo) = @_;
+    return 1 unless defined $et;
     my $raf = $$dirInfo{RAF};
     my $outfile = $$dirInfo{OutFile};
     my ($buff, $err, $msg, $pos, $end, $isCreating);
@@ -1710,13 +1710,13 @@ sub ProcessMIE($$)
         # update DataPos and DirLen for ProcessTrailers()
         $$dirInfo{DataPos} = $pos;
         $$dirInfo{DirLen} = $end - $pos;
-        if ($outfile and $exifTool->{DEL_GROUP}->{MIE}) {
+        if ($outfile and $$et{DEL_GROUP}{MIE}) {
             # delete the trailer
-            $exifTool->VPrint(0,"  Deleting MIE trailer\n");
-            ++$exifTool->{CHANGED};
+            $et->VPrint(0,"  Deleting MIE trailer\n");
+            ++$$et{CHANGED};
             return 1;
-        } elsif ($exifTool->Options('Verbose') or $exifTool->{HTML_DUMP}) {
-            $exifTool->DumpTrailer($dirInfo);
+        } elsif ($et->Options('Verbose') or $$et{HTML_DUMP}) {
+            $et->DumpTrailer($dirInfo);
         }
     }
 #
@@ -1751,24 +1751,24 @@ sub ProcessMIE($$)
             # we have the ability to create a MIE file from scratch
             $buff = ''; # start from nothing
             # set byte order according to preferences
-            $exifTool->SetPreferredByteOrder();
+            $et->SetPreferredByteOrder();
             $isCreating = 1;
         }
         if ($msg) {
             last if $$dirInfo{Trailer}; # allow other trailers after MIE
             if ($outfile) {
-                $exifTool->Error($msg);
+                $et->Error($msg);
             } else {
-                $exifTool->Warn($msg);
+                $et->Warn($msg);
             }
             last;
         }
         # this is a new MIE document -- increment document count
         unless ($numDocs) {
             # this is a valid MIE file (unless a trailer on another file)
-            $exifTool->SetFileType();
-            $exifTool->{NO_LIST} = 1;   # handle lists ourself
-            $exifTool->{MIE_COUNT} = { };
+            $et->SetFileType();
+            $$et{NO_LIST} = 1;   # handle lists ourself
+            $$et{MIE_COUNT} = { };
             undef $hasZlib;
         }
         ++$numDocs;
@@ -1795,27 +1795,27 @@ sub ProcessMIE($$)
             # (note that this may re-initialize directories when writing trailer
             #  to another type of image, but this is OK because we are done writing
             #  the other format by the time we start writing the trailer)
-            $exifTool->InitWriteDirs(\%mieMap, 'MIE');
+            $et->InitWriteDirs(\%mieMap, 'MIE');
             $subdirInfo{ToWrite} = '~' . MIEGroupFormat(1) . "\x04\xfe0MIE\0\0\0\0";
-            $msg = WriteMIEGroup($exifTool, \%subdirInfo, $tagTablePtr);
+            $msg = WriteMIEGroup($et, \%subdirInfo, $tagTablePtr);
             if ($msg) {
-                $exifTool->Error($msg);
+                $et->Error($msg);
                 $err = 1;
                 last;
             } elsif (defined $msg and $isCreating) {
                 last;
             }
         } else {
-            $msg = ProcessMIEGroup($exifTool, \%subdirInfo, $tagTablePtr);
+            $msg = ProcessMIEGroup($et, \%subdirInfo, $tagTablePtr);
             if ($msg) {
-                $exifTool->Warn($msg);
+                $et->Warn($msg);
                 last;
             }
         }
     }
-    delete $exifTool->{NO_LIST};
-    delete $exifTool->{MIE_COUNT};
-    delete $exifTool->{SET_GROUP1};
+    delete $$et{NO_LIST};
+    delete $$et{MIE_COUNT};
+    delete $$et{SET_GROUP1};
     return $err ? -1 : 1;
 }
 
@@ -2522,7 +2522,7 @@ tag name.  For example:
 
 =head1 REVISIONS
 
-  2010-04-05 - Fixed ÒFormat SizeÓ Note 7 to give the correct number of bits
+  2010-04-05 - Fixed "Format Size" Note 7 to give the correct number of bits
                in the example rational value
   2007-01-21 - Specified LF character (0x0a) for text newline sequence
   2007-01-19 - Specified ISO 8859-1 character set for extended ASCII codes
@@ -2538,7 +2538,7 @@ tag name.  For example:
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.  The MIE format itself is also
@@ -356,7 +356,7 @@ A few examples of combined units strings:
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -15,7 +15,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.06';
+$VERSION = '1.07';
 
 # MIFF chunks
 %Image::ExifTool::MIFF::Main = (
@@ -103,16 +103,16 @@ $VERSION = '1.06';
 # Returns: 1 on success, 0 if this wasn't a valid MIFF image
 sub ProcessMIFF($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
-    my $verbose = $exifTool->{OPTIONS}->{Verbose};
+    my $verbose = $$et{OPTIONS}{Verbose};
     my ($hdr, $buff);
 
     # validate the MIFF file (note: MIFF files _may_ begin with other
     # characters, but this starting sequence is strongly suggested.)
     return 0 unless $raf->Read($hdr, 14) == 14;
     return 0 unless $hdr eq 'id=ImageMagick';
-    $exifTool->SetFileType();   # set the FileType tag
+    $et->SetFileType();   # set the FileType tag
 
     # set end-of-line character sequence to read to end of the TEXT
     # section for new-type MIFF files (text ends with Colon+Ctrl-Z)
@@ -153,15 +153,15 @@ sub ProcessMIFF($$)
                 last;
             } else {
                 # something we don't recognize -- stop parsing here
-                $exifTool->Warn('Unrecognized MIFF data');
+                $et->Warn('Unrecognized MIFF data');
                 last;
             }
-            my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+            my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
             unless ($tagInfo) {
                 $tagInfo = { Name => $tag };
                 AddTagToTable($tagTablePtr, $tag, $tagInfo);
             }
-            $verbose and $exifTool->VerboseInfo($tag, $tagInfo,
+            $verbose and $et->VerboseInfo($tag, $tagInfo,
                 Table  => $tagTablePtr,
                 DataPt => \$val,
             );
@@ -169,7 +169,7 @@ sub ProcessMIFF($$)
             if ($tag =~ /^profile-(.*)/) {
                 push @profiles, [$1, $val];
             } else {
-                $exifTool->FoundTag($tagInfo, $val);
+                $et->FoundTag($tagInfo, $val);
             }
         }
     }
@@ -178,11 +178,11 @@ sub ProcessMIFF($$)
     foreach (@profiles) {
         my ($type, $len) = @{$_};
         unless ($len =~ /^\d+$/) {
-            $exifTool->Warn("Invalid length for $type profile");
+            $et->Warn("Invalid length for $type profile");
             last;   # don't try to read the rest
         }
         unless ($raf->Read($buff, $len) == $len) {
-            $exifTool->Warn("Error reading $type profile ($len bytes)");
+            $et->Warn("Error reading $type profile ($len bytes)");
             next;
         }
         my $processed = 0;
@@ -197,12 +197,12 @@ sub ProcessMIFF($$)
         if ($type eq 'icc') {
             # ICC Profile information
             my $tagTablePtr = GetTagTable('Image::ExifTool::ICC_Profile::Main');
-            $processed = $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+            $processed = $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
         } elsif ($type eq 'iptc') {
             if ($buff =~ /^8BIM/) {
                 # Photoshop information
                 my $tagTablePtr = GetTagTable('Image::ExifTool::Photoshop::Main');
-                $processed = $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+                $processed = $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
             }
         # I haven't seen 'exif' or 'xmp' profile types yet, but I have seen them
         # in newer PNG files so presumably they are possible here as well - PH
@@ -215,21 +215,21 @@ sub ProcessMIFF($$)
                 # use the usual position for EXIF data: 12 bytes from start of file
                 # (this may be wrong, but I can't see where the PNG stores this information)
                 $dirInfo{Base} = 12; # this is the usual value
-                $processed = $exifTool->ProcessTIFF(\%dirInfo);
+                $processed = $et->ProcessTIFF(\%dirInfo);
             } elsif ($buff =~ /^$Image::ExifTool::xmpAPP1hdr/) {
                 # APP1 XMP
                 my $hdrLen = length($Image::ExifTool::xmpAPP1hdr);
                 my $tagTablePtr = GetTagTable('Image::ExifTool::XMP::Main');
                 $dirInfo{DirStart} += $hdrLen;
                 $dirInfo{DirLen} -= $hdrLen;
-                $processed = $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+                $processed = $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
             }
         }
         unless ($processed) {
-            $exifTool->Warn("Unknown MIFF $type profile data");
+            $et->Warn("Unknown MIFF $type profile data");
             if ($verbose) {
-                $exifTool->VerboseDir($type, 0, $len);
-                $exifTool->VerboseDump(\$buff);
+                $et->VerboseDir($type, 0, $len);
+                $et->VerboseDump(\$buff);
             }
          }
     }
@@ -255,7 +255,7 @@ This module contains routines required by Image::ExifTool to read MIFF
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -661,7 +661,7 @@ This module contains definitions required by Image::ExifTool to read MNG
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -15,7 +15,7 @@ use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::FLAC;
 
-$VERSION = '1.00';
+$VERSION = '1.01';
 
 # MPC metadata blocks
 %Image::ExifTool::MPC::Main = (
@@ -78,12 +78,12 @@ $VERSION = '1.00';
 # Returns: 1 on success, 0 if this wasn't a valid MPC file
 sub ProcessMPC($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
 
     # must first check for leading ID3 information
-    unless ($exifTool->{DoneID3}) {
+    unless ($$et{DoneID3}) {
         require Image::ExifTool::ID3;
-        Image::ExifTool::ID3::ProcessID3($exifTool, $dirInfo) and return 1;
+        Image::ExifTool::ID3::ProcessID3($et, $dirInfo) and return 1;
     }
     my $raf = $$dirInfo{RAF};
     my $buff;
@@ -91,26 +91,26 @@ sub ProcessMPC($$)
     # check MPC signature
     $raf->Read($buff, 32) == 32 and $buff =~ /^MP\+(.)/s or return 0;
     my $vers = ord($1) & 0x0f;
-    $exifTool->SetFileType();
+    $et->SetFileType();
 
     # extract audio information (currently only from version 7 MPC files)
     if ($vers == 0x07) {
         SetByteOrder('II');
         my $pos = $raf->Tell() - 32;
-        if ($exifTool->Options('Verbose')) {
-            $exifTool->VPrint(0, "MPC Header (32 bytes):\n");
-            $exifTool->VerboseDump(\$buff, DataPos => $pos);
+        if ($et->Options('Verbose')) {
+            $et->VPrint(0, "MPC Header (32 bytes):\n");
+            $et->VerboseDump(\$buff, DataPos => $pos);
         }
         my $tagTablePtr = GetTagTable('Image::ExifTool::MPC::Main');
         my %dirInfo = ( DataPt => \$buff, DataPos => $pos );
-        $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
     } else {
-        $exifTool->Warn('Audio info currently not extracted from this version MPC file');
+        $et->Warn('Audio info currently not extracted from this version MPC file');
     }
 
     # process APE trailer if it exists
     require Image::ExifTool::APE;
-    Image::ExifTool::APE::ProcessAPE($exifTool, $dirInfo);
+    Image::ExifTool::APE::ProcessAPE($et, $dirInfo);
 
     return 1;
 }
@@ -134,7 +134,7 @@ information from Musepack (MPC) audio files.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -18,7 +18,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.14';
+$VERSION = '1.15';
 
 %Image::ExifTool::MPEG::Audio = (
     GROUPS => { 2 => 'Audio' },
@@ -441,7 +441,7 @@ Image::ExifTool::AddCompositeTags('Image::ExifTool::MPEG');
 # Inputs: 0) ExifTool object ref, 1) tag table ref, 2-N) list of 32-bit data words
 sub ProcessFrameHeader($$@)
 {
-    my ($exifTool, $tagTablePtr, @data) = @_;
+    my ($et, $tagTablePtr, @data) = @_;
     my $tag;
     foreach $tag (sort keys %$tagTablePtr) {
         next unless $tag =~ /^Bit(\d{2})-?(\d{2})?/;
@@ -453,7 +453,7 @@ sub ProcessFrameHeader($$@)
             $mask += (1 << $_);
         }
         my $val = ($word >> (31 + 32*$index - $b2)) & $mask;
-        $exifTool->HandleTag($tagTablePtr, $tag, $val);
+        $et->HandleTag($tagTablePtr, $tag, $val);
     }
 }
 
@@ -464,9 +464,9 @@ sub ProcessFrameHeader($$@)
 # Returns: 1 on success, 0 if no audio header was found
 sub ParseMPEGAudio($$;$)
 {
-    my ($exifTool, $buffPt, $mp3) = @_;
+    my ($et, $buffPt, $mp3) = @_;
     my ($word, $pos);
-    my $ext = $$exifTool{FILE_EXT} || '';
+    my $ext = $$et{FILE_EXT} || '';
 
     for (;;) {
         # find frame sync
@@ -494,13 +494,13 @@ sub ParseMPEGAudio($$;$)
         last;
     }
     # set file type if not done already
-    $exifTool->SetFileType();
+    $et->SetFileType();
 
     my $tagTablePtr = GetTagTable('Image::ExifTool::MPEG::Audio');
-    ProcessFrameHeader($exifTool, $tagTablePtr, $word);
+    ProcessFrameHeader($et, $tagTablePtr, $word);
 
     # extract the VBR information (ref MP3::Info)
-    my ($v, $m) = ($$exifTool{MPEG_Vers}, $$exifTool{MPEG_Mode});
+    my ($v, $m) = ($$et{MPEG_Vers}, $$et{MPEG_Mode});
     while (defined $v and defined $m) {
         my $len = length $$buffPt;
         $pos += $v == 3 ? ($m == 3 ? 17 : 32) : ($m == 3 ?  9 : 17);
@@ -514,12 +514,12 @@ sub ParseMPEGAudio($$;$)
         $pos += 8;
         if ($flags & 0x01) {    # VBRFrames
             last if $pos + 4 > $len;
-            $exifTool->HandleTag($xingTable, 1, unpack("x${pos}N", $$buffPt)) if $isVBR;
+            $et->HandleTag($xingTable, 1, unpack("x${pos}N", $$buffPt)) if $isVBR;
             $pos += 4;
         }
         if ($flags & 0x02) {    # VBRBytes
             last if $pos + 4 > $len;
-            $exifTool->HandleTag($xingTable, 2, unpack("x${pos}N", $$buffPt)) if $isVBR;
+            $et->HandleTag($xingTable, 2, unpack("x${pos}N", $$buffPt)) if $isVBR;
             $pos += 4;
         }
         if ($flags & 0x04) {    # VBR_TOC
@@ -530,7 +530,7 @@ sub ParseMPEGAudio($$;$)
         if ($flags & 0x08) {    # VBRScale
             last if $pos + 4 > $len;
             $vbrScale = unpack("x${pos}N", $$buffPt);
-            $exifTool->HandleTag($xingTable, 3, $vbrScale) if $isVBR;
+            $et->HandleTag($xingTable, 3, $vbrScale) if $isVBR;
             $pos += 4;
         }
         # process Lame header (ref 5)
@@ -552,7 +552,7 @@ sub ParseMPEGAudio($$;$)
                 } else {
                     last;
                 }
-                $exifTool->HandleTag($xingTable, 4, $lib);
+                $et->HandleTag($xingTable, 4, $lib);
                 last;
             }
         }
@@ -560,10 +560,10 @@ sub ParseMPEGAudio($$;$)
         last if $lameLen < 9;
         my $enc = substr($$buffPt, $pos, 9);
         if ($enc ge 'LAME3.90') {
-            $exifTool->HandleTag($xingTable, 4, $enc);
+            $et->HandleTag($xingTable, 4, $enc);
             if ($vbrScale <= 100) {
-                $exifTool->HandleTag($xingTable, 5, int((100 - $vbrScale) / 10));
-                $exifTool->HandleTag($xingTable, 6, (100 - $vbrScale) % 10);
+                $et->HandleTag($xingTable, 5, int((100 - $vbrScale) / 10));
+                $et->HandleTag($xingTable, 6, (100 - $vbrScale) % 10);
             }
             my %dirInfo = (
                 DataPt   => $buffPt,
@@ -571,9 +571,9 @@ sub ParseMPEGAudio($$;$)
                 DirLen   => length($$buffPt) - $pos,
             );
             my $subTablePtr = GetTagTable('Image::ExifTool::MPEG::Lame');
-            $exifTool->ProcessDirectory(\%dirInfo, $subTablePtr);
+            $et->ProcessDirectory(\%dirInfo, $subTablePtr);
         } else {
-            $exifTool->HandleTag($xingTable, 4, substr($$buffPt, $pos, 20));
+            $et->HandleTag($xingTable, 4, substr($$buffPt, $pos, 20));
         }
         last;   # (didn't want to loop anyway)
     }
@@ -587,7 +587,7 @@ sub ParseMPEGAudio($$;$)
 # Returns: 1 on success, 0 if no video header was found
 sub ProcessMPEGVideo($$)
 {
-    my ($exifTool, $buffPt) = @_;
+    my ($et, $buffPt) = @_;
 
     return 0 unless length $$buffPt >= 4;
     my ($w1, $w2) = unpack('N2', $$buffPt);
@@ -600,10 +600,10 @@ sub ProcessMPEGVideo($$)
         return 0;
     }
     # set file type if not done already
-    $exifTool->SetFileType('MPEG') unless $exifTool->{VALUE}->{FileType};
+    $et->SetFileType('MPEG') unless $$et{VALUE}{FileType};
 
     my $tagTablePtr = GetTagTable('Image::ExifTool::MPEG::Video');
-    ProcessFrameHeader($exifTool, $tagTablePtr, $w1, $w2);
+    ProcessFrameHeader($et, $tagTablePtr, $w1, $w2);
     return 1;
 }
 
@@ -627,13 +627,13 @@ sub ProcessMPEGVideo($$)
 #   0xe0-0xef - video stream
 sub ParseMPEGAudioVideo($$)
 {
-    my ($exifTool, $buffPt) = @_;
+    my ($et, $buffPt) = @_;
     my (%found, $didHdr);
     my $rtnVal = 0;
     my %proc = ( audio => \&ParseMPEGAudio, video => \&ProcessMPEGVideo );
 
-    delete $exifTool->{AudioBitrate};
-    delete $exifTool->{VideoBitrate};
+    delete $$et{AudioBitrate};
+    delete $$et{VideoBitrate};
 
     while ($$buffPt =~ /\0\0\x01(\xb3|\xc0)/g) {
         my $type = $1 eq "\xb3" ? 'video' : 'audio';
@@ -642,7 +642,7 @@ sub ParseMPEGAudioVideo($$)
             # (the last byte of the 4-byte MP3 audio frame header word may be zero,
             # but the 2nd last must be non-zero, so we need only check to pos-3)
             my $buff = substr($$buffPt, 0, pos($$buffPt) - 3);
-            $found{audio} = 1 if ParseMPEGAudio($exifTool, \$buff);
+            $found{audio} = 1 if ParseMPEGAudio($et, \$buff);
             $didHdr = 1;
         }
         next if $found{$type};
@@ -651,7 +651,7 @@ sub ParseMPEGAudioVideo($$)
         $len > 256 and $len = 256;
         my $dat = substr($$buffPt, pos($$buffPt), $len);
         # process MPEG audio or video
-        if (&{$proc{$type}}($exifTool, \$dat)) {
+        if (&{$proc{$type}}($et, \$dat)) {
             $rtnVal = 1;
             $found{$type} = 1;
             # done if we found audio and video
@@ -667,18 +667,18 @@ sub ParseMPEGAudioVideo($$)
 # Returns: 1 on success, 0 if this wasn't a valid MPEG file
 sub ProcessMPEG($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my $buff;
 
     $raf->Read($buff, 4) == 4 or return 0;
     return 0 unless $buff =~ /^\0\0\x01[\xb0-\xbf]/;
-    $exifTool->SetFileType();
+    $et->SetFileType();
 
     $raf->Seek(0,0);
     $raf->Read($buff, 65536*4) or return 0;
 
-    return ParseMPEGAudioVideo($exifTool, \$buff);
+    return ParseMPEGAudioVideo($et, \$buff);
 }
 
 1;  # end
@@ -705,7 +705,7 @@ based on unofficial sources which may be incomplete, inaccurate or outdated.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -15,7 +15,7 @@ use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Exif;
 
-$VERSION = '1.06';
+$VERSION = '1.08';
 
 sub ProcessMPImageList($$$);
 
@@ -183,27 +183,27 @@ Image::ExifTool::AddCompositeTags('Image::ExifTool::MPF');
 # Returns: undef
 sub ExtractMPImages($)
 {
-    my $exifTool = shift;
-    my $ee = $exifTool->Options('ExtractEmbedded');
-    my $saveBinary = $exifTool->Options('Binary');
+    my $et = shift;
+    my $ee = $et->Options('ExtractEmbedded');
+    my $saveBinary = $et->Options('Binary');
     my ($i, $didPreview, $xtra);
 
     for ($i=1; $xtra or not defined $xtra; ++$i) {
         # run through MP images in the same order they were extracted
-        $xtra = defined $$exifTool{VALUE}{"MPImageStart ($i)"} ? " ($i)" : '';
-        my $off = $exifTool->GetValue("MPImageStart$xtra");
-        my $len = $exifTool->GetValue("MPImageLength$xtra");
+        $xtra = defined $$et{VALUE}{"MPImageStart ($i)"} ? " ($i)" : '';
+        my $off = $et->GetValue("MPImageStart$xtra");
+        my $len = $et->GetValue("MPImageLength$xtra");
         if ($off and $len) {
-            my $type = $exifTool->GetValue("MPImageType$xtra", 'ValueConv');
+            my $type = $et->GetValue("MPImageType$xtra", 'ValueConv');
             my $tag = "MPImage$i";
             # store first "Large Thumbnail" as a PreviewImage
             if (not $didPreview and $type and ($type & 0x0f0000) == 0x010000) {
                 $tag = 'PreviewImage';
                 $didPreview = 1;
             }
-            $exifTool->Options('Binary', 1) if $ee;
-            my $val = Image::ExifTool::Exif::ExtractImage($exifTool, $off, $len, $tag);
-            $exifTool->Options('Binary', $saveBinary) if $ee;
+            $et->Options('Binary', 1) if $ee;
+            my $val = Image::ExifTool::Exif::ExtractImage($et, $off, $len, $tag);
+            $et->Options('Binary', $saveBinary) if $ee;
             next unless defined $val;
             unless ($Image::ExifTool::Extra{$tag}) {
                 AddTagToTable(\%Image::ExifTool::Extra, $tag, {
@@ -211,17 +211,20 @@ sub ExtractMPImages($)
                     Groups => { 0 => 'Composite', 1 => 'Composite', 2 => 'Image'},
                 });
             }
-            my $key = $exifTool->FoundTag($tag, $val);
+            my $key = $et->FoundTag($tag, $val);
             # set groups for PreviewImage
             if ($tag eq 'PreviewImage') {
-                $exifTool->SetGroup($key, 'Composite', 0);
-                $exifTool->SetGroup($key, 'Composite');
+                $et->SetGroup($key, 'Composite', 0);
+                $et->SetGroup($key, 'Composite');
             }
             # extract information from MP images if ExtractEmbedded option used
             if ($ee) {
-                $$exifTool{DOC_NUM} = $i;
-                $exifTool->ExtractInfo($val, { ReEntry => 1 });
-                delete $$exifTool{DOC_NUM};
+                my $oldBase = $$et{BASE};
+                $$et{BASE} = $off;
+                $$et{DOC_NUM} = $i;
+                $et->ExtractInfo($val, { ReEntry => 1 });
+                delete $$et{DOC_NUM};
+                $$et{BASE} = $oldBase;
             }
         }
     }
@@ -234,17 +237,17 @@ sub ExtractMPImages($)
 # Returns: 1 on success
 sub ProcessMPImageList($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $num = int($$dirInfo{DirLen} / 16); # (16 bytes per MP Entry)
     $$dirInfo{DirLen} = 16;
     my ($i, $success);
-    my $oldG1 = $$exifTool{SET_GROUP1};
+    my $oldG1 = $$et{SET_GROUP1};
     for ($i=0; $i<$num; ++$i) {
-        $$exifTool{SET_GROUP1} = '+' . ($i + 1);
-        $success = $exifTool->ProcessBinaryData($dirInfo, $tagTablePtr);
+        $$et{SET_GROUP1} = '+' . ($i + 1);
+        $success = $et->ProcessBinaryData($dirInfo, $tagTablePtr);
         $$dirInfo{DirStart} += 16;
     }
-    $$exifTool{SET_GROUP1} = $oldG1;
+    $$et{SET_GROUP1} = $oldG1;
     return $success;
 }
 
@@ -267,7 +270,7 @@ Format (MPF) information from JPEG images.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -16,7 +16,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Exif;
 use Image::ExifTool::XMP;
 
-$VERSION = '1.11';
+$VERSION = '1.14';
 
 sub RecoverTruncatedIPTC($$$);
 sub ListToString($);
@@ -292,19 +292,22 @@ my $mwgLoaded;  # flag set if we alreaded Load()ed the MWG tags
         Desire => {
             0 => 'IPTC:Country-PrimaryLocationName', # (64-character limit)
             1 => 'XMP-photoshop:Country',
-            2 => 'CurrentIPTCDigest',
-            3 => 'IPTCDigest',
+            2 => 'XMP-iptcExt:LocationShownCountryName',
+            3 => 'CurrentIPTCDigest',
+            4 => 'IPTCDigest',
         },
         RawConv => q{
-            return $val[1] if not defined $val[2] or (defined $val[1] and
-                             (not defined $val[3] or $val[2] eq $val[3]));
-            return Image::ExifTool::MWG::RecoverTruncatedIPTC($val[0], $val[1], 64);
+            my $xmpVal = $val[2] || $val[1];
+            return $xmpVal if not defined $val[3] or (defined $xmpVal and
+                             (not defined $val[4] or $val[3] eq $val[4]));
+            return Image::ExifTool::MWG::RecoverTruncatedIPTC($val[0], $xmpVal, 64);
         },
         DelCheck   => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
         WriteCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
         WriteAlso  => {
             'IPTC:Country-PrimaryLocationName' => '$opts{EditGroup} = 1; $val',
-            'XMP-photoshop:Country'            => '$val',
+            'XMP-photoshop:Country'            => '$val', # (legacy)
+            'XMP-iptcExt:LocationShownCountryName' => '$val',
         },
     },
     State => {
@@ -313,19 +316,22 @@ my $mwgLoaded;  # flag set if we alreaded Load()ed the MWG tags
         Desire => {
             0 => 'IPTC:Province-State', # (32-character limit)
             1 => 'XMP-photoshop:State',
-            2 => 'CurrentIPTCDigest',
-            3 => 'IPTCDigest',
+            2 => 'XMP-iptcExt:LocationShownProvinceState',
+            3 => 'CurrentIPTCDigest',
+            4 => 'IPTCDigest',
         },
         RawConv => q{
-            return $val[1] if not defined $val[2] or (defined $val[1] and
-                             (not defined $val[3] or $val[2] eq $val[3]));
-            return Image::ExifTool::MWG::RecoverTruncatedIPTC($val[0], $val[1], 32);
+            my $xmpVal = $val[2] || $val[1];
+            return $xmpVal if not defined $val[3] or (defined $xmpVal and
+                             (not defined $val[4] or $val[3] eq $val[4]));
+            return Image::ExifTool::MWG::RecoverTruncatedIPTC($val[0], $xmpVal, 32);
         },
         DelCheck   => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
         WriteCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
         WriteAlso  => {
             'IPTC:Province-State' => '$opts{EditGroup} = 1; $val',
-            'XMP-photoshop:State' => '$val',
+            'XMP-photoshop:State' => '$val', # (legacy)
+            'XMP-iptcExt:LocationShownProvinceState' => '$val',
         },
     },
     City => {
@@ -334,19 +340,22 @@ my $mwgLoaded;  # flag set if we alreaded Load()ed the MWG tags
         Desire => {
             0 => 'IPTC:City', # (32-character limit)
             1 => 'XMP-photoshop:City',
-            2 => 'CurrentIPTCDigest',
-            3 => 'IPTCDigest',
+            2 => 'XMP-iptcExt:LocationShownCity',
+            3 => 'CurrentIPTCDigest',
+            4 => 'IPTCDigest',
         },
         RawConv => q{
-            return $val[1] if not defined $val[2] or (defined $val[1] and
-                             (not defined $val[3] or $val[2] eq $val[3]));
-            return Image::ExifTool::MWG::RecoverTruncatedIPTC($val[0], $val[1], 32);
+            my $xmpVal = $val[2] || $val[1];
+            return $xmpVal if not defined $val[3] or (defined $xmpVal and
+                             (not defined $val[4] or $val[3] eq $val[4]));
+            return Image::ExifTool::MWG::RecoverTruncatedIPTC($val[0], $xmpVal, 32);
         },
         DelCheck   => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
         WriteCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
         WriteAlso  => {
             'IPTC:City'          => '$opts{EditGroup} = 1; $val',
-            'XMP-photoshop:City' => '$val',
+            'XMP-photoshop:City' => '$val', # (legacy)
+            'XMP-iptcExt:LocationShownCity' => '$val',
         },
     },
     Location => {
@@ -355,19 +364,22 @@ my $mwgLoaded;  # flag set if we alreaded Load()ed the MWG tags
         Desire => {
             0 => 'IPTC:Sub-location', # (32-character limit)
             1 => 'XMP-iptcCore:Location',
-            2 => 'CurrentIPTCDigest',
-            3 => 'IPTCDigest',
+            2 => 'XMP-iptcExt:LocationShownSublocation',
+            3 => 'CurrentIPTCDigest',
+            4 => 'IPTCDigest',
         },
         RawConv => q{
-            return $val[1] if not defined $val[2] or (defined $val[1] and
-                             (not defined $val[3] or $val[2] eq $val[3]));
-            return Image::ExifTool::MWG::RecoverTruncatedIPTC($val[0], $val[1], 32);
+            my $xmpVal = $val[2] || $val[1];
+            return $xmpVal if not defined $val[3] or (defined $xmpVal and
+                             (not defined $val[4] or $val[3] eq $val[4]));
+            return Image::ExifTool::MWG::RecoverTruncatedIPTC($val[0], $xmpVal, 32);
         },
         DelCheck   => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
         WriteCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
         WriteAlso  => {
             'IPTC:Sub-location'     => '$opts{EditGroup} = 1; $val',
-            'XMP-iptcCore:Location' => '$val',
+            'XMP-iptcCore:Location' => '$val', # (legacy)
+            'XMP-iptcExt:LocationShownSublocation' => '$val',
         },
     },
 );
@@ -435,7 +447,7 @@ my %sKeywordStruct;
         Name => 'RegionInfo',
         FlatName => 'Region',
         Struct => {
-            STRUCT_NAME => 'RegionInfo',
+            STRUCT_NAME => 'MWG RegionInfo',
             NAMESPACE   => 'mwg-rs',
             RegionList => {
                 FlatName => 'Region',
@@ -464,7 +476,7 @@ my %sKeywordStruct;
     Keywords => {
         Name => 'KeywordInfo',
         Struct => {
-            STRUCT_NAME => 'KeywordInfo',
+            STRUCT_NAME => 'MWG KeywordInfo',
             NAMESPACE   => 'mwg-kw',
             Hierarchy => { Struct => \%sKeywordStruct, List => 'Bag' },
         },
@@ -503,7 +515,7 @@ my %sKeywordStruct;
         FlatName => '',
         List => 'Bag',
         Struct => {
-            STRUCT_NAME => 'CollectionInfo',
+            STRUCT_NAME => 'MWG CollectionInfo',
             NAMESPACE   => 'mwg-coll',
             CollectionName => { },
             CollectionURI  => { },
@@ -563,7 +575,7 @@ sub ListToString($)
 # Notes: Sets Warning tag on error
 sub StringToList($$)
 {
-    my ($str, $exifTool) = @_;
+    my ($str, $et) = @_;
     my (@vals, $inQuotes);
     my @t = split '; ', $str, -1;
     foreach (@t) {
@@ -582,7 +594,7 @@ sub StringToList($$)
             push @vals, $_;
         }
     }
-    $exifTool->Warn('Incorrectly quoted MWG string-list value') if $inQuotes;
+    $et->Warn('Incorrectly quoted MWG string-list value') if $inQuotes;
     return @vals > 1 ? \@vals : $vals[0];
 }
 
@@ -594,11 +606,11 @@ sub StringToList($$)
 sub OverwriteStringList($$$$)
 {
     local $_;
-    my ($exifTool, $nvHash, $val, $newValuePt) = @_;
+    my ($et, $nvHash, $val, $newValuePt) = @_;
     my (@new, $delIndex);
     if ($$nvHash{DelValue} and defined $val) {
         # preserve specified old values
-        my $old = StringToList($val, $exifTool);
+        my $old = StringToList($val, $et);
         my @old = ref $old eq 'ARRAY' ? @$old : $old;
         if (@{$$nvHash{DelValue}}) {
             my %del;
@@ -634,17 +646,17 @@ sub OverwriteStringList($$$$)
 # Returns: empty string
 sub ReconcileIPTCDigest($)
 {
-    my $exifTool = shift;
+    my $et = shift;
 
     # set new value for IPTCDigest if not done already
     unless ($Image::ExifTool::Photoshop::iptcDigestInfo and
-            $exifTool->{NEW_VALUE}{$Image::ExifTool::Photoshop::iptcDigestInfo})
+            $$et{NEW_VALUE}{$Image::ExifTool::Photoshop::iptcDigestInfo})
     {
         # write new IPTCDigest only if it doesn't exist or
         # is the same as the digest of the original IPTC
         my @a; # (capture warning messages)
-        @a = $exifTool->SetNewValue('Photoshop:IPTCDigest', 'old', Protected => 1, DelValue => 1);
-        @a = $exifTool->SetNewValue('Photoshop:IPTCDigest', 'new', Protected => 1);
+        @a = $et->SetNewValue('Photoshop:IPTCDigest', 'old', Protected => 1, DelValue => 1);
+        @a = $et->SetNewValue('Photoshop:IPTCDigest', 'new', Protected => 1);
     }
     return '';
 }
@@ -715,7 +727,7 @@ must be loaded explicitly as described above.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -37,7 +37,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.04';
+$VERSION = '1.06';
 
 sub ProcessPrimer($$$);
 sub ProcessLocalSet($$$);
@@ -1365,7 +1365,7 @@ my %componentDataDef = (
     '060e2b34.0101.0103.02100101.04010000' => { Name => 'BroadcastRegion', Type => 'UTF-16' },
     '060e2b34.0101.0103.02300101.01000000' => { Name => 'NatureOfPersonality', Type => 'UTF-16' },
     '060e2b34.0101.0103.02300102.01010000' => { Name => 'ContributionStatus', Type => 'UTF-16' },
-    '060e2b34.0101.0103.02300103.01010000' => { Name => 'SupportorAdministrationStatus', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02300103.01010000' => { Name => 'SupportOrAdministrationStatus', Type => 'UTF-16' },
     '060e2b34.0101.0103.02300201.01000000' => { Name => 'OrganizationKind', Type => 'UTF-16' },
     '060e2b34.0101.0103.02300202.01010000' => { Name => 'ProductionOrganizationRole', Type => 'UTF-16' },
     '060e2b34.0101.0103.02300203.01010000' => { Name => 'SupportOrganizationRole', Type => 'UTF-16' },
@@ -2477,12 +2477,12 @@ sub ConvLatLon($)
 # Note: All types recognized here should be defined in the %knownType lookup
 sub ReadMXFValue($$$)
 {
-    my ($exifTool, $val, $type) = @_;
+    my ($et, $val, $type) = @_;
     my $len = length($val);
     local $_;
 
     if ($type eq 'UTF-16') {
-        $val = $exifTool->Decode($val, 'UCS2'); # (until we handle UTF-16 properly)
+        $val = $et->Decode($val, 'UCS2'); # (until we handle UTF-16 properly)
     } elsif ($type eq 'ProductVersion') {
         my @a = unpack('n*', $val);
         push @a, 0 while @a < 5;
@@ -2526,7 +2526,7 @@ sub ReadMXFValue($$$)
     } elsif ($type =~ /(Array|Batch)/ and $len > 16) {
         my ($count, $size) = unpack('NN', $val);
         # validate data length
-        $len == 8 + $count * $size or $exifTool->WarnOnce("Bad array or batch size");
+        $len == 8 + $count * $size or $et->WarnOnce("Bad array or batch size");
         my ($i, @a);
         for ($i=0; $i<$count; ++$i) {
             my $pos = 8 + $i * $size;
@@ -2536,7 +2536,7 @@ sub ReadMXFValue($$$)
         if ($type =~ /^StrongReference/) {
             $_ = join('-', unpack('H8H4H4H4H12', $_)) foreach @a;
         } elsif ($type eq 'BatchOfUL' or $type =~ /^WeakReference/) {
-            $_ = ReadMXFValue($exifTool, $_, 'UL') foreach @a;
+            $_ = ReadMXFValue($et, $_, 'UL') foreach @a;
         }
         $val = \@a;
     } elsif ($len == 32) {
@@ -2569,16 +2569,16 @@ sub ReadMXFValue($$$)
 # Returns: 1 on success
 sub ProcessPrimer($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $end = $$dirInfo{DirLen};
     return 0 unless $end > 8;
     my $count = Get32u($dataPt, 0);
     my $size = Get32u($dataPt, 4);
     return 0 unless $size >= 18;
-    $exifTool->VerboseDir('MXF Primer', $count);
-    my $verbose = $exifTool->Options('Verbose');
-    my $primer = $$exifTool{MXFInfo}{Primer};
+    $et->VerboseDir('MXF Primer', $count);
+    my $verbose = $et->Options('Verbose');
+    my $primer = $$et{MXFInfo}{Primer};
     my $pos = 8;
     my $i;
     for ($i=0; $i<$count; ++$i) {
@@ -2592,7 +2592,7 @@ sub ProcessPrimer($$$)
         next unless $verbose;
         my $indx = $i . ')';
         $indx .= ' ' if length($indx) < 3;
-        $exifTool->VPrint(0, sprintf("  | $indx 0x%.4x => '$global'\n", $local));
+        $et->VPrint(0, sprintf("  | $indx 0x%.4x => '$global'\n", $local));
     }
     return 1;
 }
@@ -2603,16 +2603,16 @@ sub ProcessPrimer($$$)
 # Returns: 1 on success
 sub ProcessLocalSet($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     local $_;
     my $dataPt = $$dirInfo{DataPt};
     my $dataPos = $$dirInfo{DataPos};
     my $end = $$dirInfo{DirLen};
-    my $mxfInfo = $$exifTool{MXFInfo};
+    my $mxfInfo = $$et{MXFInfo};
     my $primer = $$mxfInfo{Primer};
     my (@strongRef, @groups, $instance, $editRate, $trackID, $langCode, $textLang);
 
-    $exifTool->VerboseDir('MXF LocalSet', undef, $end);
+    $et->VerboseDir('MXF LocalSet', undef, $end);
 
     # loop through all tags in this local set
     my $pos = 0;
@@ -2627,7 +2627,7 @@ sub ProcessLocalSet($$$)
             $extra = sprintf(', Local 0x%.4x', $loc);
         } else {
             $tag = $loc;
-          # $exifTool->WarnOnce('Missing local key for at least one tag');
+          # $et->WarnOnce('Missing local key for at least one tag');
             $extra = ', NOT IN PRIMER!';
         }
         my $tagInfo = $$tagTablePtr{$tag};
@@ -2635,7 +2635,7 @@ sub ProcessLocalSet($$$)
         if ($tagInfo) {
             $type = $$tagInfo{Type};
             if ($type and $knownType{$type}) {
-                $val = ReadMXFValue($exifTool, substr($$dataPt, $pos, $len), $type);
+                $val = ReadMXFValue($et, substr($$dataPt, $pos, $len), $type);
                 push @strongRef, (ref $val ? @$val : $val) if $type =~ /^StrongReference/;
                 # remember instance UID of this local set
                 if ($$tagInfo{Name} eq 'InstanceUID') {
@@ -2649,12 +2649,12 @@ sub ProcessLocalSet($$$)
             }
         }
         # get tagInfo ref the standard way to handle Unknown tags
-        $tagInfo = $langInfo || $exifTool->GetTagInfo($tagTablePtr, $tag);
+        $tagInfo = $langInfo || $et->GetTagInfo($tagTablePtr, $tag);
         # set Binary flag to extract all unknown-format tags as Binary data
         if ($tagInfo and $$tagInfo{Unknown} and not defined $$tagInfo{Binary}) {
             $$tagInfo{Binary} = not ($$tagInfo{Format} or ($type and $knownType{$type}));
         }
-        my $key = $exifTool->HandleTag($tagTablePtr, $tag, $val,
+        my $key = $et->HandleTag($tagTablePtr, $tag, $val,
             Extra       => $extra,
             TagInfo     => $tagInfo,
             DataPt      => $dataPt,
@@ -2668,17 +2668,17 @@ sub ProcessLocalSet($$$)
         # save information to allow later fixup of durations and group1 names
         # (necessary because we don't have all the information we need
         #  to do this on the fly when the file is parsed linearly)
-        push @groups, $$exifTool{TAG_EXTRA}{$key};
+        push @groups, $$et{TAG_EXTRA}{$key};
         next unless $tagInfo;
         my $name = $$tagInfo{Name};
         if ($$tagInfo{IsDuration}) {
             $$mxfInfo{FixDuration}{$key} = 1;
         } elsif ($$tagInfo{LanguageCode}) {
-            $langCode = $$exifTool{VALUE}{$key};
+            $langCode = $$et{VALUE}{$key};
         } elsif ($name eq 'EditRate') {
-            $editRate = $$exifTool{VALUE}{$key};
+            $editRate = $$et{VALUE}{$key};
         } elsif ($name =~ /TrackID$/) {
-            $trackID = $$exifTool{VALUE}{$key};
+            $trackID = $$et{VALUE}{$key};
             unless ($$mxfInfo{Group1}{$trackID}) {
                 # save lookup to convert TrackID to our group 1 name
                 $$mxfInfo{Group1}{$trackID} = 'Track' . ++$$mxfInfo{NumTracks};
@@ -2700,7 +2700,7 @@ sub ProcessLocalSet($$$)
         }
         # save instance UID's in groups hash (used to remove duplicates later)
         $$_{UID} = $instance foreach @groups;
-        $$objInfo{Name} = $$exifTool{DIR_NAME};
+        $$objInfo{Name} = $$et{DIR_NAME};
         $$objInfo{TrackID} = $trackID if defined $trackID;
         $$objInfo{EditRate} = $editRate if $editRate;
         if ($langCode) {
@@ -2718,7 +2718,7 @@ sub ProcessLocalSet($$$)
             }
         }
         # save instance UID's of Preface's
-        push @{$$mxfInfo{Preface}}, $instance if $$exifTool{DIR_NAME} eq 'Preface';
+        push @{$$mxfInfo{Preface}}, $instance if $$et{DIR_NAME} eq 'Preface';
     }
     return 1;
 }
@@ -2783,10 +2783,10 @@ sub SetGroups($$;$$)
 # Inputs: 0) ExifTool object ref, 1) MXF information hash ref
 sub ConvertDurations($$)
 {
-    my ($exifTool, $mxfInfo) = @_;
-    my $valueHash = $$exifTool{VALUE};
-    my $infoHash = $$exifTool{TAG_INFO};
-    my $tagExtra = $$exifTool{TAG_EXTRA};
+    my ($et, $mxfInfo) = @_;
+    my $valueHash = $$et{VALUE};
+    my $infoHash = $$et{TAG_INFO};
+    my $tagExtra = $$et{TAG_EXTRA};
     my $editHash = $$mxfInfo{EditRate};
     my ($tag, $key, $i);
     foreach $tag (keys %{$$mxfInfo{FixDuration}}) {
@@ -2807,10 +2807,10 @@ sub ConvertDurations($$)
 # Returns: 1 on success, 0 if this wasn't a valid MXF file
 sub ProcessMXF($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
-    my $verbose = $exifTool->Options('Verbose');
-    my $unknown = $exifTool->Options('Unknown');
+    my $verbose = $et->Options('Verbose');
+    my $unknown = $et->Options('Unknown');
     my ($buff, $preface, $n, $headerEnd, $footerPos);
 
     # read enough to allow skipping over run-in if it exists
@@ -2818,9 +2818,9 @@ sub ProcessMXF($$)
     $buff =~ /\x06\x0e\x2b\x34\x02\x05\x01\x01\x0d\x01\x02/g or return 0;
     my $start = pos($buff) - 11;
 
-    $exifTool->SetFileType();
+    $et->SetFileType();
     SetByteOrder('MM');
-    $raf->Seek($start, 0) or $exifTool->Warn('Seek error'), return 1;
+    $raf->Seek($start, 0) or $et->Warn('Seek error'), return 1;
     my $tagTablePtr = GetTagTable('Image::ExifTool::MXF::Main');
 
     # determine header length and type
@@ -2833,10 +2833,10 @@ sub ProcessMXF($$)
         FixDuration => { }, # names of all Duration tags that need fixing
         Preface => [ ],     # instance UID's for all Preface objects
     );
-    $$exifTool{MXFInfo} = \%mxfInfo;
+    $$et{MXFInfo} = \%mxfInfo;
 
     # set group 1 name for all tags (so we can overwrite with track number later)
-    $$exifTool{SET_GROUP1} = 'MXF';
+    $$et{SET_GROUP1} = 'MXF';
 
     for (;;) {
         my $pos = $raf->Tell();
@@ -2847,7 +2847,7 @@ sub ProcessMXF($$)
             undef $headerEnd;   # (only test this once)
             # skip directly to footer if possible
             if ($footerPos and $footerPos > $pos and (not $verbose or not $unknown)) {
-                $exifTool->VPrint(0, "[Skipping to footer. Use Unknown option to parse body partitions]\n");
+                $et->VPrint(0, "[Skipping to footer. Use Unknown option to parse body partitions]\n");
                 $raf->Seek($footerPos, 0) or last;
                 $pos = $footerPos;
             }
@@ -2893,7 +2893,7 @@ sub ProcessMXF($$)
             $raf->Read($buff, $len) == $len or last; # get KLV Value
             $dataPt = \$buff;
             my $type = $$tagInfo{Type};
-            $val = ReadMXFValue($exifTool, $buff, $type) if $type and $knownType{$type};
+            $val = ReadMXFValue($et, $buff, $type) if $type and $knownType{$type};
         } elsif (($tagInfo and (not $$tagInfo{Unknown} or $unknown)) or $verbose) {
             if ($tagInfo) {
                 # set Binary flag to extract all unknown-format tags as Binary data
@@ -2920,7 +2920,7 @@ sub ProcessMXF($$)
             $raf->Seek($len, 1) or last;    # skip this value
             next;
         }
-        $exifTool->HandleTag($tagTablePtr, $ul, $val,
+        $et->HandleTag($tagTablePtr, $ul, $val,
             TagInfo     => $tagInfo,
             DataPt      => $dataPt,
             DataPos     => $pos + 17 + $n,
@@ -2930,16 +2930,16 @@ sub ProcessMXF($$)
     }
     # walk entire MXF object tree to fix family 1 group names
     my ($pathInfo, $tag, %did, %bestDur);
-    $pathInfo = { Path => [ 'MXF' ] } if $exifTool->Options('SavePath');
+    $pathInfo = { Path => [ 'MXF' ] } if $et->Options('SavePath');
     foreach $preface (@{$mxfInfo{Preface}}) {
         SetGroups(\%mxfInfo, $preface, $pathInfo);
     }
     # convert Duration values to seconds based on the appropriate EditRate
-    ConvertDurations($exifTool, \%mxfInfo);
+    ConvertDurations($et, \%mxfInfo);
 
     # remove tags to keep only the one from the most recent instance of the object
-    my $tagExtra = $$exifTool{TAG_EXTRA};
-    my $fileOrder = $$exifTool{FILE_ORDER};
+    my $tagExtra = $$et{TAG_EXTRA};
+    my $fileOrder = $$et{FILE_ORDER};
     # also determine our best Duration value
     if ($mxfInfo{BestDuration}) {
         my $instance = $mxfInfo{BestDuration}{Source} || $mxfInfo{BestDuration}{Other};
@@ -2952,20 +2952,20 @@ sub ProcessMXF($$)
         $tag =~ /^(\S+)/;               # get tag name without index number
         my $utag = "$1 $instance";      # instance-specific tag name
         if ($did{$utag}) {
-            Image::ExifTool::DeleteTag($exifTool, $tag); # delete the duplicate
+            Image::ExifTool::DeleteTag($et, $tag); # delete the duplicate
         } else {
             $did{$utag} = 1;
             if ($bestDur{$utag}) {
                 # save best duration value
-                my $val = $$exifTool{VALUE}{$tag};
-                $exifTool->HandleTag($tagTablePtr, '060e2b34.0101.0102.07020201.01030000', $val);
+                my $val = $$et{VALUE}{$tag};
+                $et->HandleTag($tagTablePtr, '060e2b34.0101.0102.07020201.01030000', $val);
             }
         }
     }
 
     # clean up and return
-    delete $$exifTool{SET_GROUP1};
-    delete $$exifTool{MXFInfo};
+    delete $$et{SET_GROUP1};
+    delete $$et{MXFInfo};
     return 1;
 }
 
@@ -2988,7 +2988,7 @@ information from MXF (Material Exchange Format) files.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -17,10 +17,11 @@ sub ProcessUnknown($$$);
 sub ProcessUnknownOrPreview($$$);
 sub ProcessCanon($$$);
 sub ProcessGE2($$$);
+sub ProcessKodakPatch($$$);
 sub WriteUnknownOrPreview($$$);
 sub FixLeicaBase($$;$);
 
-$VERSION = '1.78';
+$VERSION = '1.89';
 
 my $debug;          # set to 1 to enable debugging code
 
@@ -33,6 +34,16 @@ my $debug;          # set to 1 to enable debugging code
 @Image::ExifTool::MakerNotes::Main = (
     # decide which MakerNotes to use (based on camera make/model)
     {
+        Name => 'MakerNoteApple',
+        Condition => '$$valPt =~ /^Apple iOS\0/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Apple::Main',
+            ByteOrder => 'Unknown',
+            Start => '$valuePtr + 14',
+            Base => '$start - 14',
+        },
+    },
+    {
         # this maker notes starts with a standard TIFF header at offset 0x0a
         # (must check Nikon signature first because Nikon Capture NX can generate
         #  NEF images containing Nikon maker notes from JPEG images of any camera model)
@@ -342,6 +353,24 @@ my $debug;          # set to 1 to enable debugging code
     },
     {
         Name => 'MakerNoteKodak8b',
+        # these maker notes have an extra 2 bytes after the entry count
+        # (this is handled by the patch).  Also, the IFD uses a Format 13,
+        # which is some 2-byte format (not Float, as decoded by ExifTool)
+        # - written by the PixPro AZ251, AZ361, AZ262, AZ521
+        Condition => q{
+            $$self{Make}=~/Kodak/i and
+            $$valPt =~ /^MM\0\x2a\0\0\0\x08\0.\0\0/
+        },
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::Type8',
+            ProcessProc => \&ProcessKodakPatch,
+            ByteOrder => 'BigEndian',
+            Start => '$valuePtr + 8',
+            Base => '$start - 8',
+        },
+    },
+    {
+        Name => 'MakerNoteKodak8c',
         # TIFF-format maker notes
         Condition => q{
             $$self{Make}=~/Kodak/i and
@@ -506,7 +535,10 @@ my $debug;          # set to 1 to enable debugging code
     {
         Name => 'MakerNoteLeica3', # used by the R8 and R9
         # (starts with IFD)
-        Condition => '$$self{Make} =~ /^Leica Camera AG/ and $$valPt !~ /^LEICA/ and $$self{Model} ne "S2"',
+        Condition => q{
+            $$self{Make} =~ /^Leica Camera AG/ and $$valPt !~ /^LEICA/ and
+            $$self{Model} ne "S2" and $$self{Model} ne "LEICA M (Typ 240)"
+        },
         SubDirectory => {
             TagTable => 'Image::ExifTool::Panasonic::Leica3',
             Start => '$valuePtr',
@@ -528,7 +560,8 @@ my $debug;          # set to 1 to enable debugging code
         Name => 'MakerNoteLeica5', # used by the X1/X2
         # (X1 starts with "LEICA\0\x01\0", Make is "LEICA CAMERA AG")
         # (X2 starts with "LEICA\0\x05\0", Make is "LEICA CAMERA AG")
-        Condition => '$$valPt =~ /^LEICA\0[\x01\x05]\0/',
+        # (X VARIO starts with "LEICA\0\x04\0", Make is "LEICA CAMERA AG")
+        Condition => '$$valPt =~ /^LEICA\0[\x01\x04\x05]\0/',
         SubDirectory => {
             TagTable => 'Image::ExifTool::Panasonic::Leica5',
             Start => '$valuePtr + 8',
@@ -537,11 +570,12 @@ my $debug;          # set to 1 to enable debugging code
         },
     },
     {
-        Name => 'MakerNoteLeica6', # used by the S2 (CAUTION: this tag name is special cased in the code)
-        # (S2 starts with "LEICA\0\x02\xff", Make is "LEICA CAMERA AG",
+        Name => 'MakerNoteLeica6', # used by the S2 and M (Typ 240)
+        # (starts with "LEICA\0\x02\xff", Make is "Leica Camera AG",
         #  but maker notes aren't loaded at the time this is tested)
-        Condition => '$$self{Model} eq "S2"',
+        Condition => '$$self{Model} eq "S2" or $$self{Model} eq "LEICA M (Typ 240)"',
         DataTag => 'LeicaTrailer',  # (generates fixup name for this tag)
+        LeicaTrailer => 1, # flag to special-case this tag in the Exif code
         SubDirectory => {
             TagTable => 'Image::ExifTool::Panasonic::Leica6',
             Start => '$valuePtr + 8',
@@ -549,7 +583,7 @@ my $debug;          # set to 1 to enable debugging code
             # NOTE: Leica uses absolute file offsets when this maker note is stored
             # as a JPEG trailer -- this case is handled by ProcessLeicaTrailer in
             # Panasonic.pm, and any "Base" defined here is ignored for this case.
-            # ExifTool may also create S2 maker notes inside the APP1 segment when
+            # ExifTool may also create S2/M maker notes inside the APP1 segment when
             # copying from other files, and for this the normal EXIF offsets are used,
             # Base should not be defined!
         },
@@ -666,7 +700,10 @@ my $debug;          # set to 1 to enable debugging code
     },
     {
         Name => 'MakerNoteReconyx',
-        Condition => '$$valPt =~ /^\x01\xf1[\x02\x03]\x00/',
+        Condition => q{
+            $$valPt =~ /^\x01\xf1([\x02\x03]\x00)?/ and
+            ($1 or $$self{Make} eq "RECONYX")
+        },
         SubDirectory => {
             TagTable => 'Image::ExifTool::Reconyx::Main',
             ByteOrder => 'Little-endian',
@@ -675,7 +712,9 @@ my $debug;          # set to 1 to enable debugging code
     {
         Name => 'MakerNoteRicoh',
         # (my test R50 image starts with "      \x02\x01" - PH)
-        Condition => '$$self{Make}=~/^RICOH/ and $$valPt=~/^(Ricoh|      )/i',
+        # (the HZ15 starts with "MM\0\x2a" but an extra 2 bytes of padding after
+        #  the IFD entry count prevents these from being processed as a standard IFD)
+        Condition => '$$self{Make}=~/^(PENTAX )?RICOH/ and $$valPt=~/^(Ricoh|      |MM\0\x2a|II\x2a\0)/i',
         SubDirectory => {
             TagTable => 'Image::ExifTool::Ricoh::Main',
             Start => '$valuePtr + 8',
@@ -703,7 +742,7 @@ my $debug;          # set to 1 to enable debugging code
         # Samsung STMN maker notes WITH PreviewImage
         Condition => '$$valPt =~ /^STMN\d{3}/',
         SubDirectory => {
-            TagTable => 'Image::ExifTool::Samsung::Type1',
+            TagTable => 'Image::ExifTool::Samsung::Main',
         },
     },
     {
@@ -771,7 +810,9 @@ my $debug;          # set to 1 to enable debugging code
     {
         Name => 'MakerNoteSony',
         # (starts with "SONY DSC \0" or "SONY CAM \0")
-        Condition => '$$self{Make}=~/^SONY/ and $$valPt=~/^SONY (DSC|CAM)/',
+        # (TF1 starts with "\0\0SONY PIC\0")
+        # (Hasselblad models start with "VHAB     \0")
+        Condition => '$$valPt=~/^(SONY (DSC|CAM)|\0\0SONY PIC\0|VHAB     \0)/',
         SubDirectory => {
             TagTable => 'Image::ExifTool::Sony::Main',
             Start => '$valuePtr + 12',
@@ -781,7 +822,7 @@ my $debug;          # set to 1 to enable debugging code
     {
         Name => 'MakerNoteSony2',
         # (starts with "SONY PI\0" -- DSC-S650/S700/S750)
-        Condition => '$$self{Make}=~/^SONY/ and $$valPt=~/^SONY PI\0/ and $$self{OlympusCAMER}=1',
+        Condition => '$$valPt=~/^SONY PI\0/ and $$self{OlympusCAMER}=1',
         SubDirectory => {
             TagTable => 'Image::ExifTool::Olympus::Main',
             Start => '$valuePtr + 12',
@@ -791,7 +832,7 @@ my $debug;          # set to 1 to enable debugging code
     {
         Name => 'MakerNoteSony3',
         # (starts with "PREMI\0" -- DSC-S45/S500)
-        Condition => '$$self{Make}=~/^SONY/ and $$valPt=~/^(PREMI)\0/ and $$self{OlympusCAMER}=1',
+        Condition => '$$valPt=~/^(PREMI)\0/ and $$self{OlympusCAMER}=1',
         SubDirectory => {
             TagTable => 'Image::ExifTool::Olympus::Main',
             Start => '$valuePtr + 8',
@@ -799,7 +840,13 @@ my $debug;          # set to 1 to enable debugging code
         },
     },
     {
-        Name => 'MakerNoteSony4', # used in SR2 and ARW images
+        Name => 'MakerNoteSony4',
+        # (starts with "SONY PIC\0" -- DSC-H200/J20/W370/W510, MHS-TS20)
+        Condition => '$$valPt=~/^SONY PIC\0/',
+        SubDirectory => { TagTable => 'Image::ExifTool::Sony::PIC' },
+    },    
+    {
+        Name => 'MakerNoteSony5', # used in SR2 and ARW images
         Condition => '$$self{Make}=~/^SONY/ and $$valPt!~/^\x01\x00/',
         SubDirectory => {
             TagTable => 'Image::ExifTool::Sony::Main',
@@ -876,10 +923,10 @@ foreach $tagInfo (@Image::ExifTool::MakerNotes::Main) {
 # Notes: Directory size should be validated before calling this routine
 sub GetMakerNoteOffset($)
 {
-    my $exifTool = shift;
+    my $et = shift;
     # figure out where we expect the value data based on camera type
-    my $make = $exifTool->{Make};
-    my $model = $exifTool->{Model};
+    my $make = $$et{Make};
+    my $model = $$et{Model};
     my ($relative, @offsets);
 
     # normally value data starts 4 bytes after end of directory, so this is the default.
@@ -896,7 +943,7 @@ sub GetMakerNoteOffset($)
         # Casio AVI and MOV images use no padding, and their JPEG's use 4,
         # except some models like the EX-S770,Z65,Z70,Z75 and Z700 which use 16,
         # and the EX-Z35 which uses 2 (grrrr...)
-        push @offsets, $$exifTool{FILE_TYPE} =~ /^(RIFF|MOV)$/ ? 0 : (4, 16, 2);
+        push @offsets, $$et{FILE_TYPE} =~ /^(RIFF|MOV)$/ ? 0 : (4, 16, 2);
     } elsif ($make =~ /^(General Imaging Co.|GEDSC IMAGING CORP.)/i) {
         push @offsets, 0;
     } elsif ($make =~ /^KYOCERA/) {
@@ -904,7 +951,9 @@ sub GetMakerNoteOffset($)
     } elsif ($make =~ /^Leica Camera AG/) {
         if ($model eq 'S2') {
             # lots of empty space before first value in S2 images
-            push @offsets, 4, ($$exifTool{FILE_TYPE} eq 'JPEG' ? 286 : 274);
+            push @offsets, 4, ($$et{FILE_TYPE} eq 'JPEG' ? 286 : 274);
+        } elsif ($model eq 'LEICA M (Typ 240)') {
+            push @offsets, 4, 118;
         } elsif ($model =~ /^(R8|R9|M8)\b/) {
             push @offsets, 6;
         } else {
@@ -922,7 +971,7 @@ sub GetMakerNoteOffset($)
     } elsif ($make =~ /^SONY/) {
         # earlier DSLR and "PREMI" models use an offset of 4
         if ($model =~ /^(DSLR-.*|SLT-A(33|35|55V)|NEX-(3|5|C3|VG10E))$/ or
-            $$exifTool{OlympusCAMER})
+            $$et{OlympusCAMER})
         {
             push @offsets, 4;
         } else {
@@ -1004,7 +1053,7 @@ sub GetValueBlocks($$;$)
 sub FixBase($$)
 {
     local $_;
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     # don't fix base if fixing offsets individually or if we don't want to fix them
     return 0 if $$dirInfo{FixOffsets} or $$dirInfo{NoFixBase};
 
@@ -1013,7 +1062,7 @@ sub FixBase($$)
     my $dirStart = $$dirInfo{DirStart} || 0;
     my $entryBased = $$dirInfo{EntryBased};
     my $dirName = $$dirInfo{DirName};
-    my $fixBase = $exifTool->Options('FixBase');
+    my $fixBase = $et->Options('FixBase');
     my $setBase = (defined $fixBase and $fixBase ne '') ? 1 : 0;
     my ($fix, $fixedBy, %tagPtr);
 
@@ -1025,7 +1074,7 @@ sub FixBase($$)
 #
 # handle special case of Canon maker notes with TIFF footer containing original offset
 #
-    if ($$exifTool{Make} =~ /^Canon/ and $$dirInfo{DirLen} > 8) {
+    if ($$et{Make} =~ /^Canon/ and $$dirInfo{DirLen} > 8) {
         my $footerPos = $dirStart + $$dirInfo{DirLen} - 8;
         my $footer = substr($$dataPt, $footerPos, 8);
         if ($footer =~ /^(II\x2a\0|MM\0\x2a)/ and  # check for TIFF footer
@@ -1047,11 +1096,11 @@ sub FixBase($$)
                 # ignore footer offset only if end difference is exactly correct
                 # (allow for possible padding byte, although I have never seen this)
                 if (not $endDiff or $endDiff == 1) {
-                    $exifTool->Warn('Canon maker note footer may be invalid (ignored)',1);
+                    $et->Warn('Canon maker note footer may be invalid (ignored)',1);
                     return 0;
                 }
             }
-            $exifTool->Warn("Adjusted $dirName base by $fix",1);
+            $et->Warn("Adjusted $dirName base by $fix",1);
             $$dirInfo{FixedBy} = $fix;
             $$dirInfo{Base} += $fix;
             $$dirInfo{DataPos} -= $fix;
@@ -1066,9 +1115,9 @@ sub FixBase($$)
     my $minPt = $$dirInfo{MinOffset} = $valPtrs[0]; # if life were simple, this would be it
     my $ifdLen = 2 + 12 * Get16u($$dirInfo{DataPt}, $dirStart);
     my $ifdEnd = $dirStart + $ifdLen;
-    my ($relative, @offsets) = GetMakerNoteOffset($exifTool);
+    my ($relative, @offsets) = GetMakerNoteOffset($et);
     my $makeDiff = $offsets[0];
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     my ($diff, $shift);
 
     # calculate expected minimum value offset
@@ -1109,14 +1158,14 @@ sub FixBase($$)
         # looks like these offsets are entry-based, so use the offsets
         # which have been correcting for individual entry position
         $entryBased = 1;
-        $verbose and $exifTool->Warn("$dirName offsets are entry-based",1);
+        $verbose and $et->Warn("$dirName offsets are entry-based",1);
     } else {
         # calculate offset difference from end of IFD to first value
         $diff = ($minPt - $dataPos) - $ifdEnd;
         $shift = 0;
-        $countOverlap and $exifTool->Warn("Overlapping $dirName values",1);
+        $countOverlap and $et->Warn("Overlapping $dirName values",1);
         if ($entryBased) {
-            $exifTool->Warn("$dirName offsets do NOT look entry-based",1);
+            $et->Warn("$dirName offsets do NOT look entry-based",1);
             undef $entryBased;
             undef $relative;
         }
@@ -1131,8 +1180,8 @@ sub FixBase($$)
             return 0 if $diff >=0 and $diff <= 24;
         }
         # ******** (used for testing to extract differences) ********
-        # $exifTool->FoundTag('Diff', $diff);
-        # $exifTool->FoundTag('MakeDiff',$makeDiff);
+        # $et->FoundTag('Diff', $diff);
+        # $et->FoundTag('MakeDiff',$makeDiff);
     }
 #
 # handle entry-based offsets
@@ -1191,13 +1240,13 @@ sub FixBase($$)
     } else {
         # print warning unless difference looks reasonable
         if ($diff < 0 or $diff > 16 or ($diff & 0x01)) {
-            $exifTool->Warn("Possibly incorrect maker notes offsets (fix by $fix?)",1);
+            $et->Warn("Possibly incorrect maker notes offsets (fix by $fix?)",1);
         }
         # don't do the fix (but we already adjusted base if entry-based)
         return $shift;
     }
     if (defined $fixedBy) {
-        $exifTool->Warn("Adjusted $dirName base by $fixedBy",1);
+        $et->Warn("Adjusted $dirName base by $fixedBy",1);
         $$dirInfo{FixedBy} = $fixedBy;
     }
     $$dirInfo{Base} += $fix;
@@ -1215,7 +1264,7 @@ sub FixBase($$)
 # Note: Changes byte ordering!
 sub LocateIFD($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirStart = $$dirInfo{DirStart} || 0;
     # (ignore MakerNotes DirLen since sometimes this is incorrect)
@@ -1264,7 +1313,7 @@ sub LocateIFD($$)
                     if ($$subdir{ProcessProc} and $$subdir{ProcessProc} eq \&FixLeicaBase) {
                         my $oldStart = $$dirInfo{DirStart};
                         $$dirInfo{DirStart} = $newStart;
-                        FixLeicaBase($exifTool, $dirInfo);
+                        FixLeicaBase($et, $dirInfo);
                         $$dirInfo{DirStart} = $oldStart;
                     }
                 }
@@ -1344,19 +1393,19 @@ IFD_TRY: for ($offset=$firstTry; $offset<=$lastTry; $offset+=2) {
                 my $count = Get32u($dataPt, $entry+4);
                 unless ($format) {
                     # patch for buggy Samsung NX200 JPEG MakerNotes entry count
-                    if ($num == 23 and $index == 21 and $$exifTool{Make} eq 'SAMSUNG') {
+                    if ($num == 23 and $index == 21 and $$et{Make} eq 'SAMSUNG') {
                         Set16u(21, $dataPt, $pos);  # really 21 IFD entries!
-                        $exifTool->Warn('Fixed incorrect Makernote entry count', 1);
+                        $et->Warn('Fixed incorrect Makernote entry count', 1);
                         last;
                     }
                     # allow everything to be zero if not first entry
                     # because some manufacturers pad with null entries
                     next unless $count or $index == 0;
                     # patch for Canon EOS 40D firmware 1.0.4 bug: allow zero format for last entry
-                    next if $index==$num-1 and $$exifTool{Model}=~/EOS 40D/;
+                    next if $index==$num-1 and $$et{Model}=~/EOS 40D/;
                 }
                 # patch for Sony cameras like the DSC-P10 that have invalid MakerNote entries
-                next if $num == 12 and $$exifTool{Make} eq 'SONY' and $index >= 8;
+                next if $num == 12 and $$et{Make} eq 'SONY' and $index >= 8;
                 # (would like to verify tag ID, but some manufactures don't
                 #  sort entries in order of tag ID so we don't have much of
                 #  a handle to verify this field)
@@ -1388,7 +1437,7 @@ IFD_TRY: for ($offset=$firstTry; $offset<=$lastTry; $offset+=2) {
 # Returns: 1 on success, and updates $dirInfo if necessary for new directory
 sub FixLeicaBase($$;$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirStart = $$dirInfo{DirStart} || 0;
     # get hash of value block positions
@@ -1405,7 +1454,7 @@ sub FixLeicaBase($$;$)
     }
     my $success = 1;
     if ($tagTablePtr) {
-        $success = Image::ExifTool::Exif::ProcessExif($exifTool, $dirInfo, $tagTablePtr);
+        $success = Image::ExifTool::Exif::ProcessExif($et, $dirInfo, $tagTablePtr);
     }
     return $success;
 }
@@ -1416,10 +1465,10 @@ sub FixLeicaBase($$;$)
 # Returns: 1 on success
 sub ProcessCanon($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     # identify Canon MakerNote footer in HtmlDump
     # (this code moved from FixBase so it also works for Adobe MakN in DNG images)
-    if ($$exifTool{HTML_DUMP} and $$dirInfo{DirLen} > 8) {
+    if ($$et{HTML_DUMP} and $$dirInfo{DirLen} > 8) {
         my $dataPos = $$dirInfo{DataPos};
         my $dirStart = $$dirInfo{DirStart} || 0;
         my $footerPos = $dirStart + $$dirInfo{DirLen} - 8;
@@ -1432,11 +1481,11 @@ sub ProcessCanon($$$)
                 $str .= sprintf("\nCurrent maker note offset: 0x%.4x", $newOffset);
             }
             my $filePos = ($$dirInfo{Base} || 0) + $dataPos + $footerPos;
-            $exifTool->HDump($filePos, 8, '[Canon MakerNotes footer]', $str);
+            $et->HDump($filePos, 8, '[Canon MakerNotes footer]', $str);
         }
     }
     # process as normal
-    return Image::ExifTool::Exif::ProcessExif($exifTool, $dirInfo, $tagTablePtr);
+    return Image::ExifTool::Exif::ProcessExif($et, $dirInfo, $tagTablePtr);
 }
 
 #------------------------------------------------------------------------------
@@ -1445,14 +1494,31 @@ sub ProcessCanon($$$)
 # Returns: 1 on success
 sub ProcessGE2($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt} or return 0;
     my $dirStart = $$dirInfo{DirStart} || 0;
 
     # these maker notes are missing the IFD entry count, but they
     # always have 25 entries, so write the entry count manually
     Set16u(25, $dataPt, $dirStart);
-    return Image::ExifTool::Exif::ProcessExif($exifTool, $dirInfo, $tagTablePtr);
+    return Image::ExifTool::Exif::ProcessExif($et, $dirInfo, $tagTablePtr);
+}
+
+#------------------------------------------------------------------------------
+# Process broken Kodak type 8b maker notes
+# Inputs: 0) ExifTool object ref, 1) DirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessKodakPatch($$$)
+{
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt} or return 0;
+    my $dirStart = $$dirInfo{DirStart} || 0;
+
+    # these maker notes have 2 extra bytes after the entry count, so fix this
+    return 0 unless $$dirInfo{DirLen} > 2;
+    Set16u(Get16u($dataPt,$dirStart), $dataPt, $dirStart+2);
+    $$dirInfo{DirStart} += 2;
+    return Image::ExifTool::Exif::ProcessExif($et, $dirInfo, $tagTablePtr);
 }
 
 #------------------------------------------------------------------------------
@@ -1461,21 +1527,21 @@ sub ProcessGE2($$$)
 # Returns: 1 on success, and updates $dirInfo if necessary for new directory
 sub ProcessUnknownOrPreview($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirStart = $$dirInfo{DirStart};
     my $dirLen = $$dirInfo{DirLen};
     # check to see if this is a preview image
     if ($dirLen > 6 and substr($$dataPt, $dirStart, 3) eq "\xff\xd8\xff") {
-        $exifTool->VerboseDir('PreviewImage');
-        if ($$exifTool{HTML_DUMP}) {
+        $et->VerboseDir('PreviewImage');
+        if ($$et{HTML_DUMP}) {
             my $pos = $$dirInfo{DataPos} + $$dirInfo{Base} + $dirStart;
-            $exifTool->HDump($pos, $dirLen, '(MakerNotes:PreviewImage data)', "Size: $dirLen bytes")
+            $et->HDump($pos, $dirLen, '(MakerNotes:PreviewImage data)', "Size: $dirLen bytes")
         }
-        $exifTool->FoundTag('PreviewImage', substr($$dataPt, $dirStart, $dirLen));
+        $et->FoundTag('PreviewImage', substr($$dataPt, $dirStart, $dirLen));
         return 1;
     }
-    return ProcessUnknown($exifTool, $dirInfo, $tagTablePtr);
+    return ProcessUnknown($et, $dirInfo, $tagTablePtr);
 }
 
 #------------------------------------------------------------------------------
@@ -1484,27 +1550,27 @@ sub ProcessUnknownOrPreview($$$)
 # Returns: directory data, '' to delete, or undef on error
 sub WriteUnknownOrPreview($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirStart = $$dirInfo{DirStart};
     my $dirLen = $$dirInfo{DirLen};
     my $newVal;
     # check to see if this is a preview image
     if ($dirLen > 6 and substr($$dataPt, $dirStart, 3) eq "\xff\xd8\xff") {
-        if ($$exifTool{NEW_VALUE}{$Image::ExifTool::Extra{PreviewImage}}) {
+        if ($$et{NEW_VALUE}{$Image::ExifTool::Extra{PreviewImage}}) {
             # write or delete new preview (if deleted, it can't currently be added back again)
-            $newVal = $exifTool->GetNewValues('PreviewImage') || '';
-            if ($exifTool->Options('Verbose') > 1) {
-                $exifTool->VerboseValue("- MakerNotes:PreviewImage", substr($$dataPt, $dirStart, $dirLen));
-                $exifTool->VerboseValue("+ MakerNotes:PreviewImage", $newVal) if $newVal;
+            $newVal = $et->GetNewValues('PreviewImage') || '';
+            if ($et->Options('Verbose') > 1) {
+                $et->VerboseValue("- MakerNotes:PreviewImage", substr($$dataPt, $dirStart, $dirLen));
+                $et->VerboseValue("+ MakerNotes:PreviewImage", $newVal) if $newVal;
             }
-            ++$$exifTool{CHANGED};
+            ++$$et{CHANGED};
         } else {
             $newVal = substr($$dataPt, $dirStart, $dirLen);
         }
     } else {
         # rewrite MakerNote IFD
-        $newVal = Image::ExifTool::Exif::WriteExif($exifTool, $dirInfo, $tagTablePtr);
+        $newVal = Image::ExifTool::Exif::WriteExif($et, $dirInfo, $tagTablePtr);
     }
     return $newVal;
 }
@@ -1515,23 +1581,23 @@ sub WriteUnknownOrPreview($$$)
 # Returns: 1 on success, and updates $dirInfo if necessary for new directory
 sub ProcessUnknown($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $success = 0;
 
-    my $loc = LocateIFD($exifTool, $dirInfo);
+    my $loc = LocateIFD($et, $dirInfo);
     if (defined $loc) {
-        $exifTool->{UnknownByteOrder} = GetByteOrder();
-        if ($exifTool->Options('Verbose') > 1) {
-            my $out = $exifTool->Options('TextOut');
-            my $indent = $exifTool->{INDENT};
+        $$et{UnknownByteOrder} = GetByteOrder();
+        if ($et->Options('Verbose') > 1) {
+            my $out = $et->Options('TextOut');
+            my $indent = $$et{INDENT};
             $indent =~ s/\| $/  /;
             printf $out "${indent}Found IFD at offset 0x%.4x in maker notes:\n",
                     $$dirInfo{DirStart} + $$dirInfo{DataPos} + $$dirInfo{Base};
         }
-        $success = Image::ExifTool::Exif::ProcessExif($exifTool, $dirInfo, $tagTablePtr);
+        $success = Image::ExifTool::Exif::ProcessExif($et, $dirInfo, $tagTablePtr);
     } else {
-        $exifTool->{UnknownByteOrder} = ''; # indicates we tried but didn't set byte order
-        $exifTool->Warn("Unrecognized $$dirInfo{DirName}", 1);
+        $$et{UnknownByteOrder} = ''; # indicates we tried but didn't set byte order
+        $et->Warn("Unrecognized $$dirInfo{DirName}", 1);
     }
     return $success;
 }
@@ -1556,7 +1622,7 @@ maker notes in EXIF information.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -14,7 +14,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.04';
+$VERSION = '1.05';
 
 my %noYes = ( 0 => 'No', 1 => 'Yes' );
 
@@ -672,7 +672,7 @@ sub GetVInt($$)
 # Returns: 1 on success, 0 if this wasn't a valid Matroska file
 sub ProcessMKV($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my ($buff, $buf2, @dirEnd, $trackIndent, %trackTypes);
 
@@ -687,16 +687,16 @@ sub ProcessMKV($$)
     # verify header length
     my $hlen = GetVInt($buff, $pos);
     return 0 unless $hlen and $hlen > 0;
-    $pos + $hlen > $dataLen and $exifTool->Warn('Truncated Matroska header'), return 1;
-    $exifTool->SetFileType();
+    $pos + $hlen > $dataLen and $et->Warn('Truncated Matroska header'), return 1;
+    $et->SetFileType();
     SetByteOrder('MM');
     my $tagTablePtr = GetTagTable('Image::ExifTool::Matroska::Main');
 
     # set flag to process entire file (otherwise we stop at the first Cluster)
-    my $verbose = $exifTool->Options('Verbose');
-    my $processAll = ($verbose or $exifTool->Options('Unknown') > 1);
-    $$exifTool{TrackTypes} = \%trackTypes;  # store Track types reference
-    my $oldIndent = $$exifTool{INDENT};
+    my $verbose = $et->Options('Verbose');
+    my $processAll = ($verbose or $et->Options('Unknown') > 1);
+    $$et{TrackTypes} = \%trackTypes;  # store Track types reference
+    my $oldIndent = $$et{INDENT};
     my $chapterNum = 0;
 
     # loop over all Matroska elements
@@ -704,8 +704,8 @@ sub ProcessMKV($$)
         while (@dirEnd and $pos + $dataPos >= $dirEnd[-1][0]) {
             pop @dirEnd;
             # use INDENT to decide whether or not we are done this Track element
-            delete $$exifTool{SET_GROUP1} if $trackIndent and $trackIndent eq $$exifTool{INDENT};
-            $$exifTool{INDENT} = substr($$exifTool{INDENT}, 0, -2);
+            delete $$et{SET_GROUP1} if $trackIndent and $trackIndent eq $$et{INDENT};
+            $$et{INDENT} = substr($$et{INDENT}, 0, -2);
         }
         # read more if we are getting close to the end of our buffer
         # (24 more bytes should be enough to read this element header)
@@ -723,7 +723,7 @@ sub ProcessMKV($$)
         my $unknownSize;
         $size < 0 and $unknownSize = 1, $size = 1e20;
         if (@dirEnd and $pos + $dataPos + $size > $dirEnd[-1][0]) {
-            $exifTool->Warn("Invalid or corrupted $dirEnd[-1][1] master element");
+            $et->Warn("Invalid or corrupted $dirEnd[-1][1] master element");
             $pos = $dirEnd[-1][0] - $dataPos;
             if ($pos < 0 or $pos > $dataLen) {
                 $buff = '';
@@ -734,17 +734,17 @@ sub ProcessMKV($$)
             }
             next;
         }
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
         # just fall through into the contained EBML elements
         if ($tagInfo and $$tagInfo{SubDirectory}) {
             # stop processing at first cluster unless we are in verbose mode
             last if $$tagInfo{Name} eq 'Cluster' and not $processAll;
-            $$exifTool{INDENT} .= '| ';
-            $exifTool->VerboseDir($$tagTablePtr{$tag}{Name}, undef, $size);
+            $$et{INDENT} .= '| ';
+            $et->VerboseDir($$tagTablePtr{$tag}{Name}, undef, $size);
             push @dirEnd, [ $pos + $dataPos + $size, $$tagInfo{Name} ];
             if ($$tagInfo{Name} eq 'ChapterAtom') {
-                $$exifTool{SET_GROUP1} = 'Chapter' . (++$chapterNum);
-                $trackIndent = $$exifTool{INDENT};
+                $$et{SET_GROUP1} = 'Chapter' . (++$chapterNum);
+                $trackIndent = $$et{INDENT};
             }
             next;
         }
@@ -755,7 +755,7 @@ sub ProcessMKV($$)
             # just skip unknown and large data blocks
             if (not $tagInfo or $more > 10000000) {
                 # don't try to skip very large blocks unless LargeFileSupport is enabled
-                last if $more > 0x80000000 and not $exifTool->Options('LargeFileSupport');
+                last if $more > 0x80000000 and not $et->Options('LargeFileSupport');
                 $raf->Seek($more, 1) or last;
                 $buff = '';
                 $dataPos += $dataLen + $more;
@@ -785,14 +785,14 @@ sub ProcessMKV($$)
             my $fmt = $$tagInfo{Format};
             if ($fmt eq 'string' or $fmt eq 'utf8') {
                 ($val = substr($buff, $pos, $size)) =~ s/\0.*//s;
-                $val = $exifTool->Decode($val, 'UTF8') if $fmt eq 'utf8';
+                $val = $et->Decode($val, 'UTF8') if $fmt eq 'utf8';
             } elsif ($fmt eq 'float') {
                 if ($size == 4) {
                     $val = GetFloat(\$buff, $pos);
                 } elsif ($size == 8) {
                     $val = GetDouble(\$buff, $pos);
                 } else {
-                    $exifTool->Warn("Illegal float size ($size)");
+                    $et->Warn("Illegal float size ($size)");
                 }
             } else {
                 my @vals = unpack("x${pos}C$size", $buff);
@@ -820,8 +820,8 @@ sub ProcessMKV($$)
             }
             # set group1 to Track/Chapter number
             if ($$tagInfo{Name} eq 'TrackNumber') {
-                $$exifTool{SET_GROUP1} = 'Track' . $val;
-                $trackIndent = $$exifTool{INDENT};
+                $$et{SET_GROUP1} = 'Track' . $val;
+                $trackIndent = $$et{INDENT};
             }
         }
         my %parms = (
@@ -831,20 +831,20 @@ sub ProcessMKV($$)
             Size    => $size,
         );
         if ($$tagInfo{NoSave}) {
-            $exifTool->VerboseInfo($tag, $tagInfo, Value => $val, %parms) if $verbose;
+            $et->VerboseInfo($tag, $tagInfo, Value => $val, %parms) if $verbose;
         } else {
-            $exifTool->HandleTag($tagTablePtr, $tag, $val, %parms);
+            $et->HandleTag($tagTablePtr, $tag, $val, %parms);
         }
         $pos += $size;  # step to next element
     }
-    $$exifTool{INDENT} = $oldIndent;
-    delete $$exifTool{SET_GROUP1};
+    $$et{INDENT} = $oldIndent;
+    delete $$et{SET_GROUP1};
     # override file type if necessary based on existing track types
     unless ($trackTypes{0x01} or $trackTypes{0x03}) {   # video or complex?
         if ($trackTypes{0x02}) {                        # audio?
-            $exifTool->OverrideFileType('MKA');
+            $et->OverrideFileType('MKA');
         } elsif ($trackTypes{0x11}) {                   # subtitle?
-            $exifTool->OverrideFileType('MKS');
+            $et->OverrideFileType('MKS');
         }
     }
     return 1;
@@ -869,7 +869,7 @@ information from Matroska multimedia files (MKA, MKV, MKS and WEBM).
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -16,7 +16,7 @@ use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::XMP;
 
-$VERSION = '1.07';
+$VERSION = '1.10';
 
 sub ProcessXtra($$$);
 
@@ -135,7 +135,7 @@ my %sRegions = (
     Rectangle         => { },
     PersonDisplayName => { },
     PersonEmailDigest => { },
-    PersonLiveIdCID   => { },
+    PersonLiveIdCID   => { },  # (see http://130.15.24.88/exiftool/forum/index.php?topic=4274.msg20368#msg20368)
     PersonSourceID    => { },
 );
 %Image::ExifTool::Microsoft::MP = (
@@ -604,7 +604,7 @@ my %sRegions = (
     '{3F8472B5-E0AF-4DB2-8071-C53FE76AE7CE} 100'   => 'DueDate',
     '{C75FAA05-96FD-49E7-9CB4-9F601082D553} 100'   => 'EndDate',
     '{28636AA6-953D-11D2-B5D6-00C04FD918D0} 12'    => 'FileCount',
-    '{41CF5AE0-F75A-4806-BD87-59C7D9248EB9} 100'   => 'Filename',
+    '{41CF5AE0-F75A-4806-BD87-59C7D9248EB9} 100'   => 'WindowsFileName',
     '{67DF94DE-0CA7-4D6F-B792-053A3E4F03CF} 100'   => 'FlagColor',
     '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 12'    => 'FlagStatus',
     '{9B174B35-40FF-11D2-A27E-00C04FC30871} 2'     => 'SpaceFree',
@@ -654,7 +654,7 @@ my %sRegions = (
     '{64440492-4C8B-11D1-8B70-080036B11A03} 36'    => 'EncodedBy',
     '{64440492-4C8B-11D1-8B70-080036B11A03} 22'    => 'Producers',
     '{64440492-4C8B-11D1-8B70-080036B11A03} 30'    => 'Publisher',
-    '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 38'    => 'Subtitle',
+    '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 38'    => 'SubTitle',
     '{64440492-4C8B-11D1-8B70-080036B11A03} 34'    => 'UserWebURL',
     '{64440492-4C8B-11D1-8B70-080036B11A03} 23'    => 'Writers',
     '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 21'    => 'Attachments',
@@ -752,12 +752,12 @@ my %sRegions = (
 # Reference: http://code.google.com/p/mp4v2/
 sub ProcessXtra($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dataPos = $$dirInfo{Base} || 0;
     my $dataLen = $$dirInfo{DataLen};
     my $pos = 0;
-    $exifTool->VerboseDir('Xtra', 0, $dataLen);
+    $et->VerboseDir('Xtra', 0, $dataLen);
     for (;;) {
         last if $pos + 4 > $dataLen;
         my $size = Get32u($dataPt, $pos); # (includes $size word)
@@ -768,7 +768,7 @@ sub ProcessXtra($$$)
         my $version = Get32u($dataPt, $pos + $tagLen + 8);
         # (have seen a vers=2 type=8 tag that seems to work just like vers=1 - PH)
         if ($version > 2) {
-            $exifTool->WarnOnce("Unsupported Xtra version ($version)");
+            $et->WarnOnce("Unsupported Xtra version ($version)");
             $pos += $size;
             next;
         }
@@ -784,7 +784,7 @@ sub ProcessXtra($$$)
         SetByteOrder('II');
         if ($valType == 8) {
             $format = 'Unicode';
-            $val = $exifTool->Decode($val, 'UCS2');
+            $val = $et->Decode($val, 'UCS2');
         } elsif ($valType == 19 and $valLen == 8) {
             $format = 'int64u';
             $val = Get64u(\$val, 0);
@@ -804,7 +804,7 @@ sub ProcessXtra($$$)
             require Image::ExifTool::FlashPix;
             my $vPos = $valPos; # (necessary because ReadFPXValue updates this)
             # read entry as a VT_VARIANT (use FlashPix module for this)
-            $val = Image::ExifTool::FlashPix::ReadFPXValue($exifTool, $dataPt, $vPos,
+            $val = Image::ExifTool::FlashPix::ReadFPXValue($et, $dataPt, $vPos,
                    Image::ExifTool::FlashPix::VT_VARIANT(), $valPos+$valLen, 1);
         } else {
             $format = "Unknown($valType)";
@@ -812,7 +812,7 @@ sub ProcessXtra($$$)
         SetByteOrder('MM'); # back to native QuickTime byte ordering
         
         if ($tagLen > 0 and $valLen > 0) {
-            my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+            my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
             unless ($tagInfo) {
                 # generate tag information for unrecognized tags
                 my $name = $tag;
@@ -823,7 +823,7 @@ sub ProcessXtra($$$)
                     AddTagToTable($tagTablePtr, $tag, $tagInfo);
                 }
             }
-            $exifTool->HandleTag($tagTablePtr, $tag, $val,
+            $et->HandleTag($tagTablePtr, $tag, $val,
                 TagInfo => $tagInfo,
                 DataPt  => $dataPt,
                 DataPos => $dataPos,
@@ -857,7 +857,7 @@ Microsoft-specific EXIF and XMP tags.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -52,7 +52,7 @@ use vars qw($VERSION %minoltaLensTypes %minoltaTeleconverters %minoltaColorMode
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Exif;
 
-$VERSION = '2.02';
+$VERSION = '2.11';
 
 # Full list of product codes for Sony-compatible Minolta lenses
 # (ref http://www.kb.sony.com/selfservice/documentLink.do?externalId=C1000570)
@@ -170,6 +170,13 @@ $VERSION = '2.02';
         attempting to identify the specific lens model.  "New" or "II" appear in
         brackets if the original version of the lens has the same LensType.
     },
+    OTHER => sub {
+        my ($val, $inv) = @_;
+        return undef if $inv or ($val & 0xff00) != 0xef00;
+        require Image::ExifTool::Canon;
+        my $prt = $Image::ExifTool::Canon::canonLensTypes{$val & 0xff};
+        return $prt ? "$prt + Metabones Adapter" : undef;
+    },
     0 => 'Minolta AF 28-85mm F3.5-4.5 New', # New added (ref 13/18)
     1 => 'Minolta AF 80-200mm F2.8 HS-APO G',
     2 => 'Minolta AF 28-70mm F2.8 G',
@@ -204,7 +211,8 @@ $VERSION = '2.02';
     24.3 => 'Sigma 20-40mm F2.8 EX DG Aspherical IF', #JD/22
     24.4 => 'Sigma 18-200mm F3.5-6.3 DC', #22
     24.5 => 'Sigma DC 18-125mm F4-5,6 D', #exiv2 0.23
-    24.6 => 'Tamron SP AF 28-75mm F2.8 XR Di (IF) Macro', #JD
+  # 24.6 => 'Tamron SP AF 28-75mm F2.8 XR Di (IF) Macro', #JD
+    24.6 => 'Tamron SP AF 28-75mm F2.8 XR Di LD Aspherical [IF] Macro', #4 (Model A09)
     25 => 'Minolta AF 100-300mm F4.5-5.6 APO (D) or Sigma Lens',
     25.1 => 'Sigma 100-300mm F4 EX (APO (D) or D IF)', #JD
     25.2 => 'Sigma 70mm F2.8 EX DG Macro', #JD
@@ -214,8 +222,8 @@ $VERSION = '2.02';
     27 => 'Minolta AF 85mm F1.4 G (D)', # added (D) (ref 13)
     28 => 'Minolta/Sony AF 100mm F2.8 Macro (D) or Tamron Lens',
     # 28 => 'Sony 100mm F2.8 Macro (SAL100M28)', (ref 18/25)
-    28.1 => 'Tamron SP AF 90mm F2.8 Di Macro', #JD
-    28.2 => 'Tamron AF 180mm F3.5 SP Di LD [IF] Macro', #27
+    28.1 => 'Tamron SP AF 90mm F2.8 Di Macro', #JD (Model 272E)
+    28.2 => 'Tamron SP AF 180mm F3.5 Di LD [IF] Macro', #27 (Model B01) ("SP" moved - ref 25)
     29 => 'Minolta/Sony AF 75-300mm F4.5-5.6 (D)', # Sony added (ref 13)
     # 29 => 'Sony 75-300mm F4.5-5.6 (SAL75300)', (ref 25)
     30 => 'Minolta AF 28-80mm F3.5-5.6 (D) or Sigma Lens',
@@ -241,7 +249,7 @@ $VERSION = '2.02';
     #40.1 => 'Sony AF DT 18-200mm F3.5-6.3', #11 (anomaly? - PH)
     41 => 'Minolta/Sony AF DT 11-18mm F4.5-5.6 (D) or Tamron Lens', # (Konica Minolta, ref 13)
     # 41 => 'Sony DT 11-18mm F4.5-5.6 (SAL1118)', (ref 25)
-    41.1 => 'Tamron SP AF 11-18mm F4.5-5.6 Di II LD Aspherical IF', #JD
+    41.1 => 'Tamron SP AF 11-18mm F4.5-5.6 Di II LD Aspherical IF', #JD (Model A13)
     42 => 'Minolta/Sony AF DT 18-200mm F3.5-6.3 (D)', # Sony added (ref 13) (Konica Minolta, ref 13)
     # 42 => 'Sony DT 18-200mm F3.5-6.3 (SAL18200)', (ref 25)
     43 => 'Sony 35mm F1.4 G (SAL35F14G)', # changed from Minolta to Sony (ref 13/18/25) (but ref 11 shows both!)
@@ -255,14 +263,14 @@ $VERSION = '2.02';
     51 => 'Sony DT 16-105mm F3.5-5.6 (SAL16105)', #11/25
     #51.1 => 'Sony AF DT 55-200mm F4-5.5', #11 (anomaly? - PH)
     52 => 'Sony 70-300mm F4.5-5.6 G SSM (SAL70300G) or Tamron Lens', #JD/25
-    52.1 => 'Tamron SP 70-300mm F4-5.6 Di VC USD', #25
+    52.1 => 'Tamron SP 70-300mm F4-5.6 Di USD', #25,4 (Model A005)
     53 => 'Sony 70-400mm F4-5.6 G SSM (SAL70400G)', #17(/w correction by Stephen Bishop)/25
     54 => 'Carl Zeiss Vario-Sonnar T* 16-35mm F2.8 ZA SSM (SAL1635Z)', #17/25
-    55 => 'Sony DT 18-55mm F3.5-5.6 SAM (SAL1855)', #PH/25
+    55 => 'Sony DT 18-55mm F3.5-5.6 SAM [II] (SAL1855)', #PH/25
     56 => 'Sony DT 55-200mm F4-5.6 SAM (SAL55200-2)', #22/25
     57 => 'Sony DT 50mm F1.8 SAM (SAL50F18) or Tamron Lens', #22/25
-    57.1 => 'Tamron SP AF 60mm F2 Di II LD [IF] Macro 1:1', # model G005 (ref http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,3858.0.html)
-    57.2 => 'Tamron 18-270mm F3.5-6.3 Di II PZD', #27
+    57.1 => 'Tamron SP AF 60mm F2 Di II LD [IF] Macro 1:1', # (Model G005) (ref http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,3858.0.html)
+    57.2 => 'Tamron 18-270mm F3.5-6.3 Di II PZD', #27 (Model B008)
     58 => 'Sony DT 30mm F2.8 Macro SAM (SAL30M28)', #22/25
     59 => 'Sony 28-75mm F2.8 SAM (SAL2875)', #21/25
     60 => 'Carl Zeiss Distagon T* 24mm F2 ZA SSM (SAL24F20Z)', #17/25
@@ -272,17 +280,20 @@ $VERSION = '2.02';
     64 => 'Sony 500mm F4.0 G SSM (SAL500F40G)', #29
     65 => 'Sony DT 18-135mm F3.5-5.6 SAM (SAL18135)', #25
     66 => 'Sony 300mm F2.8 G SSM II (SAL300F28G2)', #29
+    67 => 'Sony 70-200mm F2.8 G SSM II (SAL70200G2)', #25
     68 => 'Sony DT 55-300mm F4.5-5.6 SAM (SAL55300)', #29
     69 => 'Sony 70-400mm F4-5.6 G SSM II (SAL70400G2)', #25
     70 => 'Carl Zeiss Planar T* 50mm F1.4 ZA SSM (SAL50F14Z)', #25
     128 => 'Tamron or Sigma Lens (128)',
-    128.1 => 'Tamron 18-200mm F3.5-6.3',
-    128.2 => 'Tamron 28-300mm F3.5-6.3',
+    128.1 => 'Tamron AF 18-200mm F3.5-6.3 XR Di II LD Aspherical [IF] Macro', #25 (Model A14)
+    # was 128.1 => 'Tamron 18-200mm F3.5-6.3',
+    128.2 => 'Tamron AF 28-300mm F3.5-6.3 XR Di LD Aspherical [IF] Macro', #25 (Model A061)
+    # was 128.2 => 'Tamron 28-300mm F3.5-6.3',
     128.3 => 'Tamron 80-300mm F3.5-6.3',
-    128.4 => 'Tamron AF 28-200mm F3.8-5.6 XR Di Aspherical [IF] MACRO', #JD
-    128.5 => 'Tamron SP AF 17-35mm F2.8-4 Di LD Aspherical IF', #JD
+    128.4 => 'Tamron AF 28-200mm F3.8-5.6 XR Di Aspherical [IF] Macro', #JD (Model A031)
+    128.5 => 'Tamron SP AF 17-35mm F2.8-4 Di LD Aspherical IF', #JD (Model A05)
     128.6 => 'Sigma AF 50-150mm F2.8 EX DC APO HSM II', #JD
-    128.7 => 'Sigma 10-20mm F3.5 EX DC HSM', #11 (model 202-205)
+    128.7 => 'Sigma 10-20mm F3.5 EX DC HSM', #11 (Model 202-205)
     128.8 => 'Sigma 70-200mm F2.8 II EX DG APO MACRO HSM', #24
     128.9 => 'Sigma 10mm F2.8 EX DC HSM Fisheye', #Florian Knorn
     # (yes, '128.10'.  My condolences to typed languages that use this database - PH)
@@ -290,26 +301,34 @@ $VERSION = '2.02';
    '128.11' => 'Sigma 85mm F1.4 EX DG HSM', #27
    '128.12' => 'Sigma 24-70mm F2.8 IF EX DG HSM', #27
    '128.13' => 'Sigma 18-250mm F3.5-6.3 DC OS HSM', #27
+   '128.14' => 'Sigma 17-50mm F2.8 EX DC HSM', #Exiv2
+   '128.15' => 'Sigma 17-70mm F2.8-4 DC Macro HSM', #25
     129 => 'Tamron Lens (129)',
     129.1 => 'Tamron 200-400mm F5.6 LD', #12 (LD ref 23)
     129.2 => 'Tamron 70-300mm F4-5.6 LD', #12
-    131 => 'Tamron 20-40mm F2.7-3.5 SP Aspherical IF', #23
+    131 => 'Tamron 20-40mm F2.7-3.5 SP Aspherical IF', #23 (Model 266D)
     135 => 'Vivitar 28-210mm F3.5-5.6', #16
     136 => 'Tokina EMZ M100 AF 100mm F3.5', #JD
     137 => 'Cosina 70-210mm F2.8-4 AF', #11
     138 => 'Soligor 19-35mm F3.5-4.5', #11
     142 => 'Voigtlander 70-300mm F4.5-5.6', #JD
     146 => 'Voigtlander Macro APO-Lanthar 125mm F2.5 SL', #JD
-    194 => 'Tamron SP AF 17-50mm F2.8 XR Di II LD Aspherical [IF]', #23
+    194 => 'Tamron SP AF 17-50mm F2.8 XR Di II LD Aspherical [IF]', #23 (Model A16)
+    203 => 'Tamron SP 70-200mm F2.8 Di USD', #25 (Model A009)
+    # ? => 'Tamron SP 24-70mm F2.8 Di USD', #25 (Model A007)
+    # ? => 'Tamron SP 150-600mm F5-6.3 Di USD', #25 (Model A011)
+    # ? => 'Tamron SP 90mm F2.8 Di Macro 1:1 USD', #25 (Model F004)
     255 => 'Tamron Lens (255)',
-    255.1 => 'Tamron SP AF 17-50mm F2.8 XR Di II LD Aspherical',
-    255.2 => 'Tamron AF 18-250mm F3.5-6.3 XR Di II LD', #JD
-    255.3 => 'Tamron AF 55-200mm F4-5.6 Di II LD Macro', # (added "LD Macro", ref 23)
-    255.4 => 'Tamron AF 70-300mm F4-5.6 Di LD MACRO 1:2',
-    255.5 => 'Tamron SP AF 200-500mm F5.0-6.3 Di LD IF',
-    255.6 => 'Tamron SP AF 10-24mm F3.5-4.5 Di II LD Aspherical IF', #22
-    255.7 => 'Tamron SP AF 70-200mm F2.8 Di LD IF Macro', #22
-    255.8 => 'Tamron SP AF 28-75mm F2.8 XR Di LD Aspherical IF', #24
+    255.1 => 'Tamron SP AF 17-50mm F2.8 XR Di II LD Aspherical', # (Model A16)
+    255.2 => 'Tamron AF 18-250mm F3.5-6.3 XR Di II LD', #JD (Model A18?)
+ #? 225.2 => 'Tamron AF 18-250mm F3.5-6.3 Di II LD Aspherical [IF] Macro', #25 (Model A18)
+    255.3 => 'Tamron AF 55-200mm F4-5.6 Di II LD Macro', # (Model A15) (added "LD Macro", ref 23)
+    255.4 => 'Tamron AF 70-300mm F4-5.6 Di LD Macro 1:2', # (Model A17)
+    255.5 => 'Tamron SP AF 200-500mm F5.0-6.3 Di LD IF', # (Model A08)
+    255.6 => 'Tamron SP AF 10-24mm F3.5-4.5 Di II LD Aspherical IF', #22 (Model B001)
+    255.7 => 'Tamron SP AF 70-200mm F2.8 Di LD IF Macro', #22 (Model A001)
+    255.8 => 'Tamron SP AF 28-75mm F2.8 XR Di LD Aspherical IF', #24 (Model A09)
+    255.9 => 'Tamron AF 90-300mm F4.5-5.6 Telemacro', #Fredrik Agert
     25501 => 'Minolta AF 50mm F1.7', #7
     25511 => 'Minolta AF 35-70mm F4 or Other Lens',
     25511.1 => 'Sigma UC AF 28-70mm F3.5-4.5', #12/16(HighSpeed-AF)
@@ -322,12 +341,13 @@ $VERSION = '2.02';
     25521.3 => 'Tokina 80-400mm F4.5-5.6 AT-X AF II 840', #JD
     25521.4 => 'Tokina AF PRO 28-80mm F2.8 AT-X 280', #JD
     25521.5 => 'Tokina AT-X PRO II AF 28-70mm F2.6-2.8 270', #24
-    25521.6 => 'Tamron AF 19-35mm F3.5-4.5', #JD
+    25521.6 => 'Tamron AF 19-35mm F3.5-4.5', #JD (Model A10)
     25521.7 => 'Angenieux AF 28-70mm F2.6', #JD
     25521.8 => 'Tokina AT-X 17 AF 17mm F3.5', #27
     25531 => 'Minolta AF 28-135mm F4-4.5 or Sigma Lens',
     25531.1 => 'Sigma ZOOM-alpha 35-135mm F3.5-4.5', #16
     25531.2 => 'Sigma 28-105mm F2.8-4 Aspherical', #JD
+    25531.3 => 'Sigma 28-105mm F4-5.6 UC', #25
     25541 => 'Minolta AF 35-105mm F3.5-4.5', #13
     25551 => 'Minolta AF 70-210mm F4 Macro or Sigma Lens',
     25551.1 => 'Sigma 70-210mm F4-5.6 APO', #7
@@ -339,7 +359,7 @@ $VERSION = '2.02';
     25581 => 'Minolta AF 24-50mm F4',
     25601 => 'Minolta AF 100-200mm F4.5',
     25611 => 'Minolta AF 75-300mm F4.5-5.6 or Sigma Lens', #13
-    25611.1 => 'Sigma 70-300mm F4-5.6 DL Macro', #12 (also DG version, ref 27)
+    25611.1 => 'Sigma 70-300mm F4-5.6 DL Macro', #12 (also DG version ref 27, and APO version ref 25)
     25611.2 => 'Sigma 300mm F4 APO Macro', #3/7
     25611.3 => 'Sigma AF 500mm F4.5 APO', #JD
     25611.4 => 'Sigma AF 170-500mm F5-6.3 APO Aspherical', #JD
@@ -377,7 +397,7 @@ $VERSION = '2.02';
     25811.5 => 'Tamron 90mm F2.8 Macro',
     25851 => 'Beroflex 35-135mm F3.5-4.5', #16
     25858 => 'Minolta AF 35-105mm F3.5-4.5 New or Tamron Lens',
-    25858.1 => 'Tamron 24-135mm F3.5-5.6',
+    25858.1 => 'Tamron 24-135mm F3.5-5.6', # (Model 190D)
     25881 => 'Minolta AF 70-210mm F3.5-4.5',
     25891 => 'Minolta AF 80-200mm F2.8 APO or Tokina Lens',
     25891.1 => 'Tokina 80-200mm F2.8',
@@ -431,31 +451,58 @@ $VERSION = '2.02';
     45741.3 => 'Tokina 300mm F2.8 x2',
     45751 => '1.4x Teleconverter', #18
     45851 => 'Tamron SP AF 300mm F2.8 LD IF', #11
+    45861 => 'Tamron SP AF 35-105mm F2.8 LD Aspherical IF', #Fredrik Agert
     45871 => 'Tamron AF 70-210mm F2.8 SP LD', #Fabio Suprani
+    # 61184: both the Speed Booster and the Smart Adapter report type 61184 (ref 25)
+    # - this is the base to which the low byte of the Canon LensType is added
+    61184 => 'Metabones Canon EF Adapter', #25
     # all M42-type lenses give a value of 65535 (and FocalLength=0, FNumber=1)
     65535 => 'E-Mount, T-Mount, Other Lens or no lens', #JD/25
-    65535.1  => 'Sony E 16mm F2.8', #PH (SEL16F28)
-    65535.2  => 'Sony E 20mm F2.8', #PH (NC) (SEL20F28)
-    65535.3  => 'Sony E 24mm F1.8 ZA', #PH (SEL24F18Z)
-    65535.4  => 'Sony E 30mm F3.5 Macro', #25 (SEL30M35)
-    65535.5  => 'Sony E 35mm F1.8 OSS', #25 (SEL35F18)
-    65535.6  => 'Sony E 50mm F1.8 OSS', #PH (SEL50F18)
-    65535.7  => 'Sony E 10-18mm F4 OSS', #PH (SEL1018)
-    65535.8  => 'Sony E PZ 16-50mm F3.5-5.6 OSS', #PH (SELP1650)
-    65535.9  => 'Sony E 18-55mm F3.5-5.6 OSS', #PH (SEL1855)
-   '65535.10'=> 'Sony E 18-200mm F3.5-6.3 OSS', #PH (SEL18200) (also "LE" and "PZ" models, SEL18200LE and SELP18200)
-   '65535.11' => 'Sony E 55-210mm F4.5-6.3 OSS', #PH (SEL55210)
-    # <-- insert new Sony lenses here and bump down 3rd party lens ID's -->
-   '65535.12' => 'Sigma 19mm F2.8 EX DN', #25
-   '65535.13' => 'Sigma 30mm F2.8 EX DN', #25
-   '65535.14' => 'Tamron 18-200mm F3.5-6.3 Di III VC', #25
-   '65535.15' => 'Arax MC 35mm F2.8 Tilt+Shift', #JD
-   '65535.16' => 'Arax MC 80mm F2.8 Tilt+Shift', #JD
-   '65535.17' => 'Zenitar MF 16mm F2.8 Fisheye M42', #JD
-   '65535.18' => 'Samyang 500mm Mirror F8.0', #19
-   '65535.19' => 'Pentacon Auto 135mm F2.8', #19
-   '65535.20' => 'Pentacon Auto 29mm F2.8', #19
-   '65535.21' => 'Helios 44-2 58mm F2.0', #19
+#
+# Sony E-type lenses (NOTE: these should be kept in sync with %sonyLensTypes2 of Sony.pm)
+#
+    65535.1  => 'Sony E 16mm F2.8',                 #PH (SEL16F28   - 32784)
+    65535.2  => 'Sony E 18-55mm F3.5-5.6 OSS',      #PH (SEL1855    - 32785)
+    65535.3  => 'Sony E 55-210mm F4.5-6.3 OSS',     #PH (SEL55210   - 32786)
+    65535.4  => 'Sony E 18-200mm F3.5-6.3 OSS',     #PH (SEL18200   - 32787)
+    65535.5  => 'Sony E 30mm F3.5 Macro',           #25 (SEL30M35   - 32788)
+    65535.6  => 'Sony E 24mm F1.8 ZA',              #PH (SEL24F18Z  - 32789)
+    65535.7  => 'Sony E 50mm F1.8 OSS',             #PH (SEL50F18   - 32790)
+    65535.8  => 'Sony E 16-70mm F4 ZA OSS',         #25 (SEL1670Z   - 32791)
+    65535.9  => 'Sony E 10-18mm F4 OSS',            #PH (SEL1018    - 32792)
+   '65535.10' => 'Sony E PZ 16-50mm F3.5-5.6 OSS',  #PH (SELP1650   - 32793)
+   '65535.11' => 'Sony FE 35mm F2.8 ZA',            #25 (SEL35F28Z  - 32794)
+   '65535.12' => 'Sony FE 24-70mm F4 ZA OSS',       #25 (SEL2470Z   - 32795)
+   '65535.13' => 'Sony E 18-200mm F3.5-6.3 OSS LE', #25 (SEL18200LE - 32797)
+   '65535.14' => 'Sony E 20mm F2.8',                #PH (SEL20F28   - 32798)
+   '65535.15' => 'Sony E 35mm F1.8 OSS',            #25 (SEL35F18   - 32799)
+   '65535.16' => 'Sony E PZ 18-105mm F4 G OSS',     #25 (SELP18105G - 32800)
+   '65535.17' => 'Sony E PZ 18-200mm F3.5-6.3 OSS', #25 (SELP18200  - 32807)
+   '65535.18' => 'Sony FE 55mm F1.8 ZA',            #25 (SEL55F18Z  - 32808)
+   '65535.19' => 'Sony FE 28-70mm F3.5-5.6 OSS',    #25 (SEL2870    - 32813)
+
+   '65535.20' => 'Sony FE 70-200mm F4 G OSS',       #25 (SEL70200G  - 32xxx)
+#
+# 3rd party E lenses
+#
+   '65535.21' => 'Sigma 19mm F2.8 [EX] DN', #25
+   '65535.22' => 'Sigma 30mm F2.8 [EX] DN', #25
+   '65535.23' => 'Sigma 60mm F2.8 DN', #25
+   '65535.24' => 'Tamron 18-200mm F3.5-6.3 Di III VC', #25 (Model B011)
+   '65535.25' => 'Zeiss Touit 12mm F2.8', #25
+   '65535.26' => 'Zeiss Touit 32mm F1.8', #25
+   '65535.27' => 'Zeiss Touit 50mm F2.8 Macro', #25 
+# 
+# other lenses 
+# 
+   '65535.28' => 'Arax MC 35mm F2.8 Tilt+Shift', #JD 
+   '65535.29' => 'Arax MC 80mm F2.8 Tilt+Shift', #JD 
+   '65535.30' => 'Zenitar MF 16mm F2.8 Fisheye M42', #JD 
+   '65535.31' => 'Samyang 500mm Mirror F8.0', #19 
+   '65535.32' => 'Pentacon Auto 135mm F2.8', #19 
+   '65535.33' => 'Pentacon Auto 29mm F2.8', #19 
+   '65535.34' => 'Helios 44-2 58mm F2.0', #19 
+
 );
 
 %minoltaTeleconverters = (
@@ -2792,7 +2839,7 @@ and write Minolta RAW (MRW) images.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -17,7 +17,7 @@ use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Minolta;
 
-$VERSION = '1.13';
+$VERSION = '1.14';
 
 sub ProcessMRW($$;$);
 sub WriteMRW($$;$);
@@ -374,11 +374,11 @@ sub ConvertWBMode($)
 # Returns: new MRW data or undef on error
 sub WriteMRW($$;$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    $exifTool or return 1;      # allow dummy access
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    $et or return 1;      # allow dummy access
     my $buff = '';
     $$dirInfo{OutFile} = \$buff;
-    ProcessMRW($exifTool, $dirInfo, $tagTablePtr) > 0 or undef $buff;
+    ProcessMRW($et, $dirInfo, $tagTablePtr) > 0 or undef $buff;
     return $buff;
 }
 
@@ -389,11 +389,11 @@ sub WriteMRW($$;$)
 # Notes: File pointer must be set to start of MRW in RAF upon entry
 sub ProcessMRW($$;$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $raf = $$dirInfo{RAF};
     my $outfile = $$dirInfo{OutFile};
-    my $verbose = $exifTool->Options('Verbose');
-    my $out = $exifTool->Options('TextOut');
+    my $verbose = $et->Options('Verbose');
+    my $out = $et->Options('TextOut');
     my ($data, $err, $outBuff);
 
     if ($$dirInfo{DataPt}) {
@@ -408,10 +408,10 @@ sub ProcessMRW($$;$)
     $data =~ /^\0MR([MI])/ or return 0;
     my $hdr = "\0MR$1";
     SetByteOrder($1 . $1);
-    $exifTool->SetFileType();
+    $et->SetFileType();
     $tagTablePtr = GetTagTable('Image::ExifTool::MinoltaRaw::Main');
     if ($outfile) {
-        $exifTool->InitWriteDirs('TIFF'); # use same write dirs as TIFF
+        $et->InitWriteDirs('TIFF'); # use same write dirs as TIFF
         $outBuff = '';
     }
     my $pos = $raf->Tell();
@@ -425,18 +425,18 @@ sub ProcessMRW($$;$)
         my $tag = substr($data, 0, 4);
         my $len = Get32u(\$data, 4);
         if ($verbose) {
-            print $out "MRW ",$exifTool->Printable($tag)," segment ($len bytes):\n";
+            print $out "MRW ",$et->Printable($tag)," segment ($len bytes):\n";
             if ($verbose > 2) {
                 $raf->Read($data,$len) == $len and $raf->Seek($pos,0) or $err = 1, last;
-                $exifTool->VerboseDump(\$data);
+                $et->VerboseDump(\$data);
             }
         }
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
         if ($tagInfo and $$tagInfo{SubDirectory}) {
             my $subTable = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
             my $buff;
             # save shift for values stored with wrong base offset
-            $$exifTool{MRW_WrongBase} = -($raf->Tell());
+            $$et{MRW_WrongBase} = -($raf->Tell());
             $raf->Read($buff, $len) == $len or $err = 1, last;
             my %subdirInfo = (
                 DataPt => \$buff,
@@ -450,7 +450,7 @@ sub ProcessMRW($$;$)
             );
             if ($outfile) {
                 my $writeProc = $tagInfo->{SubDirectory}->{WriteProc};
-                my $val = $exifTool->WriteDirectory(\%subdirInfo, $subTable, $writeProc);
+                my $val = $et->WriteDirectory(\%subdirInfo, $subTable, $writeProc);
                 if (defined $val and length $val) {
                     # pad to an even 4 bytes (can't hurt, and it seems to be the standard)
                     $val .= "\0" x (4 - (length($val) & 0x03)) if length($val) & 0x03;
@@ -460,7 +460,7 @@ sub ProcessMRW($$;$)
                 }
             } else {
                 my $processProc = $tagInfo->{SubDirectory}->{ProcessProc};
-                $exifTool->ProcessDirectory(\%subdirInfo, $subTable, $processProc);
+                $et->ProcessDirectory(\%subdirInfo, $subTable, $processProc);
             }
         } elsif ($outfile) {
             # add this segment to the output buffer
@@ -484,9 +484,9 @@ sub ProcessMRW($$;$)
         }
         # Sony IDC utility corrupts MRWInfo when writing ARW images,
         # so make this a minor error for these images
-        $err and $exifTool->Error("MRW format error", $$exifTool{TIFF_TYPE} eq 'ARW');
+        $err and $et->Error("MRW format error", $$et{TIFF_TYPE} eq 'ARW');
     } else {
-        $err and $exifTool->Warn("MRW format error");
+        $err and $et->Warn("MRW format error");
     }
     return $rtnVal;
 }
@@ -510,7 +510,7 @@ write Konica-Minolta RAW (MRW) images.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -37,7 +37,7 @@
 #              22) Tanel Kuusk private communication
 #              23) Alexandre Naaman private communication (D3)
 #              24) Geert De Soete private communication
-#              25) Niels Kristian private communication
+#              25) Niels Kristian Bech Jensen private communication
 #              26) Bozi (http://www.cpanforum.com/posts/8983)
 #              27) Jens Kriese private communication
 #              28) Warren Hatch private communication (D3v2.00 with SB-800 and SB-900)
@@ -45,6 +45,7 @@
 #              30) http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,3833.30.html
 #              31) Michael Relt private communication
 #              32) Stefan http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,4494.0.html
+#              33) Iliah Borg private communication
 #              JD) Jens Duttke private communication
 #------------------------------------------------------------------------------
 
@@ -55,7 +56,7 @@ use vars qw($VERSION %nikonLensIDs %nikonTextEncoding);
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Exif;
 
-$VERSION = '2.75';
+$VERSION = '2.86';
 
 sub LensIDConv($$$);
 sub ProcessNikonAVI($$$);
@@ -281,6 +282,10 @@ sub PrintAFPointsInv($$;$);
     'B4 40 37 62 2C 34 B6 0E' => 'AF-S VR Zoom-Nikkor 24-85mm f/3.5-4.5G IF-ED', #30
     'B5 4C 3C 3C 14 14 B7 06' => 'AF-S Nikkor 28mm f/1.8G', #30
     'B7 44 60 98 34 3C B9 0E' => 'AF-S Nikkor 80-400mm f/4.5-5.6G ED VR',
+    'B8 40 2D 44 2C 34 BA 06' => 'AF-S Nikkor 18-35mm f/3.5-4.5G ED',
+    'A0 40 2D 74 2C 3C BB 0E' => 'AF-S DX Nikkor 18-140mm f/3.5-5.6G ED VR', #PH
+    'A1 54 55 55 0C 0C BC 06' => 'AF-S Nikkor 58mm f/1.4G', #33
+    'A2 40 2D 53 2C 3C BD 0E' => 'AF-S DX VR Nikkor 18-55mm f/3.5-5.6G II',
     '01 00 00 00 00 00 02 00' => 'TC-16A',
     '01 00 00 00 00 00 08 00' => 'TC-16A',
     '00 00 00 00 00 00 F1 0C' => 'TC-14E [II] or Sigma APO Tele Converter 1.4x EX DG or Kenko Teleplus PRO 300 DG 1.4x',
@@ -293,6 +298,7 @@ sub PrintAFPointsInv($$;$);
     '02 3F 24 24 2C 2C 02 00' => 'Sigma 14mm F3.5',
     '48 48 24 24 24 24 4B 02' => 'Sigma 14mm F2.8 EX Aspherical HSM',
     '26 48 27 27 24 24 1C 02' => 'Sigma 15mm F2.8 EX Diagonal Fisheye',
+    'EA 48 27 27 24 24 1C 02' => 'Sigma 15mm F2.8 EX Diagonal Fisheye', #30
     '26 58 31 31 14 14 1C 02' => 'Sigma 20mm F1.8 EX DG Aspherical RF',
     '26 58 37 37 14 14 1C 02' => 'Sigma 24mm F1.8 EX DG Aspherical Macro',
     'E1 58 37 37 14 14 1C 02' => 'Sigma 24mm F1.8 EX DG Aspherical Macro',
@@ -300,6 +306,7 @@ sub PrintAFPointsInv($$;$);
     '26 58 3C 3C 14 14 1C 02' => 'Sigma 28mm F1.8 EX DG Aspherical Macro',
     '48 54 3E 3E 0C 0C 4B 06' => 'Sigma 30mm F1.4 EX DC HSM',
     'F8 54 3E 3E 0C 0C 4B 06' => 'Sigma 30mm F1.4 EX DC HSM', #JD
+    '91 54 44 44 0C 0C 4B 06' => 'Sigma 35mm F1.4 DG HSM', #30
     'DE 54 50 50 0C 0C 4B 06' => 'Sigma 50mm F1.4 EX DG HSM',
     '02 48 50 50 24 24 02 00' => 'Sigma Macro 50mm F2.8', #http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,4027.0.html
     '32 54 50 50 24 24 35 02' => 'Sigma Macro 50mm F2.8 EX DG',
@@ -309,9 +316,9 @@ sub PrintAFPointsInv($$;$);
     '02 48 65 65 24 24 02 00' => 'Sigma Macro 90mm F2.8',
     '32 54 6A 6A 24 24 35 02.2' => 'Sigma Macro 105mm F2.8 EX DG', #JD
     'E5 54 6A 6A 24 24 35 02' => 'Sigma Macro 105mm F2.8 EX DG',
-    '48 48 76 76 24 24 4B 06' => 'Sigma 150mm F2.8 EX DG APO Macro HSM',
-    'F5 48 76 76 24 24 4B 06' => 'Sigma 150mm F2.8 EX DG APO Macro HSM', #24
-    '48 4C 7C 7C 2C 2C 4B 02' => 'Sigma 180mm F3.5 EX DG Macro',
+    '48 48 76 76 24 24 4B 06' => 'Sigma APO Macro 150mm F2.8 EX DG HSM',
+    'F5 48 76 76 24 24 4B 06' => 'Sigma APO Macro 150mm F2.8 EX DG HSM', #24
+    '48 4C 7C 7C 2C 2C 4B 02' => 'Sigma APO Macro 180mm F3.5 EX DG HSM',
     '48 4C 7D 7D 2C 2C 4B 02' => 'Sigma APO Macro 180mm F3.5 EX DG HSM',
     '48 54 8E 8E 24 24 4B 02' => 'Sigma APO 300mm F2.8 EX DG HSM',
     'FB 54 8E 8E 24 24 4B 02' => 'Sigma APO 300mm F2.8 EX DG HSM', #26
@@ -330,6 +337,7 @@ sub PrintAFPointsInv($$;$);
     'F9 3C 19 31 30 3C 4B 06' => 'Sigma 10-20mm F4-5.6 EX DC HSM', #JD
     '48 38 1F 37 34 3C 4B 06' => 'Sigma 12-24mm F4.5-5.6 EX DG Aspherical HSM',
     'F0 38 1F 37 34 3C 4B 06' => 'Sigma 12-24mm F4.5-5.6 EX DG Aspherical HSM',
+    '96 38 1F 37 34 3C 4B 06' => 'Sigma 12-24mm F4.5-5.6 II DG HSM', #Jurgen Sahlberg
     '26 40 27 3F 2C 34 1C 02' => 'Sigma 15-30mm F3.5-4.5 EX DG Aspherical DF',
     '48 48 2B 44 24 30 4B 06' => 'Sigma 17-35mm F2.8-4 EX DG  Aspherical HSM',
     '26 54 2B 44 24 30 1C 02' => 'Sigma 17-35mm F2.8-4 EX Aspherical',
@@ -337,7 +345,10 @@ sub PrintAFPointsInv($$;$);
     '7A 47 2B 5C 24 34 4B 06' => 'Sigma 17-70mm F2.8-4.5 DC Macro Asp. IF HSM',
     '7A 48 2B 5C 24 34 4B 06' => 'Sigma 17-70mm F2.8-4.5 DC Macro Asp. IF HSM',
     '7F 48 2B 5C 24 34 1C 06' => 'Sigma 17-70mm F2.8-4.5 DC Macro Asp. IF',
-    '26 40 2D 44 2B 34 1C 02' => 'Sigma 18-35 F3.5-4.5 Aspherical',
+    '8E 3C 2B 5C 24 30 4B 0E' => 'Sigma 17-70mm F2.8-4 DC Macro OS HSM Contemporary',
+    'A0 48 2A 5C 24 30 4B 0E' => 'Sigma 17-70mm F2.8-4 DC Macro OS HSM', #http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,5170.0.html
+    '8B 4C 2D 44 14 14 4B 06' => 'Sigma 18-35mm F1.8 DC HSM', #30/25
+    '26 40 2D 44 2B 34 1C 02' => 'Sigma 18-35mm F3.5-4.5 Aspherical',
     '26 48 2D 50 24 24 1C 06' => 'Sigma 18-50mm F2.8 EX DC',
     '7F 48 2D 50 24 24 1C 06' => 'Sigma 18-50mm F2.8 EX DC Macro', #25
     '7A 48 2D 50 24 24 4B 06' => 'Sigma 18-50mm F2.8 EX DC Macro',
@@ -350,6 +361,7 @@ sub PrintAFPointsInv($$;$);
     '26 40 2D 80 2C 40 1C 06' => 'Sigma 18-200mm F3.5-6.3 DC',
     '7A 40 2D 80 2C 40 4B 0E' => 'Sigma 18-200mm F3.5-6.3 DC OS HSM',
     'ED 40 2D 80 2C 40 4B 0E' => 'Sigma 18-200mm F3.5-6.3 DC OS HSM', #JD
+    'FF 40 2D 80 2C 40 4B 06' => 'Sigma 18-200mm F3.5-6.3 DC', #30
     'A5 40 2D 88 2C 40 4B 0E' => 'Sigma 18-250mm F3.5-6.3 DC OS HSM',
   #  LensFStops varies with FocalLength for this lens (ref 2):
     '92 2C 2D 88 2C 40 4B 0E' => 'Sigma 18-250mm F3.5-6.3 DC Macro OS HSM', #2
@@ -380,6 +392,7 @@ sub PrintAFPointsInv($$;$);
     '02 46 3C 5C 25 25 02 00' => 'Sigma 28-70mm F2.8',
     '26 54 3C 5C 24 24 1C 02' => 'Sigma 28-70mm F2.8 EX',
     '26 48 3C 5C 24 24 1C 06' => 'Sigma 28-70mm F2.8 EX DG',
+    '79 48 3C 5C 24 24 1C 06' => 'Sigma 28-70mm F2.8 EX DG', #30 ("D" removed)
     '26 48 3C 5C 24 30 1C 02' => 'Sigma 28-70mm F2.8-4 DG',
     '02 3F 3C 5C 2D 35 02 00' => 'Sigma 28-70mm F3.5-4.5 UC',
     '26 40 3C 60 2C 3C 1C 02' => 'Sigma 28-80mm F3.5-5.6 Mini Zoom Macro II Aspherical',
@@ -405,6 +418,7 @@ sub PrintAFPointsInv($$;$);
     'EE 48 5C 80 24 24 4B 06' => 'Sigma 70-200mm F2.8 EX APO DG Macro HSM II', #JD
     '9C 48 5C 80 24 24 4B 0E' => 'Sigma 70-200mm F2.8 EX DG OS HSM', #Rolando Ruzic
     '02 46 5C 82 25 25 02 00' => 'Sigma 70-210mm F2.8 APO', #JD
+    '02 40 5C 82 2C 35 02 00' => 'Sigma APO 70-210mm F3.5-4.5',
     '26 3C 5C 82 30 3C 1C 02' => 'Sigma 70-210mm F4-5.6 UC-II',
     '26 3C 5C 8E 30 3C 1C 02' => 'Sigma 70-300mm F4-5.6 DG Macro',
     '56 3C 5C 8E 30 3C 1C 02' => 'Sigma 70-300mm F4-5.6 APO Macro Super II',
@@ -433,6 +447,7 @@ sub PrintAFPointsInv($$;$);
     '32 53 64 64 24 24 35 02' => 'Tamron SP AF 90mm f/2.8 [Di] Macro 1:1 (172E/272E)',
     'F8 55 64 64 24 24 84 06' => 'Tamron SP AF 90mm f/2.8 Di Macro 1:1 (272NII)',
     'F8 54 64 64 24 24 DF 06' => 'Tamron SP AF 90mm f/2.8 Di Macro 1:1 (272NII)',
+    'FE 54 64 64 24 24 DF 0E' => 'Tamron SP 90mm f/2.8 Di VC USD Macro 1:1 (F004)', #Jurgen Sahlberg
     '00 4C 7C 7C 2C 2C 00 02' => 'Tamron SP AF 180mm f/3.5 Di Model (B01)',
     '21 56 8E 8E 24 24 14 00' => 'Tamron SP AF 300mm f/2.8 LD-IF (60E)',
     '27 54 8E 8E 24 24 1D 02' => 'Tamron SP AF 300mm f/2.8 LD-IF (360E)',
@@ -455,11 +470,11 @@ sub PrintAFPointsInv($$;$);
     '07 40 30 45 2D 35 03 02' => 'Tamron AF 19-35mm f/3.5-4.5 (A10)',
     '00 49 30 48 22 2B 00 02' => 'Tamron SP AF 20-40mm f/2.7-3.5 (166D)',
     '0E 4A 31 48 23 2D 0E 02' => 'Tamron SP AF 20-40mm f/2.7-3.5 (166D)',
-    'FE 48 37 5C 24 24 DF 0E' => 'Tamron SP 24-70mm f/2.8 Di VC USD', #24
+    'FE 48 37 5C 24 24 DF 0E' => 'Tamron SP 24-70mm f/2.8 Di VC USD (A007)', #24
     '45 41 37 72 2C 3C 48 02' => 'Tamron SP AF 24-135mm f/3.5-5.6 AD Aspherical (IF) Macro (190D)',
     '33 54 3C 5E 24 24 62 02' => 'Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical (IF) Macro (A09)',
     'FA 54 3C 5E 24 24 84 06' => 'Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical (IF) Macro (A09NII)', #JD
-    'FA 54 3C 5E 24 24 DF 06' => 'Tamron SP AF 28-75mm F/2.8 XR Di LD Aspherical (IF) Macro (A09NII)',
+    'FA 54 3C 5E 24 24 DF 06' => 'Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical (IF) Macro (A09NII)',
     '10 3D 3C 60 2C 3C D2 02' => 'Tamron AF 28-80mm f/3.5-5.6 Aspherical (177D)',
     '45 3D 3C 60 2C 3C 48 02' => 'Tamron AF 28-80mm f/3.5-5.6 Aspherical (177D)',
     '00 48 3C 6A 24 24 00 02' => 'Tamron SP AF 28-105mm f/2.8 LD Aspherical IF (176D)',
@@ -473,7 +488,9 @@ sub PrintAFPointsInv($$;$);
     'F7 53 5C 80 24 24 84 06' => 'Tamron SP AF 70-200mm f/2.8 Di LD (IF) Macro (A001)',
     'FE 53 5C 80 24 24 84 06' => 'Tamron SP AF 70-200mm f/2.8 Di LD (IF) Macro (A001)',
     'F7 53 5C 80 24 24 40 06' => 'Tamron SP AF 70-200mm f/2.8 Di LD (IF) Macro (A001)',
-    '69 48 5C 8E 30 3C 6F 02' => 'Tamron AF 70-300mm f/4-5.6 LD Macro 1:2 (772D)',
+  # 'FE 54 5C 80 24 24 DF 0E' => 'Tamron SP AF 70-200mm f/2.8 Di VC USD (A009)',
+    'FE 54 5C 80 24 24 DF 0E' => 'Tamron SP 70-200mm f/2.8 Di VC USD (A009)', #25
+    '69 48 5C 8E 30 3C 6F 02' => 'Tamron AF 70-300mm f/4-5.6 LD Macro 1:2 (572D/772D)',
     '69 47 5C 8E 30 3C 00 02' => 'Tamron AF 70-300mm f/4-5.6 Di LD Macro 1:2 (A17N)',
     '00 48 5C 8E 30 3C 00 06' => 'Tamron AF 70-300mm f/4-5.6 Di LD Macro 1:2 (A17NII)', #JD
     'F1 47 5C 8E 30 3C DF 0E' => 'Tamron SP 70-300mm f/4-5.6 Di VC USD (A005)',
@@ -483,11 +500,11 @@ sub PrintAFPointsInv($$;$);
 #
     '00 40 2B 2B 2C 2C 00 02' => 'Tokina AT-X 17 AF PRO (AF 17mm f/3.5)',
     '00 47 44 44 24 24 00 06' => 'Tokina AT-X M35 PRO DX (AF 35mm f/2.8 Macro)',
-    '00 54 68 68 24 24 00 02' => 'Tokina AT-X M100 PRO D (AF 100mm f/2.8 Macro)',
+    '00 54 68 68 24 24 00 02' => 'Tokina AT-X M100 AF PRO D (AF 100mm f/2.8 Macro)',
     '27 48 8E 8E 30 30 1D 02' => 'Tokina AT-X 304 AF (AF 300mm f/4.0)',
     '00 54 8E 8E 24 24 00 02' => 'Tokina AT-X 300 AF PRO (AF 300mm f/2.8)',
     '12 3B 98 98 3D 3D 09 00' => 'Tokina AT-X 400 AF SD (AF 400mm f/5.6)',
-    '00 40 18 2B 2C 34 00 06' => 'Tokina AT-X 107 DX Fisheye (AF 10-17mm f/3.5-4.5)',
+    '00 40 18 2B 2C 34 00 06' => 'Tokina AT-X 107 AF DX Fisheye (AF 10-17mm f/3.5-4.5)',
     '00 48 1C 29 24 24 00 06' => 'Tokina AT-X 116 PRO DX (AF 11-16mm f/2.8)',
     '00 3C 1F 37 30 30 00 06' => 'Tokina AT-X 124 AF PRO DX (AF 12-24mm f/4)',
     '7A 3C 1F 37 30 30 7E 06.2' => 'Tokina AT-X 124 AF PRO DX II (AF 12-24mm f/4)',
@@ -536,7 +553,6 @@ sub PrintAFPointsInv($$;$);
 #
     '00 54 56 56 30 30 00 00' => 'Coastal Optical Systems 60mm 1:4 UV-VIS-IR Macro Apo',
 #
-    '00 40 11 11 2C 2C 00 00' => 'Samyang 8mm f/3.5 Fish-Eye',
     '4A 40 11 11 2C 0C 4D 02' => 'Samyang 8mm f/3.5 Fish-Eye CS',
     '4A 48 24 24 24 0C 4D 02' => 'Samyang AE 14mm f/2.8 ED AS IF UMC', #http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,3150.0.html
     '4A 60 44 44 0C 0C 4D 02' => 'Samyang 35mm f/1.4 AS UMC',
@@ -555,10 +571,11 @@ sub PrintAFPointsInv($$;$);
     '00 47 10 10 24 24 00 00' => 'Fisheye Nikkor 8mm f/2.8 AiS',
     '00 54 44 44 0C 0C 00 00' => 'Nikkor 35mm f/1.4 AiS',
     '00 48 50 50 18 18 00 00' => 'Nikkor H 50mm f/2',
-    '00 58 64 64 20 20 00 00' => 'Soligor C/D Macro MC 90mm f/2.5',
     '00 48 68 68 24 24 00 00' => 'Series E 100mm f/2.8',
     '00 4C 6A 6A 20 20 00 00' => 'Nikkor 105mm f/2.5 AiS',
     '00 48 80 80 30 30 00 00' => 'Nikkor 200mm f/4 AiS',
+    '00 40 11 11 2C 2C 00 00' => 'Samyang 8mm f/3.5 Fish-Eye',
+    '00 58 64 64 20 20 00 00' => 'Soligor C/D Macro MC 90mm f/2.5',
 );
 
 # text encoding used in LocationInfo (ref PH)
@@ -584,6 +601,7 @@ my %flashFirmware = (
     '4 4' => '4.04 (SB-400)',
     '5 1' => '5.01 (SB-900)',
     '5 2' => '5.02 (SB-900)',
+    '6 1' => '6.01 (SB-700)', #http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,5034.0.html
     '7 1' => '7.01 (SB-910)', #PH
     OTHER => sub {
         my ($val, $inv) = @_;
@@ -954,6 +972,8 @@ my %binaryDataAttrs = (
     },
     0x001d => { #4
         Name => 'SerialNumber',
+        # Note: this has been known to change even if the serial number on the body
+        # stays the same if some parts of the camera were replaced by Nikon service
         Writable => 'string',
         Protected => 1,
         Notes => q{
@@ -1059,6 +1079,12 @@ my %binaryDataAttrs = (
         Name => 'LocationInfo',
         SubDirectory => { TagTable => 'Image::ExifTool::Nikon::LocationInfo' },
     },
+    0x003d => { #33
+        Name => 'BlackLevel',
+        Writable => 'int16u',
+        Count => 4,
+        # (may need to divide by 4 for some images, ie. D3300/D5300, 12 bit - ref 33)
+    },
     0x0080 => { Name => 'ImageAdjustment',  Writable => 'string' },
     0x0081 => { Name => 'ToneComp',         Writable => 'string' }, #2
     0x0082 => { Name => 'AuxiliaryLens',    Writable => 'string' },
@@ -1508,7 +1534,7 @@ my %binaryDataAttrs = (
         },
         {   # (D5200/D7100=0218, 1J1/1J2/1V1=0400, 1V2=0401, 1J3/1S1=0402, CoolpixA=0601)
             Name => 'ColorBalanceUnknown',
-            Writable => 0,
+            SubDirectory => { TagTable => 'Image::ExifTool::Nikon::ColorBalanceUnknown' },
         },
     ],
     0x0098 => [
@@ -2770,6 +2796,15 @@ my %binaryDataAttrs = (
     },
 );
 
+%Image::ExifTool::Nikon::ColorBalanceUnknown = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0 => {
+        Name => 'ColorBalanceVersion',
+        Format => 'undef[4]',
+    },
+);
+
 %Image::ExifTool::Nikon::Type2 = (
     WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
     CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
@@ -5204,8 +5239,17 @@ my %nikonFocalConversions = (
     },
     NCTH => { Name => 'ThumbnailImage', Format => 'undef', Binary => 1 },
     NCVW => { Name => 'PreviewImage',   Format => 'undef', Binary => 1 },
-    # NCDB - 0 bytes long, or 4 null bytes, or 328 bytes for Nikon D600/D3200/D5200
-    # (when 328 bytes, the first 4 bytes are the long integer 328)
+    NCDB => { # (often 0 bytes long, or 4 null bytes)
+        Name => 'NikonNCDB',
+        SubDirectory => { TagTable => 'Image::ExifTool::Nikon::NCDB' },
+    }
+);
+
+# Nikon NCDB tags from MOV videos (ref PH)
+%Image::ExifTool::Nikon::NCDB = (
+    GROUPS => { 0 => 'MakerNotes', 1 => 'Nikon', 2 => 'Video' },
+    # OP01 - 320 bytes, starts with "0200" (D600,D610,D3200,D5200)
+    #      - 638 bytes, starts with "0200" (D7100)
 );
 
 # Nikon NCTG tags from MOV videos (ref PH)
@@ -5501,18 +5545,18 @@ Image::ExifTool::AddCompositeTags('Image::ExifTool::Nikon');
 # Returns: 1 on success
 sub ProcessNikonAVI($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $pos = $$dirInfo{DirStart} || 0;
     my $dirEnd = $pos + $$dirInfo{DirLen};
-    $exifTool->VerboseDir($dirInfo, undef, $$dirInfo{DirLen});
+    $et->VerboseDir($dirInfo, undef, $$dirInfo{DirLen});
     SetByteOrder('II');
     while ($pos + 4 <= $dirEnd) {
         my $tag = Get16u($dataPt, $pos);
         my $size = Get16u($dataPt, $pos + 2);
         $pos += 4;
         last if $pos + $size > $dirEnd;
-        $exifTool->HandleTag($tagTablePtr, $tag, undef,
+        $et->HandleTag($tagTablePtr, $tag, undef,
             DataPt => $dataPt,
             Start  => $pos,
             Size   => $size,
@@ -5749,10 +5793,10 @@ sub Decrypt($$$;$$)
 # Returns: serial key integer or undef if no serial number provided
 sub SerialKey($$)
 {
-    my ($exifTool, $serial) = @_;
+    my ($et, $serial) = @_;
     # use serial number as key if integral
     return $serial if not defined $serial or $serial =~ /^\d+$/;
-    return 0x22 if $$exifTool{Model} =~ /\bD50$/; # D50 (ref 8)
+    return 0x22 if $$et{Model} =~ /\bD50$/; # D50 (ref 8)
     return 0x60; # D200 (ref 10), D40X (ref PH), etc
 }
 
@@ -5762,12 +5806,12 @@ sub SerialKey($$)
 # Returns: 1 on success
 sub ProcessNikonMOV($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dataPos = $$dirInfo{DataPos};
     my $pos = $$dirInfo{DirStart};
     my $end = $pos + $$dirInfo{DirLen};
-    $exifTool->VerboseDir($$dirInfo{DirName}, 0, $$dirInfo{DirLen});
+    $et->VerboseDir($$dirInfo{DirName}, 0, $$dirInfo{DirLen});
     while ($pos + 8 < $end) {
         my $tag = Get32u($dataPt, $pos);
         my $fmt = Get16u($dataPt, $pos + 4); # (same format code as EXIF)
@@ -5775,24 +5819,24 @@ sub ProcessNikonMOV($$$)
         $pos += 8;
         my $fmtStr = $Image::ExifTool::Exif::formatName[$fmt];
         unless ($fmtStr) {
-            $exifTool->Warn(sprintf("Unknown format ($fmt) for $$dirInfo{DirName} tag 0x%x",$tag));
+            $et->Warn(sprintf("Unknown format ($fmt) for $$dirInfo{DirName} tag 0x%x",$tag));
             last;
         }
         my $size = $count * $Image::ExifTool::Exif::formatSize[$fmt];
         if ($pos + $size > $end) {
-            $exifTool->Warn(sprintf("Truncated data for $$dirInfo{DirName} tag 0x%x",$tag));
+            $et->Warn(sprintf("Truncated data for $$dirInfo{DirName} tag 0x%x",$tag));
             last;
         }
         my $rational;
         my $val = ReadValue($dataPt, $pos, $fmtStr, $count, $size, \$rational);
-        my $key = $exifTool->HandleTag($tagTablePtr, $tag, $val,
+        my $key = $et->HandleTag($tagTablePtr, $tag, $val,
             DataPt  => $dataPt,
             DataPos => $dataPos,
             Format  => $fmtStr,
             Start   => $pos,
             Size    => $size,
         );
-        $$exifTool{RATIONAL}{$key} = $rational if $rational and $key;
+        $$et{RATIONAL}{$key} = $rational if $rational and $key;
         $pos += $size;  # is this padded to an even offset????
     }
     return 1;
@@ -5804,20 +5848,20 @@ sub ProcessNikonMOV($$$)
 # Returns: 1 on success when reading, or new directory when writing (IsWriting set)
 sub ProcessNikonEncrypted($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    $exifTool or return 1;    # allow dummy access
-    my $serial = $$exifTool{NikonSerialKey};
-    my $count = $$exifTool{NikonCountKey};
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    $et or return 1;    # allow dummy access
+    my $serial = $$et{NikonSerialKey};
+    my $count = $$et{NikonCountKey};
     unless (defined $serial and defined $count) {
         if (defined $serial or defined $count) {
             my $missing = defined $serial ? 'ShutterCount' : 'SerialNumber';
-            $exifTool->Warn("Can't decrypt Nikon information (no $missing key)");
+            $et->Warn("Can't decrypt Nikon information (no $missing key)");
         }
-        delete $$exifTool{NikonSerialKey};
-        delete $$exifTool{NikonCountKey};
+        delete $$et{NikonSerialKey};
+        delete $$et{NikonCountKey};
         return 0;
     }
-    my $verbose = $$dirInfo{IsWriting} ? 0 : $exifTool->Options('Verbose');
+    my $verbose = $$dirInfo{IsWriting} ? 0 : $et->Options('Verbose');
     my $tagInfo = $$dirInfo{TagInfo};
     my $data = substr(${$$dirInfo{DataPt}}, $$dirInfo{DirStart}, $$dirInfo{DirLen});
 
@@ -5825,23 +5869,23 @@ sub ProcessNikonEncrypted($$$)
 
     # must re-encrypt when writing if serial number or shutter count changes
     if ($$dirInfo{IsWriting}) {
-        if ($$exifTool{NewNikonSerialKey}) {
-            $newSerial = $$exifTool{NewNikonSerialKey};
+        if ($$et{NewNikonSerialKey}) {
+            $newSerial = $$et{NewNikonSerialKey};
             $recrypt = 1;
         }
-        if ($$exifTool{NewNikonCountKey}) {
-            $newCount = $$exifTool{NewNikonCountKey};
+        if ($$et{NewNikonCountKey}) {
+            $newCount = $$et{NewNikonCountKey};
             $recrypt = 1;
         }
     }
     if ($tagInfo and $$tagInfo{SubDirectory}) {
-        $start = $tagInfo->{SubDirectory}->{DecryptStart};
+        $start = $$tagInfo{SubDirectory}{DecryptStart};
         # may decrypt only part of the information to save time
-        if ($verbose < 3 and $exifTool->Options('Unknown') < 2 and not $recrypt) {
-            $len = $tagInfo->{SubDirectory}->{DecryptLen};
+        if ($verbose < 3 and $et->Options('Unknown') < 2 and not $recrypt) {
+            $len = $$tagInfo{SubDirectory}{DecryptLen};
         }
-        $offset = $tagInfo->{SubDirectory}->{DirOffset};
-        $byteOrder = $tagInfo->{SubDirectory}->{ByteOrder};
+        $offset = $$tagInfo{SubDirectory}{DirOffset};
+        $byteOrder = $$tagInfo{SubDirectory}{ByteOrder};
     }
     $start or $start = 0;
     if (defined $offset) {
@@ -5857,9 +5901,9 @@ sub ProcessNikonEncrypted($$$)
     $data = Decrypt(\$data, $serial, $count, $start, $len);
 
     if ($verbose > 2) {
-        $exifTool->VerboseDir("Decrypted $$tagInfo{Name}");
-        $exifTool->VerboseDump(\$data,
-            Prefix  => $exifTool->{INDENT} . '  ',
+        $et->VerboseDir("Decrypted $$tagInfo{Name}");
+        $et->VerboseDump(\$data,
+            Prefix  => $$et{INDENT} . '  ',
             DataPos => $$dirInfo{DirStart} + $$dirInfo{DataPos} + ($$dirInfo{Base} || 0),
         );
     }
@@ -5876,15 +5920,15 @@ sub ProcessNikonEncrypted($$$)
     my $oldOrder = GetByteOrder();
     SetByteOrder($byteOrder) if $byteOrder;
     if ($$dirInfo{IsWriting}) {
-        my $changed = $$exifTool{CHANGED};
-        $rtnVal = $exifTool->WriteBinaryData(\%subdirInfo, $tagTablePtr);
+        my $changed = $$et{CHANGED};
+        $rtnVal = $et->WriteBinaryData(\%subdirInfo, $tagTablePtr);
         # must re-encrypt if serial number or shutter count changes
         if ($recrypt) {
             $serial = $newSerial if defined $newSerial;
             $count = $newCount if defined $newCount;
-            ++$$exifTool{CHANGED};
+            ++$$et{CHANGED};
         }
-        if ($changed == $$exifTool{CHANGED}) {
+        if ($changed == $$et{CHANGED}) {
             undef $rtnVal;  # nothing changed so use original data
         } else {
             # add back any un-encrypted data at start
@@ -5893,7 +5937,7 @@ sub ProcessNikonEncrypted($$$)
             $rtnVal = Decrypt(\$rtnVal, $serial, $count, $start, $len);
         }
     } else {
-        $rtnVal = $exifTool->ProcessBinaryData(\%subdirInfo, $tagTablePtr);
+        $rtnVal = $et->ProcessBinaryData(\%subdirInfo, $tagTablePtr);
     }
     SetByteOrder($oldOrder);
     return $rtnVal;
@@ -5905,7 +5949,7 @@ sub ProcessNikonEncrypted($$$)
 # Returns: 1 if directory was scanned successfully
 sub PrescanExif($$$)
 {
-    my ($exifTool, $dirInfo, $tagHash) = @_;
+    my ($et, $dirInfo, $tagHash) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dataPos = $$dirInfo{DataPos} || 0;
     my $dataLen = $$dirInfo{DataLen};
@@ -5971,9 +6015,9 @@ sub PrescanExif($$$)
 # Returns: 1 on success
 sub ProcessNikonCaptureEditVersions($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     require Image::ExifTool::NikonCapture;
-    return Image::ExifTool::NikonCapture::ProcessNikonCaptureEditVersions($exifTool, $dirInfo, $tagTablePtr);
+    return Image::ExifTool::NikonCapture::ProcessNikonCaptureEditVersions($et, $dirInfo, $tagTablePtr);
 }
 
 #------------------------------------------------------------------------------
@@ -5983,7 +6027,7 @@ sub ProcessNikonCaptureEditVersions($$$)
 # Notes: This isn't a normal IFD, but is close...
 sub ProcessNikonCaptureOffsets($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirStart = $$dirInfo{DirStart};
     my $dirLen = $$dirInfo{DirLen};
@@ -5991,15 +6035,15 @@ sub ProcessNikonCaptureOffsets($$$)
     return 0 unless $dirLen > 2;
     my $count = Get16u($dataPt, $dirStart);
     return 0 unless $count and $count * 12 + 2 <= $dirLen;
-    if ($exifTool->Options('Verbose')) {
-        $exifTool->VerboseDir('NikonCaptureOffsets', $count);
+    if ($et->Options('Verbose')) {
+        $et->VerboseDir('NikonCaptureOffsets', $count);
     }
     my $index;
     for ($index=0; $index<$count; ++$index) {
         my $pos = $dirStart + 12 * $index + 2;
         my $tagID = Get32u($dataPt, $pos);
         my $value = Get32u($dataPt, $pos + 4);
-        $exifTool->HandleTag($tagTablePtr, $tagID, $value,
+        $et->HandleTag($tagTablePtr, $tagID, $value,
             Index  => $index,
             DataPt => $dataPt,
             Start  => $pos,
@@ -6016,31 +6060,31 @@ sub ProcessNikonCaptureOffsets($$$)
 #          or new directory when writing (IsWriting set in dirInfo)
 sub ProcessNikon($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    $exifTool or return 1;    # allow dummy access
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    $et or return 1;    # allow dummy access
 
     # pre-scan IFD to get SerialNumber (0x001d) and ShutterCount (0x00a7) for use in decryption
     my %needTags = ( 0x001d => 0, 0x00a7 => undef );
-    PrescanExif($exifTool, $dirInfo, \%needTags);
-    $$exifTool{NikonSerialKey} = SerialKey($exifTool, $needTags{0x001d});
-    $$exifTool{NikonCountKey} = $needTags{0x00a7};
+    PrescanExif($et, $dirInfo, \%needTags);
+    $$et{NikonSerialKey} = SerialKey($et, $needTags{0x001d});
+    $$et{NikonCountKey} = $needTags{0x00a7};
 
     # process Nikon makernotes
     my $rtnVal;
     if ($$dirInfo{IsWriting}) {
         # get new decryptino keys if they are being changed
-        my $serial = $exifTool->GetNewValues($Image::ExifTool::Nikon::Main{0x001d});
-        my $count = $exifTool->GetNewValues($Image::ExifTool::Nikon::Main{0x00a7});
-        $$exifTool{NewNikonSerialKey} = SerialKey($exifTool, $serial);
-        $$exifTool{NewNikonCountKey} = $count;
-        $rtnVal = Image::ExifTool::Exif::WriteExif($exifTool, $dirInfo, $tagTablePtr);
-        delete $$exifTool{NewNikonSerialKey};
-        delete $$exifTool{NewNikonCountKey};
+        my $serial = $et->GetNewValues($Image::ExifTool::Nikon::Main{0x001d});
+        my $count = $et->GetNewValues($Image::ExifTool::Nikon::Main{0x00a7});
+        $$et{NewNikonSerialKey} = SerialKey($et, $serial);
+        $$et{NewNikonCountKey} = $count;
+        $rtnVal = Image::ExifTool::Exif::WriteExif($et, $dirInfo, $tagTablePtr);
+        delete $$et{NewNikonSerialKey};
+        delete $$et{NewNikonCountKey};
     } else {
-        $rtnVal = Image::ExifTool::Exif::ProcessExif($exifTool, $dirInfo, $tagTablePtr);
+        $rtnVal = Image::ExifTool::Exif::ProcessExif($et, $dirInfo, $tagTablePtr);
     }
-    delete $$exifTool{NikonSerialKey};
-    delete $$exifTool{NikonCountKey};
+    delete $$et{NikonSerialKey};
+    delete $$et{NikonCountKey};
     return $rtnVal;
 }
 
@@ -6063,7 +6107,7 @@ Nikon maker notes in EXIF information.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -17,7 +17,7 @@ use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Exif;
 
-$VERSION = '1.09';
+$VERSION = '1.10';
 
 sub ProcessNikonCapture($$$);
 
@@ -678,18 +678,18 @@ my %unsharpColor = (
 # Returns: 1 on success
 sub WriteNikonCapture($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    $exifTool or return 1;    # allow dummy access to autoload this package
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    $et or return 1;    # allow dummy access to autoload this package
 
     # no need to edit this information unless necessary
-    unless ($exifTool->{EDIT_DIRS}->{MakerNotes} or $exifTool->{EDIT_DIRS}->{IPTC}) {
+    unless ($$et{EDIT_DIRS}{MakerNotes} or $$et{EDIT_DIRS}{IPTC}) {
         return undef;
     }
     my $dataPt = $$dirInfo{DataPt};
     my $dirStart = $$dirInfo{DirStart};
     my $dirLen = $$dirInfo{DirLen};
     if ($dirLen < 22) {
-        $exifTool->Warn('Short Nikon Capture Data',1);
+        $et->Warn('Short Nikon Capture Data',1);
         return undef;
     }
     # make sure the capture data is properly contained
@@ -699,7 +699,7 @@ sub WriteNikonCapture($$$)
     my $size = Get32u($dataPt, $dirStart + 18);
     my $pad = $dirLen - $size - 18; 
     unless ($tagID == 0x7a86a940 and ($pad >= 0 or $pad == -18)) {
-        $exifTool->Warn('Unrecognized Nikon Capture Data header');
+        $et->Warn('Unrecognized Nikon Capture Data header');
         return undef;
     }
     # determine if there is any data after this block
@@ -711,7 +711,7 @@ sub WriteNikonCapture($$$)
     }
     my $outBuff = '';
     my $pos;
-    my $newTags = $exifTool->GetNewTagInfoHash($tagTablePtr);
+    my $newTags = $et->GetNewTagInfoHash($tagTablePtr);
     my $dirEnd = $dirStart + $dirLen;
 
     # loop through all entries in the Nikon Capture data
@@ -719,7 +719,7 @@ sub WriteNikonCapture($$$)
         $tagID = Get32u($dataPt, $pos);
         $size = Get32u($dataPt, $pos + 18) - 4;
         last if $size < 0 or $pos + 22 + $size > $dirEnd;
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID);
         if ($tagInfo) {
             my $newVal;
             if ($$tagInfo{SubDirectory}) {
@@ -731,25 +731,25 @@ sub WriteNikonCapture($$$)
                 );
                 my $subTable = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
                 # ignore minor errors in IPTC since there is typically trailing garbage
-                my $oldSetting = $exifTool->Options('IgnoreMinorErrors');
-                $$tagInfo{Name} =~ /IPTC/ and $exifTool->Options(IgnoreMinorErrors => 1);
+                my $oldSetting = $et->Options('IgnoreMinorErrors');
+                $$tagInfo{Name} =~ /IPTC/ and $et->Options(IgnoreMinorErrors => 1);
                 # rewrite the directory
-                $newVal = $exifTool->WriteDirectory(\%subdirInfo, $subTable);
+                $newVal = $et->WriteDirectory(\%subdirInfo, $subTable);
                 # restore our original options
-                $exifTool->Options(IgnoreMinorErrors => $oldSetting);
+                $et->Options(IgnoreMinorErrors => $oldSetting);
             } elsif ($$newTags{$tagID}) {
                 # get new value for this tag if we are writing it
                 my $format = $$tagInfo{Format} || $$tagInfo{Writable};
                 my $oldVal = ReadValue($dataPt,$pos+22,$format,1,$size);
-                my $nvHash = $exifTool->GetNewValueHash($tagInfo);
-                if ($exifTool->IsOverwriting($nvHash, $oldVal)) {
-                    my $val = $exifTool->GetNewValues($tagInfo);
+                my $nvHash = $et->GetNewValueHash($tagInfo);
+                if ($et->IsOverwriting($nvHash, $oldVal)) {
+                    my $val = $et->GetNewValues($tagInfo);
                     $newVal = WriteValue($val, $$tagInfo{Writable}) if defined $val;
                     if (defined $newVal and length $newVal) {
-                        ++$exifTool->{CHANGED};
+                        ++$$et{CHANGED};
                     } else {
                         undef $newVal;
-                        $exifTool->Warn("Can't delete $$tagInfo{Name}");
+                        $et->Warn("Can't delete $$tagInfo{Name}");
                     }
                 }
             }
@@ -771,7 +771,7 @@ sub WriteNikonCapture($$$)
             # (did they forget to include the size word?)
             $outBuff .= substr($$dataPt, $pos, 4);
         } else {
-            $exifTool->Warn('Nikon Capture Data improperly terminated',1);
+            $et->Warn('Nikon Capture Data improperly terminated',1);
             return undef;
         }
     }
@@ -787,17 +787,17 @@ sub WriteNikonCapture($$$)
 # Returns: 1 on success
 sub ProcessNikonCaptureEditVersions($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirStart = $$dirInfo{DirStart};
     my $dirLen = $$dirInfo{DirLen};
     my $dirEnd = $dirStart + $dirLen;
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     SetByteOrder('II');
     return 0 unless $dirLen > 4;
     my $num = Get32u($dataPt, $dirStart);
     my $pos = $dirStart + 4;
-    $verbose and $exifTool->VerboseDir('NikonCaptureEditVersions', $num);
+    $verbose and $et->VerboseDir('NikonCaptureEditVersions', $num);
     while ($num) {
         last if $pos + 4 > $dirEnd;
         my $len = Get32u($dataPt, $pos);
@@ -809,12 +809,12 @@ sub ProcessNikonCaptureEditVersions($$$)
             DirStart => $pos + 4,
             DirLen   => $len,
         );
-        $$exifTool{DOC_NUM} = ++$$exifTool{DOC_COUNT};
-        $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        $$et{DOC_NUM} = ++$$et{DOC_COUNT};
+        $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
         --$num;
         $pos += $len + 4;
     }
-    delete $$exifTool{DOC_NUM};
+    delete $$et{DOC_NUM};
     return 1;
 }
 
@@ -824,22 +824,22 @@ sub ProcessNikonCaptureEditVersions($$$)
 # Returns: 1 on success
 sub ProcessNikonCapture($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirStart = $$dirInfo{DirStart};
     my $dirLen = $$dirInfo{DirLen};
     my $dirEnd = $dirStart + $dirLen;
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     my $success = 0;
     SetByteOrder('II');
-    $verbose and $exifTool->VerboseDir('NikonCapture', 0, $dirLen);
+    $verbose and $et->VerboseDir('NikonCapture', 0, $dirLen);
     my $pos;
     for ($pos=$dirStart+22; $pos+22<$dirEnd; ) {
         my $tagID = Get32u($dataPt, $pos);
         my $size = Get32u($dataPt, $pos + 18) - 4;
         $pos += 22;
         last if $size < 0 or $pos + $size > $dirEnd;
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID);
         if ($tagInfo or $verbose) {
             my ($format, $value);
             # (note that Writable will be 0 for Unknown tags)
@@ -859,7 +859,7 @@ sub ProcessNikonCapture($$$)
             } elsif ($size == 1) {
                 $value = substr($$dataPt, $pos, $size);
             }
-            $exifTool->HandleTag($tagTablePtr, $tagID, $value,
+            $et->HandleTag($tagTablePtr, $tagID, $value,
                 DataPt => $dataPt,
                 Start  => $pos,
                 Size   => $size,
@@ -889,7 +889,7 @@ the maker notes of NEF images.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -4385,7 +4385,7 @@ this information.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -14,7 +14,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::XMP;
 use Image::ExifTool::ZIP;
 
-$VERSION = '1.06';
+$VERSION = '1.07';
 
 # test for recognized OOXML document extensions
 my %isOOXML = (
@@ -208,19 +208,19 @@ sub GetTagID($)
 # Returns: 1 if valid tag was found
 sub FoundTag($$$$;$)
 {
-    my ($exifTool, $tagTablePtr, $props, $val, $attrs) = @_;
+    my ($et, $tagTablePtr, $props, $val, $attrs) = @_;
     return 0 unless @$props;
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
 
     my $tag = $$props[-1];
-    $exifTool->VPrint(0, "  | - Tag '", join('/',@$props), "'\n") if $verbose > 1;
+    $et->VPrint(0, "  | - Tag '", join('/',@$props), "'\n") if $verbose > 1;
 
     # un-escape XML character entities
     $val = Image::ExifTool::XMP::UnescapeXML($val);
     # convert OOXML-escaped characters (ie. "_x0000d_" is a newline)
     $val =~ s/_x([0-9a-f]{4})_/Image::ExifTool::PackUTF8(hex($1))/gie;
     # convert from UTF8 to ExifTool Charset
-    $val = $exifTool->Decode($val, 'UTF8');
+    $val = $et->Decode($val, 'UTF8');
     # queue this attribute for later if necessary
     if ($queueAttrs{$tag}) {
         $queuedAttrs{$tag} = $val;
@@ -246,7 +246,7 @@ sub FoundTag($$$$;$)
                 $tagInfo{Format} = 'date',
                 $tagInfo{PrintConv} = '$self->ConvertDateTime($val)';
             }
-            $exifTool->VPrint(0, "  | [adding $tag]\n") if $verbose;
+            $et->VPrint(0, "  | [adding $tag]\n") if $verbose;
             AddTagToTable($tagTablePtr, $tag, \%tagInfo);
         }
     } elsif ($tag eq 'xmlns') {
@@ -288,11 +288,11 @@ sub FoundTag($$$$;$)
             $val = Image::ExifTool::XMP::ConvertXMPDate($val) if $fmt eq 'date';
         }
     } else {
-        $exifTool->VPrint(0, "  [adding $tag]\n") if $verbose;
+        $et->VPrint(0, "  [adding $tag]\n") if $verbose;
         AddTagToTable($tagTablePtr, $tag, { Name => ucfirst $tag });
     }
     # save the tag
-    $exifTool->HandleTag($tagTablePtr, $tag, $val);
+    $et->HandleTag($tagTablePtr, $tag, $val);
 
     # start fresh for next tag
     undef $vectorCount;
@@ -311,7 +311,7 @@ sub FoundTag($$$$;$)
 #   ZIP     - reference to Archive::Zip object for this file
 sub ProcessDOCX($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $zip = $$dirInfo{ZIP};
     my $tagTablePtr = GetTagTable('Image::ExifTool::OOXML::Main');
     my $mime = $$dirInfo{MIME} || $Image::ExifTool::mimeType{DOCX};
@@ -320,17 +320,17 @@ sub ProcessDOCX($$)
     my $fileType = $fileType{$mime};
     if ($fileType) {
         # THMX is a special case because its contents.main MIME types is PPTX
-        if ($fileType eq 'PPTX' and $$exifTool{FILE_EXT} and $$exifTool{FILE_EXT} eq 'THMX') {
+        if ($fileType eq 'PPTX' and $$et{FILE_EXT} and $$et{FILE_EXT} eq 'THMX') {
             $fileType = 'THMX';
         }
     } else {
-        $exifTool->VPrint(0, "Unrecognized MIME type: $mime\n");
+        $et->VPrint(0, "Unrecognized MIME type: $mime\n");
         # get MIME type according to file extension
-        $fileType = $$exifTool{FILE_EXT};
+        $fileType = $$et{FILE_EXT};
         # default to 'DOCX' if this isn't a known OOXML extension
         $fileType = 'DOCX' unless $fileType and $isOOXML{$fileType};
     }
-    $exifTool->SetFileType($fileType);
+    $et->SetFileType($fileType);
 
     # must catch all Archive::Zip warnings
     local $SIG{'__WARN__'} = \&Image::ExifTool::ZIP::WarnProc;
@@ -342,19 +342,19 @@ sub ProcessDOCX($$)
         # get filename of this ZIP member
         my $file = $member->fileName();
         next unless defined $file;
-        $exifTool->VPrint(0, "File: $file\n");
+        $et->VPrint(0, "File: $file\n");
         # set the document number and extract ZIP tags
-        $$exifTool{DOC_NUM} = ++$docNum;
-        Image::ExifTool::ZIP::HandleMember($exifTool, $member);
+        $$et{DOC_NUM} = ++$docNum;
+        Image::ExifTool::ZIP::HandleMember($et, $member);
         # process only XML and JPEG/WMF thumbnail images in "docProps" directory
         next unless $file =~ m{^docProps/(.*\.xml|(thumbnail\.(jpe?g|wmf)))$}i;
         # get the file contents (CAREFUL! $buff MUST be local since we hand off a value ref)
         my ($buff, $status) = $zip->contents($member);
-        $status and $exifTool->Warn("Error extracting $file"), next;
+        $status and $et->Warn("Error extracting $file"), next;
         # extract docProps/thumbnail.(jpg|mwf) as PreviewImage|PreviewMWF
         if ($file =~ /\.(jpe?g|wmf)$/i) {
             my $tag = $file =~ /\.wmf$/i ? 'PreviewWMF' : 'PreviewImage';
-            $exifTool->FoundTag($tag, \$buff);
+            $et->FoundTag($tag, \$buff);
             next;
         }
         # process XML files (docProps/app.xml, docProps/core.xml, docProps/custom.xml)
@@ -366,10 +366,10 @@ sub ProcessDOCX($$)
                 FoundProc => \&FoundTag,
             },
         );
-        $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
         undef $buff;    # (free memory now)
     }
-    delete $$exifTool{DOC_NUM};
+    delete $$et{DOC_NUM};
     return 1;
 }
 
@@ -394,7 +394,7 @@ archives of XML files.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -16,7 +16,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.00';
+$VERSION = '1.01';
 
 my $MAX_PACKETS = 2;    # maximum packets to scan from each stream at start of file
 
@@ -39,14 +39,14 @@ my $MAX_PACKETS = 2;    # maximum packets to scan from each stream at start of f
 # Returns: 1 on success
 sub ProcessPacket($$)
 {
-    my ($exifTool, $dataPt) = @_;
+    my ($et, $dataPt) = @_;
     my $rtnVal = 0;
     if ($$dataPt =~ /^(.)(vorbis|theora)/s) {
         my ($tag, $type) = (ord($1), ucfirst($2));
         # this is an OGV file if it contains Theora video
-        $exifTool->OverrideFileType('OGV') if $type eq 'Theora' and $$exifTool{FILE_TYPE} eq 'OGG';
+        $et->OverrideFileType('OGV') if $type eq 'Theora' and $$et{FILE_TYPE} eq 'OGG';
         my $tagTablePtr = GetTagTable("Image::ExifTool::${type}::Main");
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
         return 0 unless $tagInfo and $$tagInfo{SubDirectory};
         my $subdir = $$tagInfo{SubDirectory};
         my %dirInfo = (
@@ -56,11 +56,11 @@ sub ProcessPacket($$)
         );
         my $table = GetTagTable($$subdir{TagTable});
         # set group1 so Theoris comments can be distinguised from Vorbis comments
-        $$exifTool{SET_GROUP1} = $type if $type eq 'Theora';
+        $$et{SET_GROUP1} = $type if $type eq 'Theora';
         SetByteOrder($$subdir{ByteOrder}) if $$subdir{ByteOrder};
-        $rtnVal = $exifTool->ProcessDirectory(\%dirInfo, $table);
+        $rtnVal = $et->ProcessDirectory(\%dirInfo, $table);
         SetByteOrder('II');
-        delete $$exifTool{SET_GROUP1};
+        delete $$et{SET_GROUP1};
     }
     return $rtnVal;
 }
@@ -71,16 +71,16 @@ sub ProcessPacket($$)
 # Returns: 1 on success, 0 if this wasn't a valid Ogg file
 sub ProcessOGG($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
 
     # must first check for leading/trailing ID3 information
-    unless ($exifTool->{DoneID3}) {
+    unless ($$et{DoneID3}) {
         require Image::ExifTool::ID3;
-        Image::ExifTool::ID3::ProcessID3($exifTool, $dirInfo) and return 1;
+        Image::ExifTool::ID3::ProcessID3($et, $dirInfo) and return 1;
     }
     my $raf = $$dirInfo{RAF};
-    my $verbose = $exifTool->Options('Verbose');
-    my $out = $exifTool->Options('TextOut');
+    my $verbose = $et->Options('Verbose');
+    my $out = $et->Options('TextOut');
     my ($success, $page, $packets, $streams, $stream) = (0,0,0,0,'');
     my ($buff, $flag, %val, $numFlac, %streamPage);
 
@@ -91,13 +91,13 @@ sub ProcessOGG($$)
         if ($raf and $raf->Read($buff, 28) == 28) {
             # validate magic number
             unless ($buff =~ /^OggS/) {
-                $success and $exifTool->Warn('Lost synchronization');
+                $success and $et->Warn('Lost synchronization');
                 last;
             }
             unless ($success) {
                 # set file type and initialize on first page
                 $success = 1;
-                $exifTool->SetFileType();
+                $et->SetFileType();
                 SetByteOrder('II');
             }
             $flag = Get8u(\$buff, 5);       # page flag
@@ -125,7 +125,7 @@ sub ProcessOGG($$)
             # can finally process previous packet from this stream
             # unless this is a continuation page
             if (defined $val{$stream} and not $flag & 0x01) {
-                ProcessPacket($exifTool, \$val{$stream});
+                ProcessPacket($et, \$val{$stream});
                 delete $val{$stream};
                 # only read the first $MAX_PACKETS packets from each stream
                 if ($packets > $MAX_PACKETS * $streams or not defined $raf) {
@@ -151,7 +151,7 @@ sub ProcessOGG($$)
             if ($page == $pageNum) {
                 $streamPage{$stream} = ++$page;
             } else {
-                $exifTool->Warn('Missing page(s) in Ogg file');
+                $et->Warn('Missing page(s) in Ogg file');
                 undef $page;
                 delete $streamPage{$stream};
             }
@@ -161,7 +161,7 @@ sub ProcessOGG($$)
         if ($verbose > 1) {
             printf $out "Page %d, stream 0x%x, flag 0x%x (%d bytes)\n",
                    $pageNum, $stream, $flag, $dataLen;
-            $exifTool->VerboseDump(\$buff, DataPos => $raf->Tell() - $dataLen);
+            $et->VerboseDump(\$buff, DataPos => $raf->Tell() - $dataLen);
         }
         if (defined $val{$stream}) {
             $val{$stream} .= $buff;     # add this continuation page
@@ -179,7 +179,7 @@ sub ProcessOGG($$)
             last if $numFlac <= 0;
         } elsif (defined $val{$stream} and $flag & 0x04) {
             # process Ogg packet now if end-of-stream bit is set
-            ProcessPacket($exifTool, \$val{$stream});
+            ProcessPacket($et, \$val{$stream});
             delete $val{$stream};
         }
     }
@@ -187,7 +187,7 @@ sub ProcessOGG($$)
         # process FLAC headers as if it was a complete FLAC file
         require Image::ExifTool::FLAC;
         my %dirInfo = ( RAF => new File::RandomAccess(\$val{$stream}) );
-        Image::ExifTool::FLAC::ProcessFLAC($exifTool, \%dirInfo);
+        Image::ExifTool::FLAC::ProcessFLAC($et, \%dirInfo);
     }
     return $success;
 }
@@ -211,7 +211,7 @@ information from Ogg bitstream container files.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -16,7 +16,7 @@
 #               8) Shingo Noguchi, PhotoXP (http://www.daifukuya.com/photoxp/)
 #               9) Mark Dapoz private communication
 #              10) Lilo Huang private communication (E-330)
-#              11) http://olypedia.de/Olympus_Makernotes (Nov. 21, 2011)
+#              11) http://olypedia.de/Olympus_Makernotes (May 30, 2013)
 #              12) Ioannis Panagiotopoulos private communication (E-510)
 #              13) Chris Shaw private communication (E-3)
 #              14) Viktor Lushnikov private communication (E-400)
@@ -26,6 +26,7 @@
 #              18) Tomasz Kawecki private communication
 #              19) Brad Grier private communication
 #              20) Niels Kristian Bech Jensen private communication
+#              21) Iliah Borg private communication (LibRaw)
 #------------------------------------------------------------------------------
 
 package Image::ExifTool::Olympus;
@@ -35,7 +36,7 @@ use vars qw($VERSION);
 use Image::ExifTool::Exif;
 use Image::ExifTool::APP12;
 
-$VERSION = '2.03';
+$VERSION = '2.16';
 
 sub PrintLensInfo($$$);
 
@@ -74,7 +75,7 @@ my %olympusLensTypes = (
     '0 10 10' => 'Olympus M.Zuiko Digital ED 12-50mm F3.5-6.3 EZ', #PH
     '0 11 10' => 'Olympus M.Zuiko Digital 45mm F1.8', #17
     '0 12 10' => 'Olympus M.Zuiko Digital ED 60mm F2.8 Macro', #20
-    '0 13 10' => 'Olympus M.Zuiko Digital ED 14-42mm F3.5-5.6 II R', #PH
+    '0 13 10' => 'Olympus M.Zuiko Digital 14-42mm F3.5-5.6 II R', #PH/20
     '0 14 10' => 'Olympus M.Zuiko Digital ED 40-150mm F4.0-5.6 R', #19
   # '0 14 10.1' => 'Olympus M.Zuiko Digital ED 14-150mm F4.0-5.6 II', #11 (questionable & unconfirmed)
     '0 15 00' => 'Olympus Zuiko Digital ED 7-14mm F4.0',
@@ -83,8 +84,12 @@ my %olympusLensTypes = (
     '0 17 00' => 'Olympus Zuiko Digital Pro ED 35-100mm F2.0', #7
     '0 18 00' => 'Olympus Zuiko Digital 14-45mm F3.5-5.6',
     '0 18 10' => 'Olympus M.Zuiko Digital ED 75-300mm F4.8-6.7 II', #20
+    '0 19 10' => 'Olympus M.Zuiko Digital ED 12-40mm F2.8 Pro', #PH
     '0 20 00' => 'Olympus Zuiko Digital 35mm F3.5 Macro', #9
+  # '0 20 10' => 'Olympus M.Zuiko Digital ED 40-150mm F2.8 Pro', #PH (guess)
+    '0 21 10' => 'Olympus M.Zuiko Digital ED 14-42mm F3.5-5.6 EZ', #20
     '0 22 00' => 'Olympus Zuiko Digital 17.5-45mm F3.5-5.6', #9
+    '0 22 10' => 'Olympus M.Zuiko Digital 25mm F1.8', #20
     '0 23 00' => 'Olympus Zuiko Digital ED 14-42mm F3.5-5.6', #PH
     '0 24 00' => 'Olympus Zuiko Digital ED 40-150mm F4.0-5.6', #PH
     '0 30 00' => 'Olympus Zuiko Digital ED 50-200mm F2.8-3.5 SWD', #7
@@ -99,8 +104,11 @@ my %olympusLensTypes = (
     '1 02 00' => 'Sigma 55-200mm F4.0-5.6 DC',
     '1 02 10' => 'Sigma 19mm F2.8 EX DN', #20
     '1 03 00' => 'Sigma 18-125mm F3.5-5.6 DC',
+    '1 03 10' => 'Sigma 30mm F2.8 DN | A', #20
     '1 04 00' => 'Sigma 18-125mm F3.5-5.6 DC', #7
+    '1 04 10' => 'Sigma 19mm F2.8 DN | A', #20
     '1 05 00' => 'Sigma 30mm F1.4 EX DC HSM', #10
+    '1 05 10' => 'Sigma 60mm F2.8 DN | A', #20
     '1 06 00' => 'Sigma APO 50-500mm F4.0-6.3 EX DG HSM', #6
     '1 07 00' => 'Sigma Macro 105mm F2.8 EX DG', #PH
     '1 08 00' => 'Sigma APO Macro 150mm F2.8 EX DG HSM', #PH
@@ -136,6 +144,10 @@ my %olympusLensTypes = (
     '2 15 10' => 'Lumix G X Vario 12-35mm F2.8 Asph. Power OIS', #PH
     '2 16 10' => 'Lumix G Vario 45-150mm F4.0-5.6 Asph. Mega OIS', #20
     '2 17 10' => 'Lumix G X Vario 35-100mm F2.8 Power OIS', #PH
+    '2 18 10' => 'Lumix G Vario 14-42mm F3.5-5.6 II Asph. Mega OIS', #20
+    '2 19 10' => 'Lumix G Vario 14-140mm F3.5-5.6 Asph. Power OIS', #20
+    '2 20 10' => 'Lumix G Vario 12-32mm F3.5-5.6 Asph. Mega OIS', #20
+    '2 21 10' => 'Leica DG Nocticron 42.5mm F1.2 Asph. Power OIS', #20
     '3 01 00' => 'Leica D Vario Elmarit 14-50mm F2.8-3.5 Asph.',
     '3 02 00' => 'Leica D Summilux 25mm F1.4 Asph.',
 );
@@ -310,7 +322,12 @@ my %olympusCameraTypes = (
     D4545 => 'VH410',
     D4547 => 'TG-2',
     D4548 => 'TG-830',
+    D4549 => 'TG-630',
+    D4550 => 'SH-50',
+    D4553 => 'SZ-16,DZ-105',
     D4562 => 'SP-820UZ',
+    D4566 => 'SZ-15',
+    D4572 => 'STYLUS1',
     D4809 => 'C2500L',
     D4842 => 'E-10',
     D4856 => 'C-1',
@@ -341,6 +358,10 @@ my %olympusCameraTypes = (
     S0040 => 'E-PL1s',
     S0042 => 'E-PL5',
     S0043 => 'E-PM2',
+    S0044 => 'E-P5',
+    S0045 => 'E-PL6',
+    S0047 => 'E-M1',
+    S0051 => 'E-M10',
     SR45 => 'D220',
     SR55 => 'D320L',
     SR83 => 'D340L',
@@ -1670,6 +1691,10 @@ my %indexInfo = (
         },
     },
     0x203 => { Name => 'ExposureShift', Writable => 'rational64s' }, #11 (some E-models only)
+    0x204 => { #11 (XZ-1)
+        Name => 'NDFilter',
+        PrintConv => \%offOn,
+    },
     0x300 => { #6
         Name => 'MacroMode',
         Writable => 'int16u',
@@ -1697,6 +1722,7 @@ my %indexInfo = (
             4 => 'MF',
             5 => 'Face detect',
             6 => 'Imager AF',
+            7 => 'Live View Magnification Frame',
             8 => 'AF sensor',
         }}],
     },
@@ -1767,7 +1793,7 @@ my %indexInfo = (
         },
     },
     0x401 => { Name => 'FlashExposureComp', Writable => 'rational64s' }, #6
-    # 0x402 - FlashMode? bit0=TTL, bit2=SuperFP (ref 11)
+    # 0x402 - FlashMode? bit0=TTL, bit1=auto, bit2=SuperFP (ref 11)
     0x403 => { #11
         Name => 'FlashRemoteControl',
         Writable => 'int16u',
@@ -2110,6 +2136,19 @@ my %indexInfo = (
            '1 -1 1' => 'High',
         },
     },
+    0x52e => { #11/PH
+        Name => 'ToneLevel',
+        PrintConv => [
+            undef, # ?
+            '"Highlights $val"',
+            undef, # (highlights min)
+            undef, # (highlights max)
+            undef, # ?
+            '"Shadows $val"',
+            undef, # (shadows min)
+            undef, # (shadows max)
+        ]
+    },
     0x52f => { #PH
         Name => 'ArtFilterEffect',
         Writable => 'int16u',
@@ -2195,6 +2234,7 @@ my %indexInfo = (
             1 => 'On, Mode 1',
             2 => 'On, Mode 2',
             3 => 'On, Mode 3',
+            4 => 'On, Mode 4', # (NC, E-P5)
         },
     },
     0x900 => { #11
@@ -2230,6 +2270,14 @@ my %indexInfo = (
         Writable => 'int16u',
         PrintConv => \%offOn,
     },
+    0x908 => { #PH (NC, E-M1)
+        Name => 'DateTimeUTC',
+        Writable => 'string',
+        Groups => { 2 => 'Time' },
+        Shift => 'Time',
+        PrintConv => '$self->ConvertDateTime($val)',
+        PrintConvInv => '$self->InverseDateTime($val,undef,1)',
+    },
 );
 
 # Olympus RAW processing IFD (ref 6)
@@ -2406,6 +2454,13 @@ my %indexInfo = (
     0x113 => { Name => 'RawDevSaturation3',     Writable => 'int16s', Count => 3 }, #(NC Count)
     0x119 => { Name => 'RawDevAutoGradation',   Writable => 'int16u', PrintConv => \%offOn },
     0x120 => { Name => 'RawDevPMNoiseFilter',   Writable => 'int16u' }, #(NC format)
+    0x121 => { #PH (E-P5)
+        Name => 'RawDevArtFilter',
+        Writable => 'int16u',
+        Count => 4,
+        PrintConvColumns => 2,
+        PrintConv => [ \%filters ],
+    },
 );
 
 # Olympus Image processing IFD
@@ -2491,6 +2546,12 @@ my %indexInfo = (
     },
     # 0x800 LensDistortionParams, float[9] (ref 11)
     # 0x801 LensShadingParams, int16u[16] (ref 11)
+    0x0805 => { #21
+        Name => 'SensorCalibration',
+        Notes => '2 numbers: 1. recommended maximum, 2. calibration midpoint',
+        Writable => 'int16s',
+        Count => 2,
+    },
     # 0x1010-0x1012 are the processing options used in camera or in
     # Olympus software, which 0x050a-0x050c are in-camera only (ref 6)
     0x1010 => { #PH/4
@@ -2543,7 +2604,9 @@ my %indexInfo = (
         Writable => 'int8u',
         Count => 2,
         PrintConv => {
+            # '0 0' - have seen this with a 16:9 XZ-1 image - PH
             '1 1' => '4:3',
+            '1 4' => '1:1', #PH (E-P5 Storyboard effect, does this indicate 4:3 converted to 6:6?)
             '2 2' => '3:2',
             '3 3' => '16:9',
             '4 4' => '6:6',
@@ -2586,6 +2649,13 @@ my %indexInfo = (
         Count => 12,
         Notes => 'X/Y offset and width/height of the cropped face detect frame',
     },
+    0x1306 => { #PH (NC, E-M1)
+        Name => 'CameraTemperature',
+        Writable => 'int16u',
+        Format => 'int16s', #(NC)
+        ValueConv => '$val ? $val : undef', # zero for some models (how to differentiate from 0 C?)
+        Notes => 'this seems to be in degrees C only for some models',
+    },
 );
 
 # Olympus Focus Info IFD
@@ -2788,14 +2858,44 @@ my %indexInfo = (
         Writable => 'int16u',
         PrintConv => \%offOn,
     },
-    0x1500 => { #6
+    0x1500 => [{ #6
         Name => 'SensorTemperature',
+        # (Stylus 1 stores values like "34 0 0")
+        Condition => '$$self{Model} =~ /E-(1|M5)\b/ || $count != 1',
         Writable => 'int16s',
-        Notes => q{
-            approximately Celsius for E-1, unknown calibration for E-3/410/420/510, and
-            always zero for E-300/330/400/500, divide by 10 for E-P1?
-        },
-    },
+        PrintConv => '$val=~s/ 0 0$//; "$val C"',
+        PrintConvInv => '$val=~s/ ?C$//; $val',
+    },{
+        Name => 'SensorTemperature',
+        Writable => 'int16s',
+        RawConv => '($val and $val ne "-32768") ? $val : undef', # ignore 0 and -32768
+        # ValueConv => '-2*(($val/135)**2)+55', #11
+        ValueConv => '84 - 3 * $val / 26', #http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,5423.0.html
+        ValueConvInv => 'int((84 - $val) * 26 / 3 + 0.5)',
+        PrintConv => 'sprintf("%.1f C",$val)',
+        PrintConvInv => '$val=~s/ ?C$//; $val',
+        # data from test shots by Eric Sibert:
+        #    E-510           E-620
+        # Raw  Ambient    Raw  Ambient
+        # ---  -------    ---  -------
+        # 534    22.7     518    22.7
+        # 550    20.6     531    19.3
+        # 552    20.8     533    17.9
+        # 558    19.3     582    17.2
+        # 564    19.1     621    12.3
+        # 567    17.8     634     9.7
+        # 576    18.6     650     8.0
+        # 582    17.2     660     7.7
+        # 599    13.8     703     3.3
+        # 631    10.7     880   -20.6
+        # 642    12.4     880   -20.6
+        # 652     9.6     892   -24.4
+        # 692     5.2     892   -22.7
+        # 714     3.3
+        # 895   -19.8
+        # 895   -19.2
+        # 900   -21.7
+    }],
     0x1600 => { # ref http://fourthirdsphoto.com/vbb/showpost.php?p=107607&postcount=15
         Name => 'ImageStabilization',
         # (the other value is more reliable, so ignore this totally if the other exists)
@@ -3483,8 +3583,8 @@ sub PrintAFAreas($)
 # Returns: 1 if this looked like a valid ORF file, 0 otherwise
 sub ProcessORF($$)
 {
-    my ($exifTool, $dirInfo) = @_;
-    return $exifTool->ProcessTIFF($dirInfo);
+    my ($et, $dirInfo) = @_;
+    return $et->ProcessTIFF($dirInfo);
 }
 
 1;  # end
@@ -3506,7 +3606,7 @@ Olympus or Epson maker notes in EXIF information.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -14,7 +14,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.00';
+$VERSION = '1.01';
 
 # supported EXR value format types (other types are extracted as undef binary data)
 my %formatType = (
@@ -155,38 +155,38 @@ my %formatType = (
 # Returns: 1 on success, 0 if this wasn't a valid OpenEXR file
 sub ProcessEXR($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
-    my $verbose = $exifTool->Options('Verbose');
-    my $binary = $exifTool->Options('Binary') || $verbose;
+    my $verbose = $et->Options('Verbose');
+    my $binary = $et->Options('Binary') || $verbose;
     my ($buff, $buf2, $dim);
 
     # verify this is a valid RIFF file
     return 0 unless $raf->Read($buff, 8) == 8;
     return 0 unless $buff =~ /^\x76\x2f\x31\x01/s;
-    $exifTool->SetFileType();
+    $et->SetFileType();
     SetByteOrder('II');
     my $tagTablePtr = GetTagTable('Image::ExifTool::OpenEXR::Main');
 
     # extract information from header
     my $ver = unpack('x4V', $buff);
-    $exifTool->HandleTag($tagTablePtr, '_ver', $ver & 0xff);
-    $exifTool->HandleTag($tagTablePtr, '_lay', $ver & 0x200);
+    $et->HandleTag($tagTablePtr, '_ver', $ver & 0xff);
+    $et->HandleTag($tagTablePtr, '_lay', $ver & 0x200);
 
     # extract attributes
     for (;;) {
         $raf->Read($buff, 68) or last;
         last if $buff =~ /^\0/;
         unless ($buff =~ /^([^\0]{1,31})\0([^\0]{1,31})\0(.{4})/sg) {
-            $exifTool->Warn('EXR format error');
+            $et->Warn('EXR format error');
             last;
         }
         my ($tag, $type, $size) = ($1, $2, unpack('V', $3));
         unless ($raf->Seek(pos($buff) - length($buff), 1)) {
-            $exifTool->Warn('Seek error');
+            $et->Warn('Seek error');
             last;
         }
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
         unless ($tagInfo) {
             my $name = ucfirst $tag;
             $name =~ tr/-_a-zA-Z0-9//dc;
@@ -199,7 +199,7 @@ sub ProcessEXR($$)
             }
             $tagInfo = { Name => $name, WasAdded => 1 };
             AddTagToTable($tagTablePtr, $tag, $tagInfo);
-            $exifTool->VPrint(0, $exifTool->{INDENT}, "[adding $tag]\n");
+            $et->VPrint(0, $$et{INDENT}, "[adding $tag]\n");
         }
         my ($val, $success);
         my $format = $formatType{$type};
@@ -252,7 +252,7 @@ sub ProcessEXR($$)
             $success = $raf->Seek($size, 1);
         }
         unless ($success) {
-            $exifTool->Warn('Truncated or corrupted EXR file');
+            $et->Warn('Truncated or corrupted EXR file');
             last;
         }
         $val = '<bad>' unless defined $val;
@@ -265,7 +265,7 @@ sub ProcessEXR($$)
         }
         if ($verbose) {
             my $dataPt = ref $val ? $val : \$val,
-            $exifTool->VerboseInfo($tag, $tagInfo,
+            $et->VerboseInfo($tag, $tagInfo,
                 Table   => $tagTablePtr,
                 Value   => $val,
                 Size    => $size,
@@ -274,11 +274,11 @@ sub ProcessEXR($$)
                 Addr    => $raf->Tell() - $size,
             );
         }
-        $exifTool->FoundTag($tagInfo, $val);
+        $et->FoundTag($tagInfo, $val);
     }
     if ($dim) {
-        $exifTool->FoundTag('ImageWidth', $$dim[0]);
-        $exifTool->FoundTag('ImageHeight', $$dim[1]);
+        $et->FoundTag('ImageWidth', $$dim[0]);
+        $et->FoundTag('ImageHeight', $$dim[1]);
     }
     return 1;
 }
@@ -302,7 +302,7 @@ information from OpenEXR images.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -21,7 +21,7 @@ use vars qw($VERSION $AUTOLOAD $lastFetched);
 use Image::ExifTool qw(:DataAccess :Utils);
 require Exporter;
 
-$VERSION = '1.35';
+$VERSION = '1.37';
 
 sub FetchObject($$$$);
 sub ExtractObject($$;$$);
@@ -691,12 +691,12 @@ sub LocateObject($$)
 #        was extracted from an encrypted stream
 sub FetchObject($$$$)
 {
-    my ($exifTool, $ref, $xref, $tag) = @_;
+    my ($et, $ref, $xref, $tag) = @_;
     $lastFetched = $ref;    # save this for decoding if necessary
     my $offset = LocateAnyObject($xref, $ref);
     $lastOffset = $offset;
     unless ($offset) {
-        $exifTool->Warn("Bad $tag reference") unless defined $offset;
+        $et->Warn("Bad $tag reference") unless defined $offset;
         return undef;
     }
     my ($data, $obj);
@@ -710,11 +710,11 @@ sub FetchObject($$$$)
             return undef if defined $obj;
             $streamObjs{$ref} = '';
             # load the parent object stream
-            $obj = FetchObject($exifTool, $ref, $xref, $tag);
+            $obj = FetchObject($et, $ref, $xref, $tag);
             # make sure it contains everything we need
             return undef unless defined $obj and ref($obj) eq 'HASH';
             return undef unless $$obj{First} and $$obj{N};
-            return undef unless DecodeStream($exifTool, $obj);
+            return undef unless DecodeStream($et, $obj);
             # add a special '_table' entry to this dictionary which contains
             # the list of object number/offset pairs from the stream header
             my $num = $$obj{N} * 2;
@@ -731,7 +731,7 @@ sub FetchObject($$$$)
         my $i = 2 * $index;
         my $table = $$obj{_table};
         unless ($index < $$obj{N} and $$table[$i] == $objNum) {
-            $exifTool->Warn("Bad index for stream object $tag");
+            $et->Warn("Bad index for stream object $tag");
             return undef;
         }
         # extract the object at the specified index in the stream
@@ -742,18 +742,18 @@ sub FetchObject($$$$)
         $data = substr($$obj{_stream}, $offset, $len);
         # avoid re-decrypting data in already decrypted streams
         undef $lastFetched if $cryptStream;
-        return ExtractObject($exifTool, \$data);
+        return ExtractObject($et, \$data);
     }
-    my $raf = $exifTool->{RAF};
-    $raf->Seek($offset, 0) or $exifTool->Warn("Bad $tag offset"), return undef;
+    my $raf = $$et{RAF};
+    $raf->Seek($offset, 0) or $et->Warn("Bad $tag offset"), return undef;
     # verify that we are reading the expected object
-    $raf->ReadLine($data) or $exifTool->Warn("Error reading $tag data"), return undef;
+    $raf->ReadLine($data) or $et->Warn("Error reading $tag data"), return undef;
     ($obj = $ref) =~ s/R/obj/;
     unless ($data =~ s/^$obj//) {
-        $exifTool->Warn("$tag object ($obj) not found at $offset");
+        $et->Warn("$tag object ($obj) not found at $offset");
         return undef;
     }
-    return ExtractObject($exifTool, \$data, $raf, $xref);
+    return ExtractObject($et, \$data, $raf, $xref);
 }
 
 #------------------------------------------------------------------------------
@@ -775,7 +775,7 @@ sub ReadPDFValue($)
     length $str or return $str;
     my $delim = substr($str, 0, 1);
     if ($delim eq '(') {    # literal string
-        $str = $1 if $str =~ /.*?\((.*)\)/s;    # remove brackets
+        $str = $1 if $str =~ /^.*?\((.*)\)/s;   # remove brackets
         # decode escape sequences in literal strings
         while ($str =~ /\\(.)/sg) {
             my $n = pos($str) - 2;
@@ -831,7 +831,7 @@ sub ReadPDFValue($)
 #   in their original order
 sub ExtractObject($$;$$)
 {
-    my ($exifTool, $dataPt, $raf, $xref) = @_;
+    my ($et, $dataPt, $raf, $xref) = @_;
     my (@tags, $data, $objData);
     my $dict = { };
     my $delim;
@@ -867,7 +867,7 @@ sub ExtractObject($$;$$)
 # extract array
 #
     } elsif ($delim eq '[') {
-        $objData =~ /.*?\[(.*)\]/s or return undef;
+        $objData =~ /^.*?\[(.*)\]/s or return undef;
         my $data = $1;    # brackets removed
         my @list;
         for (;;) {
@@ -880,7 +880,7 @@ sub ExtractObject($$;$$)
                 $val = ReadToNested(\$buff);
                 last unless defined $val;
                 pos($data) = $pos + length($val);
-                $val = ExtractObject($exifTool, \$val);
+                $val = ExtractObject($et, \$val);
             } elsif ($val =~ /^\d/) {
                 my $pos = pos($data);
                 if ($data =~ /\G\s+(\d+)\s+R/g) {
@@ -908,7 +908,7 @@ sub ExtractObject($$;$$)
             $objData = substr($objData, pos($objData)-length($val));
             $val = ReadToNested(\$objData, $raf);
             last unless defined $val;
-            $val = ExtractObject($exifTool, \$val);
+            $val = ExtractObject($et, \$val);
             pos($objData) = 0;
         } elsif ($val =~ /^\d/) {
             my $pos = pos($objData);
@@ -920,7 +920,7 @@ sub ExtractObject($$;$$)
         }
         if ($$dict{$tag}) {
             # duplicate dictionary entries are not allowed
-            $exifTool->Warn('Duplicate $tag entry in dictionary (ignored)');
+            $et->Warn('Duplicate $tag entry in dictionary (ignored)');
         } else {
             # save the entry
             push @tags, $tag;
@@ -941,20 +941,20 @@ sub ExtractObject($$;$$)
         # get the location of the object specifying the length
         # (compressed objects are not allowed)
         my $offset = LocateObject($xref, $length) or return $dict;
-        $offset or $exifTool->Warn('Bad Length object'), return $dict;
-        $raf->Seek($offset, 0) or $exifTool->Warn('Bad Length offset'), return $dict;
+        $offset or $et->Warn('Bad Length object'), return $dict;
+        $raf->Seek($offset, 0) or $et->Warn('Bad Length offset'), return $dict;
         # verify that we are reading the expected object
-        $raf->ReadLine($data) or $exifTool->Warn('Error reading Length data'), return $dict;
+        $raf->ReadLine($data) or $et->Warn('Error reading Length data'), return $dict;
         $length =~ s/R/obj/;
         unless ($data =~ /^$length\s+(\d+)?/) {
-            $exifTool->Warn("Length object ($length) not found at $offset");
+            $et->Warn("Length object ($length) not found at $offset");
             return $dict;
         }
         if (defined $1) {
             $length = $1;
         } else {
-            $raf->ReadLine($data) or $exifTool->Warn('Error reading stream Length'), return $dict;
-            $data =~ /^\s*(\d+)/ or $exifTool->Warn('Stream length not found'), return $dict;
+            $raf->ReadLine($data) or $et->Warn('Error reading stream Length'), return $dict;
+            $data =~ /^\s*(\d+)/ or $et->Warn('Stream length not found'), return $dict;
             $length = $1;
         }
         $raf->Seek($oldpos, 0); # restore position to start of stream
@@ -971,7 +971,7 @@ sub ExtractObject($$;$$)
             my $more = $length - length($$dataPt);
             if ($more > 0) {
                 unless ($raf->Read($data, $more) == $more) {
-                    $exifTool->Warn('Error reading stream data');
+                    $et->Warn('Error reading stream data');
                     $$dataPt = '';
                     return $dict;
                 }
@@ -1119,7 +1119,7 @@ sub DecodeLZW($)
 sub DecodeStream($$)
 {
     local $_;
-    my ($exifTool, $dict) = @_;
+    my ($et, $dict) = @_;
 
     return 0 unless $$dict{_stream}; # no stream to decode
 
@@ -1133,7 +1133,7 @@ sub DecodeStream($$)
     # be sure we can process all the filters before we take the time to do the decryption
     foreach $filter (@filters) {
         next if $supportedFilter{$filter};
-        $exifTool->WarnOnce("Unsupported Filter $filter");
+        $et->WarnOnce("Unsupported Filter $filter");
         return 0;
     }
     # apply decryption first if required (and if the default encryption
@@ -1162,22 +1162,22 @@ sub DecodeStream($$)
             if (ref $decodeParms eq 'HASH') {
                 $pre = $$decodeParms{Predictor};
                 if ($pre and $pre ne '1' and $pre ne '12') {
-                    $exifTool->WarnOnce("FlateDecode Predictor $pre currently not supported");
+                    $et->WarnOnce("FlateDecode Predictor $pre currently not supported");
                     return 0;
                 }
             }
-            if (eval 'require Compress::Zlib') {
+            if (eval { require Compress::Zlib }) {
                 my $inflate = Compress::Zlib::inflateInit();
                 my ($buff, $stat);
                 $inflate and ($buff, $stat) = $inflate->inflate($$dict{_stream});
                 if ($inflate and $stat == Compress::Zlib::Z_STREAM_END()) {
                     $$dict{_stream} = $buff;
                 } else {
-                    $exifTool->Warn('Error inflating stream');
+                    $et->Warn('Error inflating stream');
                     return 0;
                 }
             } else {
-                $exifTool->WarnOnce('Install Compress::Zlib to process filtered streams');
+                $et->WarnOnce('Install Compress::Zlib to process filtered streams');
                 return 0;
             }
             next unless $pre and $pre eq '12';  # 12 = 'up' prediction
@@ -1186,7 +1186,7 @@ sub DecodeStream($$)
             my $cols = $$decodeParms{Columns};
             unless ($cols) {
                 # currently only support 'up' prediction
-                $exifTool->WarnOnce('No Columns for decoding stream');
+                $et->WarnOnce('No Columns for decoding stream');
                 return 0;
             }
             my @bytes = unpack('C*', $$dict{_stream});
@@ -1194,7 +1194,7 @@ sub DecodeStream($$)
             my $buff = '';
             while (@bytes > $cols) {
                 unless (($_ = shift @bytes) == 2) {
-                    $exifTool->WarnOnce("Unsupported PNG filter $_"); # (yes, PNG)
+                    $et->WarnOnce("Unsupported PNG filter $_"); # (yes, PNG)
                     return 0;
                 }
                 foreach (@pre) {
@@ -1214,11 +1214,11 @@ sub DecodeStream($$)
             my $name = $$decodeParms{Name};
             next unless defined $name or $name eq 'Identity';
             if ($name ne 'StdCF') {
-                $exifTool->WarnOnce("Unsupported Crypt Filter $name");
+                $et->WarnOnce("Unsupported Crypt Filter $name");
                 return 0;
             }
             unless ($cryptInfo) {
-                $exifTool->WarnOnce('Missing Encrypt StdCF entry');
+                $et->WarnOnce('Missing Encrypt StdCF entry');
                 return 0;
             }
             # decrypt the stream manually because we want to:
@@ -1236,15 +1236,15 @@ sub DecodeStream($$)
             # make sure we don't have any unsupported decoding parameters
             if (ref $decodeParms eq 'HASH') {
                 if ($$decodeParms{Predictor}) {
-                    $exifTool->WarnOnce("LZWDecode Predictor $$decodeParms{Predictor} currently not supported");
+                    $et->WarnOnce("LZWDecode Predictor $$decodeParms{Predictor} currently not supported");
                     return 0;
                 } elsif ($$decodeParms{EarlyChange}) {
-                    $exifTool->WarnOnce("LZWDecode EarlyChange currently not supported");
+                    $et->WarnOnce("LZWDecode EarlyChange currently not supported");
                     return 0;
                 }                    
             }
             unless (DecodeLZW(\$$dict{_stream})) {
-                $exifTool->WarnOnce('LZW decompress error');
+                $et->WarnOnce('LZW decompress error');
                 return 0;
             }
 
@@ -1387,7 +1387,7 @@ sub GetHash($$$$)
 sub DecryptInit($$$)
 {
     local $_;
-    my ($exifTool, $encrypt, $id) = @_;
+    my ($et, $encrypt, $id) = @_;
 
     undef $cryptInfo;
     unless ($encrypt and ref $encrypt eq 'HASH') {
@@ -1405,7 +1405,7 @@ sub DecryptInit($$$)
     $enc .= " ($1)" if $$encrypt{SubFilter} and $$encrypt{SubFilter} =~ /^\/(.*)/;
     $enc .= ' (' . ($$encrypt{Length} || 40) . '-bit)' if $filt eq 'Standard';
     my $tagTablePtr = GetTagTable('Image::ExifTool::PDF::Encrypt');
-    $exifTool->HandleTag($tagTablePtr, 'Filter', $enc);
+    $et->HandleTag($tagTablePtr, 'Filter', $enc);
     if ($filt ne 'Standard') {
         return "Encryption filter $filt currently not supported";
     } elsif (not defined $$encrypt{R}) {
@@ -1416,9 +1416,9 @@ sub DecryptInit($$$)
     }
     if ("$ver.$rev" >= 5.6) {
         # apologize for poor performance (AES is a pure Perl implementation)
-        $exifTool->Warn('Decryption is very slow for encryption V5.6 or higher', 1);
+        $et->Warn('Decryption is very slow for encryption V5.6 or higher', 1);
     }
-    $exifTool->HandleTag($tagTablePtr, 'P', $$encrypt{P});
+    $et->HandleTag($tagTablePtr, 'P', $$encrypt{P});
 
     my %parm;   # optional parameters extracted from Encrypt dictionary
 
@@ -1458,11 +1458,11 @@ sub DecryptInit($$$)
 
     # make sure we have the necessary libraries available
     if ($ver < 5) {
-        unless (eval 'require Digest::MD5') {
+        unless (eval { require Digest::MD5 }) {
             return "Install Digest::MD5 to process encrypted PDF";
         }
     } else {
-        unless (eval 'require Digest::SHA') {
+        unless (eval { require Digest::SHA }) {
             return "Install Digest::SHA to process AES-256 encrypted PDF";
         }
     }
@@ -1485,10 +1485,10 @@ sub DecryptInit($$$)
         if ($try == 0) {
             $password = '';
         } elsif ($try == 1) {
-            $password = $exifTool->Options('Password');
+            $password = $et->Options('Password');
             return 'Document is password protected (use Password option)' unless defined $password;
             # make sure there is no UTF-8 flag on the password
-            if ($] >= 5.006 and (eval 'require Encode; Encode::is_utf8($password)' or $@)) {
+            if ($] >= 5.006 and (eval { require Encode; Encode::is_utf8($password) } or $@)) {
                 # repack by hand if Encode isn't available
                 $password = $@ ? pack('C*',unpack('U0C*',$password)) : Encode::encode('utf8',$password);
             }
@@ -1498,7 +1498,7 @@ sub DecryptInit($$$)
         if ($ver < 5) {
             if (length $password) {
                 # password must be encoding in PDFDocEncoding (ref iso32000)
-                $password = $exifTool->Encode($password, 'PDFDoc');
+                $password = $et->Encode($password, 'PDFDoc');
                 # truncate or pad the password to exactly 32 bytes
                 if (length($password) > 32) {
                     $password = substr($password, 0, 32);
@@ -1547,7 +1547,7 @@ sub DecryptInit($$$)
                 # Note: this should be good for passwords containing reasonable characters,
                 # but to be bullet-proof we need to apply the SASLprep (IETF RFC 4013) profile
                 # of stringprep (IETF RFC 3454) to the password before encoding in UTF-8
-                $password = $exifTool->Encode($password, 'UTF8');
+                $password = $et->Encode($password, 'UTF8');
                 $password = substr($password, 0, 127) if length($password) > 127;
             }
             # test for the owner password
@@ -1664,9 +1664,9 @@ sub NewPDFTag($$)
 # Inputs: Same as ProcessDict
 sub ProcessAcroForm($$$$;$$)
 {
-    my ($exifTool, $tagTablePtr, $dict, $xref, $nesting, $type) = @_;
-    $exifTool->HandleTag($tagTablePtr, '_has_xfa', $$dict{XFA} ? 'true' : 'false');
-    return ProcessDict($exifTool, $tagTablePtr, $dict, $xref, $nesting, $type);
+    my ($et, $tagTablePtr, $dict, $xref, $nesting, $type) = @_;
+    $et->HandleTag($tagTablePtr, '_has_xfa', $$dict{XFA} ? 'true' : 'false');
+    return ProcessDict($et, $tagTablePtr, $dict, $xref, $nesting, $type);
 }
 
 #------------------------------------------------------------------------------
@@ -1676,29 +1676,29 @@ sub ProcessAcroForm($$$$;$$)
 #         4) nesting depth, 5) dictionary capture type
 sub ProcessDict($$$$;$$)
 {
-    my ($exifTool, $tagTablePtr, $dict, $xref, $nesting, $type) = @_;
-    my $verbose = $exifTool->Options('Verbose');
+    my ($et, $tagTablePtr, $dict, $xref, $nesting, $type) = @_;
+    my $verbose = $et->Options('Verbose');
     my $unknown = $$tagTablePtr{EXTRACT_UNKNOWN};
-    my $embedded = (defined $unknown and not $unknown and $exifTool->Options('ExtractEmbedded'));
+    my $embedded = (defined $unknown and not $unknown and $et->Options('ExtractEmbedded'));
     my @tags = @{$$dict{_tags}};
     my ($next, %join);
     my $index = 0;
 
     $nesting = ($nesting || 0) + 1;
     if ($nesting > 50) {
-        $exifTool->WarnOnce('Nesting too deep (directory ignored)');
+        $et->WarnOnce('Nesting too deep (directory ignored)');
         return;
     }
     # save entire dictionary for rewriting if specified
-    if ($$exifTool{PDF_CAPTURE} and $$tagTablePtr{VARS} and
+    if ($$et{PDF_CAPTURE} and $$tagTablePtr{VARS} and
         $tagTablePtr->{VARS}->{CAPTURE})
     {
         my $name;
         foreach $name (@{$tagTablePtr->{VARS}->{CAPTURE}}) {
-            next if $exifTool->{PDF_CAPTURE}->{$name};
+            next if $$et{PDF_CAPTURE}{$name};
             # make sure we load the right type if indicated
             next if $type and $type ne $name;
-            $exifTool->{PDF_CAPTURE}->{$name} = $dict;
+            $$et{PDF_CAPTURE}{$name} = $dict;
             last;
         }
     }
@@ -1716,21 +1716,21 @@ sub ProcessDict($$$$;$$)
             last;
         }
         my $val = $$dict{$tag};
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
         if ($tagInfo) {
             undef $tagInfo if $$tagInfo{NoProcess};
         } elsif ($embedded and $tag =~ /^(.*?)(\d+)$/ and
             $$tagTablePtr{$1} and (ref $val ne 'SCALAR' or not $fetched{$$val}))
         {
             my ($name, $num) = ($1, $2);
-            $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $name);
+            $tagInfo = $et->GetTagInfo($tagTablePtr, $name);
             if (ref $tagInfo eq 'HASH' and $$tagInfo{JoinStreams}) {
                 $fetched{$$val} = 1;
-                my $obj = FetchObject($exifTool, $$val, $xref, $tag);
+                my $obj = FetchObject($et, $$val, $xref, $tag);
                 $join{$name} = [] unless $join{$name};
                 next unless ref $obj eq 'HASH' and $$obj{_stream};
                 # save all the stream data to join later
-                DecodeStream($exifTool, $obj);
+                DecodeStream($et, $obj);
                 $join{$name}->[$num] = $$obj{_stream};
                 undef $tagInfo;    # don't process
             } else {
@@ -1749,7 +1749,7 @@ sub ProcessDict($$$$;$$)
                     next;
                 } else {
                     $fetched{$$val} = 1;
-                    $val = FetchObject($exifTool, $$val, $xref, $tag);
+                    $val = FetchObject($et, $$val, $xref, $tag);
                     unless (defined $val) {
                         my $str;
                         if (defined $lastOffset) {
@@ -1759,7 +1759,7 @@ sub ProcessDict($$$$;$$)
                             $val2 = '<err>';
                             $str = 'Error reading object';
                         }
-                        $exifTool->VPrint(0, "$$exifTool{INDENT}${str}:\n");
+                        $et->VPrint(0, "$$et{INDENT}${str}:\n");
                     }
                 }
             } elsif (ref $val eq 'HASH') {
@@ -1802,7 +1802,7 @@ sub ProcessDict($$$$;$$)
                     $tagInfo = NewPDFTag($tagTablePtr, $tag);
                 }
             }
-            $exifTool->VerboseInfo($tag, $tagInfo,
+            $et->VerboseInfo($tag, $tagInfo,
                 Value => $val2 || $val,
                 Extra => $extra,
                 Index => $index++,
@@ -1817,9 +1817,9 @@ sub ProcessDict($$$$;$$)
         # increment document number if necessary
         my ($oldDocNum, $oldNumTags);
         if ($isSubDoc) {
-            $oldDocNum = $$exifTool{DOC_NUM};
-            $oldNumTags = $$exifTool{NUM_FOUND};
-            $$exifTool{DOC_NUM} = ++$$exifTool{DOC_COUNT};
+            $oldDocNum = $$et{DOC_NUM};
+            $oldNumTags = $$et{NUM_FOUND};
+            $$et{DOC_NUM} = ++$$et{DOC_COUNT};
         }
         if ($$tagInfo{SubDirectory}) {
             # process the subdirectory
@@ -1839,18 +1839,18 @@ sub ProcessDict($$$$;$$)
                     next if $fetched{$$subDict};
                     if ($$tagInfo{IgnoreDuplicates}) {
                         my $flag = "ProcessedPDF_$tag";
-                        if ($$exifTool{$flag}) {
-                            next if $exifTool->WarnOnce("Ignored duplicate $tag dictionary", 2);
+                        if ($$et{$flag}) {
+                            next if $et->WarnOnce("Ignored duplicate $tag dictionary", 2);
                         } else {
-                            $$exifTool{$flag} = 1;
+                            $$et{$flag} = 1;
                         }
                     }
                     # load dictionary via an indirect reference
                     $fetched{$$subDict} = 1;
-                    my $obj = FetchObject($exifTool, $$subDict, $xref, $tag);
+                    my $obj = FetchObject($et, $$subDict, $xref, $tag);
                     unless (defined $obj) {
                         unless (defined $lastOffset) {
-                            $exifTool->Warn("Error reading $tag object ($$subDict)");
+                            $et->Warn("Error reading $tag object ($$subDict)");
                         }
                         next;
                     }
@@ -1876,7 +1876,7 @@ sub ProcessDict($$$$;$$)
                 my $subTablePtr = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
                 if (not $verbose) {
                     my $proc = $$subTablePtr{PROCESS_PROC} || \&ProcessDict;
-                    &$proc($exifTool, $subTablePtr, $subDict, $xref, $nesting);
+                    &$proc($et, $subTablePtr, $subDict, $xref, $nesting);
                 } elsif ($next) {
                     # handle 'Next' links at this level to avoid deep recursion
                     undef $next;
@@ -1884,16 +1884,16 @@ sub ProcessDict($$$$;$$)
                     $tagTablePtr = $subTablePtr;
                     $dict = $subDict;
                     @tags = @{$$subDict{_tags}};
-                    $exifTool->VerboseDir($tag, scalar(@tags));
+                    $et->VerboseDir($tag, scalar(@tags));
                 } else {
-                    my $oldIndent = $exifTool->{INDENT};
-                    my $oldDir = $exifTool->{DIR_NAME};
-                    $exifTool->{INDENT} .= '| ';
-                    $exifTool->{DIR_NAME} = $tag;
-                    $exifTool->VerboseDir($tag, scalar(@{$$subDict{_tags}}));
-                    ProcessDict($exifTool, $subTablePtr, $subDict, $xref, $nesting);
-                    $exifTool->{INDENT} = $oldIndent;
-                    $exifTool->{DIR_NAME} = $oldDir;
+                    my $oldIndent = $$et{INDENT};
+                    my $oldDir = $$et{DIR_NAME};
+                    $$et{INDENT} .= '| ';
+                    $$et{DIR_NAME} = $tag;
+                    $et->VerboseDir($tag, scalar(@{$$subDict{_tags}}));
+                    ProcessDict($et, $subTablePtr, $subDict, $xref, $nesting);
+                    $$et{INDENT} = $oldIndent;
+                    $$et{DIR_NAME} = $oldDir;
                 }
                 $lastFetched = $prevFetched;
             }
@@ -1903,7 +1903,7 @@ sub ProcessDict($$$$;$$)
             if (ref $val eq 'SCALAR') {
                 my $prevFetched = $lastFetched;
                 # (note: fetching the same object multiple times is OK here)
-                $val = FetchObject($exifTool, $$val, $xref, $tag);
+                $val = FetchObject($et, $$val, $xref, $tag);
                 if (defined $val) {
                     $val = ReadPDFValue($val);
                     # set flag to re-encrypt if necessary if rewritten
@@ -1919,7 +1919,7 @@ sub ProcessDict($$$$;$$)
                 if (ref $val eq 'ARRAY') {
                     my $v;
                     foreach $v (@$val) {
-                        $exifTool->FoundTag($tagInfo, $v);
+                        $et->FoundTag($tagInfo, $v);
                     }
                 }
             } elsif (defined $val) {
@@ -1928,24 +1928,24 @@ sub ProcessDict($$$$;$$)
                 if (not $$tagInfo{Binary} and $val =~ /[\x18-\x1f\x80-\xff]/) {
                     # text string is already in Unicode if it starts with "\xfe\xff",
                     # otherwise we must first convert from PDFDocEncoding
-                    $val = $exifTool->Decode($val, ($val=~s/^\xfe\xff// ? 'UCS2' : 'PDFDoc'), 'MM');
+                    $val = $et->Decode($val, ($val=~s/^\xfe\xff// ? 'UCS2' : 'PDFDoc'), 'MM');
                 }
                 if ($$tagInfo{List}) {
                     # separate tokens in comma or whitespace delimited lists
                     my @values = ($val =~ /,/) ? split /,+\s*/, $val : split ' ', $val;
                     foreach $val (@values) {
-                        $exifTool->FoundTag($tagInfo, $val);
+                        $et->FoundTag($tagInfo, $val);
                     }
                 } else {
                     # a simple tag value
-                    $exifTool->FoundTag($tagInfo, $val);
+                    $et->FoundTag($tagInfo, $val);
                 }
             }
         }
         if ($isSubDoc) {
             # restore original document number
-            $$exifTool{DOC_NUM} = $oldDocNum;
-            --$$exifTool{DOC_COUNT} if $oldNumTags == $$exifTool{NUM_FOUND};
+            $$et{DOC_NUM} = $oldDocNum;
+            --$$et{DOC_COUNT} if $oldNumTags == $$et{NUM_FOUND};
         }
     }
 #
@@ -1963,15 +1963,15 @@ sub ProcessDict($$$$;$$)
                 undef $$list[$i];   # free memory
             }
             # increment document number for tags extracted from embedded EPS
-            my $oldDocNum = $$exifTool{DOC_NUM};
-            my $oldNumTags = $$exifTool{NUM_FOUND};
-            $$exifTool{DOC_NUM} = ++$$exifTool{DOC_COUNT};
+            my $oldDocNum = $$et{DOC_NUM};
+            my $oldNumTags = $$et{NUM_FOUND};
+            $$et{DOC_NUM} = ++$$et{DOC_COUNT};
             # extract PostScript information
-            $exifTool->HandleTag($tagTablePtr, $tag, $buff);
-            $$exifTool{DOC_NUM} = $oldDocNum;
+            $et->HandleTag($tagTablePtr, $tag, $buff);
+            $$et{DOC_NUM} = $oldDocNum;
             # revert document counter if we didn't add any new tags
-            --$$exifTool{DOC_COUNT} if $oldNumTags == $$exifTool{NUM_FOUND};
-            delete $$exifTool{DOC_NUM};
+            --$$et{DOC_COUNT} if $oldNumTags == $$et{NUM_FOUND};
+            delete $$et{DOC_NUM};
         }
     }
 #
@@ -1983,29 +1983,29 @@ sub ProcessDict($$$$;$$)
         # add Subtype (if it exists) to stream name and remove leading '/'
         ($tag = $$dict{Subtype} . $tag) =~ s/^\/// if $$dict{Subtype};
         last unless $$tagTablePtr{$tag};
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag) or last;
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag) or last;
         unless ($$tagInfo{SubDirectory}) {
             # don't build filter lists across different images
-            delete $$exifTool{LIST_TAGS}{$$tagTablePtr{Filter}};
+            delete $$et{LIST_TAGS}{$$tagTablePtr{Filter}};
             # we arrive here only when extracting embedded images
             # - only extract known image types and ignore others
             my $filter = $$dict{Filter} || '';
             $filter = @$filter[-1] if ref $filter eq 'ARRAY'; # (get last Filter type)
             my $result;
             if ($filter eq '/DCTDecode' or $filter eq '/JPXDecode') {
-                DecodeStream($exifTool, $dict) or last;
+                DecodeStream($et, $dict) or last;
                 # save the image itself
-                $exifTool->FoundTag($tagInfo, \$$dict{_stream});
+                $et->FoundTag($tagInfo, \$$dict{_stream});
                 # extract information from embedded image
-                $result = $exifTool->ExtractInfo(\$$dict{_stream}, { ReEntry => 1 });
+                $result = $et->ExtractInfo(\$$dict{_stream}, { ReEntry => 1 });
             }
             unless ($result) {
-                $exifTool->FoundTag('FileType', defined $result ? '(unknown)' : '(unsupported)');
+                $et->FoundTag('FileType', defined $result ? '(unknown)' : '(unsupported)');
             }
             last;
         }
         # decode stream if necessary
-        DecodeStream($exifTool, $dict) or last;
+        DecodeStream($et, $dict) or last;
         # extract information from stream
         my %dirInfo = (
             DataPt   => \$$dict{_stream},
@@ -2015,8 +2015,8 @@ sub ProcessDict($$$$;$$)
             Parent   => 'PDF',
         );
         my $subTablePtr = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
-        unless ($exifTool->ProcessDirectory(\%dirInfo, $subTablePtr)) {
-            $exifTool->Warn("Error processing $$tagInfo{Name} information");
+        unless ($et->ProcessDirectory(\%dirInfo, $subTablePtr)) {
+            $et->Warn("Error processing $$tagInfo{Name} information");
         }
         last;
     }
@@ -2028,9 +2028,9 @@ sub ProcessDict($$$$;$$)
 # Returns: 0 if not a PDF file, 1 on success, otherwise a negative error number
 sub ReadPDF($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     my ($buff, $encrypt, $id);
 #
 # validate PDF file
@@ -2039,30 +2039,30 @@ sub ReadPDF($$)
     $raf->Read($buff, 1024) >= 8 or return 0;
     $buff =~ /^%PDF-(\d+\.\d+)/ or return 0;
     $pdfVer = $1;
-    $exifTool->SetFileType();   # set the FileType tag
-    $exifTool->Warn("May not be able to read a PDF version $pdfVer file") if $pdfVer >= 2.0;
+    $et->SetFileType();   # set the FileType tag
+    $et->Warn("May not be able to read a PDF version $pdfVer file") if $pdfVer >= 2.0;
     # store PDFVersion tag
     my $tagTablePtr = GetTagTable('Image::ExifTool::PDF::Root');
-    $exifTool->HandleTag($tagTablePtr, 'Version', $pdfVer);
+    $et->HandleTag($tagTablePtr, 'Version', $pdfVer);
     $tagTablePtr = GetTagTable('Image::ExifTool::PDF::Main');
 #
 # check for a linearized PDF (only if reading)
 #
-    my $capture = $$exifTool{PDF_CAPTURE};
+    my $capture = $$et{PDF_CAPTURE};
     unless ($capture) {
         my $lin = 'false';
         if ($buff =~ /<</g) {
             $buff = substr($buff, pos($buff) - 2);
-            my $dict = ExtractObject($exifTool, \$buff);
+            my $dict = ExtractObject($et, \$buff);
             if (ref $dict eq 'HASH' and $$dict{Linearized} and $$dict{L}) {
-                if (not $$exifTool{VALUE}{FileSize}) {
+                if (not $$et{VALUE}{FileSize}) {
                     undef $lin; # can't determine if it is linearized
-                } elsif ($$dict{L} == $$exifTool{VALUE}{FileSize}) {
+                } elsif ($$dict{L} == $$et{VALUE}{FileSize}) {
                     $lin = 'true';
                 }
             }
         }
-        $exifTool->HandleTag($tagTablePtr, '_linearized', $lin) if $lin;
+        $et->HandleTag($tagTablePtr, '_linearized', $lin) if $lin;
     }
 #
 # read the xref tables referenced from startxref at the end of the file
@@ -2075,7 +2075,7 @@ sub ReadPDF($$)
     $raf->Seek(-$len, 2) or return -2;
     $raf->Read($buff, $len) == $len or return -3;
     # find the LAST xref table in the file (may be multiple %%EOF marks)
-    $buff =~ /.*startxref(\s+)(\d+)(\s+)%%EOF/s or return -4;
+    $buff =~ /^.*startxref(\s+)(\d+)(\s+)%%EOF/s or return -4;
     my $ws = $1 . $3;
     my $xr = $2;
     push @xrefOffsets, $xr, 'Main';
@@ -2096,7 +2096,7 @@ XRef:
         next if $loaded{$offset};   # avoid infinite recursion
         unless ($raf->Seek($offset, 0)) {
             %loaded or return -5;
-            $exifTool->Warn('Bad offset for secondary xref table');
+            $et->Warn('Bad offset for secondary xref table');
             next;
         }
         # Note: care must be taken because ReadLine may read more than we want if
@@ -2104,7 +2104,7 @@ XRef:
         for (;;) {
             unless ($raf->ReadLine($buff)) {
                 %loaded or return -6;
-                $exifTool->Warn('Bad offset for secondary xref table');
+                $et->Warn('Bad offset for secondary xref table');
                 next XRef;
             }
             last if $buff =~/\S/;   # skip blank lines
@@ -2148,13 +2148,13 @@ XRef:
             $loadXRefStream = 1;
         } else {
             %loaded or return -4;
-            $exifTool->Warn('Invalid secondary xref table');
+            $et->Warn('Invalid secondary xref table');
             next;
         }
-        my $mainDict = ExtractObject($exifTool, \$buff, $raf, \%xref);
+        my $mainDict = ExtractObject($et, \$buff, $raf, \%xref);
         unless (ref $mainDict eq 'HASH') {
             %loaded or return -8;
-            $exifTool->Warn('Error loading secondary dictionary');
+            $et->Warn('Error loading secondary dictionary');
             next;
         }
         if ($loadXRefStream) {
@@ -2167,7 +2167,7 @@ XRef:
             # because a PDF 1.4 consumer would also make this same mistake.
             if ($$mainDict{Type} eq '/XRef' and $$mainDict{W} and
                 @{$$mainDict{W}} > 2 and $$mainDict{Size} and
-                DecodeStream($exifTool, $mainDict))
+                DecodeStream($et, $mainDict))
             {
                 # create Index entry if it doesn't exist
                 $$mainDict{Index} or $$mainDict{Index} = [ 0, $$mainDict{Size} ];
@@ -2181,7 +2181,7 @@ XRef:
                 push @{$xref{dicts}}, $mainDict;
             } else {
                 %loaded or return -9;
-                $exifTool->Warn('Invalid xref stream in secondary dictionary');
+                $et->Warn('Invalid xref stream in secondary dictionary');
             }
         }
         $loaded{$offset} = 1;
@@ -2200,12 +2200,12 @@ XRef:
 #
     if ($encrypt) {
         if (ref $encrypt eq 'SCALAR') {
-            $encrypt = FetchObject($exifTool, $$encrypt, \%xref, 'Encrypt');
+            $encrypt = FetchObject($et, $$encrypt, \%xref, 'Encrypt');
         }
         # generate Encryption tag information
-        my $err = DecryptInit($exifTool, $encrypt, $id);
+        my $err = DecryptInit($et, $encrypt, $id);
         if ($err) {
-            $exifTool->Warn($err);
+            $et->Warn($err);
             $$capture{Error} = $err if $capture;
             return -1;
         }
@@ -2221,15 +2221,15 @@ XRef:
         if ($verbose) {
             ++$i;
             my $n = scalar(@{$$dict{_tags}});
-            $exifTool->VPrint(0, "PDF dictionary ($i of $num) with $n entries:\n");
+            $et->VPrint(0, "PDF dictionary ($i of $num) with $n entries:\n");
         }
-        ProcessDict($exifTool, $tagTablePtr, $dict, \%xref, 0, $type);
+        ProcessDict($et, $tagTablePtr, $dict, \%xref, 0, $type);
     }
     # handle any decryption errors
     if ($encrypt) {
         my $err = $$encrypt{_error};
         if ($err) {
-            $exifTool->Warn($err);
+            $et->Warn($err);
             $$capture{Error} = $err if $capture;
             return -1;
         }
@@ -2257,14 +2257,14 @@ my %pdfWarning = (
 # Returns: 1 if this was a valid PDF file
 sub ProcessPDF($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
 
     undef $cryptInfo;   # (must not delete after returning so writer can use it)
     undef $cryptStream;
     undef $cryptString;
-    my $result = ReadPDF($exifTool, $dirInfo);
+    my $result = ReadPDF($et, $dirInfo);
     if ($result < 0) {
-        $exifTool->Warn($pdfWarning{$result}) if $pdfWarning{$result};
+        $et->Warn($pdfWarning{$result}) if $pdfWarning{$result};
         $result = 1;
     }
     # clean up and return
@@ -2296,7 +2296,7 @@ including AESV2 (AES-128) and AESV3 (AES-256).
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -15,7 +15,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.01';
+$VERSION = '1.02';
 
 # PGF header information
 %Image::ExifTool::PGF::Main = (
@@ -68,33 +68,33 @@ $VERSION = '1.01';
 # Returns: 1 on success, 0 if this wasn't a valid PGF file
 sub ProcessPGF($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my $buff;
 
     # read header and check magic number
     return 0 unless $raf->Read($buff, 24) == 24 and $buff =~ /^PGF(.)/s;
     my $ver = ord $1;
-    $exifTool->SetFileType();
+    $et->SetFileType();
     SetByteOrder('II');
 
     # currently support only version 0x36
     unless ($ver == 0x36) {
-        $exifTool->Error(sprintf('Unsupported PGF version 0x%.2x', $ver));
+        $et->Error(sprintf('Unsupported PGF version 0x%.2x', $ver));
         return 1;
     }
     # extract information from the PGF header
     my $tagTablePtr = GetTagTable('Image::ExifTool::PGF::Main');
-    $exifTool->ProcessDirectory({ DataPt => \$buff, DataPos => 0 }, $tagTablePtr);
+    $et->ProcessDirectory({ DataPt => \$buff, DataPos => 0 }, $tagTablePtr);
 
     my $len = Get32u(\$buff, 4) - 16; # length of post-header data
 
     # skip colour table if necessary
-    $len -= $raf->Seek(1024, 1) ? 1024 : $len if $$exifTool{PGFColorMode} == 2;
+    $len -= $raf->Seek(1024, 1) ? 1024 : $len if $$et{PGFColorMode} == 2;
 
     # extract information from the embedded metadata image (PNG format)
     if ($len > 0 and $len < 0x1000000 and $raf->Read($buff, $len) == $len) {
-        $exifTool->ExtractInfo(\$buff, { ReEntry => 1 });
+        $et->ExtractInfo(\$buff, { ReEntry => 1 });
     }
     return 1;
 }
@@ -119,7 +119,7 @@ information from Progressive Graphics File (PGF) images.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -20,7 +20,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.04';
+$VERSION = '1.05';
 
 sub ReadPictValue($$$;$);
 
@@ -1081,10 +1081,10 @@ sub ReadPictValue($$$;$)
 # Returns: 1 on success, 0 if this wasn't a valid PICT image
 sub ProcessPICT($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
-    $verbose = $exifTool->Options('Verbose');
-    $out = $exifTool->Options('TextOut');
+    $verbose = $et->Options('Verbose');
+    $out = $et->Options('TextOut');
     $indent = '';
     my ($buff, $tried, @hdr, $op, $hRes, $vRes);
 
@@ -1138,14 +1138,14 @@ sub ProcessPICT($$)
         $w = int($w * $hRes / 72 + 0.5);
         $h = int($h * $vRes / 72 + 0.5);
     }
-    $exifTool->SetFileType();
-    $exifTool->FoundTag('ImageWidth', $w);
-    $exifTool->FoundTag('ImageHeight', $h);
-    $exifTool->FoundTag('XResolution', $hRes) if $hRes;
-    $exifTool->FoundTag('YResolution', $vRes) if $vRes;
+    $et->SetFileType();
+    $et->FoundTag('ImageWidth', $w);
+    $et->FoundTag('ImageHeight', $h);
+    $et->FoundTag('XResolution', $hRes) if $hRes;
+    $et->FoundTag('YResolution', $vRes) if $vRes;
 
     # don't extract image opcodes unless verbose
-    return 1 unless $verbose or $exifTool->Options('Unknown');
+    return 1 unless $verbose or $et->Options('Unknown');
 
     $verbose and printf $out "PICT version $vers%s\n", $extended ? ' extended' : '';
 
@@ -1162,14 +1162,14 @@ sub ProcessPICT($$)
             $raf->Read($buff, 2) == 2 or last;
             $op = unpack('n', $buff);
         }
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $op);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $op);
         unless ($tagInfo) {
             my $i;
             # search for reserved tag info
             for ($i=0; $i<scalar(@reserved); $i+=2) {
                 next unless $op >= $reserved[$i];
                 last if $op > $reserved[$i+1];
-                $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $reserved[$i]);
+                $tagInfo = $et->GetTagInfo($tagTablePtr, $reserved[$i]);
                 last;
             }
             last unless $tagInfo;
@@ -1181,7 +1181,7 @@ sub ProcessPICT($$)
         }
         my $format = $$tagInfo{Format};
         unless ($format) {
-            $exifTool->Warn("Missing format for $$tagInfo{Name}");
+            $et->Warn("Missing format for $$tagInfo{Name}");
             last;
         }
         # replace version number for version-dependent formats
@@ -1190,7 +1190,7 @@ sub ProcessPICT($$)
         $verbose and printf $out "Tag 0x%.${wid}x, ", $op;
         my $val = ReadPictValue($raf, $$tagInfo{Name}, $format);
         unless (defined $val) {
-            $exifTool->Warn("Error reading $$tagInfo{Name} information");
+            $et->Warn("Error reading $$tagInfo{Name} information");
             last;
         }
         if (ref $val eq 'HASH') {
@@ -1200,15 +1200,15 @@ sub ProcessPICT($$)
                 $val->{imageDescr}->{compressor} and
                 $val->{imageDescr}->{compressor} eq 'Photo - JPEG' and
                 ref $val->{imageData} eq 'SCALAR' and
-                $exifTool->ValidateImage($val->{imageData}, 'PreviewImage'))
+                $et->ValidateImage($val->{imageData}, 'PreviewImage'))
             {
-                $exifTool->FoundTag('PreviewImage', $val->{imageData});
+                $et->FoundTag('PreviewImage', $val->{imageData});
             }
         } else {
-            # $exifTool->FoundTag($tagInfo, $val);
+            # $et->FoundTag($tagInfo, $val);
         }
     }
-    $success or $exifTool->Warn('End of picture not found');
+    $success or $et->Warn('End of picture not found');
     return 1;
 }
 
@@ -1236,7 +1236,7 @@ Verbose or the Unknown option.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -20,7 +20,7 @@ use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::XMP;
 
-$VERSION = '1.02';
+$VERSION = '1.05';
 
 sub ExtractObject($$;$);
 sub Get24u($$);
@@ -64,7 +64,7 @@ my %readProc = (
         Description => 'Date/Time Original',
         Groups => { 2 => 'Time' },
         # Sony uses a "real" here -- number of days since Dec 31, 1899
-        ValueConv => 'IsFloat($val) ? ConvertUnixTime(($val - 25569) * 24 * 3600 + 0.5) : $val',
+        ValueConv => 'IsFloat($val) ? ConvertUnixTime(($val - 25569) * 24 * 3600) : $val',
         PrintConv => '$self->ConvertDateTime($val)',
     },
     'MetaDataList//Duration' => {
@@ -111,15 +111,15 @@ my %readProc = (
 # Returns: 1 if valid tag was found
 sub FoundTag($$$$;$)
 {
-    my ($exifTool, $tagTablePtr, $props, $val, $attrs) = @_;
+    my ($et, $tagTablePtr, $props, $val, $attrs) = @_;
     return 0 unless @$props;
-    my $verbose = $exifTool->Options('Verbose');
-    my $keys = $$exifTool{PListKeys} || ( $$exifTool{PListKeys} = [] );
+    my $verbose = $et->Options('Verbose');
+    my $keys = $$et{PListKeys} || ( $$et{PListKeys} = [] );
 
     my $prop = $$props[-1];
     if ($verbose > 1) {
-        $exifTool->VPrint(0, $$exifTool{INDENT}, '[', join('/',@$props), ' = ',
-            $exifTool->Printable($val), "]\n");
+        $et->VPrint(0, $$et{INDENT}, '[', join('/',@$props), ' = ',
+                    $et->Printable($val), "]\n");
     }
     # un-escape XML character entities
     $val = Image::ExifTool::XMP::UnescapeXML($val);
@@ -140,7 +140,7 @@ sub FoundTag($$$$;$)
         $val = ucfirst $prop;
     } else {
         # convert from UTF8 to ExifTool Charset
-        $val = $exifTool->Decode($val, 'UTF8');
+        $val = $et->Decode($val, 'UTF8');
         if ($prop eq 'key') {
             if (@$props <= 3) { # top-level key should be plist/dict/key
                 @$keys = ( $val );
@@ -159,7 +159,7 @@ sub FoundTag($$$$;$)
     my $tag = join '/', @$keys;     # generate tag ID from 'key' values
     my $tagInfo = $$tagTablePtr{$tag};
     unless ($tagInfo) {
-        $exifTool->VPrint(0, $exifTool->{INDENT}, "[adding $tag]\n") if $verbose;
+        $et->VPrint(0, $$et{INDENT}, "[adding $tag]\n") if $verbose;
         # generate tag name from ID
         my $name = $tag;
         $name =~ s{^MetaDataList//}{};  # shorten long MODD metadata tag names
@@ -174,12 +174,12 @@ sub FoundTag($$$$;$)
         AddTagToTable($tagTablePtr, $tag, $tagInfo);
     }
     # allow list-behaviour only for consecutive tags with the same ID
-    if ($$exifTool{LastPListTag} and $$exifTool{LastPListTag} ne $tagInfo) {
-        delete $$exifTool{LIST_TAGS}{$$exifTool{LastPListTag}};
+    if ($$et{LastPListTag} and $$et{LastPListTag} ne $tagInfo) {
+        delete $$et{LIST_TAGS}{$$et{LastPListTag}};
     }
-    $$exifTool{LastPListTag} = $tagInfo;
+    $$et{LastPListTag} = $tagInfo;
     # save the tag
-    $exifTool->HandleTag($tagTablePtr, $tag, $val);
+    $et->HandleTag($tagTablePtr, $tag, $val);
 
     return 1;
 }
@@ -200,7 +200,7 @@ sub Get24u($$)
 # Returns: the object, or undef on error
 sub ExtractObject($$;$)
 {
-    my ($exifTool, $plistInfo, $parent) = @_;
+    my ($et, $plistInfo, $parent) = @_;
     my $raf = $$plistInfo{RAF};
     my ($buff, $val);
 
@@ -234,11 +234,11 @@ sub ExtractObject($$;$)
         # $size is the size of the remaining types
         if ($size == 0x0f) {
             # size is stored in extra integer object
-            $size = ExtractObject($exifTool, $plistInfo);
+            $size = ExtractObject($et, $plistInfo);
             return undef unless defined $size and $size =~ /^\d+$/;
         }
         if ($type == 4) {  # data
-            if ($size < 1000000 or $exifTool->Options('Binary')) {
+            if ($size < 1000000 or $et->Options('Binary')) {
                 $raf->Read($buff, $size) == $size or return undef;
             } else {
                 $buff = "Binary data $size bytes";
@@ -249,7 +249,7 @@ sub ExtractObject($$;$)
         } elsif ($type == 6) {  # UCS-2BE string
             $size *= 2;
             $raf->Read($buff, $size) == $size or return undef;
-            $val = $exifTool->Decode($buff, 'UCS2');
+            $val = $et->Decode($buff, 'UCS2');
         } elsif ($type == 10 or $type == 12 or $type == 13) { # array, set or dict
             # the remaining types store a list of references
             my $refSize = $$plistInfo{RefSize};
@@ -267,26 +267,26 @@ sub ExtractObject($$;$)
             if ($type == 13) { # dict
                 # prevent infinite recursion
                 if (defined $parent and length $parent > 1000) {
-                    $exifTool->WarnOnce('Possible deep recursion while parsing PLIST');
+                    $et->WarnOnce('Possible deep recursion while parsing PLIST');
                     return undef;
                 }
                 my $tagTablePtr = $$plistInfo{TagTablePtr};
-                my $verbose = $exifTool->Options('Verbose');
+                my $verbose = $et->Options('Verbose');
                 for ($i=0; $i<$size; ++$i) {
                     # get the entry key
                     $raf->Seek($$table[$refs[$i]], 0) or return undef;
-                    my $key = ExtractObject($exifTool, $plistInfo);
+                    my $key = ExtractObject($et, $plistInfo);
                     next unless defined $key and length $key; # silently ignore bad dict entries
                     # get the entry value
                     $raf->Seek($$table[$refs[$i+$size]], 0) or return undef;
                     # generate an ID for this tag
                     my $tag = defined $parent ? "$parent/$key" : $key;
                     undef $$plistInfo{DateFormat};
-                    my $val = ExtractObject($exifTool, $plistInfo, $tag);
+                    my $val = ExtractObject($et, $plistInfo, $tag);
                     next if not defined $val or ref($val) eq 'HASH';
-                    my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+                    my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
                     unless ($tagInfo) {
-                        $exifTool->VPrint(0, $exifTool->{INDENT}, "[adding $tag]\n") if $verbose;
+                        $et->VPrint(0, $$et{INDENT}, "[adding $tag]\n") if $verbose;
                         my $name = $tag;
                         $name =~ s/([^A-Za-z])([a-z])/$1\u$2/g; # capitalize words
                         $name =~ tr/-_a-zA-Z0-9//dc; # remove illegal characters
@@ -298,18 +298,18 @@ sub ExtractObject($$;$)
                         AddTagToTable($tagTablePtr, $tag, $tagInfo);
                     }
                     # allow list-behaviour only for consecutive tags with the same ID
-                    if ($$exifTool{LastPListTag} and $$exifTool{LastPListTag} ne $tagInfo) {
-                        delete $$exifTool{LIST_TAGS}{$$exifTool{LastPListTag}};
+                    if ($$et{LastPListTag} and $$et{LastPListTag} ne $tagInfo) {
+                        delete $$et{LIST_TAGS}{$$et{LastPListTag}};
                     }
-                    $$exifTool{LastPListTag} = $tagInfo;
-                    $exifTool->HandleTag($tagTablePtr, $tag, $val);
+                    $$et{LastPListTag} = $tagInfo;
+                    $et->HandleTag($tagTablePtr, $tag, $val);
                 }
                 $val = { }; # flag the value as a dictionary (ie. tags already saved)
             } else {
                 # extract the referenced objects
                 foreach $ref (@refs) {
                     $raf->Seek($$table[$ref], 0) or return undef;   # seek to this object
-                    $val = ExtractObject($exifTool, $plistInfo, $parent);
+                    $val = ExtractObject($et, $plistInfo, $parent);
                     next unless defined $val and ref $val ne 'HASH';
                     push @array, $val;
                 }
@@ -321,19 +321,23 @@ sub ExtractObject($$;$)
 }
 
 #------------------------------------------------------------------------------
-# Process binary PLIST file (ref 2)
+# Process binary PLIST data (ref 2)
 # Inputs: 0) ExifTool object ref, 1) DirInfo ref, 2) tag table ref
 # Returns: 1 on success
 sub ProcessBinaryPLIST($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    my $raf = $$dirInfo{RAF};
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my ($i, $buff, @table);
 
-    $exifTool->VerboseDir('Binary PLIST');
+    $et->VerboseDir('Binary PLIST');
     SetByteOrder('MM');
 
+    unless ($$dirInfo{RAF}) {
+        my $buf2 = substr(${$$dirInfo{DataPt}}, $$dirInfo{DirStart} || 0, $$dirInfo{DirLen});
+        $$dirInfo{RAF} = new File::RandomAccess(\$buf2);
+    }
     # read and parse the trailer
+    my $raf = $$dirInfo{RAF};
     $raf->Seek(-32,2) and $raf->Read($buff,32)==32 or return 0;
     my $intSize = Get8u(\$buff, 6);
     my $refSize = Get8u(\$buff, 7);
@@ -360,7 +364,7 @@ sub ProcessBinaryPLIST($$$)
     );
     # position file pointer at the top object, and extract it
     $raf->Seek($table[$topObj], 0) or return 0;
-    my $result = ExtractObject($exifTool, \%plistInfo);
+    my $result = ExtractObject($et, \%plistInfo);
     return defined $result ? 1 : 0;
 }
 
@@ -370,11 +374,11 @@ sub ProcessBinaryPLIST($$$)
 # Returns: 1 on success, 0 if this wasn't valid PLIST
 sub ProcessPLIST($$;$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
 
     # process XML PLIST data using the XMP module
     $$dirInfo{XMPParseOpts}{FoundProc} = \&FoundTag;
-    my $result = Image::ExifTool::XMP::ProcessXMP($exifTool, $dirInfo, $tagTablePtr);
+    my $result = Image::ExifTool::XMP::ProcessXMP($et, $dirInfo, $tagTablePtr);
     delete $$dirInfo{XMPParseOpts};
 
     unless ($result) {
@@ -384,18 +388,18 @@ sub ProcessPLIST($$;$)
         if ($buff =~ /^bplist0/) {
             # binary PLIST file
             my $tagTablePtr = GetTagTable('Image::ExifTool::PLIST::Main');
-            $exifTool->SetFileType('PLIST', 'application/x-plist');
-            $$exifTool{SET_GROUP1} = 'PLIST';
-            unless (ProcessBinaryPLIST($exifTool, $dirInfo, $tagTablePtr)) {
-                $exifTool->Error('Error reading binary PLIST file');
+            $et->SetFileType('PLIST', 'application/x-plist');
+            $$et{SET_GROUP1} = 'PLIST';
+            unless (ProcessBinaryPLIST($et, $dirInfo, $tagTablePtr)) {
+                $et->Error('Error reading binary PLIST file');
             }
-            delete $$exifTool{SET_GROUP1};
+            delete $$et{SET_GROUP1};
             $result = 1;
-        } elsif ($$exifTool{FILE_EXT} and $$exifTool{FILE_EXT} eq 'PLIST' and
+        } elsif ($$et{FILE_EXT} and $$et{FILE_EXT} eq 'PLIST' and
             $buff =~ /^\xfe\xff\x00/)
         {
             # (have seen very old PLIST files encoded as UCS-2BE with leading BOM)
-            $exifTool->Error('Old PLIST format currently not supported');
+            $et->Error('Old PLIST format currently not supported');
             $result = 1;
         }
     }
@@ -425,7 +429,7 @@ This module decodes both the binary and XML-based PLIST format.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -26,15 +26,16 @@ use strict;
 use vars qw($VERSION $AUTOLOAD);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.27';
+$VERSION = '1.31';
 
 sub ProcessPNG_tEXt($$$);
 sub ProcessPNG_iTXt($$$);
 sub ProcessPNG_Compressed($$$);
 sub CalculateCRC($;$$$);
 sub HexEncode($);
-sub AddChunks($$);
+sub AddChunks($$;@);
 sub Add_iCCP($$);
+sub DoneDir($$$;$);
 sub GetLangInfo($$);
 sub BuildTextChunk($$$$$);
 
@@ -117,11 +118,16 @@ $Image::ExifTool::PNG::colorType = -1;
     },
     iCCP => {
         Name => 'ICC_Profile',
+        Notes => 'this is where ExifTool will write a new ICC_Profile',
         SubDirectory => {
             TagTable => 'Image::ExifTool::ICC_Profile::Main',
             ProcessProc => \&ProcessPNG_Compressed,
         },
     },
+   'iCCP-name' => {
+        Name => 'ProfileName',
+        Notes => 'not a real tag ID, this tag represents the iCCP profile name',
+    },
 #   IDAT
 #   IEND
     IHDR => {
@@ -210,6 +216,7 @@ $Image::ExifTool::PNG::colorType = -1;
     tXMP => {
         Name => 'XMP',
         Notes => 'obsolete location specified by a September 2001 XMP draft',
+        NonStandard => 1,
         SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
     },
     vpAg => { # private imagemagick chunk
@@ -438,16 +445,17 @@ my %unreg = ( Notes => 'unregistered' );
             # EXIF table must come first because we key on this in ProcessProfile()
             # (No condition because this is just for BuildTagLookup)
             Name => 'APP1_Profile',
-            %unreg,
+            Notes => 'unregistered.  This is where ExifTool will create new EXIF',
             SubDirectory => {
-                TagTable=>'Image::ExifTool::Exif::Main',
+                TagTable => 'Image::ExifTool::Exif::Main',
                 ProcessProc => \&ProcessProfile,
             },
         },
         {
             Name => 'APP1_Profile',
+            NonStandard => 1,
             SubDirectory => {
-                TagTable=>'Image::ExifTool::XMP::Main',
+                TagTable => 'Image::ExifTool::XMP::Main',
                 ProcessProc => \&ProcessProfile,
             },
         },
@@ -456,7 +464,7 @@ my %unreg = ( Notes => 'unregistered' );
         Name => 'EXIF_Profile',
         %unreg,
         SubDirectory => {
-            TagTable=>'Image::ExifTool::Exif::Main',
+            TagTable => 'Image::ExifTool::Exif::Main',
             ProcessProc => \&ProcessProfile,
         },
     },
@@ -478,7 +486,10 @@ my %unreg = ( Notes => 'unregistered' );
     },
    'Raw profile type iptc' => {
         Name => 'IPTC_Profile',
-        %unreg,
+        Notes => q{
+            unregistered.  May be either IPTC IIM or Photoshop IRB format.  This is
+            where ExifTool will add new IPTC, inside a Photoshop IRB container
+        },
         SubDirectory => {
             TagTable => 'Image::ExifTool::Photoshop::Main',
             ProcessProc => \&ProcessProfile,
@@ -487,11 +498,20 @@ my %unreg = ( Notes => 'unregistered' );
    'Raw profile type xmp' => {
         Name => 'XMP_Profile',
         %unreg,
+        NonStandard => 1,
         SubDirectory => {
             TagTable => 'Image::ExifTool::XMP::Main',
             ProcessProc => \&ProcessProfile,
         },
     },
+    'Raw profile type 8bim' => {
+        Name => 'Photoshop_Profile',
+        %unreg,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Photoshop::Main',
+            ProcessProc => \&ProcessProfile,
+        },
+    },
 );
 
 #------------------------------------------------------------------------------
@@ -538,22 +558,22 @@ sub GetLangInfo($$)
 # Returns: 1 on success
 sub FoundPNG($$$$;$$$$)
 {
-    my ($exifTool, $tagTablePtr, $tag, $val, $compressed, $outBuff, $enc, $lang) = @_;
+    my ($et, $tagTablePtr, $tag, $val, $compressed, $outBuff, $enc, $lang) = @_;
     return 0 unless defined $val;
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     my $id = $tag;  # generate tag ID which include language code
     if ($lang) {
         # case of language code must be normalized since they are case insensitive
         $lang = StandardLangCase($lang);
         $id .= '-' . $lang;
     }
-    my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $id) ||
+    my $tagInfo = $et->GetTagInfo($tagTablePtr, $id) ||
                   # (some software forgets to capitalize first letter)
-                  $exifTool->GetTagInfo($tagTablePtr, ucfirst($id));
+                  $et->GetTagInfo($tagTablePtr, ucfirst($id));
     # create alternate language tag if necessary
     if (not $tagInfo and $lang) {
-        $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag) ||
-                   $exifTool->GetTagInfo($tagTablePtr, ucfirst($tag));
+        $tagInfo = $et->GetTagInfo($tagTablePtr, $tag) ||
+                   $et->GetTagInfo($tagTablePtr, ucfirst($tag));
         $tagInfo = GetLangInfo($tagInfo, $lang) if $tagInfo;
     }
 #
@@ -562,7 +582,7 @@ sub FoundPNG($$$$;$$$$)
     my ($wasCompressed, $deflateErr);
     if ($compressed and $compressed > 1) {
         if ($compressed == 2) { # Inflate/Deflate compression
-            if (eval 'require Compress::Zlib') {
+            if (eval { require Compress::Zlib }) {
                 my ($v2, $stat);
                 my $inflate = Compress::Zlib::inflateInit();
                 $inflate and ($v2, $stat) = $inflate->inflate($val);
@@ -583,19 +603,19 @@ sub FoundPNG($$$$;$$$$)
             $deflateErr = "Unknown compression method $compressed for $tag";
         }
         if ($compressed and $verbose and $tagInfo and $$tagInfo{SubDirectory}) {
-            $exifTool->VerboseDir("Unable to decompress $$tagInfo{Name}", 0, length($val));
+            $et->VerboseDir("Unable to decompress $$tagInfo{Name}", 0, length($val));
         }
         # issue warning if relevant
         if ($deflateErr and (not $outBuff or
-            ($tagInfo and $$tagInfo{SubDirectory} and $$exifTool{EDIT_DIRS}{$$tagInfo{Name}})))
+            ($tagInfo and $$tagInfo{SubDirectory} and $$et{EDIT_DIRS}{$$tagInfo{Name}})))
         {
-            $exifTool->Warn($deflateErr);
+            $et->Warn($deflateErr);
             $noCompressLib = 1 if $deflateErr =~ /^Install/;
         }
     }
     # translate character encoding if necessary (tEXt/zTXt/iTXt string values only)
     if ($enc and not $compressed and not ($tagInfo and $$tagInfo{SubDirectory})) {
-        $val = $exifTool->Decode($val, $enc);
+        $val = $et->Decode($val, $enc);
     }
 #
 # extract information from subdirectory if available
@@ -605,15 +625,15 @@ sub FoundPNG($$$$;$$$$)
         my $processed;
         if ($$tagInfo{SubDirectory} and not $compressed) {
             my $len = length $val;
-            if ($verbose and $exifTool->{INDENT} ne '  ') {
+            if ($verbose and $$et{INDENT} ne '  ') {
                 if ($wasCompressed and $verbose > 2) {
                     my $name = $tagName;
                     $wasCompressed and $name = "Decompressed $name";
-                    $exifTool->VerboseDir($name, 0, $len);
-                    $exifTool->VerboseDump(\$val);
+                    $et->VerboseDir($name, 0, $len);
+                    $et->VerboseDump(\$val);
                 }
                 # don't indent next directory (since it is really the same data)
-                $exifTool->{INDENT} =~ s/..$//;
+                $$et{INDENT} =~ s/..$//;
             }
             my $subdir = $$tagInfo{SubDirectory};
             my $processProc = $$subdir{ProcessProc};
@@ -634,65 +654,81 @@ sub FoundPNG($$$$;$$$$)
             undef $processProc if $wasCompressed and $processProc eq \&ProcessPNG_Compressed;
             # rewrite this directory if necessary (but always process TextualData normally)
             if ($outBuff and not $processProc and $subTable ne \%Image::ExifTool::PNG::TextualData) {
-                return 1 unless $exifTool->{EDIT_DIRS}->{$tagName};
-                $$outBuff = $exifTool->WriteDirectory(\%subdirInfo, $subTable);
-                # if this was an XMP directory, we must make it read-only
-                $tagName eq 'XMP' and Image::ExifTool::XMP::ValidateXMP(\$outBuff,'r');
-                delete $exifTool->{ADD_DIRS}->{$tagName};
+                return 1 unless $$et{EDIT_DIRS}{$tagName};
+                $$outBuff = $et->WriteDirectory(\%subdirInfo, $subTable);
+                if ($tagName eq 'XMP' and $$outBuff) {
+                    if ($$et{FoundIDAT} and $$et{DEL_GROUP}{XMP}) {
+                        $et->VPrint(0,'  Deleting XMP');
+                        $$outBuff = '';
+                    } else {
+                        # make sure the XMP is marked as read-only
+                        Image::ExifTool::XMP::ValidateXMP($outBuff,'r');
+                    }
+                }
+                DoneDir($et, $tagName, $outBuff, $$tagInfo{NonStandard});
             } else {
-                $processed = $exifTool->ProcessDirectory(\%subdirInfo, $subTable, $processProc);
+                # issue warning for standard XMP after IDAT (PNGEarlyXMP option)
+                if ($tagName eq 'XMP' and not $$tagInfo{NonStandard} and
+                    $$et{FoundIDAT} and $$et{FoundIDAT} == 2)
+                {
+                    $et->Warn('XMP found after PNG IDAT');
+                    $$et{FoundIDAT} = 1;
+                }
+                $processed = $et->ProcessDirectory(\%subdirInfo, $subTable, $processProc);
             }
             $compressed = 1;    # pretend this is compressed since it is binary data
         }
         if ($outBuff) {
-            my $writable = $tagInfo->{Writable};
+            my $writable = $$tagInfo{Writable};
             my $isOverwriting;
             if ($writable or ($$tagTablePtr{WRITABLE} and
                 not defined $writable and not $$tagInfo{SubDirectory}))
             {
                 # write new value for this tag if necessary
                 my $newVal;
-                if ($exifTool->{DEL_GROUP}->{PNG}) {
+                if ($$et{DEL_GROUP}{PNG} or $$et{PNGDoneTag}{$tag} or
+                    $$et{PNGDoneTag}{ucfirst $tag})
+                {
                     # remove this tag now, but keep in ADD_PNG list to add back later
                     $isOverwriting = 1;
                 } else {
                     # remove this from the list of PNG tags to add
-                    delete $exifTool->{ADD_PNG}->{$id};
+                    delete $$et{ADD_PNG}{$id};
                     # (also handle case of tEXt tags written with lowercase first letter)
-                    delete $exifTool->{ADD_PNG}->{ucfirst($id)};
-                    my $nvHash = $exifTool->GetNewValueHash($tagInfo);
-                    $isOverwriting = $exifTool->IsOverwriting($nvHash);
+                    delete $$et{ADD_PNG}{ucfirst($id)};
+                    my $nvHash = $et->GetNewValueHash($tagInfo);
+                    $isOverwriting = $et->IsOverwriting($nvHash);
                     if (defined $deflateErr) {
-                        $newVal = $exifTool->GetNewValues($nvHash);
+                        $newVal = $et->GetNewValues($nvHash);
                         # can only write tag now if always overwriting
                         if ($isOverwriting > 0) {
                             $val = '<deflate error>';
                         } elsif ($isOverwriting) {
                             $isOverwriting = 0; # can't overwrite
-                            $exifTool->Warn($deflateErr) if $deflateErr;
+                            $et->Warn($deflateErr) if $deflateErr;
                         }
                     } else {
                         if ($isOverwriting < 0) {
-                            $isOverwriting = $exifTool->IsOverwriting($nvHash, $val);
+                            $isOverwriting = $et->IsOverwriting($nvHash, $val);
                         }
                         # (must get new value after IsOverwriting() in case it was shifted)
-                        $newVal = $exifTool->GetNewValues($nvHash);
+                        $newVal = $et->GetNewValues($nvHash);
                     }
                 }
                 if ($isOverwriting) {
                     $$outBuff = (defined $newVal) ? $newVal : '';
-                    ++$exifTool->{CHANGED};
-                    $exifTool->VerboseValue("- PNG:$tagName", $val);
-                    $exifTool->VerboseValue("+ PNG:$tagName", $newVal) if defined $newVal;
+                    ++$$et{CHANGED};
+                    $et->VerboseValue("- PNG:$tagName", $val);
+                    $et->VerboseValue("+ PNG:$tagName", $newVal) if defined $newVal;
                 }
             }
             if (defined $$outBuff and length $$outBuff) {
                 if ($enc) { # must be tEXt/zTXt/iTXt if $enc is set
-                    $$outBuff = BuildTextChunk($exifTool, $tag, $tagInfo, $$outBuff, $lang);
+                    $$outBuff = BuildTextChunk($et, $tag, $tagInfo, $$outBuff, $lang);
                 } elsif ($wasCompressed) {
                     # re-compress the output data
                     my $deflate;
-                    if (eval 'require Compress::Zlib') {
+                    if (eval { require Compress::Zlib }) {
                         my $deflate = Compress::Zlib::deflateInit();
                         if ($deflate) {
                             $$outBuff = $deflate->deflate($$outBuff);
@@ -701,7 +737,7 @@ sub FoundPNG($$$$;$$$$)
                             undef $$outBuff;
                         }
                     }
-                    $$outBuff or $exifTool->Warn("PNG:$tagName not written (compress error)");
+                    $$outBuff or $et->Warn("PNG:$tagName not written (compress error)");
                 }
             }
             return 1;
@@ -714,6 +750,7 @@ sub FoundPNG($$$$;$$$$)
         $$tagInfo{LangCode} = $lang if $lang;
         # make unknown profiles binary data type
         $$tagInfo{Binary} = 1 if $tag =~ /^Raw profile type /;
+        $verbose and $et->VPrint(0, "  | [adding $tag]\n");
         AddTagToTable($tagTablePtr, $tag, $tagInfo);
     }
 #
@@ -724,7 +761,7 @@ sub FoundPNG($$$$;$$$$)
         # since we aren't decoding it anyway;
         my $subdir = $$tagInfo{SubDirectory};
         delete $$tagInfo{SubDirectory};
-        $exifTool->VerboseInfo($tag, $tagInfo,
+        $et->VerboseInfo($tag, $tagInfo,
             Table  => $tagTablePtr,
             DataPt => \$val,
         );
@@ -736,7 +773,7 @@ sub FoundPNG($$$$;$$$$)
         $$tagInfo{RawConv} = '\$val';
         $delRawConv = 1;
     }
-    $exifTool->FoundTag($tagInfo, $val);
+    $et->FoundTag($tagInfo, $val);
     delete $$tagInfo{RawConv} if $delRawConv;
     return 1;
 }
@@ -747,7 +784,7 @@ sub FoundPNG($$$$;$$$$)
 # Returns: 1 on success
 sub ProcessProfile($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $tagInfo = $$dirInfo{TagInfo};
     my $outBuff = $$dirInfo{OutBuff};
@@ -762,17 +799,17 @@ sub ProcessProfile($$$)
     my $buff = pack('H*', join('',split(' ',$3)));
     my $actualLen = length $buff;
     if ($len ne $actualLen) {
-        $exifTool->Warn("$tagName is wrong size (should be $len bytes but is $actualLen)");
+        $et->Warn("$tagName is wrong size (should be $len bytes but is $actualLen)");
         $len = $actualLen;
     }
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     if ($verbose) {
         if ($verbose > 2) {
-            $exifTool->VerboseDir("Decoded $tagName", 0, $len);
-            $exifTool->VerboseDump(\$buff);
+            $et->VerboseDir("Decoded $tagName", 0, $len);
+            $et->VerboseDump(\$buff);
         }
         # don't indent next directory (since it is really the same data)
-        $exifTool->{INDENT} =~ s/..$//;
+        $$et{INDENT} =~ s/..$//;
     }
     my %dirInfo = (
         Parent   => 'PNG',
@@ -783,22 +820,28 @@ sub ProcessProfile($$$)
         Base     => 0,
         OutFile  => $outBuff,
     );
+    $$et{PROCESSED} = { };    # reset processed directory offsets
     my $processed = 0;
-    my $oldChanged = $exifTool->{CHANGED};
+    my $oldChanged = $$et{CHANGED};
     my $exifTable = GetTagTable('Image::ExifTool::Exif::Main');
-    my $editDirs = $exifTool->{EDIT_DIRS};
-    my $addDirs = $exifTool->{ADD_DIRS};
+    my $editDirs = $$et{EDIT_DIRS};
+
     if ($tagTablePtr ne $exifTable) {
+        # this is unfortunate, but the "IPTC" profile may be stored as either
+        # IPTC IIM or a Photoshop IRB resource, so we must test for this
+        if ($tagName eq 'IPTC_Profile' and $buff =~ /^\x1c/) {
+            $tagTablePtr = GetTagTable('Image::ExifTool::IPTC::Main');
+        }
         # process non-EXIF and non-APP1 profile as-is
         if ($outBuff) {
             # no need to rewrite this if not editing tags in this directory
             my $dir = $tagName;
             $dir =~ s/_Profile// unless $dir =~ /^ICC/;
             return 1 unless $$editDirs{$dir};
-            $$outBuff = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr);
-            delete $$addDirs{$dir};
+            $$outBuff = $et->WriteDirectory(\%dirInfo, $tagTablePtr);
+            DoneDir($et, $dir, $outBuff);
         } else {
-            $processed = $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+            $processed = $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
         }
     } elsif ($buff =~ /^$Image::ExifTool::exifAPP1hdr/) {
         # APP1 EXIF information
@@ -807,12 +850,12 @@ sub ProcessProfile($$$)
         $dirInfo{DirStart} += $hdrLen;
         $dirInfo{DirLen} -= $hdrLen;
         if ($outBuff) {
-            $$outBuff = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr,
-                                                  \&Image::ExifTool::WriteTIFF);
+            $$outBuff = $et->WriteDirectory(\%dirInfo, $tagTablePtr,
+                                            \&Image::ExifTool::WriteTIFF);
             $$outBuff = $Image::ExifTool::exifAPP1hdr . $$outBuff if $$outBuff;
-            delete $$addDirs{IFD0};
+            DoneDir($et, 'IFD0', $outBuff);
         } else {
-            $processed = $exifTool->ProcessTIFF(\%dirInfo);
+            $processed = $et->ProcessTIFF(\%dirInfo);
         }
     } elsif ($buff =~ /^$Image::ExifTool::xmpAPP1hdr/) {
         # APP1 XMP information
@@ -822,30 +865,29 @@ sub ProcessProfile($$$)
         $dirInfo{DirLen} -= $hdrLen;
         if ($outBuff) {
             return 1 unless $$editDirs{XMP};
-            $$outBuff = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr);
+            $$outBuff = $et->WriteDirectory(\%dirInfo, $tagTablePtr);
             $$outBuff and $$outBuff = $Image::ExifTool::xmpAPP1hdr . $$outBuff;
-            delete $$addDirs{XMP};
+            DoneDir($et, 'XMP', $outBuff, 1);
         } else {
-            $processed = $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+            $processed = $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
         }
     } elsif ($buff =~ /^(MM\0\x2a|II\x2a\0)/) {
-        # TIFF information (haven't seen this, but what the heck...)
+        # TIFF information
         return 1 if $outBuff and not $$editDirs{IFD0};
         if ($outBuff) {
-            $$outBuff = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr,
-                                                  \&Image::ExifTool::WriteTIFF);
-            $$outBuff = $Image::ExifTool::exifAPP1hdr . $$outBuff if $$outBuff;
-            delete $$addDirs{IFD0};
+            $$outBuff = $et->WriteDirectory(\%dirInfo, $tagTablePtr,
+                                            \&Image::ExifTool::WriteTIFF);
+            DoneDir($et, 'IFD0', $outBuff);
         } else {
-            $processed = $exifTool->ProcessTIFF(\%dirInfo);
+            $processed = $et->ProcessTIFF(\%dirInfo);
         }
     } else {
         my $profName = $profileType;
         $profName =~ tr/\x00-\x1f\x7f-\xff/./;
-        $exifTool->Warn("Unknown raw profile '$profName'");
+        $et->Warn("Unknown raw profile '$profName'");
     }
     if ($outBuff and defined $$outBuff and length $$outBuff) {
-        if ($exifTool->{CHANGED} != $oldChanged) {
+        if ($$et{CHANGED} != $oldChanged) {
             my $hdr = sprintf("\n%s\n%8d\n", $profileType, length($$outBuff));
             # hex encode the data
             $$outBuff = $hdr . HexEncode($outBuff);
@@ -863,7 +905,7 @@ sub ProcessProfile($$$)
 # Notes: writes new chunk data to ${$$dirInfo{OutBuff}} if writing tag
 sub ProcessPNG_Compressed($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my ($tag, $val) = split /\0/, ${$$dirInfo{DataPt}}, 2;
     return 0 unless defined $val;
     # set compressed to 2 + compression method to decompress the data
@@ -872,14 +914,18 @@ sub ProcessPNG_Compressed($$$)
     $val = substr($val, 1); # remove compression method byte
     my $success;
     my $outBuff = $$dirInfo{OutBuff};
+    my $tagInfo = $$dirInfo{TagInfo};
     # use the PNG chunk tag instead of the embedded tag name for iCCP chunks
-    if ($$dirInfo{TagInfo} and $$dirInfo{TagInfo}->{Name} eq 'ICC_Profile') {
-        $tag = 'iCCP';
+    if ($tagInfo and $$tagInfo{Name} eq 'ICC_Profile') {
+        $et->VerboseDir('iCCP');
         $tagTablePtr = \%Image::ExifTool::PNG::Main;
-        $success = FoundPNG($exifTool, $tagTablePtr, $tag, $val, $compressed, $outBuff);
+        if (length($tag) and not $outBuff) {
+            FoundPNG($et, $tagTablePtr, 'iCCP-name', $tag);
+        }
+        $success = FoundPNG($et, $tagTablePtr, 'iCCP', $val, $compressed, $outBuff);
         $$outBuff = $hdr . $$outBuff if $outBuff and $$outBuff;
     } else {
-        $success = FoundPNG($exifTool, $tagTablePtr, $tag, $val, $compressed, $outBuff, 'Latin');
+        $success = FoundPNG($et, $tagTablePtr, $tag, $val, $compressed, $outBuff, 'Latin');
     }
     return $success;
 }
@@ -891,10 +937,10 @@ sub ProcessPNG_Compressed($$$)
 # Notes: writes new chunk data to ${$$dirInfo{OutBuff}} if writing tag
 sub ProcessPNG_tEXt($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my ($tag, $val) = split /\0/, ${$$dirInfo{DataPt}}, 2;
     my $outBuff = $$dirInfo{OutBuff};
-    return FoundPNG($exifTool, $tagTablePtr, $tag, $val, undef, $outBuff, 'Latin');
+    return FoundPNG($et, $tagTablePtr, $tag, $val, undef, $outBuff, 'Latin');
 }
 
 #------------------------------------------------------------------------------
@@ -904,7 +950,7 @@ sub ProcessPNG_tEXt($$$)
 # Notes: writes new chunk data to ${$$dirInfo{OutBuff}} if writing tag
 sub ProcessPNG_iTXt($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my ($tag, $dat) = split /\0/, ${$$dirInfo{DataPt}}, 2;
     return 0 unless defined $dat and length($dat) >= 4;
     my ($compressed, $meth) = unpack('CC', $dat);
@@ -912,7 +958,7 @@ sub ProcessPNG_iTXt($$$)
     # set compressed flag so we will decompress it in FoundPNG()
     $compressed and $compressed = 2 + $meth;
     my $outBuff = $$dirInfo{OutBuff};
-    return FoundPNG($exifTool, $tagTablePtr, $tag, $val, $compressed, $outBuff, 'UTF8', $lang);
+    return FoundPNG($et, $tagTablePtr, $tag, $val, $compressed, $outBuff, 'UTF8', $lang);
 }
 
 #------------------------------------------------------------------------------
@@ -921,7 +967,7 @@ sub ProcessPNG_iTXt($$$)
 # Returns: 1 on success, 0 if this wasn't a valid PNG image, or -1 on write error
 sub ProcessPNG($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $outfile = $$dirInfo{OutFile};
     my $raf = $$dirInfo{RAF};
     my $datChunk = '';
@@ -931,34 +977,44 @@ sub ProcessPNG($$)
 
     # check to be sure this is a valid PNG/MNG/JNG image
     return 0 unless $raf->Read($sig,8) == 8 and $pngLookup{$sig};
+
+    my $earlyXMP = $et->Options('PNGEarlyXMP');
     if ($outfile) {
-        delete $$exifTool{TextChunkType};
+        delete $$et{TextChunkType};
         Write($outfile, $sig) or $err = 1 if $outfile;
         # can only add tags in Main and TextualData tables
-        $exifTool->{ADD_PNG} = $exifTool->GetNewTagInfoHash(
+        $$et{ADD_PNG} = $et->GetNewTagInfoHash(
             \%Image::ExifTool::PNG::Main,
             \%Image::ExifTool::PNG::TextualData);
+        # NOTE: PNGDoneTag and PNGDoneDir are used to keep track of metadata added
+        # before the PNG IEND chunk is encountered.  Currently this is implemented
+        # only for XMP (written before IDAT with the PNGEarlyXMP option), but
+        # may be implemented in the future for other types - PH
+        $$et{PNGDoneTag} = { };
+        $$et{PNGDoneDir} = { };
         # initialize with same directories, with PNG tags taking priority
-        $exifTool->InitWriteDirs(\%pngMap,'PNG');
+        $et->InitWriteDirs(\%pngMap,'PNG');
+        # write XMP before IDAT if we would delete it later anyway
+        $earlyXMP = 1 if $$et{DEL_GROUP}{XMP};
     }
     my ($fileType, $hdrChunk, $endChunk) = @{$pngLookup{$sig}};
-    $exifTool->SetFileType($fileType);  # set the FileType tag
+    $et->SetFileType($fileType);  # set the FileType tag
     SetByteOrder('MM'); # PNG files are big-endian
     my $tagTablePtr = GetTagTable('Image::ExifTool::PNG::Main');
     my $mngTablePtr;
     if ($fileType ne 'PNG') {
         $mngTablePtr = GetTagTable('Image::ExifTool::MNG::Main');
     }
-    my $verbose = $exifTool->Options('Verbose');
-    my $out = $exifTool->Options('TextOut');
+    my $verbose = $et->Options('Verbose');
+    my $out = $et->Options('TextOut');
     my ($hbuf, $dbuf, $cbuf, $foundHdr);
 
     # process the PNG/MNG/JNG chunks
     undef $noCompressLib;
     for (;;) {
-        $raf->Read($hbuf,8) == 8 or $exifTool->Warn("Truncated $fileType image"), last;
+        $raf->Read($hbuf,8) == 8 or $et->Warn("Truncated $fileType image"), last;
         my ($len, $chunk) = unpack('Na4',$hbuf);
-        $len > 0x7fffffff and $exifTool->Warn("Invalid $fileType box size"), last;
+        $len > 0x7fffffff and $et->Warn("Invalid $fileType box size"), last;
         if ($verbose) {
             # don't dump image data chunks in verbose mode (only give count instead)
             if ($datCount and $chunk ne $datChunk) {
@@ -976,11 +1032,15 @@ sub ProcessPNG($$)
         if ($outfile) {
             if ($chunk eq 'IEND') {
                 # add any new chunks immediately before the IEND chunk
-                AddChunks($exifTool, $outfile) or $err = 1;
+                AddChunks($et, $outfile) or $err = 1;
             } elsif ($chunk eq 'PLTE' or $chunk eq 'IDAT') {
+                # add XMP before IDAT if specified
+                if ($earlyXMP and $chunk eq 'IDAT') {
+                    AddChunks($et, $outfile, 'XMP') or $err = 1;
+                }
                 # iCCP chunk must come before PLTE and IDAT
                 # (ignore errors -- will add later as text profile if this fails)
-                Add_iCCP($exifTool, $outfile);
+                Add_iCCP($et, $outfile);
             }
         }
         if ($chunk eq $endChunk) {
@@ -995,18 +1055,20 @@ sub ProcessPNG($$)
             $ok = 1;
             last;
         }
+        # set FoundIDAT flag: 1=after IDAT, 2=after IDAT and warn about late XMP
+        $$et{FoundIDAT} = $earlyXMP ? 2 : 1 if $chunk eq 'IDAT';
         # read chunk data and CRC
         unless ($raf->Read($dbuf,$len)==$len and $raf->Read($cbuf, 4)==4) {
-            $exifTool->Warn("Corrupted $fileType image");
+            $et->Warn("Corrupted $fileType image");
             last;
         }
         unless ($foundHdr) {
             if ($chunk eq $hdrChunk) {
                 $foundHdr = 1;
             } elsif ($hdrChunk eq 'IHDR' and $chunk eq 'CgBI') {
-                $exifTool->Warn('Non-standard PNG image (Apple iPhone format)');
+                $et->Warn('Non-standard PNG image (Apple iPhone format)');
             } else {
-                $exifTool->Warn("$fileType image did not start with $hdrChunk");
+                $et->Warn("$fileType image did not start with $hdrChunk");
                 last;
             }
         }
@@ -1014,29 +1076,29 @@ sub ProcessPNG($$)
             # check CRC when in verbose mode (since we don't care about speed)
             my $crc = CalculateCRC(\$hbuf, undef, 4);
             $crc = CalculateCRC(\$dbuf, $crc);
-            $crc == unpack('N',$cbuf) or $exifTool->Warn("Bad CRC for $chunk chunk");
+            $crc == unpack('N',$cbuf) or $et->Warn("Bad CRC for $chunk chunk");
             if ($datChunk) {
                 Write($outfile, $hbuf, $dbuf, $cbuf) or $err = 1 if $outfile;
                 next;
             }
             print $out "$fileType $chunk ($len bytes):\n";
-            $exifTool->VerboseDump(\$dbuf, Addr => $raf->Tell() - $len - 4) if $verbose > 2;
+            $et->VerboseDump(\$dbuf, Addr => $raf->Tell() - $len - 4) if $verbose > 2;
         }
         # only extract information from chunks in our tables
         my ($theBuff, $outBuff);
         $outBuff = \$theBuff if $outfile;
         if ($$tagTablePtr{$chunk}) {
-            FoundPNG($exifTool, $tagTablePtr, $chunk, $dbuf, undef, $outBuff);
+            FoundPNG($et, $tagTablePtr, $chunk, $dbuf, undef, $outBuff);
         } elsif ($mngTablePtr and $$mngTablePtr{$chunk}) {
-            FoundPNG($exifTool, $mngTablePtr, $chunk, $dbuf, undef, $outBuff);
+            FoundPNG($et, $mngTablePtr, $chunk, $dbuf, undef, $outBuff);
         }
         if ($outfile) {
             if (defined $theBuff) {
                 next unless length $theBuff; # empty if we deleted the information
                 # change chunk type if necessary
-                if ($$exifTool{TextChunkType}) {
-                    $chunk = $$exifTool{TextChunkType};
-                    delete $$exifTool{TextChunkType};
+                if ($$et{TextChunkType}) {
+                    $chunk = $$et{TextChunkType};
+                    delete $$et{TextChunkType};
                 }
                 $hbuf = pack('Na4', length($theBuff), $chunk);
                 $dbuf = $theBuff;
@@ -1071,7 +1133,7 @@ and JNG (JPEG Network Graphics) images.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -16,7 +16,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.06';
+$VERSION = '1.07';
 
 #------------------------------------------------------------------------------
 # Read or write information in a PPM/PGM/PBM image
@@ -24,11 +24,11 @@ $VERSION = '1.06';
 # Returns: 1 on success, 0 if this wasn't a valid PPM file, -1 on write error
 sub ProcessPPM($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my $outfile = $$dirInfo{OutFile};
-    my $verbose = $exifTool->Options('Verbose');
-    my $out = $exifTool->Options('TextOut');
+    my $verbose = $et->Options('Verbose');
+    my $out = $et->Options('TextOut');
     my ($buff, $num, $type, %info);
 #
 # read as much of the image as necessary to extract the header and comments
@@ -78,19 +78,19 @@ sub ProcessPPM($$)
         $info{Comment} =~ s/^# ?//mg;   # remove "# " at the start of each line
         $info{Comment} =~ s/\n$//;      # remove trailing newline
     }
-    $exifTool->SetFileType($type);
+    $et->SetFileType($type);
     my $len = pos($buff);
 #
 # rewrite the file if requested
 #
     if ($outfile) {
         my $nvHash;
-        my $newComment = $exifTool->GetNewValues('Comment', \$nvHash);
+        my $newComment = $et->GetNewValues('Comment', \$nvHash);
         my $oldComment = $info{Comment};
-        if ($exifTool->IsOverwriting($nvHash, $oldComment)) {
-            ++$exifTool->{CHANGED};
-            $exifTool->VerboseValue('- Comment', $oldComment) if defined $oldComment;
-            $exifTool->VerboseValue('+ Comment', $newComment) if defined $newComment;
+        if ($et->IsOverwriting($nvHash, $oldComment)) {
+            ++$$et{CHANGED};
+            $et->VerboseValue('- Comment', $oldComment) if defined $oldComment;
+            $et->VerboseValue('+ Comment', $newComment) if defined $newComment;
         } else {
             $newComment = $oldComment;  # use existing comment
         }
@@ -118,7 +118,7 @@ sub ProcessPPM($$)
     }
     my $tag;
     foreach $tag (qw{Comment ImageWidth ImageHeight MaxVal}) {
-        $exifTool->FoundTag($tag, $info{$tag}) if defined $info{$tag};
+        $et->FoundTag($tag, $info{$tag}) if defined $info{$tag};
     }
     return 1;
 }
@@ -143,7 +143,7 @@ BitMap) images.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -15,7 +15,7 @@ use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Exif;
 
-$VERSION = '1.03';
+$VERSION = '1.04';
 
 sub ProcessExtData($$$);
 
@@ -162,28 +162,28 @@ sub ProcessExtData($$$);
 # Returns: 1 on success
 sub ProcessExtData($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirLen = $$dirInfo{DirLen};
     my $pos = 0;
     # loop through sub-blocks
     while ($pos + 10 < $dirLen) {
         unless (substr($$dataPt, $pos, 4) eq "~FL\0") {
-            $exifTool->Warn('Lost synchronization while reading sub blocks');
+            $et->Warn('Lost synchronization while reading sub blocks');
             last;
         }
         my $tag = Get16u($dataPt, $pos + 4);
         my $len = Get32u($dataPt, $pos + 6);
         $pos += 10 + $len;
         if ($pos > $dirLen) {
-            $exifTool->Warn("Truncated sub block ID=$tag len=$len");
+            $et->Warn("Truncated sub block ID=$tag len=$len");
             last;
         }
         next unless $$tagTablePtr{$tag};
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag) or next;
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag) or next;
         my $start = $pos - $len;
         unless ($$tagInfo{Name} eq 'EXIFInfo') {
-            $exifTool->HandleTag($tagTablePtr, $tag, undef,
+            $et->HandleTag($tagTablePtr, $tag, undef,
                 TagInfo => $tagInfo,
                 DataPt  => $dataPt,
                 DataPos => $$dirInfo{DataPos},
@@ -212,7 +212,7 @@ sub ProcessExtData($$$)
             Multi    => 0,
         );
         my $exifTable = GetTagTable($$tagInfo{SubDirectory}{TagTable});
-        Image::ExifTool::Exif::ProcessExif($exifTool, \%dirInfo, $exifTable);
+        Image::ExifTool::Exif::ProcessExif($et, \%dirInfo, $exifTable);
         SetByteOrder('II');
     }
     return 1;
@@ -224,26 +224,26 @@ sub ProcessExtData($$$)
 # Returns: 1 on success, 0 if this wasn't a valid PSP file
 sub ProcessPSP($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my ($buff, $tag, $len, $err);
     return 0 unless $raf->Read($buff, 32) == 32 and
                     $buff eq "Paint Shop Pro Image File\x0a\x1a\0\0\0\0\0" and
                     $raf->Read($buff, 4) == 4;
-    $exifTool->SetFileType();
+    $et->SetFileType();
     SetByteOrder('II');
     my $tagTablePtr = GetTagTable('Image::ExifTool::PSP::Main');
     my @a = unpack('v*', $buff);
     # figure out block header length for this format PSP file
     my $hlen = $a[0] > 3 ? 10 : 14;
-    $$exifTool{PSPFileVersion} = $a[0]; # save for use in Condition
-    $exifTool->HandleTag($tagTablePtr, FileVersion => "@a");
+    $$et{PSPFileVersion} = $a[0]; # save for use in Condition
+    $et->HandleTag($tagTablePtr, FileVersion => "@a");
     # loop through blocks in file
     my $pos = 36;
     for (;;) {
         last unless $raf->Read($buff, $hlen) == $hlen;
         unless ($buff =~ /^~BK\0/) {
-            $exifTool->Warn('Lost synchronization while reading main PSP blocks');
+            $et->Warn('Lost synchronization while reading main PSP blocks');
             last;
         }
         $tag = Get16u(\$buff, 4);
@@ -254,13 +254,13 @@ sub ProcessPSP($$)
             next;
         }
         $raf->Read($buff, $len) == $len or $err=1, last;
-        $exifTool->HandleTag($tagTablePtr, $tag, $buff,
+        $et->HandleTag($tagTablePtr, $tag, $buff,
             DataPt  => \$buff,
             DataPos => $pos - $len,
             Size    => $len,
         );
     }
-    $err and $exifTool->Warn("Truncated main block ID=$tag len=$len");
+    $err and $et->Warn("Truncated main block ID=$tag len=$len");
     return 1;
 }
 
@@ -283,7 +283,7 @@ information from Paint Shop Pro images.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -20,6 +20,8 @@
 #              15) Zdenek Mihula private communication (TZ8)
 #              16) Olaf Ulrich private communication
 #              17) http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,4922.0.html
+#              18) Thomas Modes private communication (G6)
+#              19) http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,5533.0.html
 #              JD) Jens Duttke private communication (TZ3,FZ30,FZ50)
 #------------------------------------------------------------------------------
 
@@ -30,7 +32,7 @@ use vars qw($VERSION %leicaLensTypes);
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Exif;
 
-$VERSION = '1.72';
+$VERSION = '1.83';
 
 sub ProcessPanasonicType2($$$);
 sub WhiteBalanceConv($;$$);
@@ -210,6 +212,7 @@ my %shootingMode = (
     44 => 'Film Grain', #PH (FZ28)
     45 => 'My Color', #PH (GF1)
     46 => 'Photo Frame', #PH (FS7)
+    48 => 'Movie', #PH (GM1)
     # 49 - seen for FS4 (snow?)
     51 => 'HDR', #12
     55 => 'Handheld Night Shot', #PH (FZ47)
@@ -219,6 +222,30 @@ my %shootingMode = (
     63 => 'Glass Through', #17
     64 => 'HDR', #17
     66 => 'Digital Filter', #PH (GF5 "Impressive Art", "Cross Process", "Color Select", "Star")
+    67 => 'Clear Portrait', #18
+    68 => 'Silky Skin', #18
+    69 => 'Backlit Softness', #18
+    70 => 'Clear in Backlight', #18
+    71 => 'Relaxing Tone', #18
+    72 => "Sweet Child's Face", #18
+    73 => 'Distinct Scenery', #18
+    74 => 'Bright Blue Sky', #18
+    75 => 'Romantic Sunset Glow', #18
+    76 => 'Vivid Sunset Glow', #18
+    77 => 'Glistening Water', #18
+    78 => 'Clear Nightscape', #18
+    79 => 'Cool Night Sky', #18
+    80 => 'Warm Glowing Nightscape', #18
+    81 => 'Artistic Nightscape', #18
+    82 => 'Glittering Illuminations', #18
+    83 => 'Clear Night Portrait', #18
+    84 => 'Soft Image of a Flower', #18
+    85 => 'Appetizing Food', #18
+    86 => 'Cute Desert', #18
+    87 => 'Freeze Animal Motion', #18
+    88 => 'Clear Sports Shot', #18
+    89 => 'Monochrome', #18
+    90 => 'Creative Control', #18
 );
 
 %Image::ExifTool::Panasonic::Main = (
@@ -280,7 +307,9 @@ my %shootingMode = (
             2 => 'Manual',
             4 => 'Auto, Focus button', #4
             5 => 'Auto, Continuous', #4
-            # have seens 6 for GF1 - PH
+            6 => 'AF-S', #18 (also seen for GF1 - PH)
+            7 => 'AF-C', #18
+            8 => 'AF-F', #18 (auto-focus flexible)
         },
     },
     0x0f => [
@@ -315,6 +344,7 @@ my %shootingMode = (
                 '32 2'  => '3-area (center)?', # (DMC-L1 guess)
                 '32 3'  => '3-area (right)?', # (DMC-L1 guess)
                 '64 0'  => 'Face Detect',
+                '128 0' => 'Spot Focusing 2', #18
             },
         },
     ],
@@ -325,7 +355,9 @@ my %shootingMode = (
             2 => 'On, Mode 1',
             3 => 'Off',
             4 => 'On, Mode 2',
-            # GF1 also has a "Mode 3"
+            5 => 'Panning', #18
+            # GF1 also has a "Mode 3" - PH
+            6 => 'On, Mode 3', #PH (GX7, sensor shift?)
         },
     },
     0x1c => {
@@ -408,6 +440,7 @@ my %shootingMode = (
             4 => 'Black & White',
             5 => 'Sepia',
             6 => 'Happy', #PH (FX70) (yes, really. you wouldn't want sad colors now would you?)
+            8 => 'Vivid', #PH (SZ3)
         },
     },
     0x29 => { #JD
@@ -455,6 +488,8 @@ my %shootingMode = (
             1 => 'On', #PH (TZ5) [was "Low/High Quality" from ref 4]
             2 => 'Auto Exposure Bracketing (AEB)', #17
             4 => 'Unlimited', #PH (TZ5)
+            8 => 'White Balance Bracketing', #18
+            17 => 'On (with flash)', #forum5597
         },
     },
     0x2b => { #4
@@ -476,10 +511,13 @@ my %shootingMode = (
                 0 => 'Normal',
                 1 => 'Low',
                 2 => 'High',
-                # 3 - observed with LZ6 and TZ5 in Fireworks mode - PH
+                # 3 - observed with LZ6 and TZ5 in Fireworks mode
+                #     and GX7 in Fantasy/Retro/OldDays/HighKey - PH
+                # 4 - observed in MP4 movie with GM1 (EXIF and 0x39 Contrast "Normal") - PH
                 # 5 - observed with FX01, FX40 and FP8 (EXIF contrast "Normal") - PH
                 6 => 'Medium Low', #PH (FZ18)
                 7 => 'Medium High', #PH (FZ18)
+                # 8 - GX7 in DynamicMonochrome mode
                 13 => 'High Dynamic', #PH (FZ47 in ?)
                 # DMC-LC1 values:
                 0x100 => 'Low',
@@ -713,7 +751,19 @@ my %shootingMode = (
         Name => 'ColorTempKelvin',
         Format => 'int16u',
     },
-    # 0x45 - int16u: 0
+    0x45 => { #19
+        Name => 'BracketSettings',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'No Bracket',
+            1 => '3 Images, Sequence 0/-/+',
+            2 => '3 Images, Sequence -/0/+',
+            3 => '5 Images, Sequence 0/-/+',
+            4 => '5 Images, Sequence -/0/+',
+            5 => '7 Images, Sequence 0/-/+',
+            6 => '7 Images, Sequence -/0/+',
+        },
+    },
     0x46 => { #PH/JD
         Name => 'WBShiftAB',
         Format => 'int16s',
@@ -735,8 +785,14 @@ my %shootingMode = (
             2 => '2nd',
         },
     },
-    # 0x48 - int16u: 0
-    # 0x49 - int16u: 2
+    0x49 => { #19
+        Name => 'LongExposureNoiseReduction',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'Off',
+            2 => 'On'
+        }
+    },
     # 0x4a - int16u: 0
     0x4b => { #PH
         Name => 'PanasonicImageWidth',
@@ -770,18 +826,26 @@ my %shootingMode = (
         Name => 'LensType',
         Writable => 'string',
         ValueConv => '$val=~s/ +$//; $val', # trim trailing spaces
+        ValueConvInv => '$val',
     },
     0x52 => { #7 (DMC-L1)
         Name => 'LensSerialNumber',
         Writable => 'string',
         ValueConv => '$val=~s/ +$//; $val', # trim trailing spaces
+        ValueConvInv => '$val',
     },
     0x53 => { #7 (DMC-L1)
         Name => 'AccessoryType',
         Writable => 'string',
         ValueConv => '$val=~s/ +$//; $val', # trim trailing spaces
+        ValueConvInv => '$val',
+    },
+    0x54 => { #19
+        Name => 'AccessorySerialNumber',
+        Writable => 'string',
+        ValueConv => '$val=~s/ +$//; $val', # trim trailing spaces
+        ValueConvInv => '$val',
     },
-    # 0x54 - string[14]: "0000000"
     # 0x55 - int16u: 1
     # 0x57 - int16u: 0
     0x59 => { #PH (FS7)
@@ -812,7 +876,15 @@ my %shootingMode = (
             3 => 'High',
         },
     },
-    # 0x5e,0x5f,0x60 - undef[4]
+    # 0x5e,0x5f - undef[4]
+    0x60 => { #18
+        Name => 'LensFirmwareVersion',
+        Writable => 'undef',
+        Format => 'int8u',
+        Count => 4,
+        PrintConv => '$val=~tr/ /./; $val',
+        PrintConvInv => '$val=~tr/./ /; $val',
+    },
     0x61 => { #PH
         Name => 'FaceRecInfo',
         SubDirectory => {
@@ -892,7 +964,13 @@ my %shootingMode = (
         },
     },
     # 0x71 - undef[128] (maybe text stamp text?)
-    # 0x72,0x73,0x74,0x75,0x76,0x77,0x78: 0
+    0x77 => { #18
+        Name => 'BurstSpeed',
+        Writable => 'int16u',
+        Notes => 'images per second',
+    },
+    # 0x72,0x73,0x74,0x75,0x77,0x78: 0
+    # 0x76: 0, (3 for G6 with HDR on, ref 18)
     0x79 => { #PH (GH2)
         Name => 'IntelligentD-Range',
         Writable => 'int16u',
@@ -904,6 +982,11 @@ my %shootingMode = (
         },
     },
     # 0x7a,0x7b: 0
+    0x7c => { #18
+        Name => 'ClearRetouch',
+        Writable => 'int16u',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
     0x86 => { #http://dev.exiv2.org/issues/825
         Name => 'ManometerPressure',
         Writable => 'int16u',
@@ -913,7 +996,7 @@ my %shootingMode = (
         PrintConv => 'sprintf("%.1f kPa",$val)',
         PrintConvInv => '$val=~s/ ?kPa//i; $val',
     },
-    0x0089 => {
+    0x89 => {
         Name => 'PhotoStyle',
         Writable => 'int16u',
         PrintConv => {
@@ -926,6 +1009,120 @@ my %shootingMode = (
             6 => 'Portrait',
         },
     },
+    0x8a => { #18
+        Name => 'ShadingCompensation',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On'
+        }
+    },
+    0x8c => {
+        Name => 'AccelerometerZ',
+        Writable => 'int16u',
+        Format => 'int16s',
+        Notes => 'positive is acceleration upwards',
+    },
+    0x8d => {
+        Name => 'AccelerometerX',
+        Writable => 'int16u',
+        Format => 'int16s',
+        Notes => 'positive is acceleration to the left',
+    },
+    0x8e => {
+        Name => 'AccelerometerY',
+        Writable => 'int16u',
+        Format => 'int16s',
+        Notes => 'positive is acceleration backwards',
+    },
+    0x8f => { #18
+        Name => 'CameraOrientation',
+        Writable => 'int8u',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Rotate CW',
+            2 => 'Rotate 180',
+            3 => 'Rotate CCW',
+            4 => 'Tilt Upwards',
+            5 => 'Tilt Downwards'
+        }
+    },
+    0x90 => {
+        Name => 'RollAngle',
+        Writable => 'int16u',
+        Format => 'int16s',
+        Notes => 'degrees of clockwise camera rotation',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+    },
+    0x91 => {
+        Name => 'PitchAngle',
+        Writable => 'int16u',
+        Format => 'int16s',
+        Notes => 'degrees of upward camera tilt',
+        ValueConv => '-$val / 10',
+        ValueConvInv => '-$val * 10',
+    },
+    0x93 => { #18
+        Name => 'SweepPanoramaDirection',
+        Writable => 'int8u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Left to Right',
+            2 => 'Right to Left',
+            3 => 'Top to Bottom',
+            4 => 'Bottom to Top'
+        }
+    },
+    0x94 => { #18
+        Name => 'SweepPanoramaFieldOfView',
+        Writable => 'int16u'
+    },
+    0x96 => { #18
+        Name => 'TimerRecording',
+        Writable => 'int8u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Time Lapse',
+            2 => 'Stop-motion Animation',
+        },
+    },
+    0x9d => { #18
+        Name => 'InternalNDFilter',
+        Writable => 'rational64u'
+    },
+    0x9e => { #18
+        Name => 'HDR',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            100 => '1 EV',
+            200 => '2 EV',
+            300 => '3 EV',
+            32868 => '1 EV (Auto)',
+            32968 => '2 EV (Auto)',
+            33068 => '3 EV (Auto)',
+        },
+    },
+    0x9f => { #18
+        Name => 'ShutterType',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Mechanical',
+            1 => 'Electronic',
+            2 => 'Hybrid', #PH (GM1, 1st curtain electronic, 2nd curtain mechanical)
+        },
+    },
+    0xa3 => { #18
+        Name => 'ClearRetouchValue',
+        Writable => 'rational64u',
+        # undef if ClearRetouch is off, 0 if it is on
+    },
+    0xab => { #18
+        Name => 'TouchAE',
+        Writable => 'int16u',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
     0x0e00 => {
         Name => 'PrintIM',
         Description => 'Print Image Matching',
@@ -1373,7 +1570,7 @@ my %shootingMode = (
         Name => 'ShotInfo',
         SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::ShotInfo' },
     },
-    # 0x0410 - int8u[16]: first byte is FileNumber 
+    # 0x0410 - int8u[16]: first byte is FileNumber
     # 0x0411 - int8u[4]: first number is FilmMode (1=Standard,2=Vivid,3=Natural,4=BW Natural,5=BW High Contrast)
     0x0412 => { Name => 'FilmMode',         Writable => 'string' },
     0x0413 => { Name => 'WB_RGBLevels',     Writable => 'rational64u', Count => 3 },
@@ -1399,11 +1596,14 @@ my %shootingMode = (
     WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
     CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
     GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' },
-    NOTES => 'This information is written by the S2 (as a trailer in JPEG images).',
+    NOTES => q{
+        This information is written by the S2 and M (Typ 240), as a trailer in JPEG
+        images.
+    },
     0x300 => {
         Name => 'PreviewImage',
         Writable => 'undef',
-        Notes => 'S2',
+        Notes => 'S2 and M (Typ 240)',
         DataTag => 'PreviewImage',
         RawConv => q{
             return \$val if $val =~ /^Binary/;
@@ -1425,6 +1625,7 @@ my %shootingMode = (
         Name => 'LensType',
         Writable => 'string',
         ValueConv => '$val=~s/ +$//; $val', # trim trailing spaces
+        ValueConvInv => '$val',
     },
     # 0x340 - same as 0x302
 );
@@ -1577,6 +1778,21 @@ my %shootingMode = (
         Tags extracted from the PANA user data found in MP4 videos from models such
         as the DMC-FT20.
     },
+    0 => {
+        Name => 'ThumbnailTest',
+        Format => 'undef[0x1000]',
+        Hidden => 1,
+        RawConv => q{
+            if (substr($val,0x5c,3) eq "\xff\xd8\xff") {
+                $$self{ThumbType} = 1;
+            } elsif (substr($val,0x546,3) eq "\xff\xd8\xff") {
+                $$self{ThumbType} = 2;
+            } else {
+                $$self{ThumbType} = 0;
+            }
+            return undef;
+        },
+    },
     4 => {
         Name => 'Model',
         Description => 'Camera Model Name',
@@ -1584,18 +1800,45 @@ my %shootingMode = (
     },
     0x58 => {
         Name => 'ThumbnailWidth',
+        Condition => '$$self{ThumbType} == 1',
+        Notes => 'Panasonic models',
         Format => 'int16u',
     },
     0x5a => {
         Name => 'ThumbnailHeight',
+        Condition => '$$self{ThumbType} == 1',
         Format => 'int16u',
     },
     0x5c => {
         Name => 'ThumbnailImage',
+        Condition => '$$self{ThumbType} == 1',
         Format => 'undef[16384]',
-        RawConv => '$val=~/^\xff\xd8\xff/ ? $val : undef',
         ValueConv => '$val=~s/\0*$//; \$val',   # remove trailing zeros
     },
+    # 0x5c - there is some messed-up EXIF-IFD-looking data starting here in
+    #        Leica X VARIO MP4 videos, but it doesn't quite make sense
+    0x536 => { # (Leica X VARIO)
+        Name => 'ThumbnailWidth',
+        Condition => '$$self{ThumbType} == 2',
+        Notes => 'Leica X Vario',
+        Format => 'int32uRev', # (little-endian)
+    },
+    0x53a => { # (Leica X VARIO)
+        Name => 'ThumbnailHeight',
+        Condition => '$$self{ThumbType} == 2',
+        Format => 'int32uRev', # (little-endian)
+    },
+    0x53e => { # (Leica X VARIO)
+        Name => 'ThumbnailLength',
+        Condition => '$$self{ThumbType} == 2',
+        Format => 'int32uRev', # (little-endian)
+    },
+    0x546 => { # (Leica X VARIO)
+        Name => 'ThumbnailImage',
+        Condition => '$$self{ThumbType} == 2',
+        Format => 'undef[$val{0x53e}]',
+        Binary => 1,
+    },
     0x4068 => {
         Name => 'ExifData',
         Condition => '$$valPt =~ /^\xff\xd8\xff\xe1..Exif\0\0/s',
@@ -1613,19 +1856,28 @@ my %shootingMode = (
     AdvancedSceneMode => {
         SeparateTable => 'Panasonic AdvancedSceneMode',    # print values in a separate table
         Require => {
-            0 => 'SceneMode',
-            1 => 'AdvancedSceneType',
+            0 => 'Model',
+            1 => 'SceneMode',
+            2 => 'AdvancedSceneType',
         },
-        ValueConv => '"$val[0] $val[1]"',
+        ValueConv => '"$val[0] $val[1] $val[2]"',
         PrintConv => { #PH
             OTHER => sub {
-                my $val = shift;
+                my ($val,$flag,$conv) = @_;
+                $val =~ s/.* (\d+ \d+)/$1/; # drop model name
+                return $$conv{$val} if $$conv{$val};
                 my @v = split ' ', $val;
                 my $prt = $shootingMode{$v[0]};
-                return $v[1] == 1 ? $prt : "$prt ($v[1])" if $prt;
+                # AdvancedSceneType=1 for non-automatic modes P,A,S,SCN (ref 19)
+                # AdvancedSceneType=5 for automatic mode iA (ref 19)
+                if ($prt) {
+                    return $prt if $v[1] == 1;
+                    return "$prt (intelligent auto)" if $v[1] == 5;
+                    return "$prt ($v[1])";
+                }
                 return "Unknown ($val)";
             },
-            Notes => 'A Composite tag derived from SceneMode and AdvancedSceneType.',
+            Notes => 'A Composite tag derived from Model, SceneMode and AdvancedSceneType.',
             '0 1' => 'Off',
             '2 2' => 'Outdoor Portrait', #(FZ28)
             '2 3' => 'Indoor Portrait', #(FZ28)
@@ -1660,14 +1912,34 @@ my %shootingMode = (
             '59 3' => 'High Key', #(GF5)
             '59 4' => 'Sepia', #(GF3,GF5)
             '59 5' => 'High Dynamic', #(GF3,GF5)
-            '59 6' => 'Minature', #(GF3)
+            '59 6' => 'Miniature', #(GF3)
             '59 9' => 'Low Key', #(GF5)
             '59 10' => 'Toy Effect', #(GF5)
             '59 11' => 'Dynamic Monochrome', #(GF5)
             '59 12' => 'Soft', #(GF5)
+            '66 1' => 'Impressive Art', #19
             '66 2' => 'Cross Process', #(GF5)
-            '66 3' => 'Color Select', #(GF5)
+            '66 3' => 'Color Select', #(GF5) (called "One Point Color" by some other models - PH)
             '66 4' => 'Star', #(GF5)
+            '90 3' => 'Old Days', #18
+            '90 4' => 'Sunshine', #18
+            '90 5' => 'Bleach Bypass', #18
+            '90 6' => 'Toy Pop', #18
+            '90 7' => 'Fantasy', #18
+            '90 8' => 'Monochrome', #PH (GX7)
+            '90 9' => 'Rough Monochrome', #PH (GX7)
+            '90 10' => 'Silky Monochrome', #PH (GX7)
+            # TZ40 Creative Control modes (ref 19)
+            'DMC-TZ40 90 1' => 'Expressive',
+            'DMC-TZ40 90 2' => 'Retro',
+            'DMC-TZ40 90 3' => 'High Key',
+            'DMC-TZ40 90 4' => 'Sepia',
+            'DMC-TZ40 90 5' => 'High Dynamic',
+            'DMC-TZ40 90 6' => 'Miniature',
+            'DMC-TZ40 90 9' => 'Low Key',
+            'DMC-TZ40 90 10' => 'Toy Effect',
+            'DMC-TZ40 90 11' => 'Dynamic Monochrome',
+            'DMC-TZ40 90 12' => 'Soft',
         },
     },
 );
@@ -1722,38 +1994,38 @@ sub WhiteBalanceConv($;$$)
 # - deletes LeicaTrailer member and sets LeicaTrailerPos when successful
 sub ProcessLeicaTrailer($;$)
 {
-    my ($exifTool, $newPos) = @_;
-    my $trail = $$exifTool{LeicaTrailer};
-    my $raf = $$exifTool{RAF};
+    my ($et, $newPos) = @_;
+    my $trail = $$et{LeicaTrailer};
+    my $raf = $$et{RAF};
     my $trailPos = $$trail{TrailPos};
     my $pos = $trailPos || $$trail{Offset};
     my $len = $$trail{TrailLen} || $$trail{Size};
     my ($buff, $result, %tagPtr);
 
-    delete $$exifTool{LeicaTrailer} if $trailPos;   # done after this
+    delete $$et{LeicaTrailer} if $trailPos;   # done after this
     unless ($len > 0) {
-        $exifTool->Warn('Missing Leica MakerNote trailer', 1) if $trailPos;
-        delete $$exifTool{LeicaTrailer};
+        $et->Warn('Missing Leica MakerNote trailer', 1) if $trailPos;
+        delete $$et{LeicaTrailer};
         return undef;
     }
     my $oldPos = $raf->Tell();
     my $ok = ($raf->Seek($pos, 0) and $raf->Read($buff, $len) == $len);
     $raf->Seek($oldPos, 0);
     unless ($ok) {
-        $exifTool->Warn('Error reading Leica MakerNote trailer', 1) if $trailPos;
+        $et->Warn('Error reading Leica MakerNote trailer', 1) if $trailPos;
         return undef;
     }
     # look for Leica MakerNote header (should be at start of
     # trailer, but allow up to 256 bytes of garbage just in case)
     if ($buff !~ /^(.{0,256})LEICA\0..../sg) {
         my $what = $trailPos ? 'trailer' : 'offset';
-        $exifTool->Warn("Invalid Leica MakerNote $what", 1);
+        $et->Warn("Invalid Leica MakerNote $what", 1);
         return undef;
     }
     my $junk = $1;
     my $start = pos($buff) - 10;
     if ($start and not $trailPos) {
-        $exifTool->Warn('Invalid Leica MakerNote offset', 1);
+        $et->Warn('Invalid Leica MakerNote offset', 1);
         return undef;
     }
 #
@@ -1762,17 +2034,17 @@ sub ProcessLeicaTrailer($;$)
     my $hdrLen = 8;
     my $dirStart = $start + $hdrLen;
     my $tagInfo = $$trail{TagInfo};
-    if ($$exifTool{HTML_DUMP}) {
+    if ($$et{HTML_DUMP}) {
         my $name = $$tagInfo{Name};
-        $exifTool->HDump($pos+$start, $len-$start, "$name value", 'Leica MakerNote trailer', 4);
-        $exifTool->HDump($pos+$start, $hdrLen, "MakerNotes header", $name);
-    } elsif ($exifTool->Options('Verbose')) {
+        $et->HDump($pos+$start, $len-$start, "$name value", 'Leica MakerNote trailer', 4);
+        $et->HDump($pos+$start, $hdrLen, "MakerNotes header", $name);
+    } elsif ($et->Options('Verbose')) {
         my $where = sprintf('at offset 0x%x', $pos);
-        $exifTool->VPrint(0, "Leica MakerNote trailer ($len bytes $where):\n");
+        $et->VPrint(0, "Leica MakerNote trailer ($len bytes $where):\n");
     }
     # delete LeicaTrailer member so we don't try to process it again
-    delete $$exifTool{LeicaTrailer};
-    $$exifTool{LeicaTrailerPos} = $pos + $start;    # return actual start position of Leica trailer
+    delete $$et{LeicaTrailer};
+    $$et{LeicaTrailerPos} = $pos + $start;    # return actual start position of Leica trailer
 
     my $oldOrder = GetByteOrder();
     my $num = Get16u(\$buff, $dirStart);            # get entry count
@@ -1783,30 +2055,40 @@ sub ProcessLeicaTrailer($;$)
     my $fix = 0;
     if ($valStart < $len) {
         my $valBlock = Image::ExifTool::MakerNotes::GetValueBlocks(\$buff, $dirStart, \%tagPtr);
-        # find the minimum offset (excluding the PreviewImage tag 0x300)
+        # find the minimum offset (excluding the PreviewImage tag 0x300 and 0x301)
         my $minPtr;
         foreach (keys %tagPtr) {
             my $ptr = $tagPtr{$_};
-            next if $_ == 0x300 or not $ptr;
+            next if $_ == 0x300 or $_ == 0x301 or not $ptr or $ptr == 0xffffffff;
             $minPtr = $ptr if not defined $minPtr or $minPtr > $ptr;
         }
         if ($minPtr) {
             my $diff = $minPtr - ($valStart + $pos);
-            # scan value data for the first non-zero byte
             pos($buff) = $valStart;
-            if ($buff =~ /[^\0]/g) {
-                my $n = pos($buff) - 1 - $valStart; # number of zero bytes
-                # S2 writes 282 bytes of zeros, exiftool writes none
-                my $expect = $n >= 282 ? 282 : 0;
-                my $fixBase = $exifTool->Options('FixBase');
-                if ($diff != $expect or defined $fixBase) {
-                    $fix = $expect - $diff;
-                    if (defined $fixBase) {
-                        $fix = $fixBase if $fixBase ne '';
-                        $exifTool->Warn("Adjusted MakerNotes base by $fix",1);
-                    } else {
-                        $exifTool->Warn("Possibly incorrect maker notes offsets (fixed by $fix)",1);
-                    }
+            my $expect;
+            if ($$et{Model} eq 'S2') {
+                # scan value data for the first non-zero byte
+                if ($buff =~ /[^\0]/g) {
+                    my $n = pos($buff) - 1 - $valStart; # number of zero bytes
+                    # S2 writes 282 bytes of zeros, exiftool writes none
+                    $expect = $n >= 282 ? 282 : 0;
+                }
+            } else { # M (Type 240)
+                # scan for the lens type (M writes 114 bytes of garbage first)
+                if ($buff =~ /\G.{114}([\x20-\x7f]*\0*)/sg and length($1) >= 50) {
+                    $expect = 114;
+                }
+            }
+            my $fixBase = $et->Options('FixBase');
+            if (not defined $expect) {
+                $et->Warn('Unrecognized Leica trailer structure');
+            } elsif ($diff != $expect or defined $fixBase) {
+                $fix = $expect - $diff;
+                if (defined $fixBase) {
+                    $fix = $fixBase if $fixBase ne '';
+                    $et->Warn("Adjusted MakerNotes base by $fix",1);
+                } else {
+                    $et->Warn("Possibly incorrect maker notes offsets (fixed by $fix)",1);
                 }
             }
         }
@@ -1826,12 +2108,16 @@ sub ProcessLeicaTrailer($;$)
     );
     my $tagTablePtr = GetTagTable($$tagInfo{SubDirectory}{TagTable});
     if ($newPos) { # are we writing?
+        if ($$et{Model} ne 'S2') {
+            $et->Warn('Leica MakerNote trailer too messed up to edit.  Copying as a block', 1);
+            return $buff;
+        }
         # set position of new MakerNote IFD (+ 8 for Leica MakerNote header)
         $dirInfo{NewDataPos} = $newPos + $start + 8;
-        $result = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr);
+        $result = $et->WriteDirectory(\%dirInfo, $tagTablePtr);
         # write preview image last if necessary and fix up the preview offsets
-        my $previewInfo = $$exifTool{PREVIEW_INFO};
-        delete $$exifTool{PREVIEW_INFO};
+        my $previewInfo = $$et{PREVIEW_INFO};
+        delete $$et{PREVIEW_INFO};
         if ($result) {
             if ($previewInfo) {
                 my $fixup = $previewInfo->{Fixup};
@@ -1843,23 +2129,23 @@ sub ProcessLeicaTrailer($;$)
         }
     } else {
         # extract information
-        $result = $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        $result = $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
         # also extract as a block if necessary
-        if ($exifTool->Options('MakerNotes') or
-            $exifTool->{REQ_TAG_LOOKUP}{lc($$tagInfo{Name})})
+        if ($et->Options('MakerNotes') or
+            $$et{REQ_TAG_LOOKUP}{lc($$tagInfo{Name})})
         {
             # makernote header must be included in RebuildMakerNotes call
             $dirInfo{DirStart} -= 8;
             $dirInfo{DirLen} += 8;
-            $exifTool->{MAKER_NOTE_BYTE_ORDER} = GetByteOrder();
-            # rebuild maker notes (creates $exifTool->{MAKER_NOTE_FIXUP})
-            my $val = Image::ExifTool::Exif::RebuildMakerNotes($exifTool, $tagTablePtr, \%dirInfo);
+            $$et{MAKER_NOTE_BYTE_ORDER} = GetByteOrder();
+            # rebuild maker notes (creates $$et{MAKER_NOTE_FIXUP})
+            my $val = Image::ExifTool::Exif::RebuildMakerNotes($et, $tagTablePtr, \%dirInfo);
             unless (defined $val) {
-                $exifTool->Warn('Error rebuilding maker notes (may be corrupt)') if $len > 4;
+                $et->Warn('Error rebuilding maker notes (may be corrupt)') if $len > 4;
                 $val = $buff,
             }
-            my $key = $exifTool->FoundTag($tagInfo, $val);
-            $exifTool->SetGroup($key, 'ExifIFD');
+            my $key = $et->FoundTag($tagInfo, $val);
+            $et->SetGroup($key, 'ExifIFD');
         }
     }
     SetByteOrder($oldOrder);
@@ -1885,7 +2171,7 @@ Panasonic and Leica maker notes in EXIF information.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -9,6 +9,7 @@
 # References:   1) CPAN forum post by 'hardloaf' (http://www.cpanforum.com/threads/2183)
 #               2) http://www.cybercom.net/~dcoffin/dcraw/
 #               3) http://syscall.eu/#pana
+#               4) Iliah Borg private communication (LibRaw)
 #              JD) Jens Duttke private communication (TZ3,FZ30,FZ50)
 #------------------------------------------------------------------------------
 
@@ -19,7 +20,7 @@ use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Exif;
 
-$VERSION = '1.05';
+$VERSION = '1.07';
 
 sub ProcessJpgFromRaw($$$);
 sub WriteJpgFromRaw($$$);
@@ -62,13 +63,23 @@ my %jpgFromRawMap = (
     # 0x08: 1
     # 0x09: 1,3,4
     # 0x0a: 12
+    0x08 => { #4
+        Name => 'BlackLevel1',
+        Writable => 'int16u',
+        Notes => q{
+            summing BlackLevel1+2+3 values gives the common bias that must be added to
+            the BlackLevelRed/Green/Blue tags below
+        },
+    },
+    0x09 => { Name => 'BlackLevel2', Writable => 'int16u' }, #4
+    0x0a => { Name => 'BlackLevel3', Writable => 'int16u' }, #4
     # 0x0b: 0x860c,0x880a,0x880c
     # 0x0c: 2 (only Leica Digilux 2)
     # 0x0d: 0,1
     # 0x0e,0x0f,0x10: 4095
-    # 0x18,0x19,0x1a,0x1c,0x1d,0x1e: 0
-    # 0x1b,0x27,0x29,0x2a,0x2b,0x2c: [binary data]
-    # 0x2d: 2,3
+    0x0e => { Name => 'LinearityLimitRed',   Writable => 'int16u' }, #4
+    0x0f => { Name => 'LinearityLimitGreen', Writable => 'int16u' }, #4
+    0x10 => { Name => 'LinearityLimitBlue',  Writable => 'int16u' }, #4
     0x11 => { #JD
         Name => 'RedBalance',
         Writable => 'int16u',
@@ -86,6 +97,29 @@ my %jpgFromRawMap = (
         Name => 'ISO',
         Writable => 'int16u',
     },
+    # 0x18,0x19,0x1a: 0
+    0x18 => { #4
+        Name => 'HighISOMultiplierRed', 
+        Writable => 'int16u',
+        ValueConv => '$val / 256',
+        ValueConvInv => 'int($val * 256 + 0.5)',
+    },
+    0x19 => { #4
+        Name => 'HighISOMultiplierGreen', 
+        Writable => 'int16u',
+        ValueConv => '$val / 256',
+        ValueConvInv => 'int($val * 256 + 0.5)',
+    },
+    0x1a => { #4
+        Name => 'HighISOMultiplierBlue', 
+        Writable => 'int16u',
+        ValueConv => '$val / 256',
+        ValueConvInv => 'int($val * 256 + 0.5)',
+    },
+    # 0x1b: [binary data]
+    0x1c => { Name => 'BlackLevelRed',   Writable => 'int16u' }, #4
+    0x1d => { Name => 'BlackLevelGreen', Writable => 'int16u' }, #4
+    0x1e => { Name => 'BlackLevelBlue',  Writable => 'int16u' }, #4
     0x24 => { #2
         Name => 'WBRedLevel',
         Writable => 'int16u',
@@ -98,6 +132,8 @@ my %jpgFromRawMap = (
         Name => 'WBBlueLevel',
         Writable => 'int16u',
     },
+    # 0x27,0x29,0x2a,0x2b,0x2c: [binary data]
+    # 0x2d: 2,3
     0x2e => { #JD
         Name => 'JpgFromRaw', # (writable directory!)
         Writable => 'undef',
@@ -159,7 +195,7 @@ my %jpgFromRawMap = (
     },
     0x118 => {
         Name => 'RawDataOffset', #PH (RW2/RWL)
-        IsOffset => '$$exifTool{TIFF_TYPE} =~ /^(RW2|RWL)$/', # (invalid in DNG-converted files)
+        IsOffset => '$$et{TIFF_TYPE} =~ /^(RW2|RWL)$/', # (invalid in DNG-converted files)
         PanasonicHack => 1,
         OffsetPair => 0x117, # (use StripByteCounts as the offset pair)
     },
@@ -314,7 +350,7 @@ sub Checksum($$$$)
 # Returns: 1 on success
 sub ProcessDistortionInfo($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $start = $$dirInfo{DirStart} || 0;
     my $size = $$dirInfo{DataLen} || (length($$dataPt) - $start);
@@ -328,11 +364,11 @@ sub ProcessDistortionInfo($$$)
                   $csum2 ^ Get16u($dataPt, $start + 28) ^
                   $csum3 ^ Get16u($dataPt, $start + 0) ^
                   $csum4 ^ Get16u($dataPt, $start + 30);
-        $exifTool->Warn('Invalid DistortionInfo checksum',1) if $res;
+        $et->Warn('Invalid DistortionInfo checksum',1) if $res;
     } else {
-        $exifTool->Warn('Invalid DistortionInfo',1);
+        $et->Warn('Invalid DistortionInfo',1);
     }
-    return $exifTool->ProcessBinaryData($dirInfo, $tagTablePtr);
+    return $et->ProcessBinaryData($dirInfo, $tagTablePtr);
 }
 
 #------------------------------------------------------------------------------
@@ -341,9 +377,9 @@ sub ProcessDistortionInfo($$$)
 # Returns: updated distortion information or undef on error
 sub WriteDistortionInfo($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    $exifTool or return 1;  # (allow dummy access)
-    my $dat = $exifTool->WriteBinaryData($dirInfo, $tagTablePtr);
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    $et or return 1;  # (allow dummy access)
+    my $dat = $et->WriteBinaryData($dirInfo, $tagTablePtr);
     if (defined $dat and length($dat) == 32) {
         # fix checksums (ref 3)
         Set16u(Checksum(\$dat,  4, 12, 1), \$dat,  2);
@@ -351,7 +387,7 @@ sub WriteDistortionInfo($$$)
         Set16u(Checksum(\$dat,  2, 14, 2), \$dat,  0);
         Set16u(Checksum(\$dat,  3, 14, 2), \$dat, 30);
     } else {
-        $exifTool->Warn('Error wriing DistortionInfo',1);
+        $et->Warn('Error wriing DistortionInfo',1);
     }
     return $dat;
 }
@@ -412,10 +448,10 @@ sub PatchRawDataOffset($$$)
 # Returns: updated image data, or undef if nothing changed
 sub WriteJpgFromRaw($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $byteOrder = GetByteOrder();
-    my $fileType = $$exifTool{FILE_TYPE};   # RAW, RW2 or RWL
+    my $fileType = $$et{FILE_TYPE};   # RAW, RW2 or RWL
     my $dirStart = $$dirInfo{DirStart};
     if ($dirStart) { # DirStart is non-zero in DNG-converted RW2/RWL
         my $dirLen = $$dirInfo{DirLen} | length($$dataPt) - $dirStart;
@@ -428,21 +464,21 @@ sub WriteJpgFromRaw($$$)
         RAF => $raf,
         OutFile => \$outbuff,
     );
-    $$exifTool{BASE} = $$dirInfo{DataPos};
-    $$exifTool{FILE_TYPE} = $$exifTool{TIFF_TYPE} = 'JPEG';
+    $$et{BASE} = $$dirInfo{DataPos};
+    $$et{FILE_TYPE} = $$et{TIFF_TYPE} = 'JPEG';
     # use a specialized map so we don't write XMP or IPTC (or other junk) into the JPEG
-    my $editDirs = $$exifTool{EDIT_DIRS};
-    my $addDirs = $$exifTool{ADD_DIRS};
-    $exifTool->InitWriteDirs(\%jpgFromRawMap);
+    my $editDirs = $$et{EDIT_DIRS};
+    my $addDirs = $$et{ADD_DIRS};
+    $et->InitWriteDirs(\%jpgFromRawMap);
     # don't add XMP segment (IPTC won't get added because it is in Photoshop record)
-    delete $$exifTool{ADD_DIRS}{XMP};
-    my $result = $exifTool->WriteJPEG(\%dirInfo);
+    delete $$et{ADD_DIRS}{XMP};
+    my $result = $et->WriteJPEG(\%dirInfo);
     # restore variables we changed
-    $$exifTool{BASE} = 0;
-    $$exifTool{FILE_TYPE} = 'TIFF';
-    $$exifTool{TIFF_TYPE} = $fileType;
-    $$exifTool{EDIT_DIRS} = $editDirs;
-    $$exifTool{ADD_DIRS} = $addDirs;
+    $$et{BASE} = 0;
+    $$et{FILE_TYPE} = 'TIFF';
+    $$et{TIFF_TYPE} = $fileType;
+    $$et{EDIT_DIRS} = $editDirs;
+    $$et{ADD_DIRS} = $addDirs;
     SetByteOrder($byteOrder);
     return $result > 0 ? $outbuff : $$dataPt;
 }
@@ -453,43 +489,43 @@ sub WriteJpgFromRaw($$$)
 # Returns: 1 on success, 0 if this wasn't a valid JpgFromRaw image
 sub ProcessJpgFromRaw($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $byteOrder = GetByteOrder();
-    my $fileType = $$exifTool{FILE_TYPE};   # RAW, RW2 or RWL
+    my $fileType = $$et{FILE_TYPE};   # RAW, RW2 or RWL
     my $tagInfo = $$dirInfo{TagInfo};
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     my ($indent, $out);
-    $tagInfo or $exifTool->Warn('No tag info for Panasonic JpgFromRaw'), return 0;
+    $tagInfo or $et->Warn('No tag info for Panasonic JpgFromRaw'), return 0;
     my $dirStart = $$dirInfo{DirStart};
     if ($dirStart) { # DirStart is non-zero in DNG-converted RW2/RWL
         my $dirLen = $$dirInfo{DirLen} | length($$dataPt) - $dirStart;
         my $buff = substr($$dataPt, $dirStart, $dirLen);
         $dataPt = \$buff;
     }
-    $$exifTool{BASE} = $$dirInfo{DataPos} + ($dirStart || 0);
-    $$exifTool{FILE_TYPE} = $$exifTool{TIFF_TYPE} = 'JPEG';
-    $$exifTool{DOC_NUM} = 1;
+    $$et{BASE} = $$dirInfo{DataPos} + ($dirStart || 0);
+    $$et{FILE_TYPE} = $$et{TIFF_TYPE} = 'JPEG';
+    $$et{DOC_NUM} = 1;
     # extract information from embedded JPEG
     my %dirInfo = (
         Parent => 'RAF',
         RAF    => new File::RandomAccess($dataPt),
     );
     if ($verbose) {
-        my $indent = $$exifTool{INDENT};
-        $$exifTool{INDENT} = '  ';
-        $out = $exifTool->Options('TextOut');
+        my $indent = $$et{INDENT};
+        $$et{INDENT} = '  ';
+        $out = $et->Options('TextOut');
         print $out '--- DOC1:JpgFromRaw ',('-'x56),"\n";
     }
-    my $rtnVal = $exifTool->ProcessJPEG(\%dirInfo);
+    my $rtnVal = $et->ProcessJPEG(\%dirInfo);
     # restore necessary variables for continued RW2/RWL processing
-    $$exifTool{BASE} = 0;
-    $$exifTool{FILE_TYPE} = 'TIFF';
-    $$exifTool{TIFF_TYPE} = $fileType;
-    delete $$exifTool{DOC_NUM};
+    $$et{BASE} = 0;
+    $$et{FILE_TYPE} = 'TIFF';
+    $$et{TIFF_TYPE} = $fileType;
+    delete $$et{DOC_NUM};
     SetByteOrder($byteOrder);
     if ($verbose) {
-        $$exifTool{INDENT} = $indent;
+        $$et{INDENT} = $indent;
         print $out ('-'x76),"\n";
     }
     return $rtnVal;
@@ -514,7 +550,7 @@ write meta information in Panasonic/Leica RAW, RW2 and RWL images.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -30,7 +30,7 @@
 #              15) Barney Garrett private communication (Samsung GX-1S)
 #              16) Axel Kellner private communication (K10D)
 #              17) Cvetan Ivanov private communication (K100D)
-#              18) http://www.gvsoft.homedns.org/exif/makernote-pentax-type3.html
+#              18) http://gvsoft.homedns.org/exif/makernote-pentax-type3.html
 #              19) Dave Nicholson private communication (K10D)
 #              20) Bogdan and yeryry (http://www.cpanforum.com/posts/8037)
 #              21) Peter (*istD, http://www.cpanforum.com/posts/8078)
@@ -41,6 +41,8 @@
 #              26) http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,3444.0.html
 #              27) http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,3833.0.html
 #              28) Klaus Homeister http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,4803.0.html
+#              29) Louis Granboulan private communication (K-5II)
+#              30) http://u88.n24.queensu.ca/exiftool/forum/index.php?topic=5433
 #              JD) Jens Duttke private communication
 #
 # Notes:        See POD documentation at the bottom of this file
@@ -53,7 +55,7 @@ use vars qw($VERSION %pentaxLensTypes);
 use Image::ExifTool::Exif;
 use Image::ExifTool::HP;
 
-$VERSION = '2.59';
+$VERSION = '2.73';
 
 sub CryptShutterCount($$);
 sub PrintFilter($$$);
@@ -88,6 +90,8 @@ sub PrintFilter($$$);
     # (and 'Sigma 105mm F2.8 EX DG Macro', ref 24)
     # (and 'Sigma 18-50mm F2.8 EX Macro')
     # (and 'Sigma 180mm F4.5 EX DG Macro')
+    # (and 'Sigma 70mm F2.8 EX DG Macro')
+    # (and 'Sigma 50-500mm F4-6.3 DG APO')
     '3 17' => 'smc PENTAX-FA SOFT 85mm F2.8',
     '3 18' => 'smc PENTAX-F 1.7X AF ADAPTER',
     '3 19' => 'smc PENTAX-F 24-50mm F4',
@@ -101,9 +105,8 @@ sub PrintFilter($$$);
     '3 25' => 'smc PENTAX-F 35-105mm F4-5.6 or Sigma or Tokina Lens',
     '3 25.1' => 'Sigma AF 28-300mm F3.5-5.6 DL IF', #11
     '3 25.2' => 'Sigma 55-200mm F4-5.6 DC', #JD
-    '3 25.3' => 'Sigma AF 28-300mm F3.5-5.6 DL IF', #JD
-    '3 25.4' => 'Sigma AF 28-300mm F3.5-6.3 DG IF Macro', #JD
-    '3 25.5' => 'Tokina 80-200mm F2.8 ATX-Pro', #12
+    '3 25.3' => 'Sigma AF 28-300mm F3.5-6.3 DG IF Macro', #JD
+    '3 25.4' => 'Tokina 80-200mm F2.8 ATX-Pro', #12
     '3 26' => 'smc PENTAX-F* 250-600mm F5.6 ED[IF]',
     '3 27' => 'smc PENTAX-F 28-80mm F3.5-4.5 or Tokina Lens',
     '3 27.1' => 'Tokina AT-X Pro AF 28-70mm F2.6-2.8', #JD
@@ -129,13 +132,14 @@ sub PrintFilter($$$);
     '3 41.1' => 'Sigma 50mm F2.8 Macro', #16
     '3 44' => 'Sigma or Tamron Lens (3 44)',
     '3 44.1' => 'Sigma AF 10-20mm F4-5.6 EX DC', #JD
-    '3 44.2' => 'Sigma 12-24mm F4.5 EX DG', #12
+    '3 44.2' => 'Sigma 12-24mm F4.5-5.6 EX DG', #12 (added "-5.6", ref 29)
     '3 44.3' => 'Sigma 17-70mm F2.8-4.5 DC Macro', #(Bart Hickman)
     '3 44.4' => 'Sigma 18-50mm F3.5-5.6 DC', #4
     '3 44.5' => 'Tamron 35-90mm F4 AF', #12
-    '3 46' => 'Sigma Lens (3 46)',
+    '3 46' => 'Sigma or Samsung Lens (3 46)',
     '3 46.1' => 'Sigma APO 70-200mm F2.8 EX',
     '3 46.2' => 'Sigma EX APO 100-300mm F4 IF', #JD
+    '3 46.3' => 'Samsung/Schneider D-XENON 50-200mm F4-5.6 ED', #29
     '3 50' => 'smc PENTAX-FA 28-70mm F4 AL',
     '3 51' => 'Sigma 28mm F1.8 EX DG Aspherical Macro',
     '3 52' => 'smc PENTAX-FA 28-200mm F3.8-5.6 AL[IF] or Tamron Lens',
@@ -179,7 +183,8 @@ sub PrintFilter($$$);
     '4 29' => 'Tamron AF 28-200mm F3.8-5.6 LD Super II Macro (371D)', #JD
     '4 34' => 'smc PENTAX-FA 24-90mm F3.5-4.5 AL[IF]',
     '4 35' => 'smc PENTAX-FA 100-300mm F4.7-5.8',
-    '4 36' => 'Tamron AF70-300mm F4-5.6 LD Macro', # both 572D and A17 (Di) - ref JD
+  # '4 36' => 'Tamron AF70-300mm F4-5.6 LD Macro', # both 572D and A17 (Di) - ref JD
+    '4 36' => 'Tamron AF 70-300mm F4-5.6 LD Macro 1:2', #25
     '4 37' => 'Tamron SP AF 24-135mm F3.5-5.6 AD AL (190D)', #13
     '4 38' => 'smc PENTAX-FA 28-105mm F3.2-4.5 AL[IF]',
     '4 39' => 'smc PENTAX-FA 31mm F1.8 AL Limited',
@@ -191,22 +196,24 @@ sub PrintFilter($$$);
     '4 45.2' => 'Tamron AF 28-300mm F3.5-6.3 XR Di LD Aspherical [IF] Macro', #JD
     '4 46' => 'smc PENTAX-FA J 28-80mm F3.5-5.6 AL',
     '4 47' => 'smc PENTAX-FA J 18-35mm F4-5.6 AL',
-    '4 49' => 'Tamron SP AF 28-75mm F2.8 XR Di (A09)',
+   #'4 49' => 'Tamron SP AF 28-75mm F2.8 XR Di (A09)',
+    '4 49' => 'Tamron SP AF 28-75mm F2.8 XR Di LD Aspherical [IF] Macro', #25
     '4 51' => 'smc PENTAX-D FA 50mm F2.8 Macro',
     '4 52' => 'smc PENTAX-D FA 100mm F2.8 Macro',
-    '4 56' => 'Samsung D-XENON 100mm F2.8 Macro', #Alan Robinson
+    '4 55' => 'Samsung/Schneider D-XENOGON 35mm F2', #29
+    '4 56' => 'Samsung/Schneider D-XENON 100mm F2.8 Macro', #Alan Robinson
     '4 75' => 'Tamron SP AF 70-200mm F2.8 Di LD [IF] Macro (A001)', #JD
     '4 214' => 'smc PENTAX-DA 35mm F2.4 AL', #PH
     '4 229' => 'smc PENTAX-DA 18-55mm F3.5-5.6 AL II', #JD
     '4 230' => 'Tamron SP AF 17-50mm F2.8 XR Di II', #20
     '4 231' => 'smc PENTAX-DA 18-250mm F3.5-6.3 ED AL [IF]', #21
     '4 237' => 'Samsung/Schneider D-XENOGON 10-17mm F3.5-4.5', #JD
-    '4 239' => 'Samsung D-XENON 12-24mm F4 ED AL [IF]', #23
+    '4 239' => 'Samsung/Schneider D-XENON 12-24mm F4 ED AL [IF]', #23
     '4 242' => 'smc PENTAX-DA* 16-50mm F2.8 ED AL [IF] SDM (SDM unused)', #Pietu Pohjalainen
     '4 243' => 'smc PENTAX-DA 70mm F2.4 Limited', #JD
     '4 244' => 'smc PENTAX-DA 21mm F3.2 AL Limited', #9
-    '4 245' => 'Schneider D-XENON 50-200mm F4-5.6', #15
-    '4 246' => 'Schneider D-XENON 18-55mm F3.5-5.6', #15
+    '4 245' => 'Samsung/Schneider D-XENON 50-200mm F4-5.6', #15
+    '4 246' => 'Samsung/Schneider D-XENON 18-55mm F3.5-5.6', #15
     '4 247' => 'smc PENTAX-DA FISH-EYE 10-17mm F3.5-4.5 ED[IF]', #10
     '4 248' => 'smc PENTAX-DA 12-24mm F4 ED AL [IF]', #10
     '4 249' => 'Tamron XR DiII 18-200mm F3.5-6.3 (A14)',
@@ -247,6 +254,13 @@ sub PrintFilter($$$);
     '7 0' => 'smc PENTAX-DA 21mm F3.2 AL Limited', #13
     '7 58' => 'smc PENTAX-D FA Macro 100mm F2.8 WR', #PH - this bit of information cost me $600 ;)
     '7 75' => 'Tamron SP AF 70-200mm F2.8 Di LD [IF] Macro (A001)', #(Anton Bondar)
+    '7 202' => 'smc PENTAX-DA L 18-55mm F3.5-5.6 AL WR', #29
+    '7 203' => 'HD PENTAX-DA 55-300mm F4-5.8 ED WR', #29
+    '7 204' => 'HD PENTAX-DA 15mm F4 ED AL Limited', #forum5318
+    '7 205' => 'HD PENTAX-DA 35mm F2.8 Macro Limited', #29
+    '7 206' => 'HD PENTAX-DA 70mm F2.4 Limited', #29
+    '7 207' => 'HD PENTAX-DA 21mm F3.2 ED AL Limited', #forum5327
+    '7 208' => 'HD PENTAX-DA 40mm F2.8 Limited', #PH
     '7 212' => 'smc PENTAX-DA 50mm F1.8', #PH
     '7 213' => 'smc PENTAX-DA 40mm F2.8 XS', #PH
     '7 214' => 'smc PENTAX-DA 35mm F2.4 AL', #PH
@@ -256,11 +270,12 @@ sub PrintFilter($$$);
     '7 220' => 'Tamron SP AF 10-24mm F3.5-4.5 Di II LD Aspherical [IF]', #24
     '7 221' => 'smc PENTAX-DA L 50-200mm F4-5.6 ED', #Ar't
     '7 222' => 'smc PENTAX-DA L 18-55mm F3.5-5.6', #PH (tag 0x003f -- was '7 229' in LensInfo of one test image)
-    '7 223' => 'Samsung D-XENON 18-55mm F3.5-5.6 II', #PH
+    '7 223' => 'Samsung/Schneider D-XENON 18-55mm F3.5-5.6 II', #PH
     '7 224' => 'smc PENTAX-DA 15mm F4 ED AL Limited', #JD
-    '7 225' => 'Samsung D-XENON 18-250mm F3.5-6.3', #8/PH
+    '7 225' => 'Samsung/Schneider D-XENON 18-250mm F3.5-6.3', #8/PH
     '7 226' => 'smc PENTAX-DA* 55mm F1.4 SDM (SDM unused)', #PH (NC)
     '7 227' => 'smc PENTAX-DA* 60-250mm F4 [IF] SDM (SDM unused)', #PH (NC)
+    '7 228' => 'Samsung 16-45mm F4 ED', #29
     '7 229' => 'smc PENTAX-DA 18-55mm F3.5-5.6 AL II', #JD
     '7 230' => 'Tamron AF 17-50mm F2.8 XR Di-II LD (Model A16)', #JD
     '7 231' => 'smc PENTAX-DA 18-250mm F3.5-6.3 ED AL [IF]', #JD
@@ -273,6 +288,7 @@ sub PrintFilter($$$);
     '7 242' => 'smc PENTAX-DA* 16-50mm F2.8 ED AL [IF] SDM (SDM unused)', #19
     '7 243' => 'smc PENTAX-DA 70mm F2.4 Limited', #PH
     '7 244' => 'smc PENTAX-DA 21mm F3.2 AL Limited', #16
+    '8 3' => 'Sigma AF 18-125mm F3.5-5.6 DC', #29
     '8 4' => 'Sigma 50mm F1.4 EX DG HSM', #Artur private communication
     '8 8' => 'Sigma 18-250mm F3.5-6.3 DC OS HSM', #27
     '8 11' => 'Sigma 10-20mm F3.5 EX DC HSM', #27
@@ -286,8 +302,12 @@ sub PrintFilter($$$);
     '8 21' => 'Sigma 17-50mm F2.8 EX DC OS HSM', #26
     '8 22' => 'Sigma 85mm F1.4 EX DG HSM', #26
     '8 23' => 'Sigma 70-200mm F2.8 APO EX DG OS HSM', #27
+    '8 25' => 'Sigma 17-50mm F2.8 EX DC HSM', #Exiv2
     '8 27' => 'Sigma 18-200mm F3.5-6.3 II DC HSM', #27
     '8 28' => 'Sigma 18-250mm F3.5-6.3 DC Macro HSM', #27
+    '8 29' => 'Sigma 35mm F1.4 DG HSM', #27
+    '8 30' => 'Sigma 17-70mm F2.8-4 DC Macro HSM Contemporary', #27
+    '8 209' => 'HD PENTAX-DA 20-40mm F2.8-4 ED Limited DC WR', #29
     '8 210' => 'smc PENTAX-DA 18-270mm F3.5-6.3 ED SDM', #Helmut Schutz
     '8 211' => 'HD PENTAX-DA 560mm F5.6 ED AW', #PH
     '8 215' => 'smc PENTAX-DA 18-135mm F3.5-5.6 ED AL [IF] DC WR', #PH
@@ -300,10 +320,11 @@ sub PrintFilter($$$);
     '8 242' => 'smc PENTAX-DA* 16-50mm F2.8 ED AL [IF] SDM', #JD
     '8 255' => 'Sigma Lens (8 255)',
     '8 255.1' => 'Sigma 70-200mm F2.8 EX DG Macro HSM II', #JD
-    '8 255.2' => 'Sigma APO 150-500mm F5-6.3 DG OS HSM', #JD
+    '8 255.2' => 'Sigma 150-500mm F5-6.3 DG APO [OS] HSM', #JD (non-OS version has same type, ref 29)
     '8 255.3' => 'Sigma 50-150mm F2.8 II APO EX DC HSM', #http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,2997.0.html
-    '8 255.3' => 'Sigma 4.5mm F2.8 EX DC HSM Circular Fisheye', #PH
-    '8 255.4' => 'Sigma 50-200mm F4-5.6 DC OS', #26
+    '8 255.4' => 'Sigma 4.5mm F2.8 EX DC HSM Circular Fisheye', #PH
+    '8 255.5' => 'Sigma 50-200mm F4-5.6 DC OS', #26
+    '8 255.6' => 'Sigma 24-70mm F2.8 EX DG HSM', #29
 #
 # 645 lenses
 #
@@ -319,6 +340,7 @@ sub PrintFilter($$$);
     '11 9' => 'smc PENTAX-FA 645 200mm F4 [IF]', #PH
     '11 10' => 'smc PENTAX-FA 645 150mm F2.8 [IF]', #PH
     '11 11' => 'smc PENTAX-FA 645 35mm F3.5 AL [IF]', #PH
+    '11 12' => 'smc PENTAX-FA 645 300mm F5.6 ED [IF]', #29
     '11 14' => 'smc PENTAX-FA 645 55-110mm F5.6', #PH
     '11 16' => 'smc PENTAX-FA 645 33-55mm F4.5 AL', #PH
     '11 17' => 'smc PENTAX-FA 645 150-300mm F5.6 ED [IF]', #PH
@@ -327,17 +349,18 @@ sub PrintFilter($$$);
     '13 20' => 'HD PENTAX-D FA 645 90mm F2.8 ED AW SR', #PH
     # missing:
     # 'smc PENTAX-DA 645 25mm F4.0 AL SDM AW [IF]' ? different than D FA version?
-    # 'smc PENTAX-FA 645 300mm F5.6 ED [IF]'
 #
-# Q-mount lenses
+# Q-mount lenses (21=auto focus lens, 22=manual focus)
 #
     '21 0' => 'Pentax Q Manual Lens', #PH
     '21 1' => '01 Standard Prime 8.5mm F1.9', #PH
-    '21 2' => '02 Standard Zoom 5-15mm F2.8-4.5', #PH (NC)
-    '21 3' => '03 Fish-eye 3.2mm F5.6', #PH (NC)
-    '21 4' => '04 Toy Lens Wide 6.3mm F7.1', #PH (NC)
-    '21 5' => '05 Toy Lens Telephoto 18mm F8', #PH (NC)
+    '21 2' => '02 Standard Zoom 5-15mm F2.8-4.5', #PH
+    '22 3' => '03 Fish-eye 3.2mm F5.6', #PH
+    '22 4' => '04 Toy Lens Wide 6.3mm F7.1', #PH
+    '22 5' => '05 Toy Lens Telephoto 18mm F8', #PH
     '21 6' => '06 Telephoto Zoom 15-45mm F2.8', #PH
+    '21 7' => '07 Mount Shield 11.5mm F9', #PH (NC)
+    '21 8' => '08 Wide Zoom 3.8-5.9mm F3.7-4', #PH (NC)
 );
 
 # Pentax model ID codes - PH
@@ -394,10 +417,10 @@ my %pentaxModelID = (
     0x12c32 => 'Optio M20',
     0x12c3c => 'Optio W20',
     0x12c46 => 'Optio A20',
-    0x12c8c => 'Optio M30',
     0x12c78 => 'Optio E30',
     0x12c7d => 'Optio E35',
     0x12c82 => 'Optio T30',
+    0x12c8c => 'Optio M30',
     0x12c91 => 'Optio L30',
     0x12c96 => 'Optio W30',
     0x12ca0 => 'Optio A30',
@@ -440,7 +463,7 @@ my %pentaxModelID = (
     0x12e58 => 'X90',
     0x12e6c => 'K-r',
     0x12e76 => 'K-5',
-    0x12e8a => 'Optio RS1000 / RS1500',
+    0x12e8a => 'Optio RS1000/RS1500',
     0x12e94 => 'Optio RZ10',
     0x12e9e => 'Optio LS1000',
     0x12ebc => 'Optio WG-1 GPS',
@@ -456,7 +479,14 @@ my %pentaxModelID = (
     0x12f66 => 'Q10',
     0x12f70 => 'K-5 II',
     0x12f71 => 'K-5 II s', #http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,4515.0.html
+    0x12f7a => 'Q7',
     0x12f84 => 'MX-1',
+    0x12f8e => 'WG-3 GPS',
+    0x12f98 => 'WG-3',
+    0x12fa2 => 'WG-10',
+    0x12fb6 => 'K-50',
+    0x12fc0 => 'K-3', #29
+    0x12fca => 'K-500',
 );
 
 # Pentax city codes - (PH, Optio WP)
@@ -572,6 +602,7 @@ my %digitalFilter = (
         19 => 'Sketch Filter',
         20 => 'Shading', # (Q)
         21 => 'Invert Color', # (Q)
+        23 => 'Tone Expansion', #Forum5247
         254 => 'Custom Filter',
     },
 );
@@ -612,6 +643,7 @@ my %filterSettings = (
     31 => ['Intensity', '%d'],      # Water Color (1-3)
     32 => ['Saturation2',   { 0=>'Off',1=>'Low',2=>'Medium',3=>'High' }], # Water Color
     33 => ['HDR',           { 1=>'Weak',2=>'Medium',3=>'Strong' }], # HDR
+    # (34 missing)
     35 => ['FocusPlane', '%+d'],    # Miniature (-3-+3)
     36 => ['FocusWidth',    { 1=>'Narrow',2=>'Middle',3=>'Wide' }], # Miniature
     37 => ['PlaneAngle',    { 0=>'Horizontal',1=>'Vertical',2=>'Positive slope',3=>'Negative slope' }], # Miniature
@@ -620,6 +652,7 @@ my %filterSettings = (
     40 => ['Posterization', '%d'],  # Posterization (1-5)
     41 => ['Contrast2',     { 1=>'Low',2=>'Medium',3=>'High'}], # Sketch Filter
     42 => ['ScratchEffect', { 0=>'Off',1=>'On' }], # Sketch Filter
+    45 => ['ToneExpansion', { 1=>'Low',2=>'Medium',3=>'High' }], # Tone Expansion (ref Forum5247)
 );
 
 # decoding for Pentax Firmware ID tags - PH
@@ -724,6 +757,40 @@ my %binaryDataAttrs = (
         Count => 4,
         PrintConv => '$val=~tr/ /./; $val',
         PrintConvInv => '$val=~tr/./ /; $val',
+        # 0.1.0.3 - PENTAX Optio E40
+        # 3.0.0.0 - K10D
+        # 3.1.0.0 - Optio A40/S10/L36/L40/M40/V10
+        # 3.1.2.0 - Optio Z10
+        # 4.0.2.0 - Optio E50
+        # 4.1.0.0 - Optio S12
+        # 4.1.1.0 - Optio M50
+        # 4.1.2.0 - K20D, K200D
+        # 4.2.0.0 - Optio L50/V20
+        # 4.2.1.0 - Optio E60/M90
+        # 4.2.2.0 - Optio W60
+        # 4.2.3.0 - Optio M60
+        # 4.4.0.1 - K-m, K2000
+        # 4.5.0.0 - Optio E70/L70
+        # 4.5.0.0 - Optio P70
+        # 4.6.0.0 - Optio E80/E90/W80
+        # 5.0.0.0 - K-7, Optio P80/WS80
+        # 5.1.0.0 - K-x
+        # 5.2.0.0 - Optio I-10
+        # 5.3.0.0 - Optio H90
+        # 5.3.2.0 - Optio W90
+        # 6.0.0.0 - K-r, 645D
+        # 6.1.3.0 - Optio LS1000/RS1000/RS1500/RZ10
+        # 7.0.0.0 - K-5
+        # 7.1.0.0 - Optio WG-1GPS/WG-10
+        # 7.2.0.0 - Optio S1
+        # 8.0.0.0 - Q
+        # 8.0.1.0 - Optio RZ18
+        # 8.0.4.0 - Optio VS20
+        # 8.1.0.0 - Optio LS465/WG-2GPS
+        # 9.0.0.0 - K-01
+        # 9.1.2.0 - X-5
+        # 10.0.0.0 - K-30, K-50, K-500, K-5 II
+        # 11.0.0.0 - K-3
     },
     0x0001 => { #PH
         Name => 'PentaxModelType',
@@ -857,7 +924,7 @@ my %binaryDataAttrs = (
             1 or 2 values.  Decimal values differentiate Optio 555 modes which are
             different from other models
         },
-        ValueConv => '($val < 4 and $$self{Model} =~ /Optio 555\b/) ? $val + 0.1 : $val',
+        ValueConv => '(IsInt($val) and $val < 4 and $$self{Model} =~ /Optio 555\b/) ? $val + 0.1 : $val',
         ValueConvInv => 'int $val',
         PrintConvColumns => 2,
         PrintConv => [{
@@ -970,15 +1037,18 @@ my %binaryDataAttrs = (
                 3 => 'Manual',
                 4 => 'Super Macro', #JD
                 5 => 'Pan Focus',
-                16 => 'AF-S', #17
-                17 => 'AF-C', #17
-                18 => 'AF-A', #PH (educated guess)
-                32 => 'Contrast-detect', #PH (K-5)
-                33 => 'Tracking Contrast-detect', #PH (K-5)
-                288 => 'Face Detect', #PH (Q)
+                16 => 'AF-S (Focus-priority)', #17
+                17 => 'AF-C (Focus-priority)', #17
+                18 => 'AF-A (Focus-priority)', #PH (educated guess)
+                32 => 'Contrast-detect (Focus-priority)', #PH (K-5)
+                33 => 'Tracking Contrast-detect (Focus-priority)', #PH (K-5)
+                # bit 8 indicates release priority
+                272 => 'AF-S (Release-priority)', #PH (K-5,K-3)
+                273 => 'AF-C (Release-priority)', #PH (K-5,K-3)
+                274 => 'AF-A (Release-priority)', #PH (K-3)
+                288 => 'Contrast-detect (Release-priority)', #PH (K-01)
             },
-        },
-        {
+        },{
             Name => 'FocusMode',
             Writable => 'int16u',
             Notes => 'Asahi models',
@@ -990,8 +1060,9 @@ my %binaryDataAttrs = (
             },
         },
     ],
-    0x000e => { #7
+    0x000e => [{ #7
         Name => 'AFPointSelected',
+        Condition => '$$self{Model} !~ /K-3\b/',
         Writable => 'int16u',
         PrintConvColumns => 2,
         PrintConv => [{
@@ -1017,9 +1088,56 @@ my %binaryDataAttrs = (
         # (second number exists for K-5II(s) is usually 0, but is 1 for AF.C with
         # AFPointMode=='Select' and extended tracking focus points are enabled in the settings)
         ],
-    },
-    0x000f => { #PH
+    },{
+        Name => 'AFPointSelected',
+        Writable => 'int16u',
+        PrintConvColumns => 2,
+        PrintConv => [{
+            # 0 - Contrast-detect AF? - PH (K-5)
+            0xffff => 'Auto',
+            0xfffe => 'Fixed Center',
+            0xfffd => 'Automatic Tracking AF', #JD
+            0xfffc => 'Face Detect AF', #JD
+            0xfffb => 'AF Select', #PH (Q select from 25-areas)
+            # AF pattern: (ref http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,5422.0.html)
+            #    01 02 03 04 05
+            #    06 07 08 09 10
+            # 11 12 13 14 15 16 17
+            #    18 19 20 21 22
+            #    23 24 25 26 27
+            0 => 'None',
+            1 => 'Top-left',
+            2 => 'Top Near-left',
+            3 => 'Top',
+            4 => 'Top Near-right',
+            5 => 'Top-right',
+            6 => 'Upper-left',
+            7 => 'Upper Near-left',
+            8 => 'Upper-midle',
+            9 => 'Upper Near-right',
+            10 => 'Upper-right',
+            11 => 'Far Left',
+            12 => 'Left',
+            13 => 'Near-left',
+            14 => 'Center',
+            15 => 'Near-right',
+            16 => 'Right',
+            17 => 'Far Right',
+            18 => 'Lower-left',
+            19 => 'Lower Near-left',
+            20 => 'Lower-middle',
+            21 => 'Lower Near-right',
+            22 => 'Lower-right',
+            23 => 'Bottom-left',
+            24 => 'Bottom Near-left',
+            25 => 'Bottom',
+            26 => 'Bottom Near-right',
+            27 => 'Bottom-right',
+        }],
+    }],
+    0x000f => [{ #PH
         Name => 'AFPointsInFocus',
+        Condition => '$$self{Model} !~ /K-3\b/',
         Writable => 'int16u',
         PrintHex => 1,
         PrintConv => {
@@ -1035,7 +1153,40 @@ my %binaryDataAttrs = (
             8 => 'Bottom-center',
             9 => 'Bottom-right',
         },
-    },
+    },{ #PH
+        Name => 'AFPointsInFocus',
+        Writable => 'int32u',
+        PrintHex => 1,
+        PrintConv => { BITMASK => {
+            0 => 'Top-left',
+            1 => 'Top Near-left',
+            2 => 'Top',
+            3 => 'Top Near-right',
+            4 => 'Top-right',
+            5 => 'Upper-left',
+            6 => 'Upper Near-left',
+            7 => 'Upper-midle',
+            8 => 'Upper Near-right',
+            9 => 'Upper-right',
+            10 => 'Far Left',
+            11 => 'Left',
+            12 => 'Near-left',
+            13 => 'Center',
+            14 => 'Near-right',
+            15 => 'Right',
+            16 => 'Far Right',
+            17 => 'Lower-left',
+            18 => 'Lower Near-left',
+            19 => 'Lower-middle',
+            20 => 'Lower Near-right',
+            21 => 'Lower-right',
+            22 => 'Bottom-left',
+            23 => 'Bottom Near-left',
+            24 => 'Bottom',
+            25 => 'Bottom Near-right',
+            26 => 'Bottom-right',
+        }},
+    }],
     0x0010 => { #PH
         Name => 'FocusPosition',
         Writable => 'int16u',
@@ -1129,7 +1280,7 @@ my %binaryDataAttrs = (
             276 => 25600, #PH
             277 => 36000, #PH
             278 => 51200, #PH
-            # 65534 Auto? (Q/Q10 MOV) PH
+            # 65534 Auto? (Q/Q10/Q7 MOV) PH
             # 65535 Auto? (K-01 MP4) PH
         },
     },
@@ -1222,6 +1373,8 @@ my %binaryDataAttrs = (
             8 => 'White Fluorescent', #13
             9 => 'Flash', #13
             10 => 'Cloudy', #13
+            11 => 'Warm White Fluorescent', #PH (K-3)
+            14 => 'Multi Auto', #PH (K-3)
             15 => 'Color Temperature Enhancement', #PH
             17 => 'Kelvin', #PH
             0xfffe => 'Unknown', #13
@@ -1527,6 +1680,7 @@ my %binaryDataAttrs = (
             1 => 'Continuous', # (K-5 Hi)
             2 => 'Continuous (Lo)', #PH (K-5)
             3 => 'Burst', #PH (K20D)
+            4 => 'Continuous (Medium)', #PH (K-3)
             255 => 'Video', #PH (K-x)
         },{
             0 => 'No Timer',
@@ -1654,14 +1808,23 @@ my %binaryDataAttrs = (
         Writable => 'int16u',
         PrintConv => { 0 => 'Off', 1 => 'On' },
     },
-    0x004d => { #PH
+    0x004d => [{ #PH
         Name => 'FlashExposureComp',
+        Condition => '$count == 1',
         Writable => 'int32s',
         ValueConv => '$val / 256',
         ValueConvInv => 'int($val * 256 + ($val > 0 ? 0.5 : -0.5))',
         PrintConv => '$val ? sprintf("%+.1f", $val) : 0',
         PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
-    },
+    },{ #PH (K-3)
+        Name => 'FlashExposureComp',
+        Writable => 'int8s',
+        Count => 2,     # (don't know what the 2nd number is for)
+        ValueConv => [ '$val / 6' ],
+        ValueConvInv => [ '$val / 6' ],
+        PrintConv => [ '$val ? sprintf("%+.1f", $val) : 0' ],
+        PrintConvInv => [ 'Image::ExifTool::Exif::ConvertFraction($val)' ],
+    }],
     0x004f => { #PH
         Name => 'ImageTone', # (Called CustomImageMode in K20D manual)
         Writable => 'int16u',
@@ -1699,11 +1862,16 @@ my %binaryDataAttrs = (
     0x0058 => { Name => 'ColorTempFluorescentN', %colorTemp }, #28
     0x0059 => { Name => 'ColorTempFluorescentW', %colorTemp }, #28
     0x005a => { Name => 'ColorTempFlash',        %colorTemp }, #28
-    0x005c => { #PH
+    0x005c => [{ #PH
         Name => 'ShakeReductionInfo',
+        Condition => '$count == 4', # (2 bytes for the K-3)
         Format => 'undef', # (written as int8u) - do this just to save time converting the value
         SubDirectory => { TagTable => 'Image::ExifTool::Pentax::SRInfo' },
-    },
+    },{
+        Name => 'ShakeReductionInfo',
+        Format => 'undef', # (written as int8u) - do this just to save time converting the value
+        SubDirectory => { TagTable => 'Image::ExifTool::Pentax::SRInfo2' },
+    }],
     0x005d => { #JD/PH
         # (used by all Pentax DSLR's except *istD and *istDS until firmware 2.0 - PH)
         # Observed values for the first shot of a new K10D are:  81 [PH], 181 [19],
@@ -1735,7 +1903,7 @@ my %binaryDataAttrs = (
     },
     0x0062 => { # (http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,4803.0.html)
         Name => 'RawDevelopmentProcess',
-        Condition => '$$self{Make} =~ /^PENTAX/', # rules out Kodak, which also use this tag
+        Condition => '$$self{Make} =~ /^(PENTAX|RICOH)/', # rules out Kodak, which also use this tag
         Writable => 'int16u',
         PrintConv => {
             1 => '1 (K10D,K200D,K2000,K-m)',
@@ -1749,6 +1917,7 @@ my %binaryDataAttrs = (
             10 => '10 (K-01,K-30)',
             11 => '11 (Q10)',
             12 => '12 (MX-1)',
+            13 => '13 (K-3)',
         },
     },
     0x0067 => { #PH (K-5)
@@ -1790,6 +1959,8 @@ my %binaryDataAttrs = (
             '1 0 0 0' => 'On',
             '1 1 0 0' => 'On (enabled)', # (K-01)
             '1 2 0 0' => 'On (auto)', # (K-01)
+            '0 2' => 'Off 2 (auto)', # (NC, WG-3)
+            '1 2' => 'On 2 (auto)', # (NC, WG-3)
         },
     },
     0x006b => { #PH (K-5)
@@ -1937,6 +2108,7 @@ my %binaryDataAttrs = (
         # the Optio S12 writes this but not the FacesDetected tag, so get FacesDetected from here
         DataMember => 'FacesDetected',
         RawConv => '$val =~ / (\d+)/ and $$self{FacesDetected} = $1; $val',
+        # (the K-3 reports "On" even in phase-detect focus modes)
         PrintConv => [
             '$val ? "On ($val faces max)" : "Off"',
             '"$val faces detected"',
@@ -1963,6 +2135,7 @@ my %binaryDataAttrs = (
             # (1 value for K-m/K2000, 2 for 645D)
             0 => 'Off',
             1 => 'On',
+            2 => 'Auto 2', # (NC, WG-3)
             '0 0' => 'Off',
             '1 1' => 'Weak',
             '1 2' => 'Normal',
@@ -2046,7 +2219,31 @@ my %binaryDataAttrs = (
     },
     # 0x0083 - int8u: 0 (Q DNG)
     # 0x0084 - int8u: 0 (Q)
-    # 0x0085 - int8u[4]: '0 0 0 0', '1 1 0 0'[HDR] (Q)
+    0x0085 => { #PH
+        Name => 'HDR',
+        Format => 'int8u',
+        Count => 4,
+        PrintConv => [{ # (K-01,K-3)
+            0 => 'Off',
+            1 => 'HDR Auto',
+            2 => 'HDR 1',
+            3 => 'HDR 2',
+            4 => 'HDR 3',
+        },{ # (K-01)
+            0 => 'Auto-align Off',
+            1 => 'Auto-align On',
+        },{
+            # not sure about this - PH
+            # - you can set HDR "Exposure Bracket Value" with the K-3
+            # - guessed from imaging-resource K-3 samples K3OUTBHDR_A{1,2,3}
+            0 => 'n/a',
+            4 => '1 EV',
+            8 => '2 EV',
+            12 => '3 EV', # (get this from K-01, but can't set EV)
+        },
+        # (4th number is always 0)
+        ],
+    },
     # 0x0086 - int8u: 0, 111[Sport,Pet] (Q) - related to Tracking FocusMode?
     # 0x0087 - int8u: 0 (Q)
     0x0088 => { #PH
@@ -2112,7 +2309,7 @@ my %binaryDataAttrs = (
         Name => 'AEInfo',
         # size: *istD/*istDs/K100D/K110D=14, K10D/K200D/K20D=16, K-m/K2000=20,
         #        K-7/K-x=24, K-5/K-r/645D=25
-        Condition => '$count <= 25 and $count != 21',
+        Condition => '$count <= 25 and $count != 21 and $$self{AEInfoSize} = $count',
         SubDirectory => { TagTable => 'Image::ExifTool::Pentax::AEInfo' },
     },{
         Name => 'AEInfo2',
@@ -2143,19 +2340,19 @@ my %binaryDataAttrs = (
             SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensInfo' },
         },{
             Name => 'LensInfo',
-            Condition => '$count != 90 and $count != 91 and $count != 80',
+            Condition => '$count != 90 and $count != 91 and $count != 80 and $count != 128',
             SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensInfo2' },
         },{
-            Name => 'LensInfo',
+            Name => 'LensInfo', # 645D
             Condition => '$count == 90',
             SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensInfo3' },
         },{
-            Name => 'LensInfo',
+            Name => 'LensInfo', # K-r, K-5, K-5II
             Condition => '$count == 91',
             SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensInfo4' },
         },{
-            Name => 'LensInfo',
-            Condition => '$count == 80',
+            Name => 'LensInfo', # K-01, K-30, K-50, K-500, K-3
+            Condition => '$count == 80 or $count == 128',
             SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensInfo5' },
         }
     ],
@@ -2172,6 +2369,7 @@ my %binaryDataAttrs = (
     ],
     0x0209 => { #PH
         Name => 'AEMeteringSegments',
+        Condition => '$count <= 77', # (doesn't work for K-3)
         Format => 'int8u',
         Count => -1,
         Notes => q{
@@ -2179,8 +2377,8 @@ my %binaryDataAttrs = (
             K10D, and 77 metering segments for models such as the K-5, converted to LV
         },
         %convertMeteringSegments,
-        #    16 metering segment             77 metering segment
-        #    locations (ref JD)              locations (ref PH, K-5)
+        #  16 metering segment              77 metering segment
+        #  locations (ref JD, K10D)         locations (ref PH, K-5)
         # +-------------------------+
         # |           14            | +----------------------------------+
         # |    +---+---+---+---+    | |  0  1  2  3  4  5  6  7  8  9 10 |
@@ -2195,12 +2393,14 @@ my %binaryDataAttrs = (
     },
     0x020a => { #PH/JD/19
         Name => 'FlashMeteringSegments',
+        Condition => '$count <= 77', # (likely doesn't work for K-3)
         Format => 'int8u',
         Count => -1,
         %convertMeteringSegments,
     },
     0x020b => { #PH/JD/19
         Name => 'SlaveFlashMeteringSegments',
+        Condition => '$count <= 77', # (likely doesn't work for K-3)
         Format => 'int8u',
         Count => -1,
         Notes => 'used in wireless control mode',
@@ -2396,9 +2596,9 @@ my %binaryDataAttrs = (
     },
     0x03ff => [ #PH
         {
-            Name => 'TempInfoK5',
-            Condition => '$$self{Model} =~ /K-5\b/',
-            SubDirectory => { TagTable => 'Image::ExifTool::Pentax::TempInfoK5' },
+            Name => 'TempInfo',
+            Condition => '$$self{Model} =~ /K-(01|3|30|5|50|500)\b/',
+            SubDirectory => { TagTable => 'Image::ExifTool::Pentax::TempInfo' },
         },{
             Name => 'UnknownInfo',
             SubDirectory => { TagTable => 'Image::ExifTool::Pentax::UnknownInfo' },
@@ -2471,9 +2671,10 @@ my %binaryDataAttrs = (
         # (was SR_SWSToSWRTime: SWS=photometering switch, SWR=shutter release switch)
         # (from http://www.patentstorm.us/patents/6597867-description.html)
         # (here, SR could more accurately mean Shutter Release, not Shake Reduction)
+        # (not valid for K-01 - PH)
         Notes => q{
             time from when the shutter button was half pressed to when the shutter was
-            released, including time for focusing
+            released, including time for focusing.  Not valid for some models
         },
         # (constant of 60 determined from times: 2sec=127; 3sec=184,197; 4sec=244,249,243,246 - PH)
         ValueConv => '$val / 60',
@@ -2490,6 +2691,38 @@ my %binaryDataAttrs = (
     },
 );
 
+# shake reduction information for the K-3 (ref PH)
+%Image::ExifTool::Pentax::SRInfo2 = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'Shake reduction information for the K-3.',
+    0 => {
+        Name => 'SRResult',
+        Unknown => 1,
+        PrintConv => { BITMASK => {
+            # Bit 0 - have seen this set in a few Pentax samples - PH
+            # Bit 6 - usually set when SR is Off, and occasionally when On - PH
+            # Bit 7 - set when AA simulation is on - PH
+        }},
+    },
+    1 => {
+        Name => 'ShakeReduction',
+        # (ref http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,5425.0.html)
+        PrintConv => {
+            0 => 'Off', # (NC for K-3)
+            1 => 'On', # (NC for K-3)
+            4 => 'Off (AA simulation off)',
+            5 => 'On but Disabled', # (NC for K-3)
+            6 => 'On (Video)', # (NC for K-3)
+            7 => 'On (AA simulation off)',
+            12 => 'Off (AA simulation type 1)', # (AA linear motion)
+            15 => 'On (AA simulation type 1)', # (AA linear motion)
+            20 => 'Off (AA simulation type 2)', # (AA circular motion)
+            23 => 'On (AA simulation type 2)', # (AA circular motion)
+        },
+    },
+);
+
 # face detection information (ref PH, K-5)
 %Image::ExifTool::Pentax::FaceInfo = (
     %binaryDataAttrs,
@@ -2583,6 +2816,10 @@ my %binaryDataAttrs = (
         Name => 'ChromaticAberrationCorrection',
         PrintConv => { 0 => 'Off', 1 => 'On' },
     },
+    2 => {
+        Name => 'VignettingCorrection',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
 );
 
 # camera settings (ref 19)
@@ -3017,7 +3254,7 @@ my %binaryDataAttrs = (
 %Image::ExifTool::Pentax::AEInfo = (
     %binaryDataAttrs,
     GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
-    DATAMEMBER => [ 8 ],
+    DATAMEMBER => [ 7 ],
     NOTES => 'Auto-exposure information for most Pentax models.',
     # instead of /8, should these be PentaxEv(), as in CameraSettings? - PH
     0 => {
@@ -3106,8 +3343,13 @@ my %binaryDataAttrs = (
     },
     7 => {
         Name => 'AEFlags',
-        Unknown => 1,
         Writable => 0,
+        Hook => '$size > 20 and $varSize += 1',
+        Notes => 'indices after this are incremented by 1 for some models',
+        # (this tag can't be unknown because the Hook must be evaluated
+        #  to shift the following offsets if necessary.  Instead, ignore
+        #  the return value unless Unknown option used)
+        RawConv => '$$self{OPTIONS}{Unknown} ? $val : undef',
         PrintConv => { #19
             # (seems to be the warnings displayed in the viewfinder for several bits)
             BITMASK => {
@@ -3125,18 +3367,18 @@ my %binaryDataAttrs = (
             },
         },
     },
-    8 => {
-        Name => 'AEUnknown',
-        Notes => 'indices after this are incremented by 1 for some models',
-        Format => 'var_int8u[$size > 20 ? 2 : 1]',
-        Writable => 0,
-        # (this tag can't be unknown because the Format must be evaluated
-        #  to shift the following offsets if necessary.  Instead, ignore
-        #  the return value unless Unknown > 1)
-        RawConv => '$$self{OPTIONS}{Unknown} > 1 ? $val : undef',
-    },
     # Note: Offsets below shifted by 1 if record size is > 20 bytes
-    # (implemented by the var_int8u count above)
+    # (implemented by the Hook above)
+    8 => { #30
+        Name => 'AEApertureSteps',
+        Notes => q{
+            number of steps the aperture has been stopped down from wide open.  There
+            are roughly 8 steps per F-stop for most lenses, or 18 steps for 645D lenses,
+            but it varies slightly by lens
+        },
+        PrintConv => '$val == 255 ? "n/a" : $val',
+        PrintConvInv => '$val eq "n/a" ? 255 : $val',
+    },
     9 => { #19
         Name => 'AEMaxAperture',
         Notes => 'val = 2**((raw-68)/16)',
@@ -3171,7 +3413,36 @@ my %binaryDataAttrs = (
             },
         },
     },
-    # 13 - related to program mode somehow - PH
+    13 => { #30
+        Name => 'AEWhiteBalance',
+        Condition => '$$self{AEInfoSize} == 24', # (not thoroughly tested for other sizes)
+        Notes => 'K7 and Kx',
+        Mask => 0xf0,
+        PrintConv => {
+            0x00 => 'Standard',
+            0x10 => 'Daylight',
+            0x20 => 'Shade',
+            0x30 => 'Cloudy',
+            0x40 => 'Daylight Fluorescent',
+            0x50 => 'Day White Fluorescent',
+            0x60 => 'White Fluorescent',
+            0x70 => 'Tungsten',
+        },
+    },
+    13.1 => { #30
+        Name => 'AEMeteringMode2',
+        Condition => '$$self{AEInfoSize} == 24', # (not thoroughly tested for other sizes)
+        Notes => 'K7 and Kx, override for an incompatable metering mode setting',
+        Mask => 0x0f,
+        PrintConv => {
+            0 => 'Multi-segment',
+            BITMASK => {
+                0 => 'Center-weighted average',
+                1 => 'Spot',
+                # 2 - seen for K7 AVI movie
+            },
+        },
+    },
     14 => { #19
         Name => 'FlashExposureCompSet',
         Description => 'Flash Exposure Comp. Setting',
@@ -3186,6 +3457,11 @@ my %binaryDataAttrs = (
         PrintConv => '$val ? sprintf("%+.1f", $val) : 0',
         PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
     },
+    21 => { #30
+        Name => 'LevelIndicator',
+        PrintConv => '$val == 90 ? "n/a" : $val',
+        PrintConvInv => '$val eq "n/a" ? 90 : $val',
+    },
 );
 
 # auto-exposure information for the K-01 (ref PH)
@@ -3241,6 +3517,15 @@ my %binaryDataAttrs = (
         ValueConv => '-($val-64)/8', # (negate to make overexposed positive)
         ValueConvInv => '-$val * 8 + 64',
     },
+    11 => {
+        Name => 'AEApertureSteps',
+        Notes => q{
+            number of steps the aperture has been stopped down from wide open.  There
+            are roughly 8 steps per F-stop, but it varies slightly by lens
+        },
+        PrintConv => '$val == 255 ? "n/a" : $val',
+        PrintConvInv => '$val eq "n/a" ? 255 : $val',
+    },
     15 => {
         Name => 'SceneMode',
         PrintConvColumns => 2,
@@ -3308,7 +3593,7 @@ my %binaryDataAttrs = (
 %Image::ExifTool::Pentax::AEInfo3 = (
     %binaryDataAttrs,
     GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
-    NOTES => 'Auto-exposure information for the K-30',
+    NOTES => 'Auto-exposure information for the K-3, K-30, K-50 and K-500.',
     # instead of /8, should these be PentaxEv(), as in CameraSettings? - PH
     16 => {
         Name => 'AEExposureTime',
@@ -3515,7 +3800,8 @@ my %binaryDataAttrs = (
     },
     12 => {
         Name => 'LensData',
-        Format => 'undef[17]',
+        Format => 'undef[18]',
+        Condition => '$$self{NewLensData} = 1', # not really a condition, just used to set flag
         SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensData' },
     },
 );
@@ -3525,7 +3811,7 @@ my %binaryDataAttrs = (
     %binaryDataAttrs,
     GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
     IS_SUBDIR => [ 15 ],
-    NOTES => 'Pentax lens information structure for the K-01.',
+    NOTES => 'Pentax lens information structure for the K-01 and newer models.',
     1 => {
         Name => 'LensType',
         Format => 'int8u[5]',
@@ -3559,6 +3845,7 @@ my %binaryDataAttrs = (
 %Image::ExifTool::Pentax::LensData = (
     %binaryDataAttrs,
     GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    DATAMEMBER => [ 12.1 ],
     NOTES => q{
         Pentax lens data information.  Some of these tags require interesting binary
         gymnastics to decode them into useful values.
@@ -3567,6 +3854,8 @@ my %binaryDataAttrs = (
     # (see http://kmp.bdimitrov.de/technology/K-mount/Ka.html)
     0.1 => { #JD
         Name => 'AutoAperture',
+        Condition => 'not $$self{NewLensData}',
+        Notes => 'not valid for the K-r, K-5 or K-5II', #29
         Mask => 0x01,
         PrintConv => {
             0 => 'On',
@@ -3575,6 +3864,8 @@ my %binaryDataAttrs = (
     },
     0.2 => { #JD
         Name => 'MinAperture',
+        Condition => 'not $$self{NewLensData}',
+        Notes => 'not valid for the K-r, K-5 or K-5II', #29
         Mask => 0x06,
         PrintConv => {
             0x00 => 22,
@@ -3585,6 +3876,8 @@ my %binaryDataAttrs = (
     },
     0.3 => { #JD
         Name => 'LensFStops',
+        Condition => 'not $$self{NewLensData}',
+        Notes => 'not valid for the K-r, K-5 or K-5II', #29
         Mask => 0x70,
         ValueConv => '5 + (($val >> 4) ^ 0x07) / 2',
         ValueConvInv => '((($val - 5) * 2) ^ 0x07) << 4',
@@ -3674,15 +3967,22 @@ my %binaryDataAttrs = (
         Name => 'LC11',
         %lensCode,
     },
+    12.1 => {
+        Name => 'NewLensDataHook',
+        Hidden => 1,
+        Hook => '$varSize += 1 if $$self{NewLensData}',
+        RawConv => 'undef',
+    },
     13 => { # LC12 = mv1 AVminsif data
         Name => 'LC12',
+        Notes => "ID's 13-16 are offset by 1 for the K-r, K-5 and K-5II", #29
         %lensCode,
     },
     # 14 - related to live view for K-5 (normally 3, but 1 or 5 in LV mode)
     14.1 => { # LC13 = AVmin (open aperture value) [MaxAperture=(2**((AVmin-1)/32))]
         Name => 'MaxAperture',
         Condition => '$$self{Model} ne "K-5"',
-        Notes => 'effective wide open aperture for current focal length.  Not valid for K-5',
+        Notes => 'effective wide open aperture for current focal length',
         Mask => 0x7f, # (not sure what the high bit indicates)
         # (a value of 1 seems to indicate 'n/a')
         RawConv => '$val > 1 ? $val : undef',
@@ -3904,7 +4204,7 @@ my %binaryDataAttrs = (
     1.1 => [
         {
             Name => 'BodyBatteryState',
-            Condition => '$$self{Model} =~ /(\*ist|K100D|K200D|K10D|GX10|K20D|GX20)\b/',
+            Condition => '$$self{Model} =~ /(\*ist|K100D|K200D|K10D|GX10|K20D|GX20|GX-1[LS]?)\b/',
             Notes => '*istD, K100D, K200D, K10D and K20D',
             Mask => 0xf0,
             PrintConv => { #19
@@ -3915,8 +4215,8 @@ my %binaryDataAttrs = (
             },
         },{
             Name => 'BodyBatteryState',
-            Condition => '$$self{Model} =~ /(K-5|K-7|K-r|K-x|645D)\b/',
-            Notes => 'K-5, K-7, K-r, K-x and 645D',
+            Condition => '$$self{Model} !~ /(K110D|K2000|K-m)\b/',
+            Notes => 'other models except the K110D, K2000 and K-m',
             Mask => 0xf0,
             PrintConv => {
                  0x10 => 'Empty or Missing',
@@ -3968,11 +4268,11 @@ my %binaryDataAttrs = (
         {
             Name => 'BodyBatteryADNoLoad',
             Description => 'Body Battery A/D No Load',
-            Condition => '$$self{Model} =~ /(\*ist|K100D|K200D)\b/',
+            Condition => '$$self{Model} =~ /(\*ist|K100D|K200D|GX-1[LS]?)\b/',
         },
         {
             Name => 'BodyBatteryVoltage1', # (static?)
-            Condition => '$$self{Model} =~ /(K-5|K-7|K-r|K-x|645D)\b/',
+            Condition => '$$self{Model} !~ /(K100D|K110D|K2000|K-m|Q\d*)\b/',
             Format => 'int16u',
             ValueConv => '$val / 100',
             ValueConvInv => '$val * 100',
@@ -4007,11 +4307,11 @@ my %binaryDataAttrs = (
         {
             Name => 'GripBatteryADNoLoad',
             Description => 'Grip Battery A/D No Load',
-            Condition => '$$self{Model} =~ /(\*ist|K10D|GX10|K20D|GX20)\b/',
+            Condition => '$$self{Model} =~ /(\*ist|K10D|GX10|K20D|GX20|GX-1[LS]?)\b/',
         },
         {
             Name => 'BodyBatteryVoltage2', # (less than BodyBatteryVoltage1 -- under load?)
-            Condition => '$$self{Model} =~ /(K-5|K-7|K-r|K-x|645D)\b/',
+            Condition => '$$self{Model} !~ /(K100D|K110D|K2000|K-m|Q\d*)\b/',
             Format => 'int16u',
             ValueConv => '$val / 100',
             ValueConvInv => '$val * 100',
@@ -4122,6 +4422,7 @@ my %binaryDataAttrs = (
     # 0x0a - values: 00,05,0d,15,86,8e,a6,ae
     0x0b => { #JD
         Name => 'AFPointsInFocus',
+        Condition => '$$self{Model} !~ /K-3\b/',
         Notes => q{
             may report two points in focus even though a single AFPoint has been
             selected, in which case the selected AFPoint is the first reported
@@ -4153,7 +4454,7 @@ my %binaryDataAttrs = (
     },
 );
 
-# Kevin white balance information (ref 28, topic 4834)
+# Kelvin white balance information (ref 28, topic 4834)
 %Image::ExifTool::Pentax::KelvinWB = (
     %binaryDataAttrs,
     FORMAT => 'int16u',
@@ -4622,7 +4923,10 @@ my %binaryDataAttrs = (
     %binaryDataAttrs,
     GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
     FORMAT => 'int8s',
-    NOTES => 'Tags decoded from the electronic level information.',
+    NOTES => q{
+        Tags decoded from the electronic level information for the K-5.  May not be
+        valid for other models.
+    },
     0 => {
         Name => 'LevelOrientation',
         Mask => 0x0f,
@@ -4765,14 +5069,15 @@ my %binaryDataAttrs = (
     }
 );
 
-# temperature information for the K5 - PH
-%Image::ExifTool::Pentax::TempInfoK5 = (
+# temperature information for some models - PH
+%Image::ExifTool::Pentax::TempInfo = (
     %binaryDataAttrs,
     GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
     NOTES => q{
         A number of additional temperature readings are extracted from this 256-byte
-        binary-data block in images from the K-5.  It is currently not known where
-        the corresponding temperature sensors are located in the camera.
+        binary-data block in images from models such as the K-01, K-3, K-5, K-50 and
+        K-500.  It is currently not known where the corresponding temperature
+        sensors are located in the camera.
     },
     # (it would be nice to know where these temperature sensors are located,
     #  but since according to the manual the Slow Shutter Speed NR Auto mode
@@ -4797,12 +5102,14 @@ my %binaryDataAttrs = (
     },
     0x14 => {
         Name => 'CameraTemperature4',
+        Condition => '$$self{Model} =~ /K-5\b/',
         Format => 'int16s',
         PrintConv => '"$val C"',
         PrintConvInv => '$val=~s/ ?c$//i; $val',
     },
     0x16 => { # usually the same as CameraTemperature4, but not always
         Name => 'CameraTemperature5',
+        Condition => '$$self{Model} =~ /K-5\b/',
         Format => 'int16s',
         PrintConv => '"$val C"',
         PrintConvInv => '$val=~s/ ?c$//i; $val',
@@ -5399,13 +5706,13 @@ sub PentaxEvInv($)
 # Returns: Encrypted or decrypted ShutterCount
 sub CryptShutterCount($$)
 {
-    my ($val, $exifTool) = @_;
+    my ($val, $et) = @_;
     # Pentax Date and Time values are used in the encryption
-    return undef unless $$exifTool{PentaxDate} and $$exifTool{PentaxTime} and
-        length($$exifTool{PentaxDate})==4 and length($$exifTool{PentaxTime})>=3;
+    return undef unless $$et{PentaxDate} and $$et{PentaxTime} and
+        length($$et{PentaxDate})==4 and length($$et{PentaxTime})>=3;
     # get Date and Time as integers (after padding Time with a null byte)
-    my $date = unpack('N', $$exifTool{PentaxDate});
-    my $time = unpack('N', $$exifTool{PentaxTime} . "\0");
+    my $date = unpack('N', $$et{PentaxDate});
+    my $time = unpack('N', $$et{PentaxTime} . "\0");
     return $val ^ $date ^ (0xffffffff - $time);
 }
 
@@ -5472,7 +5779,7 @@ values.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -14,7 +14,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.00';
+$VERSION = '1.01';
 
 sub ProcessPhaseOne($$$);
 sub ProcessSensorCalibration($$$);
@@ -288,10 +288,10 @@ my @formatSize = ( undef,        1,       1, undef,        4 );
 #         5) IFD entry offset, 6) IFD entry size, 7) parameter hash
 sub HtmlDump($$$$$$%)
 {
-    my ($exifTool, $tagTablePtr, $tagID, $value, $entry, $entryLen, %parms) = @_;
+    my ($et, $tagTablePtr, $tagID, $value, $entry, $entryLen, %parms) = @_;
     my ($dirName, $index, $formatStr, $base, $size, $valuePtr) =
         @parms{qw(DirName Index Format DataPos Size Start)};
-    my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID);
+    my $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID);
     my ($tagName, $colName, $subdir);
     my $count = $parms{Count} || $size;
     if ($tagInfo) {
@@ -322,11 +322,11 @@ sub HtmlDump($$$$$$%)
         $tval =~ tr/\x00-\x1f\x7f-\xff/./;
         $tip .= "Value: $tval";
     }
-    $exifTool->HDump($entry+$base, $entryLen, "$dname $colName", $tip, 1);
+    $et->HDump($entry+$base, $entryLen, "$dname $colName", $tip, 1);
     if ($size > 4) {
         my $dumpPos = $valuePtr + $base;
         # add value data block
-        $exifTool->HDump($dumpPos,$size,"$tagName value",'SAME', $subdir ? 0x04 : 0);
+        $et->HDump($dumpPos,$size,"$tagName value",'SAME', $subdir ? 0x04 : 0);
     }
 }
 
@@ -336,13 +336,13 @@ sub HtmlDump($$$$$$%)
 # Returns: 1 on success
 sub ProcessSensorCalibration($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dataPos = $$dirInfo{DataPos} || 0;
     my $dirStart = $$dirInfo{DirStart} || 0;
     my $dirLen = $$dirInfo{DirLen} || $$dirInfo{DataLen} - $dirStart;
-    my $verbose = $exifTool->Options('Verbose');
-    my $htmlDump = $exifTool->{HTML_DUMP};
+    my $verbose = $et->Options('Verbose');
+    my $htmlDump = $$et{HTML_DUMP};
 
     return 0 unless $dirLen >= 12 and SetByteOrder(substr($$dataPt, $dirStart, 2));
     # get offset to start of SensorCalibration directory
@@ -351,13 +351,13 @@ sub ProcessSensorCalibration($$$)
     my $numEntries = Get32u($dataPt, $dirStart + $ifdStart);
     my $ifdEnd = $ifdStart + 8 + 12 * $numEntries;
     return 0 if $numEntries < 2 or $numEntries > 300 or $ifdEnd > $dirLen;
-    $exifTool->VerboseDir('SensorCalibration', $numEntries);
+    $et->VerboseDir('SensorCalibration', $numEntries);
     if ($htmlDump) {
-        $exifTool->HDump($dirStart + $dataPos, 8, 'SensorCalibration header');
-        $exifTool->HDump($dirStart + $dataPos + 8, 4, 'SensorCalibration IFD offset');
-        $exifTool->HDump($dirStart + $dataPos + $ifdStart, 4, 'SensorCalibration entries',
-                             "Entry count: $numEntries");
-        $exifTool->HDump($dirStart + $dataPos + $ifdStart + 4, 4, '[unused]');
+        $et->HDump($dirStart + $dataPos, 8, 'SensorCalibration header');
+        $et->HDump($dirStart + $dataPos + 8, 4, 'SensorCalibration IFD offset');
+        $et->HDump($dirStart + $dataPos + $ifdStart, 4, 'SensorCalibration entries',
+                   "Entry count: $numEntries");
+        $et->HDump($dirStart + $dataPos + $ifdStart + 4, 4, '[unused]');
     }
     my $index;
     for ($index=0; $index<$numEntries; ++$index) {
@@ -367,17 +367,17 @@ sub ProcessSensorCalibration($$$)
         my $valuePtr = $entry + 8;
         if ($size > 4) {
             if ($size > 0x7fffffff) {
-                $exifTool->Warn("Invalid size for SensorCalibration IFD entry $index");
+                $et->Warn("Invalid size for SensorCalibration IFD entry $index");
                 return 0;
             }
             $valuePtr = Get32u($dataPt, $valuePtr);
             if ($valuePtr + $size > $dirLen) {
-                $exifTool->Warn(sprintf("Invalid offset 0x%.4x for SensorCalibration IFD entry $index",$valuePtr));
+                $et->Warn(sprintf("Invalid offset 0x%.4x for SensorCalibration IFD entry $index",$valuePtr));
                 return 0;
             }
             $valuePtr += $dirStart;
         }
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID);
         my $formatStr;
         if ($tagInfo) {
             $formatStr = $$tagInfo{Format};
@@ -402,8 +402,8 @@ sub ProcessSensorCalibration($$$)
             Start   => $valuePtr,
             Format  => $formatStr,
         );
-        $htmlDump and HtmlDump($exifTool, $tagTablePtr, $tagID, $value, $entry, 12, %parms);
-        $exifTool->HandleTag($tagTablePtr, $tagID, $value, %parms);
+        $htmlDump and HtmlDump($et, $tagTablePtr, $tagID, $value, $entry, 12, %parms);
+        $et->HandleTag($tagTablePtr, $tagID, $value, %parms);
     }
     return 1;
 }
@@ -414,14 +414,14 @@ sub ProcessSensorCalibration($$$)
 # Returns: 1 on success
 sub ProcessPhaseOne($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dataPos = $$dirInfo{DataPos} || 0;
     my $dirStart = $$dirInfo{DirStart} || 0;
     my $dirLen = $$dirInfo{DirLen} || $$dirInfo{DataLen} - $dirStart;
-    my $binary = $exifTool->Options('Binary');
-    my $verbose = $exifTool->Options('Verbose');
-    my $htmlDump = $exifTool->{HTML_DUMP};
+    my $binary = $et->Options('Binary');
+    my $verbose = $et->Options('Verbose');
+    my $htmlDump = $$et{HTML_DUMP};
 
     return 0 if $dirLen < 12;
     my $hdr = substr($$dataPt, $dirStart, 12);
@@ -434,13 +434,13 @@ sub ProcessPhaseOne($$$)
     my $numEntries = Get32u($dataPt, $dirStart + $ifdStart);
     my $ifdEnd = $ifdStart + 8 + 16 * $numEntries;
     return 0 if $numEntries < 2 or $numEntries > 300 or $ifdEnd > $dirLen;
-    $exifTool->VerboseDir('PhaseOne', $numEntries);
+    $et->VerboseDir('PhaseOne', $numEntries);
     if ($htmlDump) {
-        $exifTool->HDump($dirStart + $dataPos, 8, 'PhaseOne header');
-        $exifTool->HDump($dirStart + $dataPos + 8, 4, 'PhaseOne IFD offset');
-        $exifTool->HDump($dirStart + $dataPos + $ifdStart, 4, "PhaseOne entries",
-                             "Entry count: $numEntries");
-        $exifTool->HDump($dirStart + $dataPos + $ifdStart + 4, 4, '[unused]');
+        $et->HDump($dirStart + $dataPos, 8, 'PhaseOne header');
+        $et->HDump($dirStart + $dataPos + 8, 4, 'PhaseOne IFD offset');
+        $et->HDump($dirStart + $dataPos + $ifdStart, 4, "PhaseOne entries",
+                   "Entry count: $numEntries");
+        $et->HDump($dirStart + $dataPos + $ifdStart + 4, 4, '[unused]');
     }
     my $index;
     for ($index=0; $index<$numEntries; ++$index) {
@@ -449,11 +449,11 @@ sub ProcessPhaseOne($$$)
         my $format = Get32u($dataPt, $entry+4);
         my $size = Get32u($dataPt, $entry+8);
         if ($format < 1 or $format > 13) {
-            $exifTool->Warn("Invalid PhaseOne IFD entry $index",1);
+            $et->Warn("Invalid PhaseOne IFD entry $index",1);
             return 0;
         }
         unless (defined $formatSize[$format]) {
-            $exifTool->WarnOnce("Unrecognized PhaseOne format type $format",1);
+            $et->WarnOnce("Unrecognized PhaseOne format type $format",1);
             $formatSize[$format] = 1;
             $formatName[$format] = 'undef';
         }
@@ -461,17 +461,17 @@ sub ProcessPhaseOne($$$)
         my $valuePtr = $entry + 12;
         if ($size > 4) {
             if ($size > 0x7fffffff) {
-                $exifTool->Warn("Invalid size for PhaseOne IFD entry $index");
+                $et->Warn("Invalid size for PhaseOne IFD entry $index");
                 return 0;
             }
             $valuePtr = Get32u($dataPt, $valuePtr);
             if ($valuePtr + $size > $dirLen) {
-                $exifTool->Warn(sprintf("Invalid offset 0x%.4x for PhaseOne IFD entry $index",$valuePtr));
+                $et->Warn(sprintf("Invalid offset 0x%.4x for PhaseOne IFD entry $index",$valuePtr));
                 return 0;
             }
             $valuePtr += $dirStart;
         }
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID);
         my $formatStr = $formatName[$format];
         if ($tagInfo) {
             $formatStr = $$tagInfo{Format} if $$tagInfo{Format};
@@ -511,8 +511,8 @@ sub ProcessPhaseOne($$$)
             Format  => $formatStr,
             Count   => $count
         );
-        $htmlDump and HtmlDump($exifTool, $tagTablePtr, $tagID, $value, $entry, 16, %parms);
-        $exifTool->HandleTag($tagTablePtr, $tagID, $value, %parms);
+        $htmlDump and HtmlDump($et, $tagTablePtr, $tagID, $value, $entry, 16, %parms);
+        $et->HandleTag($tagTablePtr, $tagID, $value, %parms);
     }
     return 1;
 }
@@ -536,7 +536,7 @@ One maker notes.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -15,7 +15,7 @@ use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Exif;  # (for Composite:ImageSize)
 
-$VERSION = '1.00';
+$VERSION = '1.01';
 
 sub ProcessExtData($$$);
 
@@ -449,21 +449,21 @@ sub ProcessExtData($$$);
 # Returns: 1 on success, 0 if this wasn't a valid PhotoCD file
 sub ProcessPCD($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my $buff;
     return 0 unless $raf->Seek(2048, 0) and
                     $raf->Read($buff, 2048) == 2048 and
                     $buff =~ /^PCD_IPI/;
     SetByteOrder('MM');
-    $exifTool->SetFileType();
+    $et->SetFileType();
     my %dirInfo = (
         DirName => 'PhotoCD',
         DataPt => \$buff,
         DataPos => 4096,
     );
     my $tagTablePtr = GetTagTable('Image::ExifTool::PhotoCD::Main');
-    return $exifTool->ProcessBinaryData(\%dirInfo, $tagTablePtr);
+    return $et->ProcessBinaryData(\%dirInfo, $tagTablePtr);
 }
 
 1;  # end
@@ -485,7 +485,7 @@ information from Kodak Photo CD Image Pac (PCD) files.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -15,7 +15,7 @@ use Image::ExifTool::Exif;
 use Image::ExifTool::IPTC;
 use Image::ExifTool::XMP;
 
-$VERSION = '1.03';
+$VERSION = '1.04';
 
 sub ProcessPhotoMechanic($$);
 
@@ -148,12 +148,12 @@ my %rawCropConv = (
 # - updates DirLen to trailer length
 sub ProcessPhotoMechanic($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my $offset = $$dirInfo{Offset} || 0;
     my $outfile = $$dirInfo{OutFile};
-    my $verbose = $exifTool->Options('Verbose');
-    my $out = $exifTool->Options('TextOut');
+    my $verbose = $et->Options('Verbose');
+    my $out = $et->Options('TextOut');
     my $rtnVal = 0;
     my ($buff, $footer);
 
@@ -164,11 +164,11 @@ sub ProcessPhotoMechanic($$)
         my $size = unpack('N', $footer);
 
         if ($size & 0x80000000 or not $raf->Seek(-$size-12, 1)) {
-            $exifTool->Warn('Bad PhotoMechanic trailer');
+            $et->Warn('Bad PhotoMechanic trailer');
             last;
         }
         unless ($raf->Read($buff, $size) == $size) {
-            $exifTool->Warn('Error reading PhotoMechanic trailer');
+            $et->Warn('Error reading PhotoMechanic trailer');
             last;
         }
         $rtnVal = 1;    # we read the trailer successfully
@@ -187,20 +187,20 @@ sub ProcessPhotoMechanic($$)
         my $tagTablePtr = GetTagTable('Image::ExifTool::PhotoMechanic::Main');
         if (not $outfile) {
             # extract trailer information
-            $exifTool->DumpTrailer($dirInfo) if $verbose or $exifTool->{HTML_DUMP};
-            $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
-        } elsif ($exifTool->{DEL_GROUP}->{PhotoMechanic}) {
+            $et->DumpTrailer($dirInfo) if $verbose or $$et{HTML_DUMP};
+            $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        } elsif ($$et{DEL_GROUP}{PhotoMechanic}) {
             # delete the trailer
             $verbose and printf $out "  Deleting PhotoMechanic trailer\n";
-            ++$exifTool->{CHANGED};
+            ++$$et{CHANGED};
         } else {
             # rewrite the trailer
             my $newPt;
-            my $newBuff = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr);
+            my $newBuff = $et->WriteDirectory(\%dirInfo, $tagTablePtr);
             if (defined $newBuff) {
                 $newPt = \$newBuff; # write out the modified trailer
                 my $pad = 0x800 - length($newBuff);
-                if ($pad > 0 and not $exifTool->Options('Compact')) {
+                if ($pad > 0 and not $et->Options('Compact')) {
                     # pad out to 2kB like PhotoMechanic does
                     $newBuff .= "\0" x $pad;
                 }
@@ -236,7 +236,7 @@ write information written by the Camera Bits Photo Mechanic software.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -19,6 +19,7 @@
 #               4) http://www.fileformat.info/format/psd/egff.htm
 #               5) http://www.telegraphics.com.au/svn/psdparse/trunk/resources.c
 #               6) http://libpsd.graphest.com/files/Photoshop%20File%20Formats.pdf
+#               7) http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/PhotoshopFileFormats.htm
 #------------------------------------------------------------------------------
 
 package Image::ExifTool::Photoshop;
@@ -27,7 +28,7 @@ use strict;
 use vars qw($VERSION $AUTOLOAD $iptcDigestInfo);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.41';
+$VERSION = '1.44';
 
 sub ProcessPhotoshop($$$);
 sub WritePhotoshop($$$);
@@ -73,7 +74,7 @@ my %psdMap = (
     0x03f0 => { Unknown => 1, Name => 'PStringCaption' },
     0x03f1 => { Unknown => 1, Name => 'BorderInformation' },
     0x03f2 => { Unknown => 1, Name => 'BackgroundColor' },
-    0x03f3 => { Unknown => 1, Name => 'PrintFlags' },
+    0x03f3 => { Unknown => 1, Name => 'PrintFlags', Format => 'int8u' },
     0x03f4 => { Unknown => 1, Name => 'BW_HalftoningInfo' },
     0x03f5 => { Unknown => 1, Name => 'ColorHalftoningInfo' },
     0x03f6 => { Unknown => 1, Name => 'DuotoneHalftoningInfo' },
@@ -81,14 +82,14 @@ my %psdMap = (
     0x03f8 => { Unknown => 1, Name => 'ColorTransferFuncs' },
     0x03f9 => { Unknown => 1, Name => 'DuotoneTransferFuncs' },
     0x03fa => { Unknown => 1, Name => 'DuotoneImageInfo' },
-    0x03fb => { Unknown => 1, Name => 'EffectiveBW' },
+    0x03fb => { Unknown => 1, Name => 'EffectiveBW', Format => 'int8u' },
     0x03fc => { Unknown => 1, Name => 'ObsoletePhotoshopTag1' },
     0x03fd => { Unknown => 1, Name => 'EPSOptions' },
     0x03fe => { Unknown => 1, Name => 'QuickMaskInfo' },
     0x03ff => { Unknown => 1, Name => 'ObsoletePhotoshopTag2' },
-    0x0400 => { Unknown => 1, Name => 'LayerStateInfo' },
+    0x0400 => { Unknown => 1, Name => 'TargetLayerID', Format => 'int16u' }, # (LayerStateInfo)
     0x0401 => { Unknown => 1, Name => 'WorkingPath' },
-    0x0402 => { Unknown => 1, Name => 'LayersGroupInfo' },
+    0x0402 => { Unknown => 1, Name => 'LayersGroupInfo', Format => 'int16u' },
     0x0403 => { Unknown => 1, Name => 'ObsoletePhotoshopTag3' },
     0x0404 => {
         Name => 'IPTCData',
@@ -143,14 +144,14 @@ my %psdMap = (
             TagTable => 'Image::ExifTool::ICC_Profile::Main',
         },
     },
-    0x0410 => { Unknown => 1, Name => 'Watermark' },
-    0x0411 => { Unknown => 1, Name => 'ICC_Untagged' },
-    0x0412 => { Unknown => 1, Name => 'EffectsVisible' },
+    0x0410 => { Unknown => 1, Name => 'Watermark', Format => 'int8u' },
+    0x0411 => { Unknown => 1, Name => 'ICC_Untagged', Format => 'int8u' },
+    0x0412 => { Unknown => 1, Name => 'EffectsVisible', Format => 'int8u' },
     0x0413 => { Unknown => 1, Name => 'SpotHalftone' },
-    0x0414 => { Unknown => 1, Name => 'IDsBaseValue', Description => 'IDs Base Value' },
+    0x0414 => { Unknown => 1, Name => 'IDsBaseValue', Description => 'IDs Base Value', Format => 'int32u' },
     0x0415 => { Unknown => 1, Name => 'UnicodeAlphaNames' },
-    0x0416 => { Unknown => 1, Name => 'IndexedColourTableCount' },
-    0x0417 => { Unknown => 1, Name => 'TransparentIndex' },
+    0x0416 => { Unknown => 1, Name => 'IndexedColourTableCount', Format => 'int16u' },
+    0x0417 => { Unknown => 1, Name => 'TransparentIndex', Format => 'int16u' },
     0x0419 => {
         Name => 'GlobalAltitude',
         Writable => 'int32u',
@@ -196,7 +197,7 @@ my %psdMap = (
             if (lc($val) eq 'new' or lc($val) eq 'old') {
                 {
                     local $SIG{'__WARN__'} = sub { };
-                    return lc($val) if eval 'require Digest::MD5';
+                    return lc($val) if eval { require Digest::MD5 };
                 }
                 warn "Digest::MD5 must be installed\n";
                 return undef;
@@ -211,6 +212,32 @@ my %psdMap = (
     0x0429 => { Unknown => 1, Name => 'LayerComps' }, #5
     0x042a => { Unknown => 1, Name => 'AlternateDuotoneColors' }, #5
     0x042b => { Unknown => 1, Name => 'AlternateSpotColors' }, #5
+    0x042d => { #7
+        Name => 'LayerSelectionIDs',
+        Description => 'Layer Selection IDs',
+        Unknown => 1,
+        ValueConv => q{
+            my ($n, @a) = unpack("nN*",$val);
+            $#a = $n - 1 if $n > @a;
+            return join(' ', @a);
+        },
+    },
+    0x042e => { Unknown => 1, Name => 'HDRToningInfo' }, #7
+    0x042f => { Unknown => 1, Name => 'PrintInfo' }, #7
+    0x0430 => { Unknown => 1, Name => 'LayerGroupsEnabledID', Format => 'int8u' }, #7
+    0x0431 => { Unknown => 1, Name => 'ColorSamplersResource2' }, #7
+    0x0432 => { Unknown => 1, Name => 'MeasurementScale' }, #7
+    0x0433 => { Unknown => 1, Name => 'TimelineInfo' }, #7
+    0x0434 => { Unknown => 1, Name => 'SheetDisclosure' }, #7
+    0x0435 => { Unknown => 1, Name => 'DisplayInfo' }, #7
+    0x0436 => { Unknown => 1, Name => 'OnionSkins' }, #7
+    0x0438 => { Unknown => 1, Name => 'CountInfo' }, #7
+    0x043a => { Unknown => 1, Name => 'PrintInfo2' }, #7
+    0x043b => { Unknown => 1, Name => 'PrintStyle' }, #7
+    0x043c => { Unknown => 1, Name => 'MacintoshNSPrintInfo' }, #7
+    0x043d => { Unknown => 1, Name => 'WindowsDEVMODE' }, #7
+    0x043e => { Unknown => 1, Name => 'AutoSaveFilePath' }, #7
+    0x043f => { Unknown => 1, Name => 'AutoSaveFormat' }, #7
     # 0x07d0-0x0bb6 Path information
     0x0bb7 => {
         Name => 'ClippingPathName',
@@ -221,6 +248,9 @@ my %psdMap = (
             return Image::ExifTool::Photoshop::ConvertPascalString($self,$val);
         },
     },
+    # 0x0fa0-0x1387 - plug-in resources (ref 7)
+    0x1b58 => { Unknown => 1, Name => 'ImageReadyVariables' }, #7
+    0x1f40 => { Unknown => 1, Name => 'LightroomWorkflow' }, #7
     0x2710 => { Unknown => 1, Name => 'PrintFlagsInfo' },
 );
 
@@ -347,7 +377,7 @@ sub AUTOLOAD
 # Returns: Strings, concatenated with ', '
 sub ConvertPascalString($$)
 {
-    my ($exifTool, $inStr) = @_;
+    my ($et, $inStr) = @_;
     my $outStr = '';
     my $len = length($inStr);
     my $i=0;
@@ -358,8 +388,8 @@ sub ConvertPascalString($$)
         $outStr .= substr($inStr, $i+1, $n);
         $i += $n + 1;
     }
-    my $charset = $exifTool->Options('CharsetPhotoshop') || 'Latin';
-    return $exifTool->Decode($outStr, $charset);
+    my $charset = $et->Options('CharsetPhotoshop') || 'Latin';
+    return $et->Decode($outStr, $charset);
 }
 
 #------------------------------------------------------------------------------
@@ -369,15 +399,15 @@ sub ConvertPascalString($$)
 # Returns: 1 on success
 sub ProcessPhotoshop($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $pos = $$dirInfo{DirStart};
     my $dirEnd = $pos + $$dirInfo{DirLen};
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     my $success = 0;
 
     SetByteOrder('MM');     # Photoshop is always big-endian
-    $verbose and $exifTool->VerboseDir('Photoshop', 0, $$dirInfo{DirLen});
+    $verbose and $et->VerboseDir('Photoshop', 0, $$dirInfo{DirLen});
 
     # scan through resource blocks:
     # Format: 0) Type, 4 bytes - '8BIM' (or the rare 'PHUT', 'DCSR' or 'AgHg')
@@ -394,7 +424,7 @@ sub ProcessPhotoshop($$$)
             $ttPtr = GetTagTable('Image::ExifTool::Photoshop::Unknown');
         } else {
             $type =~ s/([^\w])/sprintf("\\x%.2x",ord($1))/ge;
-            $exifTool->Warn(qq{Bad Photoshop IRB resource "$type"});
+            $et->Warn(qq{Bad Photoshop IRB resource "$type"});
             last;
         }
         my $tag = Get16u($dataPt, $pos + 4);
@@ -405,13 +435,13 @@ sub ProcessPhotoshop($$$)
         $pos += $nameLen;
         ++$pos unless $nameLen & 0x01;
         if ($pos + 4 > $dirEnd) {
-            $exifTool->Warn("Bad Photoshop resource block");
+            $et->Warn("Bad Photoshop resource block");
             last;
         }
         my $size = Get32u($dataPt, $pos);
         $pos += 4;
         if ($size + $pos > $dirEnd) {
-            $exifTool->Warn("Bad Photoshop resource data size $size");
+            $et->Warn("Bad Photoshop resource data size $size");
             last;
         }
         $success = 1;
@@ -421,14 +451,14 @@ sub ProcessPhotoshop($$$)
         } else {
             $name = '';
         }
-        my $tagInfo = $exifTool->GetTagInfo($ttPtr, $tag);
+        my $tagInfo = $et->GetTagInfo($ttPtr, $tag);
         # append resource name to value if requested (braced by "/#...#/")
         if ($tagInfo and defined $$tagInfo{SetResourceName} and
             $$tagInfo{SetResourceName} eq '1' and $name !~ m{/#})
         {
             $val = substr($$dataPt, $pos, $size) . '/#' . $name . '#/';
         }
-        $exifTool->HandleTag($ttPtr, $tag, $val,
+        $et->HandleTag($ttPtr, $tag, $val,
             TagInfo => $tagInfo,
             Extra   => $extra,
             DataPt  => $dataPt,
@@ -449,7 +479,7 @@ sub ProcessPhotoshop($$$)
 # Returns: 1 if this was a valid PSD file, -1 on write error
 sub ProcessPSD($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my $outfile = $$dirInfo{OutFile};
     my ($data, $err, $tagTablePtr);
@@ -457,7 +487,7 @@ sub ProcessPSD($$)
     $raf->Read($data, 30) == 30 or return 0;
     $data =~ /^8BPS\0([\x01\x02])/ or return 0;
     SetByteOrder('MM');
-    $exifTool->SetFileType($1 eq "\x01" ? 'PSD' : 'PSB'); # set the FileType tag
+    $et->SetFileType($1 eq "\x01" ? 'PSD' : 'PSB'); # set the FileType tag
     my %dirInfo = (
         DataPt => \$data,
         DirStart => 0,
@@ -469,12 +499,12 @@ sub ProcessPSD($$)
         $raf->Read($data, $len) == $len or return -1;
         Write($outfile, $data) or $err = 1; # write color mode data
         # initialize map of where things are written
-        $exifTool->InitWriteDirs(\%psdMap);
+        $et->InitWriteDirs(\%psdMap);
     } else {
         # process the header
         $tagTablePtr = GetTagTable('Image::ExifTool::Photoshop::Header');
         $dirInfo{DirLen} = 30;
-        $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
         $raf->Seek($len, 1) or $err = 1;    # skip over color mode data
     }
     $raf->Read($data, 4) == 4 or $err = 1;
@@ -485,7 +515,7 @@ sub ProcessPSD($$)
     my $rtnVal = 1;
     if ($outfile) {
         # rewrite IRB resources
-        $data = WritePhotoshop($exifTool, \%dirInfo, $tagTablePtr);
+        $data = WritePhotoshop($et, \%dirInfo, $tagTablePtr);
         if ($data) {
             $len = Set32u(length $data);
             Write($outfile, $len, $data) or $err = 1;
@@ -495,7 +525,7 @@ sub ProcessPSD($$)
                 my $tbuf = '';
                 $$trailInfo{OutFile} = \$tbuf;  # rewrite trailer(s)
                 # rewrite all trailers to buffer
-                if ($exifTool->ProcessTrailers($trailInfo)) {
+                if ($et->ProcessTrailers($trailInfo)) {
                     my $copyBytes = $$trailInfo{DataPos} - $raf->Tell();
                     if ($copyBytes >= 0) {
                         # copy remaining PSD file up to start of trailer
@@ -506,9 +536,9 @@ sub ProcessPSD($$)
                             $copyBytes -= $n;
                         }
                         # write the trailer (or not)
-                        $exifTool->WriteTrailerBuffer($trailInfo, $outfile) or $err = 1;
+                        $et->WriteTrailerBuffer($trailInfo, $outfile) or $err = 1;
                     } else {
-                        $exifTool->Warn('Overlapping trailer');
+                        $et->Warn('Overlapping trailer');
                         undef $trailInfo;
                     }
                 } else {
@@ -526,12 +556,12 @@ sub ProcessPSD($$)
         }
         $rtnVal = -1 if $err;
     } elsif ($err) {
-        $exifTool->Warn('File format error');
+        $et->Warn('File format error');
     } else {
-        ProcessPhotoshop($exifTool, \%dirInfo, $tagTablePtr);
+        ProcessPhotoshop($et, \%dirInfo, $tagTablePtr);
         # process trailers if they exist
         my $trailInfo = Image::ExifTool::IdentifyTrailer($raf);
-        $exifTool->ProcessTrailers($trailInfo) if $trailInfo;
+        $et->ProcessTrailers($trailInfo) if $trailInfo;
     }
     return $rtnVal;
 }
@@ -569,7 +599,7 @@ be preserved when copying Photoshop information via user-defined tags.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -586,6 +616,8 @@ under the same terms as Perl itself.
 
 =item L<http://libpsd.graphest.com/files/Photoshop%20File%20Formats.pdf>
 
+=item L<http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/PhotoshopFileFormats.htm>
+
 =back
 
 =head1 SEE ALSO
@@ -16,7 +16,7 @@ use strict;
 use vars qw($VERSION $AUTOLOAD);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.35';
+$VERSION = '1.37';
 
 sub WritePS($$);
 sub ProcessPS($$;$);
@@ -160,11 +160,11 @@ sub ImageSize($$)
 # Returns: 1
 sub PSErr($$)
 {
-    my ($exifTool, $str) = @_;
+    my ($et, $str) = @_;
     # set file type if not done already
-    my $ext = $$exifTool{FILE_EXT};
-    $exifTool->SetFileType(($ext and $ext eq 'AI') ? 'AI' : 'PS');
-    $exifTool->Warn("PostScript format error ($str)");
+    my $ext = $$et{FILE_EXT};
+    $et->SetFileType(($ext and $ext eq 'AI') ? 'AI' : 'PS');
+    $et->Warn("PostScript format error ($str)");
     return 1;
 }
 
@@ -320,9 +320,9 @@ sub UnescapePostScript($)
 # Returns: 1 if this was a valid PostScript file
 sub ProcessPS($$;$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $raf = $$dirInfo{RAF};
-    my $embedded = $exifTool->Options('ExtractEmbedded');
+    my $embedded = $et->Options('ExtractEmbedded');
     my ($data, $dos, $endDoc, $fontTable, $comment);
 
     # allow read from data
@@ -344,14 +344,14 @@ sub ProcessPS($$;$)
         unless ($raf->Seek(Get32u(\$dos, 0), 0) and
                 $raf->Read($data, 4) == 4 and $data eq '%!PS')
         {
-            return PSErr($exifTool, 'invalid header');
+            return PSErr($et, 'invalid header');
         }
     } else {
         # check for PostScript font file (PFA or PFB)
         my $d2;
         $data .= $d2 if $raf->Read($d2,12);
         if ($data =~ /^%!(PS-(AdobeFont-|Bitstream )|FontType1-)/) {
-            $exifTool->SetFileType('PFA');  # PostScript ASCII font file
+            $et->SetFileType('PFA');  # PostScript ASCII font file
             $fontTable = GetTagTable('Image::ExifTool::Font::PSInfo');
             # PostScript font files may contain an unformatted comments which may
             # contain useful information, so accumulate these for the Comment tag
@@ -363,7 +363,7 @@ sub ProcessPS($$;$)
 # set the newline type based on the first newline found in the file
 #
     local $/ = GetInputRecordSeparator($raf);
-    $/ or return PSErr($exifTool, 'invalid PS data');
+    $/ or return PSErr($et, 'invalid PS data');
 
     # set file type (PostScript or EPS)
     $raf->ReadLine($data) or $data = '';
@@ -381,7 +381,7 @@ sub ProcessPS($$;$)
         }
         $raf->Seek($pos, 0);
     }
-    $exifTool->SetFileType($type);
+    $et->SetFileType($type);
 #
 # extract TIFF information from DOS header
 #
@@ -392,11 +392,11 @@ sub ProcessPS($$;$)
             my $pos = $raf->Tell();
             # extract the TIFF preview
             my $len = Get32u(\$dos, 20);
-            my $val = $exifTool->ExtractBinary($base, $len, 'TIFFPreview');
+            my $val = $et->ExtractBinary($base, $len, 'TIFFPreview');
             if (defined $val and $val =~ /^(MM\0\x2a|II\x2a\0|Binary)/) {
-                $exifTool->HandleTag($tagTablePtr, 'TIFFPreview', $val);
+                $et->HandleTag($tagTablePtr, 'TIFFPreview', $val);
             } else {
-                $exifTool->Warn('Bad TIFF preview image');
+                $et->Warn('Bad TIFF preview image');
             }
             # extract information from TIFF in DOS header
             # (set Parent to '' to avoid setting FileType tag again)
@@ -405,7 +405,7 @@ sub ProcessPS($$;$)
                 RAF => $raf,
                 Base => $base,
             );
-            $exifTool->ProcessTIFF(\%dirInfo) or $exifTool->Warn('Bad embedded TIFF');
+            $et->ProcessTIFF(\%dirInfo) or $et->Warn('Bad embedded TIFF');
             # position file pointer to extract PS information
             $raf->Seek($pos, 0);
         }
@@ -478,7 +478,7 @@ sub ProcessPS($$;$)
         } elsif ($endDoc and $data =~ /^$endDoc/i) {
             $docNum =~ s/-?(\d+)$//;        # decrement nesting level
             $subDocNum = $1;                # remember our last sub-document number
-            $$exifTool{DOC_NUM} = $docNum;
+            $$et{DOC_NUM} = $docNum;
             undef $endDoc unless $docNum;   # done with document if top level
             next;
         } elsif ($data =~ /^(%{1,2})(Begin)(_xml_packet|Photoshop|ICCProfile|Document|Binary)/i) {
@@ -507,14 +507,14 @@ sub ProcessPS($$;$)
                     $docNum .= '-' . (++$subDocNum);
                 } else {
                     # this is the Nth document
-                    $docNum = $$exifTool{DOC_COUNT} + 1;
+                    $docNum = $$et{DOC_COUNT} + 1;
                 }
                 $subDocNum = 0; # new level, so reset subDocNum
                 next unless $embedded;  # skip over this document
                 # set document number for family 4-7 group names
-                $$exifTool{DOC_NUM} = $docNum;
-                $$exifTool{LIST_TAGS} = { };  # don't build lists across different documents
-                $exifTool->{PROCESSED} = { }; # re-initialize processed directory lookup too
+                $$et{DOC_NUM} = $docNum;
+                $$et{LIST_TAGS} = { };  # don't build lists across different documents
+                $$et{PROCESSED} = { }; # re-initialize processed directory lookup too
                 $endDoc = $endToken;          # parse to EndDocument token
                 # reset mode to allow parsing into sub-directories
                 undef $endToken;
@@ -524,7 +524,7 @@ sub ProcessPS($$;$)
                     my $docName = $1;
                     # remove brackets if necessary
                     $docName = $1 if $docName =~ /^\((.*)\)$/;
-                    $exifTool->HandleTag($tagTablePtr, 'EmbeddedFileName', $docName);
+                    $et->HandleTag($tagTablePtr, 'EmbeddedFileName', $docName);
                 }
             }
             next;
@@ -541,12 +541,12 @@ sub ProcessPS($$;$)
             next unless $data =~ /^%%/ or $1 eq 'ImageData';
             # decode comment string (reading continuation lines if necessary)
             $val = DecodeComment($val, $raf, \@lines);
-            $exifTool->HandleTag($tagTablePtr, $tag, $val);
+            $et->HandleTag($tagTablePtr, $tag, $val);
             next;
         } elsif ($embedded and $data =~ /^%AI12_CompressedData/) {
             # the rest of the file is compressed
-            unless (eval 'require Compress::Zlib') {
-                $exifTool->Warn('Install Compress::Zlib to extract compressed embedded data');
+            unless (eval { require Compress::Zlib }) {
+                $et->Warn('Install Compress::Zlib to extract compressed embedded data');
                 last;
             }
             # seek back to find the start of the compressed data in the file
@@ -557,12 +557,12 @@ sub ProcessPS($$;$)
             last unless $raf->Seek($backTo, 0) and $raf->Read($data, 2048);
             last unless $data =~ s/.*?%AI12_CompressedData//;
             my $inflate = Compress::Zlib::inflateInit();
-            $inflate or $exifTool->Warn('Error initializing inflate'), last;
+            $inflate or $et->Warn('Error initializing inflate'), last;
             # generate a PS-like file in memory from the compressed data
-            my $verbose = $exifTool->Options('Verbose');
+            my $verbose = $et->Options('Verbose');
             if ($verbose > 1) {
-                $exifTool->VerboseDir('AI12_CompressedData (first 4kB)');
-                $exifTool->VerboseDump(\$data);
+                $et->VerboseDir('AI12_CompressedData (first 4kB)');
+                $et->VerboseDump(\$data);
             }
             # remove header if it exists (Windows AI files only)
             $data =~ s/^.{0,256}EndData[\x0d\x0a]+//s;
@@ -581,14 +581,14 @@ sub ProcessPS($$;$)
                 }
                 $raf->Read($data, 65536) or last;
             }
-            defined $val or $exifTool->Warn('Error inflating AI compressed data'), last;
+            defined $val or $et->Warn('Error inflating AI compressed data'), last;
             if ($verbose > 1) {
-                $exifTool->VerboseDir('Uncompressed AI12 Data');
-                $exifTool->VerboseDump(\$val);
+                $et->VerboseDir('Uncompressed AI12 Data');
+                $et->VerboseDump(\$val);
             }
             # extract information from embedded images in the uncompressed data
             $val =  # add PS header in case it needs one
-            ProcessPS($exifTool, { DataPt => \$val });
+            ProcessPS($et, { DataPt => \$val });
             last;
         } elsif ($fontTable) {
             if (defined $comment) {
@@ -599,7 +599,7 @@ sub ProcessPS($$;$)
                     next;
                 } elsif ($data !~ /^%/) {
                     # stop extracting comments at the first non-comment line
-                    $exifTool->FoundTag('Comment', $comment) if length $comment;
+                    $et->FoundTag('Comment', $comment) if length $comment;
                     undef $comment;
                 }
             }
@@ -610,7 +610,7 @@ sub ProcessPS($$;$)
                 } elsif ($val =~ m{/?(\S+)}) {
                     $val = $1;
                 }
-                $exifTool->HandleTag($fontTable, $tag, $val);
+                $et->HandleTag($fontTable, $tag, $val);
             } elsif ($data =~ /^currentdict end/) {
                 # only extract tags from initial FontInfo dict
                 undef $fontTable;
@@ -628,14 +628,14 @@ sub ProcessPS($$;$)
             Parent => 'PostScript',
         );
         my $subTablePtr = GetTagTable("Image::ExifTool::${mode}::Main");
-        unless ($exifTool->ProcessDirectory(\%dirInfo, $subTablePtr)) {
-            $exifTool->Warn("Error processing $mode information in PostScript file");
+        unless ($et->ProcessDirectory(\%dirInfo, $subTablePtr)) {
+            $et->Warn("Error processing $mode information in PostScript file");
         }
         undef $buff;
         undef $mode;
     }
     $mode = 'Document' if $endDoc and not $mode;
-    $mode and PSErr($exifTool, "unterminated $mode data");
+    $mode and PSErr($et, "unterminated $mode data");
     return 1;
 }
 
@@ -668,7 +668,7 @@ This code reads meta information from EPS (Encapsulated PostScript), PS
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -12,7 +12,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess);
 
-$VERSION = '1.06';
+$VERSION = '1.07';
 
 sub ProcessPrintIM($$$);
 
@@ -42,22 +42,22 @@ sub ProcessPrintIM($$$);
 # Returns: 1 on success
 sub ProcessPrintIM($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $offset = $$dirInfo{DirStart};
     my $size = $$dirInfo{DirLen};
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
 
     unless ($size) {
-        $exifTool->Warn('Empty PrintIM data', 1);
+        $et->Warn('Empty PrintIM data', 1);
         return 0;
     }
     unless ($size > 15) {
-        $exifTool->Warn('Bad PrintIM data');
+        $et->Warn('Bad PrintIM data');
         return 0;
     }
     unless (substr($$dataPt, $offset, 7) eq 'PrintIM') {
-        $exifTool->Warn('Invalid PrintIM header');
+        $et->Warn('Invalid PrintIM header');
         return 0;
     }
     # check size of PrintIM block
@@ -67,12 +67,12 @@ sub ProcessPrintIM($$$)
         ToggleByteOrder();
         $num = Get16u($dataPt, $offset + 14);
         if ($size < 16 + $num * 6) {
-            $exifTool->Warn('Bad PrintIM size');
+            $et->Warn('Bad PrintIM size');
             return 0;
         }
     }
-    $verbose and $exifTool->VerboseDir('PrintIM', $num);
-    $exifTool->HandleTag($tagTablePtr, 'PrintIMVersion', substr($$dataPt, $offset + 8, 4),
+    $verbose and $et->VerboseDir('PrintIM', $num);
+    $et->HandleTag($tagTablePtr, 'PrintIMVersion', substr($$dataPt, $offset + 8, 4),
         DataPt => $dataPt,
         Start  => $offset + 8,
         Size   => 4,
@@ -82,7 +82,7 @@ sub ProcessPrintIM($$$)
         my $pos = $offset + 16 + $n * 6;
         my $tag = Get16u($dataPt, $pos);
         my $val = Get32u($dataPt, $pos + 2);
-        $exifTool->HandleTag($tagTablePtr, $tag, $val,
+        $et->HandleTag($tagTablePtr, $tag, $val,
             Index  => $n,
             DataPt => $dataPt,
             Start  => $pos + 2,
@@ -112,7 +112,7 @@ Print Image Matching meta information.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -12,7 +12,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.00';
+$VERSION = '1.01';
 
 sub ProcessQualcomm($$$);
 sub MakeNameAndDesc($$);
@@ -1264,13 +1264,13 @@ sub MakeNameAndDesc($$)
 # Returns: 1 on success
 sub ProcessQualcomm($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dataPos = $$dirInfo{DataPos};
     my $pos = $$dirInfo{DirStart};
     my $dirEnd = $pos + $$dirInfo{DirLen};
 
-    $exifTool->VerboseDir('Qualcomm', undef, $$dirInfo{DirLen});
+    $et->VerboseDir('Qualcomm', undef, $$dirInfo{DirLen});
     SetByteOrder('II');
 
     while ($pos + 3 < $dirEnd) {
@@ -1296,11 +1296,11 @@ sub ProcessQualcomm($$$)
         unless (defined $$tagTablePtr{$tag} or $Image::ExifTool::specialTags{$tag}) {
             my %tagInfo;
             if (MakeNameAndDesc($tag, \%tagInfo)) {
-                $exifTool->VPrint(0, $$exifTool{INDENT}, "[adding Qualcomm:$tagInfo{Name}]\n");
+                $et->VPrint(0, $$et{INDENT}, "[adding Qualcomm:$tagInfo{Name}]\n");
                 AddTagToTable($tagTablePtr, $tag, \%tagInfo);
             }
         }
-        $exifTool->HandleTag($tagTablePtr, $tag, $val,
+        $et->HandleTag($tagTablePtr, $tag, $val,
             DataPt  => $dataPt,
             DataPos => $dataPos,
             Start   => $pos,
@@ -1331,7 +1331,7 @@ information from the Qualcomm APP7 segment in JPEG images.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -8,40 +8,53 @@
 #               09/22/2006 - P. Harvey Added M4A support
 #               07/27/2010 - P. Harvey Updated to 2010-05-03 QuickTime spec
 #
-# References:   1) http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html
-#               2) http://search.cpan.org/dist/MP4-Info-1.04/
-#               3) http://www.geocities.com/xhelmboyx/quicktime/formats/mp4-layout.txt
-#               4) http://wiki.multimedia.cx/index.php?title=Apple_QuickTime
-#               5) ISO 14496-12 (http://neuron2.net/library/avc/c041828_ISO_IEC_14496-12_2005(E).pdf)
-#               6) ISO 14496-16 (http://www.iec-normen.de/previewpdf/info_isoiec14496-16%7Bed2.0%7Den.pdf)
-#               7) http://atomicparsley.sourceforge.net/mpeg-4files.html
-#               8) http://wiki.multimedia.cx/index.php?title=QuickTime_container
-#               9) http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart3.pdf (Oct 2008)
-#               10) http://code.google.com/p/mp4v2/wiki/iTunesMetadata
-#               11) http://www.canieti.com.mx/assets/files/1011/IEC_100_1384_DC.pdf
-#               12) QuickTime file format specification 2010-05-03
-#               13) http://www.adobe.com/devnet/flv/pdf/video_file_format_spec_v10.pdf
-#               14) http://standards.iso.org/ittf/PubliclyAvailableStandards/c051533_ISO_IEC_14496-12_2008.zip
-#               15) http://getid3.sourceforge.net/source/module.audio-video.quicktime.phps
+# References:
+#
+#   1) http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html
+#   2) http://search.cpan.org/dist/MP4-Info-1.04/
+#   3) http://www.geocities.com/xhelmboyx/quicktime/formats/mp4-layout.txt
+#   4) http://wiki.multimedia.cx/index.php?title=Apple_QuickTime
+#   5) ISO 14496-12 (http://read.pudn.com/downloads64/ebook/226547/ISO_base_media_file_format.pdf)
+#   6) ISO 14496-16 (http://www.iec-normen.de/previewpdf/info_isoiec14496-16%7Bed2.0%7Den.pdf)
+#   7) http://atomicparsley.sourceforge.net/mpeg-4files.html
+#   8) http://wiki.multimedia.cx/index.php?title=QuickTime_container
+#   9) http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart3.pdf (Oct 2008)
+#   10) http://code.google.com/p/mp4v2/wiki/iTunesMetadata
+#   11) http://www.canieti.com.mx/assets/files/1011/IEC_100_1384_DC.pdf
+#   12) QuickTime file format specification 2010-05-03
+#   13) http://www.adobe.com/devnet/flv/pdf/video_file_format_spec_v10.pdf
+#   14) http://standards.iso.org/ittf/PubliclyAvailableStandards/c051533_ISO_IEC_14496-12_2008.zip
+#   15) http://getid3.sourceforge.net/source/module.audio-video.quicktime.phps
+#   16) http://qtra.apple.com/atoms.html
+#   17) http://www.etsi.org/deliver/etsi_ts/126200_126299/126244/10.01.00_60/ts_126244v100100p.pdf
+#   18) https://github.com/appsec-labs/iNalyzer/blob/master/scinfo.m
+#   19) http://nah6.com/~itsme/cvs-xdadevtools/iphone/tools/decodesinf.pl
+#   20) https://developer.apple.com/legacy/library/documentation/quicktime/reference/QT7-1_Update_Reference/QT7-1_Update_Reference.pdf
 #------------------------------------------------------------------------------
 
 package Image::ExifTool::QuickTime;
 
 use strict;
-use vars qw($VERSION);
+use vars qw($VERSION $AUTOLOAD);
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Exif;
 
-$VERSION = '1.67';
+$VERSION = '1.76';
 
 sub FixWrongFormat($);
 sub ProcessMOV($$;$);
 sub ProcessKeys($$$);
 sub ProcessMetaData($$$);
 sub ProcessEncodingParams($$$);
+sub ProcessHybrid($$$);
+sub ProcessRights($$$);
 sub ConvertISO6709($);
+sub ConvertChapterList($);
+sub PrintChapter($);
 sub PrintGPSCoordinates($);
 sub UnpackLang($);
+sub WriteQuickTime($$$);
+sub WriteMOV($$);
 
 # MIME types for all entries in the ftypLookup with file extensions
 # (defaults to 'video/mp4' if not found in this lookup)
@@ -165,9 +178,15 @@ my %timeInfo = (
         $self->WarnOnce('Patched incorrect time zero for QuickTime date/time tag',1) if $val;
         return $val;
     },
+    Shift => 'Time',
+    Writable => 1,
+    Permanent => 1,
+    DelValue => 0,
     # Note: This value will be in UTC if generated by a system that is aware of the time zone
     ValueConv => 'ConvertUnixTime($val, $self->Options("QuickTimeUTC"))',
+    ValueConvInv => 'GetUnixTime($val, $self->Options("QuickTimeUTC")) + (66 * 365 + 17) * 24 * 3600',
     PrintConv => '$self->ConvertDateTime($val)',
+    PrintConvInv => '$self->InverseDateTime($val)',
     # (can't put Groups here because they aren't constant!)
 );
 # information for duration tags
@@ -207,6 +226,7 @@ my %vendorID = (
     sany => 'Sanyo',
    'SMI '=> 'Sorenson Media Inc.',
     ZORA => 'Zoran Corporation',
+   'AR.D'=> 'Parrot AR.Drone',
 );
 
 # QuickTime data atom encodings for string types (ref 12)
@@ -257,6 +277,7 @@ my %graphicsMode = (
 # QuickTime atoms
 %Image::ExifTool::QuickTime::Main = (
     PROCESS_PROC => \&ProcessMOV,
+    WRITE_PROC => \&WriteQuickTime,
     GROUPS => { 2 => 'Video' },
     NOTES => q{
         The QuickTime format is used for many different types of audio, video and
@@ -265,6 +286,9 @@ my %graphicsMode = (
         proprietary information written by many camera models.  Tags with a question
         mark after their name are not extracted unless the Unknown option is set.
 
+        ExifTool has the ability to write/create XMP, and edit some date/time tags
+        in QuickTime-format files.
+
         According to the specification, many QuickTime date/time tags should be
         stored as UTC.  Unfortunately, digital cameras often store local time values
         instead (presumably because they don't know the time zone).  For this
@@ -272,6 +296,10 @@ my %graphicsMode = (
         However, if the QuickTimeUTC option is set via the API or the ExifTool
         configuration file, then ExifTool will assume these values are properly
         stored as UTC, and will convert them to local time when extracting.
+
+        See
+        L<http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html>
+        for the official specification.
     },
     free => [
         {
@@ -322,10 +350,12 @@ my %graphicsMode = (
             and is used in the AvgBitrate calculation
         },
     },
+    'mdat-offset' => 'MovieDataOffset',
     junk => { Unknown => 1, Binary => 1 }, #8
     uuid => [
         { #9 (MP4 files)
             Name => 'UUID-XMP',
+            # *** this is where ExifTool writes XMP in MP4 videos (as per XMP spec) ***
             Condition => '$$valPt=~/^\xbe\x7a\xcf\xcb\x97\xa9\x42\xe8\x9c\x71\x99\x94\x91\xe3\xaf\xac/',
             SubDirectory => {
                 TagTable => 'Image::ExifTool::XMP::Main',
@@ -342,7 +372,7 @@ my %graphicsMode = (
         },
         { #PH (Flip MP4 files)
             Name => 'UUID-Flip',
-            Condition => '$$valPt=~/\x4a\xb0\x3b\x0f\x61\x8d\x40\x75\x82\xb2\xd9\xfa\xce\xd3\x5f\xf5/',
+            Condition => '$$valPt=~/^\x4a\xb0\x3b\x0f\x61\x8d\x40\x75\x82\xb2\xd9\xfa\xce\xd3\x5f\xf5/',
             SubDirectory => {
                 TagTable => 'Image::ExifTool::QuickTime::Flip',
                 Start => 16,
@@ -355,6 +385,19 @@ my %graphicsMode = (
             Binary => 1,
         },
     ],
+    _htc => {
+        Name => 'HTCInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::HTC' },
+    },
+    udta => {
+        Name => 'UserData',
+        SubDirectory => { TagTable => 'Image::ExifTool::FLIR::UserData' },
+    },
+    thum => { #PH
+        Name => 'ThumbnailImage',
+        Groups => { 2 => 'Image' },
+        Binary => 1,
+    },
 );
 
 # MPEG-4 'ftyp' atom
@@ -377,7 +420,19 @@ my %graphicsMode = (
         Name => 'CompatibleBrands',
         Format => 'undef[$size-8]',
         # ignore any entry with a null, and return others as a list
-        ValueConv => 'my @a=($val=~/.{4}/sg); @a=grep(!/\0/,@a); \@a', 
+        ValueConv => 'my @a=($val=~/.{4}/sg); @a=grep(!/\0/,@a); \@a',
+    },
+);
+
+# proprietary HTC atom (HTC One MP4 video)
+%Image::ExifTool::QuickTime::HTC = (
+    PROCESS_PROC => \&ProcessMOV,
+    GROUPS => { 2 => 'Video' },
+    NOTES => 'Tags written by some HTC camera phones.',
+    slmt => {
+        Name => 'Unknown_slmt',
+        Unknown => 1,
+        Format => 'int32u', # (observed values: 4)
     },
 );
 
@@ -402,7 +457,8 @@ my %graphicsMode = (
 
 # image description data block
 %Image::ExifTool::QuickTime::ImageDesc = (
-    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    PROCESS_PROC => \&ProcessHybrid,
+    VARS => { ID_LABEL => 'ID/Index' },
     GROUPS => { 2 => 'Image' },
     FORMAT => 'int16u',
     2 => {
@@ -461,11 +517,76 @@ my %graphicsMode = (
         },
     },
     41 => 'BitDepth',
+#
+# Observed offsets for child atoms of various CompressorID types:
+#
+#   CompressorID  Offset  Child atoms
+#   -----------   ------  ----------------
+#   avc1          86      avcC, btrt, colr, pasp, fiel, clap, svcC
+#   mp4v          86      esds, pasp
+#   s263          86      d263
+#
+    btrt => {
+        Name => 'BitrateInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Bitrate' },
+    },
+    # Reference for fiel, colr, pasp, clap:
+    # https://developer.apple.com/library/mac/technotes/tn2162/_index.html#//apple_ref/doc/uid/DTS40013070-CH1-TNTAG9
+    fiel => {
+        Name => 'VideoFieldOrder',
+        ValueConv => 'join(" ", unpack("C*",$val))',
+        PrintConv => [{
+            1 => 'Progressive',
+            2 => '2:1 Interlaced',
+        }],
+    },
+    colr => {
+        Name => 'ColorRepresentation',
+        ValueConv => 'join(" ", substr($val,0,4), unpack("x4n*",$val))',
+    },
+    pasp => {
+        Name => 'PixelAspectRatio',
+        ValueConv => 'join(":", unpack("N*",$val))',
+    },
+    clap => {
+        Name => 'CleanAperture',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::CleanAperture' },
+    },
+    # avcC - AVC configuration (ref http://thompsonng.blogspot.ca/2010/11/mp4-file-format-part-2.html)
+    # svcC - 7 bytes: 00 00 00 00 ff e0 00
+    # esds - elementary stream descriptor
+    # d263
+    gama => { Name => 'Gamma', Format => 'fixed32u' },
+    # mjqt - default quantization table for MJPEG
+    # mjht - default Huffman table for MJPEG
+);
+
+# 'btrt' atom information (ref http://lists.freedesktop.org/archives/gstreamer-commits/2011-October/054459.html)
+%Image::ExifTool::QuickTime::Bitrate = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Video' },
+    FORMAT => 'int32u',
+    PRIORITY => 0, # often filled with zeros
+    0 => 'BufferSize',
+    1 => 'MaxBitrate',
+    2 => 'AverageBitrate',
+);
+
+# 'clap' atom information (ref https://developer.apple.com/library/mac/technotes/tn2162/_index.html#//apple_ref/doc/uid/DTS40013070-CH1-TNTAG9)
+%Image::ExifTool::QuickTime::CleanAperture = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Video' },
+    FORMAT => 'rational64u',
+    0 => 'CleanApertureWidth',
+    1 => 'CleanApertureHeight',
+    2 => 'CleanApertureOffsetX',
+    3 => 'CleanApertureOffsetY',
 );
 
 # preview data block
 %Image::ExifTool::QuickTime::Preview = (
     PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
     GROUPS => { 2 => 'Image' },
     FORMAT => 'int16u',
     0 => {
@@ -485,6 +606,7 @@ my %graphicsMode = (
 # movie atoms
 %Image::ExifTool::QuickTime::Movie = (
     PROCESS_PROC => \&ProcessMOV,
+    WRITE_PROC => \&WriteQuickTime,
     GROUPS => { 2 => 'Video' },
     mvhd => {
         Name => 'MovieHeader',
@@ -515,6 +637,14 @@ my %graphicsMode = (
                 Start => 16,
             },
         },
+        { #PH (Canon SX280)
+            Name => 'UUID-Canon',
+            Condition => '$$valPt=~/^\x85\xc0\xb6\x87\x82\x0f\x11\xe0\x81\x11\xf4\xce\x46\x2b\x6a\x48/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::uuid',
+                Start => 16,
+            },
+        },
         {
             Name => 'UUID-Unknown',
             Unknown => 1,
@@ -533,8 +663,10 @@ my %graphicsMode = (
 # movie header data block
 %Image::ExifTool::QuickTime::MovieHeader = (
     PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
     GROUPS => { 2 => 'Video' },
     FORMAT => 'int32u',
+    DATAMEMBER => [ 0, 1, 2, 3, 4 ],
     0 => {
         Name => 'MovieHeaderVersion',
         Format => 'int8u',
@@ -596,7 +728,8 @@ my %graphicsMode = (
 # track atoms
 %Image::ExifTool::QuickTime::Track = (
     PROCESS_PROC => \&ProcessMOV,
-    GROUPS => { 2 => 'Video' },
+    WRITE_PROC => \&WriteQuickTime,
+    GROUPS => { 1 => 'Track#', 2 => 'Video' },
     tkhd => {
         Name => 'TrackHeader',
         SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::TrackHeader' },
@@ -647,8 +780,10 @@ my %graphicsMode = (
 # track header data block
 %Image::ExifTool::QuickTime::TrackHeader = (
     PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
     GROUPS => { 1 => 'Track#', 2 => 'Video' },
     FORMAT => 'int32u',
+    DATAMEMBER => [ 0, 1, 2, 5 ],
     0 => {
         Name => 'TrackHeaderVersion',
         Format => 'int8u',
@@ -719,6 +854,7 @@ my %graphicsMode = (
 # user data atoms
 %Image::ExifTool::QuickTime::UserData = (
     PROCESS_PROC => \&ProcessMOV,
+    WRITE_PROC => \&WriteQuickTime,
     GROUPS => { 2 => 'Video' },
     NOTES => q{
         Tag ID's beginning with the copyright symbol (hex 0xa9) are multi-language
@@ -819,23 +955,196 @@ my %graphicsMode = (
             Start => 4, # must skip 4-byte version number header
         },
     },
-    DcMD => {
-        Name => 'KodakDcMD',
-        SubDirectory => { TagTable => 'Image::ExifTool::Kodak::DcMD' },
-    },
-    # AMBA => Ambarella AVC atom (unknown data written by Kodak Playsport video cam)
    'ptv '=> {
         Name => 'PrintToVideo',
         SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Video' },
     },
-   'hnti'=> {
+    hnti => {
         Name => 'HintInfo',
         SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::HintInfo' },
     },
-   'hinf' => {
+    hinf => {
         Name => 'HintTrackInfo',
         SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::HintTrackInfo' },
     },
+    hinv => 'HintVersion', #PH (guess)
+    XMP_ => { #PH (Adobe CS3 Bridge)
+        Name => 'XMP',
+        # *** this is where ExifTool writes XMP in MOV videos (as per XMP spec) ***
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
+    },
+    # the following are 3gp tags, references:
+    # http://atomicparsley.sourceforge.net
+    # http://www.3gpp.org/ftp/tsg_sa/WG4_CODEC/TSGS4_25/Docs/
+    cprt => { Name => 'Copyright',  %langText, Groups => { 2 => 'Author' } },
+    auth => { Name => 'Author',     %langText, Groups => { 2 => 'Author' } },
+    titl => { Name => 'Title',      %langText },
+    dscp => { Name => 'Description',%langText },
+    perf => { Name => 'Performer',  %langText },
+    gnre => { Name => 'Genre',      %langText },
+    albm => { Name => 'Album',      %langText },
+    coll => { Name => 'CollectionName', %langText }, #17
+    rtng => {
+        Name => 'Rating',
+        # (4-byte flags, 4-char entity, 4-char criteria, 2-byte lang, string)
+        RawConv => q{
+            return '<err>' unless length $val >= 14;
+            my $str = 'Entity=' . substr($val,4,4) . ' Criteria=' . substr($val,8,4);
+            $str =~ tr/\0-\x1f\x7f-\xff//d; # remove unprintable characters
+            my $lang = Image::ExifTool::QuickTime::UnpackLang(Get16u(\$val, 12));
+            $lang = $lang ? "($lang) " : '';
+            $val = substr($val, 14);
+            $val = $self->Decode($val, 'UCS2') if $val =~ /^\xfe\xff/;
+            return $lang . $str . ' ' . $val;
+        },
+    },
+    clsf => {
+        Name => 'Classification',
+        # (4-byte flags, 4-char entity, 2-byte index, 2-byte lang, string)
+        RawConv => q{
+            return '<err>' unless length $val >= 12;
+            my $str = 'Entity=' . substr($val,4,4) . ' Index=' . Get16u(\$val,8);
+            $str =~ tr/\0-\x1f\x7f-\xff//d; # remove unprintable characters
+            my $lang = Image::ExifTool::QuickTime::UnpackLang(Get16u(\$val, 10));
+            $lang = $lang ? "($lang) " : '';
+            $val = substr($val, 12);
+            $val = $self->Decode($val, 'UCS2') if $val =~ /^\xfe\xff/;
+            return $lang . $str . ' ' . $val;
+        },
+    },
+    kywd => {
+        Name => 'Keywords',
+        # (4 byte flags, 2-byte lang, 1-byte count, count x pascal strings)
+        RawConv => q{
+            return '<err>' unless length $val >= 7;
+            my $lang = Image::ExifTool::QuickTime::UnpackLang(Get16u(\$val, 4));
+            $lang = $lang ? "($lang) " : '';
+            my $num = Get8u(\$val, 6);
+            my ($i, @vals);
+            my $pos = 7;
+            for ($i=0; $i<$num; ++$i) {
+                last if $pos >= length $val;
+                my $len = Get8u(\$val, $pos++);
+                last if $pos + $len > length $val;
+                my $v = substr($val, $pos, $len);
+                $v = $self->Decode($v, 'UCS2') if $v =~ /^\xfe\xff/;
+                push @vals, $v;
+                $pos += $len;
+            }
+            my $sep = $self->Options('ListSep');
+            return $lang . join($sep, @vals);
+        },
+    },
+    loci => {
+        Name => 'LocationInformation',
+        Groups => { 2 => 'Location' },
+        # (4-byte flags, 2-byte lang, location string, 1-byte role, 4-byte fixed longitude,
+        #  4-byte fixed latitude, 4-byte fixed altitude, body string, notes string)
+        RawConv => q{
+            return '<err>' unless length $val >= 6;
+            my $lang = Image::ExifTool::QuickTime::UnpackLang(Get16u(\$val, 4));
+            $lang = $lang ? "($lang) " : '';
+            $val = substr($val, 6);
+            my $str;
+            if ($val =~ /^\xfe\xff/) {
+                $val =~ s/^(\xfe\xff(.{2})*?)\0\0//s or return '<err>';
+                $str = $self->Decode($1, 'UCS2');
+            } else {
+                $val =~ s/^(.*?)\0//s or return '<err>';
+                $str = $1;
+            }
+            $str = '(none)' unless length $str;
+            return '<err>' if length $val < 13;
+            my $role = Get8u(\$val, 0);
+            my $lon = GetFixed32s(\$val, 1);
+            my $lat = GetFixed32s(\$val, 5);
+            my $alt = GetFixed32s(\$val, 9);
+            my $roleStr = {0=>'shooting',1=>'real',2=>'fictional',3=>'reserved'}->{$role};
+            $str .= ' Role=' . ($roleStr || "unknown($role)");
+            $str .= sprintf(' Lat=%.5f Lon=%.5f Alt=%.2f', $lat, $lon, $alt);
+            $val = substr($val, 13);
+            if ($val =~ s/^(\xfe\xff(.{2})*?)\0\0//s) {
+                $str .= ' Body=' . $self->Decode($1, 'UCS2');
+            } elsif ($val =~ s/^(.*?)\0//s) {
+                $str .= " Body=$1";
+            }
+            if ($val =~ s/^(\xfe\xff(.{2})*?)\0\0//s) {
+                $str .= ' Notes=' . $self->Decode($1, 'UCS2');
+            } elsif ($val =~ s/^(.*?)\0//s) {
+                $str .= " Notes=$1";
+            }
+            return $lang . $str;
+        },
+    },
+    yrrc => {
+        Name => 'Year',
+        Groups => { 2 => 'Time' },
+        RawConv => 'length($val) >= 6 ? Get16u(\$val,4) : "<err>"',
+    },
+    urat => { #17
+        Name => 'UserRating',
+        RawConv => q{
+            return '<err>' unless length $val >= 8;
+            return Get8u(\$val, 7);
+        },
+    },
+    # tsel - TrackSelection (ref 17)
+    # Apple tags (ref 16)
+    angl => { Name => 'CameraAngle',  Format => 'string' }, # (NC)
+    clfn => { Name => 'ClipFileName', Format => 'string' }, # (NC)
+    clid => { Name => 'ClipID',       Format => 'string' }, # (NC)
+    cmid => { Name => 'CameraID',     Format => 'string' }, # (NC)
+    cmnm => { # (NC)
+        Name => 'Model',
+        Description => 'Camera Model Name',
+        Format => 'string', # (necessary to remove the trailing NULL)
+    },
+    date => { # (NC)
+        Name => 'DateTimeOriginal',
+        Groups => { 2 => 'Time' },
+        ValueConv => q{
+            require Image::ExifTool::XMP;
+            $val =  Image::ExifTool::XMP::ConvertXMPDate($val);
+            $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
+            return $val;
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    manu => { # (SX280)
+        Name => 'Make',
+        # (with Canon there are 6 unknown bytes before the model: "\0\0\0\0\x15\xc7")
+        RawConv => '$val=~s/^\0{4}..//s; $val=~s/\0.*//; $val',
+    },
+    modl => { # (Samsung GT-S8530, Canon SX280)
+        Name => 'Model',
+        Description => 'Camera Model Name',
+        # (with Canon there are 6 unknown bytes before the model: "\0\0\0\0\x15\xc7")
+        RawConv => '$val=~s/^\0{4}..//s; $val=~s/\0.*//; $val',
+    },
+    reel => { Name => 'ReelName',     Format => 'string' }, # (NC)
+    scen => { Name => 'Scene',        Format => 'string' }, # (NC)
+    shot => { Name => 'ShotName',     Format => 'string' }, # (NC)
+    slno => { Name => 'SerialNumber', Format => 'string' }, # (NC)
+    apmd => { Name => 'ApertureMode', Format => 'undef' }, #20
+    kgtt => { #http://lists.ffmpeg.org/pipermail/ffmpeg-devel-irc/2012-June/000707.html
+        # 'TrackType' will expand to 'Track#Type' when found inside a track
+        Name => 'TrackType',
+        # set flag to process this as international text
+        # even though the tag ID doesn't start with 0xa9
+        IText => 1,
+    },
+    chpl => { # (Nero chapter list)
+        Name => 'ChapterList',
+        ValueConv => \&ConvertChapterList,
+        PrintConv => \&PrintChapter,
+    },
+    # ndrm - 7 bytes (0 0 0 1 0 0 0) Nero Digital Rights Management? (PH)
+    # other non-Apple tags (ref 16)
+    # hpix - HipixRichPicture (ref 16, HIPIX)
+    # strk - sub-track information (ref 16, ISO)
+#
+# Manufacturer-specific metadata
+#
     TAGS => [ #PH
         # these tags were initially discovered in a Pentax movie,
         # but similar information is found in videos from other manufacturers
@@ -955,10 +1264,21 @@ my %graphicsMode = (
             Binary => 1
         },
     ],
-    NCDT => { #PH
-        Name => 'NikonNCDT',
-        SubDirectory => { TagTable => 'Image::ExifTool::Nikon::NCDT' },
+    # ---- Canon ----
+    CNCV => { Name => 'CompressorVersion', Format => 'string' }, #PH (5D Mark II)
+    CNMN => {
+        Name => 'Model', #PH (EOS 550D)
+        Description => 'Camera Model Name',
+        Format => 'string', # (necessary to remove the trailing NULL)
+    },
+    CNFV => { Name => 'FirmwareVersion', Format => 'string' }, #PH (EOS 550D)
+    CNTH => { #PH (PowerShot S95)
+        Name => 'CanonCNTH',
+        SubDirectory => { TagTable => 'Image::ExifTool::Canon::CNTH' },
     },
+    # CNDB - 2112 bytes (550D)
+    # CNDM - 4 bytes - 0xff,0xd8,0xff,0xd9 (S95)
+    # ---- Casio ----
     QVMI => { #PH
         Name => 'CasioQVMI',
         # Casio stores standard EXIF-format information in MOV videos (ie. EX-S880)
@@ -971,49 +1291,7 @@ my %graphicsMode = (
             ByteOrder => 'BigEndian',
         },
     },
-    PANA => { #PH
-        Name => 'PanasonicPANA',
-        SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::PANA' },
-    },
-    LEIC => { #PH
-        Name => 'LeicaLEIC',
-        SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::PANA' },
-    },
-    PENT => { #PH
-        Name => 'PentaxPENT',
-        SubDirectory => {
-            TagTable => 'Image::ExifTool::Pentax::PENT',
-            ByteOrder => 'LittleEndian',
-        },
-    },
-    MMA0 => { #PH (DiMage 7Hi)
-        Name => 'MinoltaMMA0',
-        SubDirectory => { TagTable => 'Image::ExifTool::Minolta::MMA' },
-    },
-    MMA1 => { #PH (Dimage A2)
-        Name => 'MinoltaMMA1',
-        SubDirectory => { TagTable => 'Image::ExifTool::Minolta::MMA' },
-    },
-    XMP_ => { #PH (Adobe CS3 Bridge)
-        Name => 'XMP',
-        SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
-    },
-    vndr => 'Vendor', #PH (Samsung PL70)
-    SDLN => 'PlayMode', #PH (NC, Samsung ST80 "SEQ_PLAY")
-    # Canon tags
-    CNCV => 'CompressorVersion', #PH (5D Mark II)
-    CNMN => 'Model', #PH (EOS 550D)
-    CNFV => 'FirmwareVersion', #PH (EOS 550D)
-    CNTH => { #PH (PowerShot S95)
-        Name => 'CanonCNTH',
-        SubDirectory => { TagTable => 'Image::ExifTool::Canon::CNTH' },
-    },
-    # CNDB - 2112 bytes (550D)
-    # CNDM - 4 bytes - 0xff,0xd8,0xff,0xd9 (S95)
-    INFO => {
-        Name => 'SamsungINFO',
-        SubDirectory => { TagTable => 'Image::ExifTool::Samsung::INFO' },
-    },
+    # ---- FujiFilm ----
     FFMV => { #PH (FinePix HS20EXR)
         Name => 'FujiFilmFFMV',
         SubDirectory => { TagTable => 'Image::ExifTool::FujiFilm::FFMV' },
@@ -1029,12 +1307,50 @@ my %graphicsMode = (
             ByteOrder => 'LittleEndian',
         },
     },
+    # ---- GoPro ----
+    GoPr => 'GoProType', #PH
+    # ---- Kodak ----
+    DcMD => {
+        Name => 'KodakDcMD',
+        SubDirectory => { TagTable => 'Image::ExifTool::Kodak::DcMD' },
+    },
+    # AMBA => Ambarella AVC atom (unknown data written by Kodak Playsport video cam)
+    # ---- Microsoft ----
     Xtra => { #PH (microsoft)
         Name => 'MicrosoftXtra',
         SubDirectory => { TagTable => 'Image::ExifTool::Microsoft::Xtra' },
     },
-    hinv => 'HintVersion', #PH (guess)
-    thmb => [
+    # ---- Minolta ----
+    MMA0 => { #PH (DiMage 7Hi)
+        Name => 'MinoltaMMA0',
+        SubDirectory => { TagTable => 'Image::ExifTool::Minolta::MMA' },
+    },
+    MMA1 => { #PH (Dimage A2)
+        Name => 'MinoltaMMA1',
+        SubDirectory => { TagTable => 'Image::ExifTool::Minolta::MMA' },
+    },
+    # ---- Nikon ----
+    NCDT => { #PH
+        Name => 'NikonNCDT',
+        SubDirectory => { TagTable => 'Image::ExifTool::Nikon::NCDT' },
+    },
+    # ---- Olympus ----
+    scrn => { #PH (TG-810)
+        Name => 'OlympusPreview',
+        Condition => '$$valPt =~ /^.{4}\xff\xd8\xff\xdb/s',
+        SubDirectory => { TagTable => 'Image::ExifTool::Olympus::scrn' },
+    },
+    # ---- Panasonic/Leica ----
+    PANA => { #PH
+        Name => 'PanasonicPANA',
+        SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::PANA' },
+    },
+    LEIC => { #PH
+        Name => 'LeicaLEIC',
+        SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::PANA' },
+    },
+    # ---- Pentax ----
+    thmb => [ # (apparently defined by 3gpp, ref 16)
         { #PH (Pentax Q)
             Name => 'MakerNotePentax5a',
             Condition => '$$valPt =~ /^PENTAX \0II/',
@@ -1049,12 +1365,25 @@ my %graphicsMode = (
             Name => 'OlympusThumbnail',
             Condition => '$$valPt =~ /^.{4}\xff\xd8\xff\xdb/s',
             SubDirectory => { TagTable => 'Image::ExifTool::Olympus::thmb' },
+        },{ #17 (format is in bytes 3-7)
+            Name => 'ThumbnailImage',
+            Condition => '$$valPt =~ /^.{8}\xff\xd8\xff\xdb/s',
+            ValueConv => 'substr($val, 8)',
+        },{ #17 (format is in bytes 3-7)
+            Name => 'ThumbnailPNG',
+            Condition => '$$valPt =~ /^.{8}\x89PNG\r\n\x1a\n/s',
+            ValueConv => 'substr($val, 8)',
+        },{
+            Name => 'UnknownThumbnail',
+            Binary => 1,
         },
     ],
-    scrn => { #PH (TG-810)
-        Name => 'OlympusPreview',
-        Condition => '$$valPt =~ /^.{4}\xff\xd8\xff\xdb/s',
-        SubDirectory => { TagTable => 'Image::ExifTool::Olympus::scrn' },
+    PENT => { #PH
+        Name => 'PentaxPENT',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Pentax::PENT',
+            ByteOrder => 'LittleEndian',
+        },
     },
     PXTH => { #PH (Pentax K-01)
         Name => 'PentaxPreview',
@@ -1071,121 +1400,45 @@ my %graphicsMode = (
             ByteOrder => 'BigEndian',
         },
     },
-    modl => { #PH (Samsung GT-S8530)
-        Name => 'Model',
-        Description => 'Camera Model Name',
-    },
-    # ducp - 4 bytes, all zero (Samsung ST96,WB750)
-    GoPr => 'GoProType', #PH
-    # the following are 3gp tags, references:
-    # http://atomicparsley.sourceforge.net
-    # http://www.3gpp.org/ftp/tsg_sa/WG4_CODEC/TSGS4_25/Docs/
-    cprt => { Name => 'Copyright',  %langText, Groups => { 2 => 'Author' } },
-    auth => { Name => 'Author',     %langText, Groups => { 2 => 'Author' } },
-    titl => { Name => 'Title',      %langText },
-    dscp => { Name => 'Description',%langText },
-    perf => { Name => 'Performer',  %langText },
-    gnre => { Name => 'Genre',      %langText },
-    albm => { Name => 'Album',      %langText },
-    rtng => {
-        Name => 'Rating',
-        # (4-byte flags, 4-char entity, 4-char criteria, 2-byte lang, string)
-        RawConv => q{
-            return '<err>' unless length $val >= 14;
-            my $str = 'Entity=' . substr($val,4,4) . ' Criteria=' . substr($val,8,4);
-            $str =~ tr/\0-\x1f\x7f-\xff//d; # remove unprintable characters
-            my $lang = Image::ExifTool::QuickTime::UnpackLang(Get16u(\$val, 12));
-            $lang = $lang ? "($lang) " : '';
-            $val = substr($val, 14);
-            $val = $self->Decode($val, 'UCS2') if $val =~ /^\xfe\xff/;
-            return $lang . $str . ' ' . $val;
-        },
+    # ---- Ricoh ----
+    RTHU => { #PH (GR)
+        Name => 'PreviewImage',
+        RawConv => '$self->ValidateImage(\$val, $tag)',
     },
-    clsf => {
-        Name => 'Classification',
-        # (4-byte flags, 4-char entity, 2-byte index, 2-byte lang, string)
-        RawConv => q{
-            return '<err>' unless length $val >= 12;
-            my $str = 'Entity=' . substr($val,4,4) . ' Index=' . Get16u(\$val,8);
-            $str =~ tr/\0-\x1f\x7f-\xff//d; # remove unprintable characters
-            my $lang = Image::ExifTool::QuickTime::UnpackLang(Get16u(\$val, 10));
-            $lang = $lang ? "($lang) " : '';
-            $val = substr($val, 12);
-            $val = $self->Decode($val, 'UCS2') if $val =~ /^\xfe\xff/;
-            return $lang . $str . ' ' . $val;
+    RMKN => { #PH (GR)
+        Name => 'RicohRMKN',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Exif::Main',
+            ProcessProc => \&Image::ExifTool::ProcessTIFF, # (because ProcessMOV is default)
         },
     },
-    kywd => {
-        Name => 'Keywords',
-        # (4 byte flags, 2-byte lang, 1-byte count, count x pascal strings)
-        RawConv => q{
-            return '<err>' unless length $val >= 7;
-            my $lang = Image::ExifTool::QuickTime::UnpackLang(Get16u(\$val, 4));
-            $lang = $lang ? "($lang) " : '';
-            my $num = Get8u(\$val, 6);
-            my ($i, @vals);
-            my $pos = 7;
-            for ($i=0; $i<$num; ++$i) {
-                last if $pos >= length $val;
-                my $len = Get8u(\$val, $pos++);
-                last if $pos + $len > length $val;
-                my $v = substr($val, $pos, $len);
-                $v = $self->Decode($v, 'UCS2') if $v =~ /^\xfe\xff/;
-                push @vals, $v;
-                $pos += $len;
-            }
-            my $sep = $self->Options('ListSep');
-            return $lang . join($sep, @vals);
-        },
+    # ---- Samsung ----
+    vndr => 'Vendor', #PH (Samsung PL70)
+    SDLN => 'PlayMode', #PH (NC, Samsung ST80 "SEQ_PLAY")
+    INFO => {
+        Name => 'SamsungINFO',
+        SubDirectory => { TagTable => 'Image::ExifTool::Samsung::INFO' },
     },
-    loci => {
-        Name => 'LocationInformation',
-        Groups => { 2 => 'Location' },
-        # (4-byte flags, 2-byte lang, location string, 1-byte role, 4-byte fixed longitude,
-        #  4-byte fixed latitude, 4-byte fixed altitude, body string, notes string)
-        RawConv => q{
-            return '<err>' unless length $val >= 6;
-            my $lang = Image::ExifTool::QuickTime::UnpackLang(Get16u(\$val, 4));
-            $lang = $lang ? "($lang) " : '';
-            $val = substr($val, 6);
-            my $str;
-            if ($val =~ /^\xfe\xff/) {
-                $val =~ s/^(\xfe\xff(.{2})*?)\0\0//s or return '<err>';
-                $str = $self->Decode($1, 'UCS2');
-            } else {
-                $val =~ s/^(.*?)\0//s or return '<err>';
-                $str = $1;
-            }
-            $str = '(none)' unless length $str;
-            return '<err>' if length $val < 13;
-            my $role = Get8u(\$val, 0);
-            my $lon = GetFixed32s(\$val, 1);
-            my $lat = GetFixed32s(\$val, 5);
-            my $alt = GetFixed32s(\$val, 9);
-            my $roleStr = {0=>'shooting',1=>'real',2=>'fictional',3=>'reserved'}->{$role};
-            $str .= ' Role=' . ($roleStr || "unknown($role)");
-            $str .= sprintf(' Lat=%.5f Lon=%.5f Alt=%.2f', $lat, $lon, $alt);
-            $val = substr($val, 13);
-            if ($val =~ s/^(\xfe\xff(.{2})*?)\0\0//s) {
-                $str .= ' Body=' . $self->Decode($1, 'UCS2');
-            } elsif ($val =~ s/^(.*?)\0//s) {
-                $str .= " Body=$1";
-            }
-            if ($val =~ s/^(\xfe\xff(.{2})*?)\0\0//s) {
-                $str .= ' Notes=' . $self->Decode($1, 'UCS2');
-            } elsif ($val =~ s/^(.*?)\0//s) {
-                $str .= " Notes=$1";
-            }
-            return $lang . $str;
+    # ducp - 4 bytes all zero (Samsung ST96,WB750), 52 bytes all zero (Samsung WB30F)
+    # edli - 52 bytes all zero (Samsung WB30F)
+    # @etc - 4 bytes all zero (Samsung WB30F)
+    # saut - 4 bytes all zero (Samsung SM-N900T)
+    # smrd - string "TRUEBLUE" (Samsung SM-C101)
+   '@sec' => { #PH (Samsung WB30F)
+        Name => 'SamsungSec',
+        SubDirectory => { TagTable => 'Image::ExifTool::Samsung::sec' },
+    },
+    'smta' => { #PH (Samsung SM-C101)
+        Name => 'SamsungSmta',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Samsung::smta',
+            Start => 4,
         },
     },
-    yrrc => {
-        Name => 'Year',
-        Groups => { 2 => 'Time' },
-        RawConv => 'length($val) >= 6 ? Get16u(\$val,4) : "<err>"',
-    },
-    # the following are various 3rd-party tags
-    # ref http://code.google.com/p/mp4parser/source/browse/trunk/isoparser/src/main/resources/isoparser-default.properties?r=814
+#
+# other 3rd-party tags
+# (ref http://code.google.com/p/mp4parser/source/browse/trunk/isoparser/src/main/resources/isoparser-default.properties?r=814)
+#
     ccid => 'ContentID',
     icnu => 'IconURI',
     infu => 'InfoURL',
@@ -1427,6 +1680,7 @@ my %graphicsMode = (
     },
    'xml ' => {
         Name => 'XML',
+        Flags => [ 'Binary', 'Protected', 'BlockExtract' ],
         SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
     },
    'keys' => {
@@ -1450,9 +1704,14 @@ my %graphicsMode = (
 # track reference atoms
 %Image::ExifTool::QuickTime::TrackRef = (
     PROCESS_PROC => \&ProcessMOV,
-    GROUPS => { 2 => 'Video' },
-    chap => { Name => 'ChapterList', Format => 'int32u' },
+    GROUPS => { 1 => 'Track#', 2 => 'Video' },
+    chap => { Name => 'ChapterListTrackID', Format => 'int32u' },
     tmcd => { Name => 'TimeCode', Format => 'int32u' },
+    mpod => { #PH (FLIR MP4)
+        Name => 'ElementaryStreamTrack',
+        Format => 'int32u',
+        ValueConv => '$val =~ s/^1 //; $val',  # (why 2 numbers? -- ignore the first if "1")
+    },
     # also: sync, scpt, ssrc, iTunesInfo
 );
 
@@ -1460,7 +1719,7 @@ my %graphicsMode = (
 # (ref https://developer.apple.com/library/mac/#documentation/QuickTime/QTFF/QTFFChap2/qtff2.html)
 %Image::ExifTool::QuickTime::TrackAperture = (
     PROCESS_PROC => \&ProcessMOV,
-    GROUPS => { 2 => 'Video' },
+    GROUPS => { 1 => 'Track#', 2 => 'Video' },
     clef => {
         Name => 'CleanApertureDimensions',
         Format => 'fixed32u',
@@ -1677,6 +1936,13 @@ my %graphicsMode = (
         Description => 'iTunes U',
         PrintConv => { 0 => 'No', 1 => 'Yes' },
     },
+    #https://github.com/communitymedia/mediautilities/blob/master/src/net/sourceforge/jaad/mp4/boxes/BoxTypes.java
+    gshh => { Name => 'GoogleHostHeader',   Format => 'string' },
+    gspm => { Name => 'GooglePingMessage',  Format => 'string' },
+    gspu => { Name => 'GooglePingURL',      Format => 'string' },
+    gssd => { Name => 'GoogleSourceData',   Format => 'string' },
+    gsst => { Name => 'GoogleStartTime',    Format => 'string' },
+    gstd => { Name => 'GoogleTrackDuration',Format => 'string' },
 );
 
 # item list keys (ref PH)
@@ -1849,7 +2115,7 @@ my %graphicsMode = (
     GROUPS => { 2 => 'Audio' },
     # (I have commented out the ones that don't have integer values because they
     #  probably don't appear, and definitly wouldn't work with current decoding - PH)
-    
+
     # global codec properties
     #'lnam' => 'AudioCodecName',
     #'lmak' => 'AudioCodecManufacturer',
@@ -1995,7 +2261,8 @@ my %graphicsMode = (
 # MP4 media box (ref 5)
 %Image::ExifTool::QuickTime::Media = (
     PROCESS_PROC => \&ProcessMOV,
-    GROUPS => { 2 => 'Video' },
+    WRITE_PROC => \&WriteQuickTime,
+    GROUPS => { 1 => 'Track#', 2 => 'Video' },
     NOTES => 'MP4 media box.',
     mdhd => {
         Name => 'MediaHeader',
@@ -2014,8 +2281,10 @@ my %graphicsMode = (
 # MP4 media header box (ref 5)
 %Image::ExifTool::QuickTime::MediaHeader = (
     PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
-    GROUPS => { 2 => 'Video' },
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    GROUPS => { 1 => 'Track#', 2 => 'Video' },
     FORMAT => 'int32u',
+    DATAMEMBER => [ 0, 1, 2, 3, 4 ],
     0 => {
         Name => 'MediaHeaderVersion',
         RawConv => '$$self{MediaHeaderVersion} = $val',
@@ -2062,7 +2331,7 @@ my %graphicsMode = (
 # MP4 media information box (ref 5)
 %Image::ExifTool::QuickTime::MediaInfo = (
     PROCESS_PROC => \&ProcessMOV,
-    GROUPS => { 2 => 'Video' },
+    GROUPS => { 1 => 'Track#', 2 => 'Video' },
     NOTES => 'MP4 media info box.',
     vmhd => {
         Name => 'VideoHeader',
@@ -2246,53 +2515,212 @@ my %graphicsMode = (
     },
 );
 
-# MP4 audio sample description box (ref 5)
+# MP4 audio sample description box (ref 5/AtomicParsley 0.9.4 parsley.cpp)
 %Image::ExifTool::QuickTime::AudioSampleDesc = (
-    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    PROCESS_PROC => \&ProcessHybrid,
+    VARS => { ID_LABEL => 'ID/Index' },
     GROUPS => { 2 => 'Audio' },
-    FORMAT => 'int16u',
-    NOTES => 'MP4 audio sample description.',
-    2  => {
+    NOTES => q{
+        MP4 audio sample description.  This hybrid atom contains both data and child
+        atoms.
+    },
+    4  => {
         Name => 'AudioFormat',
         Format => 'undef[4]',
         RawConv => q{
+            $$self{AudioFormat} = $val;
             return undef unless $val =~ /^[\w ]{4}$/i;
             # check for protected audio format
             $self->OverrideFileType('M4P') if $val eq 'drms' and $$self{VALUE}{FileType} eq 'M4A';
             return $val;
         },
     },
-    10 => { #PH
+    20 => { #PH
         Name => 'AudioVendorID',
+        Condition => '$$self{AudioFormat} ne "mp4s"',
         Format => 'undef[4]',
         RawConv => '$val eq "\0\0\0\0" ? undef : $val',
         PrintConv => \%vendorID,
         SeparateTable => 'VendorID',
     },
-    12 => 'AudioChannels',
-    13 => 'AudioBitsPerSample',
-    16 => { Name => 'AudioSampleRate', Format => 'fixed32u' },
-    28 => { #PH
-        Name => 'AudioFormat',
+    24 => { Name => 'AudioChannels',        Format => 'int16u' },
+    26 => { Name => 'AudioBitsPerSample',   Format => 'int16u' },
+    32 => { Name => 'AudioSampleRate',      Format => 'fixed32u' },
+#
+# Observed offsets for child atoms of various AudioFormat types:
+#
+#   AudioFormat  Offset  Child atoms
+#   -----------  ------  ----------------
+#   mp4a         52 *    wave, chan, esds
+#   in24         52      wave, chan
+#   "ms\0\x11"   52      wave
+#   sowt         52      chan
+#   mp4a         36 *    esds, pinf
+#   drms         36      esds, sinf
+#   samr         36      damr
+#   alac         36      alac
+#   ac-3         36      dac3
+#
+# (* child atoms found at different offsets in mp4a)
+#
+    pinf => {
+        Name => 'PurchaseInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ProtectionInfo' },
+    },
+    sinf => { # "protection scheme information"
+        Name => 'ProtectionInfo', #3
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ProtectionInfo' },
+    },
+    # chan - 16/36 bytes
+    # esds - 31/40/42/43 bytes - ES descriptor (ref 3)
+    damr => { #3
+        Name => 'DecodeConfig',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::DecodeConfig' },
+    },
+    wave => {
+        Name => 'Wave',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Wave' },
+    },
+    # alac - 28 bytes
+);
+
+# AMR decode config box (ref 3)
+%Image::ExifTool::QuickTime::DecodeConfig = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Audio' },
+    0 => {
+        Name => 'EncoderVendor',
         Format => 'undef[4]',
-        RawConv => '$val =~ /^[\w ]{4}$/i ? $val : undef',
-        Notes => 'in Casio MOV videos',
     },
+    4 => 'EncoderVersion',
+    # 5 - int16u - packet modes
+    # 7 - int8u - number of packet mode changes
+    # 8 - int8u - bytes per packet
+);
+
+%Image::ExifTool::QuickTime::ProtectionInfo = (
+    PROCESS_PROC => \&ProcessMOV,
+    GROUPS => { 2 => 'Audio' },
+    NOTES => 'Child atoms found in "sinf" and/or "pinf" atoms.',
+    frma => 'OriginalFormat',
+    # imif - IPMP information
+    schm => {
+        Name => 'SchemeType',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::SchemeType' },
+    },
+    schi => {
+        Name => 'SchemeInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::SchemeInfo' },
+    },
+    # skcr
+    # enda
+);
+
+%Image::ExifTool::QuickTime::Wave = (
+    PROCESS_PROC => \&ProcessMOV,
+    frma => 'PurchaseFileFormat',
+    # "ms\0\x11" - 20 bytes
+);
+
+# scheme type atom
+# ref http://xhelmboyx.tripod.com/formats/mp4-layout.txt
+%Image::ExifTool::QuickTime::SchemeType = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Audio' },
+    # 0 - 4 bytes version
+    4 => { Name => 'SchemeType',    Format => 'undef[4]' },
+    8 => { Name => 'SchemeVersion', Format => 'int16u' },
+    10 => { Name => 'SchemeURL',    Format => 'string[$size-10]' },
+);
+
+%Image::ExifTool::QuickTime::SchemeInfo = (
+    PROCESS_PROC => \&ProcessMOV,
+    GROUPS => { 2 => 'Audio' },
+    user => {
+        Name => 'UserID',
+        Groups => { 2 => 'Author' },
+        ValueConv => '"0x" . unpack("H*",$val)',
+    },
+    cert => { # ref http://www.onvif.org/specs/stream/ONVIF-ExportFileFormat-Spec-v100.pdf
+        Name => 'Certificate',
+        ValueConv => '"0x" . unpack("H*",$val)',
+    },
+    'key ' => {
+        Name => 'KeyID',
+        ValueConv => '"0x" . unpack("H*",$val)',
+    },
+    iviv => {
+        Name => 'InitializationVector',
+        ValueConv => 'unpack("H*",$val)',
+    },
+    righ => {
+        Name => 'Rights',
+        Groups => { 2 => 'Author' },
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Rights' },
+    },
+    name => { Name => 'UserName', Groups => { 2 => 'Author' } },
+    # chtb
+    # priv - private data
+    # sign
+    # adkm - Adobe DRM key management system (ref http://download.macromedia.com/f4v/video_file_format_spec_v10_1.pdf)
+    # iKMS
+    # iSFM
+    # iSLT
+);
+
+%Image::ExifTool::QuickTime::Rights = (
+    PROCESS_PROC => \&ProcessRights,
+    GROUPS => { 2 => 'Audio' },
+    veID => 'ItemVendorID', #PH ("VendorID" ref 19)
+    plat => 'Platform', #18?
+    aver => 'VersionRestrictions', #19 ("appversion?" ref 18)
+    tran => 'TransactionID', #18
+    song => 'ItemID', #19 ("appid" ref 18)
+    tool => {
+        Name => 'ItemTool', #PH (guess) ("itunes build?" ref 18)
+        Format => 'string',
+    },
+    medi => 'MediaFlags', #PH (?)
+    mode => 'ModeFlags', #PH (?) 0x04 is HD flag (https://compilr.com/heksesang/requiem-mac/UnDrm.java)
 );
 
 # MP4 hint sample description box (ref 5)
+# (ref https://developer.apple.com/library/mac/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html#//apple_ref/doc/uid/TP40000939-CH205-SW1)
 %Image::ExifTool::QuickTime::HintSampleDesc = (
-    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
-    FORMAT => 'int16u',
+    PROCESS_PROC => \&ProcessHybrid,
+    VARS => { ID_LABEL => 'ID/Index' },
     NOTES => 'MP4 hint sample description.',
-    2 => { Name => 'HintFormat', Format => 'undef[4]' },
+    4  => { Name => 'HintFormat', Format => 'undef[4]' },
+    # 14 - int16u DataReferenceIndex
+    16 => { Name => 'HintTrackVersion', Format => 'int16u' },
+    # 18 - int16u LastCompatibleHintTrackVersion
+    20 => { Name => 'MaxPacketSize', Format => 'int32u' },
+#
+# Observed offsets for child atoms of various HintFormat types:
+#
+#   HintFormat   Offset  Child atoms
+#   -----------  ------  ----------------
+#   "rtp "       24      tims
+#
+    tims => { Name => 'RTPTimeScale',               Format => 'int32u' },
+    tsro => { Name => 'TimestampRandomOffset',      Format => 'int32u' },
+    snro => { Name => 'SequenceNumberRandomOffset', Format => 'int32u' },
 );
 
 # MP4 generic sample description box
 %Image::ExifTool::QuickTime::OtherSampleDesc = (
-    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
-    FORMAT => 'int16u',
-    2 => { Name => 'OtherFormat', Format => 'undef[4]' },
+    PROCESS_PROC => \&ProcessHybrid,
+    4 => { Name => 'OtherFormat', Format => 'undef[4]' },
+#
+# Observed offsets for child atoms of various OtherFormat types:
+#
+#   OtherFormat  Offset  Child atoms
+#   -----------  ------  ----------------
+#   avc1         86      avcC
+#   mp4a         36      esds
+#   mp4s         16      esds
+#   tmcd         34      name
+#
 );
 
 # MP4 data information box (ref 5)
@@ -2346,7 +2774,7 @@ my %graphicsMode = (
     6 => {
         Name => 'TextFace',
         Format => 'int16u',
-        PrintConv => { 
+        PrintConv => {
             0 => 'Plain',
             BITMASK => {
                 0 => 'Bold',
@@ -2363,15 +2791,16 @@ my %graphicsMode = (
         Name => 'TextSize',
         Format => 'int16u',
     },
-    10 => {
+    # 10 - reserved
+    12 => {
         Name => 'TextColor',
         Format => 'int16u[3]',
     },
-    16 => {
+    18 => {
         Name => 'BackgroundColor',
         Format => 'int16u[3]',
     },
-    22 => {
+    24 => {
         Name => 'FontName',
         Format => 'pstring',
         ValueConv => '$self->Decode($val, $self->Options("CharsetQuickTime"))',
@@ -2433,7 +2862,7 @@ my %graphicsMode = (
     8 => {
         Name => 'HandlerType',
         Format => 'undef[4]',
-        RawConv => '$$self{HandlerType} = $val unless $val eq "alis"; $val',
+        RawConv => '$$self{HandlerType} = $val unless $val eq "alis" or $val eq "url "; $val',
         PrintConvColumns => 2,
         PrintConv => {
             alis => 'Alias Data', #PH
@@ -2446,12 +2875,14 @@ my %graphicsMode = (
             mjsm => 'MPEG-J', #3
             ocsm => 'Object Content', #3
             odsm => 'Object Descriptor', #3
+            priv => 'Private', #PH
             sdsm => 'Scene Description', #3
             soun => 'Audio Track',
             text => 'Text', #PH (but what type? subtitle?)
             tmcd => 'Time Code', #PH
            'url '=> 'URL', #3
             vide => 'Video Track',
+            subp => 'Subpicture', #http://www.google.nl/patents/US7778526
         },
     },
     12 => { #PH
@@ -2563,7 +2994,7 @@ my %graphicsMode = (
         Name => 'GPSLatitude',
         Require => 'QuickTime:LocationInformation',
         Groups => { 2 => 'Location' },
-        ValueConv => '$val =~ /Lat=([-+.\d]+)/; abs($1)',
+        ValueConv => '$val =~ /Lat=([-+.\d]+)/; $1',
         PrintConv => q{
             require Image::ExifTool::GPS;
             Image::ExifTool::GPS::ToDMS($self, $val, 1, 'N');
@@ -2573,7 +3004,7 @@ my %graphicsMode = (
         Name => 'GPSLongitude',
         Require => 'QuickTime:LocationInformation',
         Groups => { 2 => 'Location' },
-        ValueConv => '$val =~ /Lon=([-+.\d]+)/; abs($1)',
+        ValueConv => '$val =~ /Lon=([-+.\d]+)/; $1',
         PrintConv => q{
             require Image::ExifTool::GPS;
             Image::ExifTool::GPS::ToDMS($self, $val, 1, 'E');
@@ -2614,13 +3045,21 @@ Image::ExifTool::AddCompositeTags('Image::ExifTool::QuickTime');
 
 
 #------------------------------------------------------------------------------
+# AutoLoad our writer routines when necessary
+#
+sub AUTOLOAD
+{
+    return Image::ExifTool::DoAutoLoad($AUTOLOAD, @_);
+}
+
+#------------------------------------------------------------------------------
 # Calculate rotation of video track
 # Inputs: 0) ExifTool object ref
 # Returns: rotation angle or undef
 sub CalcRotation($)
 {
-    my $exifTool = shift;
-    my $value = $$exifTool{VALUE};
+    my $et = shift;
+    my $value = $$et{VALUE};
     my ($i, $track);
     # get the video track family 1 group (ie. "Track1");
     for ($i=0; ; ++$i) {
@@ -2628,7 +3067,7 @@ sub CalcRotation($)
         my $tag = "HandlerType$idx";
         last unless $$value{$tag};
         next unless $$value{$tag} eq 'vide';
-        $track = $exifTool->GetGroup($tag, 1);
+        $track = $et->GetGroup($tag, 1);
         last;
     }
     return undef unless $track;
@@ -2637,7 +3076,7 @@ sub CalcRotation($)
         my $idx = $i ? " ($i)" : '';
         my $tag = "MatrixStructure$idx";
         last unless $$value{$tag};
-        next unless $exifTool->GetGroup($tag, 1) eq $track;
+        next unless $et->GetGroup($tag, 1) eq $track;
         my @a = split ' ', $$value{$tag};
         return undef unless $a[0] or $a[1];
         # calculate the rotation angle (assume uniform rotation)
@@ -2654,7 +3093,7 @@ sub CalcRotation($)
 # Returns: average sample rate (in Hz)
 sub CalcSampleRate($$)
 {
-    my ($exifTool, $valPt) = @_;
+    my ($et, $valPt) = @_;
     my @dat = unpack('N*', $$valPt);
     my ($num, $dur) = (0, 0);
     my $i;
@@ -2662,8 +3101,8 @@ sub CalcSampleRate($$)
         $num += $dat[$i];               # total number of samples
         $dur += $dat[$i] * $dat[$i+1];  # total sample duration
     }
-    return undef unless $num and $dur and $$exifTool{MediaTS};
-    return $num * $$exifTool{MediaTS} / $dur;
+    return undef unless $num and $dur and $$et{MediaTS};
+    return $num * $$et{MediaTS} / $dur;
 }
 
 #------------------------------------------------------------------------------
@@ -2708,17 +3147,57 @@ sub ConvertISO6709($)
 }
 
 #------------------------------------------------------------------------------
+# Convert Nero chapter list (ref ffmpeg libavformat/movenc.c)
+# Inputs: 0) binary chpl data
+# Returns: chapter list
+sub ConvertChapterList($)
+{
+    my $val = shift;
+    my $size = length $val;
+    return '<invalid>' if $size < 9;
+    my $num = Get8u(\$val, 8);
+    my ($i, @chapters);
+    my $pos = 9;
+    for ($i=0; $i<$num; ++$i) {
+        last if $pos + 9 > $size;
+        my $dur = Get64u(\$val, $pos) / 10000000;
+        my $len = Get8u(\$val, $pos + 8);
+        last if $pos + 9 + $len > $size;
+        my $title = substr($val, $pos + 9, $len);
+        $pos += 9 + $len;
+        push @chapters, "$dur $title";
+    }
+    return \@chapters;  # return as a list
+}
+
+#------------------------------------------------------------------------------
+# Print conversion for a Nero chapter list item
+# Inputs: 0) ValueConv chapter string
+# Returns: formatted chapter string
+sub PrintChapter($)
+{
+    my $val = shift;
+    $val =~ /^(\S+) (.*)/ or return $val;
+    my ($dur, $title) = ($1, $2);
+    my $h = int($dur / 3600);
+    $dur -= $h * 3600;
+    my $m = int($dur / 60);
+    my $s = $dur - $m * 60;
+    return sprintf("[%d:%.2d:%06.3f] %s",$h,$m,$s,$title);
+}
+
+#------------------------------------------------------------------------------
 # Format GPSCoordinates for printing
 # Inputs: 0) string with numerical lat, lon and optional alt, separated by spaces
 #         1) ExifTool object reference
 # Returns: PrintConv value
 sub PrintGPSCoordinates($)
 {
-    my ($val, $exifTool) = @_;
+    my ($val, $et) = @_;
     require Image::ExifTool::GPS;
     my @v = split ' ', $val;
-    my $prt = Image::ExifTool::GPS::ToDMS($exifTool, $v[0], 1, "N") . ', ' .
-              Image::ExifTool::GPS::ToDMS($exifTool, $v[1], 1, "E");
+    my $prt = Image::ExifTool::GPS::ToDMS($et, $v[0], 1, "N") . ', ' .
+              Image::ExifTool::GPS::ToDMS($et, $v[1], 1, "E");
     if (defined $v[2]) {
         $prt .= ', ' . ($v[2] < 0 ? -$v[2] . ' m Below' : $v[2] . ' m Above') . ' Sea Level';
     }
@@ -2752,13 +3231,13 @@ sub UnpackLang($)
 # Returns: 1 on success
 sub ProcessMetaData($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirLen = length $$dataPt;
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     return 0 unless $dirLen >= 2;
     my $count = Get16u($dataPt, 0);
-    $verbose and $exifTool->VerboseDir('MetaData', $count);
+    $verbose and $et->VerboseDir('MetaData', $count);
     my $i;
     my $pos = 2;
     for ($i=0; $i<$count; ++$i) {
@@ -2769,7 +3248,7 @@ sub ProcessMetaData($$$)
         my $lang = Get16u($dataPt, $pos + 6);
         my $enc  = Get16u($dataPt, $pos + 8);
         my $val  = substr($$dataPt, $pos + 10, $size);
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
         if ($tagInfo) {
             # convert language code to ASCII (ignore read-only bit)
             $lang = UnpackLang($lang);
@@ -2778,19 +3257,19 @@ sub ProcessMetaData($$$)
                 my $langInfo = Image::ExifTool::GetLangInfo($tagInfo, $lang);
                 $tagInfo = $langInfo if $langInfo;
             }
-            $verbose and $exifTool->VerboseInfo($tag, $tagInfo,
+            $verbose and $et->VerboseInfo($tag, $tagInfo,
                 Value  => $val,
                 DataPt => $dataPt,
                 Start  => $pos + 10,
                 Size   => $size - 10,
             );
             # convert from UTF-16 BE if necessary
-            $val = $exifTool->Decode($val, 'UCS2') if $enc == 1;
+            $val = $et->Decode($val, 'UCS2') if $enc == 1;
             if ($enc == 0 and $$tagInfo{Unknown}) {
                 # binary data
-                $exifTool->FoundTag($tagInfo, \$val);
+                $et->FoundTag($tagInfo, \$val);
             } else {
-                $exifTool->FoundTag($tagInfo, $val);
+                $et->FoundTag($tagInfo, $val);
             }
         }
         $pos += $size;
@@ -2799,19 +3278,102 @@ sub ProcessMetaData($$$)
 }
 
 #------------------------------------------------------------------------------
+# Process hybrid binary data + QuickTime container (ref PH)
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessHybrid($$$)
+{
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    # brute-force search for child atoms after first 8 bytes of binary data
+    my $dataPt = $$dirInfo{DataPt};
+    my $pos = ($$dirInfo{DirStart} || 0) + 8;
+    my $len = length($$dataPt);
+    my $try = $pos;
+    my $childPos;
+
+    while ($pos <= $len - 8) {
+        my $tag = substr($$dataPt, $try+4, 4);
+        # look only for well-behaved tag ID's
+        $tag =~ /[^\w ]/ and $try = ++$pos, next;
+        my $size = Get32u($dataPt, $try);
+        if ($size + $try == $len) {
+            # the atom ends exactly at the end of the parent -- this must be it
+            $childPos = $pos;
+            $$dirInfo{DirLen} = $pos;   # the binary data ends at the first child atom
+            last;
+        }
+        if ($size < 8 or $size + $try > $len - 8) {
+            $try = ++$pos;  # fail.  try next position
+        } else {
+            $try += $size;  # could be another atom following this
+        }
+    }
+    # process binary data
+    $$dirInfo{MixedTags} = 1; # ignore non-integer tag ID's
+    $et->ProcessBinaryData($dirInfo, $tagTablePtr);
+    # process child atoms if found
+    if ($childPos) {
+        $$dirInfo{DirStart} = $childPos;
+        $$dirInfo{DirLen} = $len - $childPos;
+        ProcessMOV($et, $dirInfo, $tagTablePtr);
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process iTunes 'righ' atom (ref PH)
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessRights($$$)
+{
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dataPos = $$dirInfo{Base};
+    my $dirLen = length $$dataPt;
+    my $unknown = $$et{OPTIONS}{Unkown} || $$et{OPTIONS}{Verbose};
+    my $pos;
+    $et->VerboseDir('righ', $dirLen / 8);
+    for ($pos = 0; $pos + 8 <= $dirLen; $pos += 8) {
+        my $tag = substr($$dataPt, $pos, 4);
+        last if $tag eq "\0\0\0\0";
+        my $val = substr($$dataPt, $pos + 4, 4);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
+        unless ($tagInfo) {
+            next unless $unknown;
+            my $name = $tag;
+            $name =~ s/([\x00-\x1f\x7f-\xff])/'x'.unpack('H*',$1)/eg;
+            $tagInfo = {
+                Name => "Unknown_$name",
+                Description => "Unknown $name",
+                Unknown => 1,
+            },
+            AddTagToTable($tagTablePtr, $tag, $tagInfo);
+        }
+        $val = '0x' . unpack('H*', $val) unless $$tagInfo{Format};
+        $et->HandleTag($tagTablePtr, $tag, $val,
+            DataPt  => $dataPt,
+            DataPos => $dataPos,
+            Start   => $pos + 4,
+            Size    => 4,
+        );
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
 # Process iTunes Encoding Params (ref PH)
 # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
 # Returns: 1 on success
 sub ProcessEncodingParams($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirLen = length $$dataPt;
     my $pos;
-    $exifTool->VerboseDir('Encoding Params', $dirLen / 8);
+    $et->VerboseDir('Encoding Params', $dirLen / 8);
     for ($pos = 0; $pos + 8 <= $dirLen; $pos += 8) {
         my ($tag, $val) = unpack("x${pos}a4N", $$dataPt);
-        $exifTool->HandleTag($tagTablePtr, $tag, $val);
+        $et->HandleTag($tagTablePtr, $tag, $val);
     }
     return 1;
 }
@@ -2822,13 +3384,13 @@ sub ProcessEncodingParams($$$)
 # Returns: 1 on success
 sub ProcessKeys($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirLen = length $$dataPt;
     my $out;
-    if ($exifTool->Options('Verbose')) {
-        $exifTool->VerboseDir('Keys');
-        $out = $exifTool->Options('TextOut');
+    if ($et->Options('Verbose')) {
+        $et->VerboseDir('Keys');
+        $out = $et->Options('TextOut');
     }
     my $pos = 8;
     my $index = 1;
@@ -2846,15 +3408,15 @@ sub ProcessKeys($$$)
         }
         next unless $tag;
         # (I have some samples where the tag is a reversed ItemList or UserData tag ID)
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
         unless ($tagInfo) {
-            $tagInfo = $exifTool->GetTagInfo($infoTable, $tag);
+            $tagInfo = $et->GetTagInfo($infoTable, $tag);
             unless ($tagInfo) {
-                $tagInfo = $exifTool->GetTagInfo($userTable, $tag);
+                $tagInfo = $et->GetTagInfo($userTable, $tag);
                 if (not $tagInfo and $tag =~ /^\w{3}\xa9$/) {
                     $tag = pack('N', unpack('V', $tag));
-                    $tagInfo = $exifTool->GetTagInfo($infoTable, $tag);
-                    $tagInfo or $tagInfo = $exifTool->GetTagInfo($userTable, $tag);
+                    $tagInfo = $et->GetTagInfo($infoTable, $tag);
+                    $tagInfo or $tagInfo = $et->GetTagInfo($userTable, $tag);
                 }
             }
         }
@@ -2880,7 +3442,7 @@ sub ProcessKeys($$$)
         if ($newInfo) {
             $msg or $msg = '';
             AddTagToTable($infoTable, $index, $newInfo);
-            $out and printf $out "%sAdded ItemList Tag 0x%.4x = $tag$msg\n", $exifTool->{INDENT}, $index;
+            $out and printf $out "%sAdded ItemList Tag 0x%.4x = $tag$msg\n", $$et{INDENT}, $index;
         }
         $pos += $len;
         ++$index;
@@ -2894,12 +3456,12 @@ sub ProcessKeys($$$)
 # Returns: 1 on success
 sub ProcessMOV($$;$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $raf = $$dirInfo{RAF};
     my $dataPt = $$dirInfo{DataPt};
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     my $dataPos = $$dirInfo{Base} || 0;
-    my $charsetQuickTime = $exifTool->Options('CharsetQuickTime');
+    my $charsetQuickTime = $et->Options('CharsetQuickTime');
     my ($buff, $tag, $size, $track, $isUserData, %triplet);
 
     # more convenient to package data as a RandomAccess file
@@ -2919,69 +3481,95 @@ sub ProcessMOV($$;$)
     }
     ($size, $tag) = unpack('Na4', $buff);
     if ($dataPt) {
-        $verbose and $exifTool->VerboseDir($$dirInfo{DirName});
+        $verbose and $et->VerboseDir($$dirInfo{DirName});
     } else {
         # check on file type if called with a RAF
         $$tagTablePtr{$tag} or return 0;
-        if ($tag eq 'ftyp') {
-            # read ahead 4 bytes to see what type of file this is
+        if ($tag eq 'ftyp' and $size >= 12) {
+            # read ftyp atom to see what type of file this is
             my $fileType;
-            if ($raf->Read($buff, 4) == 4) {
-                $raf->Seek(-4, 1);
+            if ($raf->Read($buff, $size-8) == $size-8) {
+                $raf->Seek(-($size-8), 1);
+                my $type = substr($buff, 0, 4);
                 # see if we know the extension for this file type
-                $fileType = $1 if $ftypLookup{$buff} and $ftypLookup{$buff} =~ /\(\.(\w+)/;
+                if ($ftypLookup{$type} and $ftypLookup{$type} =~ /\(\.(\w+)/) {
+                    $fileType = $1;
+                # check compatible brands
+                } elsif ($buff =~ /^.{8}(.{4})+(mp41|mp42)/s) {
+                    $fileType = 'MP4';
+                } elsif ($buff =~ /^.{8}(.{4})+(f4v )/s) {
+                    $fileType = 'F4V';
+                } elsif ($buff =~ /^.{8}(.{4})+(qt  )/s) {
+                    $fileType = 'MOV';
+                }
             }
             $fileType or $fileType = 'MP4'; # default to MP4
-            $exifTool->SetFileType($fileType, $mimeLookup{$fileType} || 'video/mp4');
+            $et->SetFileType($fileType, $mimeLookup{$fileType} || 'video/mp4');
         } else {
-            $exifTool->SetFileType();       # MOV
+            $et->SetFileType();       # MOV
         }
         SetByteOrder('MM');
     }
     for (;;) {
         if ($size < 8) {
-            last if $size == 0;
-            $size == 1 or $exifTool->Warn('Invalid atom size'), last;
+            if ($size == 0) {
+                if ($dataPt) {
+                    # a zero size isn't legal for contained atoms, but Canon uses it to
+                    # terminate the CNTH atom (ie. CanonEOS100D.mov), so tolerate it here
+                    my $pos = $raf->Tell() - 4;
+                    $raf->Seek(0,2);
+                    my $str = $$dirInfo{DirName} . ' with ' . ($raf->Tell() - $pos) . ' bytes';
+                    $et->VPrint(0,"$$et{INDENT}\[Terminator found in $str remaining]");
+                } else {
+                    $tag = sprintf("0x%.8x",Get32u(\$tag,0)) if $tag =~ /[\x00-\x1f\x7f-\xff]/;
+                    $et->VPrint(0,"$$et{INDENT}Tag '$tag' extends to end of file");
+                }
+                last;
+            }
+            $size == 1 or $et->Warn('Invalid atom size'), last;
+            # read extended atom size
             $raf->Read($buff, 8) == 8 or last;
             $dataPos += 8;
             my ($hi, $lo) = unpack('NN', $buff);
-            $size = $lo;
             if ($hi or $lo > 0x7fffffff) {
                 if ($hi > 0x7fffffff) {
-                    $exifTool->Warn('Invalid atom size');
+                    $et->Warn('Invalid atom size');
                     last;
-                } elsif (not $exifTool->Options('LargeFileSupport')) {
-                    $exifTool->Warn('End of processing at large atom (LargeFileSupport not enabled)');
+                } elsif (not $et->Options('LargeFileSupport')) {
+                    $et->Warn('End of processing at large atom (LargeFileSupport not enabled)');
                     last;
                 }
             }
-            $size = $hi * 4294967296 + $lo - 8;
-            $size < 8 and $exifTool->Warn('Invalid extended size'), last;
+            $size = $hi * 4294967296 + $lo - 16;
+            $size < 0 and $et->Warn('Invalid extended size'), last;
+        } else {
+            $size -= 8;
         }
-        $size -= 8;
-        if ($isUserData and $$exifTool{SET_GROUP1}) {
-            my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        if ($isUserData and $$et{SET_GROUP1}) {
+            my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
             # add track name to UserData tags inside tracks
-            $tag = $$exifTool{SET_GROUP1} . $tag;
+            $tag = $$et{SET_GROUP1} . $tag;
             if (not $$tagTablePtr{$tag} and $tagInfo) {
                 my %newInfo = %$tagInfo;
                 foreach ('Name', 'Description') {
-                    $newInfo{$_} = $$exifTool{SET_GROUP1} . $$tagInfo{$_} if $$tagInfo{$_};
+                    next unless $$tagInfo{$_};
+                    $newInfo{$_} = $$et{SET_GROUP1} . $$tagInfo{$_};
+                    $newInfo{$_} =~ s/^(Track\d+)Track/$1/; # remove duplicate "Track" in name
                 }
                 AddTagToTable($tagTablePtr, $tag, \%newInfo);
             }
         }
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
         # allow numerical tag ID's
         unless ($tagInfo) {
             my $num = unpack('N', $tag);
             if ($$tagTablePtr{$num}) {
-                $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $num);
+                $tagInfo = $et->GetTagInfo($tagTablePtr, $num);
                 $tag = $num;
             }
         }
         # generate tagInfo if Unknown option set
-        if (not defined $tagInfo and ($exifTool->{OPTIONS}->{Unknown} or
+        if (not defined $tagInfo and ($$et{OPTIONS}{Unknown} or
             $verbose or $tag =~ /^\xa9/))
         {
             my $name = $tag;
@@ -3004,23 +3592,27 @@ sub ProcessMOV($$;$)
             AddTagToTable($tagTablePtr, $tag, $tagInfo);
         }
         # save required tag sizes
-        $exifTool->HandleTag($tagTablePtr, "$tag-size", $size) if $$tagTablePtr{"$tag-size"};
+        if ($$tagTablePtr{"$tag-size"}) {
+            $et->HandleTag($tagTablePtr, "$tag-size", $size);
+            $et->HandleTag($tagTablePtr, "$tag-offset", $raf->Tell()) if $$tagTablePtr{"$tag-offset"};
+        }
         # load values only if associated with a tag (or verbose) and < 16MB long
         if ((defined $tagInfo or $verbose) and $size < 0x1000000) {
             my $val;
-            unless ($raf->Read($val, $size) == $size) {
-                $exifTool->Warn("Truncated '$tag' data");
+            my $missing = $size - $raf->Read($val, $size);
+            if ($missing) {
+                $et->Warn("Truncated '$tag' data (missing $missing bytes)");
                 last;
             }
             # use value to get tag info if necessary
-            $tagInfo or $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag, \$val);
+            $tagInfo or $tagInfo = $et->GetTagInfo($tagTablePtr, $tag, \$val);
             my $hasData = ($$dirInfo{HasData} and $val =~ /\0...data\0/s);
             if ($verbose and not $hasData) {
                 my $tval;
                 if ($tagInfo and $$tagInfo{Format}) {
-                    $tval =  ReadValue(\$val, 0, $$tagInfo{Format}, $$tagInfo{Count}, length($val));
+                    $tval = ReadValue(\$val, 0, $$tagInfo{Format}, $$tagInfo{Count}, length($val));
                 }
-                $exifTool->VerboseInfo($tag, $tagInfo,
+                $et->VerboseInfo($tag, $tagInfo,
                     Value   => $tval,
                     DataPt  => \$val,
                     DataPos => $dataPos,
@@ -3034,7 +3626,7 @@ sub ProcessMOV($$;$)
                     $tag = $triplet{name};
                     # add 'mean' to name unless it is 'com.apple.iTunes'
                     $tag = $triplet{mean} . '/' . $tag unless $triplet{mean} eq 'com.apple.iTunes';
-                    $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag, \$val);
+                    $tagInfo = $et->GetTagInfo($tagTablePtr, $tag, \$val);
                     unless ($tagInfo) {
                         my $name = $triplet{name};
                         my $desc = $name;
@@ -3083,20 +3675,21 @@ sub ProcessMOV($$;$)
                         # Base needed for IsOffset tags in binary data
                         Base     => $base,
                     );
+                    $dirInfo{BlockInfo} = $tagInfo if $$tagInfo{BlockExtract};
                     if ($$subdir{ByteOrder} and $$subdir{ByteOrder} =~ /^Little/) {
                         SetByteOrder('II');
                     }
-                    my $oldGroup1 = $exifTool->{SET_GROUP1};
+                    my $oldGroup1 = $$et{SET_GROUP1};
                     if ($$tagInfo{Name} eq 'Track') {
                         $track or $track = 0;
-                        $exifTool->{SET_GROUP1} = 'Track' . (++$track);
+                        $$et{SET_GROUP1} = 'Track' . (++$track);
                     }
                     my $subTable = GetTagTable($$subdir{TagTable});
                     my $proc = $$subdir{ProcessProc};
                     # make ProcessMOV() the default processing procedure for subdirectories
                     $proc = \&ProcessMOV unless $proc or $$subTable{PROCESS_PROC};
-                    $exifTool->ProcessDirectory(\%dirInfo, $subTable, $proc) if $size > $start;
-                    $exifTool->{SET_GROUP1} = $oldGroup1;
+                    $et->ProcessDirectory(\%dirInfo, $subTable, $proc) if $size > $start;
+                    $$et{SET_GROUP1} = $oldGroup1;
                     SetByteOrder('MM');
                 } elsif ($hasData) {
                     # handle atoms containing 'data' tags
@@ -3119,7 +3712,7 @@ sub ProcessMOV($$;$)
                             # 0x18=double, 0x1b=BMP, 0x1c='meta' atom
                             if ($stringEncoding{$flags}) {
                                 # handle all string formats
-                                $value = $exifTool->Decode($value, $stringEncoding{$flags});
+                                $value = $et->Decode($value, $stringEncoding{$flags});
                             } else {
                                 if (not $format) {
                                     if ($flags == 0x15 or $flags == 0x16) {
@@ -3166,7 +3759,7 @@ sub ProcessMOV($$;$)
                             $langInfo = Image::ExifTool::GetLangInfo($tagInfo, $lang) if $lang;
                         }
                         $langInfo or $langInfo = $tagInfo;
-                        $exifTool->VerboseInfo($tag, $langInfo,
+                        $et->VerboseInfo($tag, $langInfo,
                             Value   => ref $value ? $$value : $value,
                             DataPt  => \$val,
                             DataPos => $dataPos,
@@ -3175,10 +3768,10 @@ sub ProcessMOV($$;$)
                             Format  => $format,
                             Extra   => sprintf(", Type='$type', Flags=0x%x",$flags)
                         ) if $verbose;
-                        $exifTool->FoundTag($langInfo, $value) if defined $value;
+                        $et->FoundTag($langInfo, $value) if defined $value;
                         $pos += $len;
                     }
-                } elsif ($tag =~ /^\xa9/) {
+                } elsif ($tag =~ /^\xa9/ or $$tagInfo{IText}) {
                     # parse international text to extract all languages
                     my $pos = 0;
                     for (;;) {
@@ -3200,23 +3793,23 @@ sub ProcessMOV($$;$)
                         if ($lang < 0x400) {
                             # this is a Macintosh language code
                             # a language code of 0 is Macintosh english, so treat as default
-                            if ($lang) { 
+                            if ($lang) {
                                 # use Font.pm to look up language string
                                 require Image::ExifTool::Font;
                                 $lang = $Image::ExifTool::Font::ttLang{Macintosh}{$lang};
                             }
                             # the spec says only "Macintosh text encoding", but
                             # allow this to be configured by the user
-                            $str = $exifTool->Decode($str, $charsetQuickTime);
+                            $str = $et->Decode($str, $charsetQuickTime);
                         } else {
                             # convert language code to ASCII (ignore read-only bit)
                             $lang = UnpackLang($lang);
                             # may be either UTF-8 or UTF-16BE
                             my $enc = $str=~s/^\xfe\xff// ? 'UTF16' : 'UTF8';
-                            $str = $exifTool->Decode($str, $enc);
+                            $str = $et->Decode($str, $enc);
                         }
                         $langInfo = Image::ExifTool::GetLangInfo($tagInfo, $lang) if $lang;
-                        $exifTool->FoundTag($langInfo || $tagInfo, $str);
+                        $et->FoundTag($langInfo || $tagInfo, $str);
                         $pos += $len;
                     }
                 } else {
@@ -3224,22 +3817,32 @@ sub ProcessMOV($$;$)
                     if ($format) {
                         $val = ReadValue(\$val, 0, $format, $$tagInfo{Count}, length($val));
                     }
-                    my $key = $exifTool->FoundTag($tagInfo, $val);
+                    my $oldBase;
+                    if ($$tagInfo{SetBase}) {
+                        $oldBase = $$et{BASE};
+                        $$et{BASE} = $dataPos;
+                    }
+                    my $key = $et->FoundTag($tagInfo, $val);
+                    $$et{BASE} = $oldBase if defined $oldBase;
                     # decode if necessary (NOTE: must be done after RawConv)
                     if (defined $key and (not $format or $format =~ /^string/) and
-                        not $$tagInfo{Unknown} and not $$tagInfo{Binary} and
-                        defined $$exifTool{VALUE}{$key} and not ref $val)
+                        not $$tagInfo{Unknown} and not $$tagInfo{ValueConv} and
+                        not $$tagInfo{Binary} and defined $$et{VALUE}{$key} and not ref $val)
                     {
-                        my $vp = \$$exifTool{VALUE}{$key};
+                        my $vp = \$$et{VALUE}{$key};
                         if (not ref $$vp and length($$vp) <= 65536 and $$vp =~ /[\x80-\xff]/) {
                             # the encoding of this is not specified, so use CharsetQuickTime
-                            $$vp = $exifTool->Decode($$vp, $charsetQuickTime);
+                            $$vp = $et->Decode($$vp, $charsetQuickTime);
                         }
                     }
                 }
             }
         } else {
-            $raf->Seek($size, 1) or $exifTool->Warn("Truncated '$tag' data"), last;
+            $et->VerboseInfo($tag, $tagInfo,
+                Size  => $size,
+                Extra => sprintf(' at offset 0x%.4x', $raf->Tell()),
+            ) if $verbose;
+            $raf->Seek($size, 1) or $et->Warn("Truncated '$tag' data"), last;
         }
         $raf->Read($buff, 8) == 8 or last;
         $dataPos += $size + 8;
@@ -3254,9 +3857,9 @@ sub ProcessMOV($$;$)
 # Returns: 1 on success
 sub ProcessQTIF($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $table = GetTagTable('Image::ExifTool::QuickTime::ImageFile');
-    return ProcessMOV($exifTool, $dirInfo, $table);
+    return ProcessMOV($et, $dirInfo, $table);
 }
 
 1;  # end
@@ -3278,7 +3881,7 @@ information from QuickTime and MP4 video, and M4A audio files.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -97,7 +97,7 @@ is an explanation of the meaning of each special key:
     ifd64       - Unsigned 64-bit integer sub-IFD pointer (BigTIFF 'IFD8')
     string      - Series of 8-bit ASCII characters        (EXIF 'ASCII')
     undef       - Undefined-format binary data            (EXIF 'UNDEFINED')
-    binary      - Binary data
+    binary      - Binary data (same as 'undef')
 
   Additionally, the following variable-length Format types may be used in
   individual tag information hashes of a BinaryData table.  The 'var_' formats
@@ -299,14 +299,16 @@ numerical.
                   'BlockExtract' - set for writable directories in EXIF
                   information which are extracted by default.  Otherwise
                   writable directories are only extracted as a block if
-                  specified explicitly.
+                  specified explicitly.  Also used for Jpeg2000 and QuickTime
+                  XMP-like tags to extract as a block with a name other than
+                  'XMP'.
 
                   'DataMember' - name of exiftool data member associated with
                   this tag if it should be stored as a special data member when
                   writing information.  Necessary only if the value of the tag
                   affects other written information.  Currently only used for
                   tags in EXIF tables where it triggers the execution of the
-                  RawConv to convert and stores the value as an ExifTool data
+                  RawConv to convert and store the value as an ExifTool data
                   member when writing.
 
                   'DataTag' - associated tag name containing data for offset or
@@ -343,7 +345,7 @@ numerical.
                   is used even if the base changes for the current directory
                   (only some maker notes are this messed up).  Set to 3 if
                   absolute file offsets are used.  May be set to an expression
-                  to be evaluated.  Expression may access $val and $exifTool,
+                  to be evaluated.  Expression may access $val and $et,
                   and is evaluated only when reading.
 
                   'List' - flag indicating that duplicate entries of this tag
@@ -466,8 +468,9 @@ numerical.
                   image file is still open, unlike ValueConv and PrintConv below
                   which are done later only if the value is requested).  May be
                   a scalar expression using $val (the Raw tag value), $self (the
-                  current ExifTool object), $tag (the tag key) and $tagInfo
-                  (reference to the tag information hash) or a code reference
+                  current ExifTool object), $tag (the tag key), $tagInfo
+                  (reference to the tag information hash), and $priority (to
+                  dyanmically set the priority of a tag), or a code reference
                   with $val and $self as arguments.  For Composite tags, $val is
                   a reference to a hash of source ("derived from") tag names,
                   and @val may be used to access the Raw values of these tags.
@@ -479,36 +482,37 @@ numerical.
                   ValueConv and PrintConv evals will no longer have access to
                   the source @val and @prt values unless the input $val is
                   returned.  RawConv may generate Warning or Error tags, while
-                  ValueConv and PrintConv may not. Note: RawConv should only be
+                  ValueConv and PrintConv may not.  Note: RawConv should only be
                   used if necessary (in general, only if the conversion may
-                  return undef to ignore the tag) because ValueConv is more
-                  efficient since it is only executed if the tag value is
-                  requested, while RawConv is executed for all extracted tags.
+                  return undef to ignore the tag, or if a Warning may be issued)
+                  because ValueConv is more efficient since it is only executed
+                  if the tag value is requested, while RawConv is executed for
+                  all extracted tags.
 
   ValueConv     : Used to convert the Raw value to a useable form. May be a hash
                   reference to act as a lookup table, a scalar which is
-                  evaluated as a Perl expression, or a code reference to a
-                  subroutine.  May also be a list reference, in which case the
-                  value is split at whitespace into a list of items and each
-                  item is converted by the associated entry in the ValueConv
-                  list.  If a hash reference is used and the Raw value doesn't
-                  appear as one of the keys, then the converted value is set to
-                  "Unknown (X)", where X is the Raw value (unless either of the
-                  special keys exist: 'BITMASK', a reference to a hash used to
-                  decode individual value bits; or 'OTHER', a reference to a
-                  subroutine used to convert unknown values.  The OTHER
-                  subroutine takes 3 arguments: the value, a flag which is set
-                  for the inverse conversion, and a reference to the PrintConv
-                  hash, and returns the converted value or undef on error.  The
-                  lookup hash may also contain a 'Notes' entry which is used for
-                  documentation if the SeparateTable flag is set).  In an
-                  expression, $self is a reference to the current ExifTool
-                  object, $val is the Raw value, and $tag is the tag key.  The
-                  subroutine takes 2 arguments: the Raw value and a reference to
-                  the current ExifTool object.  The expression or subroutine is
-                  evaluated when and if the tag value is requested (ie. only
-                  after all extraction is complete), so if necessary at this
-                  time the values of all other tags are available via calls to
+                  evaluated as a Perl expression, a code reference to a
+                  subroutine, or an ARRAY reference (in which case the value is
+                  split at whitespace into a list of items and each item is
+                  converted by the associated entry in the ValueConv list).  If
+                  a hash reference is used and the Raw value doesn't appear as
+                  one of the keys, then the converted value is set to "Unknown
+                  (X)", where X is the Raw value (unless either of the special
+                  keys exist: 'BITMASK', a reference to a hash used to decode
+                  individual value bits; or 'OTHER', a reference to a subroutine
+                  used to convert unknown values.  The OTHER subroutine takes 3
+                  arguments: the value, a flag which is set for the inverse
+                  conversion, and a reference to the PrintConv hash, and returns
+                  the converted value or undef on error.  The lookup hash may
+                  also contain a 'Notes' entry which is used for documentation
+                  if the SeparateTable flag is set).  In an expression, $self is
+                  a reference to the current ExifTool object, $val is the Raw
+                  value, and $tag is the tag key.  The subroutine takes 2
+                  arguments: the Raw value and a reference to the current
+                  ExifTool object.  The expression or subroutine is evaluated
+                  when and if the tag value is requested (ie. only after all
+                  extraction is complete), so if necessary at this time the
+                  values of all other tags are available via calls to
                   $self->GetValue("Tag","Raw"). (Note: In theory, types other
                   than "Raw" may be accessed, but they are slower and may lead
                   to cyclical dependencies so they should be avoided). When
@@ -768,12 +772,17 @@ numerical.
 
   Hook          : [BinaryData tags only] Expression to be evaluated when
                   extracting tag to allow dynamic Format, etc for BinaryData
-                  tags.  May access $self, and assign a new value to $format to
+                  tags.  May access $self, and $size (the full size of the
+                  binary data block), and assign a new value to $format to
                   dynamically set the tag format, and/or increment $varSize to
                   add a byte offset to subsequent tags.  $varSize may be set to
                   a large number to effectively abort processing of the
                   directory after this tag.  Must have corresponding DATAMEMBER
-                  entry in writable tables.
+                  entry in writable tables.  Must not have Unknown set.
+
+  SetBase       : [QuickTime and BinaryData tags only] Sets ExifTool BASE offset
+                  for use when ExtractInfo is called with the ReEntry flag from
+                  inside the RawConv of a tag.
 
   TagID         : [reserved] Used internally to save the table key for this tag.
                   Note: For XMP tables this corresponds to the XMP property
@@ -26,7 +26,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.34';
+$VERSION = '1.37';
 
 sub ConvertTimecode($);
 
@@ -328,6 +328,14 @@ my %riffMimeType = (
         Name => 'Exif',
         SubDirectory => { TagTable => 'Image::ExifTool::RIFF::Exif' },
     },
+    EXIF => { # WEBP Exif tags
+        Name => 'EXIF',
+        Notes => 'EXIF extracted from WEBP images',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Exif::Main',
+            ProcessProc => \&Image::ExifTool::ProcessTIFF,
+        },
+    },
     LIST_hdrl => { # AVI header LIST chunk
         Name => 'Hdrl',
         SubDirectory => { TagTable => 'Image::ExifTool::RIFF::Hdrl' },
@@ -791,6 +799,7 @@ my %riffMimeType = (
             mids => 'MIDI',
             txts => 'Text',
             vids => 'Video',
+            iavs => 'Interleaved Audio+Video',
         },
     },
     1 => [
@@ -1012,7 +1021,7 @@ sub ConvertTimecode($)
 # Notes: Sums duration of all sub-documents (concatenated AVI files)
 sub CalcDuration($@)
 {
-    my ($exifTool, @val) = @_;
+    my ($et, @val) = @_;
     my $totalDuration = 0;
     my $subDoc = 0;
     my @keyList;
@@ -1029,10 +1038,10 @@ sub CalcDuration($@)
             $dur1 = $dur2 if $rat > 1.9 and $rat < 3.1;
         }
         $totalDuration += $dur1 if defined $dur1;
-        last unless $subDoc++ < $$exifTool{DOC_COUNT};
+        last unless $subDoc++ < $$et{DOC_COUNT};
         # get tag values for next sub-document
         my @tags = qw(FrameRate FrameCount VideoFrameRate VideoFrameCount);
-        my $rawValue = $$exifTool{VALUE};
+        my $rawValue = $$et{VALUE};
         my ($i, $j, $key, $keys);
         for ($i=0; $i<@tags; ++$i) {
             if ($subDoc == 1) {
@@ -1050,7 +1059,7 @@ sub CalcDuration($@)
             # find key for tag in this sub-document
             my $grp = "Doc$subDoc";
             $grp .= ":RIFF" if $i < 2; # (tags 0 and 1 also in RIFF group)
-            $key = $exifTool->GroupMatches($grp, $keys);
+            $key = $et->GroupMatches($grp, $keys);
             $val[$i] = $key ? $$rawValue{$key} : undef;
         }
         last unless defined $val[0] and defined $val[1]; # (Require'd tags)
@@ -1064,18 +1073,18 @@ sub CalcDuration($@)
 # Returns: 1 on success
 sub ProcessStreamData($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $start = $$dirInfo{DirStart};
     my $size = $$dirInfo{DirLen};
     return 0 if $size < 4;
-    if ($exifTool->Options('Verbose')) {
-        $exifTool->VerboseDir($$dirInfo{DirName}, 0, $size);
+    if ($et->Options('Verbose')) {
+        $et->VerboseDir($$dirInfo{DirName}, 0, $size);
     }
     my $tag = substr($$dataPt, $start, 4);
-    my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+    my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
     unless ($tagInfo) {
-        $tagInfo = $exifTool->GetTagInfo($tagTablePtr, 'unknown');
+        $tagInfo = $et->GetTagInfo($tagTablePtr, 'unknown');
         return 1 unless $tagInfo;
     }
     my $subdir = $$tagInfo{SubDirectory};
@@ -1095,14 +1104,14 @@ sub ProcessStreamData($$$)
         unless ($offset) {
             # allow processing of 2nd directory at the same address
             my $addr = $subdirInfo{DirStart} + $subdirInfo{DataPos} + $subdirInfo{Base};
-            delete $exifTool->{PROCESSED}->{$addr}
+            delete $$et{PROCESSED}{$addr}
         }
         # (we could set FIRST_EXIF_POS to $subdirInfo{Base} here to make
         #  htmlDump offsets relative to EXIF base if we wanted...)
         my $subTable = GetTagTable($$subdir{TagTable});
-        $exifTool->ProcessDirectory(\%subdirInfo, $subTable);
+        $et->ProcessDirectory(\%subdirInfo, $subTable);
     } else {
-        $exifTool->HandleTag($tagTablePtr, $tag, undef,
+        $et->HandleTag($tagTablePtr, $tag, undef,
             DataPt  => $dataPt,
             DataPos => $$dirInfo{DataPos},
             Start   => $start,
@@ -1120,22 +1129,22 @@ sub ProcessStreamData($$$)
 # Returns: 1 on success
 sub ProcessChunks($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $start = $$dirInfo{DirStart};
     my $size = $$dirInfo{DirLen};
     my $end = $start + $size;
     my $base = $$dirInfo{Base};
 
-    if ($exifTool->Options('Verbose')) {
-        $exifTool->VerboseDir($$dirInfo{DirName}, 0, $size);
+    if ($et->Options('Verbose')) {
+        $et->VerboseDir($$dirInfo{DirName}, 0, $size);
     }
     while ($start + 8 < $end) {
         my $tag = substr($$dataPt, $start, 4);
         my $len = Get32u($dataPt, $start + 4);
         $start += 8;
         if ($start + $len > $end) {
-            $exifTool->Warn("Bad $tag chunk");
+            $et->Warn("Bad $tag chunk");
             return 0;
         }
         if ($tag eq 'LIST' and $len >= 4) {
@@ -1143,7 +1152,7 @@ sub ProcessChunks($$$)
             $len -= 4;
             $start += 4;
         }
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
         my $baseShift = 0;
         my $val;
         if ($tagInfo) {
@@ -1164,12 +1173,13 @@ sub ProcessChunks($$$)
                 $val =~ s/\0+$//;   # remove trailing nulls from strings
             }
         }
-        $exifTool->HandleTag($tagTablePtr, $tag, $val,
+        $et->HandleTag($tagTablePtr, $tag, $val,
             DataPt  => $dataPt,
             DataPos => $$dirInfo{DataPos} - $baseShift,
             Start   => $start,
             Size    => $len,
             Base    => $base + $baseShift,
+            Addr    => $base + $baseShift + $start,
         );
         ++$len if $len & 0x01;  # must account for padding if odd number of bytes
         $start += $len;
@@ -1183,10 +1193,10 @@ sub ProcessChunks($$$)
 # Returns: 1 on success, 0 if this wasn't a valid RIFF file
 sub ProcessRIFF($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my ($buff, $buf2, $type, $mime, $err);
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
 
     # verify this is a valid RIFF file
     return 0 unless $raf->Read($buff, 12) == 12;
@@ -1200,8 +1210,8 @@ sub ProcessRIFF($$)
         return 0 unless $buff =~ /WAVE(.{4})?fmt /sg and $raf->Seek(pos($buff) - 4, 0);
     }
     $mime = $riffMimeType{$type} if $type;
-    $exifTool->SetFileType($type, $mime);
-    $$exifTool{RIFFStreamType} = '';    # initialize stream type
+    $et->SetFileType($type, $mime);
+    $$et{RIFFStreamType} = '';    # initialize stream type
     SetByteOrder('II');
     my $tagTablePtr = GetTagTable('Image::ExifTool::RIFF::Main');
     my $pos = 12;
@@ -1223,13 +1233,13 @@ sub ProcessRIFF($$)
             $tag .= "_$buff";
             $len -= 4;  # already read 4 bytes (the LIST type)
         }
-        $exifTool->VPrint(0, "RIFF '$tag' chunk ($len bytes of data):\n");
+        $et->VPrint(0, "RIFF '$tag' chunk ($len bytes of data):\n");
         if ($len <= 0) {
             if ($len < 0) {
-                $exifTool->Warn('Invalid chunk length');
+                $et->Warn('Invalid chunk length');
             } elsif ($tag eq "\0\0\0\0") {
                 # avoid reading through corupted files filled with nulls because it takes forever
-                $exifTool->Warn('Encountered empty null chunk. Processing aborted');
+                $et->Warn('Encountered empty null chunk. Processing aborted');
             } else {
                 next;
             }
@@ -1239,16 +1249,16 @@ sub ProcessRIFF($$)
         # --> no more because Adobe Bridge stores XMP after this!!
         # (so now we only do this on the FastScan option)
         if (($tag eq 'data' or $tag eq 'idx1' or $tag eq 'LIST_movi') and
-            $exifTool->Options('FastScan'))
+            $et->Options('FastScan'))
         {
-            $exifTool->VPrint(0, "(end of parsing)\n");
+            $et->VPrint(0, "(end of parsing)\n");
             last;
         }
         # RIFF chunks are padded to an even number of bytes
         my $len2 = $len + ($len & 0x01);
         if ($$tagTablePtr{$tag} or ($verbose and $tag !~ /^(data|idx1|LIST_movi|RIFF)$/)) {
             $raf->Read($buff, $len2) == $len2 or $err=1, last;
-            $exifTool->HandleTag($tagTablePtr, $tag, $buff,
+            $et->HandleTag($tagTablePtr, $tag, $buff,
                 DataPt  => \$buff,
                 DataPos => 0,   # (relative to Base)
                 Start   => 0,
@@ -1259,14 +1269,14 @@ sub ProcessRIFF($$)
             # don't read into RIFF chunk (ie. concatenated video file)
             $raf->Read($buff, 4) == 4 or $err=1, last;
             # extract information from remaining file as an embedded file
-            $$exifTool{DOC_NUM} = ++$$exifTool{DOC_COUNT}
+            $$et{DOC_NUM} = ++$$et{DOC_COUNT}
         } else {
             $raf->Seek($len2, 1) or $err=1, last;
         }
         $pos += $len2;
     }
-    delete $$exifTool{DOC_NUM};
-    $err and $exifTool->Warn('Error reading RIFF file (corrupted?)');
+    delete $$et{DOC_NUM};
+    $err and $et->Warn('Error reading RIFF file (corrupted?)');
     return 1;
 }
 
@@ -1290,7 +1300,7 @@ including Windows WAV audio and AVI video files.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -14,7 +14,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.07';
+$VERSION = '1.08';
 
 # Information decoded from Mac OS resources
 %Image::ExifTool::RSRC::Main = (
@@ -62,7 +62,7 @@ $VERSION = '1.07';
 # Returns: 1 on success, 0 if this wasn't a valid resource file
 sub ProcessRSRC($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my ($hdr, $map, $buff, $i, $j);
 
@@ -86,10 +86,10 @@ sub ProcessRSRC($$)
     # validate offsets in the resource map
     return 0 if $typeOff < 28 or $nameOff < 30;
 
-    $exifTool->SetFileType('RSRC') unless $$exifTool{IN_RESOURCE};
-    my $verbose = $exifTool->Options('Verbose');
+    $et->SetFileType('RSRC') unless $$et{IN_RESOURCE};
+    my $verbose = $et->Options('Verbose');
     my $tagTablePtr = GetTagTable('Image::ExifTool::RSRC::Main');
-    $exifTool->VerboseDir('RSRC', $numTypes+1);
+    $et->VerboseDir('RSRC', $numTypes+1);
 
     # parse resource type list
     for ($i=0; $i<=$numTypes; ++$i) {
@@ -120,7 +120,7 @@ sub ProcessRSRC($$)
                         ($valLen = unpack('N', $buff)) < 100000000 and # arbitrary size limit (100MB)
                         $raf->Read($val, $valLen) == $valLen)
                 {
-                    $exifTool->Warn("Error reading $resType resource");
+                    $et->Warn("Error reading $resType resource");
                     next;
                 }
             }
@@ -128,9 +128,9 @@ sub ProcessRSRC($$)
                 my ($resName, $nameLen);
                 $resName = '' unless $raf->Seek($resNameOff, 0) and $raf->Read($buff, 1) and
                     ($nameLen = ord $buff) != 0 and $raf->Read($resName, $nameLen) == $nameLen;
-                $exifTool->VPrint(0,sprintf("%s resource ID 0x%.4x (offset 0x%.4x, $valLen bytes, name='%s'):\n",
+                $et->VPrint(0,sprintf("%s resource ID 0x%.4x (offset 0x%.4x, $valLen bytes, name='%s'):\n",
                     $resType, $id, $resOff, $resName));
-                $exifTool->VerboseDump(\$val);
+                $et->VerboseDump(\$val);
             }
             next unless $tagInfo;
             if ($resType eq 'vers') {
@@ -142,21 +142,21 @@ sub ProcessRSRC($$)
                 my $vlen = Get8u(\$val, $p++);
                 next if $p + $vlen > $valLen;
                 my $tagTablePtr = GetTagTable('Image::ExifTool::RSRC::Main');
-                $val = $exifTool->Decode(substr($val, $p, $vlen), 'MacRoman');
+                $val = $et->Decode(substr($val, $p, $vlen), 'MacRoman');
             } elsif ($resType eq 'sfnt') {
                 # parse the OTF font block
                 $raf->Seek($resOff + 4, 0) or next;
                 $$dirInfo{Base} = $resOff + 4;
                 require Image::ExifTool::Font;
-                unless (Image::ExifTool::Font::ProcessOTF($exifTool, $dirInfo)) {
-                    $exifTool->Warn('Unrecognized sfnt resource format');
+                unless (Image::ExifTool::Font::ProcessOTF($et, $dirInfo)) {
+                    $et->Warn('Unrecognized sfnt resource format');
                 }
                 # assume this is a DFONT file unless processing the rsrc fork
-                $exifTool->OverrideFileType('DFONT') unless $$exifTool{DOC_NUM};
+                $et->OverrideFileType('DFONT') unless $$et{DOC_NUM};
                 next;
             } elsif ($resType eq '8BIM') {
                 my $ttPtr = GetTagTable('Image::ExifTool::Photoshop::Main');
-                $exifTool->HandleTag($ttPtr, $id, $val,
+                $et->HandleTag($ttPtr, $id, $val,
                     DataPt  => \$val,
                     DataPos => $resOff + 4,
                     Size    => $valLen,
@@ -189,12 +189,12 @@ sub ProcessRSRC($$)
                 $val = \@vals;
             } elsif ($resType eq 'POST') {
                 # assume this is a DFONT file unless processing the rsrc fork
-                $exifTool->OverrideFileType('DFONT') unless $$exifTool{DOC_NUM};
+                $et->OverrideFileType('DFONT') unless $$et{DOC_NUM};
                 $val = substr $val, 2;
             } elsif ($resType ne 'TEXT') {
                 next;
             }
-            $exifTool->HandleTag($tagTablePtr, $tag, $val);
+            $et->HandleTag($tagTablePtr, $tag, $val);
         }
     }
     return 1;
@@ -219,7 +219,7 @@ resource files.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -15,7 +15,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.01';
+$VERSION = '1.02';
 
 sub ProcessUserProps($$$);
 
@@ -146,7 +146,7 @@ sub ReadToNested($;$)
 # Returns: Unescaped text (in current ExifTool Charset)
 sub UnescapeRTF($$$)
 {
-    my ($exifTool, $val, $charset) = @_;
+    my ($et, $val, $charset) = @_;
 
     # return now unless we have a control sequence
     unless ($val =~ /\\/) {
@@ -180,7 +180,7 @@ sub UnescapeRTF($$$)
                 $skip = $2;
             } elsif ($1 eq 'u') {   # \uN
                 require Image::ExifTool::Charset;
-                $rtnVal .= Image::ExifTool::Charset::Recompose($exifTool, [$2]);
+                $rtnVal .= Image::ExifTool::Charset::Recompose($et, [$2]);
                 if ($skip) {
                     # must skip the specified number of characters
                     # (not simple because RTF control words count as a single character)
@@ -188,7 +188,7 @@ sub UnescapeRTF($$$)
                 }
             } elsif ($rtfEntity{$1}) {
                 require Image::ExifTool::Charset;
-                $rtnVal .= Image::ExifTool::Charset::Recompose($exifTool, [$rtfEntity{$1}]);
+                $rtnVal .= Image::ExifTool::Charset::Recompose($et, [$rtfEntity{$1}]);
             } # (else ignore the command)
         } else {
             my $ch = substr($val, $p1, 1);
@@ -198,7 +198,7 @@ sub UnescapeRTF($$$)
                 my $hex = substr($val, $p1 + 1, 2);
                 if ($hex =~ /^[0-9a-fA-F]{2}$/) {
                     require Image::ExifTool::Charset;
-                    $rtnVal .= $exifTool->Decode(chr(hex($hex)), $charset);
+                    $rtnVal .= $et->Decode(chr(hex($hex)), $charset);
                 }
                 pos($val) = $p1 + 3;    # skip to after the hex code
             } else {
@@ -220,13 +220,13 @@ sub UnescapeRTF($$$)
 # Returns: 1 on success, 0 if this wasn't a valid RTF file
 sub ProcessRTF($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my ($buff, $buf2, $cs);
     
     return 0 unless $raf->Read($buff, 64) and $raf->Seek(0,0);
     return 0 unless $buff =~ /^[\n\r]*\{[\n\r]*\\rtf[^a-zA-Z]/;
-    $exifTool->SetFileType();
+    $et->SetFileType();
 #
 # determine the RTF character set
 #
@@ -241,12 +241,12 @@ sub ProcessRTF($$)
         );
         $cs = $trans{$1};
     } else {
-        $exifTool->Warn('Unspecified RTF encoding. Will assume Latin');
+        $et->Warn('Unspecified RTF encoding. Will assume Latin');
         $cs = 'Latin';
     }
     my $charset = $Image::ExifTool::charsetName{lc $cs};
     unless ($charset) {
-        $exifTool->Warn("Unsupported RTF encoding $cs. Will assume Latin.");
+        $et->Warn("Unsupported RTF encoding $cs. Will assume Latin.");
         $charset = 'Latin';
     }
     my $tagTablePtr = GetTagTable('Image::ExifTool::RTF::Main');
@@ -267,7 +267,7 @@ sub ProcessRTF($$)
         pos($buff) = pos($buff) - 1 if $1 ne ' ';
         my $info = ReadToNested(\$buff, $raf);
         unless (defined $info) {
-            $exifTool->Warn('Unterminated information group');
+            $et->Warn('Unterminated information group');
             last;
         }
         # process info commands (ie. "\author", "\*\copyright");
@@ -288,13 +288,13 @@ sub ProcessRTF($$)
                 $val = sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2d", @t);
             } else {
                 # unescape RTF string value
-                $val = UnescapeRTF($exifTool, $val, $charset);
+                $val = UnescapeRTF($et, $val, $charset);
             }
             # create tagInfo for unknown tags
             if (not $tagInfo) {
                 AddTagToTable($tagTablePtr, $tag, { Name => ucfirst($tag) });
             }
-            $exifTool->HandleTag($tagTablePtr, $tag, $val);
+            $et->HandleTag($tagTablePtr, $tag, $val);
         }
     }
     return 1 unless defined $buff;
@@ -309,7 +309,7 @@ sub ProcessRTF($$)
         my $props = ReadToNested(\$buff, $raf);
         $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::RTF::UserProps');
         unless (defined $props) {
-            $exifTool->Warn('Unterminated user properties');
+            $et->Warn('Unterminated user properties');
             last;
         }
         # process user properties
@@ -319,7 +319,7 @@ sub ProcessRTF($$)
             my $t = $2;
             my $val = ReadToNested(\$props);
             last unless defined $val;
-            $val = UnescapeRTF($exifTool, $val, $charset);
+            $val = UnescapeRTF($et, $val, $charset);
             if ($t eq 'propname') {
                 $tag = $val;
                 next;
@@ -333,7 +333,7 @@ sub ProcessRTF($$)
             unless ($$tagTablePtr{$tag}) {
                 AddTagToTable($tagTablePtr, $tag, { Name => $tag });
             }
-            $exifTool->HandleTag($tagTablePtr, $tag, $val);
+            $et->HandleTag($tagTablePtr, $tag, $val);
         }
         last;   # (didn't really want to loop)
     }
@@ -359,7 +359,7 @@ information from RTF (Rich Text Format) documents.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -15,7 +15,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.00';
+$VERSION = '1.01';
 
 # Radiance tags
 %Image::ExifTool::Radiance::Main = (
@@ -61,26 +61,26 @@ $VERSION = '1.00';
 # Returns: 1 on success, 0 if this wasn't a valid RGBE image
 sub ProcessHDR($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my $buff;
     local $/ = "\x0a";  # set newline character for reading
 
     # verify this is a valid RIFF file
     return 0 unless $raf->ReadLine($buff) and $buff =~ /^#\?(RADIANCE|RGBE)\x0a/s;
-    $exifTool->SetFileType();
+    $et->SetFileType();
     my $tagTablePtr = GetTagTable('Image::ExifTool::Radiance::Main');
 
     while ($raf->ReadLine($buff)) {
         chomp $buff;
         last unless length($buff) > 0 and length($buff) < 4096;
         unless ($buff =~ /^(.*)?\s*=\s*(.*)/) {
-            $exifTool->HandleTag($tagTablePtr, '_command', $buff);
+            $et->HandleTag($tagTablePtr, '_command', $buff);
             next;
         }
         # use lower-case tag names to avoid conflicts with reserved tag table entries
         my ($tag, $val) = (lc $1, $2);
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
         unless ($tagInfo) {
             my $name = $tag;
             $name =~ tr/-_a-zA-Z0-9//dc;
@@ -89,13 +89,13 @@ sub ProcessHDR($$)
             $tagInfo = { Name => $name };
             AddTagToTable($tagTablePtr, $tag, $tagInfo);
         }
-        $exifTool->FoundTag($tagInfo, $val);
+        $et->FoundTag($tagInfo, $val);
     }
     # get image dimensions
     if ($raf->ReadLine($buff) and $buff =~ /([-+][XY])\s*(\d+)\s*([-+][XY])\s*(\d+)/) {
-        $exifTool->HandleTag($tagTablePtr, '_orient', "$1 $3");
-        $exifTool->FoundTag('ImageHeight', $2);
-        $exifTool->FoundTag('ImageWidth', $4);
+        $et->HandleTag($tagTablePtr, '_orient', "$1 $3");
+        $et->FoundTag('ImageHeight', $2);
+        $et->FoundTag('ImageWidth', $4);
     }
     return 1;
 }
@@ -120,7 +120,7 @@ images are a type of high dynamic-range image.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -14,7 +14,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.01';
+$VERSION = '1.03';
 
 # currently support this version Rawzor images
 my $implementedRawzorVersion = 199; # (up to version 1.99)
@@ -51,7 +51,7 @@ my $implementedRawzorVersion = 199; # (up to version 1.99)
 # Returns: 1 on success, 0 if this wasn't a valid Rawzor file
 sub ProcessRWZ($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my ($buff, $buf2);
 
@@ -71,23 +71,23 @@ sub ProcessRWZ($$)
     my $rwzSize = Get64u(\$buff, 10);
     my $origSize = Get64u(\$buff, 18);
     my $tagTablePtr = GetTagTable('Image::ExifTool::Rawzor::Main');
-    $exifTool->HandleTag($tagTablePtr, RawzorRequiredVersion => $reqVers);
-    $exifTool->HandleTag($tagTablePtr, RawzorCreatorVersion => $creatorVers);
-    $exifTool->HandleTag($tagTablePtr, OriginalFileSize => $origSize);
-    $exifTool->HandleTag($tagTablePtr, CompressionFactor => $origSize/$rwzSize) if $rwzSize;
+    $et->HandleTag($tagTablePtr, RawzorRequiredVersion => $reqVers);
+    $et->HandleTag($tagTablePtr, RawzorCreatorVersion => $creatorVers);
+    $et->HandleTag($tagTablePtr, OriginalFileSize => $origSize);
+    $et->HandleTag($tagTablePtr, CompressionFactor => $origSize/$rwzSize) if $rwzSize;
     # check version numbers
     if ($reqVers > $implementedRawzorVersion) {
-        $exifTool->Warn("Version $reqVers Rawzor images not yet supported");
+        $et->Warn("Version $reqVers Rawzor images not yet supported");
         return 1;
     }
     my $metaOffset = Get64u(\$buff, 38);
     if ($metaOffset > 0x7fffffff) {
-        $exifTool->Warn('Bad metadata offset');
+        $et->Warn('Bad metadata offset');
         return 1;
     }
     # check for the ability to uncompress the information
-    unless (eval 'require IO::Uncompress::Bunzip2') {
-        $exifTool->Warn('Install IO::Compress::Bzip2 to decode Rawzor bzip2 compression');
+    unless (eval { require IO::Uncompress::Bunzip2 }) {
+        $et->Warn('Install IO::Compress::Bzip2 to decode Rawzor bzip2 compression');
         return 1;
     }
     # read the metadata header:
@@ -99,7 +99,7 @@ sub ProcessRWZ($$)
     # 36 int32u - original metadata size
     # 40 int32u - compressed metadata size
     unless ($raf->Seek($metaOffset, 0) and $raf->Read($buff, 44) == 44) {
-        $exifTool->Warn('Error reading metadata header');
+        $et->Warn('Error reading metadata header');
         return 1;
     }
     my $metaSize = Get32u(\$buff, 36);
@@ -114,14 +114,14 @@ sub ProcessRWZ($$)
             $end0 + ($end1 - $pos1) + ($origSize - $pos2) == $metaSize and
             $end0 <= $pos1 and $pos1 <= $end1 and $end1 <= $pos2)
         {
-            $exifTool->Warn('Error reading image metadata');
+            $et->Warn('Error reading image metadata');
             return 1;
         }
         # uncompress the metadata
         unless (IO::Uncompress::Bunzip2::bunzip2(\$buff, \$buf2) and
             length($buf2) eq $metaSize)
         {
-            $exifTool->Warn('Error uncompressing image metadata');
+            $et->Warn('Error uncompressing image metadata');
             return 1;
         }
         # re-assemble the original file (sans image data)
@@ -132,19 +132,19 @@ sub ProcessRWZ($$)
         undef $buf2;
 
         # extract original information by calling ExtractInfo recursively
-        $exifTool->ExtractInfo(\$buff, { ReEntry => 1 });
+        $et->ExtractInfo(\$buff, { ReEntry => 1 });
         undef $buff;
     }
     # set OriginalFileType from FileType of original file
     # then change FileType and MIMEType to indicate a Rawzor image
-    my $origFileType = $exifTool->{VALUE}->{FileType};
+    my $origFileType = $$et{VALUE}{FileType};
     if ($origFileType) {
-        $exifTool->HandleTag($tagTablePtr, OriginalFileType => $origFileType);
-        $exifTool->{VALUE}->{FileType} = 'RWZ';
-        $exifTool->{VALUE}->{MIMEType} = 'image/x-rawzor';
+        $et->HandleTag($tagTablePtr, OriginalFileType => $origFileType);
+        $$et{VALUE}{FileType} = 'RWZ';
+        $$et{VALUE}{MIMEType} = 'image/x-rawzor';
     } else {
-        $exifTool->HandleTag($tagTablePtr, OriginalFileType => 'Unknown');
-        $exifTool->SetFileType();
+        $et->HandleTag($tagTablePtr, OriginalFileType => 'Unknown');
+        $et->SetFileType();
     }
     return 1;
 }
@@ -168,7 +168,7 @@ information from Rawzor compressed images.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -16,7 +16,7 @@ use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Canon;
 
-$VERSION = '1.04';
+$VERSION = '1.05';
 
 sub ProcessRealMeta($$$);
 sub ProcessRealProperties($$$);
@@ -355,13 +355,13 @@ my %metadataFlag = (
 # Returns: 1 on success
 sub ProcessRealProperties($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirLen = $$dirInfo{DirLen};
     my $pos = $$dirInfo{DirStart};
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
 
-    $verbose and $exifTool->VerboseDir('RealProperties', undef, $dirLen);
+    $verbose and $et->VerboseDir('RealProperties', undef, $dirLen);
 
     while ($pos + 6 <= $dirLen) {
 
@@ -390,7 +390,7 @@ sub ProcessRealProperties($$$)
         my $count = int($valLen / Image::ExifTool::FormatSize($format));
         my $val = ReadValue($dataPt, $pos, $format, $count, $dirLen-$pos);
 
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
         unless ($tagInfo) {
             my $tagName;
             ($tagName = $tag) =~ s/\s+//g;
@@ -399,7 +399,7 @@ sub ProcessRealProperties($$$)
             AddTagToTable($tagTablePtr, $tag, $tagInfo);
         }
         if ($verbose) {
-            $exifTool->VerboseInfo($tag, $tagInfo,
+            $et->VerboseInfo($tag, $tagInfo,
                 Table  => $tagTablePtr,
                 Value  => $val,
                 DataPt => $dataPt,
@@ -410,7 +410,7 @@ sub ProcessRealProperties($$$)
                 Count  => $count,
             );
         }
-        $exifTool->FoundTag($tagInfo, $val);
+        $et->FoundTag($tagInfo, $val);
         $pos += $valLen;
     }
     return 1;
@@ -422,16 +422,16 @@ sub ProcessRealProperties($$$)
 # Returns: 1 on success
 sub ProcessRealMeta($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dataPos = $$dirInfo{DataPos};
     my $pos = $$dirInfo{DirStart};
     my $dirEnd = $pos + $$dirInfo{DirLen};
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     my $prefix = $$dirInfo{Prefix} || '';
     $prefix and $prefix .= '/';
 
-    $verbose and $exifTool->VerboseDir('RealMetadata', undef, $$dirInfo{DirLen});
+    $verbose and $et->VerboseDir('RealMetadata', undef, $$dirInfo{DirLen});
 
     for (;;) {
         last if $pos + 28 > $dirEnd;
@@ -454,7 +454,7 @@ sub ProcessRealMeta($$$)
         last if $valuePos + $valueLen > $dirEnd;
 
         my $format = $metadataFormat{$type};
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
         unless ($tagInfo) {
             my $tagName = $tag;
             $tagName =~ tr/A-Za-z0-9//dc;
@@ -480,7 +480,7 @@ sub ProcessRealMeta($$$)
             }
             my $count = int($valueLen / Image::ExifTool::FormatSize($format));
             my $val = ReadValue($dataPt, $valuePos, $format, $count, $dirEnd-$valuePos);
-            $exifTool->HandleTag($tagTablePtr, $tag, $val,
+            $et->HandleTag($tagTablePtr, $tag, $val,
                 DataPt => $dataPt,
                 DataPos => $dataPos,
                 Start => $valuePos,
@@ -498,12 +498,12 @@ sub ProcessRealMeta($$$)
                 DirLen => $pos + $size - $dirStart,
                 Prefix => $tag,
             );
-            $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+            $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
         }
         $pos += $size;  # step to next Metadata structure
     }
     unless ($pos == $dirEnd) {
-        $exifTool->Warn('Format error in Real Metadata');
+        $et->Warn('Format error in Real Metadata');
         return 0;
     }
     return 1;
@@ -515,7 +515,7 @@ sub ProcessRealMeta($$$)
 # Returns: 1 on success, 0 if this wasn't a valid Real file
 sub ProcessReal($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my ($buff, $tag, $vers, $extra, @mimeTypes, %dirCount);
 
@@ -531,7 +531,7 @@ sub ProcessReal($$)
         $type = 'RA';
     } else {
         $tagTablePtr = GetTagTable('Image::ExifTool::Real::Metafile');
-        my $ext = $exifTool->{FILE_EXT};
+        my $ext = $$et{FILE_EXT};
         $type = ($ext and $ext eq 'RPM') ? 'RPM' : 'RAM';
         require Image::ExifTool::PostScript;
         local $/ = Image::ExifTool::PostScript::GetInputRecordSeparator($raf) || "\n";
@@ -543,19 +543,19 @@ sub ProcessReal($$)
             if ($type) {
                 # must be a Real file type if protocol is http
                 return 0 if $buff =~ /^http/ and $buff !~ /\.(ra|rm|rv|rmvb|smil)$/i;
-                $exifTool->SetFileType($type);
+                $et->SetFileType($type);
                 undef $type;
             }
             # save URL or Text from RAM file
             my $tag = $buff =~ m{^[a-z]{3,4}://} ? 'url' : 'txt';
-            $exifTool->HandleTag($tagTablePtr, $tag, $buff);
+            $et->HandleTag($tagTablePtr, $tag, $buff);
         }
         return 1;
     }
 
-    $exifTool->SetFileType($type);
+    $et->SetFileType($type);
     SetByteOrder('MM');
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
 #
 # Process RealAudio file
 #
@@ -564,12 +564,12 @@ sub ProcessReal($$)
         $tag = ".ra$vers";
         my $fpos = $raf->Tell();
         unless ($raf->Read($buff, 512)) {
-            $exifTool->Warn('Error reading audio header');
+            $et->Warn('Error reading audio header');
             return 1;
         }
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
         if ($verbose > 2) {
-            $exifTool->VerboseInfo($tag, $tagInfo, DataPt => \$buff, DataPos => $fpos);
+            $et->VerboseInfo($tag, $tagInfo, DataPt => \$buff, DataPos => $fpos);
         }
         if ($tagInfo) {
             my $subTablePtr = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
@@ -579,9 +579,9 @@ sub ProcessReal($$)
                 DirLen   => length $buff,
                 DirStart => 0,
             );
-            $exifTool->ProcessDirectory(\%dirInfo, $subTablePtr);
+            $et->ProcessDirectory(\%dirInfo, $subTablePtr);
         } else {
-            $exifTool->Warn('Unsupported RealAudio version');
+            $et->Warn('Unsupported RealAudio version');
         }
         return 1;
     }
@@ -591,7 +591,7 @@ sub ProcessReal($$)
     # skip the rest of the RM header
     my $size = unpack('x4N', $buff);
     unless ($raf->Seek($size - 8, 1)) {
-        $exifTool->Warn('Error seeking in file');
+        $et->Warn('Error seeking in file');
         return 0;
     }
 
@@ -601,23 +601,23 @@ sub ProcessReal($$)
         ($tag, $size, $vers) = unpack('a4Nn', $buff);
         last if $tag eq "\0\0\0\0";
         if ($verbose) {
-            $exifTool->VPrint(0, "$tag chunk ($size bytes):\n");
+            $et->VPrint(0, "$tag chunk ($size bytes):\n");
         } else {
             last if $tag eq 'DATA'; # stop normal parsing at DATA tag
         }
         if ($size & 0x80000000) {
-            $exifTool->Warn('Bad chunk header');
+            $et->Warn('Bad chunk header');
             last;
         }
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
         if ($tagInfo and $$tagInfo{SubDirectory}) {
             my $fpos = $raf->Tell();
             unless ($raf->Read($buff, $size-10) == $size-10) {
-                $exifTool->Warn("Error reading $tag chunk");
+                $et->Warn("Error reading $tag chunk");
                 last;
             }
             if ($verbose > 2) {
-                $exifTool->VerboseInfo($tag, $tagInfo, DataPt => \$buff, DataPos => $fpos);
+                $et->VerboseInfo($tag, $tagInfo, DataPt => \$buff, DataPos => $fpos);
             }
             my $subTablePtr = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
             my %dirInfo = (
@@ -627,30 +627,30 @@ sub ProcessReal($$)
                 DirStart => 0,
             );
             if ($dirCount{$tag}) {
-                $exifTool->{SET_GROUP1} = '+' . ++$dirCount{$tag};
+                $$et{SET_GROUP1} = '+' . ++$dirCount{$tag};
             } else {
                 $dirCount{$tag} = 1;
             }
-            $exifTool->ProcessDirectory(\%dirInfo, $subTablePtr);
-            delete $exifTool->{SET_GROUP1};
+            $et->ProcessDirectory(\%dirInfo, $subTablePtr);
+            delete $$et{SET_GROUP1};
             # keep track of stream MIME types
-            my $mime = $exifTool->{RealStreamMime};
+            my $mime = $$et{RealStreamMime};
             if ($mime) {
-                delete $exifTool->{RealStreamMime};
+                delete $$et{RealStreamMime};
                 $mime =~ s/\0.*//s;
                 push @mimeTypes, $mime unless $mime =~ /^logical-/;
             }
         } else {
             unless ($raf->Seek($size-10, 1)) {
-                $exifTool->Warn('Error seeking in file');
+                $et->Warn('Error seeking in file');
                 last;
             }
         }
     }
     # override MIMEType with stream MIME type if we only have one stream
     if (@mimeTypes == 1 and length $mimeTypes[0]) {
-        $exifTool->{VALUE}->{MIMEType} = $mimeTypes[0];
-        $exifTool->VPrint(0, "  MIMEType = $mimeTypes[0]\n");
+        $$et{VALUE}{MIMEType} = $mimeTypes[0];
+        $et->VPrint(0, "  MIMEType = $mimeTypes[0]\n");
     }
 #
 # Process footer containing Real metadata and ID3 information
@@ -668,19 +668,19 @@ sub ProcessReal($$)
                 DirLen => length($buff) - 8,
             );
             my $tagTablePtr = GetTagTable('Image::ExifTool::Real::Metadata');
-            $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+            $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
         } else {
-            $exifTool->Warn('Bad metadata footer');
+            $et->Warn('Bad metadata footer');
         }
         if ($raf->Seek(-128, 2) and $raf->Read($buff, 128) == 128 and $buff =~ /^TAG/) {
-            $exifTool->VPrint(0, "ID3v1:\n");
+            $et->VPrint(0, "ID3v1:\n");
             my %dirInfo = (
                 DataPt => \$buff,
                 DirStart => 0,
                 DirLen => length($buff),
             );
             my $tagTablePtr = GetTagTable('Image::ExifTool::ID3::v1');
-            $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+            $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
         }
     }
     return 1;
@@ -712,7 +712,7 @@ little-endian, but the Real format is big-endian.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -177,7 +177,7 @@ maker notes in Reconyx cameras.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -7,6 +7,7 @@
 #
 # References:   1) http://www.ozhiker.com/electronics/pjmt/jpeg_info/ricoh_mn.html
 #               2) http://homepage3.nifty.com/kamisaka/makernote/makernote_ricoh.htm
+#               3) Tim Gray private communication (GR)
 #------------------------------------------------------------------------------
 
 package Image::ExifTool::Ricoh;
@@ -16,7 +17,7 @@ use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Exif;
 
-$VERSION = '1.24';
+$VERSION = '1.26';
 
 sub ProcessRicohText($$$);
 sub ProcessRicohRMETA($$$);
@@ -77,19 +78,312 @@ my %ricohLensIDs = (
         Description => 'Print Image Matching',
         SubDirectory => { TagTable => 'Image::ExifTool::PrintIM::Main' },
     },
-    0x1001 => {
+    0x1000 => { #3
+        Name => 'RecordingFormat',
+        Writable => 'int16u',
+        PrintConv => {
+            2 => 'JPEG',
+            3 => 'DNG',
+        },
+    },            
+    0x1001 => [{
         Name => 'ImageInfo',
+        Condition => '$format ne "int16u"',
         SubDirectory => { TagTable => 'Image::ExifTool::Ricoh::ImageInfo' },
-    },
-    0x1003 => {
+    },{ #3
+        Name => 'ExposureProgram',
+        Writable => 'int16u',
+        Notes => 'GR',
+        PrintConv => {
+            1 => 'Auto',
+            2 => 'Program AE',
+            3 => 'Aperture-priority AE',
+            4 => 'Shutter speed priority AE',
+            5 => 'Shutter/aperture priority AE', # TAv
+            6 => 'Manual',
+            7 => 'Movie', #PH
+        },
+    }],
+    0x1002 => { #3
+        Name => 'DriveMode',
+        Condition => '$format eq "int16u"',
+        Notes => 'valid only for some models',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Single-frame',
+            1 => 'Continuous',
+            8 => 'AF-priority Continuous',
+        },
+    },            
+    0x1003 => [{
         Name => 'Sharpness',
+        Condition => '$format ne "int16u"',
         Writable => 'int32u',
         PrintConv => {
             0 => 'Sharp',
             1 => 'Normal',
             2 => 'Soft',
         },
+    },{ #3
+        Name => 'WhiteBalance',
+        Writable => 'int16u',
+        Notes => 'GR',
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'Multi-P Auto',
+            2 => 'Daylight',
+            3 => 'Cloudy',
+            4 => 'Incandescent 1',
+            5 => 'Incandescent 2',
+            6 => 'Daylight Fluorescent',
+            7 => 'Neutral White Fluorescent',
+            8 => 'Cool White Fluorescent',
+            9 => 'Warm White Fluorescent',
+            10 => 'Manual',
+            11 => 'Kelvin',
+        },
+    }],
+    0x1004 => { #3
+        Name => 'WhiteBalanceFineTune',
+        Condition => '$format eq "int16u"',
+        Format => 'int16s',
+        Writable => 'int16u',
+        Notes => q{
+            2 numbers: amount of adjustment towards Amber and Green.  Not valid for all
+            models
+        },
+    },
+    # 0x1005 int16u - 5
+    0x1006 => { #3
+        Name => 'FocusMode',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'Manual',
+            2 => 'Multi AF',
+            3 => 'Spot AF',
+            4 => 'Snap',
+            5 => 'Infinity',
+            7 => 'Face Detect', #PH
+            8 => 'Subject Tracking',
+            9 => 'Pinpoint AF',
+            10 => 'Movie', #PH
+        },
+    },
+    0x1007 => { #3
+        Name => 'AutoBracketing',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            9 => 'AE',
+            11 => 'WB',
+            16 => 'DR', # (dynamic range)
+            17 => 'Contrast',
+            18 => 'WB2', # (selects two different WB presets besides normal)
+            19 => 'Effect',
+        },
+    },
+    0x1009 => { #3
+        Name => 'MacroMode',
+        Writable => 'int16u',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+    0x100a => { #3
+        Name => 'FlashMode',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Auto, Fired',
+            2 => 'On',
+            3 => 'Auto, Fired, Red-eye reduction',
+            4 => 'Slow Sync',
+            5 => 'Manual',
+            6 => 'On, Red-eye reduction',
+            7 => 'Synchro, Red-eye reduction',
+            8 => 'Auto, Did not fire',
+        },
+    },
+    0x100b => { #3
+        Name => 'FlashExposureComp',
+        Writable => 'rational64s',
+        PrintConv => '$val ? sprintf("%+.1f",$val) : $val',
+        PrintConvInv => '$val',
+    },
+    0x100c => { #3
+        Name => 'ManualFlashOutput',
+        Writable => 'rational64s',
+        PrintConv => {
+               0 => 'Full',
+             -24 => '1/1.4',
+             -48 => '1/2',
+             -72 => '1/2.8',
+             -96 => '1/4',
+            -120 => '1/5.6',
+            -144 => '1/8',
+            -168 => '1/11',
+            -192 => '1/16',
+            -216 => '1/22',
+            -240 => '1/32',
+            -288 => '1/64',
+        },
+    },
+    0x100d => { #3
+        Name => 'FullPressSnap',
+        Writable => 'int16u',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+    0x100e => { #3
+        Name => 'DynamicRangeExpansion',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            3 => 'Weak',
+            4 => 'Medium',
+            5 => 'Strong',
+        },
+    },
+    0x100f => { #3
+        Name => 'NoiseReduction',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Weak',
+            2 => 'Medium',
+            3 => 'Strong',
+        },
+    },
+    0x1010 => { #3
+        Name => 'ImageEffects',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Standard',
+            1 => 'Vivid',
+            3 => 'Black & White',
+            5 => 'B&W Toning Effect',
+            6 => 'Setting 1',
+            7 => 'Setting 2',
+            9 => 'High-contrast B&W',
+            10 => 'Cross Process',
+            11 => 'Positive Film',
+            12 => 'Bleach Bypass',
+            13 => 'Retro',
+            15 => 'Miniature',
+            17 => 'High Key',
+        },
+    },
+    0x1011 => { #3
+        Name => 'Vignetting',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Low',
+            2 => 'Medium',
+            3 => 'High',
+        },
+    },
+    0x1012 => { #PH
+        Name => 'Contrast',
+        Writable => 'int32u',
+        Format => 'int32s', #3 (high-contrast B&W also has -1 and -2 settings)
+        PrintConv => {
+            OTHER => sub { shift },
+            2147483647 => 'MAX', #3 (high-contrast B&W effect MAX setting)
+        },
+    },
+    0x1013 => { Name => 'Saturation', Writable => 'int32u' }, #PH
+    0x1014 => { Name => 'Sharpness',  Writable => 'int32u' }, #3
+    0x1015 => { #3
+        Name => 'ToningEffect',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Sepia',
+            2 => 'Red',
+            3 => 'Green',
+            4 => 'Blue',
+            5 => 'Purple',
+            6 => 'B&W',
+            7 => 'Color',
+        },
+    },
+    0x1016 => { #3
+        Name => 'HueAdjust',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Basic',
+            2 => 'Magenta',
+            3 => 'Yellow',
+            4 => 'Normal',
+            5 => 'Warm',
+            6 => 'Cool',
+        },
     },
+    0x1017 => { #3
+        Name => 'WideAdapter',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Not Attached',
+            2 => 'Attached', # (21mm)
+        },
+    },
+    0x1018 => { #3
+        Name => 'CropMode35mm',
+        Writable => 'int16u',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+    0x1019 => { #3
+        Name => 'NDFilter',
+        Writable => 'int16u',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+    0x101a => { Name => 'WBBracketShotNumber', Writable => 'int16u' }, #3
+    # 0x1100 - related to DR correction (ref 3)
+    0x1307 => { Name => 'ColorTempKelvin',     Writable => 'int32u' }, #3
+    0x1308 => { Name => 'ColorTemperature',    Writable => 'int32u' }, #3
+    0x1500 => { #3
+        Name => 'FocalLength',
+        Writable => 'rational64u',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+        PrintConvInv => '$val=~s/\s*mm$//;$val',
+    },
+    0x1200 => { #3
+        Name => 'AFStatus',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Out of Focus',
+            1 => 'In Focus',
+        },
+    },
+    # 0x1201-0x1204 - related to focus points (ref 3)
+    0x1201 => { #PH (NC)
+        Name => 'AFAreaXPosition1',
+        Writable => 'int32u',
+        Notes => 'manual AF area position in a 1280x864 image',
+    },
+    0x1202 => { Name => 'AFAreaYPosition1', Writable => 'int32u' }, #PH (NC)
+    0x1203 => { #PH (NC)
+        Name => 'AFAreaXPosition',
+        Writable => 'int32u',
+        Notes => 'manual AF area position in the full image',
+        # (coordinates change to correspond with smaller image
+        #  when recording reduced-size JPEG)
+    },
+    0x1204 => { Name => 'AFAreaYPosition', Writable => 'int32u' }, #PH (NC)
+    0x1205 => { #3
+        Name => 'AFAreaMode',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Auto',
+            2 => 'Manual',
+        },
+    },
+    0x1601 => { Name => 'SensorWidth',  Writable => 'int32u' }, #3
+    0x1602 => { Name => 'SensorHeight', Writable => 'int32u' }, #3
+    0x1603 => { Name => 'CroppedImageWidth',  Writable => 'int32u' }, #3
+    0x1604 => { Name => 'CroppedImageHeight', Writable => 'int32u' }, #3
+    # 0x1700 - Composite? (0=normal image, 1=interval composite, 2=multi-exposure composite) (ref 3)
+    # 0x1703 - 0=normal, 1=final composite (ref 3)
+    # 0x1704 - 0=normal, 2=final composite (ref 3)
     0x2001 => [
         {
             Name => 'RicohSubdir',
@@ -547,32 +841,32 @@ Image::ExifTool::AddCompositeTags('Image::ExifTool::Ricoh');
 # Returns: 1 on success, otherwise returns 0 and sets a Warning
 sub ProcessRicohText($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dataLen = $$dirInfo{DataLen};
     my $dirStart = $$dirInfo{DirStart} || 0;
     my $dirLen = $$dirInfo{DirLen} || $dataLen - $dirStart;
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
 
     my $data = substr($$dataPt, $dirStart, $dirLen);
     return 1 if $data =~ /^\0/;     # blank Ricoh maker notes
     # validate text maker notes
     unless ($data =~ /^(Rev|Rv)/) {
-        $exifTool->Warn('Bad Ricoh maker notes');
+        $et->Warn('Bad Ricoh maker notes');
         return 0;
     }
     while ($data =~ m/([A-Z][a-z]{1,2})([0-9A-F]+);/sg) {
         my $tag = $1;
         my $val = $2;
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
         if ($verbose) {
-            $exifTool->VerboseInfo($tag, $tagInfo,
+            $et->VerboseInfo($tag, $tagInfo,
                 Table  => $tagTablePtr,
                 Value  => $val,
             );
         }
         unless ($tagInfo) {
-            next unless $exifTool->{OPTIONS}->{Unknown};
+            next unless $$et{OPTIONS}{Unknown};
             $tagInfo = {
                 Name => "Ricoh_Text_$tag",
                 Unknown => 1,
@@ -581,7 +875,7 @@ sub ProcessRicohText($$$)
             # add tag information to table
             AddTagToTable($tagTablePtr, $tag, $tagInfo);
         }
-        $exifTool->FoundTag($tagInfo, $val);
+        $et->FoundTag($tagInfo, $val);
     }
     return 1;
 }
@@ -592,32 +886,33 @@ sub ProcessRicohText($$$)
 # Returns: 1 on success, otherwise returns 0 and sets a Warning
 sub ProcessRicohRMETA($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirStart = $$dirInfo{DirStart};
     my $dataLen = length($$dataPt);
     my $dirLen = $dataLen - $dirStart;
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
 
-    $exifTool->VerboseDir('Ricoh RMETA') if $verbose;
-    $dirLen > 6 or $exifTool->Warn('Truncated Ricoh RMETA data', 1), return 0;
+    $et->VerboseDir('Ricoh RMETA') if $verbose;
+    $dirLen > 6 or $et->Warn('Truncated Ricoh RMETA data', 1), return 0;
     my $byteOrder = substr($$dataPt, $dirStart, 2);
-    SetByteOrder($byteOrder) or $exifTool->Warn('Bad Ricoh RMETA data', 1), return 0;
-    my $rmetaType = Get16u($dataPt, $dirStart+4);
-    if ($rmetaType != 0) {
-        # not sure how to recognize audio, so do it by brute force and assume
-        # all subsequent RMETA segments are part of the audio data
-        $dirLen < 14 and $exifTool->Warn('Short Ricoh RMETA block', 1), return 0;
+    SetByteOrder($byteOrder) or $et->Warn('Bad Ricoh RMETA data', 1), return 0;
+    my $rmetaNum = Get16u($dataPt, $dirStart+4);
+    if ($rmetaNum != 0) {
+        # not sure how to recognize audio, so do it by checking for "RIFF" header
+        # and assume all subsequent RMETA segments are part of the audio data
+        # (but it looks like the int16u at $dirStart+6 is the next block number
+        # if the data is continued, or 0 for the last block)
+        $dirLen < 14 and $et->Warn('Short Ricoh RMETA block', 1), return 0;
         my $audioLen = Get16u($dataPt, $dirStart+12);
-        $audioLen + 14 > $dirLen and $exifTool->Warn('Truncated Ricoh RMETA audio data', 1), return 0;
+        $audioLen + 14 > $dirLen and $et->Warn('Truncated Ricoh RMETA audio data', 1), return 0;
         my $buff = substr($$dataPt, $dirStart + 14, $audioLen);
-        my $val = $$exifTool{VALUE}{SoundFile};
-        if ($val) {
-            $$val .= $buff;
-        } elsif ($audioLen >= 4 and substr($buff, 0, 4) eq 'RIFF') {
-            $exifTool->HandleTag($tagTablePtr, '_audio', \$buff);
+        if ($audioLen >= 4 and substr($buff, 0, 4) eq 'RIFF') {
+            $et->HandleTag($tagTablePtr, '_audio', \$buff);
+        } elsif ($$et{VALUE}{SoundFile}) {
+            ${$$et{VALUE}{SoundFile}} .= $buff;
         } else {
-            $exifTool->Warn('Unknown Ricoh RMETA type', 1);
+            $et->Warn('Unknown Ricoh RMETA type', 1);
             return 0;
         }
         return 1;
@@ -632,7 +927,7 @@ sub ProcessRicohRMETA($$$)
         $pos += 4;
         $size -= 2;
         if ($size < 0 or $pos + $size > $dataLen) {
-            $exifTool->Warn('Corrupted Ricoh RMETA data', 1);
+            $et->Warn('Corrupted Ricoh RMETA data', 1);
             last;
         }
         if ($type eq 1) {
@@ -658,7 +953,7 @@ sub ProcessRicohRMETA($$$)
     if (@tags or @vals) {
         if (@tags < @vals) {
             my ($nt, $nv) = (scalar(@tags), scalar(@vals));
-            $exifTool->Warn("Fewer tags ($nt) than values ($nv) in Ricoh RMETA", 1);
+            $et->Warn("Fewer tags ($nt) than values ($nv) in Ricoh RMETA", 1);
         }
         # find next tag in null-delimited list
         # unpack numerical values from block of int16u values
@@ -670,10 +965,10 @@ sub ProcessRicohRMETA($$$)
             $name =~ s/ (\w)/\U$1/g;                # remove special characters
             $name = 'RMETA_Unknown' unless length($name);
             my $num = shift @nums;
-            my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+            my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
             if ($tagInfo) {
                 # make sure print conversion is defined
-                $$tagInfo{PrintConv} = { } unless $$tagInfo{PrintConv};
+                $$tagInfo{PrintConv} = { } unless ref $$tagInfo{PrintConv} eq 'HASH';
             } else {
                 # create tagInfo hash
                 $tagInfo = { Name => $name, PrintConv => { } };
@@ -682,9 +977,9 @@ sub ProcessRicohRMETA($$$)
             # use string value directly if no numerical value
             $num = $val unless defined $num;
             # add conversion for this value (replacing any existing entry)
-            $tagInfo->{PrintConv}->{$num} = $val;
+            $tagInfo->{PrintConv}->{$num} = length $val ? $val : $num;
             if ($verbose) {
-                $exifTool->VerboseInfo($tag, $tagInfo,
+                $et->VerboseInfo($tag, $tagInfo,
                     Table   => $tagTablePtr,
                     Value   => $num,
                     DataPt  => $dataPt,
@@ -693,7 +988,7 @@ sub ProcessRicohRMETA($$$)
                     Size    => length($val),
                 );
             }
-            $exifTool->FoundTag($tagInfo, $num);
+            $et->FoundTag($tagInfo, $num);
             $valPos += length($val) + 1;
         }
     }
@@ -719,7 +1014,7 @@ interpret Ricoh maker notes EXIF meta information.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -732,6 +1027,10 @@ under the same terms as Perl itself.
 
 =back
 
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Tim Gray for his help decoding a number of tags for the Ricoh GR.
+
 =head1 SEE ALSO
 
 L<Image::ExifTool::TagNames/Ricoh Tags>,
@@ -9,6 +9,7 @@
 #               2) http://www.cybercom.net/~dcoffin/dcraw/
 #               3) Pascal de Bruijn private communication (NX100)
 #               4) Jaroslav Stepanek via rt.cpan.org
+#               5) Niels Kristian Bech Jensen private communication
 #------------------------------------------------------------------------------
 
 package Image::ExifTool::Samsung;
@@ -18,7 +19,7 @@ use vars qw($VERSION %samsungLensTypes);
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Exif;
 
-$VERSION = '1.17';
+$VERSION = '1.24';
 
 sub WriteSTMN($$$);
 sub ProcessINFO($$$);
@@ -39,7 +40,10 @@ sub ProcessSamsungIFD($$$);
     7 => 'Samsung NX 60mm F2.8 Macro ED OIS SSA', #1
     8 => 'Samsung NX 16mm F2.4 Pancake', #1/4
     9 => 'Samsung NX 85mm F1.4 ED SSA', #4
+    10 => 'Samsung NX 45mm F1.8', #3
+    11 => 'Samsung NX 45mm F1.8 2D/3D', #3
     12 => 'Samsung NX 12-24mm F4-5.6 ED', #4
+    14 => 'Samsung NX 10mm F3.5 Fisheye', #5
 );
 
 # range of values for Formats used in encrypted information
@@ -51,7 +55,7 @@ my %formatMinMax = (
 );
 
 # Samsung "STMN" maker notes (ref PH)
-%Image::ExifTool::Samsung::Type1 = (
+%Image::ExifTool::Samsung::Main = (
     PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
     WRITE_PROC => \&WriteSTMN,
     CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
@@ -95,7 +99,7 @@ my %formatMinMax = (
 %Image::ExifTool::Samsung::IFD = (
     PROCESS_PROC => \&ProcessSamsungIFD,
     NOTES => q{
-        This is a standard-format IFD found in the Type1 maker notes of some Samsung
+        This is a standard-format IFD found in the maker notes of some Samsung
         models, except that the entry count is a 4-byte integer and the offsets are
         relative to the end of the IFD.  Currently, no tags in this IFD are known,
         so the Unknown (-u) or Verbose (-v) option must be used to see this
@@ -592,6 +596,83 @@ my %formatMinMax = (
     4 => { Name => 'ThumbnailOffset', IsOffset => 1 },
 );
 
+# Samsung MP4 @sec information (PH - from WB30F sample)
+%Image::ExifTool::Samsung::sec = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        This information is found in the @sec atom of Samsung MP4 videos from models
+        such as the WB30F.
+    },
+    0x00 => {
+        Name => 'Make',
+        Format => 'string[32]',
+        PrintConv => 'ucfirst(lc($val))',
+    },
+    0x20 => {
+        Name => 'Model',
+        Description => 'Camera Model Name',
+        Format => 'string[32]',
+    },
+    0x200 => { Name => 'ThumbnailWidth',  Format => 'int32u' },
+    0x204 => { Name => 'ThumbnailHeight', Format => 'int32u' },
+    0x208 => { Name => 'ThumbnailLength', Format => 'int32u' }, # (2 bytes too long in my sample)
+    0x20c => {
+        Name => 'ThumbnailImage',
+        Format => 'undef[$val{0x208}]',
+        Notes => 'the THM image, embedded metadata is extracted as the first sub-document',
+        SetBase => 1,
+        RawConv => q{
+            my $pt = $self->ValidateImage(\$val, $tag);
+            if ($pt) {
+                $$self{BASE} += 0x20c;
+                $$self{DOC_NUM} = ++$$self{DOC_COUNT};
+                $self->ExtractInfo($pt, { ReEntry => 1 });
+                $$self{DOC_NUM} = 0;
+            }
+            return $pt;
+        },
+    },
+);
+
+# Samsung MP4 smta information (PH - from SM-C101 sample)
+%Image::ExifTool::Samsung::smta = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Video' },
+    NOTES => q{
+        This information is found in the smta atom of Samsung MP4 videos from models
+        such as the Galaxy S4.
+    },
+    svss => {
+        Name => 'SamsungSvss',
+        SubDirectory => { TagTable => 'Image::ExifTool::Samsung::svss' },
+    },
+    # swtr - 4 bytes, all zero
+    # scid - 8 bytes, all zero
+    # saut - 4 bytes, all zero
+);
+
+# Samsung MP4 svss information (PH - from SM-C101 sample)
+%Image::ExifTool::Samsung::svss = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Video' },
+    NOTES => q{
+        This information is found in the svss atom of Samsung MP4 videos from models
+        such as the Galaxy S4.
+    },
+    # junk - 10240 bytes, all zero
+);
+
+# thumbnail image information found in some MP4 videos
+%Image::ExifTool::Samsung::Thumbnail2 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FIRST_ENTRY => 0,
+    FORMAT => 'int32u',
+    1 => 'ThumbnailWidth',
+    2 => 'ThumbnailHeight',
+    3 => 'ThumbnailLength',
+    4 => { Name => 'ThumbnailOffset', IsOffset => 1 },
+);
+
 # Samsung composite tags
 %Image::ExifTool::Samsung::Composite = (
     GROUPS => { 2 => 'Image' },
@@ -623,8 +704,8 @@ Image::ExifTool::AddCompositeTags('Image::ExifTool::Samsung');
 #    (in which case the first value of the tag gives the array length)
 sub Crypt($$$@)
 {
-    my ($exifTool, $val, $tagInfo, @salt) = @_;
-    my $key = $$exifTool{EncryptionKey} or return undef;
+    my ($et, $val, $tagInfo, @salt) = @_;
+    my $key = $$et{EncryptionKey} or return undef;
     my $format = $$tagInfo{Writable} || $$tagInfo{Format} or return undef;
     return undef unless $formatMinMax{$format};
     my ($min, $max) = @{$formatMinMax{$format}};
@@ -655,12 +736,12 @@ sub Crypt($$$@)
 # Returns: 1 on success
 sub ProcessINFO($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $pos = $$dirInfo{DirStart};
     my $len = $$dirInfo{DirLen};
     my $end = $pos + $len;
-    $exifTool->VerboseDir('INFO', undef, $len);
+    $et->VerboseDir('INFO', undef, $len);
     while ($pos + 8 <= $end) {
         my $tag = substr($$dataPt, $pos, 4);
         my $val = Get32u($dataPt, $pos + 4);
@@ -669,7 +750,7 @@ sub ProcessINFO($$$)
             $name =~ tr/-_0-9a-zA-Z//dc;
             AddTagToTable($tagTablePtr, $tag, { Name => $name }) if $name;
         }
-        $exifTool->HandleTag($tagTablePtr, $tag, $val);
+        $et->HandleTag($tagTablePtr, $tag, $val);
         $pos += 8;
     }
     return 1;
@@ -680,7 +761,7 @@ sub ProcessINFO($$$)
 # Returns: true on success
 sub ProcessSamsungIFD($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $len = $$dirInfo{DataLen};
     my $pos = $$dirInfo{DirStart};
     return 0 unless $pos + 4 < $len;
@@ -690,10 +771,10 @@ sub ProcessSamsungIFD($$$)
     # (the string "Park Byeongchan" is often found here)
     return 0 unless $buff =~ s/^([^\0])\0\0\0/$1\0$1\0/s;
     my $numEntries = ord $1;
-    if ($$exifTool{HTML_DUMP}) {
+    if ($$et{HTML_DUMP}) {
         my $pt = $$dirInfo{DirStart} + $$dirInfo{DataPos} + $$dirInfo{Base};
-        $exifTool->HDump($pt-44, 44, "MakerNotes header", 'Samsung Type1');
-        $exifTool->HDump($pt, 4, "MakerNotes entries", "Format: int32u\nEntry count: $numEntries");
+        $et->HDump($pt-44, 44, "MakerNotes header", 'Samsung');
+        $et->HDump($pt, 4, "MakerNotes entries", "Format: int32u\nEntry count: $numEntries");
         $$dirInfo{NoDumpEntryCount} = 1;
     }
     substr($$dataPt, $pos, 4) = $buff;      # insert bogus 2-byte entry count
@@ -703,8 +784,8 @@ sub ProcessSamsungIFD($$$)
     $$dirInfo{DataPos} -= $shift;
     $$dirInfo{DirStart} += 2;       # start at bogus entry count
     $$dirInfo{ZeroOffsetOK} = 1;    # disable check for zero offset
-    delete $$exifTool{NO_UNKNOWN};  # (set for BinaryData, but not for EXIF IFD's)
-    my $rtn = Image::ExifTool::Exif::ProcessExif($exifTool, $dirInfo, $tagTablePtr);
+    delete $$et{NO_UNKNOWN};  # (set for BinaryData, but not for EXIF IFD's)
+    my $rtn = Image::ExifTool::Exif::ProcessExif($et, $dirInfo, $tagTablePtr);
     substr($$dataPt, $pos + 2, 1) = "\0";   # remove bogus count
     return $rtn;
 }
@@ -715,12 +796,12 @@ sub ProcessSamsungIFD($$$)
 # Returns: Binary data block or undefined on error
 sub WriteSTMN($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     # create a Fixup for the PreviewImage
     $$dirInfo{Fixup} = new Image::ExifTool::Fixup;
-    my $val = Image::ExifTool::WriteBinaryData($exifTool, $dirInfo, $tagTablePtr);
+    my $val = Image::ExifTool::WriteBinaryData($et, $dirInfo, $tagTablePtr);
     # force PreviewImage into the trailer even if it fits in EXIF segment
-    $$exifTool{PREVIEW_INFO}{IsTrailer} = 1 if $$exifTool{PREVIEW_INFO};
+    $$et{PREVIEW_INFO}{IsTrailer} = 1 if $$et{PREVIEW_INFO};
     return $val;
 }
 
@@ -743,7 +824,7 @@ Samsung maker notes in EXIF information.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -418,7 +418,7 @@ Sanyo maker notes in EXIF information.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -0,0 +1,141 @@
+#------------------------------------------------------------------------------
+# File:         Scalado.pm
+#
+# Description:  Read APP4 SCALADO metadata
+#
+# Revisions:    2013-09-13 - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Scalado;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::PLIST;
+
+$VERSION = '1.01';
+
+sub ProcessScalado($$$);
+
+# JPEG APP4 SCALADO tags
+%Image::ExifTool::Scalado::Main = (
+    GROUPS => { 0 => 'APP4', 1 => 'Scalado', 2 => 'Image' },
+    PROCESS_PROC => \&ProcessScalado,
+    TAG_PREFIX => 'Scalado',
+    FORMAT => 'int32s',
+    NOTES => q{
+        Tags extracted from the JPEG APP4 "SCALADO" segment found in images from
+        HTC, LG and Samsung phones.  (Presumably written by Scalado mobile software,
+        L<http://www.scalado.com/>.)
+    },
+    SPMO => {
+        Name => 'DataLength',
+        Unknown => 1,
+    },
+    WDTH => {
+        Name => 'PreviewImageWidth',
+        ValueConv => '$val ? abs($val) : undef',
+    },
+    HGHT => {
+        Name => 'PreviewImageHeight',
+        ValueConv => '$val ? abs($val) : undef',
+    },
+    QUAL => {
+        Name => 'PreviewQuality',
+        ValueConv => '$val ? abs($val) : undef',
+    },
+    # tags not yet decoded with observed values:
+    # CHKH: 0, various negative values
+    # CHKL: various negative values
+    # CLEN: -1024
+    # CSPC: -2232593
+    # DATA: (+ve data length)
+    # HDEC: 0
+    # MAIN: 0, 60
+    # META: 24
+    # SCI0: (+ve data length) often 36
+    # SCI1: (+ve data length) 36
+    # SCX0: (+ve data length)
+    # SCX1: (+ve data length) often 84
+    # WDEC: 0
+    # VERS: -131328
+);
+
+#------------------------------------------------------------------------------
+# Extract information from the JPEG APP4 SCALADO segment
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessScalado($$$)
+{
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $pos = 0;
+    my $end = length $$dataPt;
+    my $unknown = $et->Options('Unknown');
+
+    $et->VerboseDir('APP4 SCALADO', undef, $end);
+    SetByteOrder('MM');
+
+    for (;;) {
+        last if $pos + 12 > $end;
+        my $tag = substr($$dataPt, $pos, 4);
+        my $ver = Get32u($dataPt, $pos + 4); # (looks like a version for some tags)
+        if (not $$tagTablePtr{$tag} and $unknown) {
+            my $name = $tag;
+            $name =~ tr/-A-Za-z0-9_//dc;
+            last unless length $name;   # stop if tag is garbage
+            AddTagToTable($tagTablePtr, $tag, {
+                Name => "Scalado_$name",
+                Description => "Scalado $name",
+                Unknown => 1,
+            });
+        }
+        $et->HandleTag($tagTablePtr, $tag, undef,
+            DataPt  => $dataPt,
+            Start   => $pos + 8,
+            Size    => 4,
+            Extra   => ", ver $ver",
+        );
+        if ($tag eq 'SPMO') {
+            my $val = Get32u($dataPt, $pos + 8) ;
+            if ($ver < 5) { # (I don't have samples for version 3 or 4, so I'm not sure about these)
+                $end -= $val;     # SPMO gives trailer data length
+            } else {
+                $end = $val + 12; # SPMO gives length of Scalado directory (excepting this entry)
+            }
+        }
+        $pos += 12;
+    }
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Scalado - Read APP4 SCALADO metadata
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to read
+metadata from the JPEG APP4 SCALADO segment.
+
+=head1 AUTHOR
+
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Scalado Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
@@ -582,7 +582,7 @@ limited to the range 1970 to 2038.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -3,11 +3,15 @@
 #
 # Description:  ExifTool shortcut tags
 #
-# Revisions:    02/07/2004 - P. Harvey Moved out of Exif.pm
-#               09/15/2004 - P. Harvey Added D70Boring from Greg Troxel
-#               01/11/2005 - P. Harvey Added Canon20D from Christian Koller
-#               03/03/2005 - P. Harvey Added user defined shortcuts
-#               03/26/2005 - P. Harvey Added Nikon from Tom Christiansen
+# Revisions:    02/07/2004 - PH Moved out of Exif.pm
+#               09/15/2004 - PH Added D70Boring from Greg Troxel
+#               01/11/2005 - PH Added Canon20D from Christian Koller
+#               03/03/2005 - PH Added user defined shortcuts
+#               03/26/2005 - PH Added Nikon from Tom Christiansen
+#               02/28/2007 - PH Removed model-dependent shortcuts
+#                            --> this is what UserDefined::Shortcuts is for
+#               02/25/2009 - PH Added Unsafe
+#               07/03/2010 - PH Added CommonIFD0
 #------------------------------------------------------------------------------
 
 package Image::ExifTool::Shortcuts;
@@ -15,9 +19,10 @@ package Image::ExifTool::Shortcuts;
 use strict;
 use vars qw($VERSION);
 
-$VERSION = '1.45';
+$VERSION = '1.49';
 
 # this is a special table used to define command-line shortcuts
+# (documentation Notes may be added for these via %shortcutNotes in BuildTagLookup.pm)
 %Image::ExifTool::Shortcuts::Main = (
     # this shortcut allows the three common date/time tags to be shifted at once
     AllDates => [
@@ -108,6 +113,7 @@ $VERSION = '1.45';
     # copy the maker notes as a block or prevent it from being copied
     MakerNotes => [
         'MakerNotes',   # (for RIFF MakerNotes)
+        'MakerNoteApple',
         'MakerNoteCanon',
         'MakerNoteCasio',
         'MakerNoteCasio2',
@@ -134,6 +140,7 @@ $VERSION = '1.45';
         'MakerNoteKodak7',
         'MakerNoteKodak8a',
         'MakerNoteKodak8b',
+        'MakerNoteKodak8c',
         'MakerNoteKodak9',
         'MakerNoteKodak10',
         'MakerNoteKodakUnknown',
@@ -175,6 +182,7 @@ $VERSION = '1.45';
         'MakerNoteSony2',
         'MakerNoteSony3',
         'MakerNoteSony4',
+        'MakerNoteSony5',
         'MakerNoteSonyEricsson',
         'MakerNoteSonySRF',
         'MakerNoteUnknownText',
@@ -194,6 +202,14 @@ $VERSION = '1.45';
         'InteropIFD:RelatedImageWidth',
         'InteropIFD:RelatedImageHeight',
     ],
+    # standard tags used to define the color space of an image
+    # (useful to preserve color space when deleting all meta information)
+    ColorSpaceTags => [
+        'ExifIFD:ColorSpace',
+        'ExifIFD:Gamma',
+        'InteropIFD:InteropIndex',
+        'ICC_Profile',
+    ],
     # common metadata tags found in IFD0 of TIFF images
     CommonIFD0 => [
         # standard EXIF
@@ -279,7 +295,7 @@ FocalLengthIn35mmFormat.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -553,7 +553,7 @@ Sigma and Foveon maker notes in EXIF information.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -16,7 +16,7 @@ use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Sigma;
 
-$VERSION = '1.20';
+$VERSION = '1.21';
 
 sub ProcessX3FHeader($$$);
 sub ProcessX3FDirectory($$$);
@@ -246,13 +246,13 @@ sub ProcessX3FProperties($$$);
 # Returns: Converted string
 sub ExtractUnicodeString($$$)
 {
-    my ($exifTool, $chars, $pos) = @_;
+    my ($et, $chars, $pos) = @_;
     my $i;
     for ($i=$pos; $i<@$chars; ++$i) {
         last unless $$chars[$i];
     }
     my $buff = pack('v*', @$chars[$pos..$i-1]);
-    return $exifTool->Decode($buff, 'UCS2', 'II');
+    return $et->Decode($buff, 'UCS2', 'II');
 }
 
 #------------------------------------------------------------------------------
@@ -261,22 +261,22 @@ sub ExtractUnicodeString($$$)
 # Returns: 1 on success
 sub ProcessX3FHeader($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $hdrLen = $$dirInfo{DirLen};
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
 
     # process the static header structure first
-    $exifTool->ProcessBinaryData($dirInfo, $tagTablePtr);
+    $et->ProcessBinaryData($dirInfo, $tagTablePtr);
 
     # process extended data if available
     if (length $$dataPt >= 232) {
         if ($verbose) {
-            $exifTool->VerboseDir('X3F HeaderExt', 32);
+            $et->VerboseDir('X3F HeaderExt', 32);
             Image::ExifTool::HexDump($dataPt, undef,
                 MaxLen => $verbose > 3 ? 1024 : 96,
-                Out    => $exifTool->Options('TextOut'),
-                Prefix => $$exifTool{INDENT},
+                Out    => $et->Options('TextOut'),
+                Prefix => $$et{INDENT},
                 Start  => $$dirInfo{DirLen},
             ) if $verbose > 2;
         }
@@ -298,14 +298,14 @@ sub ProcessX3FHeader($$$)
                 }
                 $val = $sign * 2 ** (($val - 0x3f800000) / 0x800000);
             }
-            $exifTool->HandleTag($tagTablePtr, $vals[$i], $val,
+            $et->HandleTag($tagTablePtr, $vals[$i], $val,
                 Index  => $i,
                 DataPt => $dataPt,
                 Start  => $hdrLen + 32 + $i * 4,
                 Size   => 4,
             );
         }
-        $exifTool->VPrint(0, "$exifTool->{INDENT}($unused entries unused)\n");
+        $et->VPrint(0, "$$et{INDENT}($unused entries unused)\n");
     }
     return 1;
 }
@@ -316,34 +316,34 @@ sub ProcessX3FHeader($$$)
 # Returns: 1 on success
 sub ProcessX3FProperties($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $size = length($$dataPt);
-    my $verbose = $exifTool->Options('Verbose');
-    my $unknown = $exifTool->Options('Unknown');
+    my $verbose = $et->Options('Verbose');
+    my $unknown = $et->Options('Unknown');
 
     unless ($size >= 24 and $$dataPt =~ /^SECp/) {
-        $exifTool->Warn('Bad properties header');
+        $et->Warn('Bad properties header');
         return 0;
     }
     my ($entries, $fmt, $len) = unpack('x8V2x4V', $$dataPt);
     unless ($size >= 24 + 8 * $entries + $len) {
-        $exifTool->Warn('Truncated Property directory');
+        $et->Warn('Truncated Property directory');
         return 0;
     }
-    $verbose and $exifTool->VerboseDir('Properties', $entries);
-    $fmt == 0 or $exifTool->Warn("Unsupported character format $fmt"), return 0;
+    $verbose and $et->VerboseDir('Properties', $entries);
+    $fmt == 0 or $et->Warn("Unsupported character format $fmt"), return 0;
     my $charPos = 24 + 8 * $entries;
     my @chars = unpack('v*',substr($$dataPt, $charPos, $len * 2));
     my $index;
     for ($index=0; $index<$entries; ++$index) {
         my ($namePos, $valPos) = unpack('V2',substr($$dataPt, $index*8 + 24, 8));
         if ($namePos >= @chars or $valPos >= @chars) {
-            $exifTool->Warn('Bad Property pointer');
+            $et->Warn('Bad Property pointer');
             return 0;
         }
-        my $tag = ExtractUnicodeString($exifTool, \@chars, $namePos);
-        my $val = ExtractUnicodeString($exifTool, \@chars, $valPos);
+        my $tag = ExtractUnicodeString($et, \@chars, $namePos);
+        my $val = ExtractUnicodeString($et, \@chars, $valPos);
         if (not $$tagTablePtr{$tag} and $unknown and $tag =~ /^\w+$/) {
             my $tagInfo = {
                 Name => "SigmaRaw_$tag",
@@ -355,7 +355,7 @@ sub ProcessX3FProperties($$$)
             AddTagToTable($tagTablePtr, $tag, $tagInfo);
         }
 
-        $exifTool->HandleTag($tagTablePtr, $tag, $val,
+        $et->HandleTag($tagTablePtr, $tag, $val,
             Index => $index,
             DataPt => $dataPt,
             Start => $charPos + 2 * $valPos,
@@ -372,7 +372,7 @@ sub ProcessX3FProperties($$$)
 # Notes: Writes metadata to embedded JpgFromRaw image
 sub WriteX3F($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my $outfile = $$dirInfo{OutFile};
     my ($outDir, $buff, $ver, $entries, $dir, $outPos, $index, $didContain);
@@ -418,11 +418,11 @@ sub WriteX3F($$)
 
             # only rewrite full-sized JpgFromRaw (version 2.0, type 2, format 18)
             if ($buff =~ /^SECi\0\0\x02\0\x02\0\0\0\x12\0\0\0/ and
-                $$exifTool{ImageWidth} == unpack('x16V', $buff))
+                $$et{ImageWidth} == unpack('x16V', $buff))
             {
                 $raf->Read($buff, $len) == $len or return 'Error reading JpgFromRaw';
                 # use same write directories as JPEG
-                $exifTool->InitWriteDirs('JPEG');
+                $et->InitWriteDirs('JPEG');
                 # rewrite the embedded JPEG in memory
                 my $newData;
                 my %jpegInfo = (
@@ -430,14 +430,14 @@ sub WriteX3F($$)
                     RAF     => new File::RandomAccess(\$buff),
                     OutFile => \$newData,
                 );
-                $$exifTool{FILE_TYPE} = 'JPEG';
-                my $success = $exifTool->WriteJPEG(\%jpegInfo);
-                $$exifTool{FILE_TYPE} = 'X3F';
+                $$et{FILE_TYPE} = 'JPEG';
+                my $success = $et->WriteJPEG(\%jpegInfo);
+                $$et{FILE_TYPE} = 'X3F';
                 SetByteOrder('II');
                 return 'Error writing X3F JpgFromRaw' unless $success and $newData;
                 return -1 if $success < 0;
                 # write new data if anything changed, otherwise copy old image
-                my $outPt = $$exifTool{CHANGED} ? \$newData : \$buff;
+                my $outPt = $$et{CHANGED} ? \$newData : \$buff;
                 Write($outfile, $$outPt) or return -1;
                 # set $len to the total subsection data length
                 $len = length($$outPt) + 28;
@@ -462,7 +462,7 @@ sub WriteX3F($$)
         }
     }
     # warn if we couldn't add metadata to this image (should only be SD9 or SD10)
-    $didContain or $exifTool->Warn("Can't yet write SD9 or SD10 X3F images");
+    $didContain or $et->Warn("Can't yet write SD9 or SD10 X3F images");
     # write out the directory and the directory pointer, and we are done
     Write($outfile, $outDir, pack('V', $outPos)) or return -1;
     return undef;
@@ -474,9 +474,9 @@ sub WriteX3F($$)
 # Returns: error string or undef on success
 sub ProcessX3FDirectory($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $raf = $$dirInfo{RAF};
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
 
     $raf->Seek($$dirInfo{DirStart}, 0) or return 'Error seeking to directory start';
 
@@ -485,18 +485,18 @@ sub ProcessX3FDirectory($$$)
     $raf->Read($buff, 12) == 12 or return 'Truncated X3F image';
     $buff =~ /^SECd/ or return 'Bad section header';
     ($ver, $entries) = unpack('x4V2', $buff);
-    $verbose and $exifTool->VerboseDir('X3F Subsection', $entries);
+    $verbose and $et->VerboseDir('X3F Subsection', $entries);
     $raf->Read($dir, $entries * 12) == $entries * 12 or return 'Truncated X3F directory';
     for ($index=0; $index<$entries; ++$index) {
         my $pos = $index * 12;
         my ($offset, $len, $tag) = unpack("x${pos}V2a4", $dir);
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
         if ($verbose) {
-            $exifTool->VPrint(0, "$exifTool->{INDENT}$index) $tag Subsection ($len bytes):\n");
+            $et->VPrint(0, "$$et{INDENT}$index) $tag Subsection ($len bytes):\n");
             if ($verbose > 2) {
                 $raf->Seek($offset, 0) or return 'Error seeking';
                 $raf->Read($buff, $len) == $len or return 'Truncated image';
-                $exifTool->VerboseDump(\$buff);
+                $et->VerboseDump(\$buff);
             }
         }
         next unless $tagInfo;
@@ -507,10 +507,10 @@ sub ProcessX3FDirectory($$$)
             # ignore all image data but JPEG compressed (version 2.0, type 2, format 18)
             next unless $buff =~ /^SECi\0\0\x02\0\x02\0\0\0\x12\0\0\0/;
             # check preview image size and extract full-sized preview as JpgFromRaw
-            if ($$exifTool{ImageWidth} == unpack('x16V', $buff)) {
-                $$exifTool{IsJpgFromRaw} = 1;
-                $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
-                delete $$exifTool{IsJpgFromRaw};
+            if ($$et{ImageWidth} == unpack('x16V', $buff)) {
+                $$et{IsJpgFromRaw} = 1;
+                $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
+                delete $$et{IsJpgFromRaw};
             }
             $offset += 28;
             $len -= 28;
@@ -520,7 +520,7 @@ sub ProcessX3FDirectory($$$)
         if ($subdir) {
             my %dirInfo = ( DataPt => \$buff );
             my $subTable = GetTagTable($$subdir{TagTable});
-            $exifTool->ProcessDirectory(\%dirInfo, $subTable);
+            $et->ProcessDirectory(\%dirInfo, $subTable);
         } else {
             # extract metadata from JpgFromRaw
             if ($$tagInfo{Name} eq 'JpgFromRaw') {
@@ -528,12 +528,12 @@ sub ProcessX3FDirectory($$$)
                     Parent => 'X3F',
                     RAF    => new File::RandomAccess(\$buff),
                 );
-                $$exifTool{BASE} += $offset;
-                $exifTool->ProcessJPEG(\%dirInfo);
-                $$exifTool{BASE} -= $offset;
+                $$et{BASE} += $offset;
+                $et->ProcessJPEG(\%dirInfo);
+                $$et{BASE} -= $offset;
                 SetByteOrder('II');
             }
-            $exifTool->FoundTag($tagInfo, $buff);
+            $et->FoundTag($tagInfo, $buff);
         }
     }
     return undef;
@@ -545,7 +545,7 @@ sub ProcessX3FDirectory($$$)
 # Returns: 1 on success, 0 if this wasn't a valid X3F image, or -1 on write error
 sub ProcessX3F($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $outfile = $$dirInfo{OutFile};
     my $raf = $$dirInfo{RAF};
     my $warn = $outfile ? \&Image::ExifTool::Error : \&Image::ExifTool::Warn;
@@ -555,13 +555,13 @@ sub ProcessX3F($$)
     return 0 unless $buff =~ /^FOVb/;
 
     SetByteOrder('II');
-    $exifTool->SetFileType();
+    $et->SetFileType();
 
     # check version number
     my $ver = unpack('x4V',$buff);
     $ver = ($ver >> 16) . '.' . ($ver & 0xffff);
     if ($ver > 3) {
-        &$warn($exifTool, "Untested X3F version ($ver). Please submit sample for testing", 1);
+        &$warn($et, "Untested X3F version ($ver). Please submit sample for testing", 1);
     }
     my $hdrLen = length $buff;
     # read version 2.1/2.2/2.3 extended header
@@ -570,25 +570,25 @@ sub ProcessX3F($$)
         my $more = $hdrLen - length($buff) + 160;   # (extended header is 160 bytes)
         my $buf2;
         unless ($raf->Read($buf2, $more) == $more) {
-            &$warn($exifTool, 'Error reading extended header');
+            &$warn($et, 'Error reading extended header');
             return 1;
         }
         $buff .= $buf2;
     }
     # extract ImageWidth for later
-    $$exifTool{ImageWidth} = Get32u(\$buff, 28);
+    $$et{ImageWidth} = Get32u(\$buff, 28);
     # process header information
     my $tagTablePtr = GetTagTable('Image::ExifTool::SigmaRaw::Main');
     unless ($outfile) {
-        $exifTool->HandleTag($tagTablePtr, 'Header', $buff,
+        $et->HandleTag($tagTablePtr, 'Header', $buff,
             DataPt => \$buff,
             Size   => $hdrLen,
         );
     }
     # read the directory pointer
-    $raf->Seek(-4, 2) or &$warn($exifTool, 'Seek error'), return 1;
+    $raf->Seek(-4, 2) or &$warn($et, 'Seek error'), return 1;
     unless ($raf->Read($buff, 4) == 4) {
-        &$warn($exifTool, 'Error reading X3F dir pointer');
+        &$warn($et, 'Error reading X3F dir pointer');
         return 1;
     }
     my $offset = unpack('V', $buff);
@@ -598,13 +598,13 @@ sub ProcessX3F($$)
     );
     if ($outfile) {
         $dirInfo{OutFile} = $outfile;
-        $err = WriteX3F($exifTool, \%dirInfo);
+        $err = WriteX3F($et, \%dirInfo);
         return -1 if $err and $err eq '-1';
     } else {
         # process the X3F subsections
-        $err = $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        $err = $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
     }
-    $err and &$warn($exifTool, $err);
+    $err and &$warn($et, $err);
     return 1;
 }
 
@@ -627,7 +627,7 @@ Sigma and Foveon X3F images.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -17,6 +17,9 @@
 #               10) http://www.klingebiel.com/tempest/hd/pmp.html
 #               11) Mike Battilana private communication
 #               12) Jos Roost private communication (A580)
+#               13) http://www.mi-fo.de/forum/index.php?showtopic=33239
+#                   http://www.dyxum.com/dforum/the-alpha-shutter-count-tool_topic97489_page4.html
+#               14) Iliah Borg private communication
 #               JD) Jens Duttke private communication
 #------------------------------------------------------------------------------
 
@@ -28,10 +31,11 @@ use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::Exif;
 use Image::ExifTool::Minolta;
 
-$VERSION = '1.86';
+$VERSION = '2.04';
 
 sub ProcessSRF($$$);
 sub ProcessSR2($$$);
+sub ProcessSonyPIC($$$);
 sub ProcessMoreInfo($$$);
 sub Decipher($;$);
 sub ProcessEnciphered($$$);
@@ -45,6 +49,39 @@ sub MakeTiffHeader($$$$;$);
 
 # (%sonyLensTypes is filled in based on Minolta LensType's)
 
+# Sony E-mount lenses
+# (NOTE: these should be kept in sync with the 65535 entries in %minoltaLensTypes)
+my %sonyLensTypes2 = (
+    Notes => 'Lens type numbers for Sony E-Mount lenses used by NEX models.',
+    0 => 'Unknown E-Mount lens or other lens',
+    1 => 'Sony LA-EA1 Adapter',
+    2 => 'Sony LA-EA2 Adapter',
+    3 => 'Sony LA-EA3 Adapter', #(NC) ILCE-7 image with A-mount lens, but also has 0x940e 2nd byte=2
+    6 => 'Sony LA-EA4 Adapter', #(NC) ILCE-7R image with A-mount lens and having phase-detect info blocks in 0x940e AFInfo
+    44 => 'Metabones Canon EF Smart Adapter', #12
+    239 => 'Metabones Canon EF Speed Booster', #12
+    32784 => 'Sony E 16mm F2.8',
+    32785 => 'Sony E 18-55mm F3.5-5.6 OSS',
+    32786 => 'Sony E 55-210mm F4.5-6.3 OSS',
+    32787 => 'Sony E 18-200mm F3.5-6.3 OSS',
+    32788 => 'Sony E 30mm F3.5 Macro',
+    32789 => 'Sony E 24mm F1.8 ZA',
+    32790 => 'Sony E 50mm F1.8 OSS',
+    32791 => 'Sony E 16-70mm F4 ZA OSS',
+    32792 => 'Sony E 10-18mm F4 OSS',
+    32793 => 'Sony E PZ 16-50mm F3.5-5.6 OSS',
+    32794 => 'Sony FE 35mm F2.8 ZA',
+    32795 => 'Sony FE 24-70mm F4 ZA OSS',
+    32797 => 'Sony E 18-200mm F3.5-6.3 OSS LE',
+    32798 => 'Sony E 20mm F2.8',
+    32799 => 'Sony E 35mm F1.8 OSS',
+    32800 => 'Sony E PZ 18-105mm F4 G OSS', #12
+    32807 => 'Sony E PZ 18-200mm F3.5-6.3 OSS',
+    32808 => 'Sony FE 55mm F1.8 ZA',
+    32813 => 'Sony FE 28-70mm F3.5-5.6 OSS',
+#    32xxx => 'Sony FE 70-200mm F4 G OSS',
+);
+
 # ExposureProgram values (ref PH, mainly decoded from A200)
 my %sonyExposureProgram = (
     0 => 'Auto', # (same as 'Program AE'?)
@@ -54,12 +91,12 @@ my %sonyExposureProgram = (
     4 => 'Shutter speed priority AE',
     8 => 'Program Shift A', #7
     9 => 'Program Shift S', #7
-    19 => 'Night Portrait', # (A330)
-    18 => 'Sunset', # (A330)
+    16 => 'Portrait', # (A330)
     17 => 'Sports', # (A330)
-    21 => 'Macro', # (A330)
+    18 => 'Sunset', # (A330)
+    19 => 'Night Portrait', # (A330)
     20 => 'Landscape', # (A330)
-    16 => 'Portrait', # (A330)
+    21 => 'Macro', # (A330)
     35 => 'Auto No Flash', # (A330)
 );
 
@@ -100,6 +137,42 @@ my %sonyExposureProgram2 = (            # A580 Mode Dial setting:
     138 => 'High Contrast Monochrome',
 );
 
+# ExposureProgram values in Tags 2010 and 94xx (ref 12)
+my %sonyExposureProgram3 = (
+     0 => 'Program AE',
+     1 => 'Aperture-priority AE',
+     2 => 'Shutter speed priority AE',
+     3 => 'Manual',
+     4 => 'Auto',
+     5 => 'iAuto',
+     6 => 'Superior Auto',
+     7 => 'iAuto+',
+     8 => 'Portrait',
+     9 => 'Landscape',
+    10 => 'Twilight',
+    11 => 'Twilight Portrait',
+    12 => 'Sunset',
+    14 => 'Action (High speed)', #PH (RX100)
+    16 => 'Sports',
+    17 => 'Handheld Night Shot',
+    18 => 'Anti Motion Blur',
+    19 => 'High Sensitivity',
+    21 => 'Beach',
+    22 => 'Snow',
+    23 => 'Fireworks',
+    26 => 'Underwater',
+    27 => 'Gourmet',
+    28 => 'Pet',
+    29 => 'Macro',
+    30 => 'Backlight Correction HDR',
+    # 32 => 'Night ... ???', # seen for HDR-CX360E
+    33 => 'Sweep Panorama',
+    36 => 'Background Defocus',
+    37 => 'Soft Skin',
+    42 => '3D Image',
+    43 => 'Cont. Priority AE',
+);
+
 # WhiteBalanceSetting values (ref 12)
 my %whiteBalanceSetting = (
     0x10 => 'Auto (-3)', #(NC)
@@ -212,29 +285,6 @@ my %afPoint19 = (
     29 => 'Lower-right (vertical)',
 );
 
-# ReleaseMode values in Tags 2010 and 94xx (ref 12)
-my %sonyReleaseMode2 = (
-    0 => 'Normal',
-    1 => 'Continuous', # (RX100 "Continuous - Self-timer")
-    2 => 'Continuous - Exposure Bracketing', # (RX100)
-    3 => 'Continuous - White Balance Bracketing', # (HX9V) (RX100)
-    5 => 'Continuous - Burst', # (HX9V)
-    6 => 'Single Frame - Capture During Movie', #PH (RX100)
-    7 => 'Continuous - Sweep Panorama',
-    8 => 'Continuous - Anti-Motion Blur, Hand-held Twilight', # (HX9V)
-    9 => 'Continuous - HDR',
-    10 => 'Continuous - Background defocus', # (HX9V)
-    13 => 'Continuous - 3D Sweep Panorama', #PH/12
-    16 => 'Continuous - 3D Image', # (HX9V)
-    # 17 - ReleaseMode3 is 'Continuous - Burst' (WX7 - PH)
-    19 => 'Continuous - Speed/Advance Priority', #PH/12 (RX100)
-    20 => 'Continuous - Multi Frame NR',
-    26 => 'Continuous Low', #PH (A77)
-    27 => 'Continuous - High Sensitivity',  # seen for DSC-WX60 and WX300
-    28 => 'Smile Shutter', #PH (RX100)
-    29 => 'Continuous - Tele-zoom Advance Priority',
-);
-
 my %binaryDataAttrs = (
     PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
     WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
@@ -265,7 +315,7 @@ my %unknownCipherData = (
     0x0010 => [ #PH
         {
             Name => 'CameraInfo',
-            # count: A33/A35/A55V/A450/A500/A550/A560/A580/NEX3/5/C3/VG10E=15360
+            # count: A33/A35/A55V/A450/A500/A550/A560/A580/NEX3/5/5C/C3/VG10E=15360
             Condition => '$count == 15360',
             SubDirectory => { TagTable => 'Image::ExifTool::Sony::CameraInfo' },
         },{
@@ -276,14 +326,14 @@ my %unknownCipherData = (
     ],
     # 0x0018 - starts with "GYRO" for sweep panorama images (ref 12)
     #        - contains ImageStabilization information for Minolta
-    0x0020 => [
+    0x0020 => [ # not present for NEX-5C
         {
             Name => 'FocusInfo', #PH
             # count: A200/A230/A290/A300/A330/A350/A380/A390==19154, A700/A850/A900=19148
             Condition => '$count == 19154 or $count == 19148',
             SubDirectory => {
                 TagTable => 'Image::ExifTool::Sony::FocusInfo',
-                ByteOrder => 'BigEndian',
+                ByteOrder => 'LittleEndian',
             },
         },{
             Name => 'MoreInfo', #12
@@ -335,8 +385,7 @@ my %unknownCipherData = (
                 TagTable => 'Image::ExifTool::Sony::CameraSettings',
                 ByteOrder => 'BigEndian',
             },
-        },
-        {
+        },{
             Name => 'CameraSettings2',
             # count: A230/A290/A330/A380/A390=332
             Condition => '$count == 332',
@@ -344,17 +393,15 @@ my %unknownCipherData = (
                 TagTable => 'Image::ExifTool::Sony::CameraSettings2',
                 ByteOrder => 'BigEndian',
             },
-        },
-        {
+        },{
             Name => 'CameraSettings3',
-            # count: A560/A580/A33/A35/A55/NEX3/5/C3/VG10E=1536, A450/A500/A550=2048
+            # count: A560/A580/A33/A35/A55/NEX3/5/5C/C3/VG10E=1536, A450/A500/A550=2048
             Condition => '$count == 1536 || $count == 2048',
             SubDirectory => {
                 TagTable => 'Image::ExifTool::Sony::CameraSettings3',
                 ByteOrder => 'LittleEndian',
             },
-        },
-        {
+        },{
             Name => 'CameraSettingsUnknown',
             SubDirectory => {
                 TagTable => 'Image::ExifTool::Sony::CameraSettingsUnknown',
@@ -383,18 +430,18 @@ my %unknownCipherData = (
     0x0116 => [ #12
         {
             Name => 'ExtraInfo',
-            Condition => '$$self{Model} =~ /^(DSLR-A(850|900))\b/',
+            Condition => '$$self{Model} =~ /^DSLR-A(850|900)\b/',
             SubDirectory => {
                 TagTable => 'Image::ExifTool::Sony::ExtraInfo',
                 ByteOrder => 'BigEndian',
             },
         },{
             Name => 'ExtraInfo2',
-            Condition => '$$self{Model} =~ /^(DSLR-A(230|290|330|380|390))\b/',
+            Condition => '$$self{Model} =~ /^DSLR-A(230|290|330|380|390)\b/',
             SubDirectory => { TagTable => 'Image::ExifTool::Sony::ExtraInfo2' },
         },{
             Name => 'ExtraInfo3',
-            # for DSLR-A450/500/550/560/580, SLT-A33/35/55 and NEX-3/5.
+            # for DSLR-A450/500/550/560/580, SLT-A33/35/55 and NEX-3/5/5C.
             SubDirectory => { TagTable => 'Image::ExifTool::Sony::ExtraInfo3' },
         }
     ],
@@ -422,8 +469,11 @@ my %unknownCipherData = (
         Condition => '$format eq "int16u"',
         Writable => 'int16u',
     },
-    0x1003 => { #9 (TX7, panorama mode only)
+    0x1003 => { #9 (64 bytes, contains Panorama info for various DSC, NEX, SLT and DSLR models)
         Name => 'Panorama',
+        # panorama: first 4 bytes '1 1 0 0' (little-endian) or '0 0 1 1' (big-endian)
+        # non-panorama: all bytes are '0' (ref 12)
+        Condition => '$$self{Panorama} = ($$valPt =~ /^(\0\0)?\x01\x01/)', # (little- or big-endian int32u = 257)
         SubDirectory => { TagTable => 'Image::ExifTool::Sony::Panorama' },
     },
     # 0x2000 - undef[1]
@@ -544,7 +594,7 @@ my %unknownCipherData = (
         },
     },
     # 0x200c - int32u[3]: '0 0 0'; seen '2 1 0' for HX9V 3D-Image (in both JPG and MPO image)
-    # 0x200d - rational64u: 10/10
+    # 0x200d - rational64u: 10/10, seen 2.5 for DSC-TX300V, 8 for DSC-HX100V/RX10
     0x200e => { #PH (HX20V)
         Name => 'PictureEffect',
         Writable => 'int16u',
@@ -595,45 +645,71 @@ my %unknownCipherData = (
             1 => 'Low',
             2 => 'Mid',
             3 => 'High',
+            # 0x10001 - seen (ref 12)
+            # 0x10002 - seen for landscape and portrait flash (ref 12)
             0xffffffff => 'n/a', # (A35)
         },
     },
-    0x2010 => {
-        Name => 'Sony_0x2010',
+    0x2010 => [ #12
+        # different camera models have similar content but at different offsets, appears to correlate with:
+        # 0x1206 - 0x1207 deciphered (0x1205 changes with firmware version):
+        #   ad c3 - NEX-5N
+        # 0x0192 - 0x0193 deciphered (0x0191 changes with firmware version):
+        #   91 c3 - NEX-VG20E
+        #   93 c3 - NEX-7, SLT-A65V/A77V
+        # 0x0012 - 0x0013 deciphered (0x0011 changes with firmware version):
+        #   94 c3 - SLT-A37/A57, NEX-F3
+        #   95 d3 - DSC-WX50, WX70
+        #   98 c3 - DSC-HX200V, HX20V, HX30V, TX200V, TX300V
+        #   98 d3 - DSC-HX10V, TX66, WX100, WX150
+        #   9a c3 - DSC-RX1, RX1R
+        #   9b c3 - SLT-A99V
+        #   9c c3 - NEX-VG30E
+        #   9d c3 - DSC-RX100
+        #   9e c3 - NEX-VG900, SLT-A58
+        #   a1 d3 - DSC-TX30
+        #   a2 d3 - DSC-WX60, WX80, WX200, WX300
+        #   a3 c3 - NEX-6, DSC-HX300, HX50V
+        #   a4 c3 - NEX-3N/5R/5T, ILCE-3000
+        # unknown offsets or values for DSC-TX20/TX55/RX100M2/QX10/QX100/RX10/HX60V/HX400V, ILCE-7/7R/5000/6000
+    {
+        Name => 'Tag2010a', # ad
+        Condition => '$$self{Model} =~ /^NEX-5N$/',
+        SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010a' },
+    },{
+        Name => 'Tag2010b', # 91, 93
+        Condition => '$$self{Model} =~ /^(SLT-A(65|77)V?|NEX-(7|VG20E))$/',
+        SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010b' },
+    },{
+        Name => 'Tag2010c', # 94
+        Condition => '$$self{Model} =~ /^(SLT-A(37|57)|NEX-F3)$/',
+        SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010c' },
+    },{
+        Name => 'Tag2010d', # 95, 98
+        Condition => q{
+            $$self{Model} =~ /^(DSC-(HX10V|HX20V|HX30V|HX200V|TX66|TX200V|TX300V|WX50|WX70|WX100|WX150))$/ and
+            not $$self{Panorama}
+        },
+        SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010d' },
+    },{
+        Name => 'Tag2010e', # 9a, 9b, 9c, 9d, 9e, a1, a2, a3, a4
+        Condition => q{
+            $$self{Model} =~ /^(SLT-A99V?|SLT-A58|ILCE-3000|NEX-(3N|5R|5T|6|VG900|VG30E)|DSC-(RX100|RX1|RX1R)|Stellar)$/ or
+            ($$self{Model} =~ /^(DSC-(HX300|HX50V|TX30|WX60|WX80|WX200|WX300))$/ and not $$self{Panorama})
+        },
+        SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010e' },
+    },{
+        Name => 'Tag2010f', # ?
+        Condition => '$$self{Model} =~ /^(DSC-(RX100M2|QX10|QX100))$/',
+        SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010f' },
+    },{
+        Name => 'Tag2010g', # ?
+        Condition => '$$self{Model} =~ /^(DSC-(RX10|HX60V|HX400V)|ILCE-(7R?|[56]000))\b/',
+        SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010g' },
+    },{
+        Name => 'Tag_0x2010',
         %unknownCipherData,
-        # notes for data in this block (PH):
-        # 0x00 - int32u: SequenceImageNumber
-        # 0x04 - int32u: SequenceFileNumber
-        # 0x08 - related to drive mode
-        # other stuff in 0x2010 (ref 12)
-        # 0x1154 => {
-        #     Name => 'MeteringMode_2010',
-        #     Condition => '$$self{Model} =~ /^SLT-A(37|57)\b/',
-        #     PrintConv => {
-        #         0 => 'Multi-segment',
-        #         2 => 'Center-weighted average',
-        #         3 => 'Spot',
-        #     },
-        # },
-        # 0x1178 => {
-        #     Name => 'MeteringMode_2010',
-        #     Condition => '$$self{Model} =~ /^(SLT-A(65V|77V)|NEX-VG20E)\b/',   # maybe also A99V - to be checked
-        #     PrintConv => {
-        #         0 => 'Multi-segment',
-        #         2 => 'Center-weighted average',
-        #         3 => 'Spot',
-        #     },
-        # },
-        # 0x11ac => {
-        #     Name => 'MeteringMode_2010',
-        #     Condition => '$$self{Model} !~ /^(SLT-A(37|57|65V|77V)|NEX-VG20E)\b/',
-        #     PrintConv => {
-        #         0 => 'Multi-segment',
-        #         2 => 'Center-weighted average',
-        #         3 => 'Spot',
-        #     },
-        # },
-    },
+    }],
     0x2011 => { #PH (A77, NEX-5N)
         Name => 'VignettingCorrection',
         Writable => 'int32u',
@@ -677,10 +753,10 @@ my %unknownCipherData = (
         Notes => '"Yes" if this image was created by the Auto Portrait Framing feature',
         PrintConv => { 0 => 'No', 1 => 'Yes' },
     },
-    # 0x2017 - int32u: flash mode. 0=off, 1=fired, 2=red-eye (PH NEX-6) (also in A99, RX1, NEX-5R)
-    0x201b => { #PH (A99, also written by RX1, NEX-5R, NEX-6)
+    # 0x2017 - int32u: flash mode. 0=off, 1=fired, 2=red-eye (PH, NEX-6) (also in A99, RX1, NEX-5R)
+    0x201b => { #PH (written by SLT-A58/A99, NEX-3N/5R/6 and several DSC-models)
         Name => 'FocusMode',
-        Condition => '$$self{Model} !~ /^DSC-/', # (doesn't seem to apply to RX1)
+        Condition => '$$self{Model} !~ /^DSC-/', # (doesn't seem to apply to DSC-models)
         Writable => 'int8u',
         Priority => 0,
         PrintConv => {
@@ -708,19 +784,20 @@ my %unknownCipherData = (
             },
         },{
             Name => 'AFAreaModeSetting',
-            Condition => '$$self{Model} =~ /^NEX-/',
+            Condition => '$$self{Model} =~ /^(NEX-|ILCE-)/',
             Notes => 'NEX models',
             Writable => 'int8u',
             PrintConv => {
                 0 => 'Multi',
                 1 => 'Center',
                 3 => 'Flexible Spot',
+                11 => 'Zone', #12 (NC)
             },
         },
     ],
     0x201d => { #12
         Name => 'FlexibleSpotPosition',
-        Condition => '$$self{Model} =~ /^NEX-/',
+        Condition => '$$self{Model} =~ /^(NEX-|ILCE-)/',
         Writable => 'int16u',
         Count => 2,
         # position in an 11x9 grid. Values are (ref 12, NC in brackets)
@@ -737,7 +814,7 @@ my %unknownCipherData = (
         Writable => 'int8u',
         PrintConvColumns => 2,
         PrintConv => {
-            0 => 'Auto', # (NC)
+            0 => 'Auto', # (NC) (always 0 for NEX/ILCE unless AFAreaModeSetting is Zone, ref 12)
             1 => 'Center',
             2 => 'Top',
             3 => 'Upper-right',
@@ -759,6 +836,15 @@ my %unknownCipherData = (
             19 => 'Upper Far Left',
         },
     },
+    # 0x201f - 0 0 0 0 for SLT and DSC; 4 values for NEX
+    # 0x2020 - 10 values; for SLT and NEX/ILCE with A-Mount lens: relates to (phase-detect) AFPoints
+    0x2020 => {
+        Name => 'AFInfo2',
+        SubDirectory => { TagTable => 'Image::ExifTool::Sony::AFInfo2' },
+    },
+    # 0x2021 - 0 for DSC; 0, 1 or 2 for SLT and NEX: 1=Face, 2=object-tracking ?
+    # 0x2022 - 13x 0 for SLT and NEX; 13 values for DSC
+    # 0x2023 - 0
     0x3000 => {
         Name => 'ShotInfo',
         SubDirectory => { TagTable => 'Image::ExifTool::Sony::ShotInfo' },
@@ -768,19 +854,37 @@ my %unknownCipherData = (
 # at least some data for tags 0x2010, 0x9050 and 0x94xx is encrypted - PH
 # (This is certainly true for at least parts of 0x2010, 0x9050, 0x9400, 0x9402 and 0x9403,
 # but hasn't been verified for other tags -- just to be thorough, decipher all of them)
+# Note: "(e)" in a comment indicates an enciphered value, all other values are deciphered
 #
+    # 0x900b - 1st byte 0xae: face detection info for A450/500/550/560/580, A33/35/55, NEX-3/5/5C/C3/VG10
+    #        - other 1st byte values for some DSC-models
+    #        - seen many 1,8,27,64... values: assume encrypted like other 9xxx tags
+    0x900b => {
+        Name => 'Tag900b',
+        Condition => '$$valPt =~ /^\xae/',
+        SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag900b' },
+    },
     0x9050 => {
         Name => 'Tag9050',
         # 944 bytes for A37, A57, A99, NEX-F3, NEX-5R, NEX-6, DSC-RX1, DSC-RX100
         # 3072 bytes for A65, A77, NEX-5N, NEX-7, NEX-VG20 (ref 12)
-        SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9050' },
+        Condition => '$$self{Model} !~ /^Stellar/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Sony::Tag9050',
+            ByteOrder => 'LittleEndian',
+        },
     },
     0x9400 => [
+    # first byte:
+    # 0x07 (e) for DSC-HX7V/HX9V/HX100V/TX10/TX100/TX100V/WX7/WX9/WX10, HDR-CX../PJ..
+    # 0x09 (e) for DSC-TX20/TX55/WX30
+    # 0x0a (e) for SLT-A37/A57/A65V/A77V, NEX-F3/5N/5R/5T/6/7/VG20E, DSC-RX100/RX1/RX1R/HX10V/HX20V/HX30V/HX200V/TX200V/TX300V/TX66/WX50/WX100/WX150
+    # 0x0c (e) for ILCE-3000, NEX-3N, SLT-A58, DSC-HX50V/HX300/RX100M2/TX30/WX60/WX80/WX200/WX300, DSC-QX10/QX100
+    # 0xd0 (e) H90, W650, W690: tag9400 decoding appears not valid/different
+    # 0x23 (e) for DSC-RX10/HX60V/HX400V, ILCE-7/7R/5000/6000
+    # first byte decoded: 40, 204, 202, 27, 58, 62 respectively
     {
         Name => 'Tag9400a',
-        # - first byte must be 0x07, 0x09 or 0x0a (e)
-        #   or 0x0c (e) for latest models like NEX-3N, SLT-A58, DSC-WX60 and WX300
-        # (the Condition acts on the enciphered data)
         Condition => q{
             $$valPt =~ /^[\x07\x09\x0a]/ or
            ($$valPt =~ /^[\x5e\xe7\x04]/ and $$self{DoubleCipher} = 1)
@@ -788,44 +892,46 @@ my %unknownCipherData = (
         SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9400a' },
     },{
         Name => 'Tag9400b',
-        # - first byte 0x0c (e) for the NEX-3N, SLT-A58 and DSC-WX60 and WX300
         Condition => '$$valPt =~ /^\x0c/',
         SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9400b' },
     },{
+        Name => 'Tag9400c',
+        Condition => '$$valPt =~ /^\x23/',
+        SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9400c' },
+    },{
         Name => 'Sony_0x9400',
         %unknownCipherData,
     }],
     0x9401 => {
         Name => 'Sony_0x9401',
         %unknownCipherData,
-        # notes for data in this block (ref 12):
-        # 0x0000 - 0x0003: (ref PH)
-        #   1c 00 ac 0f - HDR models
-        #   21 2b cf 0f - NEX-7/VG20E, SLT-A65V/A77V
-        #   27 00 fd 0f - DSC-TX20/TX55
-        #   2d 00 d5 0d - DSC-HX10V/HX20V/HX200V/TX66/W100/WX50
-        #   2f 00 d6 0d - NEX-F3, SLT-A37/A57
-        #   32 00 e2 0d - DSC-RX100
-        #   33 00 e2 0d - NEX-5R/6
-        #   33 40 0d 0e - DSC-RX1
-        #   33 50 e2 0d - SLT-A99V
-        #   69 1f ff 0f - NEX-5N
-        #   b7 0f f7 0f - DSC-HX7V/TX10/WX7/WX10
-        #   b7 0f fa 0f - DSC-HX9V/HX100V/TX100/TX100V
-        #   cf 0b 9f 0f - DSC-WX9
-        #   f4 00 00 03 - DSC-H90/W690
-        #   ff ff ff ff - DSC-W650
+        # notes for data in this block (ref PH/12):
+        #   0x02-0x03 appear to have some relation to start-offset of data...
+        #   0x00 - 0x03    Metering
+        #                  Mode
+        #   f4 00 00 03      -        -   DSC-H90/W650/W690
+        #   cf 0b 9f 0f    0x09bc    (a)  DSC-WX9
+        #   1c 00 ac 0f    0x09c9    (b)  HDR-CX130E/CX160E/CX360E/CX560E/CX700E/PJ10E/PJ30E
+        #   b7 0f f7 0f    0x09dd    (c)  DSC-HX7V/TX10/WX7/WX10
+        #   b7 0f fa 0f    0x09e0    (d)  DSC-HX9V/HX100V/TX100/TX100V
+        #   27 00 fd 0f    0x09e7    (e)  DSC-TX20/TX55/WX30
+        #   69 1f ff 0f    0x09e9    (f)  NEX-5N
+        #   21 2b cf 0f    0x09e9    (f)  NEX-7/VG20E, SLT-A65V/A77V
+        #   2d 00 d5 0d    0x09a2    (g)  DSC-HX10V/HX20V/HX30V/HX200V/TX66/TX200V/TX300V/WX50/WX70/WX100/WX150
+        #   2f 00 d6 0d    0x09a3    (h)  NEX-F3, SLT-A37/A57
+        #   30 00 d8 0d    0x09a5    (i)  HDR-AS15
+        #   32 00 e2 0d    0x09ac    (j)  DSC-RX100
+        #   33 00 e2 0d    0x09ac    (j)  NEX-5R/5T/6, NEX-VG900/VG30E
+        #   33 50 e2 0d    0x09ac    (j)  SLT-A99V
+        #   33 40 0d 0e    0x09d7    (k)  DSC-RX1
+        #   33 41 0d 0e    0x09d7    (k)  DSC-RX1, DSC-RX1R
+        #   38 00 32 0e    0x09fc    (l)  SLT-A58, ILCE-3000, NEX-3N, DSC-HX300/HX50V/WX200/WX300/WX60/WX80/TX30
+        #   3a 10 3a 0e    0x0a01    (m)  DSC-QX10/QX100
+        #   3a 20 47 0e    0x0a01    (m)  DSC-RX100M2
+        #   43 00 66 0e    0x0a1b    (n)  ILCE-7/7R/5000, DSC-RX10/HX400V
+        #   44 00 9c 0e    0x0a39    (o)  ILCE-6000, DSC-HX60V
+        #
         # 0x0004 - (RX100: 0 or 1. subsequent data valid only if 1 - PH)
-        # 0x0004 => {
-        #     Name => 'DynamicRangeOptimizer_JR9401',
-        # #        Condition => '$$self{Model} !~ /^NEX-/',
-        #     PrintConv => {
-        #         0 => 'Off',
-        #         1 => 'On',
-        #     },
-        # },
-        # 0x0005 - 0
-        # 0x0006 - some DRO Info, 8 or 9 bytes ??
         # 0x0007 => {
         #     Name => 'DynamicRangeOptimizer_9401',
         #     PrintConv => {
@@ -840,42 +946,20 @@ my %unknownCipherData = (
         #         255 => 'Off',
         #     },
         # },
-        # 0x000d  - something to do with DRO level ?? (int16u ?)
-        # 0x0017 - 0=?, 1=normal shots,2=special effects,5=face detection (PH)
-        # 0x00f0 - 0x0118: data for HDR-image, HDR-paint, High-contrast-BW, otherwise 0
-        # 0x09a3 => {
-        #     Name => 'MeteringMode_9401',
-        #     Condition => '$$self{Model} =~ /^SLT-/',
-        #     PrintConv => {
-        #         0 => 'Multi-segment',
-        #         2 => 'Center-weighted average',
-        #         3 => 'Spot',
-        #     },
-        # },
-        # 0x09ac => {
-        #     Name => 'MeteringMode_9401',
-        #     Condition => '$$self{Model} =~ /^NEX-/',
-        #     PrintConv => {
-        #         0 => 'Multi-segment',
-        #         2 => 'Center-weighted average',
-        #         3 => 'Spot',
-        #     },
-        # },
-        # 0x09e0 => {
-        #     Name => 'MeteringMode_9401',
-        #     Condition => '$$self{Model} =~ /^DSC-/',
-        #     PrintConv => {
-        #         0 => 'Multi-segment',
-        #         3 => 'Center-weighted average',
-        #         3 => 'Spot',
-        #     },
-        # },
     },
     0x9402 => [{
         Name => 'Tag9402',
-        # only valid for some models:
-        # - first byte must be 0x0f or 0x10 (enciphered 0x8a or 0x70)
-        Condition => '$$self{DoubleCipher} ? $$valPt =~ /^[\x7e\x46]/ : $$valPt =~ /^[\x8a\x70]/',
+        # first 2 bytes deciphered:
+        #   0x00      0x00     SLT-A37/A57/A65/A77
+        #   0x0e      0x00     DSC-HX9V generation
+        #   0x0f      0x01     NEX-5N/7/VG20
+        #   0x10      0x01     DSC-RX100 etc., ILCE-3000, NEX-3N/5R/5T/6/VG30/VG900
+        #   0x11      0x01     DSC-RX100M2/QX10/QX100
+        #   0x12,0x13 0x01     ILCE-7/7R/5000, DSC-RX10/HX400V
+        #   0x14      0x01     ILCE-6000, DSC-HX60V
+        #   var       var      SLT-A58/A99V
+        # only valid when first byte 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14 (enciphered 0x8a, 0x70, 0xb6, 0x69, 0x88, 0x20)
+        Condition => '$$self{DoubleCipher} ? $$valPt =~ /^[\x7e\x46\x1d\x18\x3a\x95]\x01/ : $$valPt =~ /^[\x8a\x70\xb6\x69\x88\x20]\x01/',
         SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9402' },
     },{
         Name => 'Sony_0x9402',
@@ -894,10 +978,27 @@ my %unknownCipherData = (
         Name => 'Sony_0x9404',
         %unknownCipherData,
     },
-    0x9405 => {
+    # 0x9405 first 2 bytes:
+    # DSC-H90                             0   0  (0x00 = 0 0 enc.)
+    # DSC and HDR of HX9V generation      2   0  (0x08 = 8 0 enc.)
+    # SLT, DSC-RX100/RX1, NEX, ILCE-3000  3   0  (0x1b = 27 0 enc.)  (many DSC of RX100 generation, also QX10 and QX100)
+    # DSC-RX1R                            4   0  (0x40 = 64 0 enc.)
+    # DSC-RX100M2                         5   0  (0x7d = 125 0 enc.)
+    # DSC-RX10/HX400V/HX60V, ILCE-7/7R/5000/6000   136 var  (0x3a = 58 var enc.)
+    0x9405 => [{
+        Name => 'Tag9405a',
+        # first byte must be 0x1b
+        Condition => '$$valPt =~ /^\x1b/',
+        SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9405a' },
+    },{
+        Name => 'Tag9405b',
+        # first byte must be 0x3a
+        Condition => '$$valPt =~ /^\x3a/',
+        SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9405b' },
+    },{
         Name => 'Sony_0x9405',
         %unknownCipherData,
-    },
+    }],
     0x9406 => [{
         Name => 'Tag9406',
         # - first byte must be 0x01 or 0x02 (enciphered 0x01 or 0x08) and
@@ -933,14 +1034,21 @@ my %unknownCipherData = (
         Name => 'Sony_0x940b',
         %unknownCipherData,
     },
-    0x940c => {
+    0x940c => [{
+        Name => 'Tag940c',
+        Condition => '$$self{Model} !~ /^(SLT-|DSC-)\b/',
+        SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag940c' },
+    },{
         Name => 'Sony_0x940c',
         %unknownCipherData,
-    },
+    }],
     0x940d => {
         Name => 'Sony_0x940d',
         %unknownCipherData,
     },
+# 0x940e: 2nd byte = 0: no AFInfo, default for NEX
+#         2nd byte = 1: AFInfo for SLT models (but also seen 1 for DSC-HX20W/HX300/WX70 ...)
+#         2nd byte = 2: AFInfo for NEX/ILCE with LA-EA2 Phase-detect AF Adapter
     0x940e => [{
         Name => 'AFInfo',
         Condition => '$$self{Model} =~ /^SLT-/',
@@ -976,6 +1084,7 @@ my %unknownCipherData = (
             '3 1 0 0' => 'ARW 2.1',
             '3 2 0 0' => 'ARW 2.2', #PH (NEX-5)
             '3 3 0 0' => 'ARW 2.3', #PH (SLT-A65,SLT-A77)
+            '3 3 1 0' => 'ARW 2.3.1', #PH/12 (RX1R,RX100M2)
             # what about cRAW images?
         },
     },
@@ -1021,11 +1130,21 @@ my %unknownCipherData = (
             294 => 'SLT-A99 / SLT-A99V', #12
             295 => 'NEX-6', #12
             296 => 'NEX-5R', #12
-            297 => 'DSC-RX100', #PH
+            297 => 'DSC-RX100', #PH (also used by Hasselblad Stellar, ref 12)
             298 => 'DSC-RX1', #12
             299 => 'NEX-VG900', #12
+            300 => 'NEX-VG30E', #12
+            302 => 'ILCE-3000', #12
             303 => 'SLT-A58', #12
             305 => 'NEX-3N', #PH
+            306 => 'ILCE-7', #12
+            307 => 'NEX-5T', #12
+            308 => 'DSC-RX100M2', #12
+            309 => 'DSC-RX10', #12
+            310 => 'DSC-RX1R', #12
+            311 => 'ILCE-7R', #12
+            312 => 'ILCE-6000', #12
+            313 => 'ILCE-5000', #12
         },
     },
     0xb020 => { #2
@@ -1116,7 +1235,8 @@ my %unknownCipherData = (
         Name => 'LensType',
         Writable => 'int32u',
         SeparateTable => 1,
-        ValueConvInv => 'int($val)', # (must truncate decimal part)
+        # set to 65535 for E-Mount lenses (values 0x80xx)
+        ValueConvInv => '($val & 0xff00) == 0x8000 ? 65535 : int($val)',
         PrintConv => \%sonyLensTypes,
     },
     0xb028 => { #2
@@ -1207,6 +1327,7 @@ my %unknownCipherData = (
             19 => 'Macro', #12
             20 => 'Advanced Sports Shooting', #9
             29 => 'Underwater', #9
+            # 30 seen for DSC-W110 and W390, maybe something with Face or Portrait ??
             33 => 'Food', #9
             34 => 'Sweep Panorama', #PH (HX1)
             35 => 'Handheld Night Shot', #PH (HX1/TX1, also called "Hand-held Twilight")
@@ -1217,13 +1338,20 @@ my %unknownCipherData = (
             40 => 'Background Defocus', #PH (HX20V)
             41 => 'Soft Skin', #12 (HX9V) (HX200V Portrait - PH)
             42 => '3D Image', #12 (HX9V)
+            # 50 seen for DSC-W530
             65535 => 'n/a', #PH (A100)
         },
     },
     0xb042 => { #9
         Name => 'FocusMode',
-        Condition => '$$self{Model} !~ /^DSC-[HR]X/', #12
-        Notes => 'not FocusMode for all models',
+        # Only FocusMode for older DSC models;
+        # Newest DSC models give only 0, many models of 'HX9V generation' give only 4 -
+        # these models give FocusMode in tag 0xb04e, and are excluded here.
+        Condition => q{
+            ($$self{TagB042} = Get16u($valPt, 0)) and
+            (not $$self{MetaVersion} or $$self{MetaVersion} ne 'DC7303320222000')
+        },
+        Notes => 'not valid for all models',
         Writable => 'int16u',
         RawConv => '$val == 65535 ? undef : $val',
         PrintConv => {
@@ -1231,30 +1359,46 @@ my %unknownCipherData = (
             1 => 'AF-S', # (called Single-AF by Sony)
             2 => 'AF-C', # (called Monitor-AF by Sony)
             4 => 'Permanent-AF', # (TX7,HX9V?)
-            65535 => 'n/a', #PH (A100)
+            65535 => 'n/a', #PH (A100), also for DSC-W690 panorama shots
         },
     },
-    0xb043 => { #9
+    0xb043 => [{ #9
         Name => 'AFAreaMode',
+        # AFAreaMode only for older models;
+        # exclude newest DSC models, which give AFAreaMode in Tag9402 0x0017 (ie. RX100 - PH)
         Writable => 'int16u',
-        Condition => '$$self{Model} !~ /^DSC-[HR]X/', #12
+        Condition => 'not $$self{MetaVersion} or $$self{MetaVersion} ne "DC7303320222000"', #12
         RawConv => '$val == 65535 ? undef : $val',
-        Notes => 'not valid for some models', # (ie. RX100 which is always 0 - PH)
+        Notes => 'older models',
         PrintConv => {
             # 0 - (takes this value after camera reset, but can't be set back once changed)
-            # 0 - 'Multi AF' for the HX9V (ref 12)
             0 => 'Default',
-            1 => 'Multi', # ('Center AF' for the HX9V, ref 12)
+            1 => 'Multi',
             2 => 'Center',
-            3 => 'Spot', # ('Flexible Spot' for the HX9V, ref 12)
+            3 => 'Spot',
             4 => 'Flexible Spot', # (T200)
             6 => 'Touch',
             14 => 'Tracking', #12 (HX9V) ("Manual" for the T200?, ref 9)
             15 => 'Face Tracking', # (not set when in face detect mode and no faces detected)
-            # 255 - 'n/a' for the HX9V (ref 12)
             65535 => 'n/a', #PH (A100)
         },
-    },
+    },{ #12
+        Name => 'AFAreaMode',
+        # AFAreaMode for DSC-HX9V generation, having values that appear to be different from older models.
+        Writable => 'int16u',
+        Condition => '$$self{TagB042} and $$self{TagB042} != 0',
+        Notes => 'DSC-HX9V generation cameras',
+        PrintConv => {
+            0 => 'Multi',
+            1 => 'Center',
+            2 => 'Spot', # (NC) seen for DSC-WX9
+            3 => 'Flexible Spot',
+            10 => 'Selective (for Miniature effect)', # seen for Miniature effect of DSC-WX30
+            14 => 'Tracking',
+            15 => 'Face Tracking',
+            255 => 'Manual',
+        },
+    }],
     0xb044 => { #9
         Name => 'AFIlluminator',
         Writable => 'int16u',
@@ -1337,33 +1481,35 @@ my %unknownCipherData = (
     },
     # 0xb04c - rational64u: 10/10 (seen 5 for HX9V Manual-exposure images, ref 12)
     # 0xb04d - int16u: 0
-    0xb04e => [
-        { #PH (RX100)
-            Name => 'FocusMode',
-            Condition => '$$self{Model} =~ /^DSC-[HR]X/', #12
-            Notes => 'FocusMode for RX100',
-            Writable => 'int16u',
-            PrintConv => {
-                0 => 'Manual',
-                2 => 'AF-S',
-                3 => 'AF-C',
-                5 => 'Semi-manual', #12 (HX9V)
-                6 => 'Direct Manual Focus',
-            },
-        },{ #2
-            Name => 'LongExposureNoiseReduction',
-            Notes => 'LongExposureNoiseReduction for other models',
-            Writable => 'int16u',
-            RawConv => '$val == 65535 ? undef : $val',
-            PrintConv => {
-                0 => 'Off',
-                1 => 'On',
-                2 => 'On 2', #PH (TX10, TX100, WX9, WX10, etc)
-                # 4 - seen this (CX360E, CX700E)
-                65535 => 'n/a', #PH (A100)
-            },
+    # (the Kamisaka decoding of 0xb04e seems wrong - ref 12)
+    # 0xb04e => { #2
+    #     Name => 'LongExposureNoiseReduction',
+    #     Notes => 'LongExposureNoiseReduction for other models',
+    #     Writable => 'int16u',
+    #     RawConv => '$val == 65535 ? undef : $val',
+    #     PrintConv => {
+    #         0 => 'Off',
+    #         1 => 'On',
+    #         2 => 'On 2', #PH (TX10, TX100, WX9, WX10, etc)
+    #         # 4 - seen this (CX360E, CX700E)
+    #         65535 => 'n/a', #PH (A100)
+    #     },
+    # },
+    0xb04e => { #PH (RX100)
+        Name => 'FocusMode',
+        Condition => '$$self{MetaVersion} and $$self{MetaVersion} eq "DC7303320222000"', #12
+        Notes => 'valid for DSC-HX9V generation and newer',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Manual',
+            # 1 - seen for DSC-WX7 burst, HDR-CX130E/CX560E
+            2 => 'AF-S',
+            3 => 'AF-C',
+            # 4 - seen for HDR-CX360E/CX700E
+            5 => 'Semi-manual', #12 (HX9V)
+            6 => 'DMF', # "Direct Manual Focus"
         },
-    ],
+    },
     0xb04f => { #PH (TX1)
         Name => 'DynamicRangeOptimizer',
         Writable => 'int16u',
@@ -1464,11 +1610,12 @@ my %unknownCipherData = (
     GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
     NOTES => q{
         Camera information stored by the A33, A35, A55, A450, A500, A550, A560,
-        A580, NEX-3/5/C3 and VG10E.  Some tags are valid only for some of these
+        A580, NEX-3/5/5C/C3 and VG10E.  Some tags are valid only for some of these
         models.
     },
     0x00 => { #12
         Name => 'LensSpec',
+        Condition => '$$self{Model} !~ /^NEX-5C/',
         Format => 'undef[8]',
         ValueConv => \&ConvLensSpec,
         ValueConvInv => \&ConvInvLensSpec,
@@ -1477,7 +1624,7 @@ my %unknownCipherData = (
     },
     0x0e => { #12
         Name => 'FocalLength',
-        Condition => '$$self{Model} !~ /^(DSLR-(A450|A500|A550)$)/',
+        Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/',
         Format => 'int16u',
         Priority => 0,
         ValueConv => '$val / 10',
@@ -1487,13 +1634,41 @@ my %unknownCipherData = (
     },
     0x10 => { #12
         Name => 'FocalLengthTeleZoom',
-        Condition => '$$self{Model} !~ /^(DSLR-(A450|A500|A550)$)/',
+        Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/',
         Format => 'int16u',
         ValueConv => '$val * 2 / 3',
         ValueConvInv => 'int($val * 3 / 2 + 0.5)',
         PrintConv => 'sprintf("%.1f mm",$val)',
         PrintConvInv => '$val =~ s/ mm//; $val',
     },
+    0x14 => { #12
+        Name => 'AFPointSelected',
+        Condition => '$$self{Model} =~ /^(DSLR-A(450|500|550))\b/',
+        # (these cameras have a 9-point AF system, ref 12)
+        PrintConvColumns => 2,
+        PrintConv => {
+            0 => 'Auto', # (seen in Wide mode and for Manual Focus)
+            1 => 'Center', # seen for AFArea=Spot
+            2 => 'Top',
+            3 => 'Upper-right',
+            4 => 'Right',
+            5 => 'Lower-right',
+            6 => 'Bottom',
+            7 => 'Lower-left',
+            8 => 'Left',
+            9 => 'Upper-left',
+        },
+    },
+    0x15 => { #12
+        Name => 'FocusMode',
+        Condition => '$$self{Model} =~ /^(DSLR-A(450|500|550))\b/',
+        PrintConv => {
+            0 => 'Manual',
+            1 => 'AF-S',
+            2 => 'AF-C',
+            3 => 'AF-A',
+        },
+    },
     0x19 => { #12
         Name => 'FocusStatus',
         Condition => '$$self{Model} =~ /^(SLT-|DSLR-A(560|580))\b/',
@@ -1560,6 +1735,8 @@ my %unknownCipherData = (
     # 0x0166 - starting here there are 96 unknown blocks of 155 bytes each for the
     #          A33/35/55, A560/580, but NOT for NEX or A450/500/550, and not
     #          for the A580 in Contrast-AF mode (ref 12)
+    #          The 43rd byte of each block appears to be the AFPoint as in offset 0x20,
+    #          possibly also 73rd and 74th byte
 );
 
 # camera information for other DSLR and NEX models (ref PH)
@@ -1592,6 +1769,93 @@ my %unknownCipherData = (
             PrintConvInv => \&PrintInvLensSpec,
         },
     ],
+#    0x0010 - maybe to do with AFStatus: 0 na./Manual, 4 Failed, 16 Tracking, 64 Focused
+    0x0014 => { #12
+        Name => 'FocusModeSetting',
+        Condition => '$$self{Model} =~ /^DSLR-A(700|850|900)\b/',
+        PrintConv => {
+            0 => 'Manual',
+            1 => 'AF-S',
+            2 => 'AF-C',
+            3 => 'AF-A',
+            4 => 'DMF',
+        },
+    },
+    0x0015 => { #12 the AF Point selected in AFAreaMode=Local or Spot; always '0' for AFAreaMode=Wide
+        Name => 'AFPointSelected',
+        Condition => '$$self{Model} =~ /^DSLR-A(700|850|900)\b/',
+        PrintConvColumns => 2,
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'Center',
+            2 => 'Top',
+            3 => 'Upper-right',
+            4 => 'Right',
+            5 => 'Lower-right',
+            6 => 'Bottom',
+            7 => 'Lower-left',
+            8 => 'Left',
+            9 => 'Upper-left',
+            10 => 'Far Right', # only given by A700
+            11 => 'Far Left',  # only given by A700
+        },
+    },
+    # 0x0019 - appears to relate to AF sensor used for focusing:
+    #
+    #   A700 AF sensor layout:         A850/A900 AF sensor layout:
+    #
+    #              -                             *-*                 - = AF sensor
+    #        |           |                  |           |            * = assist sensor
+    #              -                             *-*                 o = F2.8 sensor
+    #   |    |    |o|    |    |        |    *    |o|    *    |       A700 center: double-cross + F2.8
+    #              -                             *-*                 A850 center: double-cross + F2.8 + 4 assist
+    #        |           |                  |           |
+    #              -                             *-*
+    #
+    # Following values seen for A700/A850 in AFAreaMode=Local or Spot: (other values only seen in "Wide")
+    #
+    #              16
+    #         0           19
+    #              13
+    #    3    1    22     20    18
+    #               8
+    #         2           21
+    #               5
+    #
+    # Note 1: A850/A900 AFPoint Selected 'Left'/'Right' (in 0x0015) corresponds in position (see diagram)
+    #         to A700 Local AFPoint 'Far Left'/'Far Right', and gives 'Far Left'/'Far Right' in 0x0019.
+    # Note 2: A700 in "Wide" also gives all 23 values in 0x0019, although it doesn't have assist-points ...
+    #
+    0x0019 => { #12 the AF sensor used for focusing
+        Name => 'AFPoint',
+        Condition => '$$self{Model} =~ /^DSLR-A(700|850|900)\b/',
+        PrintConv => {
+            0 => 'Upper-left',
+            1 => 'Left',
+            2 => 'Lower-left',
+            3 => 'Far Left',
+            4 => 'Bottom Assist-left', #NC
+            5 => 'Bottom',
+            6 => 'Bottom Assist-right', #NC
+            # values 7-14: 8 center points: 4 from double-cross + 4 assist; 7-10 appear horizontal, 11-14 vertical
+            7  => 'Center (7)', #NC
+            8  => 'Center (horizontal)',
+            9  => 'Center (9)', #NC
+            10 => 'Center (10)', #NC
+            11 => 'Center (11)', #NC
+            12 => 'Center (12)', #NC
+            13 => 'Center (vertical)',
+            14 => 'Center (14)', #NC
+            15 => 'Top Assist-left', #NC
+            16 => 'Top',
+            17 => 'Top Assist-right', #NC
+            18 => 'Far Right',
+            19 => 'Upper-right',
+            20 => 'Right',
+            21 => 'Lower-right',
+            22 => 'Center F2.8',
+        },
+    },
     0x0130 => { #12
         Name => 'AFMicroAdjValue',
         Condition => '$$self{Model} =~ /^DSLR-A(850|900)\b/',
@@ -1709,6 +1973,7 @@ my %unknownCipherData = (
     },
     0x3f => { #12
         Name => 'ExposureProgram',
+        SeparateTable => 'ExposureProgram',
         PrintConv => \%sonyExposureProgram,
     },
     0x41 => { #12 style actually used (combination of mode dial + creative style menu)
@@ -1731,10 +1996,21 @@ my %unknownCipherData = (
             16 => 'Sepia', #7
         },
     },
+#    0x06f1 - int16u    LensType,  Condition => '$$self{Model} =~ /^DSLR-A(700|850|900)$/',
+#    0x4a81 - int16u    LensType,  Condition => '$$self{Model} !~ /^DSLR-A(700|850|900)$/',
+#    0x4a84 - int16uRev LensType,  Condition => '$$self{Model} =~ /^DSLR-A(700|850|900)$/',
+    0x0846 => { #13
+        Name => 'ShutterCount', # (=ImageCount for these models)
+        Condition => '$$self{Model} =~ /^DSLR-A(230|290|330|380|390|850|900)$/',
+        Format => 'int32u',
+        Notes => 'only valid for some DSLR models',
+        RawConv => '$val & 0x00ffffff', #PH
+    },
     0x09bb => { #PH (validated only for DSLR-A850)
+        Name => 'FocusPosition',
         Condition => '$$self{Model} =~ /^DSLR-A(200|230|290|300|330|350|380|390|700|850|900)$/',
         Notes => 'only valid for some DSLR models',
-        Name => 'FocusPosition',  # 128 = infinity -- see Composite:FocusDistance below
+        # 128 = infinity -- see Composite:FocusDistance below
     },
 );
 
@@ -1753,11 +2029,17 @@ my %unknownCipherData = (
         SubDirectory => { TagTable => 'Image::ExifTool::Sony::MoreSettings' },
     },
     # (byte sizes for a single A580 image -- not checked for other images)
-    0x0002 => { # (256 bytes)
-        Name => 'FaceInfo',
-        Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/',
-        SubDirectory => { TagTable => 'Image::ExifTool::Sony::FaceInfo' },
-    },
+    0x0002 => [ # (256 bytes)
+        {
+            Name => 'FaceInfo',
+            Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/',
+            SubDirectory => { TagTable => 'Image::ExifTool::Sony::FaceInfo' },
+        },{
+            Name => 'FaceInfoA',
+            Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/',
+            SubDirectory => { TagTable => 'Image::ExifTool::Sony::FaceInfoA' },
+        },
+    ],
     # 0x0101:  512 bytes
     # 0x0102: 1804 bytes
     # 0x0103:  176 bytes
@@ -1771,9 +2053,9 @@ my %unknownCipherData = (
             TIFF image
         },
         ValueConv => sub {
-            my ($val, $exifTool) = @_;
+            my ($val, $et) = @_;
             return undef unless length $val >= 7200;
-            return \ "Binary data 7404 bytes" unless $exifTool->Options('Binary');
+            return \ "Binary data 7404 bytes" unless $et->Options('Binary');
             my @dat = unpack('v*', $val);
             # TIFF header for a 16-bit RGB 10dpi 40x30 image
             $val = MakeTiffHeader(40,30,3,16,10);
@@ -1797,9 +2079,71 @@ my %unknownCipherData = (
     # 0x0308:   96 bytes
     # 0x0309:  112 bytes
     # 0xffff:  788 bytes
-    # 0x0201:  368 bytes
+    0x0201 => { # (368 bytes)
+        Name => 'MoreInfo0201',
+        SubDirectory => { TagTable => 'Image::ExifTool::Sony::MoreInfo0201' },
+    },
     # 0x0202:  144 bytes
     # 0x0401: 4608 bytes
+    0x0401 => {
+        Name => 'MoreInfo0401',
+        SubDirectory => { TagTable => 'Image::ExifTool::Sony::MoreInfo0401' },
+    },
+);
+
+%Image::ExifTool::Sony::MoreInfo0201 = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PRIORITY => 0,
+    0x011b => { #13
+        Name => 'ImageCount',
+        Condition => '$$self{Model} !~ /^DSLR-A(450|500|550)$/', #12
+        Format => 'int32u',
+        Notes => 'not valid for the A450, A500 or A550',
+        RawConv => '$val & 0x00ffffff',
+    },
+    0x0125 => { #13
+        Name => 'ShutterCount',
+        Condition => '$$self{Model} !~ /^DSLR-A(450|500|550)$/', #12
+        Format => 'int32u',
+        Notes => 'not valid for the A450, A500 or A550',
+        RawConv => '$val & 0x00ffffff',
+    },
+    0x014a => { #13
+        Name => 'ShutterCount', # (=ImageCount for these models)
+        Condition => '$$self{Model} =~ /^DSLR-A(450|500|550)$/', #12
+        Format => 'int32u',
+        Notes => 'A450, A500 and A550 only',
+        RawConv => '$val & 0x00ffffff',
+    },
+);
+
+%Image::ExifTool::Sony::MoreInfo0401 = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PRIORITY => 0,
+    0x044e => { #12
+        Name => 'ShotNumberSincePowerUp',
+        Condition => '$$self{Model} !~ /^NEX-(3|5)$/',
+        Format => 'int32u',
+        Notes => 'Not valid for the NEX-3 or NEX-5',
+        RawConv => '$val & 0x00ffffff',
+    },
+#    0x101e - int16u LensType  Condition => '$$self{Model} =~ /^SLT-A(33|55V)/',
+#    0x1022 - int16u LensType  Condition => '$$self{Model} =~ /^DSLR-A(560|580)/',
+#    0x102a - int16u LensType  Condition => '$$self{Model} =~ /^SLT-A35/',
+
+#    0x10a8 - int16u LensType  Condition => '$$self{Model} =~ /^SLT-A(33|55V)/',
+#    0x10ac - int16u LensType  Condition => '$$self{Model} =~ /^DSLR-A(560|580)/',
+#    0x10b4 - int16u LensType  Condition => '$$self{Model} =~ /^SLT-A35/',
+#
+#    0x10f7 - int16u LensType  Condition => '$$self{Model} =~ /^SLT-A(33|55V)/',
+#    0x10fb - int16u LensType  Condition => '$$self{Model} =~ /^DSLR-A(560|580)/',
+#    0x1103 - int16u LensType  Condition => '$$self{Model} =~ /^SLT-A35/',
+#
+#    0x1181 - int16u LensType  Condition => '$$self{Model} =~ /^SLT-A(33|55V)/',
+#    0x1185 - int16u LensType  Condition => '$$self{Model} =~ /^DSLR-A(560|580)/',
+#    0x118d - int16u LensType  Condition => '$$self{Model} =~ /^SLT-A35/',
 );
 
 # more camera setting information (ref 12)
@@ -1827,6 +2171,7 @@ my %unknownCipherData = (
     },
     0x02 => {
         Name => 'ExposureProgram',
+        SeparateTable => 'ExposureProgram2',
         PrintConv => \%sonyExposureProgram2,
     },
     0x03 => {
@@ -2043,6 +2388,14 @@ my %unknownCipherData = (
         PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"',
         PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)',
     },
+    0x29 => { # value increase of 16 corresponds to doubling of FocalLength
+        Name => 'FocalLength2',
+        Condition => '$$self{Model} !~ /^(NEX-(3|5)|DSLR-(A450|A500|A550)$)/',
+        ValueConv => '10 * 2 ** (($val-28)/16)',
+        ValueConvInv => '$val>0 ? log($val/10)/log(2) * 16 + 28 : 0',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+        PrintConvInv => '$val=~s/\s*mm$//; $val',
+    },
     0x2a => {
         Name => 'ExposureCompensation2',
         Condition => '$$self{Model} !~ /^(NEX-(3|5)|DSLR-(A450|A500|A550)$)/',
@@ -2067,6 +2420,7 @@ my %unknownCipherData = (
         Condition => '$$self{Model} !~ /^(NEX-(3|5)|DSLR-(A450|A500|A550)$)/',
         PrintConv => {
             1 => 'Horizontal (normal)',
+            2 => 'Rotate 180',
             6 => 'Rotate 90 CW',
             8 => 'Rotate 270 CW',
         },
@@ -2087,9 +2441,9 @@ my %unknownCipherData = (
             1 => 'MF',
         },
     },
-    # 0x86: 17=fill flash, 18=slow sync (PH; A550)
-    # 0x89: FlashExposureComp = ($val-128)/24 (PH; A550) [same in MoreInfo_0002]
-    # 0xfa: same as 0x86 (PH; A550) [same in MoreInfo_0002]
+    # 0x86: 17=fill flash, 18=slow sync (PH, A550)
+    # 0x89: FlashExposureComp = ($val-128)/24 (PH, A550) [same in MoreInfo_0002]
+    # 0xfa: same as 0x86 (PH, A550) [same in MoreInfo_0002]
 );
 
 # Face detection information (ref 12)
@@ -2161,6 +2515,102 @@ my %faceInfo = (
     },
 );
 
+%Image::ExifTool::Sony::FaceInfoA = ( # different offsets for A450/A500/A550
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FORMAT => 'int16u',
+    DATAMEMBER => [ 0x02, 0x03, 0x08 ],
+#
+# The FacesDetected number at 0x03 below is often 1 lower than the one at Tag900b 0x02.
+# The number of Face Positions starting at 0x5b (max. 4) corresponds to the number at 0x03.
+# The number of Face Positions starting at 0x0b usually corresponds to the FacesDetected number of Tag900b...
+# Therefore created the extra condition at 0x0b (11.1) to output an available FacePosition, even when 0x03=0...
+#
+    0x02 => {
+        Name => 'FaceTest2',
+        DataMember => 'FaceTest2',
+        Hidden => 1,
+        RawConv => '$$self{FaceTest2} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val',
+    },
+    0x03 => {
+        Name => 'FacesDetected',
+        DataMember => 'FacesDetected',
+        RawConv => '$$self{FacesDetected} = ($val > 8 ? 0 : $val); $val',
+        ValueConv => '$val > 8 ? 0 : $val',
+    },
+    0x08 => {
+        Name => 'FaceTest8',
+        DataMember => 'FaceTest8',
+        Hidden => 1,
+        RawConv => '$$self{FaceTest8} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val',
+    },
+# 0x0b - start of 8 Face Positions of 10 int16u values each
+    0x0b => {
+        Name => 'PotentialFace1Position',
+        Condition => q{
+            $$self{FacesDetected} >= 1 or
+            ($$self{FaceTest8} > 0 and ($$self{FaceTest2} == 1 or $$self{FaceTest2} == 257))
+        },
+        %faceInfo,
+    },
+    0x15 => {
+        Name => 'PotentialFace2Position',
+        Condition => '$$self{FacesDetected} >= 2 or ($$self{FacesDetected} == 1 and $$self{FaceTest8} > 0)',
+        %faceInfo,
+    },
+    0x1f => {
+        Name => 'PotentialFace3Position',
+        Condition => '$$self{FacesDetected} >= 3 or ($$self{FacesDetected} == 2 and $$self{FaceTest8} > 0)',
+        %faceInfo,
+    },
+    0x29 => {
+        Name => 'PotentialFace4Position',
+        Condition => '$$self{FacesDetected} >= 4 or ($$self{FacesDetected} == 3 and $$self{FaceTest8} > 0)',
+        %faceInfo,
+    },
+    0x33 => {
+        Name => 'PotentialFace5Position',
+        Condition => '$$self{FacesDetected} >= 5 or ($$self{FacesDetected} == 4 and $$self{FaceTest8} > 0)',
+        %faceInfo,
+    },
+    0x3d => {
+        Name => 'PotentialFace6Position',
+        Condition => '$$self{FacesDetected} >= 6 or ($$self{FacesDetected} == 5 and $$self{FaceTest8} > 0)',
+        %faceInfo,
+    },
+    0x47 => {
+        Name => 'PotentialFace7Position',
+        Condition => '$$self{FacesDetected} >= 7 or ($$self{FacesDetected} == 6 and $$self{FaceTest8} > 0)',
+        %faceInfo,
+    },
+    0x51 => {
+        Name => 'PotentialFace8Position',
+        Condition => '$$self{FacesDetected} >= 8 or ($$self{FacesDetected} == 7 and $$self{FaceTest8} > 0)',
+        %faceInfo,
+    },
+# 0x5b - start of max. 4 further Face Positions here
+    0x5b => {
+        Name => 'Face1Position',
+        Condition => '$$self{FacesDetected} >= 1',
+        %faceInfo,
+    },
+    0x65 => {
+        Name => 'Face2Position',
+        Condition => '$$self{FacesDetected} >= 2',
+        %faceInfo,
+    },
+    0x6f => {
+        Name => 'Face3Position',
+        Condition => '$$self{FacesDetected} >= 3',
+        %faceInfo,
+    },
+    0x79 => {
+        Name => 'Face4Position',
+        Condition => '$$self{FacesDetected} >= 4',
+        %faceInfo,
+    },
+);
+
 # Camera settings (ref PH) (decoded mainly from A200)
 %Image::ExifTool::Sony::CameraSettings = (
     %binaryDataAttrs,
@@ -2230,6 +2680,7 @@ my %faceInfo = (
             1 => 'AF-S',
             2 => 'AF-C',
             3 => 'AF-A',
+            4 => 'DMF', #12
         },
     },
     0x11 => { #JD (A700)
@@ -2241,8 +2692,10 @@ my %faceInfo = (
         },
     },
     0x12 => { #7 (A700)
-        Name => 'AFPointSelected',
+        Name => 'AFPointSetting',
         Format => 'int16u',
+        # The AF point as selected by the user in AFAreaMode=Local or Spot;
+        # Reported value remains at the last-set position in AFAreaModes=Wide.
         # A200, A300, A350: 9-point centre-cross (ref 12)
         # A700: 11-point centre-dual-cross (ref 12)
         # A850, A900: 9-point centre-dual-cross with 10 assist-points (ref 12)
@@ -2250,13 +2703,13 @@ my %faceInfo = (
         PrintConv => {
             1 => 'Center',
             2 => 'Top',
-            3 => 'Top-Right',
+            3 => 'Upper-right',
             4 => 'Right',
-            5 => 'Bottom-Right',
+            5 => 'Lower-right',
             6 => 'Bottom',
-            7 => 'Bottom-Left',
+            7 => 'Lower-left',
             8 => 'Left',
-            9 => 'Top-Left',
+            9 => 'Upper-left',
             10 => 'Far Right', # (presumably A700 only)
             11 => 'Far Left', # (presumably A700 only)
         },
@@ -2436,6 +2889,7 @@ my %faceInfo = (
     },
     0x3c => {
         Name => 'ExposureProgram',
+        SeparateTable => 'ExposureProgram',
         PrintConv => \%sonyExposureProgram,
     },
     0x3d => {
@@ -2457,6 +2911,7 @@ my %faceInfo = (
             1 => 'AF-S',
             2 => 'AF-C',
             3 => 'AF-A',
+            4 => 'DMF', #12
         },
     },
     0x51 => { #12
@@ -2510,10 +2965,15 @@ my %faceInfo = (
             50 => '1/2 EV',
         },
     },
+    0x9a => { #12
+        Name => 'FolderNumber',
+        Mask => 0x03ff, # (not sure what the upper 6 bits are for)
+        PrintConv => 'sprintf("%.3d",$val)',
+        PrintConvInv => '$val',
+    },
     0x9b => { #12
         Name => 'ImageNumber',
-        ValueConv => '$val & 0x3fff', #PH (not sure what the upper 2 bits are for)
-        ValueConvInv => '$val',
+        Mask => 0x3fff, # (not sure what the upper 2 bits are for)
         PrintConv => 'sprintf("%.4d",$val)',
         PrintConvInv => '$val',
     },
@@ -2578,20 +3038,22 @@ my %faceInfo = (
         },
     },
     0x11 => { #12/PH (educated guess)
-        Name => 'AFPointSelected',
+        Name => 'AFPointSetting',
         Format => 'int16u',
+        # The AF point as selected by the user in AFAreaMode=Local or Spot;
+        # Reported value remains at the last-set position in AFAreaModes=Wide.
         # (all of these cameras have a 9-point centre-cross AF system, ref 12)
         PrintConvColumns => 2,
         PrintConv => {
             1 => 'Center',
             2 => 'Top',
-            3 => 'Top-Right',
+            3 => 'Upper-right',
             4 => 'Right',
-            5 => 'Bottom-Right',
+            5 => 'Lower-right',
             6 => 'Bottom',
-            7 => 'Bottom-Left',
+            7 => 'Lower-left',
             8 => 'Left',
-            9 => 'Top-Left',
+            9 => 'Upper-left',
         },
     },
 ### 0x12-0x18: subtract 2 from CameraSettings TagID
@@ -2714,6 +3176,7 @@ my %faceInfo = (
 ### 0x3c-0x59: same TagID as CameraSettings
     0x3c => {
         Name => 'ExposureProgram',
+        SeparateTable => 'ExposureProgram',
         PrintConv => \%sonyExposureProgram,
     },
     0x3d => { # (copied from CameraSettings, ref 12)
@@ -2814,6 +3277,7 @@ my %faceInfo = (
     GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
     FORMAT => 'int8u',
     PRIORITY => 0,
+    DATAMEMBER => [ 0x99 ],
     NOTES => q{
         Camera settings for models such as the A33, A35, A55, A450, A500, A550,
         A560, A580, NEX-3, NEX-5, NEX-C3 and NEX-VG10E.
@@ -2884,6 +3348,7 @@ my %faceInfo = (
         # Camera exposure program/mode as selected with the Mode dial.
         # For SCN a further selection is done via the menu
         # Matches OK with 0xb023
+        SeparateTable => 'ExposureProgram2',
         PrintConv => \%sonyExposureProgram2,
     },
     0x06 => { #12
@@ -3244,6 +3709,14 @@ my %faceInfo = (
             2 => 'Fired',
         },
     },
+#    0x8a => { #12
+#        Name => 'LensAF',
+#        Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/',
+#        PrintConv => {
+#            1  => 'No',
+#            16 => 'AF Lens',
+#        },
+#    },
     0x8b => { #12
         Name => 'LiveViewFocusMode',
         Condition => '$$self{Model} !~ /^(NEX-|DSLR-(A450|A500|A550)$)/',
@@ -3253,6 +3726,35 @@ my %faceInfo = (
             16 => 'Manual',
         },
     },
+#    0x8e => { #12
+#        Name => 'LensSAM',
+#        Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/',
+#        PrintConv => {
+#            1  => 'No',
+#            16 => 'SAM Lens',
+#        },
+#    },
+    0x99 => { #12
+        Name => 'LensMount',
+        Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/',
+        DataMember => 'LensMount',
+        RawConv => '$$self{LensMount} = $val',
+        PrintConv => {
+            1  => 'Unknown',
+            16 => 'A-Mount',
+            17 => 'E-Mount',
+        },
+    },
+#    0x9b => { #12
+#        Name => 'LensOSS',
+#        Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/',
+#        PrintConv => {
+#            1  => 'No',
+#            16 => 'OSS Lens',
+#            17 => 'OSS Lens (NEX-VG)', # active ?
+#        },
+#    },
+    # 0x9c - 1; 2 for multi-shot modes
     0x10c => { #12
         Name => 'SequenceNumber',
         Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/', # seen 18 for A550, so better exclude ?
@@ -3263,16 +3765,77 @@ my %faceInfo = (
             OTHER => sub { shift }, # pass all other numbers straight through
         },
     },
-    0x114 => { #12
+    # when reading 0x0114 - 0x0117 as int32u:
+    # - upper 8 bits (0x0117): always value 4, meaning unknown
+    # - next 10 bits: FolderNumber (max. 999 according to manual)
+    # - last 14 bits: ImageNumber  (max 9999)
+    0x0114 => { #12
+        Name => 'FolderNumber',
+        Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/',
+        Format => 'int32u',
+        Mask => 0x00ffc000,
+        ValueConv => '$val >> 14',
+        ValueConvInv => '$val << 14',
+        PrintConv => 'sprintf("%.3d",$val)',
+        PrintConvInv => '$val',
+    },
+    276.1 => { #12 (0x0114.1)
         Name => 'ImageNumber',
-        Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/', #PH
-        Format => 'int16u',
-        Mask => 0x3fff, #PH (not sure what the upper 2 bits are for)
-        ValueConvInv => '$val',
+        Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/',
+        Format => 'int32u',
+        Mask => 0x00003fff,
         PrintConv => 'sprintf("%.4d",$val)',
         PrintConvInv => '$val',
     },
-    0x0287 => { #12
+    0x200 => { #12
+        Name => 'ShotNumberSincePowerUp2',
+        Notes => q{
+            same as ShotNumberSincePowerUp for single-shot images, but includes all
+            shots of the current image in multi-shot modes like HDR, panorama, and
+            multi-frame noise reduction
+        },
+        # (includes all shutter actuations of the current shot)
+        Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/',
+        Format => 'int32u',
+    },
+    0x283 => { #12
+        Name => 'AFButtonPressed',
+        # only indicates pressing and holding the "AF" button (centre-controller),
+        # not pressing the shutter release button halfway down
+        Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/',
+        PrintConv => {
+            1 => 'No',
+            16 => 'Yes',
+        },
+    },
+    0x284 => { #12 (not 100% sure about this one)
+        Name => 'LiveViewMetering',
+        Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/',
+        PrintConv => {
+            0 => 'n/a',
+            16 => '40 Segment',             # DSLR with LiveView/OVF switch in OVF position
+            32 => '1200-zone Evaluative',   # DSLR with LiveView/OVF switch in LiveView position
+        },
+    },
+    0x285 => { #12 (not sure what is difference with 0x2f)
+        Name => 'ViewingMode2',
+        Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/',
+        PrintConv => {
+            0 => 'n/a',
+            16 => 'Viewfinder',
+            33 => 'Focus Check Live View',
+            34 => 'Quick AF Live View',
+        },
+    },
+    0x286 => { #12
+        Name => 'AELock',
+        Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/',
+        PrintConv => {
+            1 => 'On',
+            2 => 'Off',
+        },
+    },
+    0x287 => { #12
         Name => 'FlashAction',
         Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/',
         Notes => 'A450, A500 and A550',
@@ -3281,7 +3844,16 @@ my %faceInfo = (
             2 => 'Fired',
         },
     },
-    0x030c => { #12
+    0x28b => { #12
+        Name => 'LiveViewFocusMode',
+        Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/',
+        PrintConv => {
+            0 => 'n/a',
+            1 => 'AF',
+            16 => 'Manual',
+        },
+    },
+    0x30c => { #12
         Name => 'SequenceNumber',
         Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/',
         Notes => 'A450, A500 and A550',
@@ -3292,26 +3864,49 @@ my %faceInfo = (
             OTHER => sub { shift }, # pass all other numbers straight through
         },
     },
-    0x0314 => { #12
+    0x314 => { #12
         Name => 'ImageNumber',
         Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/',
         Format => 'int16u',
         Notes => 'A450, A500 and A550',
         Mask => 0x3fff, #PH (not sure what the upper 2 bits are for)
-        ValueConvInv => '$val',
         PrintConv => 'sprintf("%.4d",$val)',
         PrintConvInv => '$val',
     },
-    0x0400 => { #12
+    0x316 => { #12
+        Name => 'FolderNumber',
+        Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/',
+        Notes => 'A450, A500 and A550',
+        Format => 'int16u',
+        Mask => 0x03ff, # (NC)
+        PrintConv => 'sprintf("%.3d",$val)',
+        PrintConvInv => '$val',
+    },
+    0x3f7 => { #12
+        Name => 'LensType2',
+        Condition => '($$self{Model} =~ /^NEX-/) and ($$self{LensMount} != 1)',
+        Format => 'int16u',
+        SeparateTable => 1,
+        PrintConv => \%sonyLensTypes2,
+    },
+    0x400 => { #12
         Name => 'ImageNumber',
         Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/',
         Format => 'int16u',
         Notes => 'A450, A500 and A550',
         Mask => 0x3fff, #PH (not sure what the upper 2 bits are for)
-        ValueConvInv => '$val',
         PrintConv => 'sprintf("%.4d",$val)',
         PrintConvInv => '$val',
     },
+    0x402 => { #12
+        Name => 'FolderNumber',
+        Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/',
+        Format => 'int16u',
+        Mask => 0x03ff, # (NC)
+        Notes => 'A450, A500 and A550',
+        PrintConv => 'sprintf("%.3d",$val)',
+        PrintConvInv => '$val',
+    },
 );
 
 # Camera settings for other models
@@ -3463,7 +4058,7 @@ my %faceInfo = (
     0x0006 => {
         Name => 'BatteryVoltage1',
         Format => 'int16u',
-        Condition => '$$self{Model} !~ /^(NEX-(3|5|C3|VG10|VG10E))\b/',
+        Condition => '$$self{Model} !~ /^(NEX-(3|5|5C|C3|VG10|VG10E))\b/',
         ValueConv => '$val / 128',
         ValueConvInv => '$val * 128',
         PrintConv => 'sprintf("%.2f V",$val)',
@@ -3472,7 +4067,7 @@ my %faceInfo = (
     0x0008 => {
         Name => 'BatteryVoltage2',
         Format => 'int16u',
-        Condition => '$$self{Model} !~ /^(NEX-(3|5|C3|VG10|VG10E))\b/',
+        Condition => '$$self{Model} !~ /^(NEX-(3|5|5C|C3|VG10|VG10E))\b/',
         ValueConv => '$val / 128',
         ValueConvInv => '$val * 128',
         PrintConv => 'sprintf("%.2f V",$val)',
@@ -3483,7 +4078,7 @@ my %faceInfo = (
     # 0x000a => {
     #     Name => 'ExtraInfo_000a',
     #     Format => 'int16u[3]',
-    #     Condition => '$$self{Model} !~ /^(NEX-(3|5|C3|VG10|VG10E))\b/',
+    #     Condition => '$$self{Model} !~ /^(NEX-(3|5|5C|C3|VG10|VG10E))\b/',
     # },
     # 0x0010 seen:
     #     176 for SLT
@@ -3491,6 +4086,7 @@ my %faceInfo = (
     #     240 for DSLR
     0x0011 => {
         Name => 'ImageStabilization',
+        Condition => '$$self{Model} !~ /^(NEX-(3|5|5C|C3|VG10|VG10E))\b/',
         # usually matches 0xb026 ImageStabilization, except some images with SelfTimer and on tripod
         PrintConv => {
             0 => 'Off',
@@ -3500,7 +4096,7 @@ my %faceInfo = (
     0x0014 => [
         {
             Name => 'BatteryState',
-            Condition => '$$self{Model} =~ /^(SLT-)\b/',
+            Condition => '$$self{Model} =~ /^SLT-/',
             # possibly relates to "simple" batterylevel indication with battery-icon, but not completely sure
             Notes => 'BatteryState for SLT models',
             PrintConv => {
@@ -3553,31 +4149,44 @@ my %faceInfo = (
     #   bit 5 ( 32) ON = OVF,        OFF = LiveView
     #   bit 6 ( 64) seen ON and OFF, meaning unknown
     #   bit 7 (128) seen ON and OFF, meaning unknown
-    0x0016 => {
+    # 0x0016: DSLR: seen 244,245,252,254, decoded for A580 with 32GB SD and 16GB MS cards
+    # 0x0016: NEX:  seen 61,62,  125,126,  190: bits '64' and '128' appear to relate to CameraOrientation
+    # 0x0016: SLT:  seen 64 - 78, meaning unknown
+    0x0016 => [{
         Name => 'MemoryCardConfiguration',
-        Condition => '$$self{Model} =~ /^(DSLR-)\b/',
-        #  DSLR: seen 244,245,252,254, decoded for A580 with 32GB SD and 16GB MS cards
-        #  SLT:  seen 64 - 78,   NEX:  seen 62, 190
+        Condition => '$$self{Model} =~ /^DSLR-/',
         PrintConv => {
             244 => 'MemoryStick in use, SD card present',
             245 => 'MemoryStick in use, SD slot empty',
             252 => 'SD card in use, MemoryStick present',
             254 => 'SD card in use, MemoryStick slot empty',
         },
-    },
+    },{
+        Name => 'CameraOrientation',
+        Condition => '$$self{Model} =~ /^(NEX-(3|5|5C|C3|VG10|VG10E))\b/',
+        Mask => 0xc0, # (don't know what other bits mean)
+        PrintConv => {
+            0x00 =>  'Horizontal (normal)',
+            0x40 =>  'Rotate 90 CW',
+            0x80 =>  'Rotate 270 CW',
+            0xc0 =>  'Rotate 180', # (NC)
+        },
+
+    }],
     # 0x0017: seen 0 for SLT, 255 for DSLR, variable for NEX
     0x0018 => {
         Name => 'CameraOrientation',
-        Condition => '$$self{Model} !~ /^(NEX-(3|5|C3|VG10|VG10E))\b/',
+        Condition => '$$self{Model} !~ /^(NEX-(3|5|5C|C3|VG10|VG10E))\b/',
         Mask => 0x30, # (don't know what other bits mean)
         PrintConv => {
             0x00 =>  'Horizontal (normal)',
             0x10 =>  'Rotate 90 CW',
             0x20 =>  'Rotate 270 CW',
+            0x30 =>  'Rotate 180',
         },
     },
     # 0x0019:
-    #   A500/550:  0 - 6 and 251 - 255: could be something from -6 to +6 ?
+    #   A450/500/550:  0 - 12 and 233 - 255
     #   A560/580:  1 or 64, seen a few 0 and 8
     #   A33/35/55: seen 0, 1, 64
     #   NEX:       204
@@ -3585,11 +4194,48 @@ my %faceInfo = (
 );
 
 
+# more AF information (ref 12)
+%Image::ExifTool::Sony::AFInfo2 = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0 => {
+        Name => 'AFPointsUsed',
+        Condition => '$$self{Model} =~ /^SLT-/',
+        Format => 'int32u',
+        Notes => 'SLT models only',
+        PrintConvColumns => 2,
+        PrintConv => {
+            0 => '(none)',
+            BITMASK => {
+                0 => 'Center',
+                1 => 'Top',
+                2 => 'Upper-right',
+                3 => 'Right',
+                4 => 'Lower-right',
+                5 => 'Bottom',
+                6 => 'Lower-left',
+                7 => 'Left',
+                8 => 'Upper-left',
+                9 => 'Far Right',
+                10 => 'Far Left',
+                11 => 'Upper-middle',
+                12 => 'Near Right',
+                13 => 'Lower-middle',
+                14 => 'Near Left',
+                15 => 'Upper Far Right',
+                16 => 'Lower Far Right',
+                17 => 'Lower Far Left',
+                18 => 'Upper Far Left',
+            },
+        },
+    },
+);
+
 # shot information (ref PH)
 %Image::ExifTool::Sony::ShotInfo = (
     %binaryDataAttrs,
     GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
-    DATAMEMBER => [ 0x02, 0x30, 0x32 ],
+    DATAMEMBER => [ 0x02, 0x30, 0x32, 0x34 ],
     IS_SUBDIR => [ 0x48, 0x5e ],
     # 0x00 - byte order 'II'
     0x02 => {
@@ -3628,12 +4274,16 @@ my %faceInfo = (
         Writable => 0,
         RawConv => '$$self{FaceInfoLength} = $val',
     },
-    #0x34 => {
-    #    # values: 'DC5303320222000', 'DC6303320222000' or 'DC7303320222000'
-    #    Name => 'UnknownString',
-    #    Format => 'string[16]',
-    #    Unknown => 1,
-    #},
+    0x34 => {
+        # oldest/other DSC/other        -
+        # older DSC models              "DC5303320222000" or "DC6303320222000"
+        # DSC-W650/W690/W730            "THm101000000000" or "THm211000000000"
+        # DSC-HX9V generation and newer "DC7303320222000"
+        Name => 'MetaVersion', # (tentative)
+        Format => 'string[16]',
+        DataMember => 'MetaVersion',
+        RawConv => '$$self{MetaVersion} = $val',
+    },
     0x48 => { # (most models: DC5303320222000 and DC6303320222000)
         Name => 'FaceInfo1',
         Condition => q{
@@ -3654,21 +4304,562 @@ my %faceInfo = (
     },
 );
 
-# Tag9050 information (ref 12)
-%Image::ExifTool::Sony::Tag9050 = (
+# tags used in Tag2010 and Tag9400 tables
+my %sequenceImageNumber = ( #PH
+    Name => 'SequenceImageNumber',
+    Notes => 'number of images captured in burst sequence',
+    # (not shutter count because it increments for auto portrait framing)
+    Format => 'int32u',
+    ValueConv => '$val + 1',
+    ValueConvInv => '$val - 1',
+);
+my %sequenceFileNumber = ( #PH
+    Name => 'SequenceFileNumber',
+    Notes => 'file number in burst sequence',
+    Format => 'int32u',
+    ValueConv => '$val + 1', #12
+    ValueConvInv => '$val - 1',
+);
+my %releaseMode2 = ( #12
+    Name => 'ReleaseMode2',
+    SeparateTable => 'ReleaseMode2',
+    PrintConv => {
+        0 => 'Normal',
+        1 => 'Continuous', # (RX100 "Continuous - Self-timer")
+        2 => 'Continuous - Exposure Bracketing', # (RX100)
+        3 => 'Continuous - White Balance Bracketing', # (HX9V) (RX100)
+        5 => 'Continuous - Burst', # (HX9V)
+        6 => 'Single Frame - Capture During Movie', #PH (RX100)
+        7 => 'Continuous - Sweep Panorama',
+        8 => 'Continuous - Anti-Motion Blur, Hand-held Twilight', # (HX9V)
+        9 => 'Continuous - HDR',
+        10 => 'Continuous - Background defocus', # (HX9V)
+        13 => 'Continuous - 3D Sweep Panorama', #PH/12
+        15 => 'Continuous - High Resolution Sweep Panorama', #12 (HX50V)
+        16 => 'Continuous - 3D Image', # (HX9V)
+        17 => 'Continuous - Burst 2', # (WX7 - PH) (#12 9400-SequenceLength=10 shots)
+        19 => 'Continuous - Speed/Advance Priority', #PH/12 (RX100)
+        20 => 'Continuous - Multi Frame NR',
+        23 => 'Single-frame - Exposure Bracketing', # (NC, seen for ILCE-7)
+        26 => 'Continuous Low', #PH (A77)
+        27 => 'Continuous - High Sensitivity',  # seen for DSC-WX60 and WX300
+        28 => 'Smile Shutter', #PH (RX100)
+        29 => 'Continuous - Tele-zoom Advance Priority',
+        146 => 'Single Frame - Movie Capture', #PH (seen in Tag2010 ReleaseMode2 values)
+    },
+);
+
+# tag definitions for Tag2010 tables (ref 12)
+my %sonyDateTime2010 = (
+    Name => 'SonyDateTime',
+    Format => 'undef[7]',
+    Shift => 'Time',
+    ValueConv => q{
+        my @v = unpack('vC*', $val);
+        return sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2d", @v)
+    },
+    ValueConvInv => q{
+        my @v = ($val =~ /\d+/g);
+        return undef unless @v == 6;
+        return pack('vC*', @v);
+    },
+    PrintConv => '$self->ConvertDateTime($val)',
+    PrintConvInv => '$self->InverseDateTime($val,0)',
+);
+my %releaseMode2010 = (
+    Name => 'ReleaseMode3',
+    PrintConv => {
+        0 => 'Normal',
+        1 => 'Continuous',
+        2 => 'Continuous - Bracketing', # (also white balance bracketing - PH)
+        # 3 => 'Remote Commander', (NC) (seen this when other ReleaseMode and ReleaseMode2 are 'Normal' - PH, A77)
+        # 4 => 'Continuous - Burst', (NC)
+        5 => 'Continuous - Speed/Advance Priority',
+    },
+);
+my %gain2010 = (
+    Name => 'StopsAboveBaseISO',
+    # BaseISO is 100 for SLT, ILCE-3000, NEX-5N/5R/5T/6/7/VG20/VG30/VG900, DSC-RX1/RX1R
+    # BaseISO is 200 for NEX-F3/3N
+    # BaseISO is 160 for DSC-RX100M2
+    # BaseISO is 125 for DSC-RX100
+    # Also several other DSC models have BaseISO different from 100.
+    Format => 'int16u',
+    ValueConv => '16 - $val/256',
+    ValueConvInv => '(16 - $val) * 256',
+    PrintConv => '$val ? sprintf("%.1f",$val) : $val',
+    PrintConvInv => '$val',
+);
+my %brightnessValue2010 = (
+    Name => 'BrightnessValue',
+    Format => 'int16u',
+    ValueConv => '$val/256 - 56.6',
+    ValueConvInv => '($val + 56.6) * 256',
+);
+my %dynamicRangeOptimizer2010 = (
+    Name => 'DynamicRangeOptimizer',
+    PrintConv => {
+        0 => 'Off',
+        1 => 'Auto',
+        3 => 'Lv1',
+        4 => 'Lv2',
+        5 => 'Lv3',
+        6 => 'Lv4',
+        7 => 'Lv5',
+        8 => 'n/a',
+    },
+);
+my %hdr2010 = (
+    Name => 'HDRSetting', # (Off when HDR tag is On for RX100 superior auto backlight - PH)
+    PrintConv => {
+        0 => 'Off',
+        1 => 'HDR Auto',
+        7 => 'HDR 3 EV',
+        9 => 'HDR 4 EV',
+        11 => 'HDR 5 EV',
+        13 => 'HDR 6 EV',
+    },
+);
+my %exposureComp2010 = (
+    Name => 'ExposureCompensation',
+    Format=>'int16s',
+    ValueConv => '-$val/256',
+    ValueConvInv => '-$val*256',
+    PrintConv => '$val ? sprintf("%+.1f",$val) : $val',
+    PrintConvInv => '$val',
+);
+my %pictureEffect2010 = (
+    Name => 'PictureEffect2',
+    SeparateTable => 'PictureEffect2',
+    PrintConv => {
+        0 => 'Off',
+        1 => 'Toy Camera',
+        2 => 'Pop Color',
+        3 => 'Posterization',
+        4 => 'Retro Photo',
+        5 => 'Soft High Key',
+        6 => 'Partial Color',
+        7 => 'High Contrast Monochrome',
+        8 => 'Soft Focus',
+        9 => 'HDR Painting',
+        10 => 'Rich-tone Monochrome',
+        11 => 'Miniature',
+        12 => 'Water Color',
+        13 => 'Illustration',
+    },
+);
+my %quality2010 = (
+    Name => 'Quality2',
+    PrintConv => {
+        0 => 'JPEG',
+        1 => 'RAW',
+        2 => 'RAW + JPEG',
+    },
+);
+my %meteringMode2010 = (
+    Name => 'MeteringMode',
+    PrintConv => {
+        0 => 'Multi-segment',
+        2 => 'Center-weighted average',
+        3 => 'Spot',
+    },
+);
+my %exposureProgram2010 = (
+    Name => 'ExposureProgram',
+    SeparateTable => 'ExposureProgram3',
+    PrintConv => \%sonyExposureProgram3,
+);
+
+%Image::ExifTool::Sony::Tag2010a = ( #12
+    PROCESS_PROC => \&ProcessEnciphered,
+    WRITE_PROC => \&WriteEnciphered,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    FORMAT => 'int8u',
+    NOTES => 'Valid for NEX-5N.',
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0x1128 => { %releaseMode2010 },
+    0x112c => { %releaseMode2 },
+    0x113e => { %gain2010 },
+    0x1140 => { %brightnessValue2010 },
+    0x1144 => { %dynamicRangeOptimizer2010 },
+    0x1148 => { %hdr2010 },
+    0x114c => { %exposureComp2010 },
+    0x1163 => { %pictureEffect2010 },
+    0x1170 => { %quality2010 },
+    0x1174 => { %meteringMode2010 },
+    0x1175 => { %exposureProgram2010 },
+    0x117c => { Name => 'WB_RGBLevels', Format => 'int16u[3]' },
+    #0x1a08 => { Name => 'SonyImageWidth', Format => 'int16u' },
+    #0x1a0c => { Name => 'SonyImageHeight', Format => 'int16u' },
+);
+
+%Image::ExifTool::Sony::Tag2010b = ( #12
+    PROCESS_PROC => \&ProcessEnciphered,
+    WRITE_PROC => \&WriteEnciphered,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    FORMAT => 'int8u',
+    NOTES => 'Valid for SLT-A65/A77, NEX-7/VG20E.',
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0x0000 => { %sequenceImageNumber }, #PH
+    0x0004 => { %sequenceFileNumber }, #PH
+    0x0008 => { %releaseMode2, Format => 'int32u' },
+    #0x0044 => { Name => 'SonyImageWidth3', Format => 'int16u' },
+    #0x0048 => { Name => 'SonyImageHeight3', Format => 'int16u' },
+    #0x0054 => { Name => 'SonyImageWidth2', Format => 'int16u' },
+    #0x0058 => { Name => 'SonyImageHeight2', Format => 'int16u' },
+    #0x0064 => { Name => 'SonyImageWidth', Format => 'int16u' },
+    #0x0068 => { Name => 'SonyImageHeight', Format => 'int16u' },
+    #0x00a8 => { Name => 'SonyImageWidth2', Format => 'int16u' },
+    #0x00ac => { Name => 'SonyImageHeight2', Format => 'int16u' },
+    #0x00b8 => { Name => 'SonyImageWidth2', Format => 'int16u' },
+    #0x00bc => { Name => 'SonyImageHeight2', Format => 'int16u' },
+    #0x00c8 => { Name => 'SonyImageWidth', Format => 'int16u' },
+    #0x00cc => { Name => 'SonyImageHeight', Format => 'int16u' },
+    0x01b6 => { %sonyDateTime2010, Groups => { 2 => 'Time' } },
+    #0x0204 => { Name => 'SonyImageWidth', Format => 'int16u' },
+    #0x0206 => { Name => 'SonyImageHeight', Format => 'int16u' },
+    0x1128 => { %releaseMode2010 },
+    0x112c => { %releaseMode2 },
+    0x113e => { %gain2010 },
+    0x1140 => { %brightnessValue2010 },
+    0x1144 => { %dynamicRangeOptimizer2010 },
+    0x1148 => { %hdr2010 },
+    0x114c => { %exposureComp2010 },
+    0x1167 => { %pictureEffect2010 },
+    0x1174 => { %quality2010 },
+    0x1178 => { %meteringMode2010 },     #1154
+    0x1179 => { %exposureProgram2010 },
+    0x1180 => { Name => 'WB_RGBLevels', Format => 'int16u[3]' },
+    #0x1a08 => { Name => 'SonyImageWidth', Format => 'int16u' },
+    #0x1a0c => { Name => 'SonyImageHeight', Format => 'int16u' },
+);
+
+%Image::ExifTool::Sony::Tag2010c = ( #12
+    PROCESS_PROC => \&ProcessEnciphered,
+    WRITE_PROC => \&WriteEnciphered,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    FORMAT => 'int8u',
+    NOTES => 'Valid for SLT-A37/A57 and NEX-F3.',
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0x0000 => { %sequenceImageNumber }, #PH
+    0x0004 => { %sequenceFileNumber }, #PH
+    0x0008 => { %releaseMode2, Format => 'int32u' },
+    #0x0048 => { Name => 'SonyImageWidth3', Format => 'int16u' },
+    #0x004c => { Name => 'SonyImageHeight3', Format => 'int16u' },
+    #0x0058 => { Name => 'SonyImageWidth2', Format => 'int16u' },
+    #0x005c => { Name => 'SonyImageHeight2', Format => 'int16u' },
+    #0x0068 => { Name => 'SonyImageWidth', Format => 'int16u' },
+    #0x006c => { Name => 'SonyImageHeight', Format => 'int16u' },
+    #0x00c0 => { Name => 'SonyImageWidth2', Format => 'int16u' },
+    #0x00c4 => { Name => 'SonyImageHeight2', Format => 'int16u' },
+    #0x00d0 => { Name => 'SonyImageWidth2', Format => 'int16u' },
+    #0x00d4 => { Name => 'SonyImageHeight2', Format => 'int16u' },
+    #0x00e0 => { Name => 'SonyImageWidth', Format => 'int16u' },
+    #0x00e4 => { Name => 'SonyImageHeight', Format => 'int16u' },
+    #0x0134 => { Name => 'SonyImageHeight', Format => 'int16u' },
+    #0x0144 => { Name => 'SonyImageHeight', Format => 'int16u' },
+    #0x0154 => { Name => 'SonyImageHeight', Format => 'int16u' },
+    0x0200 => { Name => 'DigitalZoomRatio', ValueConv => '$val/16', ValueConvInv => '$val*16' },
+    0x0210 => { %sonyDateTime2010, Groups => { 2 => 'Time' } },
+    0x1104 => { %releaseMode2010 },
+    0x1108 => { %releaseMode2 },
+    0x111a => { %gain2010 },
+    0x111c => { %brightnessValue2010 },
+    0x1120 => { %dynamicRangeOptimizer2010 },
+    0x1124 => { %hdr2010 },
+    0x1128 => { %exposureComp2010 },
+    0x1143 => { %pictureEffect2010 },
+    0x1150 => { %quality2010 },
+    0x1154 => { %meteringMode2010 },
+    0x1155 => { %exposureProgram2010 },
+    0x115c => { Name => 'WB_RGBLevels', Format => 'int16u[3]' },
+    #0x1a08 => { Name => 'SonyImageWidth', Format => 'int16u' },
+    #0x1a0c => { Name => 'SonyImageHeight', Format => 'int16u' },
+);
+
+%Image::ExifTool::Sony::Tag2010d = ( #12
+    PROCESS_PROC => \&ProcessEnciphered,
+    WRITE_PROC => \&WriteEnciphered,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    FORMAT => 'int8u',
+    NOTES => q{
+        Valid for DSC-HX10V/HX20V/HX200V/TX66/TX200V/TX300V/WX50/WX100/WX150, but
+        not valid for panorama images.
+    },
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0x0000 => { %sequenceImageNumber }, #PH
+    0x0004 => { %sequenceFileNumber }, #PH
+    0x0008 => { %releaseMode2, Format => 'int32u' },
+    #0x0048 => { Name => 'SonyImageWidth3', Format => 'int16u' },
+    #0x004c => { Name => 'SonyImageHeight3', Format => 'int16u' },
+    #0x0058 => { Name => 'SonyImageWidth2', Format => 'int16u' },
+    #0x005c => { Name => 'SonyImageHeight2', Format => 'int16u' },
+    #0x0068 => { Name => 'SonyImageWidth', Format => 'int16u' },
+    #0x006c => { Name => 'SonyImageHeight', Format => 'int16u' },
+    #0x00c0 => { Name => 'SonyImageWidth2', Format => 'int16u' },
+    #0x00c4 => { Name => 'SonyImageHeight2', Format => 'int16u' },
+    #0x00d0 => { Name => 'SonyImageWidth2', Format => 'int16u' },
+    #0x00d4 => { Name => 'SonyImageHeight2', Format => 'int16u' },
+    #0x00e0 => { Name => 'SonyImageWidth', Format => 'int16u' },
+    #0x00e4 => { Name => 'SonyImageHeight', Format => 'int16u' },
+    0x01fe => { %sonyDateTime2010, Groups => { 2 => 'Time' } },
+    0x1180 => { %releaseMode2010 },
+    0x1184 => { %releaseMode2 },
+    0x1196 => { %gain2010 },
+    0x1198 => { %brightnessValue2010 },
+    0x119c => { %dynamicRangeOptimizer2010 },
+    0x11a0 => { %hdr2010 },
+    0x11bf => { %pictureEffect2010 },
+    0x11d0 => { %meteringMode2010 },
+    # 0x11d1 - not valid for HX20V panorama images - PH
+    0x11d1 => { %exposureProgram2010 },
+    0x11d8 => { Name => 'WB_RGBLevels', Format => 'int16u[3]' },
+);
+
+%Image::ExifTool::Sony::Tag2010e = ( #12
     PROCESS_PROC => \&ProcessEnciphered,
     WRITE_PROC => \&WriteEnciphered,
     CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
     FORMAT => 'int8u',
+    NOTES => q{
+        Valid for SLT-A58/A99, ILCE-3000, NEX-3N/5R/5T/6/VG30E/VG900, DSC-RX100,
+        DSC-RX1/RX1R. Also valid for DSC-HX300/HX50V/TX30/WX60/WX200/WX300, but not
+        for panorama images.
+    },
     WRITABLE => 1,
     FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0x0000 => { %sequenceImageNumber }, #PH
+    0x0004 => { %sequenceFileNumber }, #PH
+    0x0008 => { %releaseMode2, Format => 'int32u' },
+    #0x0048 => { Name => 'SonyImageWidth3', Format => 'int16u' },
+    #0x004c => { Name => 'SonyImageHeight3', Format => 'int16u' },
+    #0x0058 => { Name => 'SonyImageWidth2', Format => 'int16u' },
+    #0x005c => { Name => 'SonyImageHeight2', Format => 'int16u' },
+    #0x0068 => { Name => 'SonyImageWidth', Format => 'int16u' },
+    #0x006c => { Name => 'SonyImageHeight', Format => 'int16u' },
+    #0x00c0 => { Name => 'SonyImageWidth2', Format => 'int16u' },
+    #0x00c4 => { Name => 'SonyImageHeight2', Format => 'int16u' },
+    #0x00d0 => { Name => 'SonyImageWidth2', Format => 'int16u' },
+    #0x00d4 => { Name => 'SonyImageHeight2', Format => 'int16u' },
+    #0x00e0 => { Name => 'SonyImageWidth', Format => 'int16u' },
+    #0x00e4 => { Name => 'SonyImageHeight', Format => 'int16u' },
+    #0x01fa => { Name => 'SonyImageHeight', Format => 'int16u' },
+    #0x0200 => { Name => 'SonyImageWidth', Format => 'int16u' },
+    0x021c => { Name => 'DigitalZoomRatio', ValueConv => '$val/16', ValueConvInv => '$val*16' },
+    0x022c => { %sonyDateTime2010, Groups => { 2 => 'Time' } },
+    0x115c => { %releaseMode2010 },
+    0x1160 => { %releaseMode2 },
+    0x1172 => { %gain2010 },
+    0x1174 => { %brightnessValue2010 },
+    0x1178 => { %dynamicRangeOptimizer2010 },
+    0x117c => { %hdr2010 },
+    0x1180 => { %exposureComp2010 },
+    0x119b => { %pictureEffect2010 },
+    0x11a8 => { %quality2010 },
+    0x11ac => { %meteringMode2010 },
+    0x11ad => { %exposureProgram2010 },
+    0x11b4 => { Name => 'WB_RGBLevels', Format => 'int16u[3]' },
+    0x1278 => {
+        Condition => '$$self{Model} =~ /^(SLT-A58|NEX-3N|ILCE-3000)\b/',
+        Name => 'FocalLength',
+        Format => 'int16u',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+        PrintConvInv => '$val =~ / ?mm//; $val',
+    },
+    0x127a => {
+        Condition => '$$self{Model} =~ /^(SLT-A58|NEX-3N|ILCE-3000)\b/',
+        Name => 'MinFocalLength',
+        Format => 'int16u',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+        PrintConvInv => '$val =~ / ?mm//; $val',
+    },
+    0x127c => { # may give 0 for fixed focal length lenses
+        Condition => '$$self{Model} =~ /^(SLT-A58|NEX-3N|ILCE-3000)\b/',
+        Name => 'MaxFocalLength',
+        Format => 'int16u',
+        RawConv => '$val || undef',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+        PrintConvInv => '$val =~ / ?mm//; $val',
+    },
+    #0x1914 => { Name => 'SonyImageWidth', Format => 'int16u' },
+    #0x1918 => { Name => 'SonyImageHeight', Format => 'int16u' },
+    #0x192e => { Name => 'SonyImageWidth', Format => 'int16u' },
+    #0x1930 => { Name => 'SonyImageHeight', Format => 'int16u' },
+);
+
+%Image::ExifTool::Sony::Tag2010f = ( #12
+    PROCESS_PROC => \&ProcessEnciphered,
+    WRITE_PROC => \&WriteEnciphered,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    FORMAT => 'int8u',
+    NOTES => 'Valid for DSC-RX100M2, DSC-QX10/QX100.',
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0x0004 => { %releaseMode2, Format => 'int32u' }, # NOT at offset 0x08 !
+    #0x002e => { Name => 'SonyImageWidth3', Format => 'int16u' },
+    #0x0042 => { Name => 'SonyImageWidth3', Format => 'int16u' },
+    0x1014 => { %releaseMode2010 },
+    0x1018 => { %releaseMode2 },
+    0x102a => { %gain2010 },
+    0x102c => { %brightnessValue2010 },
+    0x1030 => { %dynamicRangeOptimizer2010 },
+    0x1034 => { %hdr2010 },
+    0x1038 => { %exposureComp2010 },
+    0x1053 => { %pictureEffect2010 },
+    0x1060 => { %quality2010 },
+    0x1064 => { %meteringMode2010 },
+    0x1065 => { %exposureProgram2010 },
+    0x106c => { Name => 'WB_RGBLevels', Format => 'int16u[3]' },
+    #0x1096 => { Name => 'SonyImageWidth3', Format => 'int16u' },
+    #0x10aa => { Name => 'SonyImageWidth3', Format => 'int16u' },
+    0x1134 => {
+        Name => 'FocalLength',
+        Format => 'int16u',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+        PrintConvInv => '$val =~ / ?mm//; $val',
+    },
+    0x1136 => {
+        Name => 'MinFocalLength',
+        Format => 'int16u',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+        PrintConvInv => '$val =~ / ?mm//; $val',
+    },
+    0x1138 => {
+        Name => 'MaxFocalLength',
+        Format => 'int16u',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+        PrintConvInv => '$val =~ / ?mm//; $val',
+    },
+    #0x1914 => { Name => 'SonyImageWidth', Format => 'int16u' },
+    #0x1918 => { Name => 'SonyImageHeight', Format => 'int16u' },
+    #0x192e => { Name => 'SonyImageWidth', Format => 'int16u' },
+    #0x1930 => { Name => 'SonyImageHeight', Format => 'int16u' },
+);
+
+%Image::ExifTool::Sony::Tag2010g = ( #12
+    PROCESS_PROC => \&ProcessEnciphered,
+    WRITE_PROC => \&WriteEnciphered,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    FORMAT => 'int8u',
+    NOTES => 'Valid for DSC-RX10/HX60V/HX400V, ILCE-7/7R/5000/6000.',
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0x0004 => { %releaseMode2, Format => 'int32u' }, # NOT at offset 0x08 !
+    0x020c => { %releaseMode2010 },
+    0x0210 => { %releaseMode2 },
+    0x0222 => { %gain2010 },
+    0x0224 => { %brightnessValue2010 },
+    0x0228 => { %dynamicRangeOptimizer2010 },
+    0x022c => { %hdr2010 },
+    0x0230 => { %exposureComp2010 },
+    0x024b => { %pictureEffect2010 },
+    0x0258 => { %quality2010 },
+    0x025c => { %meteringMode2010 },
+    0x025d => { %exposureProgram2010 },
+    0x0264 => { Name => 'WB_RGBLevels', Format => 'int16u[3]' },
+    0x032c => {
+        Name => 'FocalLength',
+        Format => 'int16u',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+        PrintConvInv => '$val =~ / ?mm//; $val',
+    },
+    0x032e => {
+        Name => 'MinFocalLength',
+        Format => 'int16u',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+        PrintConvInv => '$val =~ / ?mm//; $val',
+    },
+    0x0330 => { # may give 0 for fixed focal length lenses
+        Name => 'MaxFocalLength',
+        Format => 'int16u',
+        RawConv => '$val || undef',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+        PrintConvInv => '$val =~ / ?mm//; $val',
+    },
+);
+
+%Image::ExifTool::Sony::Tag900b = ( #12
+    PROCESS_PROC => \&ProcessEnciphered,
+    WRITE_PROC => \&WriteEnciphered,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    # 0x0000 - always 174 (e)
+    0x0002 => {
+        Name => 'FacesDetected',
+        PrintConv => {
+            0   => '0',
+            98  => '1',
+            57  => '2',
+            93  => '3',
+            77  => '4',
+            33  => '5',
+            168 => '6',
+            241 => '7',
+            115 => '8',
+        },
+    },
+    # 0x00bc - always 98 (221 (e))
+    0x00bd => {
+        Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/', # always 98 for A450/A500/A550: exclude
+        Name => 'FaceDetection',
+        PrintConv => {
+            0 => 'Off',
+            98 => 'On',
+        },
+    },
+);
+
+%Image::ExifTool::Sony::Tag9050 = ( #12
+    PROCESS_PROC => \&ProcessEnciphered,
+    WRITE_PROC => \&WriteEnciphered,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    FORMAT => 'int8u',
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    DATAMEMBER => [ 0x0105 ],
     GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
     NOTES => q{
         Data for tags 0x9050, 0x94xx and 0x2010 is encrypted by a simple
         substitution cipher, but the deciphered values are listed below.
     },
     0x0000 => {
-        Condition => '$$self{Model} !~ /^(NEX-|DSC-)\b/',
+        Condition => '$$self{Model} !~ /^(NEX-|ILCE-|DSC-)/',
         Name => 'MaxAperture',
         # seen values from 17 - 48
         ValueConv => '2 ** (($val/8 - 1.06) / 2)',
@@ -3677,7 +4868,7 @@ my %faceInfo = (
         PrintConvInv => '$val',
     },
     0x0001 => {
-        Condition => '$$self{Model} !~ /^(NEX-|DSC-)\b/',
+        Condition => '$$self{Model} !~ /^(NEX-|ILCE-|DSC-)/',
         Name => 'MinAperture',
         # seen values from 80 - 95
         ValueConv => '2 ** (($val/8 - 1.06) / 2)',
@@ -3685,68 +4876,171 @@ my %faceInfo = (
         PrintConv => 'sprintf("%.0f",$val)',
         PrintConvInv => '$val',
     },
-#    0x0002 and 0x0004 (int16u) for SLT:
-#           appears to be difference between used FNumber and MaxAperture, 256 being +1 APEX or stop
-#           however, not always valid e.g. bracketing, Shutter-prio e.a.
-#           difference between 0x0002 and 0x0004 mostly 0.0, 0.1 or 0.2 stops.
-    0x0031 => { #12  not DSC-RX
-        Condition => '$$self{Model} !~ /^(DSC-(RX1|RX100))\b/',
-        Name => 'FlashStatus',
+#    0x0002 and 0x0004 (int16u) for SLT:
+#           appears to be difference between used FNumber and MaxAperture, 256 being +1 APEX or stop
+#           however, not always valid e.g. bracketing, Shutter-prio e.a.
+#           difference between 0x0002 and 0x0004 mostly 0.0, 0.1 or 0.2 stops.
+    0x0031 => { #12  not DSC-RX
+        Condition => '$$self{Model} !~ /^DSC-/',
+        Name => 'FlashStatus',
+        PrintConv => {
+            0 => 'No Flash present',                   # seen for SLT-A99 and NEX-5N, 5R
+           # 2 => 'No Flash present but ????',          # seen for ILCE-7/7R
+            64 => 'Built-in Flash present',            # seen for SLT-A37, A57, A65, A77 and NEX-F3, 6, 7
+            65 => 'Built-in Flash present and fired',  # seen for SLT-A37, A57, A65, A77 and NEX-F3, 6, 7
+           # 66 => 'Built-in Flash present but ????',   # seen for A58 and ILCE HDR and panorama images
+            128 => 'External Flash present',           # seen for NEX-5N
+            129 => 'External Flash present and fired', # seen for NEX-5N, A99V
+        },
+    },
+    0x0032 => { #13
+        Name => 'ImageCount',
+        # this seems to be valid for the A37,A57,A65,A77,A99, and possibly the NEX-5N/7
+        # but I haven't seen a count over 65536, so the Format is not confirmed - PH
+        # - not valid for the DSC-RX100 or RX1, so exclude all DSC models
+        Condition => '$$self{Model} !~ /^DSC-/', #PH
+        Format => 'int32u',
+        Notes => 'total number of image exposures made by the camera',
+        RawConv => '$val & 0x00ffffff',
+    },
+    0x003a => { # appr. same value as Exif ExposureTime, but longer in HDR-modes
+        Name => 'SonyExposureTime',
+        Condition => '$$self{Model} !~ /^DSC-/',
+        Format => 'int16u',
+        ValueConv => '$val ? 2 ** (16 - $val/256) : 0',
+        ValueConvInv => '$val ? int((16 - log($val) / log(2)) * 256 + 0.5) : 0',
+        PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"',
+        PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x003c => {
+        Name => 'SonyFNumber',
+        Condition => '$$self{Model} !~ /^DSC-/',
+        Format => 'int16u',
+        ValueConv => '2 ** (($val/256 - 16) / 2)',
+        ValueConvInv => '(log($val)*2/log(2)+16)*256',
+        PrintConv => 'sprintf("%.1f",$val)',
+        PrintConvInv => '$val',
+    },
+    0x004c => { # only ILCE-7/7R/5000/6000
+        Name => 'ImageCount2',
+        Condition => '$$self{Model} =~ /^(ILCE-(7R?|[56]000))\b/',
+        Format => 'int32u',
+        RawConv => '$val & 0x00ffffff',
+    },
+    0x0051 => { # only ILCE-7/7R/5000/6000, but hours usually different from SonyDateTime - UTC?
+        Name => 'SonyDateTime2',
+        Condition => '$$self{Model} =~ /^(ILCE-(7R?|[56]000))\b/',
+        Groups => { 2 => 'Time' },
+        Shift => 'Time',
+        Format => 'undef[6]',
+        ValueConv => q{
+            my @v = unpack('C*', $val);
+            return sprintf("20%.2d:%.2d:%.2d %.2d:%.2d:%.2d", @v)
+        },
+        ValueConvInv => q{
+            my @v = ($val =~ /\d+/g);
+            return undef unless @v == 6 and $v[0]-=2000 >= 0;
+            return pack('C*', @v);
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+        PrintConvInv => '$self->InverseDateTime($val,0)',
+    },
+    # 0x0104 - same as 0x0105, but has value 3 for 50mm F1.4 ZA, DT 18-135mm and for 70-400mm G II: meaning ??
+    0x0105 => {
+        Name => 'LensMount',
+        DataMember => 'LensMount',
+        RawConv => '$$self{LensMount} = $val; $$self{Model} =~ /^DSC-/ ? undef : $val',
         PrintConv => {
-            0 => 'No Flash present',                   # seen for SLT-A99 and NEX-5N, 5R
-            64 => 'Built-in Flash present',            # seen for SLT-A37, A57, A65, A77 and NEX-F3, 6, 7
-            65 => 'Built-in Flash present and fired',  # seen for SLT-A37, A57, A65, A77 and NEX-F3, 6, 7
-            128 => 'External Flash present',           # seen for NEX-5N
-            129 => 'External Flash present and fired', # seen for NEX-5N, A99V
+            0 => 'Unknown',
+            1 => 'A-Mount',
+            2 => 'E-mount',
+        },
+    },
+    0x0106 => {
+        Name => 'LensFormat',
+        Condition => '$$self{Model} !~ /^DSC-/',
+        PrintConv => {
+            0 => 'Unknown',
+            1 => 'APS-C',
+            2 => 'Full-frame',
         },
     },
-    # 0x0032 - increments for each image (PH, A77)
+    0x0107 => {
+        Name => 'LensType2',
+        Condition => '$$self{LensMount} == 2',
+        Format => 'int16u',
+        SeparateTable => 1,
+        PrintConv => \%sonyLensTypes2,
+    },
+    # 0x0108 - 128 for Sony E-mount lenses, 0 for all other
+    0x0109 => {
+        Name => 'LensType',
+        Condition => '$$self{LensMount} == 1',
+        Priority => 0, #PH (just to be safe)
+        Format => 'int16u', #PH
+        Notes => 'SLT models, and NEX with A-Mount lenses',
+        SeparateTable => 1,
+        # has a value of 0 for E-Mount lenses (values 0x80xx)
+        ValueConvInv => '($val & 0xff00) == 0x8000 ? 0 : int($val)',
+        PrintConv => \%sonyLensTypes,
+    },
+
+#    0x0122 - int16u  LensType  Condition => '$$self{Model} =~ /^(SLT-A(37|57|65V|77V)|NEX-(F3|5N|7|VG20E))/',
+#    0x0123 - int16u  LensType  Condition => '$$self{Model} =~ /^(SLT-A(58|99V)|NEX-(3N|5R|6|VG900|VG30E))/',
+
+#    0x012d - int16u  LensType  Condition => '$$self{Model} =~ /^(SLT-A(37|57|65V|77V)|NEX-(F3|5N|7|VG20E))/',
+#    0x012e - int16u  LensType  Condition => '$$self{Model} =~ /^(SLT-A(58|99V)|NEX-(3N|5R|6|VG900|VG30E))/',
+
+#    ImageCount2 = (ImageCount - 1 or 2), but sometimes 0
+#    0x01aa - int32u  ImageCount2  Condition => '$$self{Model} =~ /^(SLT-A(58|99V)|NEX-(3N|5R|6|VG900|VG30E))/',
+#    0x01bd - int32u  ImageCount2  Condition => '$$self{Model} =~ /^(SLT-A(37|57|65V|77V)|NEX-(F3|5N|7|VG20E))/',
+
+#    0x0229 - int16u  LensType2  Condition => '$$self{Model} =~ /^NEX-(5R|5T|6)/',
+#    0x022b - int16u  LensType   Condition => '$$self{Model} =~ /^NEX-(5R|6)/',
+#    0x0245 - int16u  LensType   Condition => '$$self{Model} =~ /^NEX-(5R|6)/',
+#    0x0250 - int16u  LensType   Condition => '$$self{Model} =~ /^NEX-(5R|6)/',
+#
+#    0x022c - int16u  LensType2  Condition => '$$self{Model} =~ /^(SLT-A(58|99V)|NEX-(3N|VG900|VG30E)|ILCE-(3000|7|7R))/',
+#    0x022e - int16u  LensType   Condition => '$$self{Model} =~ /^(SLT-A(58|99V)|NEX-(3N|VG900|VG30E))/',
+#    0x0248 - int16u  LensType   Condition => '$$self{Model} =~ /^(SLT-A(58|99V)|NEX-(3N|VG900|VG30E))/',
+#    0x0253 - int16u  LensType   Condition => '$$self{Model} =~ /^(SLT-A(58|99V)|NEX-(3N|VG900|VG30E))/',
+#
+#    0x023c - int16u  LensType2  Condition => '$$self{Model} =~ /^(SLT-A(37|57|65V|77V)|NEX-(F3|5N|7|VG20E))/',
+#    0x023e - int16u  LensType   Condition => '$$self{Model} =~ /^(SLT-A(37|57|65V|77V)|NEX-(F3|5N|7|VG20E))/',
+#    0x0257 - int16u  LensType   Condition => '$$self{Model} =~ /^(SLT-A(37|57|65V|77V)|NEX-(F3|5N|7|VG20E))/',
+#    0x0262 - int16u  LensType   Condition => '$$self{Model} =~ /^(SLT-A(37|57|65V|77V)|NEX-(F3|5N|7|VG20E))/',
 );
 
-# (decoding based on limited number of SLT-A37/A57/A65/A77, NEX-F3/5R, and DSC-HX9V images)
-# Note: "(e)" in a comment indicates an enciphered value, all other values are deciphered
-# 0x0000-0x0007:    7 1 1 1 0 0 0 0 (e) for several DSC models, e.g. DSC-HX9V
-#                   9 1 1 1 0 0 0 0 (e) for several DSC models
-#                  10 1 1 1 0 0 0 0 (e) for most SLT, NEX, DSC-RX100, DSC-RX1
-#                  12 1 1 1 0 0 0 0 (e) for NEX-3N, SLT-A58, DSC-WX60, DSC-WX300
-#                 208 1 1 0 0 0 0 0 (e) H90, W650: tag9400 decoding appears not valid
-%Image::ExifTool::Sony::Tag9400a = (
+%Image::ExifTool::Sony::Tag9400a = ( #12
     PROCESS_PROC => \&ProcessEnciphered,
     WRITE_PROC => \&WriteEnciphered,
     CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
     FORMAT => 'int8u',
+    NOTES => 'Valid for many DSC, NEX and SLT models',
     WRITABLE => 1,
     FIRST_ENTRY => 0,
     GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
-    0x0008 => { #PH
-        Name => 'SequenceImageNumber',
-        Notes => 'number of images captured in burst sequence',
-        # (not shutter count because it increments for auto portrait framing)
-        Format => 'int32u',
-        ValueConv => '$val + 1',
-        ValueConvInv => '$val - 1',
-    },
-    0x000c => { #PH
-        Name => 'SequenceFileNumber',
-        Notes => 'file number in burst sequence',
-        Format => 'int32u',
-        ValueConv => '$val + 1', #12
-        ValueConvInv => '$val - 1',
-    },
-    0x0010 => {
-        Name => 'ReleaseMode2',
-        PrintConv => \%sonyReleaseMode2,
+    0x0008 => { %sequenceImageNumber }, #PH
+    0x000c => { %sequenceFileNumber }, #PH
+    0x0010 => { %releaseMode2 },
+    0x0012 => {
+        Name => 'DigitalZoom',
+        Condition => '$$self{Model} !~ /^(SLT-(A65|A77)V?|NEX-(5N|7|VG20E)|DSC-(HX10V|HX20V|HX200V|TX20|TX55|TX300V|WX30|WX70))\b/',
+        PrintConv => {
+            0 => 'No',
+            1 => 'Yes',
+        },
     },
-#    0x0012 - Digital Zoom used 0=no, 1=yes (but not for A65V, A77V)
 #    0x0013 - Flash fired 0=no, 1=yes
+#    0x0014 - related to flash / RedEyeReduction ?
+#    0x0015 - CameraType: 1=HDR, 2=DSC, 3=SLT/NEX
     0x001a => { #PH
         Name => 'ShotNumberSincePowerUp',
         Format => 'int32u',
     },
-#    0x001e - increments by 4 each shutter release press since power up?,
-#             bit 0x02 has some meaning (RX100 - PH)
+#    0x001e - increments by 4 or 6 or 8 each shutter release press since power up
 #    0x001f - 0=most pictures, 1='Self-timer/Self-portrait', 2='Self-portrait (2 people)',
-#             3='Continuous Self-timer', 26='Sweep Panorama' (PH; RX100)
+#             3='Continuous Self-timer', 26='Sweep Panorama' (PH, RX100)
 #    0x0021 - maybe related to Image Stabilization or Smile Shutter ?
     0x0022 => {
         Name => 'SequenceLength',
@@ -3756,14 +5050,14 @@ my %faceInfo = (
             2 => '2 shots', # (Background defocus, 3D Image)
             3 => '3 shots', # (HDR, WB Bracketing) (RX100, also continuous bracket)
             4 => '4 shots', # seen for DSC-WX300 in Superior-Auto Anti-Motion-Blur
-            5 => '5 shots', # (PH; RX100)
+            5 => '5 shots', # (PH, RX100)
             6 => '6 shots', # (Multi Frame NR, Anti Motion blur, Hand-held Twilight)
             10 => '10 shots', # (HX9V Burst)
             100 => 'Continuous - iSweep Panorama', # (HX9V)
             200 => 'Continuous - Sweep Panorama',
         },
     },
-#    0x0027 - 1=single exposure, 2=multi-exposure (ie. pano,some superior auto) (PH; RX100)
+#    0x0027 - 1=single exposure, 2=multi-exposure (ie. pano,some superior auto) (PH, RX100)
     0x0028 => {
         Name => 'CameraOrientation', # (also RX100 - PH)
         PrintConv => {
@@ -3783,39 +5077,49 @@ my %faceInfo = (
         },
     },
 #    0x002b - FacesDetected_OK  0=no, 1=yes  appears valid for SLT, but not for NEX and DSC-HX9V
-#    0x0030 - long exposure noise reduction used 0=no, 1=yes (PH; RX100)
-#    0x0031 - smile shutter used 0=no, 1=yes (PH; RX100)
+#    0x0030 - long exposure noise reduction used 0=no, 1=yes (PH, RX100)
+#    0x0031 - smile shutter used 0=no, 1=yes (PH, RX100)
 #    0x0033 - 0 for DSC-HX9V, 8 for SLT, NEX
 #    0x0034 and 0x0038 - different offset for HX9V and SLT/NEX, but similar numbers, non-zero when flash fired
+    0x0044 => {
+        Condition => '$$self{Model} =~ /^(SLT-|NEX-|DSC-RX)/', # not valid for most other DSC and HDR models
+        Name => 'SonyImageHeight',
+        Format => 'int16u',
+        PrintConv => '$val > 0 ? 8*$val : "n.a."',
+    },
+    0x0052 => {
+        Name => 'ModelReleaseYear',
+        Condition => '$$self{Model} =~ /^(SLT-|NEX-|DSC-RX)/', # not valid for most other DSC and HDR models
+        Format => 'int8u',
+        PrintConv => 'sprintf("20%.2d", $val)',
+    },
 );
 
-%Image::ExifTool::Sony::Tag9400b = (
+%Image::ExifTool::Sony::Tag9400b = ( #12
     PROCESS_PROC => \&ProcessEnciphered,
     WRITE_PROC => \&WriteEnciphered,
     CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
     FORMAT => 'int8u',
+    NOTES => q{
+        Valid for NEX-3N, ILCE-3000, SLT-A58, DSC-WX60, DSC-WX300, DSC-RX100M2,
+        DSC-HX50V, DSC-QX10/QX100.
+    },
     WRITABLE => 1,
     FIRST_ENTRY => 0,
     GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
-    0x0008 => { #PH
-        Name => 'SequenceImageNumber',
-        Notes => 'number of images captured in burst sequence',
-        # (not shutter count because it increments for auto portrait framing)
-        Format => 'int32u',
-        ValueConv => '$val + 1',
-        ValueConvInv => '$val - 1',
-    },
-    0x000c => { #PH
-        Name => 'SequenceFileNumber',
-        Notes => 'file number in burst sequence',
-        Format => 'int32u',
-        ValueConv => '$val + 1', #12
-        ValueConvInv => '$val - 1',
-    },
-    0x0010 => {
-        Name => 'ReleaseMode2',
-        PrintConv => \%sonyReleaseMode2,
+    0x0008 => { %sequenceImageNumber }, #PH
+    0x000c => { %sequenceFileNumber }, #PH
+    0x0010 => { %releaseMode2 },
+    0x0012 => {
+        Name => 'DigitalZoom',
+        PrintConv => {
+            0 => 'No',
+            1 => 'Yes',
+        },
     },
+#    0x0013 - Flash fired 0=no, 1=yes
+#    0x0014 - related to flash / RedEyeReduction ?
+#    0x0015 - CameraType: 1=HDR, 2=DSC, 3=SLT/NEX
     0x0016 => { #PH
         Name => 'ShotNumberSincePowerUp',
         Format => 'int32u',
@@ -3853,8 +5157,84 @@ my %faceInfo = (
             3 => 'JPEG + MPO', # 3D images
         },
     },
+#    0x0027 - FacesDetected_OK  0=no, 1=yes
+#    0x002c - long exposure noise reduction used 0=no, 1=yes (PH, RX100)
+    0x003f => {
+        Name => 'SonyImageHeight',
+        Format => 'int16u',
+        PrintConv => '$val > 0 ? 8*$val : "n.a."',
+    },
+    0x0046 => { # but Panorama images give incorrect result
+        Name => 'ModelReleaseYear',
+        Format => 'int8u',
+        PrintConv => 'sprintf("20%.2d", $val)',
+    },
 );
 
+%Image::ExifTool::Sony::Tag9400c = ( #12
+    PROCESS_PROC => \&ProcessEnciphered,
+    WRITE_PROC => \&WriteEnciphered,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    FORMAT => 'int8u',
+    WRITABLE => 1,
+    NOTES => 'Valid for DSC-RX10/HX60V/HX400V, ILCE-7/7R/5000/6000.',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0x0009 => { %releaseMode2 },
+    0x000a => {
+        Name => 'ShotNumberSincePowerUp',
+        Format => 'int32u',
+    },
+    0x0012 => { %sequenceImageNumber },
+    0x0016 => {
+        Name => 'SequenceLength',
+        PrintConv => {
+            0 => 'Continuous',
+            1 => '1 shot',
+            2 => '2 shots',
+            3 => '3 shots',
+            4 => '4 shots',
+            5 => '5 shots',
+            6 => '6 shots',
+            10 => '10 shots',
+            100 => 'Continuous - iSweep Panorama',
+            200 => 'Continuous - Sweep Panorama',
+        },
+    },
+    0x001a => { %sequenceFileNumber },
+    0x001e => {
+        Name => 'SequenceLength',
+        PrintConv => {
+            0 => 'Continuous',
+            1 => '1 file',
+            2 => '2 files',
+            3 => '3 files',
+        },
+    },
+    0x0029 => {
+        Name => 'CameraOrientation',
+        PrintConv => {
+            1 => 'Horizontal (normal)',
+            3 => 'Rotate 180',
+            6 => 'Rotate 90 CW',
+            8 => 'Rotate 270 CW',
+        },
+    },
+    0x002a => {
+        Name => 'Quality2',
+        PrintConv => {
+            0 => 'JPEG',
+            1 => 'RAW',
+            2 => 'RAW + JPEG',
+            3 => 'JPEG + MPO', # 3D images
+        },
+    },
+    0x0047 => {
+        Name => 'SonyImageHeight',
+        Format => 'int16u',
+        PrintConv => '$val > 0 ? 8*$val : "n.a."',
+    },
+);
 
 # PH (RX100)
 %Image::ExifTool::Sony::Tag9402 = (
@@ -3866,6 +5246,7 @@ my %faceInfo = (
     FIRST_ENTRY => 0,
     GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
     DATAMEMBER => [ 0x02 ],
+    PRIORITY => 0,
     0x02 => {
         Name => 'TempTest1',
         DataMember => 'TempTest1',
@@ -3880,18 +5261,69 @@ my %faceInfo = (
         PrintConv => '"$val C"',
         PrintConvInv => '$val=~s/ ?C//; $val',
     },
+    0x16 => { #12
+        Name => 'FocusMode',
+        Mask => 0x7f, # (often +128, not sure what upper bit is for)
+        PrintConv => {
+            0 => 'Manual',
+            2 => 'AF-S',
+            3 => 'AF-C',
+            4 => 'AF-A', # seen in ILCE-6000 images
+            6 => 'DMF',
+            # 7 => 'AF-D', # not for DSC, NEX, ILCE ...
+        },
+    },
     0x17 => {
         Name => 'AFAreaMode',
         PrintConv => {
             0 => 'Multi',
             1 => 'Center',
+            2 => 'Spot', # (NC) seen for DSC-WX300
             3 => 'Flexible Spot',
-            # 10 - seen for WX100
+            10 => 'Selective (for Miniature effect)', # seen for DSC-HX30V,TX30,WX60,WX100
+            11 => 'Zone', #12 (NC) seen in ILCE-7R images
             14 => 'Tracking',
             15 => 'Face Tracking',
             255 => 'Manual',
         },
     },
+    # 0x24, 0x26: factor 10 for NEX and ILCE, factor 100 for DSC
+    # 0x24, 0x26, 0x28, 0x2a: inconsistent for A-mount lenses on NEX/ILCE: some correct, some 0, some incorrect ...
+    # 0x28 - not valid for DSC-[HTW]X models, or DSC-RX100
+#    0x24 => { # same values as Exif FocalLength
+#        Name => 'FocalLength',
+#        Format => 'int16u',
+#        RawConv => '$val || undef',
+#        ValueConv => '$val / ($$self{Model}=~/DSC/ ? 100 : 10)',
+#        ValueConvInv => '$val * ($$self{Model}=~/DSC/ ? 100 : 10)',
+#        PrintConv => 'sprintf("%.1f mm",$val)',
+#        PrintConvInv => '$val =~ s/ ?mm//; $val',
+#    },
+#    0x26 => { # usually identical to 0x24 or 0
+#        Name => 'FocalLength',
+#        Format => 'int16u',
+#        ValueConv => '$val / ($$self{Model}=~/DSC/ ? 100 : 10)',
+#        ValueConvInv => '$val * ($$self{Model}=~/DSC/ ? 100 : 10)',
+#        PrintConv => 'sprintf("%.1f mm",$val)',
+#        PrintConvInv => '$val =~ s/ ?mm//; $val',
+#    },
+#    0x28 => { # values slightly different from Exif FocalLength
+#        Name => 'FocalLength2',
+#        Format => 'int16u',
+#        RawConv => '$val || undef',
+#        ValueConv => '$val / 10',
+#        ValueConvInv => '$val * 10',
+#        PrintConv => 'sprintf("%.1f mm",$val)',
+#        PrintConvInv => '$val =~ s/ ?mm//; $val',
+#    },
+#    0x2a => { # usually identical to 0x2a or 0
+#        Name => 'FocalLength2',
+#        Format => 'int16u',
+#        ValueConv => '$val / 10',
+#        ValueConvInv => '$val * 10',
+#        PrintConv => 'sprintf("%.1f mm",$val)',
+#        PrintConvInv => '$val =~ s/ ?mm//; $val',
+#    },
     # 0x8a - int32u: some sort of accumulated time or something since power up
     #        (doesn't increment during continuous shooting and at some other times)
 );
@@ -3908,7 +5340,7 @@ my %faceInfo = (
     DATAMEMBER => [ 0x04 ],
     0x04 => {
         # seen values 0,2,3,18,32,49,50,83,148
-        # CameraTemperature is value for all values except 0,148
+        # CameraTemperature is valid for all values except 0,148
         Name => 'TempTest2',
         DataMember => 'TempTest2',
         Hidden => 1,
@@ -3917,7 +5349,7 @@ my %faceInfo = (
     0x05 => {
         Name => 'CameraTemperature', # (maybe SensorTemperature? - heats up when taking movies)
         Condition => '$$self{TempTest2} and $$self{TempTest2} < 100',
-        Format => 'int8s', # signed int untested -- need colder temperatures
+        Format => 'int8s', # have seen as low as -1 for AmbientTemperature of -18
         PrintConv => '"$val C"',
         PrintConvInv => '$val=~s/ ?C//; $val',
     },
@@ -3925,6 +5357,161 @@ my %faceInfo = (
     # 0x18 - maybe another temperature?
 );
 
+# Tag9405 (ref 12)
+%Image::ExifTool::Sony::Tag9405a = (
+    PROCESS_PROC => \&ProcessEnciphered,
+    WRITE_PROC => \&WriteEnciphered,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    FORMAT => 'int8u',
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    DATAMEMBER => [ 0x0604 ],
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    NOTES => 'Valid for SLT, NEX, ILCE-3000 and several DSC models.',
+    # 0x0602 - same as 0x0604, but has value 3 for 50mm F1.4 ZA, DT 18-135mm and for 70-400mm G II: meaning ??
+    0x0603 => {
+        Name => 'LensFormat',
+        Condition => '$$self{Model} !~ /^DSC-/',
+        PrintConv => {
+            0 => 'Unknown',
+            1 => 'APS-C',
+            2 => 'Full-frame',
+        },
+    },
+    0x0604 => {
+        Name => 'LensMount',
+        DataMember => 'LensMount',
+        RawConv => '$$self{LensMount} = $val; $$self{Model} =~ /^DSC-/ ? undef : $val',
+        PrintConv => {
+            0 => 'Unknown',
+            1 => 'A-Mount',
+            2 => 'E-mount',
+            # 6 - seen for A58 panorama image
+        },
+    },
+    0x0605 => {
+        Name => 'LensType2',
+        Condition => '$$self{LensMount} == 2',
+        Format => 'int16u',
+        Notes => 'E-Mount lenses',
+        SeparateTable => 1,
+        PrintConv => \%sonyLensTypes2,
+    },
+    0x0608 => {
+        Name => 'LensType',
+        Condition => '$$self{LensMount} == 1',
+        Format => 'int16u',
+        Notes => 'A-Mount lenses on SLT and NEX',
+        SeparateTable => 1,
+        PrintConv => \%sonyLensTypes,
+    },
+);
+
+# Tag9405b (ref 12)
+%Image::ExifTool::Sony::Tag9405b = (
+    PROCESS_PROC => \&ProcessEnciphered,
+    WRITE_PROC => \&WriteEnciphered,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    FORMAT => 'int8u',
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    DATAMEMBER => [ 0x005e ],
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    NOTES => 'Valid for the DSC-RX10/HX60V/HX400V and ILCE-7/7R/5000/6000.',
+    0x000e => { # appr. same value as Exif ExposureTime, but shorter in HDR-modes
+        Name => 'SonyExposureTime2',
+        Format => 'int16u',
+        ValueConv => '$val ? 2 ** (16 - $val/256) : 0',
+        ValueConvInv => '$val ? int((16 - log($val) / log(2)) * 256 + 0.5) : 0',
+        PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"',
+        PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x0010 => {
+        Name => 'ExposureTime',
+        Format => 'rational32u',
+        PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"', # (Bulb NC)
+        PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x0014 => { # but some odd results for DSC-RX10... ND filter??
+        Name => 'SonyFNumber',
+        Format => 'int16u',
+        ValueConv => '2 ** (($val/256 - 16) / 2)',
+        ValueConvInv => '(log($val)*2/log(2)+16)*256',
+        PrintConv => 'sprintf("%.1f",$val)',
+        PrintConvInv => '$val',
+    },
+    0x0016 => {
+        Name => 'SonyMaxApertureValue',
+        Format => 'int16u',
+        ValueConv => '2 ** (($val/256 - 16) / 2)',
+        ValueConvInv => '(log($val)*2/log(2)+16)*256',
+        PrintConv => 'sprintf("%.1f",$val)',
+        PrintConvInv => '$val',
+    },
+    0x0024 => { %sequenceImageNumber },
+    0x0034 => { %releaseMode2 },
+    0x0044 => {
+        Name => 'LongExposureNoiseReduction',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On',  # (unused or dark subject)
+        },
+    },
+    0x0046 => { %pictureEffect2010 },
+    0x0048 => { %exposureProgram2010 },
+    0x004a => {
+        Name => 'CreativeStyle',
+        PrintConv => {
+            0 => 'Standard',
+            1 => 'Vivid',
+            2 => 'Neutral',
+            3 => 'Portrait',
+            4 => 'Landscape',
+            5 => 'B&W',
+            9 => 'Sunset',
+            11 => 'Autumn Leaves',
+            13 => 'Sepia',
+        },
+    },
+    0x005d => {
+        Name => 'LensFormat',
+        Condition => '$$self{Model} !~ /^DSC-/',
+        PrintConv => {
+            0 => 'Unknown',
+            1 => 'APS-C',
+            2 => 'Full-frame',
+        },
+    },
+    0x005e => {
+        Name => 'LensMount',
+        DataMember => 'LensMount',
+        RawConv => '$$self{LensMount} = $val; $$self{Model} =~ /^DSC-/ ? undef : $val',
+        PrintConv => {
+            0 => 'Unknown',
+            1 => 'A-Mount',
+            2 => 'E-mount',
+        },
+    },
+    0x0060 => {
+        Name => 'LensType2',
+        Condition => '$$self{LensMount} == 2',
+        Format => 'int16u',
+        Notes => 'E-Mount lenses',
+        SeparateTable => 1,
+        PrintConv => \%sonyLensTypes2,
+    },
+    0x0062 => {
+        Name => 'LensType',
+        Condition => '$$self{LensMount} == 1',
+        Format => 'int16u',
+        Notes => 'A-Mount lenses on SLT and NEX',
+        SeparateTable => 1,
+        PrintConv => \%sonyLensTypes,
+    },
+);
+
 # Tag9406 (ref 12)
 %Image::ExifTool::Sony::Tag9406 = (
     PROCESS_PROC => \&ProcessEnciphered,
@@ -3935,15 +5522,38 @@ my %faceInfo = (
     FIRST_ENTRY => 0,
     GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
 #    0x0000: 1 for A37, A57, A65, A77, NEX-5N, 7, F3, VG20
-#            2 for A99, NEX-5R, NEX-6
+#            2 for A58/99V, NEX-3N/5R/5T/6/VG30/VG900, ILCE-3000/7/7R/5000/6000
 #    0x0001+0x0002: Int16u, seen 580 - 770: similar to "BatteryUnknown" ??
-#    0x0005+0x0006: Int16u, seen  73 - 117: maybe Fahrenheit ? (but considerably higher than "AmbientTemperature")
-#    0x0007: seen values from 8 - 105, decreasing in sequences of images: BatteryLevel
+#    0x0005: int8u, seen 73 - 117: maybe Fahrenheit? Higher than "AmbientTemperature", but same trend.
+    0x0005 => {
+        Name => 'BatteryTemperature',
+        ValueConv => '($val - 32) / 1.8', # convert to Celsius
+        ValueConvInv => '$val * 1.8 + 32',
+        PrintConv => 'sprintf("%.1f C",$val)',
+        PrintConvInv => '$val=~s/\s*C//; $val',
+    },
+    # 0x0006: usually 0, seen non-zero values only for A99V and ILCE-7/7R: BatteryLevel Grip ?
+    0x0006 => {
+        Name => 'BatteryLevelGrip1',
+        Condition => '$$valPt !~ /^\x00/', # only valid when not 0
+        PrintConv => '"$val%"',
+        PrintConvInv => '$val=~s/\s*\%//; $val',
+    },
+    # 0x0007: seen values from 8 - 105, decreasing in sequences of images: BatteryLevel
     0x0007 => {
         Name => 'BatteryLevel',
         PrintConv => '"$val%"',
         PrintConvInv => '$val=~s/\s*\%//; $val',
     },
+    # 0x0008: usually 255 or 0 (ILCE-7/7R), seen other values only for A99V and ILCE-7/7R when 0x0006 not 0.
+    #         A99V with grip can have 3 batteries: => Grip 2;
+    #         but ILCE-7/7R with grip can have max 2, and as all ILCE-7/7R samples give >100 values, exclude...
+    0x0008 => {
+        Name => 'BatteryLevelGrip2',
+        Condition => '$$valPt !~ /^[\x00\xff]/ and $$self{Model} !~ /^(ILCE-(7|7R))$/', # only when not 0 or 255 and not for ILCE-7/7R
+        PrintConv => '"$val%"',
+        PrintConvInv => '$val=~s/\s*\%//; $val',
+    },
 #    0x0009-0x001a: looks like 9 Int16u values
 #    0x0022: 0 or 1 for A99, NEX-5R, 6
 #    0x0025: 0 or 1 for other SLT and NEX (0x0022, 0x0023, 0x0024 = 255)
@@ -4001,8 +5611,48 @@ my %faceInfo = (
         },
     },
     # 0x0a - int16u: 0,1,2,3
+    # 0xa6 - 8 bytes face detection info ?; starts with 1, otherwise all 0
+);
+
+# Tag940c (ref 12)
+%Image::ExifTool::Sony::Tag940c = (
+    PROCESS_PROC => \&ProcessEnciphered,
+    WRITE_PROC => \&WriteEnciphered,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    FORMAT => 'int8u',
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    DATAMEMBER => [ 0x0008 ],
+
+    # 0x0008 - LensMount, but different values from Tag9405-0x0105 and Tag9050-0x0604.
+    # don't know what difference is between values '1' and '5' ...
+    0x0008 => {
+        Name => 'LensMount',
+        RawConv => '$$self{LensMount} = $val',
+        PrintConv => {
+            0 => 'Unknown',
+            1 => 'A-Mount (1)',
+            4 => 'E-mount',
+            5 => 'A-Mount (5)',
+        },
+    },
+    # 0x0009 - LensType2:
+    # This LensType2 tag gives values '1' and '2' for LA-EA1 and LA-EA2 respectively.
+    # Presumably similar to CameraSettings3-0x03f7, where value '1' for A-Mount lenses was observed.
+    # Tag9405-0x0605 and Tag9050-0x0107 always give value '0' for A-Mount lenses.
+    # When LA-EA2 is used, Tag940e AFInfo gives sequential info blocks NEX (Phase-detect AF).
+    # Also seen values '3' and '6' for A-lens on ILCE-7/7R, probably relating to LA-EA3 and LA-EA4 (NC).
+    0x0009 => { #12
+        Name => 'LensType2',
+        Condition => '$$self{LensMount} != 0',
+        Format => 'int16u',
+        SeparateTable => 1,
+        PrintConv => \%sonyLensTypes2,
+    },
 );
 
+
 # AFInfo (SLT models only) (ref PH, decoded mainly from A77)
 %Image::ExifTool::Sony::AFInfo = (
     PROCESS_PROC => \&ProcessEnciphered,
@@ -4022,15 +5672,20 @@ my %faceInfo = (
     #   0 1 1 0  for A37, A57, A58
     #   0 1 2 0  for A99V
     #   0 0 0 0  for NEX
-    #   0 2 0 0  for a NEX-6 image with A-mount lens via Phase-AF E-A adapter
+    #   2 0 0 0  for NEX
+    #   0 2 0 0  for NEX with A-mount lens via LA-EA2 Phase-AF adapter
+    #   2 2 0 0  for NEX with A-mount lens via LA-EA2 Phase-AF adapter
     0x02 => {
         Name => 'AFType',
         RawConv => '$$self{AFType} = $val',
         PrintConv => {
+            # 0 => '?? n.a.', # seen on some A99V images with non-AF (Samyang) lens
             1 => '15-point',
             2 => '19-point',
         },
     },
+    # 0x0004 start 74 Blocks of 164 bytes each for NEX with LA-EA2 15-point Phase-detect AF adapter and A-Mount lens (ref 12).
+    # For the NEX probably only the 11th byte might be the AFPoint.
     0x07 => [ # the active AF sensor
         {
             Name => 'AFPoint',
@@ -4111,7 +5766,6 @@ my %faceInfo = (
             7 => 'AF-D', # (unique to A99)
         },
     },
-    # 0x014c start 56 Blocks of 164 bytes each for NEX with A-mount lens and Phase-AF adapter (ref 12)
     0x017d => { #PH (verified for the A77/A99; likely valid for other SLT models - ref 12)
         # (different from AFMicroAdjValue because it is 0 when the adjustment is off)
         Name => 'AFMicroAdj',
@@ -4120,26 +5774,15 @@ my %faceInfo = (
     0x017e => { #12
         Name => 'ExposureProgram',
         Priority => 0,
-        PrintConv => {
-            0 => 'Program AE',
-            1 => 'Aperture-priority AE',
-            2 => 'Shutter speed priority AE',
-            3 => 'Manual',
-            4 => 'Auto',                 # seen for NEX-VG900
-            5 => 'iAuto',
-            6 => 'Superior Auto',        # seen for DSC-WX60,WX300
-            7 => 'iAuto+',
-            8 => 'Portrait',
-            9 => 'Landscape',            # seen for DSC-WX300
-            12 => 'Sunset',
-            17 => 'Handheld Night Shot', # seen for DSC-WX60
-            29 => 'Macro',
-            33 => 'Sweep Panorama',
-            36 => 'Background Defocus',  # seen for DSC-WX60
-            43 => 'Cont. Priority AE',
-        },
+        SeparateTable => 'ExposureProgram3',
+        PrintConv => \%sonyExposureProgram3,
     },
     # 0x01b8 start 65 Blocks of 180 bytes each for SLT (ref 12)
+    # In each block, the 9th, 10th and 11th byte appear to relate to AFPoint as at offsets 0x07, 0x08, 0x09 above..
+    # Possibly, these blocks relate to sequential focusing attempts and/or object tracking,
+    # the first byte being an Index or Counter.
+    # The last block before the block with index 0, appears to relate to the AF data at ShutterRelease.
+
     # 0xf38,0x1208,0x14d8,0x158c,0x1640,(and more) - 0 if AFMicroAdj is On, 1 if Off
     # 0x1ab6 - 0x80 if AFMicroAdj is On, 0 if Off
     # tags also related to AFPoint (PH, A77):
@@ -4251,18 +5894,18 @@ my %faceInfo = (
     GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
     FORMAT => 'int32u',
     NOTES => q{
-        Tags found only in panorama images from Sony cameras such as the HX1, HX5
-        and TX7.  The width/height values of these tags are not affected by camera
+        Tags found in panorama images from various Sony DSC, NEX, SLT and DSLR
+        cameras.  The width/height values of these tags are not affected by camera
         rotation -- the width is always the longer dimension.
     },
-    # 0: 257
+    # 0: 257 for panorama images, 0 for all other images (ref 12)
     1 => 'PanoramaFullWidth', # (including black/grey borders)
     2 => 'PanoramaFullHeight',
     3 => {
         Name => 'PanoramaDirection',
         PrintConv => {
-            0 => 'Right to Left',
-            1 => 'Left to Right',
+            0 => 'Left or Up',
+            1 => 'Right or Down',
         },
     },
     # crop area to remove black/grey borders from full image
@@ -4297,12 +5940,12 @@ my %faceInfo = (
     0 => {
         Name => 'SRF2Key',
         Notes => 'key to decrypt maker notes from the start of SRF2',
-        RawConv => '$self->{SRF2Key} = $val',
+        RawConv => '$$self{SRF2Key} = $val',
     },
     1 => {
         Name => 'DataKey',
         Notes => 'key to decrypt the rest of the file from the end of the maker notes',
-        RawConv => '$self->{SRFDataKey} = $val',
+        RawConv => '$$self{SRFDataKey} = $val',
     },
     # SRF0 contains a single unknown tag with TagID 0x0003
 );
@@ -4395,6 +6038,10 @@ my %faceInfo = (
     SET_GROUP1 => 1, # set group1 name to directory name for all tags in table
     NOTES => 'Tags in the encrypted SR2SubIFD',
     0x7303 => 'WB_GRBGLevels', #1
+    0x7310 => 'BlackLevel', #14 (divide by 4)
+    0x7313 => 'WB_RGGBLevels', #6
+    0x74a0 => 'MaxApertureAtMaxFocal', #PH
+    0x74a1 => 'MaxApertureAtMinFocal', #PH
     0x74c0 => { #PH
         Name => 'SR2DataIFD',
         Groups => { 1 => 'SR2DataIFD' }, # (needed to set SubIFD DirName)
@@ -4405,15 +6052,22 @@ my %faceInfo = (
             MaxSubdirs => 20, # an A700 ARW has 14 of these! - PH
         },
     },
-    0x7313 => 'WB_RGGBLevels', #6
-    0x74a0 => 'MaxApertureAtMaxFocal', #PH
-    0x74a1 => 'MaxApertureAtMinFocal', #PH
-    0x7820 => 'WB_RGBLevelsDaylight', #6
-    0x7821 => 'WB_RGBLevelsCloudy', #6
+    0x7800 => 'ColorMatrix', #14 (divide by 1024)
+    0x7820 => 'WB_RGBLevelsDaylight', #6 (or 5300K, ref 14)
+    0x7821 => 'WB_RGBLevelsCloudy', #6 (or 6100K, ref 14)
     0x7822 => 'WB_RGBLevelsTungsten', #6
-    0x7825 => 'WB_RGBLevelsShade', #6
-    0x7826 => 'WB_RGBLevelsFluorescent', #6
-    0x7828 => 'WB_RGBLevelsFlash', #6
+    0x7823 => 'WB_RGBLevelsFlash', #14
+    0x7824 => 'WB_RGBLevels4500K', #14
+    0x7825 => 'WB_RGBLevelsShade', #6 (or 7500K, ref 14)
+    0x7826 => 'WB_RGBLevelsFluorescent', #6 (~4000K)
+    0x7827 => 'WB_RGBLevelsFluorescentP1', #14 (~5000K)
+    0x7828 => 'WB_RGBLevelsFluorescentP2', #14 (~6500K) (was Flash, ref 6)
+    0x7829 => 'WB_RGBLevelsFluorescentM1', #14 (~3500K)
+    0x782a => 'WB_RGBLevels8500K', #14
+    0x782b => 'WB_RGBLevels6000K', #14
+    0x782c => 'WB_RGBLevels3200K', #14
+    0x782d => 'WB_RGBLevels2500K', #14
+    0x787f => 'WhiteLevel', #14 (divide by 4)
 );
 
 %Image::ExifTool::Sony::SR2DataIFD = (
@@ -4428,6 +6082,47 @@ my %faceInfo = (
     },
 );
 
+# extract information from "SONY PIC\0" maker notes (ref PH)
+%Image::ExifTool::Sony::PIC = (
+    PROCESS_PROC => \&ProcessSonyPIC,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        The TextInfo data is extracted as a block to preserve the formatting, and
+        some of the more interesting information is extracted as separate tags.
+    },
+    TextInfo1 => { Binary => 1 },
+    TextInfo2 => { Binary => 1 },
+    # tags extracted from TextInfo blocks (ID's must end with ':')
+    'Temp:' => {
+        Name => 'CameraTemperature',
+        RawConv => '$val =~ /^-?\d+/ ? $val : undef',
+        PrintConv => '"$val C"',
+    },
+    'Temp:Clbt:' => { Name => 'BoardTemperature', PrintConv => '"$val C"' }, #(NC)
+    'Capt:' => { Name => 'SensorTemperature', PrintConv => '"$val C"' }, #(NC)
+    'VR Enable C:' => {
+        Name => 'VibrationReduction',
+        PrintConv => { 0 => 'Off', 1 => 'On' }, #(NC)
+    },
+    'FWVer:' => 'FirmwareVersion',
+    'BC:' => {
+        Name => 'Barcode',
+        Condition => 'not $$self{VALUE}{Barcode}',
+        ValueConv => '$val=~s/IP1.*//; $val',
+    },
+    'barcode:' => 'Barcode',
+    'BarCode:' => {
+        Name => 'Barcode',
+        ValueConv => 'length($val) > 12 ? substr($val,0,12) : $val',
+    },
+    # 'EvA:' - exposure compensation * 10 (ref 12)
+    # for documentation only -- this IFD is handled manually
+    IFD => {
+        Name => 'PIC_IFD',
+        SubDirectory => { TagTable => 'Image::ExifTool::Sony::Main' },
+    },
+);
+
 # tags found in DSC-F1 PMP header (ref 10)
 %Image::ExifTool::Sony::PMP = (
     PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
@@ -4546,7 +6241,9 @@ Image::ExifTool::AddCompositeTags('Image::ExifTool::Sony');
 {
     my $minoltaTypes = \%Image::ExifTool::Minolta::minoltaLensTypes;
     %sonyLensTypes = %$minoltaTypes;
+    my $other = $$minoltaTypes{OTHER};
     delete $$minoltaTypes{Notes};   # (temporarily)
+    delete $$minoltaTypes{OTHER};   # (temporarily)
     my $id;
     # 5-digit lens ID's are missing the last digit (usually "1") in the metadata for
     # some Sony models, so generate corresponding 4-digit entries for these cameras
@@ -4571,6 +6268,59 @@ Image::ExifTool::AddCompositeTags('Image::ExifTool::Sony');
         $sonyLensTypes{$sid} = $lens;
     }
     $$minoltaTypes{Notes} = $sonyLensTypes{Notes}; # (restore original Notes)
+    $$minoltaTypes{OTHER} = $other;
+}
+
+#------------------------------------------------------------------------------
+# Process "SONY PIC\0" maker notes (DSC-H200/J10/W370/W510, MHS-TS20, ref PH)
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1
+sub ProcessSonyPIC($$$)
+{
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $start = $$dirInfo{DirStart} || 0;
+    my $len = $$dirInfo{DirLen} || (length($$dataPt) - $start);
+    my $data = substr($$dataPt, $start, $len);
+
+    # H200 panorama images have an IFD at offset 12 (non-panoramas have 0's here)
+    # - assume other images could too, but do a bit of validation to check
+    # - MHS-TS20 images have some other data here
+    if ($len >= 26) {
+        my $count = Get16u($dataPt, $start + 12);
+        if ($count > 256) {
+            SwapByteOrder();
+            $count = Get16u($dataPt, $start + 12);
+        }
+        if ($count and $count < 256) {
+            my $format = Get16u($dataPt, $start + 16);
+            if ($format >= 1 and $format <= 10) {
+                $$dirInfo{DirStart} = $start + 12;
+                $$dirInfo{DirLen} = $len - 12;
+                my $sonyTable = GetTagTable('Image::ExifTool::Sony::Main');
+                Image::ExifTool::Exif::ProcessExif($et, $dirInfo, $sonyTable);
+            }
+        }
+    }
+    # Do a brute force search for text data:
+    # For the DSC-J10/W370/W510 the first text block is at offset 0x1ec and
+    # starts with "BarCode:".  For the H200 it is at 0x1f0 and starts with "BC:".
+    # For the TS20 it is at 0x5b and starts with "V400 AELOG\nbarcode:".
+    # The second text block starts with "AFLOG" (Auto-Focus log) and is at
+    # 0x600 for all models, except for the TS20 it is at 0x45b.
+    my $i = 0;
+    while ($data =~ /(\w[\x09\x0a\x0d\x20-\x7e]+)/sg) {
+        next unless length $1 > 32;
+        my ($tag, $val) = ('TextInfo' . (++$i), $1);
+        $$tagTablePtr{$tag} or AddTagToTable($tagTablePtr, $tag, { Name => $tag, Binary => 1 });
+        $et->HandleTag($tagTablePtr, $tag, $val);
+        # extract interesting tags separately (might want to speed this up)
+        foreach $tag (sort { lc $a cmp lc $b } keys %$tagTablePtr) {
+            next unless $tag =~ /:$/ and $val =~ /\b$tag\s*([^\s;,:]+)/;
+            $et->HandleTag($tagTablePtr, $tag, $1);
+        }
+    }
+    return 1;
 }
 
 #------------------------------------------------------------------------------
@@ -4647,7 +6397,7 @@ my @lensFeatures = (
     #  Mask   {  Bits     Name    Bits     Name  } Prefix flag
     # ------    ------    -----  ------    -----   -----------
     [ 0x4000, { 0x4000 => 'PZ'                   }, 1 ],
-    [ 0x0300, { 0x0100 => 'DT',  0x0300 => 'E'   }, 1 ], # (will come before preceding prefix)
+    [ 0x0300, { 0x0100 => 'DT',  0x0200 => 'FE', 0x0300 => 'E'   }, 1 ], # (will come before preceding prefix), FE added (ref 12)
     [ 0x000c, { 0x0004 => 'ZA',  0x0008 => 'G'   } ],
     [ 0x00e0, { 0x0020 => 'STF', 0x0040 => 'Reflex', 0x0060 => 'Macro', 0x0080 => 'Fisheye' } ],
     [ 0x0003, { 0x0001 => 'SSM', 0x0002 => 'SAM' } ],
@@ -4710,8 +6460,8 @@ sub PrintInvLensSpec($)
 # Returns: 1 on success when reading, or new directory when writing (IsWriting set)
 sub ProcessMoreInfo($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    $exifTool or return 1;    # allow dummy access to write routine
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    $et or return 1;    # allow dummy access to write routine
     my $dataPt = $$dirInfo{DataPt};
     my $start = $$dirInfo{DirStart} || 0;
     my $dirLen = $$dirInfo{DirLen} || length($$dataPt);
@@ -4723,18 +6473,18 @@ sub ProcessMoreInfo($$$)
     my $len = Get16u($dataPt, $start + 2);  # total data length
 
     if ($dirLen < 4 + $num * 4) {
-        $exifTool->Warn('Truncated MoreInfo data', 1);
+        $et->Warn('Truncated MoreInfo data', 1);
         return $rtnVal;
     }
     if ($num > 50) {
-        $exifTool->Warn('Possibly corrupted MoreInfo data', 1);
+        $et->Warn('Possibly corrupted MoreInfo data', 1);
         return $rtnVal;
     }
 
-    $exifTool->VerboseDir('MoreInfo', $num, $len) unless $isWriting;
+    $et->VerboseDir('MoreInfo', $num, $len) unless $isWriting;
 
     if ($len > $dirLen) {
-        $exifTool->Warn('MoreInfo data length too large', 1);
+        $et->Warn('MoreInfo data length too large', 1);
         $len = $dirLen;
     }
     # loop through the MoreInfo index section to get the block offsets and tag ID's
@@ -4745,7 +6495,7 @@ sub ProcessMoreInfo($$$)
         push @tagID, Get16u($dataPt, $entry);
         push @offset, Get16u($dataPt, $entry + 2);
         if ($offset[-1] > $len and $offset[-1] <= $dirLen) {
-            $exifTool->Warn('MoreInfo data length too small', 1);
+            $et->Warn('MoreInfo data length too small', 1);
             $len = $dirLen;
         }
     }
@@ -4768,7 +6518,7 @@ sub ProcessMoreInfo($$$)
     # initialize successful return value
     $rtnVal = $isWriting ? substr($$dataPt, $start, $dirLen) : 1;
     # now process each block
-    my $unknown = $exifTool->{OPTIONS}{Unknown};
+    my $unknown = $$et{OPTIONS}{Unknown};
     for ($i=0; $i<$num; ++$i) {
         next if $offset[$i] > $dirLen;  # ignore bad offsets
         my $tag = $tagID[$i];
@@ -4787,7 +6537,7 @@ sub ProcessMoreInfo($$$)
                 DirLen   => $size,
             );
             my $subTable = GetTagTable($$tagInfo{SubDirectory}{TagTable});
-            my $val = $exifTool->WriteDirectory(\%dirInfo, $subTable);
+            my $val = $et->WriteDirectory(\%dirInfo, $subTable);
             # update this block in the returned MoreInfo data
             substr($rtnVal, $offset, $size) = $val if defined $val;
             next;
@@ -4809,7 +6559,7 @@ sub ProcessMoreInfo($$$)
             );
             AddTagToTable($tagTablePtr, $tag, \%tagInfo);
         }
-        $exifTool->HandleTag($tagTablePtr, $tag, undef,
+        $et->HandleTag($tagTablePtr, $tag, undef,
             Index   => $i,
             DataPt  => $dataPt,
             DataPos => $$dirInfo{DataPos},
@@ -4826,24 +6576,24 @@ sub ProcessMoreInfo($$$)
 # Returns: 1 on success when reading, 0 if this isn't a valid PMP file
 sub ProcessPMP($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my $buff;
     $raf->Read($buff, 128) == 128 or return 0;
     # validate header length (124 bytes)
     $buff =~ /^.{8}\0{3}\x7c.{112}\xff\xd8\xff\xdb$/s or return 0;
-    $exifTool->SetFileType();
+    $et->SetFileType();
     SetByteOrder('MM');
-    $exifTool->FoundTag(Make => 'Sony');
-    $exifTool->FoundTag(Model => 'DSC-F1');
+    $et->FoundTag(Make => 'Sony');
+    $et->FoundTag(Model => 'DSC-F1');
     # extract information from 124-byte header
     my $tagTablePtr = GetTagTable('Image::ExifTool::Sony::PMP');
     my %dirInfo = ( DataPt => \$buff, DirName => 'PMP' );
-    $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+    $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
     # process JPEG image
     $raf->Seek(124, 0);
     $$dirInfo{Base} = 124;
-    $exifTool->ProcessJPEG($dirInfo);
+    $et->ProcessJPEG($dirInfo);
     return 1;
 }
 
@@ -4853,13 +6603,13 @@ sub ProcessPMP($$)
 # Returns: true if tag 0x14a is a SubIFD, false otherwise
 sub SetARW($$)
 {
-    my ($exifTool, $valPt) = @_;
+    my ($et, $valPt) = @_;
 
     # assume ARW for now -- SR2's get identified when FileFormat is parsed
-    $exifTool->OverrideFileType($$exifTool{TIFF_TYPE} = 'ARW');
+    $et->OverrideFileType($$et{TIFF_TYPE} = 'ARW');
 
     # this should always be a SubIFD for models other than the A100
-    return 1 unless $$exifTool{Model} eq 'DSLR-A100' and length $$valPt == 4;
+    return 1 unless $$et{Model} eq 'DSLR-A100' and length $$valPt == 4;
 
     # for the A100, IFD0 tag 0x14a is either a pointer to the raw data if this is
     # an original image, or a SubIFD offset if the image was edited by Sony IDC,
@@ -4868,7 +6618,7 @@ sub SetARW($$)
     my %subdir = (
         DirStart => Get32u($valPt, 0),
         Base     => 0,
-        RAF      => $$exifTool{RAF},
+        RAF      => $$et{RAF},
         AllowOutOfOrderTags => 1, # doh!
     );
     return Image::ExifTool::Exif::ValidateIFD(\%subdir);
@@ -4881,7 +6631,7 @@ sub SetARW($$)
 # Notes: (it turns that all of this is for the A100 only)
 sub FinishARW($$$$)
 {
-    my ($exifTool, $dirInfo, $dataPt, $imageData) = @_;
+    my ($et, $dirInfo, $dataPt, $imageData) = @_;
 
     # pre-scan IFD0 to get IFD entry offsets for each tag
     my $dataLen = length $$dataPt;
@@ -4894,9 +6644,9 @@ sub FinishARW($$$$)
         $entry{Get16u($dataPt, $entry)} = $entry;
     }
     # fix up SR2Private offset and A100DataOffset (A100 only)
-    if ($entry{0xc634} and $$exifTool{MRWDirData}) {
-        return 'Unexpected MRW block' unless $$exifTool{Model} eq 'DSLR-A100';
-        return 'Missing A100DataOffset' unless $entry{0x14a} and $$exifTool{A100DataOffset};
+    if ($entry{0xc634} and $$et{MRWDirData}) {
+        return 'Unexpected MRW block' unless $$et{Model} eq 'DSLR-A100';
+        return 'Missing A100DataOffset' unless $entry{0x14a} and $$et{A100DataOffset};
         # account for total length of image data
         my $totalLen = 8 + $dataLen;
         if (ref $imageData) {
@@ -4911,19 +6661,19 @@ sub FinishARW($$$$)
         # set offset for the MRW directory data
         Set32u($totalLen, $dataPt, $entry{0xc634} + 8);
         # also pad MRWDirData data to an even 4 bytes (just to be safe)
-        $remain = length($$exifTool{MRWDirData}) & 0x03;
-        $$exifTool{MRWDirData} .= "\0" x (4 - $remain) if $remain;
-        $totalLen += length $$exifTool{MRWDirData};
+        $remain = length($$et{MRWDirData}) & 0x03;
+        $$et{MRWDirData} .= "\0" x (4 - $remain) if $remain;
+        $totalLen += length $$et{MRWDirData};
         # fix up A100DataOffset
-        $dataOffset = $$exifTool{A100DataOffset};
+        $dataOffset = $$et{A100DataOffset};
         Set32u($totalLen, $dataPt, $entry{0x14a} + 8);
     }
     # patch double-referenced and incorrectly-sized A100 PreviewImage
-    if ($entry{0x201} and $$exifTool{A100PreviewStart} and
-        $entry{0x202} and $$exifTool{A100PreviewLength})
+    if ($entry{0x201} and $$et{A100PreviewStart} and
+        $entry{0x202} and $$et{A100PreviewLength})
     {
-        Set32u($$exifTool{A100PreviewStart}, $dataPt, $entry{0x201} + 8);
-        Set32u($$exifTool{A100PreviewLength}, $dataPt, $entry{0x202} + 8);
+        Set32u($$et{A100PreviewStart}, $dataPt, $entry{0x201} + 8);
+        Set32u($$et{A100PreviewLength}, $dataPt, $entry{0x202} + 8);
     }
     # write TIFF IFD structure
     my $outfile = $$dirInfo{OutFile};
@@ -4931,15 +6681,15 @@ sub FinishARW($$$$)
     Write($outfile, $header, $$dataPt) or return 'Error writing';
     # copy over image data
     if (ref $imageData) {
-        $exifTool->CopyImageData($imageData, $outfile) or return 'Error copying image data';
+        $et->CopyImageData($imageData, $outfile) or return 'Error copying image data';
     }
     # write MRW data if necessary
-    if ($$exifTool{MRWDirData}) {
+    if ($$et{MRWDirData}) {
         Write($outfile, "\0" x $pad) if $pad;   # write padding if necessary
-        Write($outfile, $$exifTool{MRWDirData});
-        delete $$exifTool{MRWDirData};
+        Write($outfile, $$et{MRWDirData});
+        delete $$et{MRWDirData};
         # set TIFF_END to copy over the MRW image data
-        $$exifTool{TIFF_END} = $dataOffset if $dataOffset;
+        $$et{TIFF_END} = $dataOffset if $dataOffset;
     }
     return undef;
 }
@@ -4999,7 +6749,7 @@ sub Decipher($;$)
 # 2) A bug in ExifTool 9.04-9.10 could have double-enciphered these blocks
 sub ProcessEnciphered($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dirStart = $$dirInfo{DirStart} || 0;
     my $dirLen = $$dirInfo{DirLen} || (length($$dataPt) - $dirStart);
@@ -5011,20 +6761,20 @@ sub ProcessEnciphered($$$)
         DirStart => 0,
     );
     Decipher(\$data);
-    if ($$exifTool{DoubleCipher}) {
+    if ($$et{DoubleCipher}) {
         Decipher(\$data);
-        $exifTool->WarnOnce('Some Sony metadata is double-enciphered. Write any tag to fix',1);
+        $et->WarnOnce('Some Sony metadata is double-enciphered. Write any tag to fix',1);
     }
-    if ($exifTool->Options('Verbose') > 2) {
+    if ($et->Options('Verbose') > 2) {
         my $tagInfo = $$dirInfo{TagInfo} || { Name => 'data' };
-        my $str = $$exifTool{DoubleCipher} ? 'ouble-d' : '';
-        $exifTool->VerboseDir("D${str}eciphered $$tagInfo{Name}");
-        $exifTool->VerboseDump(\$data,
-            Prefix  => $exifTool->{INDENT} . '  ',
+        my $str = $$et{DoubleCipher} ? 'ouble-d' : '';
+        $et->VerboseDir("D${str}eciphered $$tagInfo{Name}");
+        $et->VerboseDump(\$data,
+            Prefix  => $$et{INDENT} . '  ',
             DataPos => $$dirInfo{DirStart} + $$dirInfo{DataPos} + ($$dirInfo{Base} || 0),
         );
     }
-    return $exifTool->ProcessBinaryData(\%dirInfo, $tagTablePtr);
+    return $et->ProcessBinaryData(\%dirInfo, $tagTablePtr);
 }
 
 #------------------------------------------------------------------------------
@@ -5033,19 +6783,19 @@ sub ProcessEnciphered($$$)
 # Returns: cipherdata block or undefined on error
 sub WriteEnciphered($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    $exifTool or return 1;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    $et or return 1;
     my $dataPt = $$dirInfo{DataPt};
     my $dirStart = $$dirInfo{DirStart} || 0;
     my $dirLen = $$dirInfo{DirLen} || (length($$dataPt) - $dirStart);
     my $data = substr($$dataPt, $dirStart, $dirLen);
-    my $changed = $$exifTool{CHANGED};
+    my $changed = $$et{CHANGED};
     Decipher(\$data);
     # fix double-enciphered data (due to bug in ExifTool 9.04-9.10)
-    if ($$exifTool{DoubleCipher}) {
+    if ($$et{DoubleCipher}) {
         Decipher(\$data);
-        ++$$exifTool{CHANGED};
-        $exifTool->WarnOnce('Fixed double-enciphered Sony metadata',1);
+        ++$$et{CHANGED};
+        $et->WarnOnce('Fixed double-enciphered Sony metadata',1);
     }
     my %dirInfo = (
         %$dirInfo,
@@ -5053,8 +6803,8 @@ sub WriteEnciphered($$$)
         DataPos => $$dirInfo{DataPos} + $dirStart,
         DirStart => 0,
     );
-    $data = $exifTool->WriteBinaryData(\%dirInfo, $tagTablePtr);
-    if ($changed == $$exifTool{CHANGED}) {
+    $data = $et->WriteBinaryData(\%dirInfo, $tagTablePtr);
+    if ($changed == $$et{CHANGED}) {
         # nothing changed, so recover original data
         $data = substr($$dataPt, $dirStart, $dirLen);
     } elsif (defined $data) {
@@ -5069,10 +6819,10 @@ sub WriteEnciphered($$$)
 # Returns: 1 on success
 sub ProcessSRF($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $start = $$dirInfo{DirStart};
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
 
     # process IFD chain
     my ($ifd, $success);
@@ -5085,9 +6835,9 @@ sub ProcessSRF($$$)
             $tagTablePtr = GetTagTable('Image::ExifTool::Exif::Main');
         }
         my $srf = $$dirInfo{DirName} = "SRF$ifd";
-        $exifTool->{SET_GROUP1} = $srf;
-        $success = Image::ExifTool::Exif::ProcessExif($exifTool, $dirInfo, $tagTablePtr);
-        delete $exifTool->{SET_GROUP1};
+        $$et{SET_GROUP1} = $srf;
+        $success = Image::ExifTool::Exif::ProcessExif($et, $dirInfo, $tagTablePtr);
+        delete $$et{SET_GROUP1};
         last unless $success;
 #
 # get pointer to next IFD
@@ -5112,7 +6862,7 @@ sub ProcessSRF($$$)
             $len = $cp + $nextIFD;  # decrypt up to $cp
         } elsif ($ifd == 2) {
             # get the key to decrypt IFD2
-            $key = $exifTool->{SRF2Key};
+            $key = $$et{SRF2Key};
             $len = length($$dataPt) - $nextIFD; # decrypt rest of maker notes
         } else {
             next;   # no decryption needed
@@ -5121,9 +6871,9 @@ sub ProcessSRF($$$)
         Decrypt($dataPt, $nextIFD, $len, $key) if defined $key;
         next unless $verbose > 2;
         # display decrypted data in verbose mode
-        $exifTool->VerboseDir("Decrypted SRF$ifd", 0, $nextIFD + $len);
-        $exifTool->VerboseDump($dataPt,
-            Prefix => "$exifTool->{INDENT}  ",
+        $et->VerboseDir("Decrypted SRF$ifd", 0, $nextIFD + $len);
+        $et->VerboseDump($dataPt,
+            Prefix => "$$et{INDENT}  ",
             Start => $nextIFD,
             DataPos => $$dirInfo{DataPos},
         );
@@ -5136,11 +6886,11 @@ sub ProcessSRF($$$)
 # Returns: 1 on success when reading, or SR2 directory or undef when writing
 sub WriteSR2($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    $exifTool or return 1;      # allow dummy access
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    $et or return 1;      # allow dummy access
     my $buff = '';
     $$dirInfo{OutFile} = \$buff;
-    return ProcessSR2($exifTool, $dirInfo, $tagTablePtr);
+    return ProcessSR2($et, $dirInfo, $tagTablePtr);
 }
 
 #------------------------------------------------------------------------------
@@ -5149,7 +6899,7 @@ sub WriteSR2($$$)
 # Returns: 1 on success when reading, or SR2 directory or undef when writing
 sub ProcessSR2($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $raf = $$dirInfo{RAF};
     my $dataPt = $$dirInfo{DataPt};
     my $dataPos = $$dirInfo{DataPos};
@@ -5158,9 +6908,9 @@ sub ProcessSR2($$$)
     my $outfile = $$dirInfo{OutFile};
 
     # clear SR2 member variables to be safe
-    delete $$exifTool{SR2SubIFDOffset};
-    delete $$exifTool{SR2SubIFDLength};
-    delete $$exifTool{SR2SubIFDKey};
+    delete $$et{SR2SubIFDOffset};
+    delete $$et{SR2SubIFDLength};
+    delete $$et{SR2SubIFDKey};
 
     # make sure we have the first 4 bytes available to test directory type
     my $buff;
@@ -5177,10 +6927,10 @@ sub ProcessSR2($$$)
     my $dataOffset;
     if ($dataPt and $$dataPt =~ /^\0MR[IM]/) {
         my ($err, $srfPos, $srfLen, $dataOffset);
-        $dataOffset = $$exifTool{A100DataOffset};
+        $dataOffset = $$et{A100DataOffset};
         if ($dataOffset) {
             # save information about the RAW data trailer so it will be preserved
-            $$exifTool{KnownTrailer} = { Name => 'A100 RAW Data', Start => $dataOffset };
+            $$et{KnownTrailer} = { Name => 'A100 RAW Data', Start => $dataOffset };
         } else {
             $err = 'A100DataOffset tag is missing from A100 ARW image';
         }
@@ -5193,44 +6943,44 @@ sub ProcessSR2($$$)
             }
         }
         if ($err) {
-            $outfile and $exifTool->Error($err), return undef;
-            $exifTool->Warn($err);
+            $outfile and $et->Error($err), return undef;
+            $et->Warn($err);
             return 0;
         }
         my %dirInfo = ( DataPt => \$buff );
         require Image::ExifTool::MinoltaRaw;
         if ($outfile) {
             # save MRW data to be written last
-            $$exifTool{MRWDirData} = Image::ExifTool::MinoltaRaw::WriteMRW($exifTool, \%dirInfo);
-            return $$exifTool{MRWDirData} ? "\0\0\0\0\0\0" : undef;
+            $$et{MRWDirData} = Image::ExifTool::MinoltaRaw::WriteMRW($et, \%dirInfo);
+            return $$et{MRWDirData} ? "\0\0\0\0\0\0" : undef;
         } else {
-            if (not $outfile and $$exifTool{HTML_DUMP}) {
-                $exifTool->HDump($srfPos, $srfLen, '[A100 SRF Data]');
+            if (not $outfile and $$et{HTML_DUMP}) {
+                $et->HDump($srfPos, $srfLen, '[A100 SRF Data]');
             }
-            return Image::ExifTool::MinoltaRaw::ProcessMRW($exifTool, \%dirInfo);
+            return Image::ExifTool::MinoltaRaw::ProcessMRW($et, \%dirInfo);
         }
-    } elsif ($$exifTool{A100DataOffset}) {
+    } elsif ($$et{A100DataOffset}) {
         my $err = 'Unexpected A100DataOffset tag';
-        $outfile and $exifTool->Error($err), return undef;
-        $exifTool->Warn($err);
+        $outfile and $et->Error($err), return undef;
+        $et->Warn($err);
         return 0;
     }
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
     my $result;
     if ($outfile) {
-        $result = Image::ExifTool::Exif::WriteExif($exifTool, $dirInfo, $tagTablePtr);
+        $result = Image::ExifTool::Exif::WriteExif($et, $dirInfo, $tagTablePtr);
         return undef unless $result;
         $$outfile .= $result;
 
     } else {
-        $result = Image::ExifTool::Exif::ProcessExif($exifTool, $dirInfo, $tagTablePtr);
+        $result = Image::ExifTool::Exif::ProcessExif($et, $dirInfo, $tagTablePtr);
     }
-    return $result unless $result and $$exifTool{SR2SubIFDOffset};
+    return $result unless $result and $$et{SR2SubIFDOffset};
     # only take first offset value if more than one!
-    my @offsets = split ' ', $exifTool->{SR2SubIFDOffset};
+    my @offsets = split ' ', $$et{SR2SubIFDOffset};
     my $offset = shift @offsets;
-    my $length = $exifTool->{SR2SubIFDLength};
-    my $key = $exifTool->{SR2SubIFDKey};
+    my $length = $$et{SR2SubIFDLength};
+    my $key = $$et{SR2SubIFDKey};
     my @subifdPos;
     if ($offset and $length and defined $key) {
         my $buff;
@@ -5244,8 +6994,8 @@ sub ProcessSR2($$$)
             Decrypt(\$buff, 0, $length, $key);
             # display decrypted data in verbose mode
             if ($verbose > 2 and not $outfile) {
-                $exifTool->VerboseDir("Decrypted SR2SubIFD", 0, $length);
-                $exifTool->VerboseDump(\$buff, Addr => $offset + $base);
+                $et->VerboseDir("Decrypted SR2SubIFD", 0, $length);
+                $et->VerboseDump(\$buff, Addr => $offset + $base);
             }
             my $num = '';
             my $dPos = $offset;
@@ -5262,16 +7012,16 @@ sub ProcessSR2($$$)
                 if ($outfile) {
                     my $fixup = new Image::ExifTool::Fixup;
                     $dirInfo{Fixup} = $fixup;
-                    $result = $exifTool->WriteDirectory(\%dirInfo, $subTable);
+                    $result = $et->WriteDirectory(\%dirInfo, $subTable);
                     return undef unless $result;
                     # save position of this SubIFD
                     push @subifdPos, length($$outfile);
                     # add this directory to the returned data
                     $$fixup{Start} += length($$outfile);
                     $$outfile .= $result;
-                    $dirInfo->{Fixup}->AddFixup($fixup);
+                    $$dirInfo{Fixup}->AddFixup($fixup);
                 } else {
-                    $result = $exifTool->ProcessDirectory(\%dirInfo, $subTable);
+                    $result = $et->ProcessDirectory(\%dirInfo, $subTable);
                 }
                 last unless @offsets;
                 $offset = shift @offsets;
@@ -5279,7 +7029,7 @@ sub ProcessSR2($$$)
             }
 
         } else {
-            $exifTool->Warn('Error reading SR2 data');
+            $et->Warn('Error reading SR2 data');
         }
     }
     if ($outfile and @subifdPos) {
@@ -5291,9 +7041,9 @@ sub ProcessSR2($$$)
             $$outfile .= ' ' x $pad;
         }
         # save the new SR2SubIFD Length and Key to be used later for encryption
-        $$exifTool{SR2SubIFDLength} = $sr2Len;
-        my $newKey = $$exifTool{VALUE}{SR2SubIFDKey};
-        $$exifTool{SR2SubIFDKey} = $newKey if defined $newKey;
+        $$et{SR2SubIFDLength} = $sr2Len;
+        my $newKey = $$et{VALUE}{SR2SubIFDKey};
+        $$et{SR2SubIFDKey} = $newKey if defined $newKey;
         # update SubIFD pointers manually and add to fixup, and set SR2SubIFDLength
         my $n = Get16u($outfile, 0);
         my ($i, %found);
@@ -5305,7 +7055,7 @@ sub ProcessSR2($$$)
             $found{$tagID} = 1;
             my $fmt = Get16u($outfile, $entry + 2);
             if ($fmt != 0x04) { # must be int32u
-                $exifTool->Error("Unexpected format ($fmt) for SR2SubIFD tag");
+                $et->Error("Unexpected format ($fmt) for SR2SubIFD tag");
                 return undef;
             }
             if ($tagID == 0x7201) { # SR2SubIFDLength
@@ -5317,13 +7067,13 @@ sub ProcessSR2($$$)
             my $pos;
             foreach $pos (@subifdPos) {
                 Set32u($pos, $outfile, $valuePtr);
-                $dirInfo->{Fixup}->AddFixup($valuePtr, $tag);
+                $$dirInfo{Fixup}->AddFixup($valuePtr, $tag);
                 undef $tag;
                 $valuePtr += 4;
             }
         }
         unless ($found{0x7200} and $found{0x7201}) {
-            $exifTool->Error('Missing SR2SubIFD tag');
+            $et->Error('Missing SR2SubIFD tag');
             return undef;
         }
     }
@@ -5354,7 +7104,7 @@ Minolta.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -12,7 +12,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.02';
+$VERSION = '1.03';
 
 # Sony IDC tags (ref PH)
 %Image::ExifTool::SonyIDC::Main = (
@@ -259,23 +259,23 @@ Image::ExifTool::AddCompositeTags('Image::ExifTool::SonyIDC');
 #          or undef if there was no preview in the SonyIDC IFD
 sub ExtractPreviews($)
 {
-    my $exifTool = shift;
+    my $et = shift;
     my $i = 1;
     my $xtra = ' (1)';
     my $preview;
     # loop through all available IDC preview images in the order they were found
     for (;;) {
         my $key = "IDCPreviewStart$xtra";
-        unless (defined $$exifTool{VALUE}{$key}) {
+        unless (defined $$et{VALUE}{$key}) {
             last unless $xtra;
             $xtra = ''; # do the last tag extracted last
             next;
         }
         # run through IDC preview images in the same order they were extracted
-        my $off = $exifTool->GetValue($key) or last;
-        my $len = $exifTool->GetValue("IDCPreviewLength$xtra") or last;
+        my $off = $et->GetValue($key) or last;
+        my $len = $et->GetValue("IDCPreviewLength$xtra") or last;
         # get stack version from number in group 1 name
-        my $grp1 = $exifTool->GetGroup($key, 1);
+        my $grp1 = $et->GetGroup($key, 1);
         if ($grp1 =~ /(\d+)$/) {
             my $tag = "IDCPreviewImage$1";
             unless ($Image::ExifTool::Extra{$tag}) {
@@ -284,10 +284,10 @@ sub ExtractPreviews($)
                     Groups => { 0 => 'Composite', 1 => 'Composite', 2 => 'Image'},
                 });
             }
-            my $val = Image::ExifTool::Exif::ExtractImage($exifTool, $off, $len, $tag);
-            $exifTool->FoundTag($tag, $val);
+            my $val = Image::ExifTool::Exif::ExtractImage($et, $off, $len, $tag);
+            $et->FoundTag($tag, $val);
         } else {
-            $preview = Image::ExifTool::Exif::ExtractImage($exifTool, $off, $len, 'IDCPreviewImage');
+            $preview = Image::ExifTool::Exif::ExtractImage($et, $off, $len, 'IDCPreviewImage');
         }
         # step to next set of tags unless we are done
         last unless $xtra;
@@ -316,7 +316,7 @@ write Sony Image Data Converter version 3.0 metadata in ARW images.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -174,7 +174,7 @@ information.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -15,7 +15,7 @@ use vars qw($VERSION @ISA);
 use Image::ExifTool qw(:Utils :Vars);
 use Image::ExifTool::XMP;
 
-$VERSION = '1.20';
+$VERSION = '1.23';
 @ISA = qw(Exporter);
 
 # set this to a language code to generate Lang module with 'MISSING' entries
@@ -35,7 +35,7 @@ my %credits = (
     it   => 'Jens Duttke, Ferdinando Agovino, Emilio Dati and Michele Locati',
     ja   => 'Jens Duttke and Kazunari Nishina',
     ko   => 'Jens Duttke and Jeong Beom Kim',
-    nl   => 'Jens Duttke, Peter Moonen and Herman Beld',
+    nl   => 'Jens Duttke, Peter Moonen, Herman Beld and Peter van der Laan',
     pl   => 'Jens Duttke, Przemyslaw Sulek and Kacper Perschke',
     ru   => 'Jens Duttke, Sergey Shemetov, Dmitry Yerokhin and Anton Sukhinov',
     sv   => 'Jens Duttke and BjE<ouml>rn SE<ouml>derstrE<ouml>m',
@@ -67,7 +67,7 @@ sub Write(;$$%)
     local ($_, *PTIFILE);
     my ($file, $group, %opts) = @_;
     my @groups = split ':', $group if $group;
-    my $exifTool = new Image::ExifTool;
+    my $et = new Image::ExifTool;
     my ($fp, $tableName, %langInfo, @langs, $defaultLang);
 
     Image::ExifTool::LoadAllTables();   # first load all our tables
@@ -111,7 +111,7 @@ PTILoop:    for ($index=0; $index<@infoArray; ++$index) {
                 # don't list subdirectories unless they are writable
                 next unless $$tagInfo{Writable} or not $$tagInfo{SubDirectory};
                 if (@groups) {
-                    my @tg = $exifTool->GetGroup($tagInfo);
+                    my @tg = $et->GetGroup($tagInfo);
                     foreach $group (@groups) {
                         next PTILoop unless grep /^$group$/i, @tg;
                     }
@@ -163,8 +163,10 @@ PTILoop:    for ($index=0; $index<@infoArray; ++$index) {
                 my $count = '';
                 if ($format =~ s/\[.*?(\d*)\]$//) {
                     $count = " count='$1'" if length $1;
+                } elsif ($$tagInfo{Count} and $$tagInfo{Count} > 1) {
+                    $count = " count='$$tagInfo{Count}'";
                 }
-                my @groups = $exifTool->GetGroup($tagInfo);
+                my @groups = $et->GetGroup($tagInfo);
                 my $writeGroup = $$tagInfo{WriteGroup} || $$table{WRITE_GROUP};
                 if ($writeGroup and $writeGroup ne 'Comment') {
                     $groups[1] = $writeGroup;   # use common write group for group 1
@@ -612,7 +614,7 @@ and values.
 
 ~head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -779,7 +781,7 @@ Number of modules updated, or negative on error.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -17,7 +17,7 @@ require Exporter;
 use vars qw($VERSION @ISA @EXPORT_OK);
 use Image::ExifTool qw(:Utils);
 
-$VERSION = '1.11';
+$VERSION = '1.12';
 @ISA = qw(Exporter);
 @EXPORT_OK = qw(FindTagInfo TagExists);
 
@@ -33,6 +33,7 @@ sub AddFields($$$$$$;$$);
 # list of tables containing writable tags
 my @tableList = (
 	'Image::ExifTool::APP12::Ducky',
+	'Image::ExifTool::Apple::Main',
 	'Image::ExifTool::Canon::AFMicroAdj',
 	'Image::ExifTool::Canon::Ambience',
 	'Image::ExifTool::Canon::AspectInfo',
@@ -55,6 +56,7 @@ my @tableList = (
 	'Image::ExifTool::Canon::CameraInfo60D',
 	'Image::ExifTool::Canon::CameraInfo650D',
 	'Image::ExifTool::Canon::CameraInfo6D',
+	'Image::ExifTool::Canon::CameraInfo70D',
 	'Image::ExifTool::Canon::CameraInfo7D',
 	'Image::ExifTool::Canon::CameraInfoPowerShot',
 	'Image::ExifTool::Canon::CameraInfoPowerShot2',
@@ -196,6 +198,7 @@ my @tableList = (
 	'Image::ExifTool::Nikon::ColorBalance3',
 	'Image::ExifTool::Nikon::ColorBalance4',
 	'Image::ExifTool::Nikon::ColorBalanceA',
+	'Image::ExifTool::Nikon::ColorBalanceUnknown',
 	'Image::ExifTool::Nikon::DistortInfo',
 	'Image::ExifTool::Nikon::FaceDetect',
 	'Image::ExifTool::Nikon::FileInfo',
@@ -312,8 +315,9 @@ my @tableList = (
 	'Image::ExifTool::Pentax::LevelInfo',
 	'Image::ExifTool::Pentax::Main',
 	'Image::ExifTool::Pentax::SRInfo',
+	'Image::ExifTool::Pentax::SRInfo2',
 	'Image::ExifTool::Pentax::ShotInfo',
-	'Image::ExifTool::Pentax::TempInfoK5',
+	'Image::ExifTool::Pentax::TempInfo',
 	'Image::ExifTool::Pentax::TimeInfo',
 	'Image::ExifTool::Pentax::Type2',
 	'Image::ExifTool::Pentax::WBLevels',
@@ -323,6 +327,10 @@ my @tableList = (
 	'Image::ExifTool::Photoshop::Main',
 	'Image::ExifTool::Photoshop::Resolution',
 	'Image::ExifTool::PostScript::Main',
+	'Image::ExifTool::QuickTime::MediaHeader',
+	'Image::ExifTool::QuickTime::MovieHeader',
+	'Image::ExifTool::QuickTime::Preview',
+	'Image::ExifTool::QuickTime::TrackHeader',
 	'Image::ExifTool::Reconyx::Main',
 	'Image::ExifTool::Ricoh::FaceInfo',
 	'Image::ExifTool::Ricoh::FirmwareInfo',
@@ -330,13 +338,14 @@ my @tableList = (
 	'Image::ExifTool::Ricoh::Main',
 	'Image::ExifTool::Ricoh::SerialInfo',
 	'Image::ExifTool::Ricoh::Subdir',
+	'Image::ExifTool::Samsung::Main',
 	'Image::ExifTool::Samsung::PictureWizard',
-	'Image::ExifTool::Samsung::Type1',
 	'Image::ExifTool::Samsung::Type2',
 	'Image::ExifTool::Sanyo::FaceInfo',
 	'Image::ExifTool::Sanyo::Main',
 	'Image::ExifTool::Sigma::Main',
 	'Image::ExifTool::Sony::AFInfo',
+	'Image::ExifTool::Sony::AFInfo2',
 	'Image::ExifTool::Sony::CameraInfo',
 	'Image::ExifTool::Sony::CameraInfo2',
 	'Image::ExifTool::Sony::CameraSettings',
@@ -349,18 +358,32 @@ my @tableList = (
 	'Image::ExifTool::Sony::FaceInfo',
 	'Image::ExifTool::Sony::FaceInfo1',
 	'Image::ExifTool::Sony::FaceInfo2',
+	'Image::ExifTool::Sony::FaceInfoA',
 	'Image::ExifTool::Sony::FocusInfo',
 	'Image::ExifTool::Sony::Main',
+	'Image::ExifTool::Sony::MoreInfo0201',
+	'Image::ExifTool::Sony::MoreInfo0401',
 	'Image::ExifTool::Sony::MoreSettings',
 	'Image::ExifTool::Sony::Panorama',
 	'Image::ExifTool::Sony::ShotInfo',
+	'Image::ExifTool::Sony::Tag2010a',
+	'Image::ExifTool::Sony::Tag2010b',
+	'Image::ExifTool::Sony::Tag2010c',
+	'Image::ExifTool::Sony::Tag2010d',
+	'Image::ExifTool::Sony::Tag2010e',
+	'Image::ExifTool::Sony::Tag2010f',
+	'Image::ExifTool::Sony::Tag2010g',
 	'Image::ExifTool::Sony::Tag9050',
 	'Image::ExifTool::Sony::Tag9400a',
 	'Image::ExifTool::Sony::Tag9400b',
+	'Image::ExifTool::Sony::Tag9400c',
 	'Image::ExifTool::Sony::Tag9402',
 	'Image::ExifTool::Sony::Tag9403',
+	'Image::ExifTool::Sony::Tag9405a',
+	'Image::ExifTool::Sony::Tag9405b',
 	'Image::ExifTool::Sony::Tag9406',
 	'Image::ExifTool::Sony::Tag940a',
+	'Image::ExifTool::Sony::Tag940c',
 	'Image::ExifTool::SonyIDC::Main',
 	'Image::ExifTool::XMP::Album',
 	'Image::ExifTool::XMP::DICOM',
@@ -380,6 +403,7 @@ my @tableList = (
 	'Image::ExifTool::XMP::dex',
 	'Image::ExifTool::XMP::digiKam',
 	'Image::ExifTool::XMP::exif',
+	'Image::ExifTool::XMP::exifEX',
 	'Image::ExifTool::XMP::extensis',
 	'Image::ExifTool::XMP::fpv',
 	'Image::ExifTool::XMP::ics',
@@ -407,3742 +431,3988 @@ my @tableList = (
 
 # lookup for all writable tags
 my %tagLookup = (
-	'aberrationcorrectiondistance' => { 85 => 0x69 },
-	'about' => { 359 => 'about' },
-	'abspeakaudiofilepath' => { 365 => 'absPeakAudioFilePath' },
-	'accelerationtracking' => { 66 => 0x518 },
-	'accessorytype' => { 247 => 0x53 },
-	'actionadvised' => { 101 => 0x2a },
-	'activearea' => { 93 => 0xc68d },
-	'actived-lighting' => { 178 => 0x22, 209 => 0x24 },
-	'actived-lightingmode' => { 209 => 0x25 },
-	'addaspectratioinfo' => { 66 => 0x80e },
-	'additionalmodelinformation' => { 352 => 'AddlModelInfo' },
-	'addoriginaldecisiondata' => { 66 => 0x80f, 67 => 0x11, 68 => 0x13, 71 => 0x14 },
-	'address' => { 128 => 'Address' },
-	'adjustmentmode' => { 303 => 0x15 },
-	'adobe' => { 94 => 'Adobe' },
-	'adultcontentwarning' => { 355 => 'AdultContentWarning', 358 => 'adultContentWarning' },
-	'advancedraw' => { 211 => 0x76a43203 },
-	'advancedscenetype' => { 247 => 0x3d },
-	'advisory' => { 363 => 'Advisory' },
-	'ae_iso' => { 252 => 0x2, 253 => 0x4, 254 => 0x12 },
-	'aeaperture' => { 252 => 0x1, 253 => 0x3, 254 => 0x11 },
-	'aebautocancel' => { 66 => 0x104 },
-	'aebbracketvalue' => { 60 => 0x11 },
-	'aebsequence' => { 66 => 0x105 },
-	'aebsequenceautocancel' => { 64 => 0x9, 65 => 0x9, 67 => 0x8, 68 => 0x9, 71 => 0x9, 72 => 0x7 },
-	'aebshotcount' => { 66 => 0x106 },
-	'aebxv' => { 252 => 0x4, 253 => 0x6 },
-	'aeerror' => { 253 => 0x8 },
-	'aeexposuretime' => { 252 => 0x0, 253 => 0x2, 254 => 0x10 },
-	'aelbutton' => { 148 => 0x45 },
-	'aelexposureindicator' => { 148 => 0x51 },
-	'aelock' => { 148 => 0x5b, 219 => '4.2', 225 => '4.2', 228 => 0x201, 278 => 0x48, 309 => 0x86 },
-	'aelockbutton' => { 218 => '16.1', 219 => '4.1', 220 => '15.1', 221 => '16.1', 222 => '16.1', 223 => '30.1', 224 => '16.1', 225 => '4.1', 227 => '17.1' },
-	'aelockbuttonplusdials' => { 218 => '16.2', 223 => '32.1' },
-	'aelockformb-d80' => { 227 => '3.1' },
-	'aemaxaperture' => { 252 => 0x9, 253 => 0x10, 254 => 0x1c },
-	'aemaxaperture2' => { 252 => 0xa, 253 => 0x11, 254 => 0x1d },
-	'aemeteringmode' => { 252 => 0xc },
-	'aemeteringsegments' => { 151 => 0x628, 278 => 0x209 },
-	'aemicroadjustment' => { 66 => 0x111 },
-	'aeminaperture' => { 252 => 0xb, 253 => 0x12, 254 => 0x1e },
-	'aeminexposuretime' => { 252 => 0x5, 253 => 0x13, 254 => 0x1f },
-	'aeprogrammode' => { 252 => 0x6 },
-	'aesetting' => { 27 => 0x21 },
-	'aexv' => { 252 => 0x3, 253 => 0x5 },
-	'af-cpriorityselection' => { 218 => '1.1', 221 => '0.1', 222 => '0.1', 223 => '1.1', 224 => '0.1' },
-	'af-onformb-d10' => { 218 => '3.3', 223 => '3.2' },
-	'af-onformb-d11' => { 224 => '2.2' },
-	'af-spriorityselection' => { 218 => '1.2', 223 => '1.2', 224 => '0.2' },
-	'afactivation' => { 218 => '2.1', 223 => '2.1' },
-	'afadjustment' => { 278 => 0x72 },
-	'afandmeteringbuttons' => { 66 => 0x701 },
-	'afaperture' => { 174 => 0x5, 175 => 0x5 },
-	'afareaheight' => { 156 => 0x1a },
-	'afareaillumination' => { 148 => 0x4b, 225 => '15.3' },
-	'afareamode' => { 144 => 0x33, 148 => 0xe, 155 => 0x0, 156 => 0x5, 247 => 0xf, 304 => 0xa, 307 => 0x11, 308 => 0x10, 309 => 0x24, 318 => 0xb043, 325 => 0x17 },
-	'afareamodesetting' => { 219 => '11.1', 220 => '0.1', 225 => '16.1', 227 => '2.1', 318 => 0x201c },
-	'afareas' => { 228 => 0x304 },
-	'afareawidth' => { 156 => 0x18 },
-	'afareaxposition' => { 156 => 0x14 },
-	'afareayposition' => { 156 => 0x16 },
-	'afassist' => { 64 => 0x5, 72 => 0x5, 148 => 0x48, 218 => '2.5', 219 => '0.2', 220 => '0.2', 221 => '1.1', 222 => '1.1', 223 => '2.4', 224 => '1.4', 225 => '0.2', 227 => '2.3' },
-	'afassistbeam' => { 66 => 0x50e, 67 => 0x4, 68 => 0x5, 69 => 0x4, 70 => 0x4, 71 => 0x5 },
-	'afassistlamp' => { 247 => 0x31 },
-	'afbuttonpressed' => { 309 => 0x83 },
-	'afdefocus' => { 255 => 0x6 },
-	'afduringliveview' => { 66 => 0x511 },
-	'affinea' => { 337 => 'AffineA' },
-	'affineb' => { 337 => 'AffineB' },
-	'affinec' => { 337 => 'AffineC' },
-	'affined' => { 337 => 'AffineD' },
-	'affinetune' => { 157 => 0x0, 228 => 0x306 },
-	'affinetuneadj' => { 157 => 0x2, 186 => 0x2d1, 187 => 0x2dc, 228 => 0x307 },
-	'affinetuneindex' => { 157 => 0x1 },
-	'affinex' => { 337 => 'AffineX' },
-	'affiney' => { 337 => 'AffineY' },
-	'afilluminator' => { 307 => 0x29, 318 => 0xb044 },
-	'afimageheight' => { 156 => 0x12 },
-	'afimagewidth' => { 156 => 0x10 },
-	'afintegrationtime' => { 255 => 0x7 },
-	'afmicroadj' => { 304 => 0x17d },
-	'afmicroadjmode' => { 1 => 0x1, 306 => 0x131 },
-	'afmicroadjregisteredlenses' => { 306 => '305.1' },
-	'afmicroadjustment' => { 66 => 0x507 },
-	'afmicroadjvalue' => { 1 => 0x2, 306 => 0x130 },
-	'afmode' => { 89 => 0x3009, 144 => 0x16, 303 => 0x5 },
-	'afonaelockbuttonswitch' => { 66 => 0x702 },
-	'afonbutton' => { 218 => '3.1' },
-	'afpoint' => { 27 => 0x13, 88 => 0x18, 144 => 0x15, 155 => 0x1, 231 => 0x308, 303 => 0x1f, 304 => 0x7, 305 => 0x20 },
-	'afpointactivationarea' => { 65 => 0x11, 71 => 0x11 },
-	'afpointareaexpansion' => { 66 => 0x508 },
-	'afpointatshutterrelease' => { 304 => 0x9 },
-	'afpointautoselection' => { 66 => 0x50b },
-	'afpointbrightness' => { 66 => 0x50d, 218 => '2.4' },
-	'afpointdisplayduringfocus' => { 66 => 0x50c },
-	'afpointillumination' => { 65 => 0xa, 218 => '2.3', 223 => '2.3', 224 => '1.3', 227 => '2.4' },
-	'afpointinfocus' => { 304 => 0x8 },
-	'afpointmode' => { 259 => 0x3 },
-	'afpointposition' => { 89 => 0x2021, 247 => 0x4d },
-	'afpointregistration' => { 64 => 0x7 },
-	'afpoints' => { 147 => 0x10 },
-	'afpointselected' => { 148 => 0xd, 228 => 0x305, 278 => 0xe, 305 => 0x1c, 307 => 0x12, 308 => 0x11, 318 => 0x201e },
-	'afpointselected2' => { 259 => 0x4 },
-	'afpointselection' => { 65 => 0xb, 218 => '1.3', 223 => '1.3' },
-	'afpointselectionmethod' => { 66 => 0x50f, 67 => 0xc, 68 => 0xd, 71 => 0xd },
-	'afpointsinfocus' => { 60 => 0xe, 155 => 0x2, 255 => 0xb, 278 => [0xf,0x3c] },
-	'afpointsinfocus5d' => { 16 => 0x38 },
-	'afpointspotmetering' => { 65 => 0xd },
-	'afpointsselected' => { 328 => 0x4 },
-	'afpointsunknown1' => { 255 => 0x0 },
-	'afpointsunknown2' => { 255 => 0x2 },
-	'afpointsused' => { 156 => 0x8 },
-	'afpredictor' => { 255 => 0x4 },
-	'afresponse' => { 178 => 0xad },
-	'afresult' => { 233 => 0x1038 },
-	'afsearch' => { 228 => 0x303 },
-	'afsensoractive' => { 144 => 0x1 },
-	'afstatusactivesensor' => { 144 => 0x2 },
-	'afstatusbottom' => { 144 => 0x8 },
-	'afstatusbottom-left' => { 144 => 0x12 },
-	'afstatusbottom-right' => { 144 => 0x6 },
-	'afstatuscenterhorizontal' => { 144 => 0x2f },
-	'afstatuscentervertical' => { 144 => 0xc },
-	'afstatusleft' => { 144 => 0x2d },
-	'afstatusmiddlehorizontal' => { 144 => 0xa },
-	'afstatusright' => { 144 => 0x31 },
-	'afstatustop' => { 144 => 0xe },
-	'afstatustop-left' => { 144 => 0x10 },
-	'afstatustop-right' => { 144 => 0x4 },
-	'aftype' => { 304 => 0x2 },
-	'afwithshutter' => { 307 => 0x2a },
-	'aggregationtype' => { 356 => 'aggregationType' },
-	'agreement' => { 358 => 'agreement' },
-	'aiservocontinuousshooting' => { 65 => 0x15 },
-	'aiservofirstimagepriority' => { 66 => 0x519 },
-	'aiservoimagepriority' => { 66 => 0x503 },
-	'aiservosecondimagepriority' => { 66 => 0x51a },
-	'aiservotrackingmethod' => { 66 => 0x504 },
-	'aiservotrackingsensitivity' => { 65 => 0x14, 66 => 0x502 },
-	'album' => { 365 => 'album' },
-	'alreadyapplied' => { 343 => 'AlreadyApplied' },
-	'alternatetitle' => { 356 => 'alternateTitle' },
-	'alttapename' => { 365 => 'altTapeName' },
-	'alttimecode' => { 365 => 'altTimecode' },
-	'alttimecodetimeformat' => { 365 => [\'altTimecode','altTimecodeTimeFormat'] },
-	'alttimecodetimevalue' => { 365 => [\'altTimecode','altTimecodeTimeValue'] },
-	'alttimecodevalue' => { 365 => [\'altTimecode','altTimecodeValue'] },
-	'ambienceselection' => { 2 => 0x1 },
-	'ambienttemperature' => { 291 => 0x14, 325 => 0x4 },
-	'ambienttemperaturefahrenheit' => { 291 => 0x13 },
-	'analogbalance' => { 93 => 0xc627 },
-	'angleadj' => { 85 => 0x8b },
-	'angleinforoll' => { 339 => 'AngleInfoRoll' },
-	'anti-blur' => { 318 => 0xb04b },
-	'antialiasstrength' => { 93 => 0xc632 },
-	'aperturerange' => { 66 => 0x10d },
-	'apertureringuse' => { 259 => '1.4' },
-	'aperturesetting' => { 148 => 0x7, 307 => 0x30, 308 => 0x29, 309 => 0x1 },
-	'aperturevalue' => { 75 => 0x2, 93 => 0x9202, 233 => 0x1002, 347 => 'ApertureValue' },
-	'applekeywords' => { 237 => 'AAPL:Keywords' },
-	'applicationnotes' => { 93 => 0x2bc, 251 => 0x2bc },
-	'applicationrecordversion' => { 101 => 0x0 },
-	'applyshootingmeteringmode' => { 66 => 0x10e },
-	'approved' => { 348 => 'Approved' },
-	'approvedby' => { 348 => 'ApprovedBy' },
-	'approximatefnumber' => { 243 => 0x313, 249 => 0x3406 },
-	'approximatefocusdistance' => { 340 => 'ApproximateFocusDistance' },
-	'armidentifier' => { 102 => 0x78 },
-	'armversion' => { 102 => 0x7a },
-	'artfilter' => { 228 => 0x529 },
-	'artfiltereffect' => { 228 => 0x52f },
-	'artist' => { 93 => 0x13b, 239 => 'Artist', 278 => 0x22e, 361 => 'Artist', 365 => 'artist' },
-	'artmode' => { 89 => 0x301b },
-	'artmodeparameters' => { 89 => 0x310b },
-	'artworkcopyrightnotice' => { 352 => [\'ArtworkOrObject','ArtworkOrObjectAOCopyrightNotice'] },
-	'artworkcreator' => { 352 => [\'ArtworkOrObject','ArtworkOrObjectAOCreator'] },
-	'artworkdatecreated' => { 352 => [\'ArtworkOrObject','ArtworkOrObjectAODateCreated'] },
-	'artworkorobject' => { 352 => 'ArtworkOrObject' },
-	'artworksource' => { 352 => [\'ArtworkOrObject','ArtworkOrObjectAOSource'] },
-	'artworksourceinventoryno' => { 352 => [\'ArtworkOrObject','ArtworkOrObjectAOSourceInvNo'] },
-	'artworktitle' => { 352 => [\'ArtworkOrObject','ArtworkOrObjectAOTitle'] },
-	'aspectframe' => { 232 => 0x1113 },
-	'aspectratio' => { 3 => 0x0, 232 => 0x1112, 278 => 0x80, 307 => 0x55, 308 => 0x55, 309 => 0xa },
-	'asshoticcprofile' => { 93 => 0xc68f },
-	'asshotneutral' => { 93 => 0xc628 },
-	'asshotpreprofilematrix' => { 93 => 0xc690 },
-	'asshotprofilename' => { 93 => 0xc6f6 },
-	'asshotwhitexy' => { 93 => 0xc629 },
-	'assignbktbutton' => { 218 => '4.2' },
-	'assignfuncbutton' => { 66 => 0x70b },
-	'assistbuttonfunction' => { 64 => 0xd },
-	'attributionname' => { 341 => 'attributionName' },
-	'attributionurl' => { 341 => 'attributionURL' },
-	'audio' => { 247 => 0x20 },
-	'audiobitrate' => { 52 => 0x6c },
-	'audiochannels' => { 52 => 0x70 },
-	'audiochanneltype' => { 365 => 'audioChannelType' },
-	'audiocompression' => { 122 => 'Compression' },
-	'audiocompressor' => { 365 => 'audioCompressor' },
-	'audioduration' => { 101 => 0x99 },
-	'audiomoddate' => { 365 => 'audioModDate' },
-	'audiooutcue' => { 101 => 0x9a },
-	'audiosamplerate' => { 52 => 0x6e, 365 => 'audioSampleRate' },
-	'audiosampletype' => { 365 => 'audioSampleType' },
-	'audiosamplingrate' => { 101 => 0x97 },
-	'audiosamplingresolution' => { 101 => 0x98 },
-	'audiotype' => { 101 => 0x96 },
-	'author' => { 124 => 'Author', 237 => 'Author', 239 => 'Author', 290 => 'Author', 338 => 'author', 353 => 'Author', 363 => 'Author' },
-	'authorsposition' => { 354 => 'AuthorsPosition' },
-	'autoaperture' => { 269 => '0.1' },
-	'autobracket' => { 303 => 0x19 },
-	'autobracketing' => { 98 => 0x1100, 278 => 0x18 },
-	'autobracketingmode' => { 226 => '12.3' },
-	'autobracketingset' => { 226 => '12.1' },
-	'autobracketmodem' => { 218 => '21.2', 223 => '26.2' },
-	'autobracketorder' => { 148 => 0x43, 218 => '21.3', 223 => '26.3', 224 => '12.2', 225 => '2.2', 226 => '12.2', 227 => '13.2' },
-	'autobracketset' => { 218 => '21.1', 220 => '11.1', 221 => '12.1', 222 => '12.1', 223 => '26.1', 224 => '12.1', 225 => '2.1', 227 => '13.1' },
-	'autobrightness' => { 343 => 'AutoBrightness' },
-	'autocontrast' => { 343 => 'AutoContrast' },
-	'autodistortioncontrol' => { 164 => 0x4 },
-	'autodynamicrange' => { 98 => 0x140b },
-	'autoexposure' => { 343 => 'AutoExposure' },
-	'autoexposurebracketing' => { 60 => 0x10 },
-	'autofocus' => { 231 => 0x209 },
-	'autofp' => { 225 => '7.3', 227 => '31.4' },
-	'autoiso' => { 60 => 0x1, 89 => 0x3008, 219 => '1.1', 225 => '1.1' },
-	'autoisomax' => { 219 => '1.2', 225 => '1.2' },
-	'autoisominshutterspeed' => { 219 => '1.3', 225 => '1.3' },
-	'autolateralca' => { 343 => 'AutoLateralCA' },
-	'autolightingoptimizer' => { 13 => 0xbe, 14 => 0xbf, 17 => 0xbf, 48 => 0x2, 66 => 0x204, 85 => 0x6f },
-	'autolightingoptimizeron' => { 85 => 0x6e },
-	'autoportraitframed' => { 318 => 0x2016 },
-	'autoredeye' => { 211 => 0xfe28a44f },
-	'autorotate' => { 60 => 0x1b },
-	'autoshadows' => { 343 => 'AutoShadows' },
-	'auxiliarylens' => { 178 => 0x82 },
-	'avaperturesetting' => { 259 => 0x13 },
-	'averagelv' => { 151 => 0x38 },
-	'avsettingwithoutlens' => { 66 => 0x707 },
-	'azimuth' => { 132 => 'Azimuth' },
-	'babyage' => { 247 => [0x8010,0x33] },
-	'babyname' => { 247 => 0x66 },
-	'backgroundalpha' => { 360 => 'bgalpha' },
-	'baseexposurecompensation' => { 259 => 0x15 },
-	'baseiso' => { 60 => 0x2, 79 => 0x101c, 249 => 0x312a },
-	'baselineexposure' => { 93 => 0xc62a },
-	'baselineexposureoffset' => { 93 => 0xc7a5 },
-	'baselinenoise' => { 93 => 0xc62b },
-	'baselinesharpness' => { 93 => 0xc62c },
-	'baseurl' => { 363 => 'BaseURL' },
-	'batterylevel' => { 307 => 0x51, 311 => 0xc, 312 => 0x4, 313 => 0x4, 327 => 0x7 },
-	'batteryorder' => { 218 => '12.5', 223 => '13.2', 224 => '2.1' },
-	'batterystate' => { 148 => 0x60, 313 => 0x14 },
-	'batterytemperature' => { 311 => 0x1, 313 => 0x2 },
-	'batteryunknown' => { 311 => 0x2, 313 => 0x0 },
-	'batteryvoltage' => { 291 => 0x2a, 311 => 0x8 },
-	'batteryvoltage1' => { 313 => 0x6 },
-	'batteryvoltage2' => { 313 => 0x8 },
-	'bayergreensplit' => { 93 => 0xc62d },
-	'bayerpattern' => { 106 => 0xf902, 152 => 0x17 },
-	'beatspliceparams' => { 365 => 'beatSpliceParams' },
-	'beatspliceparamsriseindecibel' => { 365 => [\'beatSpliceParams','beatSpliceParamsRiseInDecibel'] },
-	'beatspliceparamsriseintimeduration' => { 365 => [\'beatSpliceParams','beatSpliceParamsRiseInTimeDuration'] },
-	'beatspliceparamsriseintimedurationscale' => { 365 => [\'beatSpliceParams','beatSpliceParamsRiseInTimeDurationScale'] },
-	'beatspliceparamsriseintimedurationvalue' => { 365 => [\'beatSpliceParams','beatSpliceParamsRiseInTimeDurationValue'] },
-	'beatspliceparamsusefilebeatsmarker' => { 365 => [\'beatSpliceParams','beatSpliceParamsUseFileBeatsMarker'] },
-	'beep' => { 218 => '13.1', 219 => '0.1', 220 => '2.1', 221 => '3.1', 222 => '3.1', 223 => '10.1', 225 => '0.1', 227 => '4.1' },
-	'beeppitch' => { 224 => '3.1' },
-	'beepvolume' => { 224 => '4.5' },
-	'bestqualityscale' => { 93 => 0xc65c },
-	'bestshotmode' => { 89 => 0x3007 },
-	'bitdepth' => { 129 => 'BitDepth', 152 => 0x11, 183 => 0x41 },
-	'bitspercomponent' => { 103 => 0x87 },
-	'bitspersample' => { 93 => 0x102, 361 => 'BitsPerSample' },
-	'blacklevel' => { 93 => 0xc61a, 233 => 0x1012 },
-	'blacklevel2' => { 232 => 0x600, 236 => 0x600 },
-	'blackleveldeltah' => { 93 => 0xc61b },
-	'blackleveldeltav' => { 93 => 0xc61c },
-	'blacklevelrepeatdim' => { 93 => 0xc619 },
-	'blackpoint' => { 278 => 0x200 },
-	'blacks2012' => { 343 => 'Blacks2012' },
-	'bleachbypasstoning' => { 278 => 0x7f },
-	'bluebalance' => { 163 => 0x271, 233 => 0x1018, 251 => 0x12, 278 => 0x1b },
-	'bluecurvelimits' => { 84 => 0x1fe },
-	'bluecurvepoints' => { 84 => 0x1d4 },
-	'bluehue' => { 343 => 'BlueHue' },
-	'bluesaturation' => { 343 => 'BlueSaturation' },
-	'blurcontrol' => { 278 => 0x82 },
-	'blurwarning' => { 98 => 0x1300 },
-	'bodybatteryadload' => { 257 => 0x3 },
-	'bodybatteryadnoload' => { 257 => 0x2 },
-	'bodybatterystate' => { 257 => '1.1' },
-	'bodybatteryvoltage1' => { 257 => 0x2 },
-	'bodybatteryvoltage2' => { 257 => 0x4 },
-	'bodybatteryvoltage3' => { 257 => 0x6 },
-	'bodybatteryvoltage4' => { 257 => 0x8 },
-	'bodyfirmware' => { 296 => 0x0 },
-	'bodyfirmwareversion' => { 229 => 0x104, 230 => 0x100, 233 => 0x104 },
-	'bodyserialnumber' => { 296 => 0x10 },
-	'bracketmode' => { 44 => 0x3 },
-	'bracketsequence' => { 89 => 0x301d },
-	'bracketshotnumber' => { 44 => 0x5, 259 => 0x9, 317 => 0x2b },
-	'bracketshotnumber2' => { 317 => 0x2d },
-	'bracketstep' => { 145 => 0xe },
-	'bracketvalue' => { 44 => 0x4 },
-	'brightness' => { 93 => 0xfe53, 123 => 'Brightness', 145 => 0x2c, 180 => 0x34, 291 => 0x25, 307 => 0x22, 318 => 0x2007, 343 => 'Brightness' },
-	'brightnessadj' => { 84 => 0x114, 204 => 0x0, 214 => 0x2d, 329 => 0x8018 },
-	'brightnessvalue' => { 93 => 0x9203, 151 => [0x691,0x49c3], 233 => 0x1003, 347 => 'BrightnessValue' },
-	'bulbduration' => { 60 => 0x18 },
-	'burstmode' => { 109 => 0xa, 247 => 0x2a },
-	'burstmode2' => { 109 => 0x18 },
-	'burstshot' => { 303 => 0x34 },
-	'buttonfunctioncontroloff' => { 66 => 0x70a },
-	'bwfilter' => { 145 => 0x2a, 153 => 0x39 },
-	'bwmode' => { 233 => 0x203 },
-	'by-line' => { 101 => 0x50 },
-	'by-linetitle' => { 101 => 0x55 },
-	'bytecount' => { 356 => 'byteCount' },
-	'calibration' => { 303 => [0x24,0x30] },
-	'calibrationilluminant1' => { 93 => 0xc65a },
-	'calibrationilluminant2' => { 93 => 0xc65b },
-	'cameraangle' => { 365 => 'cameraAngle' },
-	'cameracalibration1' => { 93 => 0xc623 },
-	'cameracalibration2' => { 93 => 0xc624 },
-	'cameracalibrationsig' => { 93 => 0xc6f3 },
-	'cameracolorcalibration01' => { 29 => 0x0, 35 => 0xba },
-	'cameracolorcalibration02' => { 29 => 0x4, 35 => 0xbf },
-	'cameracolorcalibration03' => { 29 => 0x8, 35 => 0xc4 },
-	'cameracolorcalibration04' => { 29 => 0xc, 35 => 0xc9 },
-	'cameracolorcalibration05' => { 29 => 0x10, 35 => 0xce },
-	'cameracolorcalibration06' => { 29 => 0x14, 35 => 0xd3 },
-	'cameracolorcalibration07' => { 29 => 0x18, 35 => 0xd8 },
-	'cameracolorcalibration08' => { 29 => 0x1c, 35 => 0xdd },
-	'cameracolorcalibration09' => { 29 => 0x20, 35 => 0xe2 },
-	'cameracolorcalibration10' => { 29 => 0x24, 35 => 0xe7 },
-	'cameracolorcalibration11' => { 29 => 0x28, 35 => 0xec },
-	'cameracolorcalibration12' => { 29 => 0x2c, 35 => 0xf1 },
-	'cameracolorcalibration13' => { 29 => 0x30, 35 => 0xf6 },
-	'cameracolorcalibration14' => { 29 => 0x34, 35 => 0xfb },
-	'cameracolorcalibration15' => { 29 => 0x38, 35 => 0x100 },
-	'cameraid' => { 233 => 0x209, 302 => 0x209 },
-	'cameraiso' => { 27 => 0x10 },
-	'cameralabel' => { 93 => 0xc7a1, 365 => 'cameraLabel' },
-	'cameramodel' => { 365 => 'cameraModel' },
-	'cameramove' => { 365 => 'cameraMove' },
-	'cameraorientation' => { 4 => 0x30, 6 => 0x7d, 8 => 0x30, 10 => 0x35, 11 => 0x30, 12 => 0x30, 13 => 0x31, 14 => 0x31, 15 => 0x35, 16 => 0x27, 17 => 0x31, 18 => 0x7d, 19 => 0x38, 20 => 0x36, 21 => 0x7d, 22 => 0x83, 23 => 0x35, 280 => 0x1, 313 => 0x18, 323 => 0x28, 324 => 0x24 },
-	'cameraowner' => { 110 => 0xc353 },
-	'cameraparameters' => { 233 => 0x2050 },
-	'cameraprofile' => { 343 => 'CameraProfile' },
-	'cameraprofiledigest' => { 343 => 'CameraProfileDigest' },
-	'cameraserialnumber' => { 93 => 0xc62f, 143 => 'CameraSerialNumber' },
-	'camerasettingsversion' => { 228 => 0x0 },
-	'cameratemperature' => { 4 => 0x18, 6 => 0x1b, 8 => 0x18, 10 => 0x19, 11 => 0x18, 12 => 0x18, 13 => 0x19, 14 => 0x19, 15 => 0x19, 16 => 0x17, 17 => 0x19, 18 => 0x1b, 19 => 0x19, 20 => 0x19, 21 => 0x1b, 22 => 0x1b, 23 => 0x19, 24 => [0x87,0x91], 25 => [0x99,0x9f,0xa4,0xa8,0x105], 26 => [0x64,0x1d2,0x1f7,0x1fa,0x208,0x20c,0x47,0x53,0x5b,0x5c], 60 => 0xc, 243 => 0x320, 249 => 0x3402, 278 => 0x47, 300 => 0x43, 326 => 0x5 },
-	'cameratemperature2' => { 281 => 0xc },
-	'cameratemperature3' => { 281 => 0xe },
-	'cameratemperature4' => { 281 => 0x14 },
-	'cameratemperature5' => { 281 => 0x16 },
-	'cameratemperaturerangemax' => { 95 => 0x5 },
-	'cameratemperaturerangemin' => { 95 => 0x6 },
-	'cameratype' => { 60 => 0x1a, 233 => 0x207 },
-	'cameratype2' => { 229 => 0x100 },
-	'canonexposuremode' => { 27 => 0x14 },
-	'canonfiledescription' => { 79 => 0x805 },
-	'canonfilelength' => { 49 => 0xe },
-	'canonfirmwareversion' => { 49 => 0x7, 79 => 0x80b },
-	'canonflashinfo' => { 79 => 0x1028 },
-	'canonflashmode' => { 27 => 0x4 },
-	'canonimagesize' => { 7 => 0x39, 27 => 0xa },
-	'canonimagetype' => { 49 => 0x6, 79 => 0x815 },
-	'canonmodelid' => { 49 => 0x10, 79 => 0x1834 },
-	'canonvrd' => { 94 => 'CanonVRD' },
-	'caption' => { 338 => 'caption' },
-	'caption-abstract' => { 101 => 0x78 },
-	'captionsauthornames' => { 346 => 'CaptionsAuthorNames' },
-	'captionsdatetimestamps' => { 346 => 'CaptionsDateTimeStamps' },
-	'captionwriter' => { 354 => 'CaptionWriter' },
-	'captureframerate' => { 89 => 0x4001 },
-	'capturesoftware' => { 333 => 'CaptureSoftware' },
-	'cardshutterlock' => { 148 => 0x49 },
-	'casioimagesize' => { 89 => 0x9 },
-	'catalogsets' => { 101 => 0xff, 332 => 'CatalogSets', 336 => 'CatalogSets' },
-	'categories' => { 49 => 0x23, 338 => 'categories' },
-	'category' => { 101 => 0xf, 354 => 'Category' },
-	'ccdboardversion' => { 243 => 0x331 },
-	'ccdscanmode' => { 233 => 0x1039 },
-	'ccdsensitivity' => { 201 => 0x6 },
-	'ccdversion' => { 243 => 0x330 },
-	'cellglobalid' => { 342 => 'cgi' },
-	'celllength' => { 93 => 0x109 },
-	'cellr' => { 342 => 'r' },
-	'celltowerid' => { 342 => 'cellid' },
-	'cellwidth' => { 93 => 0x108 },
-	'centerafarea' => { 225 => '15.1' },
-	'centerfocuspoint' => { 227 => '2.2' },
-	'centerweightedareasize' => { 218 => '7.1', 223 => '5.1', 224 => '7.1', 225 => '6.3', 227 => '8.1' },
-	'certificate' => { 369 => 'Certificate' },
-	'cfapattern' => { 93 => 0xa302, 347 => 'CFAPattern' },
-	'cfapattern2' => { 93 => 0x828e },
-	'cfapatterncolumns' => { 347 => [\'CFAPattern','CFAPatternColumns'] },
-	'cfapatternrows' => { 347 => [\'CFAPattern','CFAPatternRows'] },
-	'cfapatternvalues' => { 347 => [\'CFAPattern','CFAPatternValues'] },
-	'cfarepeatpatterndim' => { 93 => 0x828d },
-	'channel' => { 356 => 'channel' },
-	'channels' => { 122 => 'Channels' },
-	'checkmark' => { 84 => 0x26a },
-	'checkmark2' => { 85 => 0x8e },
-	'childfontfiles' => { 370 => [\'Fonts','FontsChildFontFiles'] },
-	'chmodeshootingspeed' => { 218 => '10.3' },
-	'chromablurradius' => { 93 => 0xc631 },
-	'chromaticaberration' => { 85 => 0x66 },
-	'chromaticaberrationb' => { 343 => 'ChromaticAberrationB' },
-	'chromaticaberrationblue' => { 85 => 0x6b },
-	'chromaticaberrationcorr' => { 62 => [0x4,0x5] },
-	'chromaticaberrationcorrection' => { 268 => 0x1 },
-	'chromaticaberrationon' => { 85 => 0x62 },
-	'chromaticaberrationr' => { 343 => 'ChromaticAberrationR' },
-	'chromaticaberrationred' => { 85 => 0x6a },
-	'chromaticaberrationsetting' => { 63 => 0x6 },
-	'chrominancenoisereduction' => { 85 => 0x5e, 303 => 0x1a },
-	'chrominancenr_tiff_jpeg' => { 85 => 0x60 },
-	'city' => { 101 => 0x5a, 128 => 'City', 247 => 0x6d, 354 => 'City' },
-	'clarity' => { 343 => 'Clarity' },
-	'clarity2012' => { 343 => 'Clarity2012' },
-	'classifystate' => { 101 => 0xe1 },
-	'client' => { 365 => 'client' },
-	'clientname' => { 348 => 'ClientName' },
-	'clmodeshootingspeed' => { 218 => '10.2', 223 => '11.2', 224 => '10.2', 227 => '11.1' },
-	'cmcontrast' => { 236 => 0x2022 },
-	'cmexposurecompensation' => { 236 => 0x2000 },
-	'cmhue' => { 236 => 0x2021 },
-	'cmsaturation' => { 236 => 0x2020 },
-	'cmsharpness' => { 236 => 0x2023 },
-	'cmwhitebalance' => { 236 => 0x2001 },
-	'cmwhitebalancecomp' => { 236 => 0x2002 },
-	'cmwhitebalancegraypoint' => { 236 => 0x2010 },
-	'codec' => { 136 => 'Codec' },
-	'codedcharacterset' => { 102 => 0x5a },
-	'collectionname' => { 137 => [\'Collections','CollectionsCollectionName'] },
-	'collections' => { 137 => 'Collections' },
-	'collectionuri' => { 137 => [\'Collections','CollectionsCollectionURI'] },
-	'coloraberrationcontrol' => { 211 => 0xc89224b },
-	'coloradjustment' => { 303 => 0x14 },
-	'coloradjustmentmode' => { 302 => 0x210 },
-	'coloranta' => { 370 => [\'Colorants','ColorantsA'] },
-	'colorantb' => { 370 => [\'Colorants','ColorantsB'] },
-	'colorantblack' => { 370 => [\'Colorants','ColorantsBlack'] },
-	'colorantblue' => { 370 => [\'Colorants','ColorantsBlue'] },
-	'colorantcyan' => { 370 => [\'Colorants','ColorantsCyan'] },
-	'colorantgreen' => { 370 => [\'Colorants','ColorantsGreen'] },
-	'colorantl' => { 370 => [\'Colorants','ColorantsL'] },
-	'colorantmagenta' => { 370 => [\'Colorants','ColorantsMagenta'] },
-	'colorantmode' => { 370 => [\'Colorants','ColorantsMode'] },
-	'colorantred' => { 370 => [\'Colorants','ColorantsRed'] },
-	'colorants' => { 370 => 'Colorants' },
-	'colorantswatchname' => { 370 => [\'Colorants','ColorantsSwatchName'] },
-	'coloranttint' => { 370 => [\'Colorants','ColorantsTint'] },
-	'coloranttype' => { 370 => [\'Colorants','ColorantsType'] },
-	'colorantyellow' => { 370 => [\'Colorants','ColorantsYellow'] },
-	'colorbalance' => { 123 => 'ColorBalance' },
-	'colorbalanceadj' => { 211 => 0x76a43202 },
-	'colorbalanceblue' => { 145 => 0x1e },
-	'colorbalancegreen' => { 145 => 0x1d },
-	'colorbalancered' => { 145 => 0x1c },
-	'colorblur' => { 85 => 0x65 },
-	'colorbooster' => { 211 => 0x5f0e7d23 },
-	'colorboostlevel' => { 205 => 0x1 },
-	'colorboosttype' => { 205 => 0x0 },
-	'colorclass' => { 285 => 0xde, 286 => 'ColorClass' },
-	'colorcompensationfilter' => { 148 => [0x3a,0x5f], 150 => 0x111, 318 => 0xb022 },
-	'colorcompensationfilterset' => { 307 => 0xd, 308 => 0xc, 309 => 0x18, 319 => 0xf },
-	'colorcontrol' => { 233 => 0x102b },
-	'colorcorrection' => { 329 => 0x8015 },
-	'colordataversion' => { 33 => 0x0, 34 => 0x0, 36 => 0x0, 37 => 0x0 },
-	'coloreffect' => { 247 => 0x28 },
-	'colorfilter' => { 88 => 0x17, 89 => 0x3017, 145 => 0x29, 153 => [0x38,0x4d,0x4f], 283 => 0x17 },
-	'colorgain' => { 183 => 0x51 },
-	'colorhue' => { 178 => 0x8d },
-	'colorimetricreference' => { 93 => 0xc6bf },
-	'colorlabel' => { 346 => 'ColorLabel' },
-	'colormatrix' => { 232 => 0x200, 233 => 0x1011, 300 => 0xa030 },
-	'colormatrix1' => { 93 => 0xc621 },
-	'colormatrix2' => { 93 => 0xc622, 236 => 0x200 },
-	'colormatrixa' => { 278 => 0x203 },
-	'colormatrixadobergb' => { 300 => 0xa032 },
-	'colormatrixb' => { 278 => 0x204 },
-	'colormatrixnumber' => { 233 => 0x1019 },
-	'colormatrixsrgb' => { 300 => 0xa031 },
-	'colormode' => { 89 => 0x3015, 98 => 0x1210, 109 => 0x66, 145 => 0x28, 148 => 0x16, 150 => 0x101, 151 => 0x36, 153 => 0x7, 178 => 0x3, 201 => 0x4, 247 => 0x32, 303 => 0x2c, 318 => 0xb029, 354 => 'ColorMode' },
-	'colormoirereduction' => { 212 => 0x15 },
-	'colormoirereductionmode' => { 212 => 0x5 },
-	'colornoisereduction' => { 329 => 0x8029, 343 => 'ColorNoiseReduction' },
-	'colornoisereductiondetail' => { 343 => 'ColorNoiseReductionDetail' },
-	'colornoisereductionintensity' => { 212 => 0x18 },
-	'colornoisereductionsharpness' => { 212 => 0x1c },
-	'colorplanes' => { 97 => 0x2 },
-	'colorprofile' => { 145 => 0x33 },
-	'colorrepresentation' => { 103 => 0x3c },
-	'colorsequence' => { 103 => 0x41 },
-	'colorspace' => { 38 => 0x3, 49 => 0xb4, 79 => 0x10b4, 93 => 0xa001, 129 => 'ColorSpace', 146 => 0x2f, 147 => 0x25, 148 => 0x17, 178 => 0x1e, 228 => 0x507, 278 => 0x37, 300 => 0xa011, 303 => 0xb, 307 => 0x1b, 308 => 0x83, 309 => 0xe, 319 => 0x6, 347 => 'ColorSpace' },
-	'colortempasshot' => { 30 => 0x4, 31 => 0x1d, 32 => 0x26, 33 => 0x43, 36 => 0x43, 37 => 0x43 },
-	'colortempauto' => { 30 => 0x9, 31 => 0x22, 32 => 0x1c, 33 => 0x48, 36 => 0x48, 37 => 0x48 },
-	'colortempcloudy' => { 30 => 0x22, 31 => 0x31, 32 => 0x35, 33 => 0x5c, 36 => 0x75, 37 => 0x8e, 278 => 0x55 },
-	'colortempcustom' => { 33 => 0x84 },
-	'colortempcustom1' => { 31 => 0x45 },
-	'colortempcustom2' => { 31 => 0x4a },
-	'colortempdaylight' => { 30 => 0x18, 31 => 0x27, 32 => 0x2b, 33 => 0x52, 36 => 0x6b, 37 => 0x84, 278 => 0x53 },
-	'colortemperature' => { 4 => 0x73, 5 => [0x48,0x4e], 6 => 0xc0, 7 => 0x37, 8 => 0x62, 9 => 0x37, 10 => 0x7c, 11 => 0x73, 12 => 0x73, 13 => 0x77, 14 => 0x73, 15 => 0x7c, 16 => 0x58, 17 => 0x73, 18 => 0xc0, 19 => 0x7f, 20 => 0x7d, 21 => 0xc0, 22 => 0xc6, 23 => 0x7b, 49 => 0xae, 58 => 0x9, 79 => 0x10ae, 98 => 0x1005, 107 => 0x846, 123 => 'ColorTemperature', 146 => [0x6e,0x49], 147 => 0x3f, 148 => [0x39,0x5e], 150 => 0x10b, 153 => [0x3c,0x4c,0x4e], 243 => 0x321, 278 => 0x50, 318 => 0xb021, 343 => 'Temperature' },
-	'colortemperatureadj' => { 329 => 0x8013 },
-	'colortemperaturebg' => { 233 => 0x1013 },
-	'colortemperaturerg' => { 233 => 0x1014 },
-	'colortemperaturesetting' => { 148 => 0x25, 307 => 0xc, 308 => 0xb, 309 => 0x17, 319 => 0xe },
-	'colortempflash' => { 30 => 0x36, 31 => 0x40, 32 => 0x49, 33 => 0x70, 36 => 0x89, 37 => 0xa2, 278 => 0x5a },
-	'colortempflashdata' => { 33 => 0x24a },
-	'colortempfluorescent' => { 30 => 0x2c, 31 => 0x3b, 32 => 0x3f, 33 => 0x66, 36 => 0x7f, 37 => 0x98 },
-	'colortempfluorescentd' => { 278 => 0x57 },
-	'colortempfluorescentn' => { 278 => 0x58 },
-	'colortempfluorescentw' => { 278 => 0x59 },
-	'colortempkelvin' => { 30 => 0x31, 32 => 0x44, 33 => 0x6b, 36 => 0x84, 37 => 0x9d, 247 => 0x44 },
-	'colortempmeasured' => { 30 => 0xe, 33 => 0x4d, 36 => 0x4d, 37 => 0x4d },
-	'colortemppc1' => { 32 => 0x94, 33 => 0x75 },
-	'colortemppc2' => { 32 => 0x99, 33 => 0x7a },
-	'colortemppc3' => { 32 => 0x9e, 33 => 0x7f },
-	'colortempshade' => { 30 => 0x1d, 31 => 0x2c, 32 => 0x30, 33 => 0x57, 36 => 0x70, 37 => 0x89, 278 => 0x54 },
-	'colortemptungsten' => { 30 => 0x27, 31 => 0x36, 32 => 0x3a, 33 => 0x61, 36 => 0x7a, 37 => 0x93, 278 => 0x56 },
-	'colortempunknown' => { 30 => 0x13, 32 => 0x21, 36 => 0x52, 37 => 0x52 },
-	'colortempunknown10' => { 30 => 0x63, 32 => 0x76, 36 => 0xa2, 37 => 0x7f },
-	'colortempunknown11' => { 30 => 0x68, 32 => 0x7b, 36 => 0xa7, 37 => 0xa7 },
-	'colortempunknown12' => { 30 => 0x6d, 32 => 0x80, 36 => 0xac, 37 => 0xac },
-	'colortempunknown13' => { 30 => 0x72, 32 => 0x85, 36 => 0xb1, 37 => 0xb1 },
-	'colortempunknown14' => { 32 => 0x8a, 36 => 0xb6, 37 => 0xb6 },
-	'colortempunknown15' => { 32 => 0x8f, 36 => 0xbb, 37 => 0xbb },
-	'colortempunknown16' => { 32 => 0xa3, 37 => 0xc0 },
-	'colortempunknown17' => { 37 => 0xc5 },
-	'colortempunknown18' => { 37 => 0xca },
-	'colortempunknown19' => { 37 => 0xcf },
-	'colortempunknown2' => { 30 => 0x3b, 32 => 0x4e, 36 => 0x57, 37 => 0x57 },
-	'colortempunknown20' => { 37 => 0xd4 },
-	'colortempunknown3' => { 30 => 0x40, 32 => 0x53, 36 => 0x5c, 37 => 0x5c },
-	'colortempunknown4' => { 30 => 0x45, 32 => 0x58, 36 => 0x61, 37 => 0x61 },
-	'colortempunknown5' => { 30 => 0x4a, 32 => 0x5d, 36 => 0x66, 37 => 0x66 },
-	'colortempunknown6' => { 30 => 0x4f, 32 => 0x62, 36 => 0x8e, 37 => 0x6b },
-	'colortempunknown7' => { 30 => 0x54, 32 => 0x67, 36 => 0x93, 37 => 0x70 },
-	'colortempunknown8' => { 30 => 0x59, 32 => 0x6c, 36 => 0x98, 37 => 0x75 },
-	'colortempunknown9' => { 30 => 0x5e, 32 => 0x71, 36 => 0x9d, 37 => 0x7a },
-	'colortone' => { 7 => 0x6f, 9 => 0x77, 27 => 0x2a, 38 => 0x2 },
-	'colortoneadj' => { 84 => 0x11e },
-	'colortonefaithful' => { 16 => 0x107, 54 => 0x6c, 55 => 0x6c },
-	'colortonelandscape' => { 16 => 0x105, 54 => 0x3c, 55 => 0x3c },
-	'colortonemonochrome' => { 54 => 0x84, 55 => 0x84 },
-	'colortoneneutral' => { 16 => 0x106, 54 => 0x54, 55 => 0x54 },
-	'colortoneportrait' => { 16 => 0x104, 54 => 0x24, 55 => 0x24 },
-	'colortonestandard' => { 16 => 0x103, 54 => 0xc, 55 => 0xc },
-	'colortoneunknown' => { 55 => 0x9c },
-	'colortoneuserdef1' => { 16 => 0x109, 54 => 0x9c, 55 => 0xb4 },
-	'colortoneuserdef2' => { 16 => 0x10a, 54 => 0xb4, 55 => 0xcc },
-	'colortoneuserdef3' => { 16 => 0x10b, 54 => 0xcc, 55 => 0xe4 },
-	'commanddials' => { 225 => '5.1' },
-	'commanddialsaperturesetting' => { 218 => '17.3', 223 => '33.3', 224 => '17.3' },
-	'commanddialschangemainsub' => { 218 => '17.2', 223 => '33.2', 224 => '17.2' },
-	'commanddialsmenuandplayback' => { 218 => '17.4', 223 => '33.4', 224 => '17.4' },
-	'commanddialsreverserotation' => { 218 => '17.1', 220 => '16.2', 221 => '17.2', 223 => '33.1', 224 => '17.1', 227 => '18.1' },
-	'commanderchannel' => { 225 => '10.2', 226 => '25.2' },
-	'commandergroupa_ttl-aacomp' => { 225 => '13.1', 226 => '31.1' },
-	'commandergroupa_ttlcomp' => { 227 => '32.1' },
-	'commandergroupamanualoutput' => { 225 => '13.2', 226 => '28.2' },
-	'commandergroupamode' => { 225 => '11.2', 226 => '28.1' },
-	'commandergroupb_ttl-aacomp' => { 225 => '14.1', 226 => '32.1' },
-	'commandergroupb_ttlcomp' => { 227 => '33.1' },
-	'commandergroupbmanualoutput' => { 225 => '14.2', 226 => '29.2' },
-	'commandergroupbmode' => { 225 => '11.3', 226 => '29.1' },
-	'commanderinternalflash' => { 225 => '11.1', 226 => '27.1' },
-	'commanderinternalmanualoutput' => { 225 => '12.2', 226 => '27.2' },
-	'commanderinternalttlchannel' => { 223 => '18.2' },
-	'commanderinternalttlcomp' => { 225 => '12.1', 226 => '30.2', 227 => '31.2' },
-	'commanderinternalttlcompbuiltin' => { 223 => '20.1', 224 => '26.1' },
-	'commanderinternalttlcompgroupa' => { 223 => '21.1', 224 => '27.1' },
-	'commanderinternalttlcompgroupb' => { 223 => '22.1', 224 => '28.1' },
-	'comment' => { 0 => 0x2, 94 => 'Comment', 124 => 'Comment', 239 => 'Comment' },
-	'complianceprofile' => { 356 => 'complianceProfile' },
-	'componentsconfiguration' => { 93 => 0x9101, 129 => 'Components', 347 => 'ComponentsConfiguration' },
-	'componentversion' => { 79 => 0x80c },
-	'composer' => { 365 => 'composer' },
-	'compositionadjust' => { 277 => '0.1' },
-	'compositionadjustrotation' => { 277 => 0x7 },
-	'compositionadjustx' => { 277 => 0x5 },
-	'compositionadjusty' => { 277 => 0x6 },
-	'compressedbitsperpixel' => { 93 => 0x9102, 347 => 'CompressedBitsPerPixel' },
-	'compressedimagesize' => { 150 => 0x40, 233 => 0x40 },
-	'compression' => { 93 => 0x103, 361 => 'Compression' },
-	'compressionfactor' => { 228 => 0x50d },
-	'compressionratio' => { 129 => 'Compression', 233 => 0x1034 },
-	'confidencelevel' => { 339 => 'ConfidenceLevel' },
-	'constrainedcropheight' => { 84 => 0x266, 285 => 0xd6 },
-	'constrainedcropwidth' => { 84 => 0x262, 285 => 0xd5 },
-	'contact' => { 101 => 0x76 },
-	'contentlocationcode' => { 101 => 0x1a },
-	'contentlocationname' => { 101 => 0x1b },
-	'continuousbracketing' => { 148 => 0x20 },
-	'continuousdrive' => { 27 => 0x5 },
-	'continuousshootingspeed' => { 66 => 0x610 },
-	'continuousshotlimit' => { 66 => 0x611 },
-	'contrast' => { 7 => 0x73, 9 => 0x75, 27 => 0xd, 88 => 0xc, 89 => [0x3012,0x20], 93 => [0xa408,0xfe54], 98 => [0x1004,0x1006], 123 => 'Contrast', 145 => 0x20, 146 => 0x31, 147 => 0x27, 148 => 0x19, 153 => 0x2, 180 => 0x33, 233 => 0x1029, 247 => 0x39, 249 => 0x300a, 278 => 0x20, 283 => 0xc, 291 => 0x24, 303 => 0xd, 307 => 0x1d, 308 => 0x1a, 318 => 0x2004, 343 => 'Contrast', 347 => 'Contrast' },
-	'contrast2012' => { 343 => 'Contrast2012' },
-	'contrastadj' => { 84 => 0x115, 214 => 0x2c, 329 => 0x8017 },
-	'contrastcurve' => { 178 => 0x8c },
-	'contrastdetectaf' => { 156 => 0x4 },
-	'contrastdetectafarea' => { 278 => 0x231 },
-	'contrastdetectafinfocus' => { 156 => 0x1c },
-	'contrastfaithful' => { 16 => 0xec, 54 => 0x60, 55 => 0x60 },
-	'contrasthighlight' => { 278 => 0x6d },
-	'contrasthighlightshadowadj' => { 278 => 0x6f },
-	'contrastlandscape' => { 16 => 0xea, 54 => 0x30, 55 => 0x30 },
-	'contrastmode' => { 247 => 0x2c },
-	'contrastmonochrome' => { 16 => 0xed, 54 => 0x78, 55 => 0x78 },
-	'contrastneutral' => { 16 => 0xeb, 54 => 0x48, 55 => 0x48 },
-	'contrastportrait' => { 16 => 0xe9, 54 => 0x18, 55 => 0x18 },
-	'contrastsetting' => { 228 => 0x505, 236 => 0x1012, 309 => 0x10, 319 => 0x8 },
-	'contrastshadow' => { 278 => 0x6e },
-	'contraststandard' => { 16 => 0xe8, 54 => 0x0, 55 => 0x0 },
-	'contrastunknown' => { 55 => 0x90 },
-	'contrastuserdef1' => { 16 => 0xee, 54 => 0x90, 55 => 0xa8 },
-	'contrastuserdef2' => { 16 => 0xef, 54 => 0xa8, 55 => 0xc0 },
-	'contrastuserdef3' => { 16 => 0xf0, 54 => 0xc0, 55 => 0xd8 },
-	'contributedmedia' => { 365 => 'contributedMedia' },
-	'contributedmediaduration' => { 365 => [\'contributedMedia','contributedMediaDuration'] },
-	'contributedmediadurationscale' => { 365 => [\'contributedMedia','contributedMediaDurationScale'] },
-	'contributedmediadurationvalue' => { 365 => [\'contributedMedia','contributedMediaDurationValue'] },
-	'contributedmediamanaged' => { 365 => [\'contributedMedia','contributedMediaManaged'] },
-	'contributedmediapath' => { 365 => [\'contributedMedia','contributedMediaPath'] },
-	'contributedmediastarttime' => { 365 => [\'contributedMedia','contributedMediaStartTime'] },
-	'contributedmediastarttimescale' => { 365 => [\'contributedMedia','contributedMediaStartTimeScale'] },
-	'contributedmediastarttimevalue' => { 365 => [\'contributedMedia','contributedMediaStartTimeValue'] },
-	'contributedmediatrack' => { 365 => [\'contributedMedia','contributedMediaTrack'] },
-	'contributedmediawebstatement' => { 365 => [\'contributedMedia','contributedMediaWebStatement'] },
-	'contributor' => { 344 => 'contributor' },
-	'contributors' => { 124 => 'Contributors' },
-	'controldialset' => { 148 => 0x46 },
-	'controlledvocabularyterm' => { 352 => 'CVterm' },
-	'controllerboardversion' => { 243 => 0x332 },
-	'controlmode' => { 60 => 0x12 },
-	'conversionlens' => { 229 => 0x403, 247 => 0x35 },
-	'converter' => { 93 => 0xfe4d, 201 => 0xb, 343 => 'Converter' },
-	'converttograyscale' => { 343 => 'ConvertToGrayscale' },
-	'copyright' => { 0 => 0x3, 93 => 0x8298, 124 => 'Copyright', 239 => 'Copyright', 278 => 0x22f, 290 => 'Copyright', 353 => 'Copyright', 356 => 'copyright', 358 => 'copyright', 361 => 'Copyright', 365 => 'copyright' },
-	'copyrightflag' => { 288 => 0x40a },
-	'copyrightnotice' => { 101 => 0x74 },
-	'copyrightowner' => { 355 => 'CopyrightOwner' },
-	'copyrightownerid' => { 355 => [\'CopyrightOwner','CopyrightOwnerCopyrightOwnerID'] },
-	'copyrightownerimageid' => { 355 => 'CopyrightOwnerImageID' },
-	'copyrightownername' => { 355 => [\'CopyrightOwner','CopyrightOwnerCopyrightOwnerName'] },
-	'copyrightregistrationnumber' => { 355 => 'CopyrightRegistrationNumber' },
-	'copyrightstatus' => { 355 => 'CopyrightStatus' },
-	'coringfilter' => { 232 => 0x310, 233 => 0x102d, 236 => 0x310 },
-	'coringvalues' => { 232 => 0x311, 236 => 0x311 },
-	'corporateentity' => { 356 => 'corporateEntity' },
-	'country' => { 128 => 'Country', 247 => 0x69, 354 => 'Country' },
-	'country-primarylocationcode' => { 101 => 0x64 },
-	'country-primarylocationname' => { 101 => 0x65 },
-	'countrycode' => { 177 => 0x5, 286 => 'CountryCode', 351 => 'CountryCode' },
-	'coverage' => { 344 => 'coverage' },
-	'coverdate' => { 356 => 'coverDate' },
-	'coverdisplaydate' => { 356 => 'coverDisplayDate' },
-	'cpufirmwareversion' => { 278 => 0x28 },
-	'crc32' => { 345 => 'crc32' },
-	'createdate' => { 93 => 0x9004, 124 => 'CreateDate', 237 => 'CreationDate', 239 => 'create-date', 290 => 'CreationDate', 363 => 'CreateDate' },
-	'creationdate' => { 353 => 'CreationDate', 356 => 'creationDate' },
-	'creationtime' => { 239 => 'Creation Time' },
-	'creativestyle' => { 307 => 0x1a, 308 => 0x18, 317 => 0x41, 318 => 0xb020 },
-	'creativestylesetting' => { 309 => 0xf, 319 => 0x7 },
-	'creativestylewaschanged' => { 329 => 0x8001 },
-	'creator' => { 237 => 'Creator', 290 => 'Creator', 344 => 'creator', 353 => 'Creator' },
-	'creatoraddress' => { 351 => [\'CreatorContactInfo','CreatorContactInfoCiAdrExtadr'] },
-	'creatorcity' => { 351 => [\'CreatorContactInfo','CreatorContactInfoCiAdrCity'] },
-	'creatorcontactinfo' => { 351 => 'CreatorContactInfo' },
-	'creatorcountry' => { 351 => [\'CreatorContactInfo','CreatorContactInfoCiAdrCtry'] },
-	'creatorpostalcode' => { 351 => [\'CreatorContactInfo','CreatorContactInfoCiAdrPcode'] },
-	'creatorregion' => { 351 => [\'CreatorContactInfo','CreatorContactInfoCiAdrRegion'] },
-	'creatortool' => { 363 => 'CreatorTool' },
-	'creatorworkemail' => { 351 => [\'CreatorContactInfo','CreatorContactInfoCiEmailWork'] },
-	'creatorworktelephone' => { 351 => [\'CreatorContactInfo','CreatorContactInfoCiTelWork'] },
-	'creatorworkurl' => { 351 => [\'CreatorContactInfo','CreatorContactInfoCiUrlWork'] },
-	'credit' => { 101 => 0x6e, 354 => 'Credit' },
-	'creditline' => { 358 => 'creditLine' },
-	'creditlinereq' => { 368 => 'CreditLineReq' },
-	'creditlinerequired' => { 355 => 'CreditLineRequired' },
-	'cropactive' => { 84 => 0x244 },
-	'cropangle' => { 343 => 'CropAngle' },
-	'cropaspectratio' => { 84 => 0x260 },
-	'cropbottom' => { 97 => 0x9, 206 => 0x36, 285 => 0xdc, 343 => 'CropBottom' },
-	'cropbottommargin' => { 40 => 0x3 },
-	'cropcircleactive' => { 85 => 0xd6 },
-	'cropcircleradius' => { 85 => 0xd9 },
-	'cropcirclex' => { 85 => 0xd7 },
-	'cropcircley' => { 85 => 0xd8 },
-	'cropconstraintowarp' => { 343 => 'CropConstrainToWarp' },
-	'croph' => { 337 => 'CropH' },
-	'cropheight' => { 84 => 0x24c, 232 => 0x615, 236 => 0x615, 343 => 'CropHeight' },
-	'crophispeed' => { 178 => 0x1b },
-	'cropleft' => { 84 => 0x246, 97 => 0x6, 206 => 0x1e, 232 => 0x612, 236 => 0x612, 285 => 0xd9, 343 => 'CropLeft' },
-	'cropleftmargin' => { 40 => 0x0 },
-	'cropoutputheight' => { 206 => 0xce },
-	'cropoutputheightinches' => { 206 => 0x96 },
-	'cropoutputpixels' => { 206 => 0xd6 },
-	'cropoutputresolution' => { 206 => 0xb6 },
-	'cropoutputscale' => { 206 => 0xbe },
-	'cropoutputwidth' => { 206 => 0xc6 },
-	'cropoutputwidthinches' => { 206 => 0x8e },
-	'croppedareaimageheightpixels' => { 333 => 'CroppedAreaImageHeightPixels' },
-	'croppedareaimagewidthpixels' => { 333 => 'CroppedAreaImageWidthPixels' },
-	'croppedarealeftpixels' => { 333 => 'CroppedAreaLeftPixels' },
-	'croppedareatoppixels' => { 333 => 'CroppedAreaTopPixels' },
-	'croppedimageheight' => { 3 => 0x2 },
-	'croppedimageleft' => { 3 => 0x3 },
-	'croppedimagetop' => { 3 => 0x4 },
-	'croppedimagewidth' => { 3 => 0x1 },
-	'cropright' => { 97 => 0x8, 206 => 0x2e, 285 => 0xdb, 343 => 'CropRight' },
-	'croprightmargin' => { 40 => 0x1 },
-	'croprotation' => { 97 => 0xb },
-	'cropscaledresolution' => { 206 => 0x9e },
-	'cropsourceresolution' => { 206 => 0xae },
-	'croptop' => { 84 => 0x248, 97 => 0x7, 206 => 0x26, 232 => 0x613, 236 => 0x613, 285 => 0xda, 343 => 'CropTop' },
-	'croptopmargin' => { 40 => 0x2 },
-	'cropunit' => { 343 => 'CropUnit' },
-	'cropunits' => { 343 => 'CropUnits' },
-	'cropw' => { 337 => 'CropW' },
-	'cropwidth' => { 84 => 0x24a, 232 => 0x614, 236 => 0x614, 343 => 'CropWidth' },
-	'cropx' => { 337 => 'CropX' },
-	'cropy' => { 337 => 'CropY' },
-	'crossprocess' => { 278 => 0x7b },
-	'crossprocessparams' => { 278 => 0x235 },
-	'currenticcprofile' => { 93 => 0xc691 },
-	'currentpreprofilematrix' => { 93 => 0xc692 },
-	'currentversion' => { 329 => 0xd000 },
-	'curve0x' => { 337 => 'Curve0x' },
-	'curve0y' => { 337 => 'Curve0y' },
-	'curve1x' => { 337 => 'Curve1x' },
-	'curve1y' => { 337 => 'Curve1y' },
-	'curve2x' => { 337 => 'Curve2x' },
-	'curve2y' => { 337 => 'Curve2y' },
-	'curve3x' => { 337 => 'Curve3x' },
-	'curve3y' => { 337 => 'Curve3y' },
-	'curve4x' => { 337 => 'Curve4x' },
-	'curve4y' => { 337 => 'Curve4y' },
-	'curves' => { 211 => 0x76a43201 },
-	'custom1' => { 355 => 'Custom1' },
-	'custom10' => { 355 => 'Custom10' },
-	'custom2' => { 355 => 'Custom2' },
-	'custom3' => { 355 => 'Custom3' },
-	'custom4' => { 355 => 'Custom4' },
-	'custom5' => { 355 => 'Custom5' },
-	'custom6' => { 355 => 'Custom6' },
-	'custom7' => { 355 => 'Custom7' },
-	'custom8' => { 355 => 'Custom8' },
-	'custom9' => { 355 => 'Custom9' },
-	'customcontrast' => { 85 => 0x4e },
-	'customcontrols' => { 66 => 0x70c },
-	'customdefaultunsharpfineness' => { 85 => 0xbe },
-	'customdefaultunsharpstrength' => { 85 => 0xbc },
-	'customdefaultunsharpthreshold' => { 85 => 0xc0 },
-	'customlinear' => { 85 => 0x4f },
-	'customoutputhighlightpoint' => { 85 => 0x53 },
-	'customoutputshadowpoint' => { 85 => 0x54 },
-	'custompicturestylefilename' => { 49 => 0x4010 },
-	'customrawhighlight' => { 85 => 0x7c },
-	'customrawhighlightpoint' => { 85 => 0x51 },
-	'customrawshadow' => { 85 => 0x85 },
-	'customrawshadowpoint' => { 85 => 0x52 },
-	'customrendered' => { 93 => 0xa401, 347 => 'CustomRendered' },
-	'customsaturation' => { 228 => 0x503 },
-	'customsettingsalldefault' => { 218 => '0.2', 223 => '0.2' },
-	'customsettingsbank' => { 218 => '0.1', 223 => '0.1' },
-	'customsharpness' => { 85 => 0x50 },
-	'customunsharpmaskfineness' => { 85 => 0xb8 },
-	'customunsharpmaskstrength' => { 85 => 0xb6 },
-	'customunsharpmaskthreshold' => { 85 => 0xba },
-	'customwb_rblevels' => { 319 => 0x1a },
-	'customwb_rgblevels' => { 309 => 0x19 },
-	'customwbbluelevel' => { 148 => 0x36 },
-	'customwberror' => { 148 => 0x37 },
-	'customwbgreenlevel' => { 148 => 0x35 },
-	'customwbredlevel' => { 148 => 0x34 },
-	'customwbsetting' => { 148 => 0x26 },
-	'd-lightinghq' => { 211 => 0x2175eb78 },
-	'd-lightinghqcolorboost' => { 207 => 0x2 },
-	'd-lightinghqhighlight' => { 207 => 0x1 },
-	'd-lightinghqselected' => { 211 => 0x6a6e36b6 },
-	'd-lightinghqshadow' => { 207 => 0x0 },
-	'd-lightinghs' => { 211 => 0xce5554aa },
-	'd-lightinghsadjustment' => { 208 => 0x0 },
-	'd-lightinghscolorboost' => { 208 => 0x1 },
-	'd-rangeoptimizerhighlight' => { 329 => 0x8024 },
-	'd-rangeoptimizermode' => { 329 => 0x8022 },
-	'd-rangeoptimizershadow' => { 329 => 0x802d },
-	'd-rangeoptimizervalue' => { 329 => 0x8023 },
-	'datacompressionmethod' => { 103 => 0x6e },
-	'dataimprint' => { 145 => 0x34 },
-	'date' => { 278 => 0x6, 344 => 'date' },
-	'dateacquired' => { 143 => 'DateAcquired' },
-	'datecreated' => { 101 => 0x37, 354 => 'DateCreated' },
-	'datedisplayformat' => { 203 => 0x3 },
-	'dateidentified' => { 92 => [\'Identification','IdentificationDateIdentified'] },
-	'dateimprint' => { 220 => '4.2' },
-	'daterecieved' => { 356 => 'dateRecieved' },
-	'datesent' => { 102 => 0x46 },
-	'datestampmode' => { 49 => 0x1c },
-	'datetime' => { 338 => 'datetime', 361 => 'DateTime' },
-	'datetimedigitized' => { 347 => 'DateTimeDigitized' },
-	'datetimeoriginal' => { 82 => 0x0, 93 => 0x9003, 121 => 0x14, 124 => 'OriginalDate', 291 => 0xb, 347 => 'DateTimeOriginal' },
-	'datetimestamp' => { 109 => 0x64 },
-	'daylightsavings' => { 61 => 0x3, 203 => 0x2 },
-	'dccontinent' => { 92 => [\'dctermsLocation','dctermsLocationContinent'] },
-	'dccoordinateprecision' => { 92 => [\'dctermsLocation','dctermsLocationCoordinatePrecision'] },
-	'dccoordinateuncertaintyinmeters' => { 92 => [\'dctermsLocation','dctermsLocationCoordinateUncertaintyInMeters'] },
-	'dccountry' => { 92 => [\'dctermsLocation','dctermsLocationCountry'] },
-	'dccountrycode' => { 92 => [\'dctermsLocation','dctermsLocationCountryCode'] },
-	'dccounty' => { 92 => [\'dctermsLocation','dctermsLocationCounty'] },
-	'dcdecimallatitude' => { 92 => [\'dctermsLocation','dctermsLocationDecimalLatitude'] },
-	'dcdecimallongitude' => { 92 => [\'dctermsLocation','dctermsLocationDecimalLongitude'] },
-	'dcevent' => { 92 => 'Event' },
-	'dcfootprintspatialfit' => { 92 => [\'dctermsLocation','dctermsLocationFootprintSpatialFit'] },
-	'dcfootprintsrs' => { 92 => [\'dctermsLocation','dctermsLocationFootprintSRS'] },
-	'dcfootprintwkt' => { 92 => [\'dctermsLocation','dctermsLocationFootprintWKT'] },
-	'dcgeodeticdatum' => { 92 => [\'dctermsLocation','dctermsLocationGeodeticDatum'] },
-	'dcgeoreferencedby' => { 92 => [\'dctermsLocation','dctermsLocationGeoreferencedBy'] },
-	'dcgeoreferenceprotocol' => { 92 => [\'dctermsLocation','dctermsLocationGeoreferenceProtocol'] },
-	'dcgeoreferenceremarks' => { 92 => [\'dctermsLocation','dctermsLocationGeoreferenceRemarks'] },
-	'dcgeoreferencesources' => { 92 => [\'dctermsLocation','dctermsLocationGeoreferenceSources'] },
-	'dcgeoreferenceverificationstatus' => { 92 => [\'dctermsLocation','dctermsLocationGeoreferenceVerificationStatus'] },
-	'dchighergeography' => { 92 => [\'dctermsLocation','dctermsLocationHigherGeography'] },
-	'dchighergeographyid' => { 92 => [\'dctermsLocation','dctermsLocationHigherGeographyID'] },
-	'dcisland' => { 92 => [\'dctermsLocation','dctermsLocationIsland'] },
-	'dcislandgroup' => { 92 => [\'dctermsLocation','dctermsLocationIslandGroup'] },
-	'dclocality' => { 92 => [\'dctermsLocation','dctermsLocationLocality'] },
-	'dclocationaccordingto' => { 92 => [\'dctermsLocation','dctermsLocationLocationAccordingTo'] },
-	'dclocationid' => { 92 => [\'dctermsLocation','dctermsLocationLocationID'] },
-	'dclocationremarks' => { 92 => [\'dctermsLocation','dctermsLocationLocationRemarks'] },
-	'dcmaximumdepthinmeters' => { 92 => [\'dctermsLocation','dctermsLocationMaximumDepthInMeters'] },
-	'dcmaximumdistanceabovesurfaceinmeters' => { 92 => [\'dctermsLocation','dctermsLocationMaximumDistanceAboveSurfaceInMeters'] },
-	'dcmaximumelevationinmeters' => { 92 => [\'dctermsLocation','dctermsLocationMaximumElevationInMeters'] },
-	'dcminimumdepthinmeters' => { 92 => [\'dctermsLocation','dctermsLocationMinimumDepthInMeters'] },
-	'dcminimumdistanceabovesurfaceinmeters' => { 92 => [\'dctermsLocation','dctermsLocationMinimumDistanceAboveSurfaceInMeters'] },
-	'dcminimumelevationinmeters' => { 92 => [\'dctermsLocation','dctermsLocationMinimumElevationInMeters'] },
-	'dcmunicipality' => { 92 => [\'dctermsLocation','dctermsLocationMunicipality'] },
-	'dcpointradiusspatialfit' => { 92 => [\'dctermsLocation','dctermsLocationPointRadiusSpatialFit'] },
-	'dcstateprovince' => { 92 => [\'dctermsLocation','dctermsLocationStateProvince'] },
-	'dctermslocation' => { 92 => 'dctermsLocation' },
-	'dcverbatimcoordinates' => { 92 => [\'dctermsLocation','dctermsLocationVerbatimCoordinates'] },
-	'dcverbatimcoordinatesystem' => { 92 => [\'dctermsLocation','dctermsLocationVerbatimCoordinateSystem'] },
-	'dcverbatimdepth' => { 92 => [\'dctermsLocation','dctermsLocationVerbatimDepth'] },
-	'dcverbatimelevation' => { 92 => [\'dctermsLocation','dctermsLocationVerbatimElevation'] },
-	'dcverbatimlatitude' => { 92 => [\'dctermsLocation','dctermsLocationVerbatimLatitude'] },
-	'dcverbatimlocality' => { 92 => [\'dctermsLocation','dctermsLocationVerbatimLocality'] },
-	'dcverbatimlongitude' => { 92 => [\'dctermsLocation','dctermsLocationVerbatimLongitude'] },
-	'dcverbatimsrs' => { 92 => [\'dctermsLocation','dctermsLocationVerbatimSRS'] },
-	'dcwaterbody' => { 92 => [\'dctermsLocation','dctermsLocationWaterBody'] },
-	'declination' => { 132 => 'Declination' },
-	'decposition' => { 145 => 0x32 },
-	'defaultblackrender' => { 93 => 0xc7a6 },
-	'defaultcroporigin' => { 93 => 0xc61f },
-	'defaultcropsize' => { 93 => 0xc620 },
-	'defaulteraseoption' => { 66 => 0x813 },
-	'defaultscale' => { 93 => 0xc61e },
-	'defaultusercrop' => { 93 => 0xc7b5 },
-	'defringe' => { 343 => 'Defringe' },
-	'defringegreenamount' => { 343 => 'DefringeGreenAmount' },
-	'defringegreenhuehi' => { 343 => 'DefringeGreenHueHi' },
-	'defringegreenhuelo' => { 343 => 'DefringeGreenHueLo' },
-	'defringepurpleamount' => { 343 => 'DefringePurpleAmount' },
-	'defringepurplehuehi' => { 343 => 'DefringePurpleHueHi' },
-	'defringepurplehuelo' => { 343 => 'DefringePurpleHueLo' },
-	'deletedimagecount' => { 178 => 0xa6, 184 => 0x6e },
-	'deprecatedon' => { 341 => 'deprecatedOn' },
-	'derivedfrom' => { 366 => 'DerivedFrom' },
-	'derivedfromalternatepaths' => { 366 => [\'DerivedFrom','DerivedFromAlternatePaths'] },
-	'derivedfromdocumentid' => { 366 => [\'DerivedFrom','DerivedFromDocumentID'] },
-	'derivedfromfilepath' => { 366 => [\'DerivedFrom','DerivedFromFilePath'] },
-	'derivedfromfrompart' => { 366 => [\'DerivedFrom','DerivedFromFromPart'] },
-	'derivedfrominstanceid' => { 366 => [\'DerivedFrom','DerivedFromInstanceID'] },
-	'derivedfromlastmodifydate' => { 366 => [\'DerivedFrom','DerivedFromLastModifyDate'] },
-	'derivedfrommanager' => { 366 => [\'DerivedFrom','DerivedFromManager'] },
-	'derivedfrommanagervariant' => { 366 => [\'DerivedFrom','DerivedFromManagerVariant'] },
-	'derivedfrommanageto' => { 366 => [\'DerivedFrom','DerivedFromManageTo'] },
-	'derivedfrommanageui' => { 366 => [\'DerivedFrom','DerivedFromManageUI'] },
-	'derivedfrommaskmarkers' => { 366 => [\'DerivedFrom','DerivedFromMaskMarkers'] },
-	'derivedfromoriginaldocumentid' => { 366 => [\'DerivedFrom','DerivedFromOriginalDocumentID'] },
-	'derivedfrompartmapping' => { 366 => [\'DerivedFrom','DerivedFromPartMapping'] },
-	'derivedfromrenditionclass' => { 366 => [\'DerivedFrom','DerivedFromRenditionClass'] },
-	'derivedfromrenditionparams' => { 366 => [\'DerivedFrom','DerivedFromRenditionParams'] },
-	'derivedfromtopart' => { 366 => [\'DerivedFrom','DerivedFromToPart'] },
-	'derivedfromversionid' => { 366 => [\'DerivedFrom','DerivedFromVersionID'] },
-	'description' => { 239 => 'Description', 344 => 'description', 363 => 'Description' },
-	'destination' => { 102 => 0x5 },
-	'destinationcity' => { 278 => 0x24, 282 => 0x3 },
-	'destinationcitycode' => { 283 => 0x1001 },
-	'destinationdst' => { 278 => 0x26, 282 => '0.3' },
-	'developmentdynamicrange' => { 98 => 0x1403 },
-	'devicesettingdescription' => { 347 => 'DeviceSettingDescription' },
-	'devicesettingdescriptioncolumns' => { 347 => [\'DeviceSettingDescription','DeviceSettingDescriptionColumns'] },
-	'devicesettingdescriptionrows' => { 347 => [\'DeviceSettingDescription','DeviceSettingDescriptionRows'] },
-	'devicesettingdescriptionsettings' => { 347 => [\'DeviceSettingDescription','DeviceSettingDescriptionSettings'] },
-	'dialdirectiontvav' => { 66 => 0x706 },
-	'digitalcreationdate' => { 101 => 0x3e },
-	'digitalcreationtime' => { 101 => 0x3f },
-	'digitaldeehighlightadj' => { 183 => 0x202 },
-	'digitaldeeshadowadj' => { 183 => 0x200 },
-	'digitaldeethreshold' => { 183 => 0x201 },
-	'digitalfilter' => { 303 => 0x59 },
-	'digitalfilter01' => { 265 => 0x5 },
-	'digitalfilter02' => { 265 => 0x16 },
-	'digitalfilter03' => { 265 => 0x27 },
-	'digitalfilter04' => { 265 => 0x38 },
-	'digitalfilter05' => { 265 => 0x49 },
-	'digitalfilter06' => { 265 => 0x5a },
-	'digitalfilter07' => { 265 => 0x6b },
-	'digitalfilter08' => { 265 => 0x7c },
-	'digitalfilter09' => { 265 => 0x8d },
-	'digitalfilter10' => { 265 => 0x9e },
-	'digitalfilter11' => { 265 => 0xaf },
-	'digitalfilter12' => { 265 => 0xc0 },
-	'digitalfilter13' => { 265 => 0xd1 },
-	'digitalfilter14' => { 265 => 0xe2 },
-	'digitalfilter15' => { 265 => 0xf3 },
-	'digitalfilter16' => { 265 => 0x104 },
-	'digitalfilter17' => { 265 => 0x115 },
-	'digitalfilter18' => { 265 => 0x126 },
-	'digitalfilter19' => { 265 => 0x137 },
-	'digitalfilter20' => { 265 => 0x148 },
-	'digitalgain' => { 58 => 0xb },
-	'digitalgem' => { 170 => 0x0 },
-	'digitalice' => { 183 => 0x100 },
-	'digitalimageguid' => { 352 => 'DigImageGUID' },
-	'digitalroc' => { 182 => 0x0 },
-	'digitalsourcefiletype' => { 352 => 'DigitalSourcefileType' },
-	'digitalsourcetype' => { 352 => 'DigitalSourceType' },
-	'digitalzoom' => { 27 => 0xc, 88 => 0xa, 109 => 0x68, 123 => 'DigitalZoom', 145 => 0xc, 178 => 0x86, 201 => 0xa, 233 => 0x204, 278 => 0x1e, 283 => 0xa, 302 => 0x204 },
-	'digitalzoomon' => { 302 => 0x21b },
-	'digitalzoomratio' => { 93 => 0xa404, 347 => 'DigitalZoomRatio' },
-	'director' => { 365 => 'director' },
-	'directorphotography' => { 365 => 'directorPhotography' },
-	'directory' => { 94 => 'Directory' },
-	'directoryindex' => { 4 => 0x137, 6 => 0x2dc, 8 => 0x17e, 10 => 0x238, 11 => 0x13f, 12 => 0x133, 13 => 0x1df, 14 => 0x1a7, 15 => 0x1f0, 16 => 0xcc, 17 => 0x1c7, 18 => 0x298, 19 => 0x1e7, 20 => 0x1e5, 21 => 0x27c, 22 => 0x2b6, 23 => 0x1f7 },
-	'directoryindex2' => { 18 => 0x29c },
-	'directorynumber' => { 166 => 0x6 },
-	'disclaimer' => { 239 => 'Disclaimer' },
-	'displayallafpoints' => { 66 => 0x514 },
-	'displayaperture' => { 27 => 0x23 },
-	'displayedunitsx' => { 289 => 0x2 },
-	'displayedunitsy' => { 289 => 0x6 },
-	'distance1' => { 109 => 0x28 },
-	'distance2' => { 109 => 0x2c },
-	'distance3' => { 109 => 0x30 },
-	'distance4' => { 109 => 0x34 },
-	'distortioncontrol' => { 184 => 0x10 },
-	'distortioncorrection' => { 85 => 0x67, 228 => 0x50b, 250 => '7.1', 268 => 0x0, 318 => 0x2013 },
-	'distortioncorrection2' => { 232 => 0x1011 },
-	'distortioncorrectionon' => { 85 => 0x63 },
-	'distortionn' => { 250 => 0xc },
-	'distortionparam02' => { 250 => 0x2 },
-	'distortionparam04' => { 250 => 0x4 },
-	'distortionparam08' => { 250 => 0x8 },
-	'distortionparam09' => { 250 => 0x9 },
-	'distortionparam11' => { 250 => 0xb },
-	'distortionscale' => { 250 => 0x5 },
-	'distributor' => { 356 => 'distributor' },
-	'dloon' => { 85 => 0xdc },
-	'dlosetting' => { 85 => 0xdd },
-	'dlosettingapplied' => { 85 => 0xe4 },
-	'dloshootingdistance' => { 85 => 0xde },
-	'dloversion' => { 85 => 0xe5 },
-	'dmcomment' => { 365 => 'comment' },
-	'dngbackwardversion' => { 93 => 0xc613 },
-	'dnglensinfo' => { 93 => 0xc630 },
-	'dngversion' => { 93 => 0xc612 },
-	'document' => { 239 => 'Document' },
-	'documentancestorid' => { 354 => [\'DocumentAncestors','DocumentAncestorsAncestorID'] },
-	'documentancestors' => { 354 => 'DocumentAncestors' },
-	'documenthistory' => { 101 => 0xe7 },
-	'documentid' => { 366 => 'DocumentID' },
-	'documentname' => { 93 => 0x10d },
-	'documentnotes' => { 101 => 0xe6 },
-	'doi' => { 356 => 'doi' },
-	'dotrange' => { 93 => 0x150 },
-	'dpp' => { 338 => 'dpp' },
-	'drivemode' => { 89 => 0x3103, 145 => 0x6, 148 => 0x1e, 151 => 0xe, 228 => 0x600, 278 => 0x34, 303 => 0x3, 307 => 0x4, 308 => 0x7e, 309 => 0x34 },
-	'drivemode2' => { 148 => 0xa, 259 => 0x7, 317 => 0xe, 319 => 0x1 },
-	'drivemodesetting' => { 309 => 0x4 },
-	'dspfirmwareversion' => { 278 => 0x27 },
-	'duration' => { 52 => 0x6a, 122 => 'Duration', 136 => 'Duration', 365 => 'duration' },
-	'durationscale' => { 365 => [\'duration','durationScale'] },
-	'durationvalue' => { 365 => [\'duration','durationValue'] },
-	'dustremovaldata' => { 49 => 0x97 },
-	'dynamicafarea' => { 218 => '1.4', 223 => '1.4' },
-	'dynamicrange' => { 98 => 0x1400 },
-	'dynamicrangeexpansion' => { 278 => 0x69 },
-	'dynamicrangemax' => { 84 => 0x7c },
-	'dynamicrangemin' => { 84 => 0x7a },
-	'dynamicrangeoptimizer' => { 148 => 0x15, 318 => [0xb025,0xb04f] },
-	'dynamicrangeoptimizerbracket' => { 317 => 0x2e },
-	'dynamicrangeoptimizerlevel' => { 307 => 0x19, 308 => 0x17, 309 => 0xd, 319 => 0x5 },
-	'dynamicrangeoptimizermode' => { 151 => 0x15, 307 => 0x18, 308 => 0x16, 317 => 0x15 },
-	'dynamicrangeoptimizersetting' => { 148 => 0x27, 309 => 0xc, 319 => 0x4 },
-	'dynamicrangesetting' => { 98 => 0x1402 },
-	'e-dialinprogram' => { 259 => '1.3' },
-	'earliestageorloweststage' => { 92 => [\'GeologicalContext','GeologicalContextEarliestAgeOrLowestStage'] },
-	'earliesteonorlowesteonothem' => { 92 => [\'GeologicalContext','GeologicalContextEarliestEonOrLowestEonothem'] },
-	'earliestepochorlowestseries' => { 92 => [\'GeologicalContext','GeologicalContextEarliestEpochOrLowestSeries'] },
-	'earliesteraorlowesterathem' => { 92 => [\'GeologicalContext','GeologicalContextEarliestEraOrLowestErathem'] },
-	'earliestperiodorlowestsystem' => { 92 => [\'GeologicalContext','GeologicalContextEarliestPeriodOrLowestSystem'] },
-	'easyexposurecomp' => { 227 => '6.1' },
-	'easyexposurecompensation' => { 218 => '6.4', 223 => '4.4', 224 => '5.2' },
-	'easymode' => { 27 => 0xb },
-	'edgenoisereduction' => { 212 => 0x4, 329 => 0x8028 },
-	'edition' => { 356 => 'edition' },
-	'editorialupdate' => { 101 => 0x8 },
-	'editstatus' => { 101 => 0x7, 286 => 'EditStatus' },
-	'editversionname' => { 211 => 0x3d136244 },
-	'effectivelv' => { 278 => 0x2d },
-	'effectivemaxaperture' => { 174 => 0x12, 175 => 0x13 },
-	'eissn' => { 356 => 'eIssn' },
-	'elevation' => { 132 => 'Elevation' },
-	'email' => { 124 => 'EMail' },
-	'embargodate' => { 356 => 'embargoDate', 358 => 'embargoDate' },
-	'emissivity' => { 95 => 0x3 },
-	'encryptionkey' => { 300 => 0xa020 },
-	'endingpage' => { 356 => 'endingPage' },
-	'enduser' => { 355 => 'EndUser' },
-	'enduserid' => { 355 => [\'EndUser','EndUserEndUserID'] },
-	'endusername' => { 355 => [\'EndUser','EndUserEndUserName'] },
-	'engineer' => { 365 => 'engineer' },
-	'enhancedarktones' => { 204 => 0x8 },
-	'enhancement' => { 88 => 0x16, 89 => 0x3016 },
-	'enhancer' => { 232 => 0x300 },
-	'enhancervalues' => { 232 => 0x301 },
-	'envelopenumber' => { 102 => 0x28 },
-	'envelopepriority' => { 102 => 0x3c },
-	'enveloperecordversion' => { 102 => 0x0 },
-	'epsonimageheight' => { 233 => 0x20c },
-	'epsonimagewidth' => { 233 => 0x20b },
-	'epsonsoftware' => { 233 => 0x20d },
-	'equipmentinstitution' => { 331 => 'EquipmentInstitution' },
-	'equipmentmanufacturer' => { 331 => 'EquipmentManufacturer' },
-	'equipmentversion' => { 229 => 0x0 },
-	'ettlii' => { 66 => 0x304, 67 => 0xd, 68 => 0xe, 69 => 0x7, 70 => 0x7, 71 => 0xe },
-	'event' => { 336 => 'Event', 352 => 'Event', 356 => 'event' },
-	'eventday' => { 92 => [\'Event','EventDay'] },
-	'eventearliestdate' => { 92 => [\'Event','EventEarliestDate'] },
-	'eventenddayofyear' => { 92 => [\'Event','EventEndDayOfYear'] },
-	'eventfieldnotes' => { 92 => [\'Event','EventFieldNotes'] },
-	'eventfieldnumber' => { 92 => [\'Event','EventFieldNumber'] },
-	'eventhabitat' => { 92 => [\'Event','EventHabitat'] },
-	'eventid' => { 92 => [\'Event','EventEventID'] },
-	'eventlatestdate' => { 92 => [\'Event','EventLatestDate'] },
-	'eventmonth' => { 92 => [\'Event','EventMonth'] },
-	'eventnumber' => { 291 => 0x9 },
-	'eventremarks' => { 92 => [\'Event','EventEventRemarks'] },
-	'eventsamplingeffort' => { 92 => [\'Event','EventSamplingEffort'] },
-	'eventsamplingprotocol' => { 92 => [\'Event','EventSamplingProtocol'] },
-	'eventstartdayofyear' => { 92 => [\'Event','EventStartDayOfYear'] },
-	'eventtime' => { 92 => [\'Event','EventEventTime'] },
-	'eventverbatimeventdate' => { 92 => [\'Event','EventVerbatimEventDate'] },
-	'eventyear' => { 92 => [\'Event','EventYear'] },
-	'evsteps' => { 259 => '1.2', 261 => 0x0 },
-	'evstepsize' => { 220 => '5.1', 221 => '6.1', 222 => '6.1', 225 => '0.7' },
-	'exclusivityenddate' => { 358 => 'exclusivityEndDate' },
-	'excursiontolerance' => { 103 => 0x82 },
-	'exif' => { 94 => 'EXIF' },
-	'exifbyteorder' => { 94 => 'ExifByteOrder' },
-	'exifcamerainfo' => { 101 => 0xe8 },
-	'exifimageheight' => { 93 => 0xa003, 347 => 'PixelYDimension' },
-	'exifimagewidth' => { 93 => 0xa002, 347 => 'PixelXDimension' },
-	'exifunicodebyteorder' => { 94 => 'ExifUnicodeByteOrder' },
-	'exifversion' => { 93 => 0x9000, 347 => 'ExifVersion' },
-	'exitpupilposition' => { 174 => 0x4, 175 => 0x4 },
-	'expirationdate' => { 101 => 0x25, 356 => 'expirationDate', 358 => 'expirationDate' },
-	'expirationtime' => { 101 => 0x26 },
-	'exposure' => { 93 => 0xfe51, 343 => 'Exposure' },
-	'exposure2012' => { 343 => 'Exposure2012' },
-	'exposureadj' => { 209 => 0x0 },
-	'exposureadj2' => { 209 => 0x12 },
-	'exposureadjust' => { 303 => 0xc },
-	'exposurebracketingindicatorlast' => { 148 => 0x52 },
-	'exposurebracketshotnumber' => { 151 => 0x2d, 317 => 0x2f },
-	'exposurebracketstepsize' => { 259 => 0x8 },
-	'exposurebracketvalue' => { 178 => 0x19 },
-	'exposurecompensation' => { 60 => 0x6, 75 => 0x0, 93 => 0x9204, 109 => 0x24, 123 => 'ExposureComp', 145 => 0xd, 146 => 0x53, 147 => 0x1e, 151 => 0x49c0, 233 => 0x1006, 278 => 0x16, 300 => 0xa013, 303 => [0xc,0x35,0x4d], 347 => 'ExposureBiasValue' },
-	'exposurecompensation2' => { 319 => 0x2a },
-	'exposurecompensationmode' => { 148 => 0x47, 151 => 0x2a },
-	'exposurecompensationset' => { 309 => 0x3, 319 => 0x1e },
-	'exposurecompensationsetting' => { 148 => 0x1 },
-	'exposurecompstepsize' => { 218 => '6.3', 223 => '4.3' },
-	'exposurecontrolstep' => { 224 => '6.1' },
-	'exposurecontrolstepsize' => { 218 => '6.2', 223 => '4.2', 227 => '7.1' },
-	'exposuredelaymode' => { 218 => '10.1', 220 => '9.1', 221 => '10.1', 222 => '10.1', 223 => '10.4', 224 => '10.1', 225 => '6.4', 227 => '11.2' },
-	'exposuredifference' => { 178 => 0xe },
-	'exposureindex' => { 93 => 0xa215, 347 => 'ExposureIndex' },
-	'exposureindicator' => { 148 => 0x50 },
-	'exposurelevelincrements' => { 64 => 0x6, 65 => 0x6, 66 => 0x101, 67 => 0x5, 68 => 0x6, 69 => 0x5, 70 => 0x5, 71 => 0x6, 72 => 0x4, 307 => 0x58, 308 => 0x58 },
-	'exposurelockused' => { 333 => 'ExposureLockUsed' },
-	'exposuremode' => { 93 => 0xa402, 123 => 'ExposureMode', 145 => 0x1, 146 => 0xa, 147 => 0x0, 148 => 0x0, 151 => 0x34, 228 => 0x200, 245 => 0x40d, 303 => 0x8, 318 => 0xb041, 347 => 'ExposureMode' },
-	'exposuremodeinmanual' => { 66 => 0x10b },
-	'exposureprogram' => { 93 => 0x8822, 304 => 0x17e, 307 => 0x3c, 308 => 0x3c, 309 => 0x5, 313 => 0x14, 317 => 0x3f, 319 => 0x2, 347 => 'ExposureProgram' },
-	'exposureshift' => { 228 => 0x203 },
-	'exposuretime' => { 4 => 0x4, 5 => 0x4, 6 => 0x4, 7 => 0x4, 8 => 0x4, 9 => 0x4, 10 => 0x4, 11 => 0x4, 12 => 0x4, 13 => 0x4, 14 => 0x4, 15 => 0x4, 16 => 0x4, 17 => 0x4, 18 => 0x4, 19 => 0x4, 20 => 0x4, 21 => 0x4, 22 => 0x4, 23 => 0x4, 24 => 0x6, 25 => 0x7, 60 => 0x16, 93 => 0x829a, 106 => 0xfd05, 109 => 0x20, 111 => 0xfa24, 113 => 0xf104, 116 => 0x12, 118 => 0x38, 121 => 0x10, 123 => 'ExposureTime', 145 => 0x9, 146 => 0x35, 147 => 0x48, 148 => 0x8, 151 => 0x49b8, 278 => 0x12, 300 => 0xa018, 303 => [0x32,0x4a], 307 => 0x0, 308 => 0x0, 319 => 0x27, 347 => 'ExposureTime' },
-	'exposuretime2' => { 303 => [0x33,0x4b] },
-	'exposuretuning' => { 178 => 0x1c },
-	'exposurevalue' => { 107 => 0x3 },
-	'exposurewarning' => { 98 => 0x1302 },
-	'exrauto' => { 98 => 0x1033 },
-	'exrmode' => { 98 => 0x1034 },
-	'extendedwbdetect' => { 228 => 0x902 },
-	'extender' => { 229 => 0x301 },
-	'extenderfirmwareversion' => { 229 => 0x304 },
-	'extendermagnification' => { 125 => 'Magnification' },
-	'extendermake' => { 125 => 'Make' },
-	'extendermodel' => { 125 => 'Model', 229 => 0x303 },
-	'extenderserialnumber' => { 125 => 'SerialNumber', 229 => 0x302 },
-	'externalflash' => { 231 => 0x1201 },
-	'externalflashae1' => { 233 => 0x101f },
-	'externalflashae1_0' => { 233 => 0x101b },
-	'externalflashae2' => { 233 => 0x1020 },
-	'externalflashae2_0' => { 233 => 0x101c },
-	'externalflashbounce' => { 231 => 0x1204, 233 => 0x1026, 266 => 0x1a },
-	'externalflashcompensation' => { 169 => 0x1b },
-	'externalflashexposurecomp' => { 178 => 0x17, 266 => 0x19 },
-	'externalflashfirmware' => { 167 => 0x6, 168 => 0x6, 169 => 0x6 },
-	'externalflashflags' => { 167 => 0x8, 168 => 0x8, 169 => 0x8 },
-	'externalflashguidenumber' => { 231 => 0x1203, 266 => '24.1' },
-	'externalflashgvalue' => { 233 => 0x1025 },
-	'externalflashmode' => { 233 => 0x1028, 266 => 0x2 },
-	'externalflashzoom' => { 231 => 0x1205, 233 => 0x1027 },
-	'externalsensorbrightnessvalue' => { 243 => 0x311, 249 => 0x3408 },
-	'extrainfoversion' => { 311 => 0x1a },
-	'eyestartaf' => { 148 => 0x40 },
-	'face10position' => { 86 => 0x3f4, 87 => 0x1ec, 165 => 0x28, 263 => 0x12 },
-	'face10size' => { 264 => 0x12 },
-	'face11position' => { 165 => 0x2c, 263 => 0x14 },
-	'face11size' => { 264 => 0x14 },
-	'face12position' => { 165 => 0x30, 263 => 0x16 },
-	'face12size' => { 264 => 0x16 },
-	'face13position' => { 263 => 0x18 },
-	'face13size' => { 264 => 0x18 },
-	'face14position' => { 263 => 0x1a },
-	'face14size' => { 264 => 0x1a },
-	'face15position' => { 263 => 0x1c },
-	'face15size' => { 264 => 0x1c },
-	'face16position' => { 263 => 0x1e },
-	'face16size' => { 264 => 0x1e },
-	'face17position' => { 263 => 0x20 },
-	'face17size' => { 264 => 0x20 },
-	'face18position' => { 263 => 0x22 },
-	'face18size' => { 264 => 0x22 },
-	'face19position' => { 263 => 0x24 },
-	'face19size' => { 264 => 0x24 },
-	'face1position' => { 41 => 0x8, 86 => 0xd, 87 => 0x18, 165 => 0x4, 241 => 0x1, 263 => 0x0, 292 => 0xbc, 314 => 0x1, 315 => 0x0, 316 => 0x0 },
-	'face1size' => { 264 => 0x0 },
-	'face20position' => { 263 => 0x26 },
-	'face20size' => { 264 => 0x26 },
-	'face21position' => { 263 => 0x28 },
-	'face21size' => { 264 => 0x28 },
-	'face22position' => { 263 => 0x2a },
-	'face22size' => { 264 => 0x2a },
-	'face23position' => { 263 => 0x2c },
-	'face23size' => { 264 => 0x2c },
-	'face24position' => { 263 => 0x2e },
-	'face24size' => { 264 => 0x2e },
-	'face25position' => { 263 => 0x30 },
-	'face25size' => { 264 => 0x30 },
-	'face26position' => { 263 => 0x32 },
-	'face26size' => { 264 => 0x32 },
-	'face27position' => { 263 => 0x34 },
-	'face27size' => { 264 => 0x34 },
-	'face28position' => { 263 => 0x36 },
-	'face28size' => { 264 => 0x36 },
-	'face29position' => { 263 => 0x38 },
-	'face29size' => { 264 => 0x38 },
-	'face2position' => { 41 => 0xa, 86 => 0x7c, 87 => 0x4c, 165 => 0x8, 241 => 0x5, 263 => 0x2, 292 => 0xc8, 314 => 0x6, 315 => 0x20, 316 => 0x25 },
-	'face2size' => { 264 => 0x2 },
-	'face30position' => { 263 => 0x3a },
-	'face30size' => { 264 => 0x3a },
-	'face31position' => { 263 => 0x3c },
-	'face31size' => { 264 => 0x3c },
-	'face32position' => { 263 => 0x3e },
-	'face32size' => { 264 => 0x3e },
-	'face3position' => { 41 => 0xc, 86 => 0xeb, 87 => 0x80, 165 => 0xc, 241 => 0x9, 263 => 0x4, 292 => 0xd4, 314 => 0xb, 315 => 0x40, 316 => 0x4a },
-	'face3size' => { 264 => 0x4 },
-	'face4position' => { 41 => 0xe, 86 => 0x15a, 87 => 0xb4, 165 => 0x10, 241 => 0xd, 263 => 0x6, 292 => 0xe0, 314 => 0x10, 315 => 0x60, 316 => 0x6f },
-	'face4size' => { 264 => 0x6 },
-	'face5position' => { 41 => 0x10, 86 => 0x1c9, 87 => 0xe8, 165 => 0x14, 241 => 0x11, 263 => 0x8, 292 => 0xec, 314 => 0x15, 315 => 0x80, 316 => 0x94 },
-	'face5size' => { 264 => 0x8 },
-	'face6position' => { 41 => 0x12, 86 => 0x238, 87 => 0x11c, 165 => 0x18, 263 => 0xa, 292 => 0xf8, 314 => 0x1a, 315 => 0xa0, 316 => 0xb9 },
-	'face6size' => { 264 => 0xa },
-	'face7position' => { 41 => 0x14, 86 => 0x2a7, 87 => 0x150, 165 => 0x1c, 263 => 0xc, 292 => 0x104, 314 => 0x1f, 315 => 0xc0, 316 => 0xde },
-	'face7size' => { 264 => 0xc },
-	'face8position' => { 41 => 0x16, 86 => 0x316, 87 => 0x184, 165 => 0x20, 263 => 0xe, 292 => 0x110, 314 => 0x24, 315 => 0xe0, 316 => 0x103 },
-	'face8size' => { 264 => 0xe },
-	'face9position' => { 41 => 0x18, 86 => 0x385, 87 => 0x1b8, 165 => 0x24, 263 => 0x10 },
-	'face9size' => { 264 => 0x10 },
-	'facedetect' => { 278 => 0x76 },
-	'facedetectarea' => { 232 => 0x1201 },
-	'facedetectframecrop' => { 232 => 0x1207 },
-	'facedetectframesize' => { 41 => 0x3, 86 => 0x1, 87 => 0x4, 165 => 0x1, 232 => 0x1203, 278 => 0x77, 292 => 0xb6 },
-	'facedetection' => { 309 => 0x30, 319 => 0x19 },
-	'faceid' => { 339 => 'FaceID' },
-	'faceinfounknown' => { 89 => 0x2089 },
-	'faceorientation' => { 87 => 0x8 },
-	'faceposition' => { 262 => 0x2, 301 => 0x4 },
-	'facepositions' => { 98 => 0x4103 },
-	'facesdetected' => { 41 => 0x2, 42 => 0x2, 43 => 0x3, 86 => 0x0, 87 => 0x2, 89 => 0x211c, 98 => 0x4100, 165 => 0x3, 232 => 0x1200, 247 => 0x3f, 262 => 0x0, 292 => 0xb5, 301 => 0x0, 314 => 0x0, 321 => 0x30 },
-	'facesrecognized' => { 242 => 0x0 },
-	'facewidth' => { 42 => 0x1 },
-	'faithfuloutputhighlightpoint' => { 85 => 0x38 },
-	'faithfuloutputshadowpoint' => { 85 => 0x39 },
-	'faithfulrawcolortone' => { 85 => 0x31 },
-	'faithfulrawcontrast' => { 85 => 0x33 },
-	'faithfulrawhighlight' => { 85 => 0x79 },
-	'faithfulrawhighlightpoint' => { 85 => 0x36 },
-	'faithfulrawlinear' => { 85 => 0x34 },
-	'faithfulrawsaturation' => { 85 => 0x32 },
-	'faithfulrawshadow' => { 85 => 0x82 },
-	'faithfulrawshadowpoint' => { 85 => 0x37 },
-	'faithfulrawsharpness' => { 85 => 0x35 },
-	'faithfulunsharpmaskfineness' => { 85 => 0xac },
-	'faithfulunsharpmaskstrength' => { 85 => 0xaa },
-	'faithfulunsharpmaskthreshold' => { 85 => 0xae },
-	'femicroadjustment' => { 66 => 0x110 },
-	'ffid' => { 345 => 'ffid' },
-	'fieldcount' => { 233 => 0x103f },
-	'filecreatedate' => { 94 => 'FileCreateDate' },
-	'filedatarate' => { 365 => 'fileDataRate' },
-	'fileformat' => { 77 => 0x0, 102 => 0x14, 303 => [0x22,0x26], 318 => 0xb000 },
-	'fileindex' => { 4 => 0x143, 6 => 0x2d0, 8 => 0x172, 10 => 0x22c, 11 => 0x133, 12 => 0x13f, 13 => 0x1d3, 14 => 0x19b, 15 => 0x1e4, 16 => 0xd0, 17 => 0x1bb, 18 => 0x28c, 19 => 0x1db, 20 => 0x1d9, 21 => 0x270, 22 => 0x2aa, 23 => 0x1eb, 248 => 0x0 },
-	'fileindex2' => { 18 => 0x290 },
-	'filemodifydate' => { 94 => 'FileModifyDate' },
-	'filename' => { 94 => 'FileName' },
-	'filenameasdelivered' => { 355 => 'FileNameAsDelivered' },
-	'filenumber' => { 44 => 0x1, 49 => 0x8, 79 => 0x1817, 90 => 'FileNumber', 166 => 0x8 },
-	'filenumbermemory' => { 145 => 0x1a },
-	'filenumbersequence' => { 218 => '12.2', 220 => '3.1', 221 => '4.1', 222 => '4.1', 223 => '11.1', 224 => '4.3', 227 => '5.2' },
-	'filesource' => { 93 => 0xa300, 98 => 0x8000, 347 => 'FileSource' },
-	'fileversion' => { 102 => 0x16 },
-	'fillflashautoreduction' => { 64 => 0xe, 65 => 0xe, 72 => 0xa },
-	'filllight' => { 343 => 'FillLight' },
-	'fillorder' => { 93 => 0x10a },
-	'filmmode' => { 98 => 0x1401, 245 => 0x412, 247 => 0x42 },
-	'filmtype' => { 183 => 0x2 },
-	'filtereffect' => { 44 => 0xe, 180 => 0x37 },
-	'filtereffectfaithful' => { 54 => 0x70, 55 => 0x70 },
-	'filtereffectlandscape' => { 54 => 0x40, 55 => 0x40 },
-	'filtereffectmonochrome' => { 16 => 0xff, 54 => 0x88, 55 => 0x88 },
-	'filtereffectneutral' => { 54 => 0x58, 55 => 0x58 },
-	'filtereffectportrait' => { 54 => 0x28, 55 => 0x28 },
-	'filtereffectstandard' => { 54 => 0x10, 55 => 0x10 },
-	'filtereffectunknown' => { 55 => 0xa0 },
-	'filtereffectuserdef1' => { 54 => 0xa0, 55 => 0xb8 },
-	'filtereffectuserdef2' => { 54 => 0xb8, 55 => 0xd0 },
-	'filtereffectuserdef3' => { 54 => 0xd0, 55 => 0xe8 },
-	'finderdisplayduringexposure' => { 65 => 0x1 },
-	'finesharpness' => { 278 => 0x70 },
-	'finetuneoptcenterweighted' => { 218 => '7.2', 227 => '9.1' },
-	'finetuneoptmatrixmetering' => { 218 => '8.1', 223 => '6.1', 227 => '8.2' },
-	'finetuneoptspotmetering' => { 218 => '8.2', 223 => '6.2', 227 => '9.2' },
-	'firmware' => { 233 => 0x405, 303 => [0x17,0x3b,0x57], 340 => 'Firmware' },
-	'firmwaredate' => { 88 => 0x15, 89 => 0x2001, 291 => 0x4 },
-	'firmwareid' => { 152 => 0x0 },
-	'firmwarename' => { 300 => 0xa001 },
-	'firmwarerevision' => { 16 => 0xa4, 49 => 0x1e, 293 => 0x0 },
-	'firmwarerevision2' => { 293 => 0xc },
-	'firmwareversion' => { 4 => 0x10b, 8 => 0x136, 11 => 0xff, 12 => 0x107, 107 => 0xce5, 121 => 0x57, 123 => 'FirmwareVersion', 247 => 0x2, 249 => 0x3109, 278 => 0x230, 295 => 0x2 },
-	'firstphotodate' => { 333 => 'FirstPhotoDate' },
-	'firstpublicationdate' => { 355 => 'FirstPublicationDate' },
-	'fixtureidentifier' => { 101 => 0x16 },
-	'flash' => { 90 => 'Flash', 93 => 0x9209, 146 => 0x1f, 147 => 0x15, 347 => 'Flash' },
-	'flashaction' => { 309 => [0x87,0x287] },
-	'flashaction2' => { 319 => 0x30 },
-	'flashactivity' => { 27 => 0x1c },
-	'flashbatterylevel' => { 33 => 0x249 },
-	'flashbias' => { 247 => 0x24 },
-	'flashbits' => { 27 => 0x1d },
-	'flashbuttonfunction' => { 66 => 0x70e },
-	'flashchargelevel' => { 233 => 0x1010 },
-	'flashcolorfilter' => { 169 => 0x10 },
-	'flashcommandermode' => { 167 => '9.1', 168 => '9.1', 169 => '9.1' },
-	'flashcompensation' => { 167 => 0xa, 168 => 0xa, 169 => 0xa, 340 => 'FlashCompensation' },
-	'flashcontrol' => { 309 => 0x21 },
-	'flashcontrolbuilt-in' => { 223 => '16.1', 224 => '23.1', 226 => '23.1' },
-	'flashcontrolmode' => { 167 => '9.2', 168 => '9.2', 169 => '9.2', 228 => 0x404 },
-	'flashcurtain' => { 247 => 0x48 },
-	'flashdefault' => { 148 => 0x42 },
-	'flashdevice' => { 233 => 0x1005 },
-	'flashdistance' => { 89 => 0x2034 },
-	'flashenergy' => { 93 => 0xa20b, 347 => 'FlashEnergy' },
-	'flashexposurebracketvalue' => { 178 => 0x18 },
-	'flashexposurecomp' => { 60 => 0xf, 98 => 0x1011, 126 => 'ExposureComp', 145 => 0x23, 150 => 0x104, 151 => 0x49c1, 178 => 0x12, 228 => 0x401, 233 => 0x1023, 278 => 0x4d, 303 => [0x3a,0x56], 318 => 0x104 },
-	'flashexposurecomp2' => { 199 => 0x4d2 },
-	'flashexposurecomp3' => { 169 => 0x1d },
-	'flashexposurecomp4' => { 169 => 0x27 },
-	'flashexposurecompset' => { 148 => 0x10, 252 => 0xe, 309 => 0x23, 319 => 0x1f },
-	'flashexposurecompset2' => { 319 => 0x2c },
-	'flashexposureindicator' => { 148 => 0x54 },
-	'flashexposureindicatorlast' => { 148 => 0x56 },
-	'flashexposureindicatornext' => { 148 => 0x55 },
-	'flashexposurelock' => { 44 => 0x19 },
-	'flashfired' => { 109 => 0x5d, 126 => 'Fired', 145 => 0x14, 198 => '590.3', 247 => 0x8007, 347 => [\'Flash','FlashFired'] },
-	'flashfiring' => { 66 => 0x306, 67 => 0x6, 68 => 0x7, 71 => 0x7 },
-	'flashfirmwareversion' => { 229 => 0x1002 },
-	'flashfocallength' => { 167 => 0xb, 168 => 0xc, 169 => 0xc },
-	'flashfunction' => { 151 => 0x31, 347 => [\'Flash','FlashFunction'] },
-	'flashgndistance' => { 167 => 0xe, 168 => 0xf, 169 => 0xf },
-	'flashgroupacompensation' => { 167 => 0x11, 168 => 0x12, 169 => 0x13 },
-	'flashgroupacontrolmode' => { 167 => 0xf, 168 => '16.1', 169 => '17.1' },
-	'flashgroupaoutput' => { 167 => 0x11, 168 => 0x12, 169 => 0x13 },
-	'flashgroupbcompensation' => { 167 => 0x12, 168 => 0x13, 169 => 0x14 },
-	'flashgroupbcontrolmode' => { 167 => 0x10, 168 => '17.1', 169 => '18.1' },
-	'flashgroupboutput' => { 167 => 0x12, 168 => 0x13, 169 => 0x14 },
-	'flashgroupccompensation' => { 168 => 0x14, 169 => 0x15 },
-	'flashgroupccontrolmode' => { 168 => '17.2', 169 => '18.2' },
-	'flashgroupcoutput' => { 168 => 0x14, 169 => 0x15 },
-	'flashguidenumber' => { 60 => 0xd, 76 => 0x0, 126 => 'GuideNumber' },
-	'flashintensity' => { 88 => [0x19,0x5], 228 => 0x405 },
-	'flashlevel' => { 219 => 0x9, 318 => 0xb048 },
-	'flashmake' => { 126 => 'Make' },
-	'flashmanufacturer' => { 143 => 'FlashManufacturer' },
-	'flashmetering' => { 145 => 0x3f, 148 => 0x1c },
-	'flashmeteringmode' => { 4 => 0x15, 10 => 0x15, 11 => 0x15, 12 => 0x15, 13 => 0x15, 14 => 0x15, 15 => 0x15, 17 => 0x15, 19 => 0x15, 23 => 0x15 },
-	'flashmeteringsegments' => { 278 => 0x20a },
-	'flashmode' => { 88 => 0x4, 109 => 0x5c, 126 => 'Mode', 145 => 0x2, 146 => 0x20, 147 => 0x16, 148 => 0xf, 178 => 0x87, 228 => 0x400, 233 => 0x1004, 278 => 0xc, 283 => 0x4, 294 => 0x20, 302 => 0x225, 307 => 0x23, 308 => 0x1f, 309 => 0x20, 319 => 0x10, 347 => [\'Flash','FlashMode'] },
-	'flashmodel' => { 126 => 'Model', 143 => 'FlashModel', 229 => 0x1001 },
-	'flashoptions' => { 259 => 0x2 },
-	'flashoptions2' => { 259 => 0x10 },
-	'flashoutput' => { 33 => 0x248, 60 => 0x21, 167 => 0xa, 168 => 0xa, 169 => 0xa },
-	'flashpixversion' => { 93 => 0xa000, 347 => 'FlashpixVersion' },
-	'flashredeyemode' => { 347 => [\'Flash','FlashRedEyeMode'] },
-	'flashremotecontrol' => { 228 => 0x403 },
-	'flashreturn' => { 347 => [\'Flash','FlashReturn'] },
-	'flashserialnumber' => { 126 => 'SerialNumber', 229 => 0x1003 },
-	'flashsetting' => { 178 => 0x8 },
-	'flashshutterspeed' => { 218 => '20.2', 223 => '15.2', 224 => '22.2', 225 => '7.2', 226 => '22.2', 227 => '23.1' },
-	'flashsource' => { 167 => 0x4, 168 => 0x4, 169 => 0x4 },
-	'flashstatus' => { 266 => 0x0, 322 => 0x31 },
-	'flashsyncspeed' => { 218 => '20.1', 223 => '15.1', 224 => '22.1', 226 => '22.1' },
-	'flashsyncspeedav' => { 64 => 0x3, 66 => 0x10f, 67 => 0x2, 68 => 0x3, 69 => 0x2, 70 => 0x2, 71 => 0x3, 72 => 0x6 },
-	'flashthreshold' => { 76 => 0x1 },
-	'flashtype' => { 126 => 'Type', 148 => 0x59, 178 => 0x9, 229 => 0x1000 },
-	'flashwarning' => { 224 => '30.1', 225 => '7.1', 227 => '31.1', 247 => 0x62 },
-	'flexiblespotposition' => { 318 => 0x201d },
-	'flickerreduce' => { 302 => 0x218 },
-	'fliphorizontal' => { 211 => 0x76a43206 },
-	'fnumber' => { 4 => 0x3, 6 => 0x3, 8 => 0x3, 10 => 0x3, 11 => 0x3, 12 => 0x3, 13 => 0x3, 14 => 0x3, 15 => 0x3, 16 => 0x3, 17 => 0x3, 18 => 0x3, 19 => 0x3, 20 => 0x3, 21 => 0x3, 22 => 0x3, 23 => 0x3, 24 => 0x5, 25 => 0x6, 60 => 0x15, 93 => 0x829d, 106 => 0xfd04, 109 => 0x1e, 111 => 0xfa23, 113 => 0xf103, 116 => 0x13, 118 => 0x3c, 121 => 0xc, 130 => 'FNumber', 145 => 0xa, 146 => 0x36, 147 => 0x47, 148 => 0x9, 151 => 0x49c7, 278 => 0x13, 300 => 0xa019, 303 => [0x31,0x49], 307 => 0x1, 308 => 0x1, 319 => 0x26, 347 => 'FNumber' },
-	'focallength' => { 4 => 0x1d, 5 => 0xa, 6 => 0x23, 7 => 0x9, 8 => 0x1d, 9 => 0x9, 10 => 0x1e, 11 => 0x1d, 12 => 0x1d, 13 => 0x1e, 14 => 0x1e, 15 => 0x1e, 16 => 0x28, 17 => 0x1e, 18 => 0x23, 19 => 0x1e, 20 => 0x1e, 21 => 0x20, 22 => 0x23, 23 => 0x1e, 46 => 0x1, 89 => 0x1d, 93 => 0x920a, 116 => 0x1d, 130 => 'FocalLength', 145 => 0x12, 174 => 0xa, 175 => 0xb, 269 => 0x9, 278 => 0x1d, 305 => 0xe, 347 => 'FocalLength' },
-	'focallengthin35mmformat' => { 93 => 0xa405, 300 => 0xa01a, 347 => 'FocalLengthIn35mmFilm' },
-	'focallengthtelezoom' => { 305 => 0x10 },
-	'focalplanediagonal' => { 229 => 0x103, 233 => 0x205 },
-	'focalplaneresolutionunit' => { 93 => 0xa210, 347 => 'FocalPlaneResolutionUnit' },
-	'focalplanexresolution' => { 93 => 0xa20e, 347 => 'FocalPlaneXResolution' },
-	'focalplanexsize' => { 46 => 0x2 },
-	'focalplanexunknown' => { 46 => 0x2 },
-	'focalplaneyresolution' => { 93 => 0xa20f, 347 => 'FocalPlaneYResolution' },
-	'focalplaneysize' => { 46 => 0x3 },
-	'focalplaneyunknown' => { 46 => 0x3 },
-	'focaltype' => { 7 => 0x2d, 46 => 0x0 },
-	'focalunits' => { 27 => 0x19 },
-	'focus' => { 201 => 0x8 },
-	'focusarea' => { 145 => 0x31 },
-	'focusareaselection' => { 225 => '15.2' },
-	'focuscontinuous' => { 27 => 0x20 },
-	'focusdisplayaiservoandmf' => { 66 => 0x515 },
-	'focusdistance' => { 130 => 'FocusDistance', 145 => 0x13, 151 => 0x49bb, 174 => 0x9, 175 => 0xa, 231 => 0x305 },
-	'focusdistancelower' => { 4 => 0x45, 6 => 0x8e, 8 => 0x45, 10 => 0x56, 11 => 0x45, 12 => 0x45, 13 => 0x52, 14 => 0x52, 15 => 0x56, 17 => 0x52, 18 => 0x8e, 19 => 0x59, 20 => 0x57, 21 => 0x8e, 22 => 0x94, 23 => 0x56, 60 => 0x14 },
-	'focusdistanceupper' => { 4 => 0x43, 6 => 0x8c, 8 => 0x43, 10 => 0x54, 11 => 0x43, 12 => 0x43, 13 => 0x50, 14 => 0x50, 15 => 0x54, 17 => 0x50, 18 => 0x8c, 19 => 0x57, 20 => 0x55, 21 => 0x8c, 22 => 0x92, 23 => 0x54, 60 => 0x13 },
-	'focusholdbutton' => { 148 => 0x44 },
-	'focusinfoversion' => { 231 => 0x0 },
-	'focusingscreen' => { 65 => 0x0, 66 => 0x80b, 71 => 0x0 },
-	'focuslocked' => { 144 => 0x14 },
-	'focusmode' => { 27 => 0x7, 88 => 0x3, 89 => [0x3003,0xd], 98 => 0x1021, 109 => 0x38, 123 => 'FocusMode', 145 => 0x30, 147 => 0xe, 148 => 0xc, 178 => 0x7, 228 => 0x301, 233 => 0x100b, 247 => 0x7, 278 => 0xd, 283 => 0x3, 304 => 0xb, 305 => 0x1d, 307 => 0x4d, 308 => 0x4d, 318 => [0xb042,0xb04e,0x201b], 319 => 0x13 },
-	'focusmode2' => { 259 => '3.1', 319 => 0x32 },
-	'focusmodesetting' => { 219 => '10.1', 307 => 0x10, 308 => 0xf, 309 => 0x6 },
-	'focusmodeswitch' => { 148 => 0x58, 307 => 0x2e },
-	'focuspixel' => { 98 => 0x1023 },
-	'focuspointwrap' => { 218 => '2.2', 223 => '2.2', 224 => '1.2', 227 => '2.5' },
-	'focusposition' => { 174 => 0x8, 175 => 0x8, 278 => 0x10, 317 => 0x9bb },
-	'focusprocess' => { 228 => 0x302 },
-	'focusrange' => { 27 => 0x12, 233 => 0x100a },
-	'focussetting' => { 303 => 0x6 },
-	'focusstatus' => { 305 => 0x19, 307 => 0x53, 308 => 0x53 },
-	'focusstepcount' => { 231 => 0x301, 233 => 0x100e },
-	'focusstepinfinity' => { 231 => 0x303, 233 => 0x103b },
-	'focusstepnear' => { 231 => 0x304, 233 => 0x103c },
-	'focustrackinglockon' => { 218 => ['1.5','4.1'], 223 => '3.1', 224 => '0.4' },
-	'focuswarning' => { 98 => 0x1301 },
-	'foldername' => { 145 => 0x27 },
-	'fontcomposite' => { 370 => [\'Fonts','FontsComposite'] },
-	'fontface' => { 370 => [\'Fonts','FontsFontFace'] },
-	'fontfamily' => { 370 => [\'Fonts','FontsFontFamily'] },
-	'fontfilename' => { 370 => [\'Fonts','FontsFontFileName'] },
-	'fontname' => { 370 => [\'Fonts','FontsFontName'] },
-	'fonts' => { 370 => 'Fonts' },
-	'fonttype' => { 370 => [\'Fonts','FontsFontType'] },
-	'fontversion' => { 370 => [\'Fonts','FontsVersionString'] },
-	'for' => { 290 => 'For' },
-	'format' => { 344 => 'format', 363 => 'Format' },
-	'forwardlock' => { 360 => 'forwardlock' },
-	'forwardmatrix1' => { 93 => 0xc714 },
-	'forwardmatrix2' => { 93 => 0xc715 },
-	'framecount' => { 52 => [0x2,0x4] },
-	'framenum' => { 285 => 0xd7 },
-	'framenumber' => { 98 => 0x8003, 151 => 0x3c, 278 => 0x29 },
-	'framerate' => { 52 => [0x1,0x6], 93 => 0xc764 },
-	'freebytes' => { 79 => 0x1 },
-	'freememorycardimages' => { 146 => [0x37,0x54], 147 => [0x2d,0x4a], 148 => 0x32 },
-	'fujiflashmode' => { 98 => 0x1010 },
-	'fullimagesize' => { 318 => 0xb02b },
-	'fullpanoheightpixels' => { 333 => 'FullPanoHeightPixels' },
-	'fullpanowidthpixels' => { 333 => 'FullPanoWidthPixels' },
-	'fullsizeimage' => { 129 => 'data' },
-	'fullsizeimagename' => { 129 => '1Name' },
-	'fullsizeimagetype' => { 129 => '0Type' },
-	'funcbutton' => { 218 => ['14.1','15.1'], 223 => '28.1', 224 => '13.1', 227 => '14.1' },
-	'funcbuttonplusdials' => { 218 => ['14.2','15.2'], 223 => '31.1' },
-	'functionbutton' => { 222 => '13.1', 225 => '5.2' },
-	'gainbase' => { 232 => 0x610 },
-	'gaincontrol' => { 93 => 0xa407, 347 => 'GainControl' },
-	'gamma' => { 93 => 0xa500 },
-	'gammacompensatedvalue' => { 103 => 0x91 },
-	'geimagesize' => { 98 => 0x1304 },
-	'gemake' => { 99 => 0x300 },
-	'gemodel' => { 99 => 0x207 },
-	'genre' => { 356 => 'genre', 365 => 'genre' },
-	'geography' => { 357 => 'geography' },
-	'geologicalcontext' => { 92 => 'GeologicalContext' },
-	'geologicalcontextbed' => { 92 => [\'GeologicalContext','GeologicalContextBed'] },
-	'geologicalcontextformation' => { 92 => [\'GeologicalContext','GeologicalContextFormation'] },
-	'geologicalcontextgroup' => { 92 => [\'GeologicalContext','GeologicalContextGroup'] },
-	'geologicalcontextid' => { 92 => [\'GeologicalContext','GeologicalContextGeologicalContextID'] },
-	'geologicalcontextmember' => { 92 => [\'GeologicalContext','GeologicalContextMember'] },
-	'geosync' => { 94 => 'Geosync' },
-	'geotag' => { 94 => 'Geotag' },
-	'geotime' => { 94 => 'Geotime' },
-	'globalaltitude' => { 288 => 0x419 },
-	'globalangle' => { 288 => 0x40d },
-	'good' => { 365 => 'good' },
-	'gpsaltitude' => { 100 => 0x6, 127 => 'Altitude', 347 => 'GPSAltitude' },
-	'gpsaltituderef' => { 100 => 0x5, 347 => 'GPSAltitudeRef' },
-	'gpsareainformation' => { 100 => 0x1c, 347 => 'GPSAreaInformation' },
-	'gpsdatestamp' => { 100 => 0x1d },
-	'gpsdatetime' => { 127 => 'DateTime', 347 => 'GPSTimeStamp' },
-	'gpsdestbearing' => { 100 => 0x18, 127 => 'Bearing', 347 => 'GPSDestBearing' },
-	'gpsdestbearingref' => { 100 => 0x17, 347 => 'GPSDestBearingRef' },
-	'gpsdestdistance' => { 100 => 0x1a, 127 => 'Distance', 347 => 'GPSDestDistance' },
-	'gpsdestdistanceref' => { 100 => 0x19, 347 => 'GPSDestDistanceRef' },
-	'gpsdestlatitude' => { 100 => 0x14, 347 => 'GPSDestLatitude' },
-	'gpsdestlatituderef' => { 100 => 0x13 },
-	'gpsdestlongitude' => { 100 => 0x16, 347 => 'GPSDestLongitude' },
-	'gpsdestlongituderef' => { 100 => 0x15 },
-	'gpsdifferential' => { 100 => 0x1e, 127 => 'Differential', 347 => 'GPSDifferential' },
-	'gpsdop' => { 100 => 0xb, 347 => 'GPSDOP' },
-	'gpshpositioningerror' => { 100 => 0x1f },
-	'gpsimgdirection' => { 100 => 0x11, 347 => 'GPSImgDirection' },
-	'gpsimgdirectionref' => { 100 => 0x10, 347 => 'GPSImgDirectionRef' },
-	'gpslatitude' => { 100 => 0x2, 127 => 'Latitude', 347 => 'GPSLatitude' },
-	'gpslatituderef' => { 100 => 0x1 },
-	'gpslongitude' => { 100 => 0x4, 127 => 'Longitude', 347 => 'GPSLongitude' },
-	'gpslongituderef' => { 100 => 0x3 },
-	'gpsmapdatum' => { 100 => 0x12, 127 => 'Datum', 347 => 'GPSMapDatum' },
-	'gpsmeasuremode' => { 100 => 0xa, 127 => 'MeasureMode', 347 => 'GPSMeasureMode' },
-	'gpsprocessingmethod' => { 100 => 0x1b, 347 => 'GPSProcessingMethod' },
-	'gpssatellites' => { 100 => 0x8, 127 => 'Satellites', 347 => 'GPSSatellites' },
-	'gpsspeed' => { 100 => 0xd, 127 => 'Speed', 347 => 'GPSSpeed' },
-	'gpsspeedref' => { 100 => 0xc, 347 => 'GPSSpeedRef' },
-	'gpsstatus' => { 100 => 0x9, 347 => 'GPSStatus' },
-	'gpstimestamp' => { 100 => 0x7 },
-	'gpstrack' => { 100 => 0xf, 127 => 'Heading', 347 => 'GPSTrack' },
-	'gpstrackref' => { 100 => 0xe, 347 => 'GPSTrackRef' },
-	'gpsversionid' => { 100 => 0x0, 347 => 'GPSVersionID' },
-	'gradation' => { 228 => 0x50f },
-	'gradientbasedcorractive' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionActive'] },
-	'gradientbasedcorramount' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionAmount'] },
-	'gradientbasedcorrbrightness' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalBrightness'] },
-	'gradientbasedcorrclarity' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalClarity'] },
-	'gradientbasedcorrclarity2012' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalClarity2012'] },
-	'gradientbasedcorrcontrast' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalContrast'] },
-	'gradientbasedcorrcontrast2012' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalContrast2012'] },
-	'gradientbasedcorrdefringe' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalDefringe'] },
-	'gradientbasedcorrections' => { 343 => 'GradientBasedCorrections' },
-	'gradientbasedcorrexposure' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalExposure'] },
-	'gradientbasedcorrexposure2012' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalExposure2012'] },
-	'gradientbasedcorrhighlights2012' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalHighlights2012'] },
-	'gradientbasedcorrhue' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalToningHue'] },
-	'gradientbasedcorrluminancenoise' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalLuminanceNoise'] },
-	'gradientbasedcorrmaskcenterweight' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCenterWeight'] },
-	'gradientbasedcorrmaskdabs' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksDabs'] },
-	'gradientbasedcorrmaskflow' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksFlow'] },
-	'gradientbasedcorrmaskfullx' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksFullX'] },
-	'gradientbasedcorrmaskfully' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksFullY'] },
-	'gradientbasedcorrmaskradius' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksRadius'] },
-	'gradientbasedcorrmasks' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasks'] },
-	'gradientbasedcorrmaskvalue' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMaskValue'] },
-	'gradientbasedcorrmaskwhat' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksWhat'] },
-	'gradientbasedcorrmaskzerox' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksZeroX'] },
-	'gradientbasedcorrmaskzeroy' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksZeroY'] },
-	'gradientbasedcorrmoire' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalMoire'] },
-	'gradientbasedcorrsaturation' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalSaturation','GradientBasedCorrectionsLocalToningSaturation'] },
-	'gradientbasedcorrshadows2012' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalShadows2012'] },
-	'gradientbasedcorrsharpness' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalSharpness'] },
-	'gradientbasedcorrtemperature' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalTemperature'] },
-	'gradientbasedcorrtint' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalTint'] },
-	'gradientbasedcorrwhat' => { 343 => [\'GradientBasedCorrections','GradientBasedCorrectionsWhat'] },
-	'grainamount' => { 343 => 'GrainAmount' },
-	'grainfrequency' => { 343 => 'GrainFrequency' },
-	'grainsize' => { 343 => 'GrainSize' },
-	'graymixeraqua' => { 343 => 'GrayMixerAqua' },
-	'graymixerblue' => { 343 => 'GrayMixerBlue' },
-	'graymixergreen' => { 343 => 'GrayMixerGreen' },
-	'graymixermagenta' => { 343 => 'GrayMixerMagenta' },
-	'graymixerorange' => { 343 => 'GrayMixerOrange' },
-	'graymixerpurple' => { 343 => 'GrayMixerPurple' },
-	'graymixerred' => { 343 => 'GrayMixerRed' },
-	'graymixeryellow' => { 343 => 'GrayMixerYellow' },
-	'graypoint' => { 329 => 0x8021 },
-	'grayresponseunit' => { 93 => 0x122 },
-	'greencurvelimits' => { 84 => 0x1c4 },
-	'greencurvepoints' => { 84 => 0x19a },
-	'greenhue' => { 343 => 'GreenHue' },
-	'greensaturation' => { 343 => 'GreenSaturation' },
-	'griddisplay' => { 218 => '13.3', 220 => '2.2', 223 => '10.5', 224 => '3.4', 225 => '6.1', 227 => '4.2' },
-	'gripbatteryadload' => { 257 => 0x5 },
-	'gripbatteryadnoload' => { 257 => 0x4 },
-	'gripbatterystate' => { 257 => '1.2' },
-	'halftonehints' => { 93 => 0x141 },
-	'hasalternative' => { 356 => 'hasAlternative' },
-	'hascorrection' => { 356 => 'hasCorrection' },
-	'hascrop' => { 343 => 'HasCrop' },
-	'hasextendedxmp' => { 367 => 'HasExtendedXMP' },
-	'haspreviousversion' => { 356 => 'hasPreviousVersion' },
-	'hassettings' => { 343 => 'HasSettings' },
-	'hastranslation' => { 356 => 'hasTranslation' },
-	'hdr' => { 171 => 0x4, 318 => 0x200a },
-	'hdrinfoversion' => { 171 => 0x0 },
-	'hdrlevel' => { 171 => 0x5, 309 => 0x2e, 319 => 0x17 },
-	'hdrlevel2' => { 171 => 0x7 },
-	'hdrsetting' => { 309 => 0x2d, 319 => 0x16 },
-	'hdrsmoothing' => { 171 => 0x6 },
-	'headline' => { 101 => 0x69, 354 => 'Headline' },
-	'hierarchicalkeywords' => { 138 => [\'Keywords','KeywordsHierarchy'] },
-	'hierarchicalkeywords1' => { 138 => [\'Keywords','KeywordsHierarchyKeyword'] },
-	'hierarchicalkeywords1applied' => { 138 => [\'Keywords','KeywordsHierarchyApplied'] },
-	'hierarchicalkeywords1children' => { 138 => [\'Keywords','KeywordsHierarchyChildren'] },
-	'hierarchicalkeywords2' => { 138 => [\'Keywords','KeywordsHierarchyChildrenKeyword'] },
-	'hierarchicalkeywords2applied' => { 138 => [\'Keywords','KeywordsHierarchyChildrenApplied'] },
-	'hierarchicalkeywords2children' => { 138 => [\'Keywords','KeywordsHierarchyChildrenChildren'] },
-	'hierarchicalkeywords3' => { 138 => [\'Keywords','KeywordsHierarchyChildrenChildrenKeyword'] },
-	'hierarchicalkeywords3applied' => { 138 => [\'Keywords','KeywordsHierarchyChildrenChildrenApplied'] },
-	'hierarchicalkeywords3children' => { 138 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildren'] },
-	'hierarchicalkeywords4' => { 138 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildrenKeyword'] },
-	'hierarchicalkeywords4applied' => { 138 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildrenApplied'] },
-	'hierarchicalkeywords4children' => { 138 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildrenChildren'] },
-	'hierarchicalkeywords5' => { 138 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildrenChildrenKeyword'] },
-	'hierarchicalkeywords5applied' => { 138 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildrenChildrenApplied'] },
-	'hierarchicalkeywords5children' => { 138 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildrenChildrenChildren'] },
-	'hierarchicalkeywords6' => { 138 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildrenChildrenChildrenKeyword'] },
-	'hierarchicalkeywords6applied' => { 138 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildrenChildrenChildrenApplied'] },
-	'hierarchicalsubject' => { 335 => 'hierarchicalSubject' },
-	'highestbiostratigraphiczone' => { 92 => [\'GeologicalContext','GeologicalContextHighestBiostratigraphicZone'] },
-	'highisonoisereduction' => { 13 => 0xbc, 14 => 0xbd, 17 => 0xbd, 23 => 0xc9, 66 => 0x202, 98 => 0x100e, 178 => 0xb1, 278 => 0x71, 307 => 0x2c, 308 => 0x26, 309 => 0x26, 318 => 0x2009, 319 => 0x12 },
-	'highisonoisereduction2' => { 318 => 0xb050 },
-	'highlight' => { 303 => 0xf },
-	'highlightcolordistortreduct' => { 329 => 0x8026 },
-	'highlightprotection' => { 210 => 0x6 },
-	'highlightrecovery' => { 343 => 'HighlightRecovery' },
-	'highlights' => { 337 => 'Highlights' },
-	'highlights2012' => { 343 => 'Highlights2012' },
-	'highlighttonepriority' => { 10 => 0x7, 13 => 0x7, 14 => 0x7, 15 => 0x7, 17 => 0x7, 19 => 0x7, 23 => 0x7, 66 => 0x203 },
-	'highlowkeyadj' => { 278 => 0x6c },
-	'highspeedsync' => { 148 => 0x5 },
-	'histogramxml' => { 211 => 0x83a1a25 },
-	'history' => { 354 => 'History', 366 => 'History' },
-	'historyaction' => { 366 => [\'History','HistoryAction'] },
-	'historychanged' => { 366 => [\'History','HistoryChanged'] },
-	'historyinstanceid' => { 366 => [\'History','HistoryInstanceID'] },
-	'historyparameters' => { 366 => [\'History','HistoryParameters'] },
-	'historysoftwareagent' => { 366 => [\'History','HistorySoftwareAgent'] },
-	'historywhen' => { 366 => [\'History','HistoryWhen'] },
-	'hometowncity' => { 89 => 0x3006, 278 => 0x23, 282 => 0x2 },
-	'hometowncitycode' => { 283 => 0x1000 },
-	'hometowndst' => { 278 => 0x25, 282 => '0.2' },
-	'hostcomputer' => { 93 => 0x13c },
-	'hue' => { 153 => 0x3b, 278 => 0x67 },
-	'hueadj' => { 214 => 0x2f, 329 => 0x8019 },
-	'hueadjustment' => { 146 => 0x4a, 147 => 0x40, 178 => 0x92, 180 => 0x36 },
-	'hueadjustmentaqua' => { 343 => 'HueAdjustmentAqua' },
-	'hueadjustmentblue' => { 343 => 'HueAdjustmentBlue' },
-	'hueadjustmentgreen' => { 343 => 'HueAdjustmentGreen' },
-	'hueadjustmentmagenta' => { 343 => 'HueAdjustmentMagenta' },
-	'hueadjustmentorange' => { 343 => 'HueAdjustmentOrange' },
-	'hueadjustmentpurple' => { 343 => 'HueAdjustmentPurple' },
-	'hueadjustmentred' => { 343 => 'HueAdjustmentRed' },
-	'hueadjustmentyellow' => { 343 => 'HueAdjustmentYellow' },
-	'huesetting' => { 236 => 0x1011 },
-	'icc_profile' => { 94 => 'ICC_Profile' },
-	'iccprofilename' => { 354 => 'ICCProfile' },
-	'idccreativestyle' => { 329 => 0x8000 },
-	'idcpreviewlength' => { 329 => 0x202 },
-	'idcpreviewstart' => { 329 => 0x201 },
-	'identification' => { 92 => 'Identification' },
-	'identificationid' => { 92 => [\'Identification','IdentificationIdentificationID'] },
-	'identificationqualifier' => { 92 => [\'Identification','IdentificationIdentificationQualifier'] },
-	'identificationreferences' => { 92 => [\'Identification','IdentificationIdentificationReferences'] },
-	'identificationremarks' => { 92 => [\'Identification','IdentificationIdentificationRemarks'] },
-	'identifiedby' => { 92 => [\'Identification','IdentificationIdentifiedBy'] },
-	'identifier' => { 344 => 'identifier', 363 => 'Identifier' },
-	'illumination' => { 225 => '0.5' },
-	'imageadjustment' => { 178 => 0x80, 201 => 0x5 },
-	'imagealterationconstraints' => { 355 => 'ImageAlterationConstraints' },
-	'imagearea' => { 188 => 0x10, 191 => 0x10 },
-	'imageareaoffset' => { 278 => 0x38 },
-	'imageauthentication' => { 178 => 0x20 },
-	'imageboundary' => { 178 => 0x16 },
-	'imagecount' => { 178 => 0xa5 },
-	'imagecreator' => { 355 => 'ImageCreator' },
-	'imagecreatorid' => { 355 => [\'ImageCreator','ImageCreatorImageCreatorID'] },
-	'imagecreatorimageid' => { 355 => 'ImageCreatorImageID' },
-	'imagecreatorname' => { 355 => [\'ImageCreator','ImageCreatorImageCreatorName'] },
-	'imagedatasize' => { 178 => 0xa2 },
-	'imagedescription' => { 93 => 0x10e, 361 => 'ImageDescription' },
-	'imageduplicationconstraints' => { 355 => 'ImageDuplicationConstraints' },
-	'imagedustoff' => { 211 => 0xfe443a45 },
-	'imageeditcount' => { 278 => 0x41 },
-	'imageediting' => { 278 => 0x32 },
-	'imagefileconstraints' => { 355 => 'ImageFileConstraints' },
-	'imagefileformatasdelivered' => { 355 => 'ImageFileFormatAsDelivered' },
-	'imagefilesizeasdelivered' => { 355 => 'ImageFileSizeAsDelivered' },
-	'imageheight' => { 93 => 0x101, 152 => 0xc, 361 => 'ImageLength' },
-	'imagehistory' => { 93 => 0x9213 },
-	'imageidnumber' => { 243 => 0x340 },
-	'imagenumber' => { 93 => 0x9211, 123 => 'ImageNumber', 146 => 0xae, 147 => 0x5e, 307 => 0x9b, 309 => [0x400,0x114,0x314], 340 => 'ImageNumber' },
-	'imagenumber2' => { 147 => 0x62 },
-	'imageoptimization' => { 178 => 0xa9 },
-	'imageorientation' => { 101 => 0x83 },
-	'imageprocessing' => { 178 => 0x1a },
-	'imageprocessingversion' => { 232 => 0x0 },
-	'imagequality' => { 123 => 'ImageQuality', 190 => '723.2', 191 => '732.2', 198 => '708.1', 247 => 0x1 },
-	'imagequality2' => { 228 => 0x603 },
-	'imageref' => { 350 => 'ImageRef' },
-	'imagereview' => { 219 => '0.4', 225 => '0.4' },
-	'imagereviewtime' => { 219 => '2.1', 220 => '19.1', 221 => '20.1', 222 => '20.1', 223 => '9.2', 224 => '20.1', 227 => '21.2' },
-	'imagesize' => { 129 => 'ImageSize' },
-	'imagesizerestriction' => { 358 => 'imageSizeRestriction' },
-	'imagesourcedata' => { 93 => 0x935c },
-	'imagestabilization' => { 27 => 0x22, 89 => 0x3020, 123 => 'ImageStabilization', 146 => 0xbd, 147 => 0x71, 148 => 0x57, 149 => 0x0, 150 => [0x18,0x107,0x113], 151 => 0x49c2, 178 => 0xac, 228 => 0x604, 231 => 0x1600, 247 => 0x1a, 312 => 0x12, 313 => 0x11, 318 => 0xb026 },
-	'imagestabilization2' => { 311 => 0xa },
-	'imagestabilizationsetting' => { 151 => 0x14, 307 => 0x3d, 308 => 0x3d, 317 => 0x14 },
-	'imagestyle' => { 307 => 0x2d, 308 => 0x27 },
-	'imagesupplier' => { 355 => 'ImageSupplier' },
-	'imagesupplierid' => { 355 => [\'ImageSupplier','ImageSupplierImageSupplierID'] },
-	'imagesupplierimageid' => { 355 => 'ImageSupplierImageID' },
-	'imagesuppliername' => { 355 => [\'ImageSupplier','ImageSupplierImageSupplierName'] },
-	'imagetemperaturemax' => { 95 => 0x1 },
-	'imagetemperaturemin' => { 95 => 0x2 },
-	'imagetone' => { 278 => 0x4f },
-	'imagetype' => { 101 => 0x82, 355 => 'ImageType' },
-	'imageuniqueid' => { 49 => 0x28, 93 => 0xa420, 347 => 'ImageUniqueID' },
-	'imagewidth' => { 93 => 0x100, 152 => 0xe, 361 => 'ImageWidth' },
-	'incrementaltemperature' => { 343 => 'IncrementalTemperature' },
-	'incrementaltint' => { 343 => 'IncrementalTint' },
-	'industry' => { 356 => 'industry', 357 => 'industry' },
-	'infobuttonwhenshooting' => { 66 => 0x409 },
-	'infraredilluminator' => { 291 => 0x28 },
-	'ingredients' => { 366 => 'Ingredients' },
-	'ingredientsalternatepaths' => { 366 => [\'Ingredients','IngredientsAlternatePaths'] },
-	'ingredientsdocumentid' => { 366 => [\'Ingredients','IngredientsDocumentID'] },
-	'ingredientsfilepath' => { 366 => [\'Ingredients','IngredientsFilePath'] },
-	'ingredientsfrompart' => { 366 => [\'Ingredients','IngredientsFromPart'] },
-	'ingredientsinstanceid' => { 366 => [\'Ingredients','IngredientsInstanceID'] },
-	'ingredientslastmodifydate' => { 366 => [\'Ingredients','IngredientsLastModifyDate'] },
-	'ingredientsmanager' => { 366 => [\'Ingredients','IngredientsManager'] },
-	'ingredientsmanagervariant' => { 366 => [\'Ingredients','IngredientsManagerVariant'] },
-	'ingredientsmanageto' => { 366 => [\'Ingredients','IngredientsManageTo'] },
-	'ingredientsmanageui' => { 366 => [\'Ingredients','IngredientsManageUI'] },
-	'ingredientsmaskmarkers' => { 366 => [\'Ingredients','IngredientsMaskMarkers'] },
-	'ingredientsoriginaldocumentid' => { 366 => [\'Ingredients','IngredientsOriginalDocumentID'] },
-	'ingredientspartmapping' => { 366 => [\'Ingredients','IngredientsPartMapping'] },
-	'ingredientsrenditionclass' => { 366 => [\'Ingredients','IngredientsRenditionClass'] },
-	'ingredientsrenditionparams' => { 366 => [\'Ingredients','IngredientsRenditionParams'] },
-	'ingredientstopart' => { 366 => [\'Ingredients','IngredientsToPart'] },
-	'ingredientsversionid' => { 366 => [\'Ingredients','IngredientsVersionID'] },
-	'initialhorizontalfovdegrees' => { 333 => 'InitialHorizontalFOVDegrees' },
-	'initialviewheadingdegrees' => { 333 => 'InitialViewHeadingDegrees' },
-	'initialviewpitchdegrees' => { 333 => 'InitialViewPitchDegrees' },
-	'initialviewrolldegrees' => { 333 => 'InitialViewRollDegrees' },
-	'initialzoomliveview' => { 218 => '4.4' },
-	'initialzoomsetting' => { 218 => '9.3', 223 => '27.3' },
-	'inkset' => { 93 => 0x14c },
-	'instanceid' => { 366 => 'InstanceID' },
-	'instantplaybacksetup' => { 148 => 0x3e },
-	'instantplaybacktime' => { 148 => 0x3d },
-	'instructions' => { 354 => 'Instructions' },
-	'instrument' => { 365 => 'instrument' },
-	'intellectualgenre' => { 351 => 'IntellectualGenre' },
-	'intelligentauto' => { 318 => 0xb052 },
-	'intelligentcontrast' => { 39 => 0x4 },
-	'intelligentd-range' => { 247 => 0x79 },
-	'intelligentexposure' => { 247 => 0x5d },
-	'intelligentresolution' => { 247 => 0x70 },
-	'interchangecolorspace' => { 103 => 0x40 },
-	'internalflash' => { 145 => 0x2b, 218 => '23.1', 219 => '8.1', 220 => '22.1', 222 => '23.1', 225 => '8.1', 227 => '24.1', 231 => 0x1208 },
-	'internalflashae1' => { 233 => 0x1021 },
-	'internalflashae1_0' => { 233 => 0x101d },
-	'internalflashae2' => { 233 => 0x1022 },
-	'internalflashae2_0' => { 233 => 0x101e },
-	'internalflashmode' => { 266 => 0x1 },
-	'internalflashstrength' => { 266 => 0x3 },
-	'internalflashtable' => { 233 => 0x1024 },
-	'internalserialnumber' => { 49 => 0x96, 59 => 0x9, 98 => 0x10, 151 => 0x49dc, 229 => 0x102, 247 => 0x25, 258 => 0x4, 295 => 0x5 },
-	'interopindex' => { 93 => 0x1 },
-	'interopversion' => { 93 => 0x2 },
-	'intervallength' => { 145 => 0x10 },
-	'intervalmode' => { 145 => 0x26 },
-	'intervalnumber' => { 145 => 0x11 },
-	'introtime' => { 365 => 'introTime' },
-	'introtimescale' => { 365 => [\'introTime','introTimeScale'] },
-	'introtimevalue' => { 365 => [\'introTime','introTimeValue'] },
-	'iptc' => { 94 => 'IPTC' },
-	'iptc-naa' => { 93 => 0x83bb, 251 => 0x83bb },
-	'iptcbitspersample' => { 103 => 0x56 },
-	'iptcdigest' => { 288 => 0x425 },
-	'iptcimageheight' => { 103 => 0x1e },
-	'iptcimagerotation' => { 103 => 0x66 },
-	'iptcimagewidth' => { 103 => 0x14 },
-	'iptclastedited' => { 352 => 'IptcLastEdited' },
-	'iptcpicturenumber' => { 103 => 0xa },
-	'iptcpixelheight' => { 103 => 0x32 },
-	'iptcpixelwidth' => { 103 => 0x28 },
-	'isbn' => { 356 => 'isbn' },
-	'iscorrectionof' => { 356 => 'isCorrectionOf' },
-	'iscustompicturestyle' => { 85 => 0x3 },
-	'iso' => { 4 => 0x6, 6 => 0x6, 7 => 0x75, 8 => 0x6, 9 => 0x79, 10 => 0x6, 11 => 0x6, 12 => 0x6, 13 => 0x6, 14 => 0x6, 15 => 0x6, 16 => 0x6, 17 => 0x6, 18 => 0x6, 19 => 0x6, 20 => 0x6, 21 => 0x6, 22 => 0x6, 23 => 0x6, 24 => 0x0, 25 => 0x1, 88 => 0x14, 89 => [0x3014,0x14], 93 => 0x8827, 106 => 0xfd06, 107 => 0x1784, 109 => 0x60, 111 => [0xfa2e,0xfa46], 112 => [0x27,0x28], 113 => 0xf105, 116 => 0x14, 118 => 0x4e, 121 => 0x34, 123 => 'ISO', 145 => 0x8, 151 => 0x49ba, 172 => 0x0, 178 => 0x2, 251 => 0x17, 278 => [0x8b,0x14], 283 => 0x14, 300 => 0xa014, 347 => 'ISOSpeedRatings' },
-	'iso2' => { 172 => 0x6, 185 => 0x265, 186 => 0x25c, 187 => 0x265, 188 => 0x221, 189 => 0x25d, 190 => 0x256, 191 => 0x25d, 193 => 0x2b5, 196 => 0x265, 200 => 0x2b5 },
-	'isoauto' => { 259 => '14.4' },
-	'isoautoparameters' => { 278 => 0x7a },
-	'isodisplay' => { 220 => '2.3', 221 => '3.3', 222 => '3.3', 224 => '3.3', 227 => '4.3' },
-	'isoexpansion' => { 66 => 0x103, 67 => 0x7, 68 => 0x8, 71 => 0x8, 172 => 0x4 },
-	'isoexpansion2' => { 172 => 0xa },
-	'isofloor' => { 259 => 0x6 },
-	'isoselection' => { 178 => 0xf },
-	'isosensitivitystep' => { 224 => '6.2' },
-	'isosetting' => { 109 => 0x5e, 123 => 'ISOSetting', 145 => 0x24, 146 => 0x26, 147 => 0x1c, 148 => 0x13, 153 => 0x6, 178 => 0x13, 259 => '17.3', 294 => 0x27, 307 => 0x16, 308 => 0x14, 309 => 0x2 },
-	'isospeed' => { 93 => 0x8833 },
-	'isospeedexpansion' => { 65 => 0x3 },
-	'isospeedincrements' => { 66 => 0x102 },
-	'isospeedlatitudeyyy' => { 93 => 0x8834 },
-	'isospeedlatitudezzz' => { 93 => 0x8835 },
-	'isospeedrange' => { 66 => 0x103 },
-	'isostepsize' => { 218 => '6.1', 223 => '4.1' },
-	'isovalue' => { 233 => 0x1001 },
-	'issn' => { 356 => 'issn' },
-	'issueidentifier' => { 356 => 'issueIdentifier' },
-	'issuename' => { 356 => 'issueName' },
-	'istranslationof' => { 356 => 'isTranslationOf' },
-	'jobid' => { 101 => 0xb8 },
-	'jobname' => { 348 => 'JobName' },
-	'jobref' => { 364 => 'JobRef' },
-	'jobrefid' => { 364 => [\'JobRef','JobRefId'] },
-	'jobrefname' => { 364 => [\'JobRef','JobRefName'] },
-	'jobrefurl' => { 364 => [\'JobRef','JobRefUrl'] },
-	'jobstatus' => { 348 => 'JobStatus' },
-	'jpegquality' => { 7 => 0x66, 249 => 0x3034, 318 => 0xb047 },
-	'jpegsize' => { 249 => 0x303a },
-	'jpgfromraw' => { 79 => 0x2007, 90 => 'JpgFromRaw', 251 => 0x2e },
-	'jpgfromrawlength' => { 93 => [0x117,0x202] },
-	'jpgfromrawstart' => { 93 => [0x111,0x201] },
-	'jpgrecordedpixels' => { 259 => '14.1' },
-	'jurisdiction' => { 341 => 'jurisdiction' },
-	'kelvinwb_01' => { 267 => 0x5 },
-	'kelvinwb_02' => { 267 => 0x9 },
-	'kelvinwb_03' => { 267 => 0xd },
-	'kelvinwb_04' => { 267 => 0x11 },
-	'kelvinwb_05' => { 267 => 0x15 },
-	'kelvinwb_06' => { 267 => 0x19 },
-	'kelvinwb_07' => { 267 => 0x1d },
-	'kelvinwb_08' => { 267 => 0x21 },
-	'kelvinwb_09' => { 267 => 0x25 },
-	'kelvinwb_10' => { 267 => 0x29 },
-	'kelvinwb_11' => { 267 => 0x2d },
-	'kelvinwb_12' => { 267 => 0x31 },
-	'kelvinwb_13' => { 267 => 0x35 },
-	'kelvinwb_14' => { 267 => 0x39 },
-	'kelvinwb_15' => { 267 => 0x3d },
-	'kelvinwb_16' => { 267 => 0x41 },
-	'kelvinwb_daylight' => { 267 => 0x1 },
-	'key' => { 365 => 'key' },
-	'keyword' => { 356 => 'keyword' },
-	'keywordinfo' => { 138 => 'Keywords' },
-	'keywords' => { 101 => 0x19, 124 => 'Keywords', 237 => 'Keywords', 290 => 'Keywords', 338 => 'keywords', 353 => 'Keywords', 363 => 'Keywords' },
-	'killdate' => { 356 => 'killDate' },
-	'kodakimageheight' => { 106 => 0xf908, 109 => 0xe, 111 => [0xfa1e,0xfa52], 117 => 0x70 },
-	'kodakimagewidth' => { 106 => 0xf907, 109 => 0xc, 111 => [0xfa1d,0xfa51], 117 => 0x6c },
-	'kodakinfotype' => { 106 => 0xfa00 },
-	'kodakmaker' => { 117 => 0x8 },
-	'kodakmodel' => { 109 => 0x0, 117 => 0x28 },
-	'label' => { 239 => 'Label', 363 => 'Label' },
-	'labelname1' => { 350 => [\'TagStructure','TagStructureLabelName'] },
-	'labelname2' => { 350 => [\'TagStructure','TagStructureSubLabelsLabelName'] },
-	'labelname3' => { 350 => [\'TagStructure','TagStructureSubLabelsSubLabelsLabelName'] },
-	'labelname4' => { 350 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsLabelName'] },
-	'labelname5' => { 350 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsSubLabelsLabelName'] },
-	'labelname6' => { 350 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsLabelName'] },
-	'landmark' => { 247 => 0x6f },
-	'landscapeoutputhighlightpoint' => { 85 => 0x26 },
-	'landscapeoutputshadowpoint' => { 85 => 0x27 },
-	'landscaperawcolortone' => { 85 => 0x1f },
-	'landscaperawcontrast' => { 85 => 0x21 },
-	'landscaperawhighlight' => { 85 => 0x77 },
-	'landscaperawhighlightpoint' => { 85 => 0x24 },
-	'landscaperawlinear' => { 85 => 0x22 },
-	'landscaperawsaturation' => { 85 => 0x20 },
-	'landscaperawshadow' => { 85 => 0x80 },
-	'landscaperawshadowpoint' => { 85 => 0x25 },
-	'landscaperawsharpness' => { 85 => 0x23 },
-	'landscapeunsharpmaskfineness' => { 85 => 0xa0 },
-	'landscapeunsharpmaskstrength' => { 85 => 0x9e },
-	'landscapeunsharpmaskthreshold' => { 85 => 0xa2 },
-	'language' => { 344 => 'language' },
-	'languageidentifier' => { 101 => 0x87 },
-	'largestvalidinteriorrectheight' => { 333 => 'LargestValidInteriorRectHeight' },
-	'largestvalidinteriorrectleft' => { 333 => 'LargestValidInteriorRectLeft' },
-	'largestvalidinteriorrecttop' => { 333 => 'LargestValidInteriorRectTop' },
-	'largestvalidinteriorrectwidth' => { 333 => 'LargestValidInteriorRectWidth' },
-	'lastfilenumber' => { 145 => 0x1b },
-	'lastkeywordiptc' => { 143 => 'LastKeywordIPTC' },
-	'lastkeywordxmp' => { 143 => 'LastKeywordXMP' },
-	'lastphotodate' => { 333 => 'LastPhotoDate' },
-	'lasturl' => { 366 => 'LastURL' },
-	'lateralchromaticaberration' => { 318 => 0x2012 },
-	'latestageorhigheststage' => { 92 => [\'GeologicalContext','GeologicalContextLatestAgeOrHighestStage'] },
-	'latesteonorhighesteonothem' => { 92 => [\'GeologicalContext','GeologicalContextLatestEonOrHighestEonothem'] },
-	'latestepochorhighestseries' => { 92 => [\'GeologicalContext','GeologicalContextLatestEpochOrHighestSeries'] },
-	'latestperiodorhighestsystem' => { 92 => [\'GeologicalContext','GeologicalContextLatestPeriodOrHighestSystem'] },
-	'lc1' => { 269 => 0x2 },
-	'lc10' => { 269 => 0xb },
-	'lc11' => { 269 => 0xc },
-	'lc12' => { 269 => 0xd },
-	'lc14' => { 269 => 0xf },
-	'lc15' => { 269 => 0x10 },
-	'lc2' => { 269 => 0x3 },
-	'lc3' => { 269 => 0x4 },
-	'lc4' => { 269 => 0x5 },
-	'lc5' => { 269 => 0x6 },
-	'lc6' => { 269 => 0x7 },
-	'lc7' => { 269 => 0x8 },
-	'lcddisplayatpoweron' => { 66 => 0x811, 70 => 0xa },
-	'lcddisplayreturntoshoot' => { 71 => 0x12 },
-	'lcdillumination' => { 218 => '17.5', 223 => '10.3', 224 => '4.2', 227 => '5.4' },
-	'lcdilluminationduringbulb' => { 66 => 0x408 },
-	'lcdpanels' => { 65 => 0x8 },
-	'lcheditor' => { 211 => 0x8ae85e },
-	'legacyiptcdigest' => { 354 => 'LegacyIPTCDigest' },
-	'legalcode' => { 341 => 'legalcode' },
-	'lens' => { 93 => 0xfdea, 178 => 0x84, 340 => 'Lens' },
-	'lensafstopbutton' => { 64 => 0x11, 65 => 0x13, 66 => 0x506, 67 => 0x10, 68 => 0x12, 71 => 0x13, 72 => 0x9 },
-	'lensaperturerange' => { 303 => [0x30,0x48] },
-	'lensdistortionparams' => { 233 => 0x206 },
-	'lensdrivenoaf' => { 66 => 0x505 },
-	'lensfirmware' => { 296 => 0x20, 300 => 0xa004 },
-	'lensfirmwareversion' => { 229 => 0x204 },
-	'lensfocalrange' => { 303 => [0xa,0x2a] },
-	'lensfstops' => { 173 => 0x7, 174 => 0xc, 175 => 0xd, 178 => 0x8b, 269 => '0.3' },
-	'lensid' => { 340 => 'LensID' },
-	'lensidnumber' => { 173 => 0x6, 174 => 0xb, 175 => 0xc },
-	'lensinfo' => { 93 => 0xa432, 275 => 0x2a, 340 => 'LensInfo' },
-	'lenskind' => { 269 => 0x1 },
-	'lensmake' => { 93 => 0xa433, 130 => 'Make' },
-	'lensmanualdistortionamount' => { 343 => 'LensManualDistortionAmount' },
-	'lensmanufacturer' => { 143 => 'LensManufacturer' },
-	'lensmaxaperturerange' => { 303 => 0x2b },
-	'lensmodel' => { 4 => 0x937, 11 => 0x92b, 12 => 0x933, 49 => 0x95, 93 => 0xa434, 130 => 'Model', 143 => 'LensModel', 176 => 0x18a, 229 => 0x203, 275 => 0xc },
-	'lensprofilechromaticaberrationscale' => { 343 => 'LensProfileChromaticAberrationScale' },
-	'lensprofiledigest' => { 343 => 'LensProfileDigest' },
-	'lensprofiledistortionscale' => { 343 => 'LensProfileDistortionScale' },
-	'lensprofileenable' => { 343 => 'LensProfileEnable' },
-	'lensprofilefilename' => { 343 => 'LensProfileFilename' },
-	'lensprofilename' => { 343 => 'LensProfileName' },
-	'lensprofilesetup' => { 343 => 'LensProfileSetup' },
-	'lensprofilevignettingscale' => { 343 => 'LensProfileVignettingScale' },
-	'lensproperties' => { 229 => 0x20b },
-	'lensserialnumber' => { 47 => 0x0, 93 => 0xa435, 130 => 'SerialNumber', 229 => 0x202, 247 => 0x52, 296 => 0x30 },
-	'lensshutterlock' => { 148 => 0x4a },
-	'lensspec' => { 305 => 0x0, 306 => 0x0, 318 => 0xb02a },
-	'lenstemperature' => { 233 => 0x1008 },
-	'lenstype' => { 4 => 0xe2, 5 => 0xd, 6 => 0x1a7, 7 => 0xc, 8 => 0x111, 9 => 0xc, 10 => 0x14f, 11 => 0xd6, 12 => 0xde, 13 => 0xf6, 14 => 0xea, 15 => 0xff, 16 => [0xc,0x97], 17 => 0xe6, 18 => 0x153, 19 => 0xea, 20 => 0xe8, 21 => 0x127, 22 => 0x161, 23 => 0x112, 27 => 0x16, 150 => 0x10c, 151 => 0x49bd, 178 => 0x83, 229 => 0x201, 240 => 0x16, 243 => 0x310, 246 => 0x303, 247 => 0x51, 249 => 0x3405, 270 => 0x0, 271 => 0x0, 272 => 0x1, 273 => 0x1, 274 => 0x1, 276 => 0x0, 300 => 0xa003, 303 => 0x27, 318 => 0xb027 },
-	'levelgaugepitch' => { 228 => 0x904 },
-	'levelgaugeroll' => { 228 => 0x903 },
-	'levelorientation' => { 277 => 0x0 },
-	'license' => { 341 => 'license' },
-	'licensee' => { 355 => 'Licensee' },
-	'licenseeid' => { 355 => [\'Licensee','LicenseeLicenseeID'] },
-	'licenseeimageid' => { 355 => 'LicenseeImageID' },
-	'licenseeimagenotes' => { 355 => 'LicenseeImageNotes' },
-	'licenseename' => { 355 => [\'Licensee','LicenseeLicenseeName'] },
-	'licenseenddate' => { 355 => 'LicenseEndDate' },
-	'licenseeprojectreference' => { 355 => 'LicenseeProjectReference' },
-	'licenseetransactionid' => { 355 => 'LicenseeTransactionID' },
-	'licenseid' => { 355 => 'LicenseID' },
-	'licensestartdate' => { 355 => 'LicenseStartDate' },
-	'licensetransactiondate' => { 355 => 'LicenseTransactionDate' },
-	'licensetype' => { 345 => 'licensetype' },
-	'licensor' => { 355 => 'Licensor' },
-	'licensorcity' => { 355 => [\'Licensor','LicensorLicensorCity'] },
-	'licensorcountry' => { 355 => [\'Licensor','LicensorLicensorCountry'] },
-	'licensoremail' => { 355 => [\'Licensor','LicensorLicensorEmail'] },
-	'licensorextendedaddress' => { 355 => [\'Licensor','LicensorLicensorExtendedAddress'] },
-	'licensorid' => { 355 => [\'Licensor','LicensorLicensorID'] },
-	'licensorimageid' => { 355 => 'LicensorImageID' },
-	'licensorname' => { 355 => [\'Licensor','LicensorLicensorName'] },
-	'licensornotes' => { 355 => 'LicensorNotes' },
-	'licensorpostalcode' => { 355 => [\'Licensor','LicensorLicensorPostalCode'] },
-	'licensorregion' => { 355 => [\'Licensor','LicensorLicensorRegion'] },
-	'licensorstreetaddress' => { 355 => [\'Licensor','LicensorLicensorStreetAddress'] },
-	'licensortelephone1' => { 355 => [\'Licensor','LicensorLicensorTelephone1'] },
-	'licensortelephone2' => { 355 => [\'Licensor','LicensorLicensorTelephone2'] },
-	'licensortelephonetype1' => { 355 => [\'Licensor','LicensorLicensorTelephoneType1'] },
-	'licensortelephonetype2' => { 355 => [\'Licensor','LicensorLicensorTelephoneType2'] },
-	'licensortransactionid' => { 355 => 'LicensorTransactionID' },
-	'licensorurl' => { 355 => [\'Licensor','LicensorLicensorURL'] },
-	'lightcondition' => { 233 => 0x1009 },
-	'lightingmode' => { 89 => 0x302a },
-	'lightreading' => { 278 => 0x15 },
-	'lightsource' => { 93 => 0x9208, 178 => 0x90, 236 => 0x1000, 347 => 'LightSource' },
-	'lightsourcespecial' => { 302 => 0x21d },
-	'lightswitch' => { 227 => '0.1' },
-	'lightvaluecenter' => { 233 => 0x103d },
-	'lightvalueperiphery' => { 233 => 0x103e },
-	'linearizationtable' => { 93 => 0xc618 },
-	'linearresponselimit' => { 93 => 0xc62e },
-	'linkaetoafpoint' => { 259 => '14.2' },
-	'lithostratigraphicterms' => { 92 => [\'GeologicalContext','GeologicalContextLithostratigraphicTerms'] },
-	'liveviewaf' => { 220 => '32.1', 227 => '34.1' },
-	'liveviewafareamode' => { 224 => '34.1' },
-	'liveviewafmethod' => { 319 => 0x20 },
-	'liveviewafmode' => { 224 => '34.2' },
-	'liveviewafsetting' => { 309 => 0x36 },
-	'liveviewexposuresimulation' => { 66 => 0x810 },
-	'liveviewfocusmode' => { 309 => 0x8b },
-	'liveviewmetering' => { 309 => 0x84 },
-	'liveviewmonitorofftime' => { 221 => '20.2', 222 => '20.2', 224 => '20.2' },
-	'liveviewshooting' => { 44 => 0x13 },
-	'localcaption' => { 101 => 0x79 },
-	'localizedcameramodel' => { 93 => 0xc615 },
-	'locallocationname' => { 300 => 0x30 },
-	'location' => { 177 => 0x9, 247 => 0x67, 336 => 'Location', 351 => 'Location', 356 => 'location' },
-	'locationareacode' => { 342 => 'lac' },
-	'locationcreated' => { 352 => 'LocationCreated' },
-	'locationcreatedcity' => { 352 => [\'LocationCreated','LocationCreatedCity'] },
-	'locationcreatedcountrycode' => { 352 => [\'LocationCreated','LocationCreatedCountryCode'] },
-	'locationcreatedcountryname' => { 352 => [\'LocationCreated','LocationCreatedCountryName'] },
-	'locationcreatedprovincestate' => { 352 => [\'LocationCreated','LocationCreatedProvinceState'] },
-	'locationcreatedsublocation' => { 352 => [\'LocationCreated','LocationCreatedSublocation'] },
-	'locationcreatedworldregion' => { 352 => [\'LocationCreated','LocationCreatedWorldRegion'] },
-	'locationinfoversion' => { 177 => 0x0 },
-	'locationname' => { 300 => 0x31 },
-	'locationshown' => { 352 => 'LocationShown' },
-	'locationshowncity' => { 352 => [\'LocationShown','LocationShownCity'] },
-	'locationshowncountrycode' => { 352 => [\'LocationShown','LocationShownCountryCode'] },
-	'locationshowncountryname' => { 352 => [\'LocationShown','LocationShownCountryName'] },
-	'locationshownprovincestate' => { 352 => [\'LocationShown','LocationShownProvinceState'] },
-	'locationshownsublocation' => { 352 => [\'LocationShown','LocationShownSublocation'] },
-	'locationshownworldregion' => { 352 => [\'LocationShown','LocationShownWorldRegion'] },
-	'lockmicrophonebutton' => { 66 => 0x709 },
-	'logcomment' => { 365 => 'logComment' },
-	'longexposurenoisereduction' => { 66 => 0x201, 67 => 0x1, 68 => 0x2, 69 => 0x1, 70 => 0x1, 71 => 0x2, 72 => 0x1, 307 => 0x2b, 308 => 0x25, 309 => 0x25, 318 => [0xb04e,0x2008], 319 => 0x11 },
-	'longexposurenoisereduction2' => { 44 => 0x8 },
-	'loop' => { 365 => 'loop' },
-	'lowestbiostratigraphiczone' => { 92 => [\'GeologicalContext','GeologicalContextLowestBiostratigraphicZone'] },
-	'luminanceadjustmentaqua' => { 343 => 'LuminanceAdjustmentAqua' },
-	'luminanceadjustmentblue' => { 343 => 'LuminanceAdjustmentBlue' },
-	'luminanceadjustmentgreen' => { 343 => 'LuminanceAdjustmentGreen' },
-	'luminanceadjustmentmagenta' => { 343 => 'LuminanceAdjustmentMagenta' },
-	'luminanceadjustmentorange' => { 343 => 'LuminanceAdjustmentOrange' },
-	'luminanceadjustmentpurple' => { 343 => 'LuminanceAdjustmentPurple' },
-	'luminanceadjustmentred' => { 343 => 'LuminanceAdjustmentRed' },
-	'luminanceadjustmentyellow' => { 343 => 'LuminanceAdjustmentYellow' },
-	'luminancecurvelimits' => { 84 => 0x150 },
-	'luminancecurvepoints' => { 84 => 0x126 },
-	'luminancenoisereduction' => { 85 => 0x5f, 303 => 0x1b },
-	'luminancenoisereductioncontrast' => { 343 => 'LuminanceNoiseReductionContrast' },
-	'luminancenoisereductiondetail' => { 343 => 'LuminanceNoiseReductionDetail' },
-	'luminancenr_tiff_jpeg' => { 85 => 0x6d },
-	'luminancesmoothing' => { 343 => 'LuminanceSmoothing' },
-	'lvshootingareadisplay' => { 66 => 0x40b },
-	'm16cversion' => { 243 => 0x333 },
-	'macro' => { 98 => 0x1020, 99 => 0x202, 233 => 0x202, 294 => 0x21, 302 => 0x202, 318 => 0xb040 },
-	'macroled' => { 231 => 0x120a },
-	'macromagnification' => { 4 => 0x1b, 8 => 0x1b, 11 => 0x1b, 12 => 0x1b, 16 => 0x1b, 17 => 0x1b, 44 => 0x10 },
-	'macromode' => { 27 => 0x1, 145 => 0xb, 228 => 0x300, 247 => 0x1c },
-	'magicfilter' => { 228 => 0x52c },
-	'magnifiedview' => { 68 => 0x11, 70 => 0x9 },
-	'maindialexposurecomp' => { 225 => '0.6' },
-	'make' => { 80 => 0x0, 93 => 0x10f, 123 => 'Make', 239 => 'Make', 251 => 0x10f, 361 => 'Make' },
-	'makernote' => { 347 => 'MakerNote' },
-	'makernotecanon' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotecasio' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotecasio2' => { 91 => 'MakN', 93 => 0x927c },
-	'makernoteflir' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotefujifilm' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotege' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotege2' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotehasselblad' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotehp' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotehp2' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotehp4' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotehp6' => { 91 => 'MakN', 93 => 0x927c },
-	'makernoteisl' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotejvc' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotejvctext' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotekodak10' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotekodak1a' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotekodak1b' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotekodak2' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotekodak3' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotekodak4' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotekodak5' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotekodak6a' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotekodak6b' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotekodak7' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotekodak8a' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotekodak8b' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotekodak9' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotekodakunknown' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotekyocera' => { 91 => 'MakN', 93 => 0x927c },
-	'makernoteleica' => { 91 => 'MakN', 93 => 0x927c },
-	'makernoteleica2' => { 91 => 'MakN', 93 => 0x927c },
-	'makernoteleica3' => { 91 => 'MakN', 93 => 0x927c },
-	'makernoteleica4' => { 91 => 'MakN', 93 => 0x927c },
-	'makernoteleica5' => { 91 => 'MakN', 93 => 0x927c },
-	'makernoteleica6' => { 91 => 'MakN', 93 => 0x927c },
-	'makernoteminolta' => { 91 => 'MakN', 93 => 0x927c },
-	'makernoteminolta2' => { 91 => 'MakN', 93 => 0x927c },
-	'makernoteminolta3' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotenikon' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotenikon2' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotenikon3' => { 91 => 'MakN', 93 => 0x927c },
-	'makernoteoffset' => { 302 => 0xff },
-	'makernoteolympus' => { 91 => 'MakN', 93 => 0x927c },
-	'makernoteolympus2' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotepanasonic' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotepanasonic2' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotepentax' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotepentax2' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotepentax3' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotepentax4' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotepentax5' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotepentax6' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotephaseone' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotereconyx' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotericoh' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotericohtext' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotesafety' => { 93 => 0xc635 },
-	'makernotesamsung1a' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotesamsung1b' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotesamsung2' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotesanyo' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotesanyoc4' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotesanyopatch' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotesigma' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotesony' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotesony2' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotesony3' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotesony4' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotesonyericsson' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotesonysrf' => { 91 => 'MakN', 93 => 0x927c },
-	'makernotetype' => { 295 => 0x1 },
-	'makernoteunknown' => { 91 => 'MakN', 93 => 0x927c },
-	'makernoteunknownbinary' => { 91 => 'MakN', 93 => 0x927c },
-	'makernoteunknowntext' => { 91 => 'MakN', 93 => 0x927c },
-	'makernoteversion' => { 150 => 0x0, 178 => 0x1, 233 => 0x0, 247 => 0x8000, 299 => 0x0, 300 => 0x1, 303 => [0x1d,0x1f], 310 => 0x2000 },
-	'managedfrom' => { 366 => 'ManagedFrom' },
-	'managedfromalternatepaths' => { 366 => [\'ManagedFrom','ManagedFromAlternatePaths'] },
-	'managedfromdocumentid' => { 366 => [\'ManagedFrom','ManagedFromDocumentID'] },
-	'managedfromfilepath' => { 366 => [\'ManagedFrom','ManagedFromFilePath'] },
-	'managedfromfrompart' => { 366 => [\'ManagedFrom','ManagedFromFromPart'] },
-	'managedfrominstanceid' => { 366 => [\'ManagedFrom','ManagedFromInstanceID'] },
-	'managedfromlastmodifydate' => { 366 => [\'ManagedFrom','ManagedFromLastModifyDate'] },
-	'managedfrommanager' => { 366 => [\'ManagedFrom','ManagedFromManager'] },
-	'managedfrommanagervariant' => { 366 => [\'ManagedFrom','ManagedFromManagerVariant'] },
-	'managedfrommanageto' => { 366 => [\'ManagedFrom','ManagedFromManageTo'] },
-	'managedfrommanageui' => { 366 => [\'ManagedFrom','ManagedFromManageUI'] },
-	'managedfrommaskmarkers' => { 366 => [\'ManagedFrom','ManagedFromMaskMarkers'] },
-	'managedfromoriginaldocumentid' => { 366 => [\'ManagedFrom','ManagedFromOriginalDocumentID'] },
-	'managedfrompartmapping' => { 366 => [\'ManagedFrom','ManagedFromPartMapping'] },
-	'managedfromrenditionclass' => { 366 => [\'ManagedFrom','ManagedFromRenditionClass'] },
-	'managedfromrenditionparams' => { 366 => [\'ManagedFrom','ManagedFromRenditionParams'] },
-	'managedfromtopart' => { 366 => [\'ManagedFrom','ManagedFromToPart'] },
-	'managedfromversionid' => { 366 => [\'ManagedFrom','ManagedFromVersionID'] },
-	'manager' => { 366 => 'Manager' },
-	'managervariant' => { 366 => 'ManagerVariant' },
-	'manageto' => { 366 => 'ManageTo' },
-	'manageui' => { 366 => 'ManageUI' },
-	'manifest' => { 366 => 'Manifest' },
-	'manifestlinkform' => { 366 => [\'Manifest','ManifestLinkForm'] },
-	'manifestplacedresolutionunit' => { 366 => [\'Manifest','ManifestPlacedResolutionUnit'] },
-	'manifestplacedxresolution' => { 366 => [\'Manifest','ManifestPlacedXResolution'] },
-	'manifestplacedyresolution' => { 366 => [\'Manifest','ManifestPlacedYResolution'] },
-	'manifestreference' => { 366 => [\'Manifest','ManifestReference'] },
-	'manifestreferencealternatepaths' => { 366 => [\'Manifest','ManifestReferenceAlternatePaths'] },
-	'manifestreferencedocumentid' => { 366 => [\'Manifest','ManifestReferenceDocumentID'] },
-	'manifestreferencefilepath' => { 366 => [\'Manifest','ManifestReferenceFilePath'] },
-	'manifestreferencefrompart' => { 366 => [\'Manifest','ManifestReferenceFromPart'] },
-	'manifestreferenceinstanceid' => { 366 => [\'Manifest','ManifestReferenceInstanceID'] },
-	'manifestreferencelastmodifydate' => { 366 => [\'Manifest','ManifestReferenceLastModifyDate'] },
-	'manifestreferencemanager' => { 366 => [\'Manifest','ManifestReferenceManager'] },
-	'manifestreferencemanagervariant' => { 366 => [\'Manifest','ManifestReferenceManagerVariant'] },
-	'manifestreferencemanageto' => { 366 => [\'Manifest','ManifestReferenceManageTo'] },
-	'manifestreferencemanageui' => { 366 => [\'Manifest','ManifestReferenceManageUI'] },
-	'manifestreferencemaskmarkers' => { 366 => [\'Manifest','ManifestReferenceMaskMarkers'] },
-	'manifestreferenceoriginaldocumentid' => { 366 => [\'Manifest','ManifestReferenceOriginalDocumentID'] },
-	'manifestreferencepartmapping' => { 366 => [\'Manifest','ManifestReferencePartMapping'] },
-	'manifestreferencerenditionclass' => { 366 => [\'Manifest','ManifestReferenceRenditionClass'] },
-	'manifestreferencerenditionparams' => { 366 => [\'Manifest','ManifestReferenceRenditionParams'] },
-	'manifestreferencetopart' => { 366 => [\'Manifest','ManifestReferenceToPart'] },
-	'manifestreferenceversionid' => { 366 => [\'Manifest','ManifestReferenceVersionID'] },
-	'manometerpressure' => { 228 => 0x900, 247 => 0x86 },
-	'manometerreading' => { 228 => 0x901 },
-	'manualafpointselectpattern' => { 66 => 0x513 },
-	'manualflash' => { 231 => 0x1209 },
-	'manualflashoutput' => { 27 => 0x29, 219 => '8.2', 220 => '22.2', 221 => '23.1', 222 => '23.2', 223 => '16.2', 224 => '23.2', 225 => '8.2', 226 => '23.2', 227 => '24.2' },
-	'manualflashstrength' => { 228 => 0x406 },
-	'manualfocusdistance' => { 178 => 0x85, 233 => 0x100c, 302 => 0x223 },
-	'manualtv' => { 65 => 0x5, 66 => 0x705 },
-	'manufacturedate' => { 258 => 0x1 },
-	'manufacturedate1' => { 297 => 0x4 },
-	'manufacturedate2' => { 297 => 0x5 },
-	'marked' => { 353 => 'Marked', 369 => 'Marked' },
-	'markers' => { 365 => 'markers' },
-	'markerscomment' => { 365 => [\'markers','markersComment'] },
-	'markerscuepointparams' => { 365 => [\'markers','markersCuePointParams'] },
-	'markerscuepointparamskey' => { 365 => [\'markers','markersCuePointParamsKey'] },
-	'markerscuepointparamsvalue' => { 365 => [\'markers','markersCuePointParamsValue'] },
-	'markerscuepointtype' => { 365 => [\'markers','markersCuePointType'] },
-	'markersduration' => { 365 => [\'markers','markersDuration'] },
-	'markerslocation' => { 365 => [\'markers','markersLocation'] },
-	'markersname' => { 365 => [\'markers','markersName'] },
-	'markersprobability' => { 365 => [\'markers','markersProbability'] },
-	'markersspeaker' => { 365 => [\'markers','markersSpeaker'] },
-	'markersstarttime' => { 365 => [\'markers','markersStartTime'] },
-	'markerstarget' => { 365 => [\'markers','markersTarget'] },
-	'markerstype' => { 365 => [\'markers','markersType'] },
-	'maskedareas' => { 93 => 0xc68e },
-	'masterdocumentid' => { 101 => 0xb9 },
-	'mastergain' => { 183 => 0x50 },
-	'maxaperture' => { 27 => 0x1a, 113 => 0x6103, 130 => 'MaxAperture', 145 => 0x17, 151 => 0x49c5, 229 => 0x20a, 269 => '14.1', 322 => 0x0 },
-	'maxapertureatmaxfocal' => { 98 => 0x1407, 130 => 'MaxApertureAtMaxFocal', 173 => 0xb, 174 => 0x10, 175 => 0x11, 229 => 0x206 },
-	'maxapertureatminfocal' => { 98 => 0x1406, 173 => 0xa, 174 => 0xf, 175 => 0x10, 229 => 0x205 },
-	'maxaperturevalue' => { 93 => 0x9205, 347 => 'MaxApertureValue' },
-	'maxavailheight' => { 352 => 'MaxAvailHeight' },
-	'maxavailwidth' => { 352 => 'MaxAvailWidth' },
-	'maxcontinuousrelease' => { 218 => 0xb, 223 => 0xc, 224 => 0xb },
-	'maxfaces' => { 232 => 0x1202 },
-	'maxfocallength' => { 4 => 0xe6, 5 => 0x10, 6 => 0x1ab, 7 => 0x13, 8 => 0x115, 9 => 0x13, 10 => 0x153, 11 => 0xda, 13 => 0xfa, 14 => 0xee, 15 => 0x103, 16 => 0x95, 17 => 0xea, 18 => 0x157, 19 => 0xee, 20 => 0xec, 21 => 0x12b, 22 => 0x165, 23 => 0x116, 27 => 0x17, 98 => 0x1405, 130 => 'MaxFocalLength', 173 => 0x9, 174 => 0xe, 175 => 0xf, 229 => 0x208 },
-	'maximumdensityrange' => { 103 => 0x8c },
-	'maxpagesize' => { 370 => 'MaxPageSize' },
-	'maxpagesizeh' => { 370 => [\'MaxPageSize','MaxPageSizeH'] },
-	'maxpagesizeunit' => { 370 => [\'MaxPageSize','MaxPageSizeUnit'] },
-	'maxpagesizew' => { 370 => [\'MaxPageSize','MaxPageSizeW'] },
-	'maxsamplevalue' => { 93 => 0x119 },
-	'maxstorage' => { 360 => 'maxstorage' },
-	'mb-d10batteries' => { 218 => '12.6' },
-	'mb-d10batterytype' => { 223 => '13.3' },
-	'mb-d11batterytype' => { 224 => '2.3' },
-	'mb-d80batteries' => { 225 => '6.5' },
-	'mb-d80batterytype' => { 227 => '3.2' },
-	'mcuversion' => { 173 => 0xc, 174 => 0x11, 175 => 0x12 },
-	'md5digest' => { 131 => 'zmd5' },
-	'measuredev' => { 23 => 0x9, 60 => 0x3, 79 => 0x1814, 123 => 'MeasuredEV' },
-	'measuredev2' => { 10 => 0x8, 23 => 0x8, 60 => 0x17 },
-	'measuredev3' => { 10 => 0x9 },
-	'measuredlv' => { 151 => 0x690, 243 => 0x312, 249 => 0x3407 },
-	'measuredrggb' => { 50 => 0x1 },
-	'measuredrggbdata' => { 33 => 0x287 },
-	'measurementaccuracy' => { 92 => [\'MeasurementOrFact','MeasurementOrFactMeasurementAccuracy'] },
-	'measurementdeterminedby' => { 92 => [\'MeasurementOrFact','MeasurementOrFactMeasurementDeterminedBy'] },
-	'measurementdetermineddate' => { 92 => [\'MeasurementOrFact','MeasurementOrFactMeasurementDeterminedDate'] },
-	'measurementid' => { 92 => [\'MeasurementOrFact','MeasurementOrFactMeasurementID'] },
-	'measurementmethod' => { 92 => [\'MeasurementOrFact','MeasurementOrFactMeasurementMethod'] },
-	'measurementorfact' => { 92 => 'MeasurementOrFact' },
-	'measurementremarks' => { 92 => [\'MeasurementOrFact','MeasurementOrFactMeasurementRemarks'] },
-	'measurementtype' => { 92 => [\'MeasurementOrFact','MeasurementOrFactMeasurementType'] },
-	'measurementunit' => { 92 => [\'MeasurementOrFact','MeasurementOrFactMeasurementUnit'] },
-	'measurementvalue' => { 92 => [\'MeasurementOrFact','MeasurementOrFactMeasurementValue'] },
-	'mediaconstraints' => { 355 => 'MediaConstraints' },
-	'mediasummarycode' => { 355 => 'MediaSummaryCode' },
-	'memorycardconfiguration' => { 313 => 0x16 },
-	'menubuttondisplayposition' => { 64 => 0xb, 67 => 0xa, 68 => 0xb, 71 => 0xb },
-	'menubuttonreturn' => { 72 => 0xb },
-	'menumonitorofftime' => { 223 => '8.2', 224 => '21.1', 227 => '22.1' },
-	'metadatadate' => { 363 => 'MetadataDate' },
-	'metadatamoddate' => { 365 => 'metadataModDate' },
-	'metering' => { 219 => '6.1' },
-	'meteringmode' => { 27 => 0x11, 93 => 0x9207, 109 => 0x1c, 145 => 0x7, 146 => 0x25, 148 => 0x12, 228 => 0x202, 278 => 0x17, 303 => 0x9, 307 => 0x15, 308 => 0x13, 309 => 0x7, 319 => 0x3, 347 => 'MeteringMode' },
-	'meteringmode2' => { 259 => '2.1' },
-	'meteringmode3' => { 259 => '16.1' },
-	'meteringoffscaleindicator' => { 148 => 0x53 },
-	'meteringtime' => { 218 => '22.2', 219 => '3.2', 220 => '17.1', 221 => '18.1', 223 => '7.3', 224 => '18.1', 225 => '3.2', 227 => '19.1' },
-	'mieversion' => { 131 => '0Vers' },
-	'minaperture' => { 27 => 0x1b, 130 => 'MinAperture', 269 => '0.2', 322 => 0x1 },
-	'minfocallength' => { 4 => 0xe4, 5 => 0xe, 6 => 0x1a9, 7 => 0x11, 8 => 0x113, 9 => 0x11, 10 => 0x151, 11 => 0xd8, 13 => 0xf8, 14 => 0xec, 15 => 0x101, 16 => 0x93, 17 => 0xe8, 18 => 0x155, 19 => 0xec, 20 => 0xea, 21 => 0x129, 22 => 0x163, 23 => 0x114, 27 => 0x18, 98 => 0x1404, 130 => 'MinFocalLength', 173 => 0x8, 174 => 0xd, 175 => 0xe, 229 => 0x207 },
-	'minoltadate' => { 145 => 0x15 },
-	'minoltaimagesize' => { 145 => 0x4, 146 => 0xc, 147 => 0x2, 150 => 0x103 },
-	'minoltamodelid' => { 145 => 0x25 },
-	'minoltaquality' => { 145 => 0x5, 146 => 0xd, 147 => 0x3, 150 => [0x102,0x103] },
-	'minoltatime' => { 145 => 0x16 },
-	'minormodelagedisclosure' => { 355 => 'MinorModelAgeDisclosure' },
-	'minsamplevalue' => { 93 => 0x118 },
-	'mirrorlockup' => { 64 => 0xc, 65 => 0xc, 66 => 0x60f, 67 => 0xb, 68 => 0xc, 69 => 0x6, 70 => 0x6, 71 => 0xc, 72 => 0x3 },
-	'mobilecountrycode' => { 342 => 'mcc' },
-	'mobilenetworkcode' => { 342 => 'mnc' },
-	'moddate' => { 239 => 'modify-date', 353 => 'ModDate' },
-	'modedialposition' => { 313 => 0x14 },
-	'model' => { 80 => 0x6, 93 => 0x110, 123 => 'Model', 239 => 'Model', 251 => 0x110, 361 => 'Model' },
-	'modelage' => { 352 => 'ModelAge' },
-	'modelingflash' => { 218 => '21.4', 223 => '26.4', 224 => '30.2', 225 => '7.4', 226 => '30.1', 227 => '31.3' },
-	'modelreleaseid' => { 355 => 'ModelReleaseID' },
-	'modelreleasestatus' => { 355 => 'ModelReleaseStatus' },
-	'modificationdate' => { 356 => 'modificationDate' },
-	'modifiedcolortemp' => { 51 => 0x9 },
-	'modifieddigitalgain' => { 51 => 0xb },
-	'modifiedparamflag' => { 45 => 0x1 },
-	'modifiedpicturestyle' => { 51 => 0xa },
-	'modifiedsaturation' => { 228 => 0x504 },
-	'modifiedsensorbluelevel' => { 51 => 0x5 },
-	'modifiedsensorredlevel' => { 51 => 0x4 },
-	'modifiedsharpness' => { 51 => 0x2 },
-	'modifiedsharpnessfreq' => { 51 => 0x3 },
-	'modifiedtonecurve' => { 51 => 0x1 },
-	'modifiedwhitebalance' => { 51 => 0x8 },
-	'modifiedwhitebalanceblue' => { 51 => 0x7 },
-	'modifiedwhitebalancered' => { 51 => 0x6 },
-	'modifydate' => { 93 => 0x132, 124 => 'ModifyDate', 237 => 'ModDate', 238 => 'tIME', 290 => 'ModDate', 363 => 'ModifyDate' },
-	'moirefilter' => { 93 => 0xfe58, 343 => 'MoireFilter' },
-	'monitordisplayoff' => { 148 => 0x4c },
-	'monitorofftime' => { 218 => '18.2', 219 => '3.1', 225 => '3.1' },
-	'monochromecontrast' => { 85 => 0x3c },
-	'monochromefiltereffect' => { 85 => 0x3a, 278 => 0x73 },
-	'monochromelinear' => { 85 => 0x3d },
-	'monochromeoutputhighlightpoint' => { 85 => 0x41 },
-	'monochromeoutputshadowpoint' => { 85 => 0x42 },
-	'monochromerawhighlight' => { 85 => 0x7a },
-	'monochromerawhighlightpoint' => { 85 => 0x3f },
-	'monochromerawshadow' => { 85 => 0x83 },
-	'monochromerawshadowpoint' => { 85 => 0x40 },
-	'monochromesharpness' => { 85 => 0x3e },
-	'monochrometoning' => { 278 => 0x74 },
-	'monochrometoningeffect' => { 85 => 0x3b },
-	'monochromeunsharpmaskfineness' => { 85 => 0xb2 },
-	'monochromeunsharpmaskstrength' => { 85 => 0xb0 },
-	'monochromeunsharpmaskthreshold' => { 85 => 0xb4 },
-	'monthdaycreated' => { 109 => 0x12, 118 => 0xe },
-	'moonphase' => { 291 => 0x12 },
-	'morepermissions' => { 341 => 'morePermissions' },
-	'motionsensitivity' => { 291 => 0x29 },
-	'multiburstimageheight' => { 318 => 0x1002 },
-	'multiburstimagewidth' => { 318 => 0x1001 },
-	'multiburstmode' => { 318 => 0x1000 },
-	'multicontrollerwhilemetering' => { 66 => 0x517 },
-	'multiexposureautogain' => { 179 => 0x3 },
-	'multiexposuremode' => { 179 => 0x1 },
-	'multiexposureshots' => { 179 => 0x2 },
-	'multiframenoisereduction' => { 309 => 0x35, 318 => 0x200b, 319 => 0x15 },
-	'multifunctionlock' => { 66 => 0x70f },
-	'multipleexposuremode' => { 232 => 0x101c },
-	'multipleexposureset' => { 259 => '10.1' },
-	'multisample' => { 183 => 0x40 },
-	'multiselector' => { 218 => '9.4', 223 => '27.4' },
-	'multiselectorliveview' => { 218 => '4.3' },
-	'multiselectorplaybackmode' => { 218 => ['13.5','9.2'], 223 => '27.2' },
-	'multiselectorshootmode' => { 218 => '9.1', 223 => '27.1' },
-	'mycolormode' => { 53 => 0x2 },
-	'nativedigest' => { 347 => 'NativeDigest', 361 => 'NativeDigest' },
-	'ncdfileinfo' => { 107 => 0x414 },
-	'ndfilter' => { 60 => 0x1c },
-	'nefbitdepth' => { 178 => 0xe22 },
-	'nefcompression' => { 178 => 0x93 },
-	'neflinearizationtable' => { 178 => 0x96 },
-	'neutraldensityfilter' => { 278 => 0x88 },
-	'neutraloutputhighlightpoint' => { 85 => 0x2f },
-	'neutraloutputshadowpoint' => { 85 => 0x30 },
-	'neutralrawcolortone' => { 85 => 0x28 },
-	'neutralrawcontrast' => { 85 => 0x2a },
-	'neutralrawhighlight' => { 85 => 0x78 },
-	'neutralrawhighlightpoint' => { 85 => 0x2d },
-	'neutralrawlinear' => { 85 => 0x2b },
-	'neutralrawsaturation' => { 85 => 0x29 },
-	'neutralrawshadow' => { 85 => 0x81 },
-	'neutralrawshadowpoint' => { 85 => 0x2e },
-	'neutralrawsharpness' => { 85 => 0x2c },
-	'neutralunsharpmaskfineness' => { 85 => 0xa6 },
-	'neutralunsharpmaskthreshold' => { 85 => 0xa8 },
-	'neutraunsharpmaskstrength' => { 85 => 0xa4 },
-	'newrawimagedigest' => { 93 => 0xc7a7 },
-	'newsphotoversion' => { 103 => 0x0 },
-	'nickname' => { 363 => 'Nickname' },
-	'nikoncapturedata' => { 178 => 0xe01 },
-	'nikoncaptureeditversions' => { 178 => 0xe13 },
-	'nikoncaptureoutput' => { 178 => 0xe1e },
-	'nikoncaptureversion' => { 178 => 0xe09 },
-	'nikoniccprofile' => { 178 => 0xe1d },
-	'nikonimagesize' => { 190 => '723.1', 191 => '732.1', 198 => 0x2c4 },
-	'noisefilter' => { 228 => 0x527 },
-	'noiseprofile' => { 93 => 0xc761 },
-	'noisereduction' => { 98 => 0x100b, 146 => 0xb0, 147 => 0x60, 148 => 0x3f, 178 => 0x95, 211 => 0x753dcbc0, 212 => 0x17, 228 => 0x50a, 233 => 0x103a, 247 => 0x2d, 278 => 0x49, 297 => 0x2a },
-	'noisereduction2' => { 232 => 0x1010 },
-	'noisereductionapplied' => { 93 => 0xc6f7 },
-	'noisereductionintensity' => { 212 => 0x9 },
-	'noisereductionmethod' => { 212 => 0x11 },
-	'noisereductionmode' => { 329 => 0x801e },
-	'noisereductionsharpness' => { 212 => 0xd },
-	'noisereductionvalue' => { 329 => 0x8027 },
-	'nomemorycard' => { 218 => '22.1', 219 => '0.3', 220 => '2.4', 221 => '3.2', 222 => '3.2', 223 => '33.7', 224 => '3.2', 225 => '0.3', 227 => '4.5' },
-	'nominalmaxaperture' => { 269 => 0xa },
-	'nominalminaperture' => { 269 => '10.1' },
-	'notes' => { 330 => 'Notes', 338 => 'notes' },
-	'npages' => { 370 => 'NPages' },
-	'nrwdata' => { 178 => 0x14 },
-	'nullrecord' => { 79 => 0x0 },
-	'number' => { 356 => 'number' },
-	'numberofbeats' => { 365 => 'numberOfBeats' },
-	'numberoffocuspoints' => { 222 => '0.2', 224 => '0.3' },
-	'numfacepositions' => { 241 => 0x0 },
-	'numindexentries' => { 103 => 0x54 },
-	'object' => { 356 => 'object' },
-	'objectattributereference' => { 101 => 0x4 },
-	'objectcycle' => { 101 => 0x4b },
-	'objectdistance' => { 88 => 0x6, 89 => 0x2022 },
-	'objectname' => { 101 => 0x5 },
-	'objectpreviewdata' => { 101 => 0xca },
-	'objectpreviewfileformat' => { 101 => 0xc8 },
-	'objectpreviewfileversion' => { 101 => 0xc9 },
-	'objecttypereference' => { 101 => 0x3 },
-	'occurrence' => { 92 => 'Occurrence' },
-	'occurrenceassociatedmedia' => { 92 => [\'Occurrence','OccurrenceAssociatedMedia'] },
-	'occurrenceassociatedoccurrences' => { 92 => [\'Occurrence','OccurrenceAssociatedOccurrences'] },
-	'occurrenceassociatedreferences' => { 92 => [\'Occurrence','OccurrenceAssociatedReferences'] },
-	'occurrenceassociatedsequences' => { 92 => [\'Occurrence','OccurrenceAssociatedSequences'] },
-	'occurrenceassociatedtaxa' => { 92 => [\'Occurrence','OccurrenceAssociatedTaxa'] },
-	'occurrencebehavior' => { 92 => [\'Occurrence','OccurrenceBehavior'] },
-	'occurrencecatalognumber' => { 92 => [\'Occurrence','OccurrenceCatalogNumber'] },
-	'occurrencedetails' => { 92 => [\'Occurrence','OccurrenceOccurrenceDetails'] },
-	'occurrencedisposition' => { 92 => [\'Occurrence','OccurrenceDisposition'] },
-	'occurrenceestablishmentmeans' => { 92 => [\'Occurrence','OccurrenceEstablishmentMeans'] },
-	'occurrenceid' => { 92 => [\'Occurrence','OccurrenceOccurrenceID'] },
-	'occurrenceindividualcount' => { 92 => [\'Occurrence','OccurrenceIndividualCount'] },
-	'occurrenceindividualid' => { 92 => [\'Occurrence','OccurrenceIndividualID'] },
-	'occurrencelifestage' => { 92 => [\'Occurrence','OccurrenceLifeStage'] },
-	'occurrenceothercatalognumbers' => { 92 => [\'Occurrence','OccurrenceOtherCatalogNumbers'] },
-	'occurrencepreparations' => { 92 => [\'Occurrence','OccurrencePreparations'] },
-	'occurrencepreviousidentifications' => { 92 => [\'Occurrence','OccurrencePreviousIdentifications'] },
-	'occurrencerecordedby' => { 92 => [\'Occurrence','OccurrenceRecordedBy'] },
-	'occurrencerecordnumber' => { 92 => [\'Occurrence','OccurrenceRecordNumber'] },
-	'occurrenceremarks' => { 92 => [\'Occurrence','OccurrenceOccurrenceRemarks'] },
-	'occurrencereproductivecondition' => { 92 => [\'Occurrence','OccurrenceReproductiveCondition'] },
-	'occurrencesex' => { 92 => [\'Occurrence','OccurrenceSex'] },
-	'occurrencestatus' => { 92 => [\'Occurrence','OccurrenceOccurrenceStatus'] },
-	'oecfcolumns' => { 347 => [\'OECF','OECFColumns'] },
-	'oecfnames' => { 347 => [\'OECF','OECFNames'] },
-	'oecfrows' => { 347 => [\'OECF','OECFRows'] },
-	'oecfvalues' => { 347 => [\'OECF','OECFValues'] },
-	'offsetschema' => { 93 => 0xea1d },
-	'okbutton' => { 224 => '15.1', 227 => '16.1' },
-	'oldsubfiletype' => { 93 => 0xff },
-	'olympusimageheight' => { 233 => 0x102f },
-	'olympusimagewidth' => { 233 => 0x102e },
-	'onetouchwb' => { 233 => 0x302 },
-	'opticalzoom' => { 111 => 0xfa3d, 113 => [0x6006,0xf006], 114 => 0x1000, 115 => 0xf, 118 => 0x1e, 130 => 'OpticalZoom' },
-	'opticalzoomcode' => { 60 => 0xa },
-	'opticalzoommode' => { 247 => 0x34 },
-	'opticalzoomon' => { 302 => 0x219 },
-	'optionenddate' => { 358 => 'optionEndDate' },
-	'opto-electricconvfactor' => { 347 => 'OECF' },
-	'ordernumber' => { 98 => 0x8002 },
-	'organisationinimagecode' => { 352 => 'OrganisationInImageCode' },
-	'organisationinimagename' => { 352 => 'OrganisationInImageName' },
-	'organization' => { 356 => 'organization' },
-	'orientation' => { 93 => 0x112, 251 => 0x112, 361 => 'Orientation' },
-	'orientation2' => { 319 => 0x2e },
-	'orientationlinkedafpoint' => { 66 => 0x516 },
-	'originalbestqualitysize' => { 93 => 0xc792 },
-	'originaldecisiondata' => { 90 => 'OriginalDecisionData' },
-	'originaldecisiondataoffset' => { 49 => 0x83 },
-	'originaldefaultcropsize' => { 93 => 0xc793 },
-	'originaldefaultfinalsize' => { 93 => 0xc791 },
-	'originaldirectory' => { 245 => 0x408 },
-	'originaldocumentid' => { 366 => 'OriginalDocumentID' },
-	'originalfilename' => { 79 => 0x816, 107 => 0x3e9, 119 => 0x20, 245 => 0x407, 334 => 'OriginalFilename' },
-	'originalimageheight' => { 62 => 0xc, 97 => 0x1 },
-	'originalimagewidth' => { 62 => 0xb, 97 => 0x0 },
-	'originalrawfiledata' => { 93 => 0xc68c },
-	'originalrawfiledigest' => { 93 => 0xc71d },
-	'originalrawfilename' => { 93 => 0xc68b },
-	'originaltransmissionreference' => { 101 => 0x67 },
-	'originatingprogram' => { 101 => 0x41 },
-	'originplatform' => { 356 => 'originPlatform' },
-	'os' => { 345 => 'os' },
-	'otherconditions' => { 355 => 'OtherConditions' },
-	'otherconstraints' => { 355 => 'OtherConstraints' },
-	'otherimage' => { 90 => 'OtherImage' },
-	'otherimageinfo' => { 355 => 'OtherImageInfo' },
-	'otherimagelength' => { 93 => 0x202 },
-	'otherimagestart' => { 93 => 0x201 },
-	'otherlicensedocuments' => { 355 => 'OtherLicenseDocuments' },
-	'otherlicenseinfo' => { 355 => 'OtherLicenseInfo' },
-	'otherlicenserequirements' => { 355 => 'OtherLicenseRequirements' },
-	'outcue' => { 365 => 'outCue' },
-	'outcuescale' => { 365 => [\'outCue','outCueScale'] },
-	'outcuevalue' => { 365 => [\'outCue','outCueValue'] },
-	'outputimageheight' => { 158 => 0x3 },
-	'outputimagewidth' => { 158 => 0x2 },
-	'outputresolution' => { 158 => 0x4 },
-	'owner' => { 369 => 'Owner' },
-	'ownerid' => { 101 => 0xbc },
-	'ownername' => { 12 => 0x10f, 49 => 0x9, 79 => 0x810, 93 => [0xa430,0xfde8], 123 => 'OwnerName', 340 => 'OwnerName' },
-	'padding' => { 93 => 0xea1c },
-	'pageimage' => { 363 => [\'PageInfo','PageInfoImage'] },
-	'pageimageformat' => { 363 => [\'PageInfo','PageInfoFormat'] },
-	'pageimageheight' => { 363 => [\'PageInfo','PageInfoHeight'] },
-	'pageimagepagenumber' => { 363 => [\'PageInfo','PageInfoPageNumber'] },
-	'pageimagewidth' => { 363 => [\'PageInfo','PageInfoWidth'] },
-	'pageinfo' => { 363 => 'PageInfo' },
-	'pagename' => { 93 => 0x11d },
-	'pagenumber' => { 93 => 0x129 },
-	'pagerange' => { 356 => 'pageRange' },
-	'paintbasedcorrectionmasks' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasks'] },
-	'paintbasedcorrections' => { 343 => 'PaintBasedCorrections' },
-	'paintcorrectionactive' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionActive'] },
-	'paintcorrectionamount' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionAmount'] },
-	'paintcorrectionbrightness' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalBrightness'] },
-	'paintcorrectionclarity' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalClarity'] },
-	'paintcorrectionclarity2012' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalClarity2012'] },
-	'paintcorrectioncontrast' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalContrast'] },
-	'paintcorrectioncontrast2012' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalContrast2012'] },
-	'paintcorrectiondefringe' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalDefringe'] },
-	'paintcorrectionexposure' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalExposure'] },
-	'paintcorrectionexposure2012' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalExposure2012'] },
-	'paintcorrectionhighlights2012' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalHighlights2012'] },
-	'paintcorrectionhue' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalToningHue'] },
-	'paintcorrectionluminancenoise' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalLuminanceNoise'] },
-	'paintcorrectionmaskcenterweight' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCenterWeight'] },
-	'paintcorrectionmaskdabs' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksDabs'] },
-	'paintcorrectionmaskflow' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksFlow'] },
-	'paintcorrectionmaskfullx' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksFullX'] },
-	'paintcorrectionmaskfully' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksFullY'] },
-	'paintcorrectionmaskradius' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksRadius'] },
-	'paintcorrectionmaskvalue' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMaskValue'] },
-	'paintcorrectionmaskwhat' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksWhat'] },
-	'paintcorrectionmaskzerox' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksZeroX'] },
-	'paintcorrectionmaskzeroy' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksZeroY'] },
-	'paintcorrectionmoire' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalMoire'] },
-	'paintcorrectionsaturation' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalSaturation','PaintBasedCorrectionsLocalToningSaturation'] },
-	'paintcorrectionshadows2012' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalShadows2012'] },
-	'paintcorrectionsharpness' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalSharpness'] },
-	'paintcorrectiontemperature' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalTemperature'] },
-	'paintcorrectiontint' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalTint'] },
-	'paintcorrectionwhat' => { 343 => [\'PaintBasedCorrections','PaintBasedCorrectionsWhat'] },
-	'panasonicexifversion' => { 247 => 0x26 },
-	'panasonicimageheight' => { 247 => 0x4c },
-	'panasonicimagewidth' => { 247 => 0x4b },
-	'panasonicrawversion' => { 251 => 0x1 },
-	'panasonictitle' => { 93 => 0xc6d2 },
-	'panasonictitle2' => { 93 => 0xc6d3 },
-	'panoramacropbottom' => { 320 => 0x7 },
-	'panoramacropleft' => { 320 => 0x4 },
-	'panoramacropright' => { 320 => 0x6 },
-	'panoramacroptop' => { 320 => 0x5 },
-	'panoramadirection' => { 56 => 0x5, 320 => 0x3 },
-	'panoramaframeheight' => { 320 => 0x9 },
-	'panoramaframenumber' => { 56 => 0x2 },
-	'panoramaframewidth' => { 320 => 0x8 },
-	'panoramafullheight' => { 320 => 0x2 },
-	'panoramafullwidth' => { 320 => 0x1 },
-	'panoramamode' => { 109 => 0x3c, 228 => 0x601 },
-	'panoramasize3d' => { 309 => 0x38 },
-	'panoramasourceheight' => { 320 => 0xb },
-	'panoramasourcewidth' => { 320 => 0xa },
-	'panoramicstitchcameramotion' => { 141 => 'PanoramicStitchCameraMotion', 142 => 0x1 },
-	'panoramicstitchmaptype' => { 141 => 'PanoramicStitchMapType', 142 => 0x2 },
-	'panoramicstitchphi0' => { 141 => 'PanoramicStitchPhi0', 142 => 0x5 },
-	'panoramicstitchphi1' => { 141 => 'PanoramicStitchPhi1', 142 => 0x6 },
-	'panoramicstitchtheta0' => { 141 => 'PanoramicStitchTheta0', 142 => 0x3 },
-	'panoramicstitchtheta1' => { 141 => 'PanoramicStitchTheta1', 142 => 0x4 },
-	'panoramicstitchversion' => { 142 => 0x0 },
-	'pantry' => { 366 => 'Pantry' },
-	'parallax' => { 98 => 0xb211 },
-	'parametricdarks' => { 343 => 'ParametricDarks' },
-	'parametrichighlights' => { 343 => 'ParametricHighlights' },
-	'parametrichighlightsplit' => { 343 => 'ParametricHighlightSplit' },
-	'parametriclights' => { 343 => 'ParametricLights' },
-	'parametricmidtonesplit' => { 343 => 'ParametricMidtoneSplit' },
-	'parametricshadows' => { 343 => 'ParametricShadows' },
-	'parametricshadowsplit' => { 343 => 'ParametricShadowSplit' },
-	'parentmeid' => { 334 => 'ParentMEID' },
-	'parentreference1' => { 350 => [\'TagStructure','TagStructureParentReference'] },
-	'parentreference2' => { 350 => [\'TagStructure','TagStructureSubLabelsParentReference'] },
-	'parentreference3' => { 350 => [\'TagStructure','TagStructureSubLabelsSubLabelsParentReference'] },
-	'parentreference4' => { 350 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsParentReference'] },
-	'parentreference5' => { 350 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsSubLabelsParentReference'] },
-	'parentreference6' => { 350 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsParentReference'] },
-	'patientbirthdate' => { 331 => 'PatientDOB' },
-	'patientid' => { 331 => 'PatientID' },
-	'patientname' => { 331 => 'PatientName' },
-	'patientsex' => { 331 => 'PatientSex' },
-	'pdfversion' => { 353 => 'PDFVersion' },
-	'pentaximagesize' => { 278 => 0x9 },
-	'pentaxmodelid' => { 258 => 0x0, 278 => 0x5 },
-	'pentaxmodeltype' => { 278 => 0x1 },
-	'pentaxversion' => { 278 => 0x0 },
-	'people' => { 336 => 'People' },
-	'peripheralillumcentralradius' => { 329 => 0x8030 },
-	'peripheralillumcentralvalue' => { 329 => 0x8031 },
-	'peripheralillumination' => { 85 => 0x68 },
-	'peripheralilluminationon' => { 85 => 0x64 },
-	'peripheralillumperiphvalue' => { 329 => 0x8032 },
-	'peripherallighting' => { 62 => 0x2 },
-	'peripherallightingsetting' => { 63 => 0x5 },
-	'peripherallightingvalue' => { 62 => 0x6 },
-	'permissions' => { 358 => 'permissions' },
-	'permits' => { 341 => 'permits' },
-	'person' => { 356 => 'person' },
-	'personality' => { 334 => 'Personality' },
-	'personinimage' => { 352 => 'PersonInImage' },
-	'perspectivehorizontal' => { 343 => 'PerspectiveHorizontal' },
-	'perspectiverotate' => { 343 => 'PerspectiveRotate' },
-	'perspectivescale' => { 343 => 'PerspectiveScale' },
-	'perspectivevertical' => { 343 => 'PerspectiveVertical' },
-	'pf0customfuncregistration' => { 74 => 0x1 },
-	'pf10retainprogramshift' => { 74 => 0xb },
-	'pf13drivepriority' => { 74 => 0xe },
-	'pf14disablefocussearch' => { 74 => 0xf },
-	'pf15disableafassistbeam' => { 74 => 0x10 },
-	'pf16autofocuspointshoot' => { 74 => 0x11 },
-	'pf17disableafpointsel' => { 74 => 0x12 },
-	'pf18enableautoafpointsel' => { 74 => 0x13 },
-	'pf19continuousshootspeed' => { 74 => 0x14 },
-	'pf19shootingspeedhigh' => { 73 => 0xa },
-	'pf19shootingspeedlow' => { 73 => 0x9 },
-	'pf1disableshootingmodes' => { 74 => 0x2 },
-	'pf1value' => { 73 => 0x1 },
-	'pf20limitcontinousshots' => { 74 => 0x15 },
-	'pf20maxcontinousshots' => { 73 => 0xb },
-	'pf21enablequietoperation' => { 74 => 0x16 },
-	'pf23felocktime' => { 73 => 0xd },
-	'pf23postreleasetime' => { 73 => 0xe },
-	'pf23settimerlengths' => { 74 => 0x18 },
-	'pf23shutterbuttontime' => { 73 => 0xc },
-	'pf24lightlcdduringbulb' => { 74 => 0x19 },
-	'pf25aemode' => { 73 => 0xf },
-	'pf25afmode' => { 73 => 0x12 },
-	'pf25afpointsel' => { 73 => 0x13 },
-	'pf25colormatrix' => { 73 => 0x17 },
-	'pf25defaultclearsettings' => { 74 => 0x1a },
-	'pf25drivemode' => { 73 => 0x11 },
-	'pf25imagesize' => { 73 => 0x14 },
-	'pf25meteringmode' => { 73 => 0x10 },
-	'pf25parameters' => { 73 => 0x16 },
-	'pf25wbmode' => { 73 => 0x15 },
-	'pf26shortenreleaselag' => { 74 => 0x1b },
-	'pf27reversedialrotation' => { 74 => 0x1c },
-	'pf27value' => { 73 => 0x18 },
-	'pf28noquickdialexpcomp' => { 74 => 0x1d },
-	'pf29quickdialswitchoff' => { 74 => 0x1e },
-	'pf2disablemeteringmodes' => { 74 => 0x3 },
-	'pf2value' => { 73 => 0x2 },
-	'pf30enlargementmode' => { 74 => 0x1f },
-	'pf31originaldecisiondata' => { 74 => 0x20 },
-	'pf3manualexposuremetering' => { 74 => 0x4 },
-	'pf3value' => { 73 => 0x3 },
-	'pf4exposuretimelimits' => { 74 => 0x5 },
-	'pf4exposuretimemax' => { 73 => 0x5 },
-	'pf4exposuretimemin' => { 73 => 0x4 },
-	'pf5aperturelimits' => { 74 => 0x6 },
-	'pf5aperturemax' => { 73 => 0x7 },
-	'pf5aperturemin' => { 73 => 0x6 },
-	'pf6presetshootingmodes' => { 74 => 0x7 },
-	'pf7bracketcontinuousshoot' => { 74 => 0x8 },
-	'pf8bracketshots' => { 73 => 0x8 },
-	'pf8setbracketshots' => { 74 => 0x9 },
-	'pf9changebracketsequence' => { 74 => 0xa },
-	'phasedetectaf' => { 156 => 0x6 },
-	'phonenumber' => { 124 => 'Phone' },
-	'photoeffect' => { 27 => 0x28 },
-	'photoeffecthistoryxml' => { 211 => 0xe9651831 },
-	'photoeffects' => { 211 => 0xab5eca5e },
-	'photoeffectsblue' => { 213 => 0x8 },
-	'photoeffectsgreen' => { 213 => 0x6 },
-	'photoeffectsred' => { 213 => 0x4 },
-	'photoeffectstype' => { 213 => 0x0 },
-	'photoinfoplayback' => { 218 => '17.6', 223 => '33.6' },
-	'photometricinterpretation' => { 93 => 0x106, 361 => 'PhotometricInterpretation' },
-	'photoshopquality' => { 287 => 0x0 },
-	'photostyle' => { 247 => 0x89 },
-	'picklabel' => { 346 => 'PickLabel' },
-	'pictinfo' => { 302 => 0x208 },
-	'picturecontrol' => { 211 => 0xe2173c47 },
-	'picturecontrolactive' => { 214 => 0x0 },
-	'picturecontroladjust' => { 180 => 0x30 },
-	'picturecontrolbase' => { 180 => 0x18 },
-	'picturecontroldata' => { 178 => [0xbd,0x23] },
-	'picturecontrolmode' => { 214 => 0x13 },
-	'picturecontrolname' => { 180 => 0x4 },
-	'picturecontrolquickadjust' => { 180 => 0x31 },
-	'pictureeffect' => { 318 => 0x200e },
-	'picturefinish' => { 146 => 0x71 },
-	'picturemode' => { 98 => 0x1031, 228 => 0x520, 278 => [0xb,0x33], 303 => 0x3d },
-	'picturemode2' => { 259 => 0x0 },
-	'picturemodebwfilter' => { 228 => 0x525 },
-	'picturemodecontrast' => { 228 => 0x523 },
-	'picturemodeeffect' => { 228 => 0x52d },
-	'picturemodehue' => { 228 => 0x522 },
-	'picturemodesaturation' => { 228 => 0x521 },
-	'picturemodesharpness' => { 228 => 0x524 },
-	'picturemodetone' => { 228 => 0x526 },
-	'picturestyle' => { 5 => [0x4b,0x51], 6 => 0xf4, 7 => 0x6c, 8 => 0x86, 9 => 0x73, 13 => 0xab, 14 => 0xa7, 15 => 0xb0, 16 => 0x6c, 17 => 0xa7, 18 => 0xf4, 19 => 0xb3, 21 => 0xf4, 22 => 0xfa, 58 => 0xa, 85 => 0x2 },
-	'picturewizard' => { 300 => 0x21 },
-	'picturewizardcolor' => { 298 => 0x1 },
-	'picturewizardcontrast' => { 298 => 0x4 },
-	'picturewizardmode' => { 298 => 0x0 },
-	'picturewizardsaturation' => { 298 => 0x2 },
-	'picturewizardsharpness' => { 298 => 0x3 },
-	'pitchangle' => { 277 => 0x2 },
-	'planarconfiguration' => { 93 => 0x11c, 361 => 'PlanarConfiguration' },
-	'platenames' => { 370 => 'PlateNames' },
-	'playbackmenustime' => { 220 => '20.1', 221 => '21.1', 222 => '21.1' },
-	'playbackmonitorofftime' => { 223 => '8.1', 224 => '35.1', 227 => '21.1' },
-	'playdisplay' => { 148 => 0x4e },
-	'plusversion' => { 355 => 'Version' },
-	'pmversion' => { 286 => 'PMVersion' },
-	'pngwarning' => { 239 => 'Warning' },
-	'portraitoutputhighlightpoint' => { 85 => 0x1d },
-	'portraitoutputshadowpoint' => { 85 => 0x1e },
-	'portraitrawcolortone' => { 85 => 0x16 },
-	'portraitrawcontrast' => { 85 => 0x18 },
-	'portraitrawhighlight' => { 85 => 0x76 },
-	'portraitrawhighlightpoint' => { 85 => 0x1b },
-	'portraitrawlinear' => { 85 => 0x19 },
-	'portraitrawsaturation' => { 85 => 0x17 },
-	'portraitrawshadow' => { 85 => 0x7f },
-	'portraitrawshadowpoint' => { 85 => 0x1c },
-	'portraitrawsharpness' => { 85 => 0x1a },
-	'portraitrefiner' => { 89 => 0x302b },
-	'portraitunsharpmaskfineness' => { 85 => 0x9a },
-	'portraitunsharpmaskstrength' => { 85 => 0x98 },
-	'portraitunsharpmaskthreshold' => { 85 => 0x9c },
-	'poseheadingdegrees' => { 333 => 'PoseHeadingDegrees' },
-	'posepitchdegrees' => { 333 => 'PosePitchDegrees' },
-	'poserolldegrees' => { 333 => 'PoseRollDegrees' },
-	'postalcode' => { 128 => 'PostalCode' },
-	'postcropvignetteamount' => { 343 => 'PostCropVignetteAmount' },
-	'postcropvignettefeather' => { 343 => 'PostCropVignetteFeather' },
-	'postcropvignettehighlightcontrast' => { 343 => 'PostCropVignetteHighlightContrast' },
-	'postcropvignettemidpoint' => { 343 => 'PostCropVignetteMidpoint' },
-	'postcropvignetteroundness' => { 343 => 'PostCropVignetteRoundness' },
-	'postcropvignettestyle' => { 343 => 'PostCropVignetteStyle' },
-	'powersource' => { 257 => '0.1' },
-	'poweruptime' => { 178 => 0xb6 },
-	'precaptureframes' => { 233 => 0x300 },
-	'predictor' => { 93 => 0x13d },
-	'preflashreturnstrength' => { 191 => 0x28a },
-	'prefs' => { 101 => 0xdd, 286 => 'Prefs' },
-	'preservedfilename' => { 366 => 'PreservedFileName' },
-	'presetwhitebalance' => { 148 => 0x24, 329 => 0x8002 },
-	'presetwhitebalanceadj' => { 329 => 0x8014 },
-	'previewapplicationname' => { 93 => 0xc716 },
-	'previewapplicationversion' => { 93 => 0xc717 },
-	'previewbutton' => { 218 => ['14.1','15.1'], 223 => '29.1', 224 => '14.1' },
-	'previewbuttonplusdials' => { 218 => ['14.2','15.2'], 223 => '31.2' },
-	'previewcolorspace' => { 93 => 0xc71a },
-	'previewcropbottom' => { 285 => 0xef },
-	'previewcropleft' => { 285 => 0xec },
-	'previewcropright' => { 285 => 0xee },
-	'previewcroptop' => { 285 => 0xed },
-	'previewdatetime' => { 93 => 0xc71b },
-	'previewimage' => { 89 => 0x2000, 90 => 'PreviewImage', 94 => 'PreviewImage', 96 => 0x4, 133 => 'data', 150 => 0x81, 233 => 0x280, 246 => 0x300, 318 => 0x2001 },
-	'previewimageborders' => { 278 => 0x3e },
-	'previewimageheight' => { 57 => 0x4, 111 => 0xfa58 },
-	'previewimagelength' => { 57 => 0x2, 89 => 0x3, 93 => [0x117,0x202], 150 => 0x89, 181 => 0x202, 228 => 0x102, 233 => 0x1037, 278 => 0x3, 294 => 0x1e, 299 => 0x3, 303 => [0x1b,0x1d], 310 => 0x202 },
-	'previewimagename' => { 133 => '1Name' },
-	'previewimagesize' => { 89 => 0x2, 116 => 0x2, 133 => 'ImageSize', 278 => 0x2, 303 => [0x1c,0x1e], 318 => 0xb02c },
-	'previewimagestart' => { 57 => 0x5, 89 => 0x4, 93 => [0x111,0x201], 150 => 0x88, 181 => 0x201, 228 => 0x101, 233 => 0x1036, 278 => 0x4, 294 => 0x1c, 299 => 0x2, 303 => [0x1a,0x1c], 310 => 0x201 },
-	'previewimagetype' => { 133 => '0Type' },
-	'previewimagevalid' => { 228 => 0x100, 233 => 0x1035 },
-	'previewimagewidth' => { 57 => 0x3, 111 => 0xfa57 },
-	'previewquality' => { 57 => 0x1 },
-	'previewsettingsdigest' => { 93 => 0xc719 },
-	'previewsettingsname' => { 93 => 0xc718 },
-	'primaryafpoint' => { 156 => 0x7 },
-	'primarychromaticities' => { 93 => 0x13f, 361 => 'PrimaryChromaticities' },
-	'printim' => { 93 => 0xc4a5 },
-	'prioritysetupshutterrelease' => { 148 => 0x1d, 307 => 0x28 },
-	'privatertkinfo' => { 335 => 'privateRTKInfo' },
-	'processingsoftware' => { 93 => 0xb },
-	'processversion' => { 343 => 'ProcessVersion' },
-	'producer' => { 237 => 'Producer', 353 => 'Producer' },
-	'productid' => { 102 => 0x32 },
-	'productioncode' => { 258 => 0x2 },
-	'productorserviceconstraints' => { 355 => 'ProductOrServiceConstraints' },
-	'profilecalibrationsig' => { 93 => 0xc6f4 },
-	'profilecopyright' => { 93 => 0xc6fe },
-	'profileembedpolicy' => { 93 => 0xc6fd },
-	'profilehuesatmapdata1' => { 93 => 0xc6fa },
-	'profilehuesatmapdata2' => { 93 => 0xc6fb },
-	'profilehuesatmapdims' => { 93 => 0xc6f9 },
-	'profilehuesatmapencoding' => { 93 => 0xc7a3 },
-	'profilelooktabledata' => { 93 => 0xc726 },
-	'profilelooktabledims' => { 93 => 0xc725 },
-	'profilelooktableencoding' => { 93 => 0xc7a4 },
-	'profilename' => { 93 => 0xc6f8 },
-	'profiletonecurve' => { 93 => 0xc6fc },
-	'programiso' => { 247 => 0x3c },
-	'programline' => { 259 => '1.1' },
-	'programmode' => { 153 => 0x5 },
-	'programshift' => { 178 => 0xd },
-	'programversion' => { 101 => 0x46 },
-	'prohibits' => { 341 => 'prohibits' },
-	'projectiontype' => { 333 => 'ProjectionType' },
-	'projectname' => { 365 => 'projectName' },
-	'projectref' => { 365 => 'projectRef' },
-	'projectrefpath' => { 365 => [\'projectRef','projectRefPath'] },
-	'projectreftype' => { 365 => [\'projectRef','projectRefType'] },
-	'propertyreleaseid' => { 355 => 'PropertyReleaseID' },
-	'propertyreleasestatus' => { 355 => 'PropertyReleaseStatus' },
-	'province-state' => { 101 => 0x5f },
-	'publicationdate' => { 356 => 'publicationDate' },
-	'publicationname' => { 356 => 'publicationName' },
-	'publisher' => { 344 => 'publisher' },
-	'pulldown' => { 365 => 'pullDown' },
-	'quality' => { 0 => 0x1, 27 => 0x3, 88 => 0x2, 89 => 0x3002, 98 => 0x1000, 109 => 0x9, 178 => 0x4, 201 => 0x3, 233 => 0x201, 243 => 0x300, 278 => 0x8, 283 => 0x2, 303 => 0x16, 307 => 0x56, 308 => 0x56, 309 => 0xb, 318 => 0x102 },
-	'quality2' => { 323 => 0x29, 324 => 0x25 },
-	'qualitymode' => { 89 => 0x8 },
-	'quantizationmethod' => { 103 => 0x78 },
-	'quickadjust' => { 214 => 0x2a },
-	'quickcontroldialinmeter' => { 66 => 0x703 },
-	'quickshot' => { 302 => 0x213 },
-	'rangefinder' => { 220 => '4.1', 221 => '5.1', 222 => '5.1' },
-	'rasterizedcaption' => { 101 => 0x7d },
-	'rating' => { 93 => 0x4746, 285 => 0xdf, 318 => 0x2002, 338 => 'rating', 345 => 'rating', 363 => 'Rating' },
-	'ratingpercent' => { 93 => 0x4749, 143 => 'Rating' },
-	'rawandjpgrecording' => { 64 => 0x8, 150 => 0x109, 259 => 0xd },
-	'rawbrightnessadj' => { 84 => 0x38 },
-	'rawcoloradj' => { 84 => 0x2e },
-	'rawcropbottom' => { 285 => 0xd4 },
-	'rawcropleft' => { 285 => 0xd1 },
-	'rawcropright' => { 285 => 0xd3 },
-	'rawcroptop' => { 285 => 0xd2 },
-	'rawcustomsaturation' => { 84 => 0x30 },
-	'rawcustomtone' => { 84 => 0x34 },
-	'rawdatauniqueid' => { 93 => 0xc65d },
-	'rawdepth' => { 152 => 0x10 },
-	'rawdevautogradation' => { 235 => 0x119 },
-	'rawdevcolorspace' => { 234 => 0x108, 235 => 0x109 },
-	'rawdevcontrastvalue' => { 234 => 0x106, 235 => 0x105 },
-	'rawdeveditstatus' => { 234 => 0x10b },
-	'rawdevelopmentprocess' => { 278 => 0x62 },
-	'rawdevengine' => { 234 => 0x109, 235 => 0x10b },
-	'rawdevexposurebiasvalue' => { 234 => 0x100, 235 => 0x100 },
-	'rawdevgradation' => { 235 => 0x112 },
-	'rawdevgraypoint' => { 234 => 0x103, 235 => 0x104 },
-	'rawdevmemorycoloremphasis' => { 234 => 0x105, 235 => 0x108 },
-	'rawdevnoisereduction' => { 234 => 0x10a, 235 => 0x10a },
-	'rawdevpicturemode' => { 235 => 0x10c },
-	'rawdevpm_bwfilter' => { 235 => 0x110 },
-	'rawdevpmcontrast' => { 235 => 0x10e },
-	'rawdevpmnoisefilter' => { 235 => 0x120 },
-	'rawdevpmpicturetone' => { 235 => 0x111 },
-	'rawdevpmsaturation' => { 235 => 0x10d },
-	'rawdevpmsharpness' => { 235 => 0x10f },
-	'rawdevsaturation3' => { 235 => 0x113 },
-	'rawdevsaturationemphasis' => { 234 => 0x104, 235 => 0x107 },
-	'rawdevsettings' => { 234 => 0x10c },
-	'rawdevsharpnessvalue' => { 234 => 0x107, 235 => 0x106 },
-	'rawdevversion' => { 234 => 0x0, 235 => 0x0 },
-	'rawdevwbfineadjustment' => { 234 => 0x102, 235 => 0x103 },
-	'rawdevwhitebalance' => { 235 => 0x101 },
-	'rawdevwhitebalancevalue' => { 234 => 0x101, 235 => 0x102 },
-	'rawfile' => { 93 => 0xfe4c },
-	'rawfilename' => { 343 => 'RawFileName' },
-	'rawimagecenter' => { 178 => 0x99 },
-	'rawimagedigest' => { 93 => 0xc71c },
-	'rawimagesize' => { 278 => 0x39 },
-	'rawinfoversion' => { 236 => 0x0 },
-	'rawjpgheight' => { 81 => 0x4 },
-	'rawjpgquality' => { 44 => 0x6, 81 => 0x1 },
-	'rawjpgsize' => { 44 => 0x7, 81 => 0x2 },
-	'rawjpgwidth' => { 81 => 0x3 },
-	'rawmeasuredrggb' => { 32 => 0x26a, 34 => 0x280, 36 => 0x194, 37 => 0x1ad },
-	'rawrppused' => { 338 => 'rawrppused' },
-	'rawtopreviewgain' => { 93 => 0xc7a8 },
-	'reardisplay' => { 218 => '12.3' },
-	'recognizedface1age' => { 242 => 0x20 },
-	'recognizedface1name' => { 242 => 0x4 },
-	'recognizedface1position' => { 242 => 0x18 },
-	'recognizedface2age' => { 242 => 0x50 },
-	'recognizedface2name' => { 242 => 0x34 },
-	'recognizedface2position' => { 242 => 0x48 },
-	'recognizedface3age' => { 242 => 0x80 },
-	'recognizedface3name' => { 242 => 0x64 },
-	'recognizedface3position' => { 242 => 0x78 },
-	'recognizedfaceflags' => { 247 => 0x63 },
-	'recommendedexposureindex' => { 93 => 0x8832 },
-	'record' => { 92 => 'Record' },
-	'recordbasisofrecord' => { 92 => [\'Record','RecordBasisOfRecord'] },
-	'recordcollectioncode' => { 92 => [\'Record','RecordCollectionCode'] },
-	'recordcollectionid' => { 92 => [\'Record','RecordCollectionID'] },
-	'recorddatageneralizations' => { 92 => [\'Record','RecordDataGeneralizations'] },
-	'recorddatasetid' => { 92 => [\'Record','RecordDatasetID'] },
-	'recorddatasetname' => { 92 => [\'Record','RecordDatasetName'] },
-	'recorddisplay' => { 148 => 0x4d },
-	'recorddynamicproperties' => { 92 => [\'Record','RecordDynamicProperties'] },
-	'recordid' => { 79 => 0x1804 },
-	'recordinformationwithheld' => { 92 => [\'Record','RecordInformationWithheld'] },
-	'recordingmode' => { 88 => 0x1, 283 => 0x1 },
-	'recordinstitutioncode' => { 92 => [\'Record','RecordInstitutionCode'] },
-	'recordinstitutionid' => { 92 => [\'Record','RecordInstitutionID'] },
-	'recordmode' => { 27 => 0x9, 89 => 0x3000 },
-	'recordownerinstitutioncode' => { 92 => [\'Record','RecordOwnerInstitutionCode'] },
-	'recordshutterrelease' => { 302 => 0x217 },
-	'redbalance' => { 163 => 0x270, 233 => 0x1017, 251 => 0x11, 278 => 0x1c },
-	'redcurvelimits' => { 84 => 0x18a },
-	'redcurvepoints' => { 84 => 0x160 },
-	'redeyecorrection' => { 215 => 0x0 },
-	'redeyeinfo' => { 343 => 'RedEyeInfo' },
-	'redeyereduction' => { 148 => 0x41, 309 => 0x28 },
-	'redhue' => { 343 => 'RedHue' },
-	'redsaturation' => { 343 => 'RedSaturation' },
-	'reductionmatrix1' => { 93 => 0xc625 },
-	'reductionmatrix2' => { 93 => 0xc626 },
-	'reelname' => { 93 => 0xc789 },
-	'reference1' => { 350 => [\'TagStructure','TagStructureReference'] },
-	'reference2' => { 350 => [\'TagStructure','TagStructureSubLabelsReference'] },
-	'reference3' => { 350 => [\'TagStructure','TagStructureSubLabelsSubLabelsReference'] },
-	'reference4' => { 350 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsReference'] },
-	'reference5' => { 350 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsSubLabelsReference'] },
-	'reference6' => { 350 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsReference'] },
-	'referenceblackwhite' => { 93 => 0x214, 361 => 'ReferenceBlackWhite' },
-	'referencedate' => { 101 => 0x2f },
-	'referencenumber' => { 101 => 0x32 },
-	'references' => { 124 => 'References' },
-	'referenceservice' => { 101 => 0x2d },
-	'regionappliedtodimensions' => { 139 => [\'Regions','RegionsAppliedToDimensions'] },
-	'regionappliedtodimensionsh' => { 139 => [\'Regions','RegionsAppliedToDimensionsH'] },
-	'regionappliedtodimensionsunit' => { 139 => [\'Regions','RegionsAppliedToDimensionsUnit'] },
-	'regionappliedtodimensionsw' => { 139 => [\'Regions','RegionsAppliedToDimensionsW'] },
-	'regionarea' => { 139 => [\'Regions','RegionsRegionListArea'] },
-	'regionaread' => { 139 => [\'Regions','RegionsRegionListAreaD'] },
-	'regionareah' => { 139 => [\'Regions','RegionsRegionListAreaH'] },
-	'regionareaunit' => { 139 => [\'Regions','RegionsRegionListAreaUnit'] },
-	'regionareaw' => { 139 => [\'Regions','RegionsRegionListAreaW'] },
-	'regionareax' => { 139 => [\'Regions','RegionsRegionListAreaX'] },
-	'regionareay' => { 139 => [\'Regions','RegionsRegionListAreaY'] },
-	'regionbarcodevalue' => { 139 => [\'Regions','RegionsRegionListBarCodeValue'] },
-	'regionconstraints' => { 355 => 'RegionConstraints' },
-	'regiondescription' => { 139 => [\'Regions','RegionsRegionListDescription'] },
-	'regionextensions' => { 139 => [\'Regions','RegionsRegionListExtensions'] },
-	'regionfocususage' => { 139 => [\'Regions','RegionsRegionListFocusUsage'] },
-	'regioninfo' => { 139 => 'Regions' },
-	'regioninfodateregionsvalid' => { 140 => [\'RegionInfo','RegionInfoDateRegionsValid'] },
-	'regioninfomp' => { 140 => 'RegionInfo' },
-	'regioninforegions' => { 140 => [\'RegionInfo','RegionInfoRegions'] },
-	'regionlist' => { 139 => [\'Regions','RegionsRegionList'] },
-	'regionname' => { 139 => [\'Regions','RegionsRegionListName'] },
-	'regionpersondisplayname' => { 140 => [\'RegionInfo','RegionInfoRegionsPersonDisplayName'] },
-	'regionpersonemaildigest' => { 140 => [\'RegionInfo','RegionInfoRegionsPersonEmailDigest'] },
-	'regionpersonliveidcid' => { 140 => [\'RegionInfo','RegionInfoRegionsPersonLiveIdCID'] },
-	'regionpersonsourceid' => { 140 => [\'RegionInfo','RegionInfoRegionsPersonSourceID'] },
-	'regionrectangle' => { 140 => [\'RegionInfo','RegionInfoRegionsRectangle'] },
-	'regionseealso' => { 139 => [\'Regions','RegionsRegionListSeeAlso'] },
-	'regiontype' => { 139 => [\'Regions','RegionsRegionListType'] },
-	'registryid' => { 352 => 'RegistryId' },
-	'registryitemid' => { 352 => [\'RegistryId','RegistryIdRegItemId'] },
-	'registryorganisationid' => { 352 => [\'RegistryId','RegistryIdRegOrgId'] },
-	'relatedaudiofile' => { 122 => 'data' },
-	'relatedaudiofilename' => { 122 => '1Name' },
-	'relatedaudiofiletype' => { 122 => '0Type' },
-	'relatedimagefileformat' => { 93 => 0x1000 },
-	'relatedimageheight' => { 93 => 0x1002 },
-	'relatedimagewidth' => { 93 => 0x1001 },
-	'relatedresourceid' => { 92 => [\'ResourceRelationship','ResourceRelationshipRelatedResourceID'] },
-	'relatedsoundfile' => { 93 => 0xa004, 347 => 'RelatedSoundFile' },
-	'relatedvideofile' => { 136 => 'data' },
-	'relatedvideofilename' => { 136 => '1Name' },
-	'relatedvideofiletype' => { 136 => '0Type' },
-	'relation' => { 344 => 'relation' },
-	'relationshipaccordingto' => { 92 => [\'ResourceRelationship','ResourceRelationshipRelationshipAccordingTo'] },
-	'relationshipestablisheddate' => { 92 => [\'ResourceRelationship','ResourceRelationshipRelationshipEstablishedDate'] },
-	'relationshipofresource' => { 92 => [\'ResourceRelationship','ResourceRelationshipRelationshipOfResource'] },
-	'relationshipremarks' => { 92 => [\'ResourceRelationship','ResourceRelationshipRelationshipRemarks'] },
-	'relativepeakaudiofilepath' => { 365 => 'relativePeakAudioFilePath' },
-	'relativetimestamp' => { 365 => 'relativeTimestamp' },
-	'relativetimestampscale' => { 365 => [\'relativeTimestamp','relativeTimestampScale'] },
-	'relativetimestampvalue' => { 365 => [\'relativeTimestamp','relativeTimestampValue'] },
-	'releasebuttontousedial' => { 218 => '17.8', 223 => '33.8', 224 => '17.6' },
-	'releasedate' => { 101 => 0x1e, 365 => 'releaseDate' },
-	'releasemode' => { 89 => 0x3001, 318 => 0xb049 },
-	'releasemode2' => { 323 => 0x10, 324 => 0x10 },
-	'releasesetting' => { 79 => 0x1016 },
-	'releasetime' => { 101 => 0x23 },
-	'remoteonduration' => { 219 => '3.4', 220 => '17.2', 221 => '18.2', 222 => '18.2', 224 => '18.2', 225 => '4.3', 227 => '19.2' },
-	'renditionclass' => { 366 => 'RenditionClass' },
-	'renditionof' => { 366 => 'RenditionOf' },
-	'renditionofalternatepaths' => { 366 => [\'RenditionOf','RenditionOfAlternatePaths'] },
-	'renditionofdocumentid' => { 366 => [\'RenditionOf','RenditionOfDocumentID'] },
-	'renditionoffilepath' => { 366 => [\'RenditionOf','RenditionOfFilePath'] },
-	'renditionoffrompart' => { 366 => [\'RenditionOf','RenditionOfFromPart'] },
-	'renditionofinstanceid' => { 366 => [\'RenditionOf','RenditionOfInstanceID'] },
-	'renditionoflastmodifydate' => { 366 => [\'RenditionOf','RenditionOfLastModifyDate'] },
-	'renditionofmanager' => { 366 => [\'RenditionOf','RenditionOfManager'] },
-	'renditionofmanagervariant' => { 366 => [\'RenditionOf','RenditionOfManagerVariant'] },
-	'renditionofmanageto' => { 366 => [\'RenditionOf','RenditionOfManageTo'] },
-	'renditionofmanageui' => { 366 => [\'RenditionOf','RenditionOfManageUI'] },
-	'renditionofmaskmarkers' => { 366 => [\'RenditionOf','RenditionOfMaskMarkers'] },
-	'renditionoforiginaldocumentid' => { 366 => [\'RenditionOf','RenditionOfOriginalDocumentID'] },
-	'renditionofpartmapping' => { 366 => [\'RenditionOf','RenditionOfPartMapping'] },
-	'renditionofrenditionclass' => { 366 => [\'RenditionOf','RenditionOfRenditionClass'] },
-	'renditionofrenditionparams' => { 366 => [\'RenditionOf','RenditionOfRenditionParams'] },
-	'renditionoftopart' => { 366 => [\'RenditionOf','RenditionOfToPart'] },
-	'renditionofversionid' => { 366 => [\'RenditionOf','RenditionOfVersionID'] },
-	'renditionparams' => { 366 => 'RenditionParams' },
-	'repeatingflashcount' => { 167 => 0xd, 168 => 0xe, 169 => 0xe, 223 => '17.2', 224 => '24.2', 225 => '9.2', 226 => '24.2', 227 => '25.2' },
-	'repeatingflashcountbuilt-in' => { 199 => 0x4db },
-	'repeatingflashcountexternal' => { 199 => 0x4c3 },
-	'repeatingflashoutput' => { 223 => '17.1', 224 => '24.1', 225 => '9.1', 226 => '24.1', 227 => '25.1' },
-	'repeatingflashoutputexternal' => { 199 => 0x4c0 },
-	'repeatingflashrate' => { 167 => 0xc, 168 => 0xd, 169 => 0xd, 223 => '18.1', 224 => '25.1', 225 => '10.1', 226 => '25.1', 227 => '26.1' },
-	'repeatingflashratebuilt-in' => { 199 => 0x4da },
-	'repeatingflashrateexternal' => { 199 => 0x4c2 },
-	'requires' => { 341 => 'requires' },
-	'resampleparams' => { 365 => 'resampleParams' },
-	'resampleparamsquality' => { 365 => [\'resampleParams','resampleParamsQuality'] },
-	'resaved' => { 302 => 0x21e },
-	'resolution' => { 129 => 'Resolution' },
-	'resolutionmode' => { 303 => 0x4 },
-	'resolutionunit' => { 93 => 0x128, 104 => 0x2, 361 => 'ResolutionUnit' },
-	'resourceid' => { 92 => [\'ResourceRelationship','ResourceRelationshipResourceID'] },
-	'resourcerelationship' => { 92 => 'ResourceRelationship' },
-	'resourcerelationshipid' => { 92 => [\'ResourceRelationship','ResourceRelationshipResourceRelationshipID'] },
-	'restrictions' => { 358 => 'restrictions' },
-	'retouchhistory' => { 178 => 0x9e },
-	'retouchinfo' => { 343 => 'RetouchInfo' },
-	'reuse' => { 355 => 'Reuse' },
-	'reuseallowed' => { 368 => 'ReuseAllowed' },
-	'reuseprohibited' => { 358 => 'reuseProhibited' },
-	'reverseexposurecompdial' => { 222 => '5.2' },
-	'reverseindicators' => { 218 => '12.1', 220 => '4.3', 221 => '5.2', 222 => '5.4', 223 => '33.5', 224 => '5.1', 227 => '6.2' },
-	'reverseshutterspeedaperture' => { 222 => '5.3' },
-	'revision' => { 345 => 'revision' },
-	'rgbcurvelimits' => { 84 => 0x238 },
-	'rgbcurvepoints' => { 84 => 0x20e },
-	'richtextcomment' => { 349 => 'RichTextComment' },
-	'ricohdate' => { 294 => 0x6 },
-	'ricohimageheight' => { 294 => 0x2 },
-	'ricohimagewidth' => { 294 => 0x0 },
-	'rightascension' => { 132 => 'RightAscension' },
-	'rights' => { 344 => 'rights' },
-	'rightsagent' => { 356 => 'rightsAgent', 358 => 'rightsAgent' },
-	'rightsowner' => { 358 => 'rightsOwner' },
-	'rollangle' => { 277 => 0x1 },
-	'romoperationmode' => { 79 => 0x80d },
-	'rotation' => { 24 => 0x17, 25 => 0x18, 78 => 0x3, 84 => 0x26e, 97 => 0x4, 132 => 'Rotation', 146 => [0x65,0x50], 147 => 0x46, 148 => 0x5a, 151 => 0x10, 198 => '590.1', 211 => 0x76a43207, 247 => 0x30, 259 => '17.2', 285 => 0xd8, 307 => 0x3f, 308 => 0x3f, 317 => 0x10 },
-	'routedto' => { 348 => 'RoutedTo' },
-	'routing' => { 290 => 'Routing' },
-	'routingnotes' => { 348 => 'RoutingNotes' },
-	'rowsperstrip' => { 93 => 0x116 },
-	'rpp' => { 338 => 'rpp' },
-	'safetyshift' => { 66 => 0x108 },
-	'safetyshiftinavortv' => { 64 => 0x10, 65 => 0x10, 67 => 0xf, 68 => 0x10, 71 => 0x10 },
-	'samplebits' => { 122 => 'SampleBits' },
-	'samplerate' => { 122 => 'SampleRate' },
-	'samplesperpixel' => { 93 => 0x115, 361 => 'SamplesPerPixel' },
-	'samplestructure' => { 103 => 0x5a },
-	'sanyoquality' => { 302 => 0x201 },
-	'sanyothumbnail' => { 302 => 0x100 },
-	'saturation' => { 7 => 0x6e, 9 => 0x76, 27 => 0xe, 38 => 0x1, 88 => 0xd, 89 => [0x3013,0x1f], 93 => [0xa409,0xfe55], 98 => 0x1003, 123 => 'Saturation', 145 => 0x1f, 146 => 0x32, 147 => 0x28, 148 => 0x1a, 153 => 0x1, 178 => [0x94,0xaa], 180 => 0x35, 247 => 0x40, 249 => 0x300d, 278 => 0x1f, 283 => 0xd, 291 => 0x27, 294 => 0x28, 303 => 0x10, 307 => 0x1e, 308 => 0x1b, 318 => 0x2005, 343 => 'Saturation', 347 => 'Saturation' },
-	'saturationadj' => { 84 => 0x116, 210 => 0x1, 214 => 0x2e, 329 => 0x8016 },
-	'saturationadjustmentaqua' => { 343 => 'SaturationAdjustmentAqua' },
-	'saturationadjustmentblue' => { 343 => 'SaturationAdjustmentBlue' },
-	'saturationadjustmentgreen' => { 343 => 'SaturationAdjustmentGreen' },
-	'saturationadjustmentmagenta' => { 343 => 'SaturationAdjustmentMagenta' },
-	'saturationadjustmentorange' => { 343 => 'SaturationAdjustmentOrange' },
-	'saturationadjustmentpurple' => { 343 => 'SaturationAdjustmentPurple' },
-	'saturationadjustmentred' => { 343 => 'SaturationAdjustmentRed' },
-	'saturationadjustmentyellow' => { 343 => 'SaturationAdjustmentYellow' },
-	'saturationfaithful' => { 16 => 0xfe, 54 => 0x68, 55 => 0x68 },
-	'saturationlandscape' => { 16 => 0xfc, 54 => 0x38, 55 => 0x38 },
-	'saturationmonochrome' => { 54 => 0x80, 55 => 0x80 },
-	'saturationneutral' => { 16 => 0xfd, 54 => 0x50, 55 => 0x50 },
-	'saturationportrait' => { 16 => 0xfb, 54 => 0x20, 55 => 0x20 },
-	'saturationsetting' => { 236 => 0x1010, 309 => 0x11, 319 => 0x9 },
-	'saturationstandard' => { 16 => 0xfa, 54 => 0x8, 55 => 0x8 },
-	'saturationunknown' => { 55 => 0x98 },
-	'saturationuserdef1' => { 16 => 0x100, 54 => 0x98, 55 => 0xb0 },
-	'saturationuserdef2' => { 16 => 0x101, 54 => 0xb0, 55 => 0xc8 },
-	'saturationuserdef3' => { 16 => 0x102, 54 => 0xc8, 55 => 0xe0 },
-	'saveid' => { 366 => 'SaveID' },
-	'scaletype' => { 365 => 'scaleType' },
-	'scanimageenhancer' => { 183 => 0x60 },
-	'scanningdirection' => { 103 => 0x64 },
-	'scene' => { 351 => 'Scene', 365 => 'scene' },
-	'scenearea' => { 231 => 0x211, 233 => 0x1031 },
-	'sceneassist' => { 178 => 0x9c },
-	'scenecapturetype' => { 93 => 0xa406, 347 => 'SceneCaptureType' },
-	'scenedetect' => { 231 => 0x210, 233 => 0x1030 },
-	'scenedetectdata' => { 231 => 0x212, 233 => 0x1033 },
-	'scenemode' => { 111 => 0xfa02, 150 => 0x100, 178 => 0x8f, 228 => 0x509, 233 => 0x403, 247 => 0x8001, 253 => 0xf, 318 => 0xb023 },
-	'scenemodeused' => { 113 => [0x6002,0xf002] },
-	'sceneselect' => { 302 => 0x21f },
-	'scenetype' => { 93 => 0xa301, 347 => 'SceneType' },
-	'screentips' => { 218 => '12.7', 223 => '13.1', 224 => '4.4', 227 => '5.1' },
-	'section' => { 356 => 'section' },
-	'securityclassification' => { 93 => 0x9212 },
-	'selectableafpoint' => { 66 => 0x509 },
-	'selectafareaselectmode' => { 66 => 0x512 },
-	'selftimer' => { 27 => 0x2, 247 => 0x2e, 302 => 0x214 },
-	'selftimer2' => { 60 => 0x1d },
-	'selftimerinterval' => { 224 => '19.2' },
-	'selftimermode' => { 93 => 0x882b },
-	'selftimershotcount' => { 220 => '18.2', 221 => '19.2', 222 => '19.2', 224 => '19.3', 227 => '20.2' },
-	'selftimertime' => { 79 => 0x1806, 148 => 0x1f, 218 => '18.1', 219 => '3.3', 220 => '18.1', 221 => '19.1', 222 => '19.1', 223 => '7.2', 224 => '19.1', 225 => '3.3', 227 => '20.1' },
-	'seminfo' => { 93 => 0x8546 },
-	'sensingmethod' => { 93 => 0xa217, 347 => 'SensingMethod' },
-	'sensitivityadjust' => { 278 => 0x40 },
-	'sensitivitysteps' => { 259 => ['14.3','17.4'], 261 => 0x1 },
-	'sensitivitytype' => { 93 => 0x8830 },
-	'sensorareas' => { 300 => 0xa010 },
-	'sensorbitdepth' => { 249 => 0x312d },
-	'sensorbluelevel' => { 58 => 0x5 },
-	'sensorcleaning' => { 72 => 0xd },
-	'sensorfullheight' => { 106 => 0xf904 },
-	'sensorfullwidth' => { 106 => 0xf903 },
-	'sensorheight' => { 106 => 0xf901, 111 => 0xfa21, 152 => 0x8, 249 => 0x312c },
-	'sensorpixelsize' => { 178 => 0x9a },
-	'sensorredlevel' => { 58 => 0x4 },
-	'sensorsize' => { 123 => 'SensorSize', 278 => 0x35 },
-	'sensortemperature' => { 231 => 0x1500, 233 => 0x1007, 303 => [0x39,0x55] },
-	'sensorwidth' => { 106 => 0xf900, 111 => 0xfa20, 152 => 0xa, 249 => 0x312b },
-	'sequence' => { 291 => 0x7 },
-	'sequencefilenumber' => { 323 => 0xc, 324 => 0xc },
-	'sequenceimagenumber' => { 323 => 0x8, 324 => 0x8 },
-	'sequencelength' => { 323 => 0x22, 324 => 0x1e },
-	'sequencenumber' => { 60 => 0x9, 89 => 0x301c, 98 => 0x1101, 109 => 0x1d, 199 => 0x51c, 247 => 0x2b, 309 => [0x10c,0x30c], 318 => 0xb04a },
-	'sequenceshotinterval' => { 302 => 0x224 },
-	'sequentialshot' => { 302 => 0x20e },
-	'serialnumber' => { 49 => 0xc, 79 => 0x180b, 93 => [0xa431,0xfde9], 106 => 0xfa04, 108 => 0xfa00, 110 => 0xc354, 111 => 0xfa19, 120 => 0x0, 123 => 'SerialNumber', 178 => [0xa0,0x1d], 229 => 0x101, 233 => [0x404,0x101a], 243 => 0x303, 249 => 0x3103, 278 => 0x229, 291 => 0x15, 295 => 0x5, 303 => 0x2, 340 => 'SerialNumber' },
-	'serialnumberformat' => { 49 => 0x15, 79 => 0x183b },
-	'seriesdatetime' => { 331 => 'SeriesDateTime' },
-	'seriesdescription' => { 331 => 'SeriesDescription' },
-	'seriesmodality' => { 331 => 'SeriesModality' },
-	'seriesnumber' => { 331 => 'SeriesNumber' },
-	'serviceidentifier' => { 102 => 0x1e },
-	'setbuttoncrosskeysfunc' => { 69 => 0x0, 70 => 0x0 },
-	'setbuttonwhenshooting' => { 64 => 0x1, 66 => 0x704, 72 => 0xc },
-	'setfunctionwhenshooting' => { 67 => 0x0, 68 => 0x1, 71 => 0x1 },
-	'shadingcompensation' => { 228 => 0x50c },
-	'shadingcompensation2' => { 232 => 0x1012 },
-	'shadow' => { 303 => 0xe },
-	'shadowcorrection' => { 278 => 0x79 },
-	'shadowprotection' => { 210 => 0x0 },
-	'shadows' => { 93 => 0xfe52, 337 => 'Shadows', 343 => 'Shadows' },
-	'shadows2012' => { 343 => 'Shadows2012' },
-	'shadowscale' => { 93 => 0xc633 },
-	'shadowtint' => { 343 => 'ShadowTint' },
-	'shakereduction' => { 279 => 0x1 },
-	'sharpendetail' => { 343 => 'SharpenDetail' },
-	'sharpenedgemasking' => { 343 => 'SharpenEdgeMasking' },
-	'sharpening' => { 249 => 0x300b },
-	'sharpeningadj' => { 214 => 0x2b },
-	'sharpenradius' => { 343 => 'SharpenRadius' },
-	'sharpness' => { 5 => [0x42,0x48], 7 => 0x72, 9 => 0x74, 27 => 0xf, 58 => 0x2, 88 => 0xb, 89 => [0x3011,0x21], 93 => [0xa40a,0xfe56], 98 => 0x1001, 109 => 0x6b, 118 => 0x37, 123 => 'Sharpness', 145 => 0x21, 146 => 0x30, 147 => 0x26, 148 => 0x18, 153 => 0x3, 178 => 0x6, 180 => 0x32, 233 => 0x100f, 247 => 0x41, 278 => 0x21, 283 => 0xb, 291 => 0x26, 294 => 0x22, 295 => 0x1003, 303 => 0x11, 307 => 0x1c, 308 => 0x19, 318 => 0x2006, 343 => 'Sharpness', 347 => 'Sharpness' },
-	'sharpnessadj' => { 84 => 0x25a, 329 => 0x801a },
-	'sharpnessfactor' => { 233 => 0x102a },
-	'sharpnessfaithful' => { 16 => 0xf5, 54 => 0x64, 55 => 0x64 },
-	'sharpnessfrequency' => { 5 => [0x41,0x47], 58 => 0x3 },
-	'sharpnesslandscape' => { 16 => 0xf3, 54 => 0x34, 55 => 0x34 },
-	'sharpnessmonochrome' => { 16 => 0xf6, 54 => 0x7c, 55 => 0x7c },
-	'sharpnessneutral' => { 16 => 0xf4, 54 => 0x4c, 55 => 0x4c },
-	'sharpnessovershoot' => { 329 => 0x801b },
-	'sharpnessportrait' => { 16 => 0xf2, 54 => 0x1c, 55 => 0x1c },
-	'sharpnesssetting' => { 228 => 0x506, 236 => 0x1013, 309 => 0x12, 319 => 0xa },
-	'sharpnessstandard' => { 16 => 0xf1, 54 => 0x4, 55 => 0x4 },
-	'sharpnessthreshold' => { 329 => 0x801d },
-	'sharpnessundershoot' => { 329 => 0x801c },
-	'sharpnessunknown' => { 55 => 0x94 },
-	'sharpnessuserdef1' => { 16 => 0xf7, 54 => 0x94, 55 => 0xac },
-	'sharpnessuserdef2' => { 16 => 0xf8, 54 => 0xac, 55 => 0xc4 },
-	'sharpnessuserdef3' => { 16 => 0xf9, 54 => 0xc4, 55 => 0xdc },
-	'shootinginfodisplay' => { 218 => '13.2', 223 => '10.2', 224 => '4.1', 227 => '5.3' },
-	'shootinginfomonitorofftime' => { 223 => '9.1', 224 => '21.2', 227 => '22.2' },
-	'shootingmode' => { 123 => 'ShootingMode', 178 => 0x89, 247 => 0x1f },
-	'shootingmodesetting' => { 219 => '5.1' },
-	'shortdescription' => { 345 => 'shortdescription' },
-	'shortdocumentid' => { 101 => 0xba },
-	'shortownername' => { 16 => 0xac },
-	'shortreleasetimelag' => { 66 => 0x80d },
-	'shotdate' => { 365 => 'shotDate' },
-	'shotday' => { 365 => 'shotDay' },
-	'shotlocation' => { 365 => 'shotLocation' },
-	'shotname' => { 365 => 'shotName' },
-	'shotnumber' => { 365 => 'shotNumber' },
-	'shotnumbersincepowerup' => { 323 => 0x1a, 324 => 0x16 },
-	'shotsize' => { 365 => 'shotSize' },
-	'shutter-aelock' => { 64 => 0x4, 66 => 0x701, 67 => 0x3, 68 => 0x4, 69 => 0x3, 70 => 0x3, 71 => 0x4, 72 => 0x2 },
-	'shutteraelbutton' => { 65 => 0x4 },
-	'shutterbuttonafonbutton' => { 66 => 0x701 },
-	'shuttercount' => { 8 => 0x176, 44 => 0x1, 178 => 0xa7, 184 => [0x6a,0x157,0x24d], 185 => 0x286, 186 => 0x279, 187 => 0x284, 188 => 0x242, 189 => 0x280, 190 => 0x276, 191 => [0x27d,0x27f], 192 => 0x246, 193 => 0x2d6, 194 => 0x321, 195 => 0xbd8, 196 => 0x287, 197 => 0x320, 198 => 0x24a, 199 => 0x5fb, 200 => 0x2d5, 278 => 0x5d },
-	'shuttercurtainsync' => { 64 => 0xf, 65 => 0xf, 66 => 0x305, 67 => 0xe, 68 => 0xf, 69 => 0x8, 70 => 0x8, 71 => 0xf, 72 => 0x8 },
-	'shuttermode' => { 109 => 0x1b },
-	'shutterreleasebuttonae-l' => { 218 => '17.7', 220 => '16.1', 221 => '17.1', 222 => '17.1', 223 => '7.1', 224 => '17.5', 227 => '18.2' },
-	'shutterreleasemethod' => { 79 => 0x1010 },
-	'shutterreleasenocfcard' => { 64 => 0x2, 65 => 0x2, 72 => 0xf },
-	'shutterreleasetiming' => { 79 => 0x1011 },
-	'shutterspeedrange' => { 66 => 0x10c },
-	'shutterspeedsetting' => { 148 => 0x6, 307 => 0x2f, 308 => 0x28, 309 => 0x0 },
-	'shutterspeedvalue' => { 75 => 0x1, 93 => 0x9201, 233 => 0x1000, 347 => 'ShutterSpeedValue' },
-	'sidecarforextension' => { 354 => 'SidecarForExtension' },
-	'similarityindex' => { 101 => 0xe4 },
-	'singleframebracketing' => { 148 => 0x21 },
-	'slaveflashmeteringsegments' => { 278 => 0x20b },
-	'slowshutter' => { 60 => 0x8 },
-	'slowsync' => { 98 => 0x1030 },
-	'smartrange' => { 300 => 0xa012 },
-	'smileshutter' => { 309 => 0x31 },
-	'smileshuttermode' => { 309 => 0x27 },
-	'smoothness' => { 93 => 0xfe57, 343 => 'Smoothness' },
-	'softskineffect' => { 318 => 0x200f },
-	'software' => { 93 => 0x131, 124 => 'Software', 239 => 'Software', 303 => 0x18, 361 => 'Software' },
-	'softwareversion' => { 302 => 0x207 },
-	'sonydatetime' => { 321 => 0x6 },
-	'sonyimageheight' => { 321 => 0x1a },
-	'sonyimagesize' => { 148 => 0x3b, 307 => 0x54, 308 => 0x54, 309 => 0x9 },
-	'sonyimagewidth' => { 321 => 0x1c },
-	'sonymodelid' => { 318 => 0xb001 },
-	'sonyquality' => { 148 => 0x3c },
-	'source' => { 101 => 0x73, 239 => 'Source', 344 => 'source', 345 => 'source', 354 => 'Source' },
-	'sourcedirectoryindex' => { 265 => 0x0 },
-	'sourcefileindex' => { 265 => 0x2 },
-	'sourcephotoscount' => { 333 => 'SourcePhotosCount' },
-	'spatialfrequencyresponse' => { 347 => 'SpatialFrequencyResponse' },
-	'spatialfrequencyresponsecolumns' => { 347 => [\'SpatialFrequencyResponse','SpatialFrequencyResponseColumns'] },
-	'spatialfrequencyresponsenames' => { 347 => [\'SpatialFrequencyResponse','SpatialFrequencyResponseNames'] },
-	'spatialfrequencyresponserows' => { 347 => [\'SpatialFrequencyResponse','SpatialFrequencyResponseRows'] },
-	'spatialfrequencyresponsevalues' => { 347 => [\'SpatialFrequencyResponse','SpatialFrequencyResponseValues'] },
-	'speakerplacement' => { 365 => 'speakerPlacement' },
-	'specialeffectlevel' => { 89 => 0x3030 },
-	'specialeffectmode' => { 89 => 0x2076 },
-	'specialeffectsetting' => { 89 => 0x3031 },
-	'specialinstructions' => { 101 => 0x28 },
-	'specialmode' => { 233 => 0x200, 302 => 0x200 },
-	'spectralsensitivity' => { 93 => 0x8824, 347 => 'SpectralSensitivity' },
-	'splittoningbalance' => { 343 => 'SplitToningBalance' },
-	'splittoninghighlighthue' => { 343 => 'SplitToningHighlightHue' },
-	'splittoninghighlightsaturation' => { 343 => 'SplitToningHighlightSaturation' },
-	'splittoningshadowhue' => { 343 => 'SplitToningShadowHue' },
-	'splittoningshadowsaturation' => { 343 => 'SplitToningShadowSaturation' },
-	'spotfocuspointx' => { 145 => 0x2d },
-	'spotfocuspointy' => { 145 => 0x2e },
-	'spotmeteringmode' => { 27 => 0x27 },
-	'spotmeterlinktoafpoint' => { 66 => 0x107 },
-	'sractive' => { 259 => '17.1' },
-	'srawquality' => { 27 => 0x2e },
-	'srfocallength' => { 279 => 0x3 },
-	'srhalfpresstime' => { 279 => 0x2 },
-	'srresult' => { 279 => 0x0 },
-	'standardoutputhighlightpoint' => { 85 => 0x14 },
-	'standardoutputsensitivity' => { 93 => 0x8831 },
-	'standardoutputshadowpoint' => { 85 => 0x15 },
-	'standardrawcolortone' => { 85 => 0xd },
-	'standardrawcontrast' => { 85 => 0xf },
-	'standardrawhighlight' => { 85 => 0x75 },
-	'standardrawhighlightpoint' => { 85 => 0x12 },
-	'standardrawlinear' => { 85 => 0x10 },
-	'standardrawsaturation' => { 85 => 0xe },
-	'standardrawshadow' => { 85 => 0x7e },
-	'standardrawshadowpoint' => { 85 => 0x13 },
-	'standardrawsharpness' => { 85 => 0x11 },
-	'standardunsharpmaskfineness' => { 85 => 0x94 },
-	'standardunsharpmaskstrength' => { 85 => 0x92 },
-	'standardunsharpmaskthreshold' => { 85 => 0x96 },
-	'standbytimer' => { 222 => '18.1' },
-	'startingpage' => { 356 => 'startingPage' },
-	'startmovieshooting' => { 66 => 0x70d },
-	'starttimecode' => { 365 => 'startTimecode' },
-	'starttimecodetimeformat' => { 365 => [\'startTimecode','startTimecodeTimeFormat'] },
-	'starttimecodetimevalue' => { 365 => [\'startTimecode','startTimecodeTimeValue'] },
-	'starttimecodevalue' => { 365 => [\'startTimecode','startTimecodeValue'] },
-	'state' => { 128 => 'State', 247 => 0x6b, 354 => 'State' },
-	'status' => { 336 => 'Status' },
-	'stitchingsoftware' => { 333 => 'StitchingSoftware' },
-	'storagemethod' => { 152 => 0x12 },
-	'straightenangle' => { 211 => 0x2fc08431 },
-	'stretchmode' => { 365 => 'stretchMode' },
-	'studydatetime' => { 331 => 'StudyDateTime' },
-	'studydescription' => { 331 => 'StudyDescription' },
-	'studyid' => { 331 => 'StudyID' },
-	'studyphysician' => { 331 => 'StudyPhysician' },
-	'sub-location' => { 101 => 0x5c },
-	'subfiledata' => { 131 => 'data' },
-	'subfiledirectory' => { 131 => '1Directory' },
-	'subfilemimetype' => { 131 => '2MIME' },
-	'subfilename' => { 131 => '1Name' },
-	'subfileresource' => { 131 => 'rsrc' },
-	'subfiletype' => { 93 => 0xfe, 131 => '0Type' },
-	'subject' => { 237 => 'Subject', 290 => 'Subject', 344 => 'subject', 353 => 'Subject', 366 => 'subject' },
-	'subjectarea' => { 93 => 0x9214, 347 => 'SubjectArea' },
-	'subjectcode' => { 351 => 'SubjectCode' },
-	'subjectdistance' => { 93 => 0x9206, 109 => 0x3e, 347 => 'SubjectDistance' },
-	'subjectdistancerange' => { 93 => 0xa40c, 347 => 'SubjectDistanceRange' },
-	'subjectlocation' => { 93 => 0xa214, 347 => 'SubjectLocation' },
-	'subjectprogram' => { 145 => 0x22 },
-	'subjectreference' => { 101 => 0xc },
-	'sublabels4' => { 350 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsSubLabels'] },
-	'sublabels5' => { 350 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabels'] },
-	'sublables1' => { 350 => [\'TagStructure','TagStructureSubLabels'] },
-	'sublables2' => { 350 => [\'TagStructure','TagStructureSubLabelsSubLabels'] },
-	'sublables3' => { 350 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabels'] },
-	'subsectime' => { 93 => 0x9290 },
-	'subsectimedigitized' => { 93 => 0x9292 },
-	'subsectimeoriginal' => { 93 => 0x9291 },
-	'subsection1' => { 356 => 'subsection1' },
-	'subsection2' => { 356 => 'subsection2' },
-	'subsection3' => { 356 => 'subsection3' },
-	'subsection4' => { 356 => 'subsection4' },
-	'subversionfilename' => { 350 => [\'SubVersions','SubVersionsFileName'] },
-	'subversionreference' => { 350 => [\'SubVersions','SubVersionsVersRef'] },
-	'subversions' => { 350 => 'SubVersions' },
-	'superimposeddisplay' => { 64 => 0xa, 66 => 0x510, 67 => 0x9, 68 => 0xa, 71 => 0xa, 72 => 0xe },
-	'supermacro' => { 49 => 0x1a },
-	'supplementalcategories' => { 101 => 0x14, 354 => 'SupplementalCategories' },
-	'supplementaltype' => { 103 => 0x37 },
-	'svisosetting' => { 259 => 0x14 },
-	'sweeppanoramadirection' => { 309 => 0x33 },
-	'sweeppanoramasize' => { 309 => 0x32 },
-	'switchtoregisteredafpoint' => { 65 => 0x12, 66 => 0x50a },
-	'tagged' => { 285 => 0xdd, 286 => 'Tagged', 338 => 'tagged' },
-	'tagslist' => { 346 => 'TagsList' },
-	'tagstructure' => { 350 => 'TagStructure' },
-	'takenumber' => { 365 => 'takeNumber' },
-	'tapename' => { 365 => 'tapeName' },
-	'targetaperture' => { 60 => 0x4 },
-	'targetcompressionratio' => { 77 => 0x1 },
-	'targetdistancesetting' => { 79 => 0x1807 },
-	'targetexposuretime' => { 60 => 0x5 },
-	'targetimagetype' => { 79 => 0x100a },
-	'taxon' => { 92 => 'Taxon' },
-	'taxonacceptednameusage' => { 92 => [\'Taxon','TaxonAcceptedNameUsage'] },
-	'taxonacceptednameusageid' => { 92 => [\'Taxon','TaxonAcceptedNameUsageID'] },
-	'taxonclass' => { 92 => [\'Taxon','TaxonClass'] },
-	'taxonconceptid' => { 92 => [\'Taxon','TaxonTaxonConceptID'] },
-	'taxonfamily' => { 92 => [\'Taxon','TaxonFamily'] },
-	'taxongenus' => { 92 => [\'Taxon','TaxonGenus'] },
-	'taxonhigherclassification' => { 92 => [\'Taxon','TaxonHigherClassification'] },
-	'taxonid' => { 92 => [\'Taxon','TaxonTaxonID'] },
-	'taxoninfraspecificepithet' => { 92 => [\'Taxon','TaxonInfraspecificEpithet'] },
-	'taxonkingdom' => { 92 => [\'Taxon','TaxonKingdom'] },
-	'taxonnameaccordingto' => { 92 => [\'Taxon','TaxonNameAccordingTo'] },
-	'taxonnameaccordingtoid' => { 92 => [\'Taxon','TaxonNameAccordingToID'] },
-	'taxonnamepublishedin' => { 92 => [\'Taxon','TaxonNamePublishedIn'] },
-	'taxonnamepublishedinid' => { 92 => [\'Taxon','TaxonNamePublishedInID'] },
-	'taxonnomenclaturalcode' => { 92 => [\'Taxon','TaxonNomenclaturalCode'] },
-	'taxonnomenclaturalstatus' => { 92 => [\'Taxon','TaxonNomenclaturalStatus'] },
-	'taxonorder' => { 92 => [\'Taxon','TaxonOrder'] },
-	'taxonoriginalnameusage' => { 92 => [\'Taxon','TaxonOriginalNameUsage'] },
-	'taxonparentnameusage' => { 92 => [\'Taxon','TaxonParentNameUsage'] },
-	'taxonparentnameusageid' => { 92 => [\'Taxon','TaxonParentNameUsageID'] },
-	'taxonphylum' => { 92 => [\'Taxon','TaxonPhylum'] },
-	'taxonrank' => { 92 => [\'Taxon','TaxonTaxonRank'] },
-	'taxonremarks' => { 92 => [\'Taxon','TaxonTaxonRemarks'] },
-	'taxonscientificname' => { 92 => [\'Taxon','TaxonScientificName'] },
-	'taxonscientificnameauthorship' => { 92 => [\'Taxon','TaxonScientificNameAuthorship'] },
-	'taxonscientificnameid' => { 92 => [\'Taxon','TaxonScientificNameID'] },
-	'taxonspecificepithet' => { 92 => [\'Taxon','TaxonSpecificEpithet'] },
-	'taxonsubgenus' => { 92 => [\'Taxon','TaxonSubgenus'] },
-	'taxontaxonomicstatus' => { 92 => [\'Taxon','TaxonTaxonomicStatus'] },
-	'taxonverbatimtaxonrank' => { 92 => [\'Taxon','TaxonVerbatimTaxonRank'] },
-	'taxonvernacularname' => { 92 => [\'Taxon','TaxonVernacularName'] },
-	'teaser' => { 356 => 'teaser' },
-	'teleconverter' => { 150 => 0x105, 318 => 0x105 },
-	'tempo' => { 365 => 'tempo' },
-	'termsandconditionstext' => { 355 => 'TermsAndConditionsText' },
-	'termsandconditionsurl' => { 355 => 'TermsAndConditionsURL' },
-	'textencoding' => { 177 => 0x4 },
-	'textlayername' => { 354 => [\'TextLayers','TextLayersLayerName'] },
-	'textlayers' => { 354 => 'TextLayers' },
-	'textlayertext' => { 354 => [\'TextLayers','TextLayersLayerText'] },
-	'textstamp' => { 247 => [0x8008,0x8009,0x3b,0x3e] },
-	'thresholding' => { 93 => 0x107 },
-	'thumbnailfilename' => { 79 => 0x817 },
-	'thumbnailformat' => { 363 => [\'Thumbnails','ThumbnailsFormat'] },
-	'thumbnailheight' => { 111 => 0xfa55, 363 => [\'Thumbnails','ThumbnailsHeight'] },
-	'thumbnailimage' => { 79 => 0x2008, 90 => 'ThumbnailImage', 96 => 0x3, 134 => 'data', 233 => 0x100, 363 => [\'Thumbnails','ThumbnailsImage'] },
-	'thumbnailimagename' => { 134 => '1Name' },
-	'thumbnailimagesize' => { 134 => 'ImageSize' },
-	'thumbnailimagetype' => { 134 => '0Type' },
-	'thumbnailimagevalidarea' => { 49 => 0x13 },
-	'thumbnaillength' => { 93 => 0x202 },
-	'thumbnailoffset' => { 93 => 0x201 },
-	'thumbnails' => { 363 => 'Thumbnails' },
-	'thumbnailwidth' => { 111 => 0xfa54, 363 => [\'Thumbnails','ThumbnailsWidth'] },
-	'ticker' => { 356 => 'ticker' },
-	'tilelength' => { 93 => 0x143 },
-	'tilewidth' => { 93 => 0x142 },
-	'time' => { 107 => 0x401, 278 => 0x7 },
-	'timecodes' => { 93 => 0xc763 },
-	'timecreated' => { 101 => 0x3c, 109 => 0x14, 118 => 0x10, 286 => 'TimeCreated' },
-	'timeperiod' => { 356 => 'timePeriod' },
-	'timerfunctionbutton' => { 219 => '5.2', 220 => '12.1', 221 => '13.1' },
-	'timerlength' => { 66 => 0x80c },
-	'timescaleparams' => { 365 => 'timeScaleParams' },
-	'timescaleparamsframeoverlappingpercentage' => { 365 => [\'timeScaleParams','timeScaleParamsFrameOverlappingPercentage'] },
-	'timescaleparamsframesize' => { 365 => [\'timeScaleParams','timeScaleParamsFrameSize'] },
-	'timescaleparamsquality' => { 365 => [\'timeScaleParams','timeScaleParamsQuality'] },
-	'timesent' => { 102 => 0x50 },
-	'timesignature' => { 365 => 'timeSignature' },
-	'timesincepoweron' => { 247 => 0x29 },
-	'timestamp' => { 8 => 0x45e, 16 => 0x11c, 239 => 'TimeStamp', 339 => 'Timestamp' },
-	'timestamp1' => { 8 => 0x45a },
-	'timezone' => { 61 => 0x1, 203 => 0x0 },
-	'timezonecity' => { 61 => 0x2 },
-	'timezonecode' => { 82 => 0x1 },
-	'timezoneinfo' => { 82 => 0x2 },
-	'timezoneoffset' => { 93 => 0x882a },
-	'tint' => { 343 => 'Tint' },
-	'title' => { 124 => 'Title', 237 => 'Title', 239 => 'Title', 247 => 0x65, 290 => 'Title', 344 => 'title', 353 => 'Title', 363 => 'Title' },
-	'tonecomp' => { 178 => 0x81 },
-	'tonecurve' => { 58 => 0x1, 278 => 0x402, 343 => 'ToneCurve' },
-	'tonecurve1' => { 300 => 0xa040 },
-	'tonecurve2' => { 300 => 0xa041 },
-	'tonecurve3' => { 300 => 0xa042 },
-	'tonecurve4' => { 300 => 0xa043 },
-	'tonecurveactive' => { 84 => 0x110 },
-	'tonecurveblue' => { 343 => 'ToneCurveBlue' },
-	'tonecurvebluex' => { 329 => 0x9003 },
-	'tonecurvebluey' => { 329 => 0x9007 },
-	'tonecurvebrightnessx' => { 329 => 0x9000 },
-	'tonecurvebrightnessy' => { 329 => 0x9004 },
-	'tonecurvefilename' => { 107 => 0x1391 },
-	'tonecurvegreen' => { 343 => 'ToneCurveGreen' },
-	'tonecurvegreenx' => { 329 => 0x9002 },
-	'tonecurvegreeny' => { 329 => 0x9006 },
-	'tonecurveinterpolation' => { 84 => 0x159 },
-	'tonecurvemode' => { 84 => 0x113 },
-	'tonecurvename' => { 343 => 'ToneCurveName' },
-	'tonecurvename2012' => { 343 => 'ToneCurveName2012' },
-	'tonecurveproperty' => { 84 => 0x3c },
-	'tonecurvepv2012' => { 343 => 'ToneCurvePV2012' },
-	'tonecurvepv2012blue' => { 343 => 'ToneCurvePV2012Blue' },
-	'tonecurvepv2012green' => { 343 => 'ToneCurvePV2012Green' },
-	'tonecurvepv2012red' => { 343 => 'ToneCurvePV2012Red' },
-	'tonecurvered' => { 343 => 'ToneCurveRed' },
-	'tonecurveredx' => { 329 => 0x9001 },
-	'tonecurveredy' => { 329 => 0x9005 },
-	'tonecurves' => { 278 => 0x403 },
-	'toningeffect' => { 44 => 0xf, 178 => 0xb3, 180 => 0x38 },
-	'toningeffectfaithful' => { 54 => 0x74, 55 => 0x74 },
-	'toningeffectlandscape' => { 54 => 0x44, 55 => 0x44 },
-	'toningeffectmonochrome' => { 16 => 0x108, 54 => 0x8c, 55 => 0x8c },
-	'toningeffectneutral' => { 54 => 0x5c, 55 => 0x5c },
-	'toningeffectportrait' => { 54 => 0x2c, 55 => 0x2c },
-	'toningeffectstandard' => { 54 => 0x14, 55 => 0x14 },
-	'toningeffectunknown' => { 55 => 0xa4 },
-	'toningeffectuserdef1' => { 54 => 0xa4, 55 => 0xbc },
-	'toningeffectuserdef2' => { 54 => 0xbc, 55 => 0xd4 },
-	'toningeffectuserdef3' => { 54 => 0xd4, 55 => 0xec },
-	'toningsaturation' => { 180 => 0x39 },
-	'totalzoom' => { 109 => 0x62 },
-	'tracknumber' => { 365 => 'trackNumber' },
-	'tracks' => { 365 => 'Tracks' },
-	'tracksframerate' => { 365 => [\'Tracks','TracksFrameRate'] },
-	'tracksmarkers' => { 365 => [\'Tracks','TracksMarkers'] },
-	'tracksmarkerscomment' => { 365 => [\'Tracks','TracksMarkersComment'] },
-	'tracksmarkerscuepointparams' => { 365 => [\'Tracks','TracksMarkersCuePointParams'] },
-	'tracksmarkerscuepointparamskey' => { 365 => [\'Tracks','TracksMarkersCuePointParamsKey'] },
-	'tracksmarkerscuepointparamsvalue' => { 365 => [\'Tracks','TracksMarkersCuePointParamsValue'] },
-	'tracksmarkerscuepointtype' => { 365 => [\'Tracks','TracksMarkersCuePointType'] },
-	'tracksmarkersduration' => { 365 => [\'Tracks','TracksMarkersDuration'] },
-	'tracksmarkerslocation' => { 365 => [\'Tracks','TracksMarkersLocation'] },
-	'tracksmarkersname' => { 365 => [\'Tracks','TracksMarkersName'] },
-	'tracksmarkersprobability' => { 365 => [\'Tracks','TracksMarkersProbability'] },
-	'tracksmarkersspeaker' => { 365 => [\'Tracks','TracksMarkersSpeaker'] },
-	'tracksmarkersstarttime' => { 365 => [\'Tracks','TracksMarkersStartTime'] },
-	'tracksmarkerstarget' => { 365 => [\'Tracks','TracksMarkersTarget'] },
-	'tracksmarkerstype' => { 365 => [\'Tracks','TracksMarkersType'] },
-	'trackstrackname' => { 365 => [\'Tracks','TracksTrackName'] },
-	'trackstracktype' => { 365 => [\'Tracks','TracksTrackType'] },
-	'trailersignature' => { 131 => 'zmie' },
-	'transferfunction' => { 93 => 0x12d, 361 => 'TransferFunction' },
-	'transform' => { 247 => [0x8012,0x59] },
-	'transmissionreference' => { 354 => 'TransmissionReference' },
-	'trapped' => { 237 => 'Trapped', 353 => 'Trapped' },
-	'travelday' => { 247 => 0x36 },
-	'triggermode' => { 291 => 0x6 },
-	'tstop' => { 93 => 0xc772 },
-	'ttl_da_adown' => { 266 => 0x5 },
-	'ttl_da_aup' => { 266 => 0x4 },
-	'ttl_da_bdown' => { 266 => 0x7 },
-	'ttl_da_bup' => { 266 => 0x6 },
-	'tungstenawb' => { 256 => 0x1 },
-	'tvexposuretimesetting' => { 259 => 0x12 },
-	'type' => { 344 => 'type', 360 => 'type' },
-	'typestatus' => { 92 => [\'Identification','IdentificationTypeStatus'] },
-	'uniquecameramodel' => { 93 => 0xc614 },
-	'uniquedocumentid' => { 101 => 0xbb },
-	'uniqueobjectname' => { 102 => 0x64 },
-	'unknownblock' => { 278 => 0x405 },
-	'unknownblock1' => { 232 => 0x635 },
-	'unknownblock2' => { 232 => 0x636 },
-	'unknownblock3' => { 232 => 0x1103 },
-	'unknownblock4' => { 232 => 0x1104 },
-	'unknowncontrast' => { 85 => 0x45 },
-	'unknownev' => { 107 => 0x1 },
-	'unknownlinear' => { 85 => 0x46 },
-	'unknownnumber' => { 79 => 0x180b },
-	'unknownoutputhighlightpoint' => { 85 => 0x4a },
-	'unknownoutputshadowpoint' => { 85 => 0x4b },
-	'unknownrawhighlight' => { 85 => 0x7b },
-	'unknownrawhighlightpoint' => { 85 => 0x48 },
-	'unknownrawshadow' => { 85 => 0x84 },
-	'unknownrawshadowpoint' => { 85 => 0x49 },
-	'unknownsharpness' => { 85 => 0x47 },
-	'unknowntemperature' => { 95 => 0x4 },
-	'unsharp1color' => { 216 => 0x13 },
-	'unsharp1halowidth' => { 216 => 0x19 },
-	'unsharp1intensity' => { 216 => 0x17 },
-	'unsharp1threshold' => { 216 => 0x1b },
-	'unsharp2color' => { 216 => 0x2e },
-	'unsharp2halowidth' => { 216 => 0x34 },
-	'unsharp2intensity' => { 216 => 0x32 },
-	'unsharp2threshold' => { 216 => 0x36 },
-	'unsharp3color' => { 216 => 0x49 },
-	'unsharp3halowidth' => { 216 => 0x4f },
-	'unsharp3intensity' => { 216 => 0x4d },
-	'unsharp3threshold' => { 216 => 0x51 },
-	'unsharp4color' => { 216 => 0x64 },
-	'unsharp4halowidth' => { 216 => 0x6a },
-	'unsharp4intensity' => { 216 => 0x68 },
-	'unsharp4threshold' => { 216 => 0x6c },
-	'unsharpcount' => { 216 => 0x0 },
-	'unsharpmask' => { 85 => 0x90, 211 => 0x76a43200 },
-	'urgency' => { 101 => 0xa, 354 => 'Urgency' },
-	'url' => { 124 => 'URL', 239 => 'URL', 288 => 0x40b, 356 => 'url' },
-	'usablemeteringmodes' => { 66 => 0x10a },
-	'usableshootingmodes' => { 66 => 0x109 },
-	'usage' => { 357 => 'usage' },
-	'usagefee' => { 358 => 'usageFee' },
-	'usageterms' => { 369 => 'UsageTerms' },
-	'useguidelines' => { 341 => 'useGuidelines' },
-	'usepanoramaviewer' => { 333 => 'UsePanoramaViewer' },
-	'usercomment' => { 79 => 0x805, 93 => 0x9286, 347 => 'UserComment' },
-	'userdef1picturestyle' => { 16 => 0x10c, 54 => 0xd8, 55 => 0xf0 },
-	'userdef2picturestyle' => { 16 => 0x10e, 54 => 0xda, 55 => 0xf2 },
-	'userdef3picturestyle' => { 16 => 0x110, 54 => 0xdc, 55 => 0xf4 },
-	'userfields' => { 336 => 'UserFields' },
-	'userlabel' => { 291 => 0x2b },
-	'userprofile' => { 243 => 0x302, 249 => 0x3038 },
-	'usmlenselectronicmf' => { 65 => 0x7, 66 => 0x501 },
-	'utmeasting' => { 135 => 'Easting' },
-	'utmmapdatum' => { 135 => 'Datum' },
-	'utmnorthing' => { 135 => 'Northing' },
-	'utmzone' => { 135 => 'Zone' },
-	'uv-irfiltercorrection' => { 243 => 0x325 },
-	'validbits' => { 232 => 0x611, 233 => 0x102c },
-	'validpixeldepth' => { 236 => 0x611 },
-	'variousmodes' => { 109 => 0x26 },
-	'variousmodes2' => { 109 => 0x3a },
-	'variprogram' => { 178 => 0xab },
-	'version' => { 98 => 0x0, 290 => 'Version', 343 => 'Version' },
-	'versioncreatedate' => { 329 => 0xd100 },
-	'versionid' => { 366 => 'VersionID' },
-	'versionidentifier' => { 356 => 'versionIdentifier' },
-	'versionmodifydate' => { 329 => 0xd101 },
-	'versions' => { 366 => 'Versions' },
-	'versionscomments' => { 366 => [\'Versions','VersionsComments'] },
-	'versionsevent' => { 366 => [\'Versions','VersionsEvent'] },
-	'versionseventaction' => { 366 => [\'Versions','VersionsEventAction'] },
-	'versionseventchanged' => { 366 => [\'Versions','VersionsEventChanged'] },
-	'versionseventinstanceid' => { 366 => [\'Versions','VersionsEventInstanceID'] },
-	'versionseventparameters' => { 366 => [\'Versions','VersionsEventParameters'] },
-	'versionseventsoftwareagent' => { 366 => [\'Versions','VersionsEventSoftwareAgent'] },
-	'versionseventwhen' => { 366 => [\'Versions','VersionsEventWhen'] },
-	'versionsmodifier' => { 366 => [\'Versions','VersionsModifier'] },
-	'versionsmodifydate' => { 366 => [\'Versions','VersionsModifyDate'] },
-	'versionsversion' => { 366 => [\'Versions','VersionsVersion'] },
-	'verticalafonbutton' => { 218 => '3.2' },
-	'vfdisplayillumination' => { 66 => 0x510 },
-	'vibrance' => { 337 => 'Vibrance', 343 => 'Vibrance' },
-	'vibrationreduction' => { 184 => [0x75,0x82,0x1ae], 192 => '586.1', 198 => '590.2', 202 => 0x4 },
-	'videoalphamode' => { 365 => 'videoAlphaMode' },
-	'videoalphapremultiplecolor' => { 365 => 'videoAlphaPremultipleColor' },
-	'videoalphapremultiplecolora' => { 365 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorA'] },
-	'videoalphapremultiplecolorb' => { 365 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorB'] },
-	'videoalphapremultiplecolorblack' => { 365 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorBlack'] },
-	'videoalphapremultiplecolorblue' => { 365 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorBlue'] },
-	'videoalphapremultiplecolorcyan' => { 365 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorCyan'] },
-	'videoalphapremultiplecolorgreen' => { 365 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorGreen'] },
-	'videoalphapremultiplecolorl' => { 365 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorL'] },
-	'videoalphapremultiplecolormagenta' => { 365 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorMagenta'] },
-	'videoalphapremultiplecolormode' => { 365 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorMode'] },
-	'videoalphapremultiplecolorred' => { 365 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorRed'] },
-	'videoalphapremultiplecolorswatchname' => { 365 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorSwatchName'] },
-	'videoalphapremultiplecolortint' => { 365 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorTint'] },
-	'videoalphapremultiplecolortype' => { 365 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorType'] },
-	'videoalphapremultiplecoloryellow' => { 365 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorYellow'] },
-	'videoalphaunityistransparent' => { 365 => 'videoAlphaUnityIsTransparent' },
-	'videocodec' => { 52 => 0x74 },
-	'videocolorspace' => { 365 => 'videoColorSpace' },
-	'videocompressor' => { 365 => 'videoCompressor' },
-	'videofieldorder' => { 365 => 'videoFieldOrder' },
-	'videoframerate' => { 365 => 'videoFrameRate' },
-	'videoframesize' => { 365 => 'videoFrameSize' },
-	'videoframesizeh' => { 365 => [\'videoFrameSize','videoFrameSizeH'] },
-	'videoframesizeunit' => { 365 => [\'videoFrameSize','videoFrameSizeUnit'] },
-	'videoframesizew' => { 365 => [\'videoFrameSize','videoFrameSizeW'] },
-	'videomoddate' => { 365 => 'videoModDate' },
-	'videopixelaspectratio' => { 365 => 'videoPixelAspectRatio' },
-	'videopixeldepth' => { 365 => 'videoPixelDepth' },
-	'videoquality' => { 89 => 0x4003 },
-	'viewfinderdisplay' => { 218 => '12.4' },
-	'viewfinderwarning' => { 218 => '13.4', 224 => '3.5', 225 => '6.2', 227 => '4.4' },
-	'viewfinderwarnings' => { 66 => 0x40a },
-	'viewinfoduringexposure' => { 66 => 0x407 },
-	'viewingmode' => { 309 => 0x2f, 319 => 0x18 },
-	'viewingmode2' => { 309 => 0x85 },
-	'vignetteamount' => { 343 => 'VignetteAmount' },
-	'vignettecontrol' => { 178 => 0x2a, 211 => 0x76a43205 },
-	'vignettecontrolintensity' => { 211 => 0xac6bd5c0 },
-	'vignettemidpoint' => { 343 => 'VignetteMidpoint' },
-	'vignettingcorrection' => { 318 => 0x2011 },
-	'voicememo' => { 302 => 0x216 },
-	'volume' => { 356 => 'volume' },
-	'vr_0x66' => { 184 => 0x66 },
-	'vrdoffset' => { 49 => 0xd0 },
-	'vrmode' => { 202 => 0x6 },
-	'wb_bluelevel3500k' => { 151 => 0x19a },
-	'wb_bluelevel6500k' => { 151 => 0x18a },
-	'wb_bluelevelcustom' => { 151 => 0x18e },
-	'wb_bluelevelscloudy' => { 151 => 0x106 },
-	'wb_bluelevelsdaylight' => { 151 => 0xea },
-	'wb_bluelevelsflash' => { 151 => 0x122 },
-	'wb_bluelevelsfluorescent' => { 151 => [0x40a,0x15a] },
-	'wb_bluelevelskelvin' => { 151 => 0x254 },
-	'wb_bluelevelsshade' => { 151 => 0x176 },
-	'wb_bluelevelstungsten' => { 151 => 0xce },
-	'wb_gbrglevels' => { 151 => 0xae, 154 => 0x4 },
-	'wb_glevel' => { 232 => 0x11f },
-	'wb_glevel3000k' => { 232 => 0x113 },
-	'wb_glevel3300k' => { 232 => 0x114 },
-	'wb_glevel3600k' => { 232 => 0x115 },
-	'wb_glevel3900k' => { 232 => 0x116 },
-	'wb_glevel4000k' => { 232 => 0x117 },
-	'wb_glevel4300k' => { 232 => 0x118 },
-	'wb_glevel4500k' => { 232 => 0x119 },
-	'wb_glevel4800k' => { 232 => 0x11a },
-	'wb_glevel5300k' => { 232 => 0x11b },
-	'wb_glevel6000k' => { 232 => 0x11c },
-	'wb_glevel6600k' => { 232 => 0x11d },
-	'wb_glevel7500k' => { 232 => 0x11e },
-	'wb_grbglevels' => { 162 => 0x0 },
-	'wb_rbgglevels' => { 159 => 0x0 },
-	'wb_rblevels' => { 178 => 0xc, 232 => 0x100 },
-	'wb_rblevels3000k' => { 232 => 0x102 },
-	'wb_rblevels3300k' => { 232 => 0x103 },
-	'wb_rblevels3500k' => { 151 => 0x430 },
-	'wb_rblevels3600k' => { 232 => 0x104 },
-	'wb_rblevels3900k' => { 232 => 0x105 },
-	'wb_rblevels4000k' => { 232 => 0x106 },
-	'wb_rblevels4300k' => { 232 => 0x107 },
-	'wb_rblevels4500k' => { 232 => 0x108 },
-	'wb_rblevels4800k' => { 232 => 0x109 },
-	'wb_rblevels5300k' => { 232 => 0x10a },
-	'wb_rblevels6000k' => { 232 => 0x10b },
-	'wb_rblevels6500k' => { 151 => 0x420 },
-	'wb_rblevels6600k' => { 232 => 0x10c },
-	'wb_rblevels7500k' => { 232 => 0x10d },
-	'wb_rblevelsauto' => { 236 => 0x110 },
-	'wb_rblevelscloudy' => { 151 => 0x3f0, 153 => 0x10, 236 => 0x121 },
-	'wb_rblevelscoolwhitef' => { 151 => 0x308, 153 => 0x14 },
-	'wb_rblevelscoolwhitefluor' => { 236 => 0x132 },
-	'wb_rblevelscustom' => { 151 => 0x424 },
-	'wb_rblevelscwb1' => { 232 => 0x10e },
-	'wb_rblevelscwb2' => { 232 => 0x10f },
-	'wb_rblevelscwb3' => { 232 => 0x110 },
-	'wb_rblevelscwb4' => { 232 => 0x111 },
-	'wb_rblevelsdaylight' => { 151 => [0x3ec,0x528], 153 => 0xc },
-	'wb_rblevelsdaylightf' => { 153 => 0x24 },
-	'wb_rblevelsdaylightfluor' => { 236 => 0x130 },
-	'wb_rblevelsdaywhitef' => { 153 => 0x28 },
-	'wb_rblevelsdaywhitefluor' => { 236 => 0x131 },
-	'wb_rblevelseveningsunlight' => { 236 => 0x124 },
-	'wb_rblevelsfineweather' => { 236 => 0x122 },
-	'wb_rblevelsflash' => { 151 => [0x3f4,0x304], 153 => 0x18 },
-	'wb_rblevelsshade' => { 151 => 0x418, 153 => 0x20, 236 => 0x120 },
-	'wb_rblevelstungsten' => { 151 => 0x3e8, 153 => 0x8, 236 => 0x123 },
-	'wb_rblevelsunknown' => { 153 => 0x1c },
-	'wb_rblevelsused' => { 236 => 0x100 },
-	'wb_rblevelswhitef' => { 153 => 0x2c },
-	'wb_rblevelswhitefluorescent' => { 236 => 0x133 },
-	'wb_redlevel3500k' => { 151 => 0x198 },
-	'wb_redlevel6500k' => { 151 => 0x188 },
-	'wb_redlevelcustom' => { 151 => 0x18c },
-	'wb_redlevelscloudy' => { 151 => 0xf8 },
-	'wb_redlevelsdaylight' => { 151 => 0xdc },
-	'wb_redlevelsflash' => { 151 => 0x114 },
-	'wb_redlevelsfluorescent' => { 151 => [0x3fc,0x14c] },
-	'wb_redlevelskelvin' => { 151 => 0x1be },
-	'wb_redlevelsshade' => { 151 => 0x168 },
-	'wb_redlevelstungsten' => { 151 => 0xc0 },
-	'wb_rgbglevels' => { 161 => 0x0 },
-	'wb_rgblevels' => { 151 => [0x546,0x96], 244 => 0xd, 245 => 0x413, 249 => 0x3036 },
-	'wb_rggblevels' => { 154 => 0x4, 160 => 0x0 },
-	'wb_rggblevelsasshot' => { 30 => 0x0, 31 => 0x19, 32 => 0x22, 33 => 0x3f, 36 => 0x3f, 37 => 0x3f },
-	'wb_rggblevelsauto' => { 28 => 0x0, 30 => 0x5, 31 => 0x1e, 32 => 0x18, 33 => 0x44, 36 => 0x44, 37 => 0x44, 300 => 0xa022 },
-	'wb_rggblevelsblack' => { 300 => 0xa028 },
-	'wb_rggblevelscloudy' => { 28 => 0xc, 30 => 0x1e, 31 => 0x2d, 32 => 0x31, 33 => 0x58, 36 => 0x71, 37 => 0x8a, 278 => 0x20f, 284 => 0x14 },
-	'wb_rggblevelscustom' => { 28 => 0x1c, 33 => 0x80 },
-	'wb_rggblevelscustom1' => { 31 => 0x41 },
-	'wb_rggblevelscustom2' => { 31 => 0x46 },
-	'wb_rggblevelsdaylight' => { 28 => 0x4, 30 => 0x14, 31 => 0x23, 32 => 0x27, 33 => 0x4e, 36 => 0x67, 37 => 0x80, 278 => 0x20d, 284 => 0x2 },
-	'wb_rggblevelsflash' => { 28 => 0x18, 30 => 0x32, 31 => 0x3c, 32 => 0x45, 33 => 0x6c, 36 => 0x85, 37 => 0x9e, 278 => 0x214, 284 => 0x41 },
-	'wb_rggblevelsfluorescent' => { 28 => 0x14, 30 => 0x28, 31 => 0x37, 32 => 0x3b, 33 => 0x62, 36 => 0x7b, 37 => 0x94 },
-	'wb_rggblevelsfluorescentd' => { 278 => 0x211, 284 => 0x26 },
-	'wb_rggblevelsfluorescentl' => { 284 => 0x4a },
-	'wb_rggblevelsfluorescentn' => { 278 => 0x212, 284 => 0x2f },
-	'wb_rggblevelsfluorescentw' => { 278 => 0x213, 284 => 0x38 },
-	'wb_rggblevelsilluminator1' => { 300 => 0xa023 },
-	'wb_rggblevelsilluminator2' => { 300 => 0xa024 },
-	'wb_rggblevelskelvin' => { 28 => 0x20, 30 => 0x2d, 32 => 0x40, 33 => 0x67, 36 => 0x80, 37 => 0x99 },
-	'wb_rggblevelsmeasured' => { 30 => 0xa, 33 => 0x49, 36 => 0x49, 37 => 0x49 },
-	'wb_rggblevelspc1' => { 32 => 0x90, 33 => 0x71 },
-	'wb_rggblevelspc2' => { 32 => 0x95, 33 => 0x76 },
-	'wb_rggblevelspc3' => { 32 => 0x9a, 33 => 0x7b },
-	'wb_rggblevelsshade' => { 28 => 0x8, 30 => 0x19, 31 => 0x28, 32 => 0x2c, 33 => 0x53, 36 => 0x6c, 37 => 0x85, 278 => 0x20e, 284 => 0xb },
-	'wb_rggblevelstungsten' => { 28 => 0x10, 30 => 0x23, 31 => 0x32, 32 => 0x36, 33 => 0x5d, 36 => 0x76, 37 => 0x8f, 278 => 0x210, 284 => 0x1d },
-	'wb_rggblevelsuncorrected' => { 300 => 0xa021 },
-	'wb_rggblevelsunknown' => { 30 => 0xf, 32 => 0x1d, 36 => 0x4e, 37 => 0x4e, 284 => 0x53 },
-	'wb_rggblevelsunknown10' => { 30 => 0x5f, 32 => 0x72, 36 => 0x9e, 37 => 0x7b },
-	'wb_rggblevelsunknown11' => { 30 => 0x64, 32 => 0x77, 36 => 0xa3, 37 => 0xa3 },
-	'wb_rggblevelsunknown12' => { 30 => 0x69, 32 => 0x7c, 36 => 0xa8, 37 => 0xa8 },
-	'wb_rggblevelsunknown13' => { 30 => 0x6e, 32 => 0x81, 36 => 0xad, 37 => 0xad },
-	'wb_rggblevelsunknown14' => { 32 => 0x86, 36 => 0xb2, 37 => 0xb2 },
-	'wb_rggblevelsunknown15' => { 32 => 0x8b, 36 => 0xb7, 37 => 0xb7 },
-	'wb_rggblevelsunknown16' => { 32 => 0x9f, 37 => 0xbc },
-	'wb_rggblevelsunknown17' => { 37 => 0xc1 },
-	'wb_rggblevelsunknown18' => { 37 => 0xc6 },
-	'wb_rggblevelsunknown19' => { 37 => 0xcb },
-	'wb_rggblevelsunknown2' => { 30 => 0x37, 32 => 0x4a, 36 => 0x53, 37 => 0x53 },
-	'wb_rggblevelsunknown20' => { 37 => 0xd0 },
-	'wb_rggblevelsunknown3' => { 30 => 0x3c, 32 => 0x4f, 36 => 0x58, 37 => 0x58 },
-	'wb_rggblevelsunknown4' => { 30 => 0x41, 32 => 0x54, 36 => 0x5d, 37 => 0x5d },
-	'wb_rggblevelsunknown5' => { 30 => 0x46, 32 => 0x59, 36 => 0x62, 37 => 0x62 },
-	'wb_rggblevelsunknown6' => { 30 => 0x4b, 32 => 0x5e, 36 => 0x8a, 37 => 0x67 },
-	'wb_rggblevelsunknown7' => { 30 => 0x50, 32 => 0x63, 36 => 0x8f, 37 => 0x6c },
-	'wb_rggblevelsunknown8' => { 30 => 0x55, 32 => 0x68, 36 => 0x94, 37 => 0x71 },
-	'wb_rggblevelsunknown9' => { 30 => 0x5a, 32 => 0x6d, 36 => 0x99, 37 => 0x76 },
-	'wb_rggblevelsuserselected' => { 284 => 0x5c },
-	'wbadjbluebalance' => { 217 => 0x8 },
-	'wbadjcolortemp' => { 84 => 0x1a },
-	'wbadjlighting' => { 217 => 0x15 },
-	'wbadjlightingsubtype' => { 217 => 0x14 },
-	'wbadjmode' => { 217 => 0x10 },
-	'wbadjredbalance' => { 217 => 0x0 },
-	'wbadjrggblevels' => { 84 => 0x6 },
-	'wbadjtemperature' => { 217 => 0x18 },
-	'wbadjtint' => { 217 => 0x25 },
-	'wbbluelevel' => { 243 => 0x324, 247 => 0x8006, 251 => 0x26 },
-	'wbbracketmode' => { 44 => 0x9 },
-	'wbbracketshotnumber' => { 151 => 0x2b },
-	'wbbracketvalueab' => { 44 => 0xc },
-	'wbbracketvaluegm' => { 44 => 0xd },
-	'wbfinetuneactive' => { 84 => 0x24 },
-	'wbfinetunesaturation' => { 84 => 0x28 },
-	'wbfinetunetone' => { 84 => 0x2c },
-	'wbgreenlevel' => { 243 => 0x323, 247 => 0x8005, 251 => 0x25 },
-	'wbmediaimagesizesetting' => { 66 => 0x708 },
-	'wbmode' => { 153 => 0x4, 233 => 0x1015 },
-	'wbredlevel' => { 243 => 0x322, 247 => 0x8004, 251 => 0x24 },
-	'wbscale' => { 154 => 0x0 },
-	'wbshiftab' => { 58 => 0xc, 247 => 0x46, 260 => 0x10 },
-	'wbshiftab_gm' => { 318 => 0x2014 },
-	'wbshiftgm' => { 58 => 0xd, 247 => 0x47, 260 => 0x11 },
-	'webstatement' => { 369 => 'WebStatement' },
-	'whitebalance' => { 4 => 0x6f, 5 => [0x44,0x4a], 6 => 0xbc, 7 => 0x36, 8 => 0x5e, 9 => 0x36, 10 => 0x78, 11 => 0x6f, 12 => 0x6f, 13 => 0x73, 14 => 0x6f, 15 => 0x78, 16 => 0x54, 17 => 0x6f, 18 => 0xbc, 19 => 0x7b, 21 => 0xbc, 22 => 0xc2, 23 => 0x77, 58 => 0x8, 60 => 0x7, 88 => 0x7, 89 => [0x19,0x2012], 93 => [0xa403,0xfe4e], 98 => 0x1002, 107 => 0x3fc, 108 => 0xfa0d, 109 => 0x40, 145 => 0x3, 146 => 0xe, 147 => 0x4, 148 => 0xb, 150 => 0x115, 178 => 0x5, 201 => 0x7, 243 => 0x304, 247 => 0x3, 249 => 0x3033, 278 => 0x19, 283 => 0x7, 294 => 0x26, 303 => [0x3c,0x7,0x58], 318 => [0x115,0xb054], 343 => 'WhiteBalance', 347 => 'WhiteBalance' },
-	'whitebalance2' => { 228 => 0x500 },
-	'whitebalanceadj' => { 84 => 0x18, 211 => 0x76a43204 },
-	'whitebalanceautoadjustment' => { 256 => 0x0 },
-	'whitebalancebias' => { 89 => 0x2011, 233 => 0x304, 247 => 0x23 },
-	'whitebalanceblue' => { 58 => 0x7 },
-	'whitebalancebracket' => { 228 => 0x502, 233 => 0x303 },
-	'whitebalancebracketing' => { 148 => 0x22, 151 => 0x2c, 317 => 0x2c },
-	'whitebalancecomp' => { 236 => 0x1001 },
-	'whitebalancefinetune' => { 98 => 0x100a, 148 => 0x38, 150 => 0x112, 178 => 0xb, 307 => 0x6, 318 => 0x112 },
-	'whitebalancemode' => { 278 => 0x1a },
-	'whitebalancered' => { 58 => 0x6 },
-	'whitebalanceset' => { 259 => 0xa },
-	'whitebalancesetting' => { 148 => 0x23, 309 => 0x16, 319 => 0xd },
-	'whitebalancetemperature' => { 228 => 0x501 },
-	'whiteboard' => { 233 => 0x301 },
-	'whitelevel' => { 93 => 0xc61d },
-	'whitepoint' => { 93 => 0x13e, 278 => 0x201, 361 => 'WhitePoint' },
-	'whites2012' => { 343 => 'Whites2012' },
-	'widefocuszone' => { 145 => 0x2f },
-	'widerange' => { 302 => 0x20f },
-	'wordcount' => { 356 => 'wordCount' },
-	'workcolorspace' => { 84 => 0x270 },
-	'worktodo' => { 348 => 'WorkToDo' },
-	'worldtimelocation' => { 247 => 0x3a, 278 => 0x22, 282 => '0.1' },
-	'writer-editor' => { 101 => 0x7a },
-	'x3filllight' => { 303 => 0x12 },
-	'xml' => { 105 => 'xml ' },
-	'xmp' => { 83 => 0xffff00f6, 94 => 'XMP' },
-	'xmptoolkit' => { 362 => 'xmptk' },
-	'xpauthor' => { 93 => 0x9c9d },
-	'xpcomment' => { 93 => 0x9c9c },
-	'xpkeywords' => { 93 => 0x9c9e },
-	'xposition' => { 93 => 0x11e },
-	'xpsubject' => { 93 => 0x9c9f },
-	'xptitle' => { 93 => 0x9c9b },
-	'xresolution' => { 93 => 0x11a, 104 => 0x3, 289 => 0x0, 361 => 'XResolution' },
-	'xyresolution' => { 97 => 0x3 },
-	'ycbcrcoefficients' => { 93 => 0x211, 361 => 'YCbCrCoefficients' },
-	'ycbcrpositioning' => { 93 => 0x213, 361 => 'YCbCrPositioning' },
-	'ycbcrsubsampling' => { 93 => 0x212, 361 => 'YCbCrSubSampling' },
-	'yearcreated' => { 109 => 0x10, 118 => 0xc },
-	'yposition' => { 93 => 0x11f },
-	'yresolution' => { 93 => 0x11b, 104 => 0x5, 289 => 0x4, 361 => 'YResolution' },
-	'zonematching' => { 150 => 0x10a, 153 => [0x3a,0x4a], 318 => 0xb024 },
-	'zonematchingmode' => { 148 => 0x14 },
-	'zonematchingon' => { 147 => 0x75 },
-	'zonematchingvalue' => { 307 => 0x1f },
-	'zoomedpreviewlength' => { 233 => 0xf05 },
-	'zoomedpreviewsize' => { 233 => 0xf06 },
-	'zoomedpreviewstart' => { 233 => 0xf04 },
-	'zoomsourcewidth' => { 27 => 0x24 },
-	'zoomstepcount' => { 231 => 0x300, 233 => 0x100d },
-	'zoomtargetwidth' => { 27 => 0x25 },
+	'aberrationcorrectiondistance' => { 87 => 0x69 },
+	'about' => { 383 => 'about' },
+	'abspeakaudiofilepath' => { 389 => 'absPeakAudioFilePath' },
+	'accelerationtracking' => { 68 => 0x518 },
+	'accelerometerx' => { 250 => 0x8d },
+	'accelerometery' => { 250 => 0x8e },
+	'accelerometerz' => { 250 => 0x8c },
+	'accessoryserialnumber' => { 250 => 0x54 },
+	'accessorytype' => { 250 => 0x53 },
+	'actionadvised' => { 103 => 0x2a },
+	'activearea' => { 95 => 0xc68d },
+	'actived-lighting' => { 181 => 0x22, 212 => 0x24 },
+	'actived-lightingmode' => { 212 => 0x25 },
+	'addaspectratioinfo' => { 68 => 0x80e },
+	'additionalmodelinformation' => { 376 => 'AddlModelInfo' },
+	'addoriginaldecisiondata' => { 68 => 0x80f, 69 => 0x11, 70 => 0x13, 73 => 0x14 },
+	'address' => { 130 => 'Address' },
+	'adjustmentmode' => { 311 => 0x15 },
+	'adobe' => { 96 => 'Adobe' },
+	'adultcontentwarning' => { 379 => 'AdultContentWarning', 382 => 'adultContentWarning' },
+	'advancedraw' => { 214 => 0x76a43203 },
+	'advancedscenetype' => { 250 => 0x3d },
+	'advisory' => { 387 => 'Advisory' },
+	'ae_iso' => { 255 => 0x2, 256 => 0x4, 257 => 0x12 },
+	'aeaperture' => { 255 => 0x1, 256 => 0x3, 257 => 0x11 },
+	'aeaperturesteps' => { 255 => 0x8, 256 => 0xb },
+	'aebautocancel' => { 68 => 0x104 },
+	'aebbracketvalue' => { 62 => 0x11 },
+	'aebsequence' => { 68 => 0x105 },
+	'aebsequenceautocancel' => { 66 => 0x9, 67 => 0x9, 69 => 0x8, 70 => 0x9, 73 => 0x9, 74 => 0x7 },
+	'aebshotcount' => { 68 => 0x106 },
+	'aebxv' => { 255 => 0x4, 256 => 0x6 },
+	'aeerror' => { 256 => 0x8 },
+	'aeexposuretime' => { 255 => 0x0, 256 => 0x2, 257 => 0x10 },
+	'aelbutton' => { 150 => 0x45 },
+	'aelexposureindicator' => { 150 => 0x51 },
+	'aelock' => { 150 => 0x5b, 222 => '4.2', 228 => '4.2', 231 => 0x201, 281 => 0x48, 318 => [0x86,0x286] },
+	'aelockbutton' => { 221 => '16.1', 222 => '4.1', 223 => '15.1', 224 => '16.1', 225 => '16.1', 226 => '30.1', 227 => '16.1', 228 => '4.1', 230 => '17.1' },
+	'aelockbuttonplusdials' => { 221 => '16.2', 226 => '32.1' },
+	'aelockformb-d80' => { 230 => '3.1' },
+	'aemaxaperture' => { 255 => 0x9, 256 => 0x10, 257 => 0x1c },
+	'aemaxaperture2' => { 255 => 0xa, 256 => 0x11, 257 => 0x1d },
+	'aemeteringmode' => { 255 => 0xc },
+	'aemeteringmode2' => { 255 => '13.1' },
+	'aemeteringsegments' => { 153 => 0x628, 281 => 0x209 },
+	'aemicroadjustment' => { 68 => 0x111 },
+	'aeminaperture' => { 255 => 0xb, 256 => 0x12, 257 => 0x1e },
+	'aeminexposuretime' => { 255 => 0x5, 256 => 0x13, 257 => 0x1f },
+	'aeprogrammode' => { 255 => 0x6 },
+	'aesetting' => { 29 => 0x21 },
+	'aewhitebalance' => { 255 => 0xd },
+	'aexv' => { 255 => 0x3, 256 => 0x5 },
+	'af-cpriorityselection' => { 221 => '1.1', 224 => '0.1', 225 => '0.1', 226 => '1.1', 227 => '0.1' },
+	'af-onformb-d10' => { 221 => '3.3', 226 => '3.2' },
+	'af-onformb-d11' => { 227 => '2.2' },
+	'af-spriorityselection' => { 221 => '1.2', 226 => '1.2', 227 => '0.2' },
+	'afactivation' => { 221 => '2.1', 226 => '2.1' },
+	'afadjustment' => { 281 => 0x72 },
+	'afandmeteringbuttons' => { 68 => 0x701 },
+	'afaperture' => { 177 => 0x5, 178 => 0x5 },
+	'afareaheight' => { 158 => 0x1a },
+	'afareaillumination' => { 150 => 0x4b, 228 => '15.3' },
+	'afareamode' => { 146 => 0x33, 150 => 0xe, 157 => 0x0, 158 => 0x5, 250 => 0xf, 303 => 0x1205, 312 => 0xa, 316 => 0x11, 317 => 0x10, 318 => 0x24, 328 => 0xb043, 345 => 0x17 },
+	'afareamodesetting' => { 222 => '11.1', 223 => '0.1', 228 => '16.1', 230 => '2.1', 328 => 0x201c },
+	'afareas' => { 231 => 0x304 },
+	'afareawidth' => { 158 => 0x18 },
+	'afareaxposition' => { 158 => 0x14, 303 => 0x1203 },
+	'afareaxposition1' => { 303 => 0x1201 },
+	'afareayposition' => { 158 => 0x16, 303 => 0x1204 },
+	'afareayposition1' => { 303 => 0x1202 },
+	'afassist' => { 66 => 0x5, 74 => 0x5, 150 => 0x48, 221 => '2.5', 222 => '0.2', 223 => '0.2', 224 => '1.1', 225 => '1.1', 226 => '2.4', 227 => '1.4', 228 => '0.2', 230 => '2.3' },
+	'afassistbeam' => { 68 => 0x50e, 69 => 0x4, 70 => 0x5, 71 => 0x4, 72 => 0x4, 73 => 0x5 },
+	'afassistlamp' => { 250 => 0x31 },
+	'afbuttonpressed' => { 318 => [0x83,0x283] },
+	'afdefocus' => { 258 => 0x6 },
+	'afduringliveview' => { 68 => 0x511 },
+	'affinea' => { 360 => 'AffineA' },
+	'affineb' => { 360 => 'AffineB' },
+	'affinec' => { 360 => 'AffineC' },
+	'affined' => { 360 => 'AffineD' },
+	'affinetune' => { 159 => 0x0, 231 => 0x306 },
+	'affinetuneadj' => { 159 => 0x2, 189 => 0x2d1, 190 => 0x2dc, 231 => 0x307 },
+	'affinetuneindex' => { 159 => 0x1 },
+	'affinex' => { 360 => 'AffineX' },
+	'affiney' => { 360 => 'AffineY' },
+	'afilluminator' => { 316 => 0x29, 328 => 0xb044 },
+	'afimageheight' => { 158 => 0x12 },
+	'afimagewidth' => { 158 => 0x10 },
+	'afintegrationtime' => { 258 => 0x7 },
+	'afmicroadj' => { 312 => 0x17d },
+	'afmicroadjmode' => { 2 => 0x1, 315 => 0x131 },
+	'afmicroadjregisteredlenses' => { 315 => '305.1' },
+	'afmicroadjustment' => { 68 => 0x507 },
+	'afmicroadjvalue' => { 2 => 0x2, 315 => 0x130 },
+	'afmode' => { 91 => 0x3009, 146 => 0x16, 311 => 0x5 },
+	'afonaelockbuttonswitch' => { 68 => 0x702 },
+	'afonbutton' => { 221 => '3.1' },
+	'afpoint' => { 29 => 0x13, 90 => 0x18, 146 => 0x15, 157 => 0x1, 234 => 0x308, 311 => 0x1f, 312 => 0x7, 314 => 0x20, 315 => 0x19 },
+	'afpointactivationarea' => { 67 => 0x11, 73 => 0x11 },
+	'afpointareaexpansion' => { 68 => 0x508 },
+	'afpointatshutterrelease' => { 312 => 0x9 },
+	'afpointautoselection' => { 68 => 0x50b },
+	'afpointbrightness' => { 68 => 0x50d, 221 => '2.4' },
+	'afpointdisplayduringfocus' => { 68 => 0x50c },
+	'afpointillumination' => { 67 => 0xa, 221 => '2.3', 226 => '2.3', 227 => '1.3', 230 => '2.4' },
+	'afpointinfocus' => { 312 => 0x8 },
+	'afpointmode' => { 262 => 0x3 },
+	'afpointposition' => { 91 => 0x2021, 250 => 0x4d },
+	'afpointregistration' => { 66 => 0x7 },
+	'afpoints' => { 149 => 0x10 },
+	'afpointselected' => { 150 => 0xd, 231 => 0x305, 281 => 0xe, 314 => [0x14,0x1c], 315 => 0x15, 328 => 0x201e },
+	'afpointselected2' => { 262 => 0x4 },
+	'afpointselection' => { 67 => 0xb, 221 => '1.3', 226 => '1.3' },
+	'afpointselectionmethod' => { 68 => 0x50f, 69 => 0xc, 70 => 0xd, 73 => 0xd },
+	'afpointset' => { 100 => 0x1022 },
+	'afpointsetting' => { 316 => 0x12, 317 => 0x11 },
+	'afpointsinfocus' => { 62 => 0xe, 157 => 0x2, 258 => 0xb, 281 => [0xf,0x3c] },
+	'afpointsinfocus5d' => { 17 => 0x38 },
+	'afpointspotmetering' => { 67 => 0xd },
+	'afpointsselected' => { 350 => 0x4 },
+	'afpointsunknown1' => { 258 => 0x0 },
+	'afpointsunknown2' => { 258 => 0x2 },
+	'afpointsused' => { 158 => 0x8, 313 => 0x0 },
+	'afpredictor' => { 258 => 0x4 },
+	'afresponse' => { 181 => 0xad },
+	'afresult' => { 236 => 0x1038 },
+	'afsearch' => { 231 => 0x303 },
+	'afsensoractive' => { 146 => 0x1 },
+	'afstatus' => { 303 => 0x1200 },
+	'afstatusactivesensor' => { 146 => 0x2 },
+	'afstatusbottom' => { 146 => 0x8 },
+	'afstatusbottom-left' => { 146 => 0x12 },
+	'afstatusbottom-right' => { 146 => 0x6 },
+	'afstatuscenterhorizontal' => { 146 => 0x2f },
+	'afstatuscentervertical' => { 146 => 0xc },
+	'afstatusleft' => { 146 => 0x2d },
+	'afstatusmiddlehorizontal' => { 146 => 0xa },
+	'afstatusright' => { 146 => 0x31 },
+	'afstatustop' => { 146 => 0xe },
+	'afstatustop-left' => { 146 => 0x10 },
+	'afstatustop-right' => { 146 => 0x4 },
+	'aftype' => { 312 => 0x2 },
+	'afwithshutter' => { 316 => 0x2a },
+	'aggregationtype' => { 380 => 'aggregationType' },
+	'agreement' => { 382 => 'agreement' },
+	'aiservocontinuousshooting' => { 67 => 0x15 },
+	'aiservofirstimagepriority' => { 68 => 0x519 },
+	'aiservoimagepriority' => { 68 => 0x503 },
+	'aiservosecondimagepriority' => { 68 => 0x51a },
+	'aiservotrackingmethod' => { 68 => 0x504 },
+	'aiservotrackingsensitivity' => { 67 => 0x14, 68 => 0x502 },
+	'album' => { 389 => 'album' },
+	'alreadyapplied' => { 366 => 'AlreadyApplied' },
+	'alternatetitle' => { 380 => 'alternateTitle' },
+	'alttapename' => { 389 => 'altTapeName' },
+	'alttimecode' => { 389 => 'altTimecode' },
+	'alttimecodetimeformat' => { 389 => [\'altTimecode','altTimecodeTimeFormat'] },
+	'alttimecodetimevalue' => { 389 => [\'altTimecode','altTimecodeTimeValue'] },
+	'alttimecodevalue' => { 389 => [\'altTimecode','altTimecodeValue'] },
+	'ambienceselection' => { 3 => 0x1 },
+	'ambienttemperature' => { 299 => 0x14, 345 => 0x4 },
+	'ambienttemperaturefahrenheit' => { 299 => 0x13 },
+	'analogbalance' => { 95 => 0xc627 },
+	'angleadj' => { 87 => 0x8b },
+	'angleinforoll' => { 362 => 'AngleInfoRoll' },
+	'angleinfoyaw' => { 362 => 'AngleInfoYaw' },
+	'anti-blur' => { 328 => 0xb04b },
+	'antialiasstrength' => { 95 => 0xc632 },
+	'aperturerange' => { 68 => 0x10d },
+	'apertureringuse' => { 262 => '1.4' },
+	'aperturesetting' => { 150 => 0x7, 316 => 0x30, 317 => 0x29, 318 => 0x1 },
+	'aperturevalue' => { 77 => 0x2, 95 => 0x9202, 236 => 0x1002, 370 => 'ApertureValue' },
+	'applekeywords' => { 240 => 'AAPL:Keywords' },
+	'applicationnotes' => { 95 => 0x2bc, 254 => 0x2bc },
+	'applicationrecordversion' => { 103 => 0x0 },
+	'applyshootingmeteringmode' => { 68 => 0x10e },
+	'approved' => { 372 => 'Approved' },
+	'approvedby' => { 372 => 'ApprovedBy' },
+	'approximatefnumber' => { 246 => 0x313, 252 => 0x3406 },
+	'approximatefocusdistance' => { 363 => 'ApproximateFocusDistance' },
+	'armidentifier' => { 104 => 0x78 },
+	'armversion' => { 104 => 0x7a },
+	'artfilter' => { 231 => 0x529 },
+	'artfiltereffect' => { 231 => 0x52f },
+	'artist' => { 95 => 0x13b, 242 => 'Artist', 281 => 0x22e, 385 => 'Artist', 389 => 'artist' },
+	'artmode' => { 91 => 0x301b },
+	'artmodeparameters' => { 91 => 0x310b },
+	'artworkcopyrightnotice' => { 376 => [\'ArtworkOrObject','ArtworkOrObjectAOCopyrightNotice'] },
+	'artworkcreator' => { 376 => [\'ArtworkOrObject','ArtworkOrObjectAOCreator'] },
+	'artworkdatecreated' => { 376 => [\'ArtworkOrObject','ArtworkOrObjectAODateCreated'] },
+	'artworkorobject' => { 376 => 'ArtworkOrObject' },
+	'artworksource' => { 376 => [\'ArtworkOrObject','ArtworkOrObjectAOSource'] },
+	'artworksourceinventoryno' => { 376 => [\'ArtworkOrObject','ArtworkOrObjectAOSourceInvNo'] },
+	'artworktitle' => { 376 => [\'ArtworkOrObject','ArtworkOrObjectAOTitle'] },
+	'aspectframe' => { 235 => 0x1113 },
+	'aspectratio' => { 4 => 0x0, 235 => 0x1112, 281 => 0x80, 316 => 0x55, 317 => 0x55, 318 => 0xa },
+	'asshoticcprofile' => { 95 => 0xc68f },
+	'asshotneutral' => { 95 => 0xc628 },
+	'asshotpreprofilematrix' => { 95 => 0xc690 },
+	'asshotprofilename' => { 95 => 0xc6f6 },
+	'asshotwhitexy' => { 95 => 0xc629 },
+	'assignbktbutton' => { 221 => '4.2' },
+	'assignfuncbutton' => { 68 => 0x70b },
+	'assistbuttonfunction' => { 66 => 0xd },
+	'attributionname' => { 364 => 'attributionName' },
+	'attributionurl' => { 364 => 'attributionURL' },
+	'audio' => { 250 => 0x20 },
+	'audiobitrate' => { 54 => 0x6c },
+	'audiochannels' => { 54 => 0x70 },
+	'audiochanneltype' => { 389 => 'audioChannelType' },
+	'audiocompression' => { 124 => 'Compression' },
+	'audiocompressor' => { 389 => 'audioCompressor' },
+	'audioduration' => { 103 => 0x99 },
+	'audiomoddate' => { 389 => 'audioModDate' },
+	'audiooutcue' => { 103 => 0x9a },
+	'audiosamplerate' => { 54 => 0x6e, 389 => 'audioSampleRate' },
+	'audiosampletype' => { 389 => 'audioSampleType' },
+	'audiosamplingrate' => { 103 => 0x97 },
+	'audiosamplingresolution' => { 103 => 0x98 },
+	'audiotype' => { 103 => 0x96 },
+	'author' => { 126 => 'Author', 240 => 'Author', 242 => 'Author', 294 => 'Author', 361 => 'author', 377 => 'Author', 387 => 'Author' },
+	'authorsposition' => { 378 => 'AuthorsPosition' },
+	'autoaperture' => { 272 => '0.1' },
+	'autobracket' => { 311 => 0x19 },
+	'autobracketing' => { 100 => 0x1100, 281 => 0x18, 303 => 0x1007 },
+	'autobracketingmode' => { 229 => '12.3' },
+	'autobracketingset' => { 229 => '12.1' },
+	'autobracketmodem' => { 221 => '21.2', 226 => '26.2' },
+	'autobracketorder' => { 150 => 0x43, 221 => '21.3', 226 => '26.3', 227 => '12.2', 228 => '2.2', 229 => '12.2', 230 => '13.2' },
+	'autobracketset' => { 221 => '21.1', 223 => '11.1', 224 => '12.1', 225 => '12.1', 226 => '26.1', 227 => '12.1', 228 => '2.1', 230 => '13.1' },
+	'autobrightness' => { 366 => 'AutoBrightness' },
+	'autocontrast' => { 366 => 'AutoContrast' },
+	'autodistortioncontrol' => { 167 => 0x4 },
+	'autodynamicrange' => { 100 => 0x140b },
+	'autoexposure' => { 366 => 'AutoExposure' },
+	'autoexposurebracketing' => { 62 => 0x10 },
+	'autofocus' => { 234 => 0x209 },
+	'autofp' => { 228 => '7.3', 230 => '31.4' },
+	'autoiso' => { 62 => 0x1, 91 => 0x3008, 222 => '1.1', 228 => '1.1' },
+	'autoisomax' => { 222 => '1.2', 228 => '1.2' },
+	'autoisominshutterspeed' => { 222 => '1.3', 228 => '1.3' },
+	'autolateralca' => { 366 => 'AutoLateralCA' },
+	'autolightingoptimizer' => { 14 => 0xbe, 15 => 0xbf, 18 => 0xbf, 50 => 0x2, 68 => 0x204, 87 => 0x6f },
+	'autolightingoptimizeron' => { 87 => 0x6e },
+	'autoportraitframed' => { 328 => 0x2016 },
+	'autoredeye' => { 214 => 0xfe28a44f },
+	'autorotate' => { 62 => 0x1b },
+	'autoshadows' => { 366 => 'AutoShadows' },
+	'autowhiteversion' => { 366 => 'AutoWhiteVersion' },
+	'auxiliarylens' => { 181 => 0x82 },
+	'avaperturesetting' => { 262 => 0x13 },
+	'averageblacklevel' => { 36 => 0xe7, 38 => 0xfb, 39 => 0x114 },
+	'averagelv' => { 153 => 0x38 },
+	'avsettingwithoutlens' => { 68 => 0x707 },
+	'azimuth' => { 134 => 'Azimuth' },
+	'babyage' => { 250 => [0x8010,0x33] },
+	'babyname' => { 250 => 0x66 },
+	'backgroundalpha' => { 384 => 'bgalpha' },
+	'baseexposurecompensation' => { 262 => 0x15 },
+	'baseiso' => { 62 => 0x2, 81 => 0x101c, 252 => 0x312a },
+	'baselineexposure' => { 95 => 0xc62a },
+	'baselineexposureoffset' => { 95 => 0xc7a5 },
+	'baselinenoise' => { 95 => 0xc62b },
+	'baselinesharpness' => { 95 => 0xc62c },
+	'baseurl' => { 387 => 'BaseURL' },
+	'batterylevel' => { 316 => 0x51, 320 => 0xc, 321 => 0x4, 322 => 0x4, 349 => 0x7 },
+	'batterylevelgrip1' => { 349 => 0x6 },
+	'batterylevelgrip2' => { 349 => 0x8 },
+	'batteryorder' => { 221 => '12.5', 226 => '13.2', 227 => '2.1' },
+	'batterystate' => { 150 => 0x60, 322 => 0x14 },
+	'batterytemperature' => { 320 => 0x1, 322 => 0x2, 349 => 0x5 },
+	'batteryunknown' => { 320 => 0x2, 322 => 0x0 },
+	'batteryvoltage' => { 299 => 0x2a, 320 => 0x8 },
+	'batteryvoltage1' => { 322 => 0x6 },
+	'batteryvoltage2' => { 322 => 0x8 },
+	'bayergreensplit' => { 95 => 0xc62d },
+	'bayerpattern' => { 108 => 0xf902, 154 => 0x17 },
+	'beatspliceparams' => { 389 => 'beatSpliceParams' },
+	'beatspliceparamsriseindecibel' => { 389 => [\'beatSpliceParams','beatSpliceParamsRiseInDecibel'] },
+	'beatspliceparamsriseintimeduration' => { 389 => [\'beatSpliceParams','beatSpliceParamsRiseInTimeDuration'] },
+	'beatspliceparamsriseintimedurationscale' => { 389 => [\'beatSpliceParams','beatSpliceParamsRiseInTimeDurationScale'] },
+	'beatspliceparamsriseintimedurationvalue' => { 389 => [\'beatSpliceParams','beatSpliceParamsRiseInTimeDurationValue'] },
+	'beatspliceparamsusefilebeatsmarker' => { 389 => [\'beatSpliceParams','beatSpliceParamsUseFileBeatsMarker'] },
+	'beep' => { 221 => '13.1', 222 => '0.1', 223 => '2.1', 224 => '3.1', 225 => '3.1', 226 => '10.1', 228 => '0.1', 230 => '4.1' },
+	'beeppitch' => { 227 => '3.1' },
+	'beepvolume' => { 227 => '4.5' },
+	'bestqualityscale' => { 95 => 0xc65c },
+	'bestshotmode' => { 91 => 0x3007 },
+	'bitdepth' => { 131 => 'BitDepth', 154 => 0x11, 186 => 0x41 },
+	'bitspercomponent' => { 105 => 0x87 },
+	'bitspersample' => { 95 => 0x102, 385 => 'BitsPerSample' },
+	'blacklevel' => { 95 => 0xc61a, 181 => 0x3d, 236 => 0x1012 },
+	'blacklevel1' => { 254 => 0x8 },
+	'blacklevel2' => { 235 => 0x600, 239 => 0x600, 254 => 0x9 },
+	'blacklevel3' => { 254 => 0xa },
+	'blacklevelblue' => { 254 => 0x1e },
+	'blackleveldeltah' => { 95 => 0xc61b },
+	'blackleveldeltav' => { 95 => 0xc61c },
+	'blacklevelgreen' => { 254 => 0x1d },
+	'blacklevelred' => { 254 => 0x1c },
+	'blacklevelrepeatdim' => { 95 => 0xc619 },
+	'blackpoint' => { 281 => 0x200 },
+	'blacks2012' => { 366 => 'Blacks2012' },
+	'bleachbypasstoning' => { 281 => 0x7f },
+	'bluebalance' => { 165 => 0x271, 236 => 0x1018, 254 => 0x12, 281 => 0x1b },
+	'bluecurvelimits' => { 86 => 0x1fe },
+	'bluecurvepoints' => { 86 => 0x1d4 },
+	'bluehue' => { 366 => 'BlueHue' },
+	'bluesaturation' => { 366 => 'BlueSaturation' },
+	'blurcontrol' => { 281 => 0x82 },
+	'blurwarning' => { 100 => 0x1300 },
+	'bodybatteryadload' => { 260 => 0x3 },
+	'bodybatteryadnoload' => { 260 => 0x2 },
+	'bodybatterystate' => { 260 => '1.1' },
+	'bodybatteryvoltage1' => { 260 => 0x2 },
+	'bodybatteryvoltage2' => { 260 => 0x4 },
+	'bodybatteryvoltage3' => { 260 => 0x6 },
+	'bodybatteryvoltage4' => { 260 => 0x8 },
+	'bodyfirmware' => { 304 => 0x0 },
+	'bodyfirmwareversion' => { 232 => 0x104, 233 => 0x100, 236 => 0x104 },
+	'bodyserialnumber' => { 304 => 0x10 },
+	'bracketmode' => { 46 => 0x3 },
+	'bracketsequence' => { 91 => 0x301d },
+	'bracketsettings' => { 250 => 0x45 },
+	'bracketshotnumber' => { 46 => 0x5, 262 => 0x9, 327 => 0x2b },
+	'bracketshotnumber2' => { 327 => 0x2d },
+	'bracketstep' => { 147 => 0xe },
+	'bracketvalue' => { 46 => 0x4 },
+	'brightness' => { 95 => 0xfe53, 125 => 'Brightness', 147 => 0x2c, 183 => 0x34, 299 => 0x25, 316 => 0x22, 328 => 0x2007, 366 => 'Brightness' },
+	'brightnessadj' => { 86 => 0x114, 207 => 0x0, 217 => 0x2d, 352 => 0x8018 },
+	'brightnessvalue' => { 95 => 0x9203, 153 => [0x691,0x49c3], 236 => 0x1003, 334 => 0x1140, 335 => 0x1140, 336 => 0x111c, 337 => 0x1198, 338 => 0x1174, 339 => 0x102c, 340 => 0x224, 370 => 'BrightnessValue' },
+	'bulbduration' => { 62 => 0x18 },
+	'burstmode' => { 111 => 0xa, 250 => 0x2a },
+	'burstmode2' => { 111 => 0x18 },
+	'burstshot' => { 311 => 0x34 },
+	'burstspeed' => { 250 => 0x77 },
+	'buttonfunctioncontroloff' => { 68 => 0x70a },
+	'bwfilter' => { 147 => 0x2a, 155 => 0x39 },
+	'bwmode' => { 236 => 0x203 },
+	'by-line' => { 103 => 0x50 },
+	'by-linetitle' => { 103 => 0x55 },
+	'bytecount' => { 380 => 'byteCount' },
+	'calibration' => { 311 => [0x24,0x30] },
+	'calibrationilluminant1' => { 95 => 0xc65a },
+	'calibrationilluminant2' => { 95 => 0xc65b },
+	'cameraangle' => { 389 => 'cameraAngle' },
+	'cameracalibration1' => { 95 => 0xc623 },
+	'cameracalibration2' => { 95 => 0xc624 },
+	'cameracalibrationsig' => { 95 => 0xc6f3 },
+	'cameracolorcalibration01' => { 31 => 0x0, 37 => 0xba },
+	'cameracolorcalibration02' => { 31 => 0x4, 37 => 0xbf },
+	'cameracolorcalibration03' => { 31 => 0x8, 37 => 0xc4 },
+	'cameracolorcalibration04' => { 31 => 0xc, 37 => 0xc9 },
+	'cameracolorcalibration05' => { 31 => 0x10, 37 => 0xce },
+	'cameracolorcalibration06' => { 31 => 0x14, 37 => 0xd3 },
+	'cameracolorcalibration07' => { 31 => 0x18, 37 => 0xd8 },
+	'cameracolorcalibration08' => { 31 => 0x1c, 37 => 0xdd },
+	'cameracolorcalibration09' => { 31 => 0x20, 37 => 0xe2 },
+	'cameracolorcalibration10' => { 31 => 0x24, 37 => 0xe7 },
+	'cameracolorcalibration11' => { 31 => 0x28, 37 => 0xec },
+	'cameracolorcalibration12' => { 31 => 0x2c, 37 => 0xf1 },
+	'cameracolorcalibration13' => { 31 => 0x30, 37 => 0xf6 },
+	'cameracolorcalibration14' => { 31 => 0x34, 37 => 0xfb },
+	'cameracolorcalibration15' => { 31 => 0x38, 37 => 0x100 },
+	'cameraid' => { 236 => 0x209, 310 => 0x209 },
+	'cameraiso' => { 29 => 0x10 },
+	'cameralabel' => { 95 => 0xc7a1, 389 => 'cameraLabel' },
+	'cameramodel' => { 389 => 'cameraModel' },
+	'cameramove' => { 389 => 'cameraMove' },
+	'cameraorientation' => { 5 => 0x30, 7 => 0x7d, 9 => 0x30, 11 => 0x35, 12 => 0x30, 13 => 0x30, 14 => 0x31, 15 => 0x31, 16 => 0x35, 17 => 0x27, 18 => 0x31, 19 => 0x7d, 20 => 0x38, 21 => 0x36, 22 => 0x7d, 23 => 0x83, 24 => 0x84, 25 => 0x35, 250 => 0x8f, 284 => 0x1, 322 => [0x16,0x18], 342 => 0x28, 343 => 0x24, 344 => 0x29 },
+	'cameraowner' => { 112 => 0xc353 },
+	'cameraparameters' => { 236 => 0x2050 },
+	'cameraprofile' => { 366 => 'CameraProfile' },
+	'cameraprofiledigest' => { 366 => 'CameraProfileDigest' },
+	'cameraserialnumber' => { 95 => 0xc62f, 145 => 'CameraSerialNumber' },
+	'camerasettingsversion' => { 231 => 0x0 },
+	'cameratemperature' => { 5 => 0x18, 7 => 0x1b, 9 => 0x18, 11 => 0x19, 12 => 0x18, 13 => 0x18, 14 => 0x19, 15 => 0x19, 16 => 0x19, 17 => 0x17, 18 => 0x19, 19 => 0x1b, 20 => 0x19, 21 => 0x19, 22 => 0x1b, 23 => 0x1b, 24 => 0x1b, 25 => 0x19, 26 => [0x87,0x91], 27 => [0x99,0x9f,0xa4,0xa8,0x105], 28 => ['-3',0x64,0x47,0x53,0x5b,0x5c], 62 => 0xc, 235 => 0x1306, 246 => 0x320, 252 => 0x3402, 281 => 0x47, 308 => 0x43, 346 => 0x5 },
+	'cameratemperature2' => { 285 => 0xc },
+	'cameratemperature3' => { 285 => 0xe },
+	'cameratemperature4' => { 285 => 0x14 },
+	'cameratemperature5' => { 285 => 0x16 },
+	'cameratemperaturerangemax' => { 97 => 0x5 },
+	'cameratemperaturerangemin' => { 97 => 0x6 },
+	'cameratype' => { 62 => 0x1a, 236 => 0x207 },
+	'cameratype2' => { 232 => 0x100 },
+	'canonexposuremode' => { 29 => 0x14 },
+	'canonfiledescription' => { 81 => 0x805 },
+	'canonfilelength' => { 51 => 0xe },
+	'canonfirmwareversion' => { 51 => 0x7, 81 => 0x80b },
+	'canonflashinfo' => { 81 => 0x1028 },
+	'canonflashmode' => { 29 => 0x4 },
+	'canonimagesize' => { 8 => 0x39, 29 => 0xa },
+	'canonimagetype' => { 51 => 0x6, 81 => 0x815 },
+	'canonmodelid' => { 51 => 0x10, 81 => 0x1834 },
+	'canonvrd' => { 96 => 'CanonVRD' },
+	'caption' => { 361 => 'caption' },
+	'caption-abstract' => { 103 => 0x78 },
+	'captionsauthornames' => { 369 => 'CaptionsAuthorNames' },
+	'captionsdatetimestamps' => { 369 => 'CaptionsDateTimeStamps' },
+	'captionwriter' => { 378 => 'CaptionWriter' },
+	'captureframerate' => { 91 => 0x4001 },
+	'capturesoftware' => { 356 => 'CaptureSoftware' },
+	'cardshutterlock' => { 150 => 0x49 },
+	'casioimagesize' => { 91 => 0x9 },
+	'catalogsets' => { 103 => 0xff, 355 => 'CatalogSets', 359 => 'CatalogSets' },
+	'categories' => { 51 => 0x23, 361 => 'categories' },
+	'category' => { 103 => 0xf, 378 => 'Category' },
+	'ccdboardversion' => { 246 => 0x331 },
+	'ccdscanmode' => { 236 => 0x1039 },
+	'ccdsensitivity' => { 204 => 0x6 },
+	'ccdversion' => { 246 => 0x330 },
+	'cellglobalid' => { 365 => 'cgi' },
+	'celllength' => { 95 => 0x109 },
+	'cellr' => { 365 => 'r' },
+	'celltowerid' => { 365 => 'cellid' },
+	'cellwidth' => { 95 => 0x108 },
+	'centerafarea' => { 228 => '15.1' },
+	'centerfocuspoint' => { 230 => '2.2' },
+	'centerweightedareasize' => { 221 => '7.1', 226 => '5.1', 227 => '7.1', 228 => '6.3', 230 => '8.1' },
+	'certificate' => { 393 => 'Certificate' },
+	'cfapattern' => { 95 => 0xa302, 370 => 'CFAPattern' },
+	'cfapattern2' => { 95 => 0x828e },
+	'cfapatterncolumns' => { 370 => [\'CFAPattern','CFAPatternColumns'] },
+	'cfapatternrows' => { 370 => [\'CFAPattern','CFAPatternRows'] },
+	'cfapatternvalues' => { 370 => [\'CFAPattern','CFAPatternValues'] },
+	'cfarepeatpatterndim' => { 95 => 0x828d },
+	'channel' => { 380 => 'channel' },
+	'channels' => { 124 => 'Channels' },
+	'checkmark' => { 86 => 0x26a },
+	'checkmark2' => { 87 => 0x8e },
+	'childfontfiles' => { 394 => [\'Fonts','FontsChildFontFiles'] },
+	'chmodeshootingspeed' => { 221 => '10.3' },
+	'chromablurradius' => { 95 => 0xc631 },
+	'chromaticaberration' => { 87 => 0x66 },
+	'chromaticaberrationb' => { 366 => 'ChromaticAberrationB' },
+	'chromaticaberrationblue' => { 87 => 0x6b },
+	'chromaticaberrationcorr' => { 64 => [0x4,0x5] },
+	'chromaticaberrationcorrection' => { 271 => 0x1 },
+	'chromaticaberrationon' => { 87 => 0x62 },
+	'chromaticaberrationr' => { 366 => 'ChromaticAberrationR' },
+	'chromaticaberrationred' => { 87 => 0x6a },
+	'chromaticaberrationsetting' => { 65 => 0x6 },
+	'chrominancenoisereduction' => { 87 => 0x5e, 311 => 0x1a },
+	'chrominancenr_tiff_jpeg' => { 87 => 0x60 },
+	'circgradbasedcorractive' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionActive'] },
+	'circgradbasedcorramount' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionAmount'] },
+	'circgradbasedcorrbrightness' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalBrightness'] },
+	'circgradbasedcorrclarity' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalClarity'] },
+	'circgradbasedcorrclarity2012' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalClarity2012'] },
+	'circgradbasedcorrcontrast' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalContrast'] },
+	'circgradbasedcorrcontrast2012' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalContrast2012'] },
+	'circgradbasedcorrdefringe' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalDefringe'] },
+	'circgradbasedcorrexposure' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalExposure'] },
+	'circgradbasedcorrexposure2012' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalExposure2012'] },
+	'circgradbasedcorrhighlights2012' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalHighlights2012'] },
+	'circgradbasedcorrhue' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalToningHue'] },
+	'circgradbasedcorrluminancenoise' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalLuminanceNoise'] },
+	'circgradbasedcorrmaskalpha' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksAlpha'] },
+	'circgradbasedcorrmaskangle' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksAngle'] },
+	'circgradbasedcorrmaskbottom' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksBottom'] },
+	'circgradbasedcorrmaskcentervalue' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCenterValue'] },
+	'circgradbasedcorrmaskcenterweight' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCenterWeight'] },
+	'circgradbasedcorrmaskdabs' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksDabs'] },
+	'circgradbasedcorrmaskfeather' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksFeather'] },
+	'circgradbasedcorrmaskflipped' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksFlipped'] },
+	'circgradbasedcorrmaskflow' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksFlow'] },
+	'circgradbasedcorrmaskfullx' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksFullX'] },
+	'circgradbasedcorrmaskfully' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksFullY'] },
+	'circgradbasedcorrmaskleft' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksLeft'] },
+	'circgradbasedcorrmaskmidpoint' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMidpoint'] },
+	'circgradbasedcorrmaskperimetervalue' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksPerimeterValue'] },
+	'circgradbasedcorrmaskradius' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksRadius'] },
+	'circgradbasedcorrmaskright' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksRight'] },
+	'circgradbasedcorrmaskroundness' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksRoundness'] },
+	'circgradbasedcorrmasks' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasks'] },
+	'circgradbasedcorrmasksizex' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksSizeX'] },
+	'circgradbasedcorrmasksizey' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksSizeY'] },
+	'circgradbasedcorrmasktop' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksTop'] },
+	'circgradbasedcorrmaskvalue' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMaskValue'] },
+	'circgradbasedcorrmaskversion' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksVersion'] },
+	'circgradbasedcorrmaskwhat' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksWhat'] },
+	'circgradbasedcorrmaskx' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksX'] },
+	'circgradbasedcorrmasky' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksY'] },
+	'circgradbasedcorrmaskzerox' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksZeroX'] },
+	'circgradbasedcorrmaskzeroy' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksZeroY'] },
+	'circgradbasedcorrmoire' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalMoire'] },
+	'circgradbasedcorrsaturation' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalSaturation','CircularGradientBasedCorrectionsLocalToningSaturation'] },
+	'circgradbasedcorrshadows2012' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalShadows2012'] },
+	'circgradbasedcorrsharpness' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalSharpness'] },
+	'circgradbasedcorrtemperature' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalTemperature'] },
+	'circgradbasedcorrtint' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalTint'] },
+	'circgradbasedcorrwhat' => { 366 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsWhat'] },
+	'circulargradientbasedcorrections' => { 366 => 'CircularGradientBasedCorrections' },
+	'city' => { 103 => 0x5a, 130 => 'City', 250 => 0x6d, 378 => 'City' },
+	'clarity' => { 366 => 'Clarity' },
+	'clarity2012' => { 366 => 'Clarity2012' },
+	'classifystate' => { 103 => 0xe1 },
+	'clearretouch' => { 250 => 0x7c },
+	'clearretouchvalue' => { 250 => 0xa3 },
+	'client' => { 389 => 'client' },
+	'clientname' => { 372 => 'ClientName' },
+	'clmodeshootingspeed' => { 221 => '10.2', 226 => '11.2', 227 => '10.2', 230 => '11.1' },
+	'cmcontrast' => { 239 => 0x2022 },
+	'cmexposurecompensation' => { 239 => 0x2000 },
+	'cmhue' => { 239 => 0x2021 },
+	'cmsaturation' => { 239 => 0x2020 },
+	'cmsharpness' => { 239 => 0x2023 },
+	'cmwhitebalance' => { 239 => 0x2001 },
+	'cmwhitebalancecomp' => { 239 => 0x2002 },
+	'cmwhitebalancegraypoint' => { 239 => 0x2010 },
+	'codec' => { 138 => 'Codec' },
+	'codedcharacterset' => { 104 => 0x5a },
+	'collectionname' => { 139 => [\'Collections','CollectionsCollectionName'] },
+	'collections' => { 139 => 'Collections' },
+	'collectionuri' => { 139 => [\'Collections','CollectionsCollectionURI'] },
+	'coloraberrationcontrol' => { 214 => 0xc89224b },
+	'coloradjustment' => { 311 => 0x14 },
+	'coloradjustmentmode' => { 310 => 0x210 },
+	'coloranta' => { 394 => [\'Colorants','ColorantsA'] },
+	'colorantb' => { 394 => [\'Colorants','ColorantsB'] },
+	'colorantblack' => { 394 => [\'Colorants','ColorantsBlack'] },
+	'colorantblue' => { 394 => [\'Colorants','ColorantsBlue'] },
+	'colorantcyan' => { 394 => [\'Colorants','ColorantsCyan'] },
+	'colorantgreen' => { 394 => [\'Colorants','ColorantsGreen'] },
+	'colorantl' => { 394 => [\'Colorants','ColorantsL'] },
+	'colorantmagenta' => { 394 => [\'Colorants','ColorantsMagenta'] },
+	'colorantmode' => { 394 => [\'Colorants','ColorantsMode'] },
+	'colorantred' => { 394 => [\'Colorants','ColorantsRed'] },
+	'colorants' => { 394 => 'Colorants' },
+	'colorantswatchname' => { 394 => [\'Colorants','ColorantsSwatchName'] },
+	'coloranttint' => { 394 => [\'Colorants','ColorantsTint'] },
+	'coloranttype' => { 394 => [\'Colorants','ColorantsType'] },
+	'colorantyellow' => { 394 => [\'Colorants','ColorantsYellow'] },
+	'colorbalance' => { 125 => 'ColorBalance' },
+	'colorbalanceadj' => { 214 => 0x76a43202 },
+	'colorbalanceblue' => { 147 => 0x1e },
+	'colorbalancegreen' => { 147 => 0x1d },
+	'colorbalancered' => { 147 => 0x1c },
+	'colorbalanceversion' => { 166 => 0x0 },
+	'colorblur' => { 87 => 0x65 },
+	'colorbooster' => { 214 => 0x5f0e7d23 },
+	'colorboostlevel' => { 208 => 0x1 },
+	'colorboosttype' => { 208 => 0x0 },
+	'colorclass' => { 289 => 0xde, 290 => 'ColorClass' },
+	'colorcompensationfilter' => { 150 => [0x3a,0x5f], 152 => 0x111, 328 => 0xb022 },
+	'colorcompensationfilterset' => { 316 => 0xd, 317 => 0xc, 318 => 0x18, 331 => 0xf },
+	'colorcontrol' => { 236 => 0x102b },
+	'colorcorrection' => { 352 => 0x8015 },
+	'colordataversion' => { 35 => 0x0, 36 => 0x0, 38 => 0x0, 39 => 0x0 },
+	'coloreffect' => { 250 => 0x28 },
+	'colorfilter' => { 90 => 0x17, 91 => 0x3017, 147 => 0x29, 155 => [0x38,0x4d,0x4f], 287 => 0x17 },
+	'colorgain' => { 186 => 0x51 },
+	'colorhue' => { 181 => 0x8d },
+	'colorimetricreference' => { 95 => 0xc6bf },
+	'colorlabel' => { 369 => 'ColorLabel' },
+	'colormatrix' => { 235 => 0x200, 236 => 0x1011, 308 => 0xa030 },
+	'colormatrix1' => { 95 => 0xc621 },
+	'colormatrix2' => { 95 => 0xc622, 239 => 0x200 },
+	'colormatrixa' => { 281 => 0x203 },
+	'colormatrixadobergb' => { 308 => 0xa032 },
+	'colormatrixb' => { 281 => 0x204 },
+	'colormatrixnumber' => { 236 => 0x1019 },
+	'colormatrixsrgb' => { 308 => 0xa031 },
+	'colormode' => { 91 => 0x3015, 100 => 0x1210, 111 => 0x66, 147 => 0x28, 150 => 0x16, 152 => 0x101, 153 => 0x36, 155 => 0x7, 181 => 0x3, 204 => 0x4, 250 => 0x32, 311 => 0x2c, 328 => 0xb029, 378 => 'ColorMode' },
+	'colormoirereduction' => { 215 => 0x15 },
+	'colormoirereductionmode' => { 215 => 0x5 },
+	'colornoisereduction' => { 352 => 0x8029, 366 => 'ColorNoiseReduction' },
+	'colornoisereductiondetail' => { 366 => 'ColorNoiseReductionDetail' },
+	'colornoisereductionintensity' => { 215 => 0x18 },
+	'colornoisereductionsharpness' => { 215 => 0x1c },
+	'colornoisereductionsmoothness' => { 366 => 'ColorNoiseReductionSmoothness' },
+	'colorplanes' => { 99 => 0x2 },
+	'colorprofile' => { 147 => 0x33 },
+	'colorrepresentation' => { 105 => 0x3c },
+	'colorsequence' => { 105 => 0x41 },
+	'colorspace' => { 40 => 0x3, 51 => 0xb4, 81 => 0x10b4, 95 => 0xa001, 131 => 'ColorSpace', 148 => 0x2f, 149 => 0x25, 150 => 0x17, 181 => 0x1e, 231 => 0x507, 281 => 0x37, 308 => 0xa011, 311 => 0xb, 316 => 0x1b, 317 => 0x83, 318 => 0xe, 331 => 0x6, 370 => 'ColorSpace' },
+	'colortempasshot' => { 32 => 0x4, 33 => 0x1d, 34 => 0x26, 35 => 0x43, 38 => 0x43, 39 => 0x43 },
+	'colortempauto' => { 32 => 0x9, 33 => 0x22, 34 => 0x1c, 35 => 0x48, 38 => 0x48, 39 => 0x48 },
+	'colortempcloudy' => { 32 => 0x22, 33 => 0x31, 34 => 0x35, 35 => 0x5c, 38 => 0x75, 39 => 0x8e, 281 => 0x55 },
+	'colortempcustom' => { 35 => 0x84 },
+	'colortempcustom1' => { 33 => 0x45 },
+	'colortempcustom2' => { 33 => 0x4a },
+	'colortempdaylight' => { 32 => 0x18, 33 => 0x27, 34 => 0x2b, 35 => 0x52, 38 => 0x6b, 39 => 0x84, 281 => 0x53 },
+	'colortemperature' => { 5 => 0x73, 6 => [0x48,0x4e], 7 => 0xc0, 8 => 0x37, 9 => 0x62, 10 => 0x37, 11 => 0x7c, 12 => 0x73, 13 => 0x73, 14 => 0x77, 15 => 0x73, 16 => 0x7c, 17 => 0x58, 18 => 0x73, 19 => 0xc0, 20 => 0x7f, 21 => 0x7d, 22 => 0xc0, 23 => 0xc6, 24 => 0xc7, 25 => 0x7b, 51 => 0xae, 60 => 0x9, 81 => 0x10ae, 100 => 0x1005, 109 => 0x846, 125 => 'ColorTemperature', 148 => [0x6e,0x49], 149 => 0x3f, 150 => [0x39,0x5e], 152 => 0x10b, 155 => [0x3c,0x4c,0x4e], 246 => 0x321, 281 => 0x50, 303 => 0x1308, 328 => 0xb021, 366 => 'Temperature' },
+	'colortemperatureadj' => { 352 => 0x8013 },
+	'colortemperaturebg' => { 236 => 0x1013 },
+	'colortemperaturerg' => { 236 => 0x1014 },
+	'colortemperaturesetting' => { 150 => 0x25, 316 => 0xc, 317 => 0xb, 318 => 0x17, 331 => 0xe },
+	'colortempflash' => { 32 => 0x36, 33 => 0x40, 34 => 0x49, 35 => 0x70, 38 => 0x89, 39 => 0xa2, 281 => 0x5a },
+	'colortempflashdata' => { 35 => 0x24a },
+	'colortempfluorescent' => { 32 => 0x2c, 33 => 0x3b, 34 => 0x3f, 35 => 0x66, 38 => 0x7f, 39 => 0x98 },
+	'colortempfluorescentd' => { 281 => 0x57 },
+	'colortempfluorescentn' => { 281 => 0x58 },
+	'colortempfluorescentw' => { 281 => 0x59 },
+	'colortempkelvin' => { 32 => 0x31, 34 => 0x44, 35 => 0x6b, 38 => 0x84, 39 => 0x9d, 250 => 0x44, 303 => 0x1307 },
+	'colortempmeasured' => { 32 => 0xe, 35 => 0x4d, 38 => 0x4d, 39 => 0x4d },
+	'colortemppc1' => { 34 => 0x94, 35 => 0x75 },
+	'colortemppc2' => { 34 => 0x99, 35 => 0x7a },
+	'colortemppc3' => { 34 => 0x9e, 35 => 0x7f },
+	'colortempshade' => { 32 => 0x1d, 33 => 0x2c, 34 => 0x30, 35 => 0x57, 38 => 0x70, 39 => 0x89, 281 => 0x54 },
+	'colortemptungsten' => { 32 => 0x27, 33 => 0x36, 34 => 0x3a, 35 => 0x61, 38 => 0x7a, 39 => 0x93, 281 => 0x56 },
+	'colortempunknown' => { 32 => 0x13, 34 => 0x21, 38 => 0x52, 39 => 0x52 },
+	'colortempunknown10' => { 32 => 0x63, 34 => 0x76, 38 => 0xa2, 39 => 0x7f },
+	'colortempunknown11' => { 32 => 0x68, 34 => 0x7b, 38 => 0xa7, 39 => 0xa7 },
+	'colortempunknown12' => { 32 => 0x6d, 34 => 0x80, 38 => 0xac, 39 => 0xac },
+	'colortempunknown13' => { 32 => 0x72, 34 => 0x85, 38 => 0xb1, 39 => 0xb1 },
+	'colortempunknown14' => { 34 => 0x8a, 38 => 0xb6, 39 => 0xb6 },
+	'colortempunknown15' => { 34 => 0x8f, 38 => 0xbb, 39 => 0xbb },
+	'colortempunknown16' => { 34 => 0xa3, 39 => 0xc0 },
+	'colortempunknown17' => { 39 => 0xc5 },
+	'colortempunknown18' => { 39 => 0xca },
+	'colortempunknown19' => { 39 => 0xcf },
+	'colortempunknown2' => { 32 => 0x3b, 34 => 0x4e, 38 => 0x57, 39 => 0x57 },
+	'colortempunknown20' => { 39 => 0xd4 },
+	'colortempunknown3' => { 32 => 0x40, 34 => 0x53, 38 => 0x5c, 39 => 0x5c },
+	'colortempunknown4' => { 32 => 0x45, 34 => 0x58, 38 => 0x61, 39 => 0x61 },
+	'colortempunknown5' => { 32 => 0x4a, 34 => 0x5d, 38 => 0x66, 39 => 0x66 },
+	'colortempunknown6' => { 32 => 0x4f, 34 => 0x62, 38 => 0x8e, 39 => 0x6b },
+	'colortempunknown7' => { 32 => 0x54, 34 => 0x67, 38 => 0x93, 39 => 0x70 },
+	'colortempunknown8' => { 32 => 0x59, 34 => 0x6c, 38 => 0x98, 39 => 0x75 },
+	'colortempunknown9' => { 32 => 0x5e, 34 => 0x71, 38 => 0x9d, 39 => 0x7a },
+	'colortone' => { 8 => 0x6f, 10 => 0x77, 29 => 0x2a, 40 => 0x2 },
+	'colortoneadj' => { 86 => 0x11e },
+	'colortoneauto' => { 57 => 0x9c },
+	'colortonefaithful' => { 17 => 0x107, 56 => 0x6c, 57 => 0x6c },
+	'colortonelandscape' => { 17 => 0x105, 56 => 0x3c, 57 => 0x3c },
+	'colortonemonochrome' => { 56 => 0x84, 57 => 0x84 },
+	'colortoneneutral' => { 17 => 0x106, 56 => 0x54, 57 => 0x54 },
+	'colortoneportrait' => { 17 => 0x104, 56 => 0x24, 57 => 0x24 },
+	'colortonestandard' => { 17 => 0x103, 56 => 0xc, 57 => 0xc },
+	'colortoneuserdef1' => { 17 => 0x109, 56 => 0x9c, 57 => 0xb4 },
+	'colortoneuserdef2' => { 17 => 0x10a, 56 => 0xb4, 57 => 0xcc },
+	'colortoneuserdef3' => { 17 => 0x10b, 56 => 0xcc, 57 => 0xe4 },
+	'commanddials' => { 228 => '5.1' },
+	'commanddialsaperturesetting' => { 221 => '17.3', 226 => '33.3', 227 => '17.3' },
+	'commanddialschangemainsub' => { 221 => '17.2', 226 => '33.2', 227 => '17.2' },
+	'commanddialsmenuandplayback' => { 221 => '17.4', 226 => '33.4', 227 => '17.4' },
+	'commanddialsreverserotation' => { 221 => '17.1', 223 => '16.2', 224 => '17.2', 226 => '33.1', 227 => '17.1', 230 => '18.1' },
+	'commanderchannel' => { 228 => '10.2', 229 => '25.2' },
+	'commandergroupa_ttl-aacomp' => { 228 => '13.1', 229 => '31.1' },
+	'commandergroupa_ttlcomp' => { 230 => '32.1' },
+	'commandergroupamanualoutput' => { 228 => '13.2', 229 => '28.2' },
+	'commandergroupamode' => { 228 => '11.2', 229 => '28.1' },
+	'commandergroupb_ttl-aacomp' => { 228 => '14.1', 229 => '32.1' },
+	'commandergroupb_ttlcomp' => { 230 => '33.1' },
+	'commandergroupbmanualoutput' => { 228 => '14.2', 229 => '29.2' },
+	'commandergroupbmode' => { 228 => '11.3', 229 => '29.1' },
+	'commanderinternalflash' => { 228 => '11.1', 229 => '27.1' },
+	'commanderinternalmanualoutput' => { 228 => '12.2', 229 => '27.2' },
+	'commanderinternalttlchannel' => { 226 => '18.2' },
+	'commanderinternalttlcomp' => { 228 => '12.1', 229 => '30.2', 230 => '31.2' },
+	'commanderinternalttlcompbuiltin' => { 226 => '20.1', 227 => '26.1' },
+	'commanderinternalttlcompgroupa' => { 226 => '21.1', 227 => '27.1' },
+	'commanderinternalttlcompgroupb' => { 226 => '22.1', 227 => '28.1' },
+	'comment' => { 0 => 0x2, 96 => 'Comment', 126 => 'Comment', 242 => 'Comment' },
+	'complianceprofile' => { 380 => 'complianceProfile' },
+	'componentsconfiguration' => { 95 => 0x9101, 131 => 'Components', 370 => 'ComponentsConfiguration' },
+	'componentversion' => { 81 => 0x80c },
+	'composer' => { 389 => 'composer' },
+	'compositionadjust' => { 280 => '0.1' },
+	'compositionadjustrotation' => { 280 => 0x7 },
+	'compositionadjustx' => { 280 => 0x5 },
+	'compositionadjusty' => { 280 => 0x6 },
+	'compressedbitsperpixel' => { 95 => 0x9102, 370 => 'CompressedBitsPerPixel' },
+	'compressedimagesize' => { 152 => 0x40, 236 => 0x40 },
+	'compression' => { 95 => 0x103, 385 => 'Compression' },
+	'compressionfactor' => { 231 => 0x50d },
+	'compressionratio' => { 131 => 'Compression', 236 => 0x1034 },
+	'confidencelevel' => { 362 => 'ConfidenceLevel' },
+	'constrainedcropheight' => { 86 => 0x266, 289 => 0xd6 },
+	'constrainedcropwidth' => { 86 => 0x262, 289 => 0xd5 },
+	'contact' => { 103 => 0x76 },
+	'contentlocationcode' => { 103 => 0x1a },
+	'contentlocationname' => { 103 => 0x1b },
+	'continuousbracketing' => { 150 => 0x20 },
+	'continuousdrive' => { 29 => 0x5 },
+	'continuousshootingspeed' => { 68 => 0x610 },
+	'continuousshotlimit' => { 68 => 0x611 },
+	'contrast' => { 8 => 0x73, 10 => 0x75, 29 => 0xd, 90 => 0xc, 91 => [0x3012,0x20], 95 => [0xa408,0xfe54], 100 => [0x1004,0x1006], 125 => 'Contrast', 147 => 0x20, 148 => 0x31, 149 => 0x27, 150 => 0x19, 155 => 0x2, 183 => 0x33, 236 => 0x1029, 250 => 0x39, 252 => 0x300a, 281 => 0x20, 287 => 0xc, 299 => 0x24, 303 => 0x1012, 311 => 0xd, 316 => 0x1d, 317 => 0x1a, 328 => 0x2004, 366 => 'Contrast', 370 => 'Contrast' },
+	'contrast2012' => { 366 => 'Contrast2012' },
+	'contrastadj' => { 86 => 0x115, 217 => 0x2c, 352 => 0x8017 },
+	'contrastauto' => { 57 => 0x90 },
+	'contrastcurve' => { 181 => 0x8c },
+	'contrastdetectaf' => { 158 => 0x4 },
+	'contrastdetectafarea' => { 281 => 0x231 },
+	'contrastdetectafinfocus' => { 158 => 0x1c },
+	'contrastfaithful' => { 17 => 0xec, 56 => 0x60, 57 => 0x60 },
+	'contrasthighlight' => { 281 => 0x6d },
+	'contrasthighlightshadowadj' => { 281 => 0x6f },
+	'contrastlandscape' => { 17 => 0xea, 56 => 0x30, 57 => 0x30 },
+	'contrastmode' => { 250 => 0x2c },
+	'contrastmonochrome' => { 17 => 0xed, 56 => 0x78, 57 => 0x78 },
+	'contrastneutral' => { 17 => 0xeb, 56 => 0x48, 57 => 0x48 },
+	'contrastportrait' => { 17 => 0xe9, 56 => 0x18, 57 => 0x18 },
+	'contrastsetting' => { 231 => 0x505, 239 => 0x1012, 318 => 0x10, 331 => 0x8 },
+	'contrastshadow' => { 281 => 0x6e },
+	'contraststandard' => { 17 => 0xe8, 56 => 0x0, 57 => 0x0 },
+	'contrastuserdef1' => { 17 => 0xee, 56 => 0x90, 57 => 0xa8 },
+	'contrastuserdef2' => { 17 => 0xef, 56 => 0xa8, 57 => 0xc0 },
+	'contrastuserdef3' => { 17 => 0xf0, 56 => 0xc0, 57 => 0xd8 },
+	'contributedmedia' => { 389 => 'contributedMedia' },
+	'contributedmediaduration' => { 389 => [\'contributedMedia','contributedMediaDuration'] },
+	'contributedmediadurationscale' => { 389 => [\'contributedMedia','contributedMediaDurationScale'] },
+	'contributedmediadurationvalue' => { 389 => [\'contributedMedia','contributedMediaDurationValue'] },
+	'contributedmediamanaged' => { 389 => [\'contributedMedia','contributedMediaManaged'] },
+	'contributedmediapath' => { 389 => [\'contributedMedia','contributedMediaPath'] },
+	'contributedmediastarttime' => { 389 => [\'contributedMedia','contributedMediaStartTime'] },
+	'contributedmediastarttimescale' => { 389 => [\'contributedMedia','contributedMediaStartTimeScale'] },
+	'contributedmediastarttimevalue' => { 389 => [\'contributedMedia','contributedMediaStartTimeValue'] },
+	'contributedmediatrack' => { 389 => [\'contributedMedia','contributedMediaTrack'] },
+	'contributedmediawebstatement' => { 389 => [\'contributedMedia','contributedMediaWebStatement'] },
+	'contributor' => { 367 => 'contributor' },
+	'contributors' => { 126 => 'Contributors' },
+	'controldialset' => { 150 => 0x46 },
+	'controlledvocabularyterm' => { 376 => 'CVterm' },
+	'controllerboardversion' => { 246 => 0x332 },
+	'controlmode' => { 62 => 0x12 },
+	'conversionlens' => { 232 => 0x403, 250 => 0x35 },
+	'converter' => { 95 => 0xfe4d, 204 => 0xb, 366 => 'Converter' },
+	'converttograyscale' => { 366 => 'ConvertToGrayscale' },
+	'copyright' => { 0 => 0x3, 95 => 0x8298, 126 => 'Copyright', 242 => 'Copyright', 281 => 0x22f, 294 => 'Copyright', 377 => 'Copyright', 380 => 'copyright', 382 => 'copyright', 385 => 'Copyright', 389 => 'copyright' },
+	'copyrightflag' => { 292 => 0x40a },
+	'copyrightnotice' => { 103 => 0x74 },
+	'copyrightowner' => { 379 => 'CopyrightOwner' },
+	'copyrightownerid' => { 379 => [\'CopyrightOwner','CopyrightOwnerCopyrightOwnerID'] },
+	'copyrightownerimageid' => { 379 => 'CopyrightOwnerImageID' },
+	'copyrightownername' => { 379 => [\'CopyrightOwner','CopyrightOwnerCopyrightOwnerName'] },
+	'copyrightregistrationnumber' => { 379 => 'CopyrightRegistrationNumber' },
+	'copyrightstatus' => { 379 => 'CopyrightStatus' },
+	'coringfilter' => { 235 => 0x310, 236 => 0x102d, 239 => 0x310 },
+	'coringvalues' => { 235 => 0x311, 239 => 0x311 },
+	'corporateentity' => { 380 => 'corporateEntity' },
+	'country' => { 130 => 'Country', 250 => 0x69, 378 => 'Country' },
+	'country-primarylocationcode' => { 103 => 0x64 },
+	'country-primarylocationname' => { 103 => 0x65 },
+	'countrycode' => { 180 => 0x5, 290 => 'CountryCode', 375 => 'CountryCode' },
+	'coverage' => { 367 => 'coverage' },
+	'coverdate' => { 380 => 'coverDate' },
+	'coverdisplaydate' => { 380 => 'coverDisplayDate' },
+	'cpufirmwareversion' => { 281 => 0x28 },
+	'crc32' => { 368 => 'crc32' },
+	'createdate' => { 95 => 0x9004, 126 => 'CreateDate', 240 => 'CreationDate', 242 => 'create-date', 294 => 'CreationDate', 296 => 0x1, 387 => 'CreateDate' },
+	'creationdate' => { 377 => 'CreationDate', 380 => 'creationDate' },
+	'creationtime' => { 242 => 'Creation Time' },
+	'creativestyle' => { 316 => 0x1a, 317 => 0x18, 327 => 0x41, 328 => 0xb020, 348 => 0x4a },
+	'creativestylesetting' => { 318 => 0xf, 331 => 0x7 },
+	'creativestylewaschanged' => { 352 => 0x8001 },
+	'creator' => { 240 => 'Creator', 294 => 'Creator', 367 => 'creator', 377 => 'Creator' },
+	'creatoraddress' => { 375 => [\'CreatorContactInfo','CreatorContactInfoCiAdrExtadr'] },
+	'creatorcity' => { 375 => [\'CreatorContactInfo','CreatorContactInfoCiAdrCity'] },
+	'creatorcontactinfo' => { 375 => 'CreatorContactInfo' },
+	'creatorcountry' => { 375 => [\'CreatorContactInfo','CreatorContactInfoCiAdrCtry'] },
+	'creatorpostalcode' => { 375 => [\'CreatorContactInfo','CreatorContactInfoCiAdrPcode'] },
+	'creatorregion' => { 375 => [\'CreatorContactInfo','CreatorContactInfoCiAdrRegion'] },
+	'creatortool' => { 387 => 'CreatorTool' },
+	'creatorworkemail' => { 375 => [\'CreatorContactInfo','CreatorContactInfoCiEmailWork'] },
+	'creatorworktelephone' => { 375 => [\'CreatorContactInfo','CreatorContactInfoCiTelWork'] },
+	'creatorworkurl' => { 375 => [\'CreatorContactInfo','CreatorContactInfoCiUrlWork'] },
+	'credit' => { 103 => 0x6e, 378 => 'Credit' },
+	'creditline' => { 382 => 'creditLine' },
+	'creditlinereq' => { 392 => 'CreditLineReq' },
+	'creditlinerequired' => { 379 => 'CreditLineRequired' },
+	'cropactive' => { 86 => 0x244 },
+	'cropangle' => { 366 => 'CropAngle' },
+	'cropaspectratio' => { 86 => 0x260 },
+	'cropbottom' => { 99 => 0x9, 209 => 0x36, 289 => 0xdc, 366 => 'CropBottom' },
+	'cropbottommargin' => { 42 => 0x3 },
+	'cropcircleactive' => { 87 => 0xd6 },
+	'cropcircleradius' => { 87 => 0xd9 },
+	'cropcirclex' => { 87 => 0xd7 },
+	'cropcircley' => { 87 => 0xd8 },
+	'cropconstraintowarp' => { 366 => 'CropConstrainToWarp' },
+	'croph' => { 360 => 'CropH' },
+	'cropheight' => { 86 => 0x24c, 235 => 0x615, 239 => 0x615, 366 => 'CropHeight' },
+	'crophispeed' => { 181 => 0x1b },
+	'cropleft' => { 86 => 0x246, 99 => 0x6, 209 => 0x1e, 235 => 0x612, 239 => 0x612, 289 => 0xd9, 366 => 'CropLeft' },
+	'cropleftmargin' => { 42 => 0x0 },
+	'cropmode35mm' => { 303 => 0x1018 },
+	'cropoutputheight' => { 209 => 0xce },
+	'cropoutputheightinches' => { 209 => 0x96 },
+	'cropoutputpixels' => { 209 => 0xd6 },
+	'cropoutputresolution' => { 209 => 0xb6 },
+	'cropoutputscale' => { 209 => 0xbe },
+	'cropoutputwidth' => { 209 => 0xc6 },
+	'cropoutputwidthinches' => { 209 => 0x8e },
+	'croppedareaimageheightpixels' => { 356 => 'CroppedAreaImageHeightPixels' },
+	'croppedareaimagewidthpixels' => { 356 => 'CroppedAreaImageWidthPixels' },
+	'croppedarealeftpixels' => { 356 => 'CroppedAreaLeftPixels' },
+	'croppedareatoppixels' => { 356 => 'CroppedAreaTopPixels' },
+	'croppedimageheight' => { 4 => 0x2, 303 => 0x1604 },
+	'croppedimageleft' => { 4 => 0x3 },
+	'croppedimagetop' => { 4 => 0x4 },
+	'croppedimagewidth' => { 4 => 0x1, 303 => 0x1603 },
+	'cropright' => { 99 => 0x8, 209 => 0x2e, 289 => 0xdb, 366 => 'CropRight' },
+	'croprightmargin' => { 42 => 0x1 },
+	'croprotation' => { 99 => 0xb },
+	'cropscaledresolution' => { 209 => 0x9e },
+	'cropsourceresolution' => { 209 => 0xae },
+	'croptop' => { 86 => 0x248, 99 => 0x7, 209 => 0x26, 235 => 0x613, 239 => 0x613, 289 => 0xda, 366 => 'CropTop' },
+	'croptopmargin' => { 42 => 0x2 },
+	'cropunit' => { 366 => 'CropUnit' },
+	'cropunits' => { 366 => 'CropUnits' },
+	'cropw' => { 360 => 'CropW' },
+	'cropwidth' => { 86 => 0x24a, 235 => 0x614, 239 => 0x614, 366 => 'CropWidth' },
+	'cropx' => { 360 => 'CropX' },
+	'cropy' => { 360 => 'CropY' },
+	'crossprocess' => { 281 => 0x7b },
+	'crossprocessparams' => { 281 => 0x235 },
+	'currenticcprofile' => { 95 => 0xc691 },
+	'currentpreprofilematrix' => { 95 => 0xc692 },
+	'currentversion' => { 352 => 0xd000 },
+	'curve0x' => { 360 => 'Curve0x' },
+	'curve0y' => { 360 => 'Curve0y' },
+	'curve1x' => { 360 => 'Curve1x' },
+	'curve1y' => { 360 => 'Curve1y' },
+	'curve2x' => { 360 => 'Curve2x' },
+	'curve2y' => { 360 => 'Curve2y' },
+	'curve3x' => { 360 => 'Curve3x' },
+	'curve3y' => { 360 => 'Curve3y' },
+	'curve4x' => { 360 => 'Curve4x' },
+	'curve4y' => { 360 => 'Curve4y' },
+	'curves' => { 214 => 0x76a43201 },
+	'custom1' => { 379 => 'Custom1' },
+	'custom10' => { 379 => 'Custom10' },
+	'custom2' => { 379 => 'Custom2' },
+	'custom3' => { 379 => 'Custom3' },
+	'custom4' => { 379 => 'Custom4' },
+	'custom5' => { 379 => 'Custom5' },
+	'custom6' => { 379 => 'Custom6' },
+	'custom7' => { 379 => 'Custom7' },
+	'custom8' => { 379 => 'Custom8' },
+	'custom9' => { 379 => 'Custom9' },
+	'customcontrast' => { 87 => 0x4e },
+	'customcontrols' => { 68 => 0x70c },
+	'customdefaultunsharpfineness' => { 87 => 0xbe },
+	'customdefaultunsharpstrength' => { 87 => 0xbc },
+	'customdefaultunsharpthreshold' => { 87 => 0xc0 },
+	'customlinear' => { 87 => 0x4f },
+	'customoutputhighlightpoint' => { 87 => 0x53 },
+	'customoutputshadowpoint' => { 87 => 0x54 },
+	'custompicturestylefilename' => { 51 => 0x4010 },
+	'customrawhighlight' => { 87 => 0x7c },
+	'customrawhighlightpoint' => { 87 => 0x51 },
+	'customrawshadow' => { 87 => 0x85 },
+	'customrawshadowpoint' => { 87 => 0x52 },
+	'customrendered' => { 95 => 0xa401, 370 => 'CustomRendered' },
+	'customsaturation' => { 231 => 0x503 },
+	'customsettingsalldefault' => { 221 => '0.2', 226 => '0.2' },
+	'customsettingsbank' => { 221 => '0.1', 226 => '0.1' },
+	'customsharpness' => { 87 => 0x50 },
+	'customunsharpmaskfineness' => { 87 => 0xb8 },
+	'customunsharpmaskstrength' => { 87 => 0xb6 },
+	'customunsharpmaskthreshold' => { 87 => 0xba },
+	'customwb_rblevels' => { 331 => 0x1a },
+	'customwb_rgblevels' => { 318 => 0x19 },
+	'customwbbluelevel' => { 150 => 0x36 },
+	'customwberror' => { 150 => 0x37 },
+	'customwbgreenlevel' => { 150 => 0x35 },
+	'customwbredlevel' => { 150 => 0x34 },
+	'customwbsetting' => { 150 => 0x26 },
+	'd-lightinghq' => { 214 => 0x2175eb78 },
+	'd-lightinghqcolorboost' => { 210 => 0x2 },
+	'd-lightinghqhighlight' => { 210 => 0x1 },
+	'd-lightinghqselected' => { 214 => 0x6a6e36b6 },
+	'd-lightinghqshadow' => { 210 => 0x0 },
+	'd-lightinghs' => { 214 => 0xce5554aa },
+	'd-lightinghsadjustment' => { 211 => 0x0 },
+	'd-lightinghscolorboost' => { 211 => 0x1 },
+	'd-rangeoptimizerhighlight' => { 352 => 0x8024 },
+	'd-rangeoptimizermode' => { 352 => 0x8022 },
+	'd-rangeoptimizershadow' => { 352 => 0x802d },
+	'd-rangeoptimizervalue' => { 352 => 0x8023 },
+	'datacompressionmethod' => { 105 => 0x6e },
+	'dataimprint' => { 147 => 0x34 },
+	'date' => { 281 => 0x6, 367 => 'date' },
+	'dateacquired' => { 145 => 'DateAcquired' },
+	'datecreated' => { 103 => 0x37, 378 => 'DateCreated' },
+	'datedisplayformat' => { 206 => 0x3 },
+	'dateidentified' => { 94 => [\'Identification','IdentificationDateIdentified'] },
+	'dateimprint' => { 223 => '4.2' },
+	'daterecieved' => { 380 => 'dateRecieved' },
+	'datesent' => { 104 => 0x46 },
+	'datestampmode' => { 51 => 0x1c },
+	'datetime' => { 361 => 'datetime', 385 => 'DateTime' },
+	'datetimedigitized' => { 370 => 'DateTimeDigitized' },
+	'datetimeoriginal' => { 84 => 0x0, 95 => 0x9003, 123 => 0x14, 126 => 'OriginalDate', 299 => 0xb, 370 => 'DateTimeOriginal' },
+	'datetimestamp' => { 111 => 0x64 },
+	'datetimeutc' => { 231 => 0x908 },
+	'daylightsavings' => { 63 => 0x3, 206 => 0x2 },
+	'dccontinent' => { 94 => [\'dctermsLocation','dctermsLocationContinent'] },
+	'dccoordinateprecision' => { 94 => [\'dctermsLocation','dctermsLocationCoordinatePrecision'] },
+	'dccoordinateuncertaintyinmeters' => { 94 => [\'dctermsLocation','dctermsLocationCoordinateUncertaintyInMeters'] },
+	'dccountry' => { 94 => [\'dctermsLocation','dctermsLocationCountry'] },
+	'dccountrycode' => { 94 => [\'dctermsLocation','dctermsLocationCountryCode'] },
+	'dccounty' => { 94 => [\'dctermsLocation','dctermsLocationCounty'] },
+	'dcdecimallatitude' => { 94 => [\'dctermsLocation','dctermsLocationDecimalLatitude'] },
+	'dcdecimallongitude' => { 94 => [\'dctermsLocation','dctermsLocationDecimalLongitude'] },
+	'dcevent' => { 94 => 'Event' },
+	'dcfootprintspatialfit' => { 94 => [\'dctermsLocation','dctermsLocationFootprintSpatialFit'] },
+	'dcfootprintsrs' => { 94 => [\'dctermsLocation','dctermsLocationFootprintSRS'] },
+	'dcfootprintwkt' => { 94 => [\'dctermsLocation','dctermsLocationFootprintWKT'] },
+	'dcgeodeticdatum' => { 94 => [\'dctermsLocation','dctermsLocationGeodeticDatum'] },
+	'dcgeoreferencedby' => { 94 => [\'dctermsLocation','dctermsLocationGeoreferencedBy'] },
+	'dcgeoreferenceddate' => { 94 => [\'dctermsLocation','dctermsLocationGeoreferencedDate'] },
+	'dcgeoreferenceprotocol' => { 94 => [\'dctermsLocation','dctermsLocationGeoreferenceProtocol'] },
+	'dcgeoreferenceremarks' => { 94 => [\'dctermsLocation','dctermsLocationGeoreferenceRemarks'] },
+	'dcgeoreferencesources' => { 94 => [\'dctermsLocation','dctermsLocationGeoreferenceSources'] },
+	'dcgeoreferenceverificationstatus' => { 94 => [\'dctermsLocation','dctermsLocationGeoreferenceVerificationStatus'] },
+	'dchighergeography' => { 94 => [\'dctermsLocation','dctermsLocationHigherGeography'] },
+	'dchighergeographyid' => { 94 => [\'dctermsLocation','dctermsLocationHigherGeographyID'] },
+	'dcisland' => { 94 => [\'dctermsLocation','dctermsLocationIsland'] },
+	'dcislandgroup' => { 94 => [\'dctermsLocation','dctermsLocationIslandGroup'] },
+	'dclocality' => { 94 => [\'dctermsLocation','dctermsLocationLocality'] },
+	'dclocationaccordingto' => { 94 => [\'dctermsLocation','dctermsLocationLocationAccordingTo'] },
+	'dclocationid' => { 94 => [\'dctermsLocation','dctermsLocationLocationID'] },
+	'dclocationremarks' => { 94 => [\'dctermsLocation','dctermsLocationLocationRemarks'] },
+	'dcmaximumdepthinmeters' => { 94 => [\'dctermsLocation','dctermsLocationMaximumDepthInMeters'] },
+	'dcmaximumdistanceabovesurfaceinmeters' => { 94 => [\'dctermsLocation','dctermsLocationMaximumDistanceAboveSurfaceInMeters'] },
+	'dcmaximumelevationinmeters' => { 94 => [\'dctermsLocation','dctermsLocationMaximumElevationInMeters'] },
+	'dcminimumdepthinmeters' => { 94 => [\'dctermsLocation','dctermsLocationMinimumDepthInMeters'] },
+	'dcminimumdistanceabovesurfaceinmeters' => { 94 => [\'dctermsLocation','dctermsLocationMinimumDistanceAboveSurfaceInMeters'] },
+	'dcminimumelevationinmeters' => { 94 => [\'dctermsLocation','dctermsLocationMinimumElevationInMeters'] },
+	'dcmunicipality' => { 94 => [\'dctermsLocation','dctermsLocationMunicipality'] },
+	'dcpointradiusspatialfit' => { 94 => [\'dctermsLocation','dctermsLocationPointRadiusSpatialFit'] },
+	'dcstateprovince' => { 94 => [\'dctermsLocation','dctermsLocationStateProvince'] },
+	'dctermslocation' => { 94 => 'dctermsLocation' },
+	'dcverbatimcoordinates' => { 94 => [\'dctermsLocation','dctermsLocationVerbatimCoordinates'] },
+	'dcverbatimcoordinatesystem' => { 94 => [\'dctermsLocation','dctermsLocationVerbatimCoordinateSystem'] },
+	'dcverbatimdepth' => { 94 => [\'dctermsLocation','dctermsLocationVerbatimDepth'] },
+	'dcverbatimelevation' => { 94 => [\'dctermsLocation','dctermsLocationVerbatimElevation'] },
+	'dcverbatimlatitude' => { 94 => [\'dctermsLocation','dctermsLocationVerbatimLatitude'] },
+	'dcverbatimlocality' => { 94 => [\'dctermsLocation','dctermsLocationVerbatimLocality'] },
+	'dcverbatimlongitude' => { 94 => [\'dctermsLocation','dctermsLocationVerbatimLongitude'] },
+	'dcverbatimsrs' => { 94 => [\'dctermsLocation','dctermsLocationVerbatimSRS'] },
+	'dcwaterbody' => { 94 => [\'dctermsLocation','dctermsLocationWaterBody'] },
+	'declination' => { 134 => 'Declination' },
+	'decposition' => { 147 => 0x32 },
+	'defaultblackrender' => { 95 => 0xc7a6 },
+	'defaultcroporigin' => { 95 => 0xc61f },
+	'defaultcropsize' => { 95 => 0xc620 },
+	'defaulteraseoption' => { 68 => 0x813 },
+	'defaultscale' => { 95 => 0xc61e },
+	'defaultusercrop' => { 95 => 0xc7b5 },
+	'defringe' => { 366 => 'Defringe' },
+	'defringegreenamount' => { 366 => 'DefringeGreenAmount' },
+	'defringegreenhuehi' => { 366 => 'DefringeGreenHueHi' },
+	'defringegreenhuelo' => { 366 => 'DefringeGreenHueLo' },
+	'defringepurpleamount' => { 366 => 'DefringePurpleAmount' },
+	'defringepurplehuehi' => { 366 => 'DefringePurpleHueHi' },
+	'defringepurplehuelo' => { 366 => 'DefringePurpleHueLo' },
+	'deletedimagecount' => { 181 => 0xa6, 187 => 0x6e },
+	'deprecatedon' => { 364 => 'deprecatedOn' },
+	'derivedfrom' => { 390 => 'DerivedFrom' },
+	'derivedfromalternatepaths' => { 390 => [\'DerivedFrom','DerivedFromAlternatePaths'] },
+	'derivedfromdocumentid' => { 390 => [\'DerivedFrom','DerivedFromDocumentID'] },
+	'derivedfromfilepath' => { 390 => [\'DerivedFrom','DerivedFromFilePath'] },
+	'derivedfromfrompart' => { 390 => [\'DerivedFrom','DerivedFromFromPart'] },
+	'derivedfrominstanceid' => { 390 => [\'DerivedFrom','DerivedFromInstanceID'] },
+	'derivedfromlastmodifydate' => { 390 => [\'DerivedFrom','DerivedFromLastModifyDate'] },
+	'derivedfrommanager' => { 390 => [\'DerivedFrom','DerivedFromManager'] },
+	'derivedfrommanagervariant' => { 390 => [\'DerivedFrom','DerivedFromManagerVariant'] },
+	'derivedfrommanageto' => { 390 => [\'DerivedFrom','DerivedFromManageTo'] },
+	'derivedfrommanageui' => { 390 => [\'DerivedFrom','DerivedFromManageUI'] },
+	'derivedfrommaskmarkers' => { 390 => [\'DerivedFrom','DerivedFromMaskMarkers'] },
+	'derivedfromoriginaldocumentid' => { 390 => [\'DerivedFrom','DerivedFromOriginalDocumentID'] },
+	'derivedfrompartmapping' => { 390 => [\'DerivedFrom','DerivedFromPartMapping'] },
+	'derivedfromrenditionclass' => { 390 => [\'DerivedFrom','DerivedFromRenditionClass'] },
+	'derivedfromrenditionparams' => { 390 => [\'DerivedFrom','DerivedFromRenditionParams'] },
+	'derivedfromtopart' => { 390 => [\'DerivedFrom','DerivedFromToPart'] },
+	'derivedfromversionid' => { 390 => [\'DerivedFrom','DerivedFromVersionID'] },
+	'description' => { 242 => 'Description', 367 => 'description', 387 => 'Description' },
+	'destination' => { 104 => 0x5 },
+	'destinationcity' => { 281 => 0x24, 286 => 0x3 },
+	'destinationcitycode' => { 287 => 0x1001 },
+	'destinationdst' => { 281 => 0x26, 286 => '0.3' },
+	'developmentdynamicrange' => { 100 => 0x1403 },
+	'devicesettingdescription' => { 370 => 'DeviceSettingDescription' },
+	'devicesettingdescriptioncolumns' => { 370 => [\'DeviceSettingDescription','DeviceSettingDescriptionColumns'] },
+	'devicesettingdescriptionrows' => { 370 => [\'DeviceSettingDescription','DeviceSettingDescriptionRows'] },
+	'devicesettingdescriptionsettings' => { 370 => [\'DeviceSettingDescription','DeviceSettingDescriptionSettings'] },
+	'dialdirectiontvav' => { 68 => 0x706 },
+	'digitalcreationdate' => { 103 => 0x3e },
+	'digitalcreationtime' => { 103 => 0x3f },
+	'digitaldeehighlightadj' => { 186 => 0x202 },
+	'digitaldeeshadowadj' => { 186 => 0x200 },
+	'digitaldeethreshold' => { 186 => 0x201 },
+	'digitalfilter' => { 311 => 0x59 },
+	'digitalfilter01' => { 268 => 0x5 },
+	'digitalfilter02' => { 268 => 0x16 },
+	'digitalfilter03' => { 268 => 0x27 },
+	'digitalfilter04' => { 268 => 0x38 },
+	'digitalfilter05' => { 268 => 0x49 },
+	'digitalfilter06' => { 268 => 0x5a },
+	'digitalfilter07' => { 268 => 0x6b },
+	'digitalfilter08' => { 268 => 0x7c },
+	'digitalfilter09' => { 268 => 0x8d },
+	'digitalfilter10' => { 268 => 0x9e },
+	'digitalfilter11' => { 268 => 0xaf },
+	'digitalfilter12' => { 268 => 0xc0 },
+	'digitalfilter13' => { 268 => 0xd1 },
+	'digitalfilter14' => { 268 => 0xe2 },
+	'digitalfilter15' => { 268 => 0xf3 },
+	'digitalfilter16' => { 268 => 0x104 },
+	'digitalfilter17' => { 268 => 0x115 },
+	'digitalfilter18' => { 268 => 0x126 },
+	'digitalfilter19' => { 268 => 0x137 },
+	'digitalfilter20' => { 268 => 0x148 },
+	'digitalgain' => { 60 => 0xb },
+	'digitalgem' => { 173 => 0x0 },
+	'digitalice' => { 186 => 0x100 },
+	'digitalimageguid' => { 376 => 'DigImageGUID' },
+	'digitalroc' => { 185 => 0x0 },
+	'digitalsourcefiletype' => { 376 => 'DigitalSourcefileType' },
+	'digitalsourcetype' => { 376 => 'DigitalSourceType' },
+	'digitalzoom' => { 29 => 0xc, 90 => 0xa, 111 => 0x68, 125 => 'DigitalZoom', 147 => 0xc, 181 => 0x86, 204 => 0xa, 236 => 0x204, 281 => 0x1e, 287 => 0xa, 310 => 0x204, 342 => 0x12, 343 => 0x12 },
+	'digitalzoomon' => { 310 => 0x21b },
+	'digitalzoomratio' => { 95 => 0xa404, 336 => 0x200, 338 => 0x21c, 370 => 'DigitalZoomRatio' },
+	'director' => { 389 => 'director' },
+	'directorphotography' => { 389 => 'directorPhotography' },
+	'directory' => { 96 => 'Directory' },
+	'directoryindex' => { 5 => 0x137, 7 => 0x2dc, 9 => 0x17e, 11 => 0x238, 12 => 0x13f, 13 => 0x133, 14 => 0x1df, 15 => 0x1a7, 16 => 0x1f0, 17 => 0xcc, 18 => 0x1c7, 19 => 0x298, 20 => 0x1e7, 21 => 0x1e5, 22 => [0x27c,0x280], 23 => 0x2b6, 24 => 0x2bf, 25 => 0x1f7 },
+	'directoryindex2' => { 19 => 0x29c },
+	'directorynumber' => { 169 => 0x6 },
+	'disclaimer' => { 242 => 'Disclaimer' },
+	'discnumber' => { 389 => 'discNumber' },
+	'displayallafpoints' => { 68 => 0x514 },
+	'displayaperture' => { 29 => 0x23 },
+	'displayedunitsx' => { 293 => 0x2 },
+	'displayedunitsy' => { 293 => 0x6 },
+	'distance1' => { 111 => 0x28 },
+	'distance2' => { 111 => 0x2c },
+	'distance3' => { 111 => 0x30 },
+	'distance4' => { 111 => 0x34 },
+	'distortioncontrol' => { 187 => 0x10 },
+	'distortioncorrection' => { 87 => 0x67, 231 => 0x50b, 253 => '7.1', 271 => 0x0, 328 => 0x2013 },
+	'distortioncorrection2' => { 235 => 0x1011 },
+	'distortioncorrectionon' => { 87 => 0x63 },
+	'distortionn' => { 253 => 0xc },
+	'distortionparam02' => { 253 => 0x2 },
+	'distortionparam04' => { 253 => 0x4 },
+	'distortionparam08' => { 253 => 0x8 },
+	'distortionparam09' => { 253 => 0x9 },
+	'distortionparam11' => { 253 => 0xb },
+	'distortionscale' => { 253 => 0x5 },
+	'distributor' => { 380 => 'distributor' },
+	'dloon' => { 87 => 0xdc },
+	'dlosetting' => { 87 => 0xdd },
+	'dlosettingapplied' => { 87 => 0xe4 },
+	'dloshootingdistance' => { 87 => 0xde },
+	'dloversion' => { 87 => 0xe5 },
+	'dmcomment' => { 389 => 'comment' },
+	'dngadobedata' => { 95 => 0xc634 },
+	'dngbackwardversion' => { 95 => 0xc613 },
+	'dnglensinfo' => { 95 => 0xc630 },
+	'dngprivatedata' => { 95 => 0xc634 },
+	'dngversion' => { 95 => 0xc612 },
+	'document' => { 242 => 'Document' },
+	'documentancestorid' => { 378 => [\'DocumentAncestors','DocumentAncestorsAncestorID'] },
+	'documentancestors' => { 378 => 'DocumentAncestors' },
+	'documenthistory' => { 103 => 0xe7 },
+	'documentid' => { 390 => 'DocumentID' },
+	'documentname' => { 95 => 0x10d },
+	'documentnotes' => { 103 => 0xe6 },
+	'doi' => { 380 => 'doi' },
+	'dotrange' => { 95 => 0x150 },
+	'dpp' => { 361 => 'dpp' },
+	'drivemode' => { 91 => 0x3103, 147 => 0x6, 150 => 0x1e, 153 => 0xe, 231 => 0x600, 281 => 0x34, 303 => 0x1002, 311 => 0x3, 316 => 0x4, 317 => 0x7e, 318 => 0x34 },
+	'drivemode2' => { 150 => 0xa, 262 => 0x7, 327 => 0xe, 331 => 0x1 },
+	'drivemodesetting' => { 318 => 0x4 },
+	'dspfirmwareversion' => { 281 => 0x27 },
+	'duration' => { 54 => 0x6a, 124 => 'Duration', 138 => 'Duration', 389 => 'duration' },
+	'durationscale' => { 389 => [\'duration','durationScale'] },
+	'durationvalue' => { 389 => [\'duration','durationValue'] },
+	'dustremovaldata' => { 51 => 0x97 },
+	'dynamicafarea' => { 221 => '1.4', 226 => '1.4' },
+	'dynamicrange' => { 100 => 0x1400 },
+	'dynamicrangeexpansion' => { 281 => 0x69, 303 => 0x100e },
+	'dynamicrangemax' => { 86 => 0x7c },
+	'dynamicrangemin' => { 86 => 0x7a },
+	'dynamicrangeoptimizer' => { 150 => 0x15, 328 => [0xb025,0xb04f], 334 => 0x1144, 335 => 0x1144, 336 => 0x1120, 337 => 0x119c, 338 => 0x1178, 339 => 0x1030, 340 => 0x228 },
+	'dynamicrangeoptimizerbracket' => { 327 => 0x2e },
+	'dynamicrangeoptimizerlevel' => { 316 => 0x19, 317 => 0x17, 318 => 0xd, 331 => 0x5 },
+	'dynamicrangeoptimizermode' => { 153 => 0x15, 316 => 0x18, 317 => 0x16, 327 => 0x15 },
+	'dynamicrangeoptimizersetting' => { 150 => 0x27, 318 => 0xc, 331 => 0x4 },
+	'dynamicrangesetting' => { 100 => 0x1402 },
+	'e-dialinprogram' => { 262 => '1.3' },
+	'earliestageorloweststage' => { 94 => [\'GeologicalContext','GeologicalContextEarliestAgeOrLowestStage'] },
+	'earliesteonorlowesteonothem' => { 94 => [\'GeologicalContext','GeologicalContextEarliestEonOrLowestEonothem'] },
+	'earliestepochorlowestseries' => { 94 => [\'GeologicalContext','GeologicalContextEarliestEpochOrLowestSeries'] },
+	'earliesteraorlowesterathem' => { 94 => [\'GeologicalContext','GeologicalContextEarliestEraOrLowestErathem'] },
+	'earliestperiodorlowestsystem' => { 94 => [\'GeologicalContext','GeologicalContextEarliestPeriodOrLowestSystem'] },
+	'easyexposurecomp' => { 230 => '6.1' },
+	'easyexposurecompensation' => { 221 => '6.4', 226 => '4.4', 227 => '5.2' },
+	'easymode' => { 29 => 0xb },
+	'edgenoisereduction' => { 215 => 0x4, 352 => 0x8028 },
+	'edition' => { 380 => 'edition' },
+	'editorialupdate' => { 103 => 0x8 },
+	'editstatus' => { 103 => 0x7, 290 => 'EditStatus' },
+	'editversionname' => { 214 => 0x3d136244 },
+	'effectivelv' => { 281 => 0x2d },
+	'effectivemaxaperture' => { 177 => 0x12, 178 => 0x13 },
+	'eissn' => { 380 => 'eIssn' },
+	'elevation' => { 134 => 'Elevation' },
+	'email' => { 126 => 'EMail' },
+	'embargodate' => { 380 => 'embargoDate', 382 => 'embargoDate' },
+	'embeddedxmpdigest' => { 378 => 'EmbeddedXMPDigest' },
+	'emissivity' => { 97 => 0x3 },
+	'encryptionkey' => { 308 => 0xa020 },
+	'endingpage' => { 380 => 'endingPage' },
+	'enduser' => { 379 => 'EndUser' },
+	'enduserid' => { 379 => [\'EndUser','EndUserEndUserID'] },
+	'endusername' => { 379 => [\'EndUser','EndUserEndUserName'] },
+	'engineer' => { 389 => 'engineer' },
+	'enhancedarktones' => { 207 => 0x8 },
+	'enhancement' => { 90 => 0x16, 91 => 0x3016 },
+	'enhancer' => { 235 => 0x300 },
+	'enhancervalues' => { 235 => 0x301 },
+	'envelopenumber' => { 104 => 0x28 },
+	'envelopepriority' => { 104 => 0x3c },
+	'enveloperecordversion' => { 104 => 0x0 },
+	'epsonimageheight' => { 236 => 0x20c },
+	'epsonimagewidth' => { 236 => 0x20b },
+	'epsonsoftware' => { 236 => 0x20d },
+	'equipmentinstitution' => { 354 => 'EquipmentInstitution' },
+	'equipmentmanufacturer' => { 354 => 'EquipmentManufacturer' },
+	'equipmentversion' => { 232 => 0x0 },
+	'ettlii' => { 68 => 0x304, 69 => 0xd, 70 => 0xe, 71 => 0x7, 72 => 0x7, 73 => 0xe },
+	'event' => { 355 => 'Event', 359 => 'Event', 376 => 'Event', 380 => 'event' },
+	'eventday' => { 94 => [\'Event','EventDay'] },
+	'eventearliestdate' => { 94 => [\'Event','EventEarliestDate'] },
+	'eventenddayofyear' => { 94 => [\'Event','EventEndDayOfYear'] },
+	'eventfieldnotes' => { 94 => [\'Event','EventFieldNotes'] },
+	'eventfieldnumber' => { 94 => [\'Event','EventFieldNumber'] },
+	'eventhabitat' => { 94 => [\'Event','EventHabitat'] },
+	'eventid' => { 94 => [\'Event','EventEventID'] },
+	'eventlatestdate' => { 94 => [\'Event','EventLatestDate'] },
+	'eventmonth' => { 94 => [\'Event','EventMonth'] },
+	'eventnumber' => { 299 => 0x9 },
+	'eventremarks' => { 94 => [\'Event','EventEventRemarks'] },
+	'eventsamplingeffort' => { 94 => [\'Event','EventSamplingEffort'] },
+	'eventsamplingprotocol' => { 94 => [\'Event','EventSamplingProtocol'] },
+	'eventstartdayofyear' => { 94 => [\'Event','EventStartDayOfYear'] },
+	'eventtime' => { 94 => [\'Event','EventEventTime'] },
+	'eventverbatimeventdate' => { 94 => [\'Event','EventVerbatimEventDate'] },
+	'eventyear' => { 94 => [\'Event','EventYear'] },
+	'evsteps' => { 262 => '1.2', 264 => 0x0 },
+	'evstepsize' => { 223 => '5.1', 224 => '6.1', 225 => '6.1', 228 => '0.7' },
+	'exclusivityenddate' => { 382 => 'exclusivityEndDate' },
+	'excursiontolerance' => { 105 => 0x82 },
+	'exif' => { 96 => 'EXIF' },
+	'exifbyteorder' => { 96 => 'ExifByteOrder' },
+	'exifcamerainfo' => { 103 => 0xe8 },
+	'exifimageheight' => { 95 => 0xa003, 370 => 'PixelYDimension' },
+	'exifimagewidth' => { 95 => 0xa002, 370 => 'PixelXDimension' },
+	'exifunicodebyteorder' => { 96 => 'ExifUnicodeByteOrder' },
+	'exifversion' => { 95 => 0x9000, 370 => 'ExifVersion' },
+	'exitpupilposition' => { 177 => 0x4, 178 => 0x4 },
+	'expirationdate' => { 103 => 0x25, 380 => 'expirationDate', 382 => 'expirationDate' },
+	'expirationtime' => { 103 => 0x26 },
+	'exposure' => { 95 => 0xfe51, 366 => 'Exposure' },
+	'exposure2012' => { 366 => 'Exposure2012' },
+	'exposureadj' => { 212 => 0x0 },
+	'exposureadj2' => { 212 => 0x12 },
+	'exposureadjust' => { 311 => 0xc },
+	'exposurebracketingindicatorlast' => { 150 => 0x52 },
+	'exposurebracketshotnumber' => { 153 => 0x2d, 327 => 0x2f },
+	'exposurebracketstepsize' => { 262 => 0x8 },
+	'exposurebracketvalue' => { 181 => 0x19 },
+	'exposurecompensation' => { 62 => 0x6, 77 => 0x0, 95 => 0x9204, 111 => 0x24, 125 => 'ExposureComp', 147 => 0xd, 148 => 0x53, 149 => 0x1e, 153 => 0x49c0, 236 => 0x1006, 281 => 0x16, 308 => 0xa013, 311 => [0xc,0x35,0x4d], 334 => 0x114c, 335 => 0x114c, 336 => 0x1128, 338 => 0x1180, 339 => 0x1038, 340 => 0x230, 370 => 'ExposureBiasValue' },
+	'exposurecompensation2' => { 331 => 0x2a },
+	'exposurecompensationmode' => { 150 => 0x47, 153 => 0x2a },
+	'exposurecompensationset' => { 318 => 0x3, 331 => 0x1e },
+	'exposurecompensationsetting' => { 150 => 0x1 },
+	'exposurecompstepsize' => { 221 => '6.3', 226 => '4.3' },
+	'exposurecontrolstep' => { 227 => '6.1' },
+	'exposurecontrolstepsize' => { 221 => '6.2', 226 => '4.2', 230 => '7.1' },
+	'exposurecount' => { 100 => 0x1032 },
+	'exposuredelaymode' => { 221 => '10.1', 223 => '9.1', 224 => '10.1', 225 => '10.1', 226 => '10.4', 227 => '10.1', 228 => '6.4', 230 => '11.2' },
+	'exposuredifference' => { 181 => 0xe },
+	'exposureindex' => { 95 => 0xa215, 370 => 'ExposureIndex' },
+	'exposureindicator' => { 150 => 0x50 },
+	'exposurelevelincrements' => { 66 => 0x6, 67 => 0x6, 68 => 0x101, 69 => 0x5, 70 => 0x6, 71 => 0x5, 72 => 0x5, 73 => 0x6, 74 => 0x4, 316 => 0x58, 317 => 0x58 },
+	'exposurelockused' => { 356 => 'ExposureLockUsed' },
+	'exposuremode' => { 95 => 0xa402, 125 => 'ExposureMode', 147 => 0x1, 148 => 0xa, 149 => 0x0, 150 => 0x0, 153 => 0x34, 231 => 0x200, 248 => 0x40d, 311 => 0x8, 328 => 0xb041, 370 => 'ExposureMode' },
+	'exposuremodeinmanual' => { 68 => 0x10b },
+	'exposureprogram' => { 95 => 0x8822, 303 => 0x1001, 312 => 0x17e, 316 => 0x3c, 317 => 0x3c, 318 => 0x5, 322 => 0x14, 327 => 0x3f, 331 => 0x2, 334 => 0x1175, 335 => 0x1179, 336 => 0x1155, 337 => 0x11d1, 338 => 0x11ad, 339 => 0x1065, 340 => 0x25d, 348 => 0x48, 370 => 'ExposureProgram' },
+	'exposureshift' => { 231 => 0x203 },
+	'exposuretime' => { 5 => 0x4, 6 => 0x4, 7 => 0x4, 8 => 0x4, 9 => 0x4, 10 => 0x4, 11 => 0x4, 12 => 0x4, 13 => 0x4, 14 => 0x4, 15 => 0x4, 16 => 0x4, 17 => 0x4, 18 => 0x4, 19 => 0x4, 20 => 0x4, 21 => 0x4, 22 => 0x4, 23 => 0x4, 24 => 0x4, 25 => 0x4, 26 => 0x6, 27 => 0x7, 62 => 0x16, 95 => 0x829a, 108 => 0xfd05, 111 => 0x20, 113 => 0xfa24, 115 => 0xf104, 118 => 0x12, 120 => 0x38, 123 => 0x10, 125 => 'ExposureTime', 147 => 0x9, 148 => 0x35, 149 => 0x48, 150 => 0x8, 153 => 0x49b8, 281 => 0x12, 308 => 0xa018, 311 => [0x32,0x4a], 316 => 0x0, 317 => 0x0, 331 => 0x27, 348 => 0x10, 370 => 'ExposureTime' },
+	'exposuretime2' => { 311 => [0x33,0x4b] },
+	'exposuretuning' => { 181 => 0x1c },
+	'exposurevalue' => { 109 => 0x3 },
+	'exposurewarning' => { 100 => 0x1302 },
+	'exrauto' => { 100 => 0x1033 },
+	'exrmode' => { 100 => 0x1034 },
+	'extendedwbdetect' => { 231 => 0x902 },
+	'extender' => { 232 => 0x301 },
+	'extenderfirmwareversion' => { 232 => 0x304 },
+	'extendermagnification' => { 127 => 'Magnification' },
+	'extendermake' => { 127 => 'Make' },
+	'extendermodel' => { 127 => 'Model', 232 => 0x303 },
+	'extenderserialnumber' => { 127 => 'SerialNumber', 232 => 0x302 },
+	'externalflash' => { 234 => 0x1201 },
+	'externalflashae1' => { 236 => 0x101f },
+	'externalflashae1_0' => { 236 => 0x101b },
+	'externalflashae2' => { 236 => 0x1020 },
+	'externalflashae2_0' => { 236 => 0x101c },
+	'externalflashbounce' => { 234 => 0x1204, 236 => 0x1026, 269 => 0x1a },
+	'externalflashcompensation' => { 172 => 0x1b },
+	'externalflashexposurecomp' => { 181 => 0x17, 269 => 0x19 },
+	'externalflashfirmware' => { 170 => 0x6, 171 => 0x6, 172 => 0x6 },
+	'externalflashflags' => { 170 => 0x8, 171 => 0x8, 172 => 0x8 },
+	'externalflashguidenumber' => { 234 => 0x1203, 269 => '24.1' },
+	'externalflashgvalue' => { 236 => 0x1025 },
+	'externalflashmode' => { 236 => 0x1028, 269 => 0x2 },
+	'externalflashzoom' => { 234 => 0x1205, 236 => 0x1027 },
+	'externalsensorbrightnessvalue' => { 246 => 0x311, 252 => 0x3408 },
+	'extrainfoversion' => { 320 => 0x1a },
+	'eyestartaf' => { 150 => 0x40 },
+	'face10position' => { 88 => 0x3f4, 89 => 0x1ec, 168 => 0x28, 266 => 0x12 },
+	'face10size' => { 267 => 0x12 },
+	'face11position' => { 168 => 0x2c, 266 => 0x14 },
+	'face11size' => { 267 => 0x14 },
+	'face12position' => { 168 => 0x30, 266 => 0x16 },
+	'face12size' => { 267 => 0x16 },
+	'face13position' => { 266 => 0x18 },
+	'face13size' => { 267 => 0x18 },
+	'face14position' => { 266 => 0x1a },
+	'face14size' => { 267 => 0x1a },
+	'face15position' => { 266 => 0x1c },
+	'face15size' => { 267 => 0x1c },
+	'face16position' => { 266 => 0x1e },
+	'face16size' => { 267 => 0x1e },
+	'face17position' => { 266 => 0x20 },
+	'face17size' => { 267 => 0x20 },
+	'face18position' => { 266 => 0x22 },
+	'face18size' => { 267 => 0x22 },
+	'face19position' => { 266 => 0x24 },
+	'face19size' => { 267 => 0x24 },
+	'face1position' => { 43 => 0x8, 88 => 0xd, 89 => 0x18, 168 => 0x4, 244 => 0x1, 266 => 0x0, 300 => 0xbc, 323 => 0x1, 324 => 0x0, 325 => 0x0, 326 => 0x5b },
+	'face1size' => { 267 => 0x0 },
+	'face20position' => { 266 => 0x26 },
+	'face20size' => { 267 => 0x26 },
+	'face21position' => { 266 => 0x28 },
+	'face21size' => { 267 => 0x28 },
+	'face22position' => { 266 => 0x2a },
+	'face22size' => { 267 => 0x2a },
+	'face23position' => { 266 => 0x2c },
+	'face23size' => { 267 => 0x2c },
+	'face24position' => { 266 => 0x2e },
+	'face24size' => { 267 => 0x2e },
+	'face25position' => { 266 => 0x30 },
+	'face25size' => { 267 => 0x30 },
+	'face26position' => { 266 => 0x32 },
+	'face26size' => { 267 => 0x32 },
+	'face27position' => { 266 => 0x34 },
+	'face27size' => { 267 => 0x34 },
+	'face28position' => { 266 => 0x36 },
+	'face28size' => { 267 => 0x36 },
+	'face29position' => { 266 => 0x38 },
+	'face29size' => { 267 => 0x38 },
+	'face2position' => { 43 => 0xa, 88 => 0x7c, 89 => 0x4c, 168 => 0x8, 244 => 0x5, 266 => 0x2, 300 => 0xc8, 323 => 0x6, 324 => 0x20, 325 => 0x25, 326 => 0x65 },
+	'face2size' => { 267 => 0x2 },
+	'face30position' => { 266 => 0x3a },
+	'face30size' => { 267 => 0x3a },
+	'face31position' => { 266 => 0x3c },
+	'face31size' => { 267 => 0x3c },
+	'face32position' => { 266 => 0x3e },
+	'face32size' => { 267 => 0x3e },
+	'face3position' => { 43 => 0xc, 88 => 0xeb, 89 => 0x80, 168 => 0xc, 244 => 0x9, 266 => 0x4, 300 => 0xd4, 323 => 0xb, 324 => 0x40, 325 => 0x4a, 326 => 0x6f },
+	'face3size' => { 267 => 0x4 },
+	'face4position' => { 43 => 0xe, 88 => 0x15a, 89 => 0xb4, 168 => 0x10, 244 => 0xd, 266 => 0x6, 300 => 0xe0, 323 => 0x10, 324 => 0x60, 325 => 0x6f, 326 => 0x79 },
+	'face4size' => { 267 => 0x6 },
+	'face5position' => { 43 => 0x10, 88 => 0x1c9, 89 => 0xe8, 168 => 0x14, 244 => 0x11, 266 => 0x8, 300 => 0xec, 323 => 0x15, 324 => 0x80, 325 => 0x94 },
+	'face5size' => { 267 => 0x8 },
+	'face6position' => { 43 => 0x12, 88 => 0x238, 89 => 0x11c, 168 => 0x18, 266 => 0xa, 300 => 0xf8, 323 => 0x1a, 324 => 0xa0, 325 => 0xb9 },
+	'face6size' => { 267 => 0xa },
+	'face7position' => { 43 => 0x14, 88 => 0x2a7, 89 => 0x150, 168 => 0x1c, 266 => 0xc, 300 => 0x104, 323 => 0x1f, 324 => 0xc0, 325 => 0xde },
+	'face7size' => { 267 => 0xc },
+	'face8position' => { 43 => 0x16, 88 => 0x316, 89 => 0x184, 168 => 0x20, 266 => 0xe, 300 => 0x110, 323 => 0x24, 324 => 0xe0, 325 => 0x103 },
+	'face8size' => { 267 => 0xe },
+	'face9position' => { 43 => 0x18, 88 => 0x385, 89 => 0x1b8, 168 => 0x24, 266 => 0x10 },
+	'face9size' => { 267 => 0x10 },
+	'facedetect' => { 281 => 0x76 },
+	'facedetectarea' => { 235 => 0x1201 },
+	'facedetectframecrop' => { 235 => 0x1207 },
+	'facedetectframesize' => { 43 => 0x3, 88 => 0x1, 89 => 0x4, 168 => 0x1, 235 => 0x1203, 281 => 0x77, 300 => 0xb6 },
+	'facedetection' => { 318 => 0x30, 331 => 0x19 },
+	'faceid' => { 362 => 'FaceID' },
+	'faceinfounknown' => { 91 => 0x2089 },
+	'faceorientation' => { 89 => 0x8 },
+	'faceposition' => { 265 => 0x2, 309 => 0x4 },
+	'facepositions' => { 100 => 0x4103 },
+	'facesdetected' => { 43 => 0x2, 44 => 0x2, 45 => 0x3, 88 => 0x0, 89 => 0x2, 91 => 0x211c, 100 => 0x4100, 168 => 0x3, 235 => 0x1200, 250 => 0x3f, 265 => 0x0, 300 => 0xb5, 309 => 0x0, 323 => 0x0, 326 => 0x3, 333 => 0x30 },
+	'facesrecognized' => { 245 => 0x0 },
+	'facewidth' => { 44 => 0x1 },
+	'faithfuloutputhighlightpoint' => { 87 => 0x38 },
+	'faithfuloutputshadowpoint' => { 87 => 0x39 },
+	'faithfulrawcolortone' => { 87 => 0x31 },
+	'faithfulrawcontrast' => { 87 => 0x33 },
+	'faithfulrawhighlight' => { 87 => 0x79 },
+	'faithfulrawhighlightpoint' => { 87 => 0x36 },
+	'faithfulrawlinear' => { 87 => 0x34 },
+	'faithfulrawsaturation' => { 87 => 0x32 },
+	'faithfulrawshadow' => { 87 => 0x82 },
+	'faithfulrawshadowpoint' => { 87 => 0x37 },
+	'faithfulrawsharpness' => { 87 => 0x35 },
+	'faithfulunsharpmaskfineness' => { 87 => 0xac },
+	'faithfulunsharpmaskstrength' => { 87 => 0xaa },
+	'faithfulunsharpmaskthreshold' => { 87 => 0xae },
+	'femicroadjustment' => { 68 => 0x110 },
+	'ffid' => { 368 => 'ffid' },
+	'fieldcount' => { 236 => 0x103f },
+	'filecreatedate' => { 96 => 'FileCreateDate' },
+	'filedatarate' => { 389 => 'fileDataRate' },
+	'fileformat' => { 79 => 0x0, 104 => 0x14, 311 => [0x22,0x26], 328 => 0xb000 },
+	'fileindex' => { 5 => 0x143, 7 => 0x2d0, 9 => 0x172, 11 => 0x22c, 12 => 0x133, 13 => 0x13f, 14 => 0x1d3, 15 => 0x19b, 16 => 0x1e4, 17 => 0xd0, 18 => 0x1bb, 19 => 0x28c, 20 => 0x1db, 21 => 0x1d9, 22 => [0x270,0x274], 23 => 0x2aa, 24 => 0x2b3, 25 => 0x1eb, 251 => 0x0 },
+	'fileindex2' => { 19 => 0x290 },
+	'filemodifydate' => { 96 => 'FileModifyDate' },
+	'filename' => { 96 => 'FileName' },
+	'filenameasdelivered' => { 379 => 'FileNameAsDelivered' },
+	'filenumber' => { 46 => 0x1, 51 => 0x8, 81 => 0x1817, 92 => 'FileNumber', 169 => 0x8 },
+	'filenumbermemory' => { 147 => 0x1a },
+	'filenumbersequence' => { 221 => '12.2', 223 => '3.1', 224 => '4.1', 225 => '4.1', 226 => '11.1', 227 => '4.3', 230 => '5.2' },
+	'filesource' => { 95 => 0xa300, 100 => 0x8000, 370 => 'FileSource' },
+	'fileversion' => { 104 => 0x16 },
+	'fillflashautoreduction' => { 66 => 0xe, 67 => 0xe, 74 => 0xa },
+	'filllight' => { 366 => 'FillLight' },
+	'fillorder' => { 95 => 0x10a },
+	'filmmode' => { 100 => 0x1401, 248 => 0x412, 250 => 0x42 },
+	'filmtype' => { 186 => 0x2 },
+	'filtereffect' => { 46 => 0xe, 183 => 0x37 },
+	'filtereffectauto' => { 57 => 0xa0 },
+	'filtereffectfaithful' => { 56 => 0x70, 57 => 0x70 },
+	'filtereffectlandscape' => { 56 => 0x40, 57 => 0x40 },
+	'filtereffectmonochrome' => { 17 => 0xff, 56 => 0x88, 57 => 0x88 },
+	'filtereffectneutral' => { 56 => 0x58, 57 => 0x58 },
+	'filtereffectportrait' => { 56 => 0x28, 57 => 0x28 },
+	'filtereffectstandard' => { 56 => 0x10, 57 => 0x10 },
+	'filtereffectuserdef1' => { 56 => 0xa0, 57 => 0xb8 },
+	'filtereffectuserdef2' => { 56 => 0xb8, 57 => 0xd0 },
+	'filtereffectuserdef3' => { 56 => 0xd0, 57 => 0xe8 },
+	'finderdisplayduringexposure' => { 67 => 0x1 },
+	'finesharpness' => { 281 => 0x70 },
+	'finetuneoptcenterweighted' => { 221 => '7.2', 230 => '9.1' },
+	'finetuneoptmatrixmetering' => { 221 => '8.1', 226 => '6.1', 230 => '8.2' },
+	'finetuneoptspotmetering' => { 221 => '8.2', 226 => '6.2', 230 => '9.2' },
+	'firmware' => { 236 => 0x405, 311 => [0x17,0x3b,0x57], 363 => 'Firmware' },
+	'firmwaredate' => { 90 => 0x15, 91 => 0x2001, 299 => 0x4 },
+	'firmwareid' => { 154 => 0x0 },
+	'firmwarename' => { 308 => 0xa001 },
+	'firmwarerevision' => { 17 => 0xa4, 51 => 0x1e, 301 => 0x0 },
+	'firmwarerevision2' => { 301 => 0xc },
+	'firmwareversion' => { 5 => 0x10b, 9 => 0x136, 12 => 0xff, 13 => 0x107, 109 => 0xce5, 123 => 0x57, 125 => 'FirmwareVersion', 250 => 0x2, 252 => 0x3109, 281 => 0x230, 303 => 0x2 },
+	'firstphotodate' => { 356 => 'FirstPhotoDate' },
+	'firstpublicationdate' => { 379 => 'FirstPublicationDate' },
+	'fixtureidentifier' => { 103 => 0x16 },
+	'flash' => { 92 => 'Flash', 95 => 0x9209, 148 => 0x1f, 149 => 0x15, 370 => 'Flash' },
+	'flashaction' => { 318 => [0x87,0x287] },
+	'flashaction2' => { 331 => 0x30 },
+	'flashactivity' => { 29 => 0x1c },
+	'flashbatterylevel' => { 35 => 0x249 },
+	'flashbias' => { 250 => 0x24 },
+	'flashbits' => { 29 => 0x1d },
+	'flashbuttonfunction' => { 68 => 0x70e },
+	'flashchargelevel' => { 236 => 0x1010 },
+	'flashcolorfilter' => { 172 => 0x10 },
+	'flashcommandermode' => { 170 => '9.1', 171 => '9.1', 172 => '9.1' },
+	'flashcompensation' => { 170 => 0xa, 171 => 0xa, 172 => 0xa, 363 => 'FlashCompensation' },
+	'flashcontrol' => { 318 => 0x21 },
+	'flashcontrolbuilt-in' => { 226 => '16.1', 227 => '23.1', 229 => '23.1' },
+	'flashcontrolmode' => { 170 => '9.2', 171 => '9.2', 172 => '9.2', 231 => 0x404 },
+	'flashcurtain' => { 250 => 0x48 },
+	'flashdefault' => { 150 => 0x42 },
+	'flashdevice' => { 236 => 0x1005 },
+	'flashdistance' => { 91 => 0x2034 },
+	'flashenergy' => { 95 => 0xa20b, 370 => 'FlashEnergy' },
+	'flashexposurebracketvalue' => { 181 => 0x18 },
+	'flashexposurecomp' => { 62 => 0xf, 100 => 0x1011, 128 => 'ExposureComp', 147 => 0x23, 152 => 0x104, 153 => 0x49c1, 181 => 0x12, 231 => 0x401, 236 => 0x1023, 281 => 0x4d, 303 => 0x100b, 311 => [0x3a,0x56], 328 => 0x104 },
+	'flashexposurecomp2' => { 202 => 0x4d2 },
+	'flashexposurecomp3' => { 172 => 0x1d },
+	'flashexposurecomp4' => { 172 => 0x27 },
+	'flashexposurecompset' => { 150 => 0x10, 255 => 0xe, 318 => 0x23, 331 => 0x1f },
+	'flashexposurecompset2' => { 331 => 0x2c },
+	'flashexposureindicator' => { 150 => 0x54 },
+	'flashexposureindicatorlast' => { 150 => 0x56 },
+	'flashexposureindicatornext' => { 150 => 0x55 },
+	'flashexposurelock' => { 46 => 0x19 },
+	'flashfired' => { 111 => 0x5d, 128 => 'Fired', 147 => 0x14, 201 => '590.3', 250 => 0x8007, 370 => [\'Flash','FlashFired'] },
+	'flashfiring' => { 68 => 0x306, 69 => 0x6, 70 => 0x7, 73 => 0x7 },
+	'flashfirmwareversion' => { 232 => 0x1002 },
+	'flashfocallength' => { 170 => 0xb, 171 => 0xc, 172 => 0xc },
+	'flashfunction' => { 153 => 0x31, 370 => [\'Flash','FlashFunction'] },
+	'flashgndistance' => { 170 => 0xe, 171 => 0xf, 172 => 0xf },
+	'flashgroupacompensation' => { 170 => 0x11, 171 => 0x12, 172 => 0x13 },
+	'flashgroupacontrolmode' => { 170 => 0xf, 171 => '16.1', 172 => '17.1' },
+	'flashgroupaoutput' => { 170 => 0x11, 171 => 0x12, 172 => 0x13 },
+	'flashgroupbcompensation' => { 170 => 0x12, 171 => 0x13, 172 => 0x14 },
+	'flashgroupbcontrolmode' => { 170 => 0x10, 171 => '17.1', 172 => '18.1' },
+	'flashgroupboutput' => { 170 => 0x12, 171 => 0x13, 172 => 0x14 },
+	'flashgroupccompensation' => { 171 => 0x14, 172 => 0x15 },
+	'flashgroupccontrolmode' => { 171 => '17.2', 172 => '18.2' },
+	'flashgroupcoutput' => { 171 => 0x14, 172 => 0x15 },
+	'flashguidenumber' => { 62 => 0xd, 78 => 0x0, 128 => 'GuideNumber' },
+	'flashintensity' => { 90 => [0x19,0x5], 231 => 0x405 },
+	'flashlevel' => { 222 => 0x9, 328 => 0xb048 },
+	'flashmake' => { 128 => 'Make' },
+	'flashmanufacturer' => { 145 => 'FlashManufacturer' },
+	'flashmetering' => { 147 => 0x3f, 150 => 0x1c },
+	'flashmeteringmode' => { 5 => 0x15, 11 => 0x15, 12 => 0x15, 13 => 0x15, 14 => 0x15, 15 => 0x15, 16 => 0x15, 18 => 0x15, 20 => 0x15, 25 => 0x15 },
+	'flashmeteringsegments' => { 281 => 0x20a },
+	'flashmode' => { 90 => 0x4, 111 => 0x5c, 128 => 'Mode', 147 => 0x2, 148 => 0x20, 149 => 0x16, 150 => 0xf, 181 => 0x87, 231 => 0x400, 236 => 0x1004, 281 => 0xc, 287 => 0x4, 302 => 0x20, 303 => 0x100a, 310 => 0x225, 316 => 0x23, 317 => 0x1f, 318 => 0x20, 331 => 0x10, 370 => [\'Flash','FlashMode'] },
+	'flashmodel' => { 128 => 'Model', 145 => 'FlashModel', 232 => 0x1001 },
+	'flashoptions' => { 262 => 0x2 },
+	'flashoptions2' => { 262 => 0x10 },
+	'flashoutput' => { 35 => 0x248, 62 => 0x21, 170 => 0xa, 171 => 0xa, 172 => 0xa },
+	'flashpixversion' => { 95 => 0xa000, 370 => 'FlashpixVersion' },
+	'flashredeyemode' => { 370 => [\'Flash','FlashRedEyeMode'] },
+	'flashremotecontrol' => { 231 => 0x403 },
+	'flashreturn' => { 370 => [\'Flash','FlashReturn'] },
+	'flashserialnumber' => { 128 => 'SerialNumber', 232 => 0x1003 },
+	'flashsetting' => { 181 => 0x8 },
+	'flashshutterspeed' => { 221 => '20.2', 226 => '15.2', 227 => '22.2', 228 => '7.2', 229 => '22.2', 230 => '23.1' },
+	'flashsource' => { 170 => 0x4, 171 => 0x4, 172 => 0x4 },
+	'flashstatus' => { 269 => 0x0, 341 => 0x31 },
+	'flashsyncspeed' => { 221 => '20.1', 226 => '15.1', 227 => '22.1', 229 => '22.1' },
+	'flashsyncspeedav' => { 66 => 0x3, 68 => 0x10f, 69 => 0x2, 70 => 0x3, 71 => 0x2, 72 => 0x2, 73 => 0x3, 74 => 0x6 },
+	'flashthreshold' => { 78 => 0x1 },
+	'flashtype' => { 128 => 'Type', 150 => 0x59, 181 => 0x9, 232 => 0x1000 },
+	'flashwarning' => { 227 => '30.1', 228 => '7.1', 230 => '31.1', 250 => 0x62 },
+	'flexiblespotposition' => { 328 => 0x201d },
+	'flickerreduce' => { 310 => 0x218 },
+	'fliphorizontal' => { 214 => 0x76a43206 },
+	'fnumber' => { 5 => 0x3, 7 => 0x3, 9 => 0x3, 11 => 0x3, 12 => 0x3, 13 => 0x3, 14 => 0x3, 15 => 0x3, 16 => 0x3, 17 => 0x3, 18 => 0x3, 19 => 0x3, 20 => 0x3, 21 => 0x3, 22 => 0x3, 23 => 0x3, 24 => 0x3, 25 => 0x3, 26 => 0x5, 27 => 0x6, 62 => 0x15, 95 => 0x829d, 108 => 0xfd04, 111 => 0x1e, 113 => 0xfa23, 115 => 0xf103, 118 => 0x13, 120 => 0x3c, 123 => 0xc, 132 => 'FNumber', 147 => 0xa, 148 => 0x36, 149 => 0x47, 150 => 0x9, 153 => 0x49c7, 281 => 0x13, 308 => 0xa019, 311 => [0x31,0x49], 316 => 0x1, 317 => 0x1, 331 => 0x26, 370 => 'FNumber' },
+	'focallength' => { 5 => 0x1d, 6 => 0xa, 7 => 0x23, 8 => 0x9, 9 => 0x1d, 10 => 0x9, 11 => 0x1e, 12 => 0x1d, 13 => 0x1d, 14 => 0x1e, 15 => 0x1e, 16 => 0x1e, 17 => 0x28, 18 => 0x1e, 19 => 0x23, 20 => 0x1e, 21 => 0x1e, 22 => 0x23, 23 => 0x23, 24 => 0x23, 25 => 0x1e, 48 => 0x1, 91 => 0x1d, 95 => 0x920a, 118 => 0x1d, 132 => 'FocalLength', 147 => 0x12, 177 => 0xa, 178 => 0xb, 272 => 0x9, 281 => 0x1d, 303 => 0x1500, 314 => 0xe, 338 => 0x1278, 339 => 0x1134, 340 => 0x32c, 370 => 'FocalLength' },
+	'focallength2' => { 331 => 0x29 },
+	'focallengthin35mmformat' => { 95 => 0xa405, 308 => 0xa01a, 370 => 'FocalLengthIn35mmFilm' },
+	'focallengthtelezoom' => { 314 => 0x10 },
+	'focalplanediagonal' => { 232 => 0x103, 236 => 0x205 },
+	'focalplaneresolutionunit' => { 95 => 0xa210, 370 => 'FocalPlaneResolutionUnit' },
+	'focalplanexresolution' => { 95 => 0xa20e, 370 => 'FocalPlaneXResolution' },
+	'focalplanexsize' => { 48 => 0x2 },
+	'focalplanexunknown' => { 48 => 0x2 },
+	'focalplaneyresolution' => { 95 => 0xa20f, 370 => 'FocalPlaneYResolution' },
+	'focalplaneysize' => { 48 => 0x3 },
+	'focalplaneyunknown' => { 48 => 0x3 },
+	'focaltype' => { 8 => 0x2d, 48 => 0x0 },
+	'focalunits' => { 29 => 0x19 },
+	'focus' => { 204 => 0x8 },
+	'focusarea' => { 147 => 0x31 },
+	'focusareaselection' => { 228 => '15.2' },
+	'focuscontinuous' => { 29 => 0x20 },
+	'focusdisplayaiservoandmf' => { 68 => 0x515 },
+	'focusdistance' => { 132 => 'FocusDistance', 147 => 0x13, 153 => 0x49bb, 177 => 0x9, 178 => 0xa, 234 => 0x305 },
+	'focusdistancelower' => { 5 => 0x45, 7 => 0x8e, 9 => 0x45, 11 => 0x56, 12 => 0x45, 13 => 0x45, 14 => 0x52, 15 => 0x52, 16 => 0x56, 18 => 0x52, 19 => 0x8e, 20 => 0x59, 21 => 0x57, 22 => 0x8e, 23 => 0x94, 24 => 0x95, 25 => 0x56, 62 => 0x14 },
+	'focusdistanceupper' => { 5 => 0x43, 7 => 0x8c, 9 => 0x43, 11 => 0x54, 12 => 0x43, 13 => 0x43, 14 => 0x50, 15 => 0x50, 16 => 0x54, 18 => 0x50, 19 => 0x8c, 20 => 0x57, 21 => 0x55, 22 => 0x8c, 23 => 0x92, 24 => 0x93, 25 => 0x54, 62 => 0x13 },
+	'focusholdbutton' => { 150 => 0x44 },
+	'focusinfoversion' => { 234 => 0x0 },
+	'focusingscreen' => { 67 => 0x0, 68 => 0x80b, 73 => 0x0 },
+	'focuslocked' => { 146 => 0x14 },
+	'focusmode' => { 29 => 0x7, 90 => 0x3, 91 => [0x3003,0xd], 100 => 0x1021, 111 => 0x38, 125 => 'FocusMode', 147 => 0x30, 149 => 0xe, 150 => 0xc, 181 => 0x7, 231 => 0x301, 236 => 0x100b, 250 => 0x7, 281 => 0xd, 287 => 0x3, 303 => 0x1006, 312 => 0xb, 314 => [0x15,0x1d], 316 => 0x4d, 317 => 0x4d, 328 => [0xb042,0xb04e,0x201b], 331 => 0x13, 345 => 0x16 },
+	'focusmode2' => { 262 => '3.1', 331 => 0x32 },
+	'focusmodesetting' => { 222 => '10.1', 315 => 0x14, 316 => 0x10, 317 => 0xf, 318 => 0x6 },
+	'focusmodeswitch' => { 150 => 0x58, 316 => 0x2e },
+	'focuspixel' => { 100 => 0x1023 },
+	'focuspointwrap' => { 221 => '2.2', 226 => '2.2', 227 => '1.2', 230 => '2.5' },
+	'focusposition' => { 177 => 0x8, 178 => 0x8, 281 => 0x10, 327 => 0x9bb },
+	'focusprocess' => { 231 => 0x302 },
+	'focusrange' => { 29 => 0x12, 236 => 0x100a },
+	'focussetting' => { 311 => 0x6 },
+	'focusstatus' => { 314 => 0x19, 316 => 0x53, 317 => 0x53 },
+	'focusstepcount' => { 234 => 0x301, 236 => 0x100e },
+	'focusstepinfinity' => { 234 => 0x303, 236 => 0x103b },
+	'focusstepnear' => { 234 => 0x304, 236 => 0x103c },
+	'focustrackinglockon' => { 221 => ['1.5','4.1'], 226 => '3.1', 227 => '0.4' },
+	'focuswarning' => { 100 => 0x1301 },
+	'foldername' => { 147 => 0x27 },
+	'foldernumber' => { 316 => 0x9a, 318 => [0x402,0x114,0x316] },
+	'fontcomposite' => { 394 => [\'Fonts','FontsComposite'] },
+	'fontface' => { 394 => [\'Fonts','FontsFontFace'] },
+	'fontfamily' => { 394 => [\'Fonts','FontsFontFamily'] },
+	'fontfilename' => { 394 => [\'Fonts','FontsFontFileName'] },
+	'fontname' => { 394 => [\'Fonts','FontsFontName'] },
+	'fonts' => { 394 => 'Fonts' },
+	'fonttype' => { 394 => [\'Fonts','FontsFontType'] },
+	'fontversion' => { 394 => [\'Fonts','FontsVersionString'] },
+	'for' => { 294 => 'For' },
+	'format' => { 367 => 'format', 387 => 'Format' },
+	'forwardlock' => { 384 => 'forwardlock' },
+	'forwardmatrix1' => { 95 => 0xc714 },
+	'forwardmatrix2' => { 95 => 0xc715 },
+	'framecount' => { 54 => [0x2,0x4] },
+	'frameheight' => { 100 => 0x3822 },
+	'framenum' => { 289 => 0xd7 },
+	'framenumber' => { 100 => 0x8003, 153 => 0x3c, 281 => 0x29 },
+	'framerate' => { 54 => [0x1,0x6], 95 => 0xc764, 100 => 0x3820 },
+	'framewidth' => { 100 => 0x3821 },
+	'freebytes' => { 81 => 0x1 },
+	'freememorycardimages' => { 148 => [0x37,0x54], 149 => [0x2d,0x4a], 150 => 0x32 },
+	'fujiflashmode' => { 100 => 0x1010 },
+	'fullimagesize' => { 328 => 0xb02b },
+	'fullpanoheightpixels' => { 356 => 'FullPanoHeightPixels' },
+	'fullpanowidthpixels' => { 356 => 'FullPanoWidthPixels' },
+	'fullpresssnap' => { 303 => 0x100d },
+	'fullsizeimage' => { 131 => 'data' },
+	'fullsizeimagename' => { 131 => '1Name' },
+	'fullsizeimagetype' => { 131 => '0Type' },
+	'funcbutton' => { 221 => ['14.1','15.1'], 226 => '28.1', 227 => '13.1', 230 => '14.1' },
+	'funcbuttonplusdials' => { 221 => ['14.2','15.2'], 226 => '31.1' },
+	'functionbutton' => { 225 => '13.1', 228 => '5.2' },
+	'gainbase' => { 235 => 0x610 },
+	'gaincontrol' => { 95 => 0xa407, 370 => 'GainControl' },
+	'gamma' => { 95 => 0xa500, 371 => 'Gamma' },
+	'gammacompensatedvalue' => { 105 => 0x91 },
+	'geimagesize' => { 100 => 0x1304 },
+	'gemake' => { 101 => 0x300 },
+	'gemodel' => { 101 => 0x207 },
+	'genre' => { 380 => 'genre', 389 => 'genre' },
+	'geography' => { 381 => 'geography' },
+	'geologicalcontext' => { 94 => 'GeologicalContext' },
+	'geologicalcontextbed' => { 94 => [\'GeologicalContext','GeologicalContextBed'] },
+	'geologicalcontextformation' => { 94 => [\'GeologicalContext','GeologicalContextFormation'] },
+	'geologicalcontextgroup' => { 94 => [\'GeologicalContext','GeologicalContextGroup'] },
+	'geologicalcontextid' => { 94 => [\'GeologicalContext','GeologicalContextGeologicalContextID'] },
+	'geologicalcontextmember' => { 94 => [\'GeologicalContext','GeologicalContextMember'] },
+	'geosync' => { 96 => 'Geosync' },
+	'geotag' => { 96 => 'Geotag' },
+	'geotiffasciiparams' => { 95 => 0x87b1 },
+	'geotiffdirectory' => { 95 => 0x87af },
+	'geotiffdoubleparams' => { 95 => 0x87b0 },
+	'geotime' => { 96 => 'Geotime' },
+	'globalaltitude' => { 292 => 0x419 },
+	'globalangle' => { 292 => 0x40d },
+	'good' => { 389 => 'good' },
+	'gpsaltitude' => { 102 => 0x6, 129 => 'Altitude', 370 => 'GPSAltitude' },
+	'gpsaltituderef' => { 102 => 0x5, 370 => 'GPSAltitudeRef' },
+	'gpsareainformation' => { 102 => 0x1c, 370 => 'GPSAreaInformation' },
+	'gpsdatestamp' => { 102 => 0x1d },
+	'gpsdatetime' => { 129 => 'DateTime', 370 => 'GPSTimeStamp' },
+	'gpsdestbearing' => { 102 => 0x18, 129 => 'Bearing', 370 => 'GPSDestBearing' },
+	'gpsdestbearingref' => { 102 => 0x17, 370 => 'GPSDestBearingRef' },
+	'gpsdestdistance' => { 102 => 0x1a, 129 => 'Distance', 370 => 'GPSDestDistance' },
+	'gpsdestdistanceref' => { 102 => 0x19, 370 => 'GPSDestDistanceRef' },
+	'gpsdestlatitude' => { 102 => 0x14, 370 => 'GPSDestLatitude' },
+	'gpsdestlatituderef' => { 102 => 0x13 },
+	'gpsdestlongitude' => { 102 => 0x16, 370 => 'GPSDestLongitude' },
+	'gpsdestlongituderef' => { 102 => 0x15 },
+	'gpsdifferential' => { 102 => 0x1e, 129 => 'Differential', 370 => 'GPSDifferential' },
+	'gpsdop' => { 102 => 0xb, 370 => 'GPSDOP' },
+	'gpshpositioningerror' => { 102 => 0x1f, 370 => 'GPSHPositioningError' },
+	'gpsimgdirection' => { 102 => 0x11, 370 => 'GPSImgDirection' },
+	'gpsimgdirectionref' => { 102 => 0x10, 370 => 'GPSImgDirectionRef' },
+	'gpslatitude' => { 102 => 0x2, 129 => 'Latitude', 370 => 'GPSLatitude' },
+	'gpslatituderef' => { 102 => 0x1 },
+	'gpslongitude' => { 102 => 0x4, 129 => 'Longitude', 370 => 'GPSLongitude' },
+	'gpslongituderef' => { 102 => 0x3 },
+	'gpsmapdatum' => { 102 => 0x12, 129 => 'Datum', 370 => 'GPSMapDatum' },
+	'gpsmeasuremode' => { 102 => 0xa, 129 => 'MeasureMode', 370 => 'GPSMeasureMode' },
+	'gpsprocessingmethod' => { 102 => 0x1b, 370 => 'GPSProcessingMethod' },
+	'gpssatellites' => { 102 => 0x8, 129 => 'Satellites', 370 => 'GPSSatellites' },
+	'gpsspeed' => { 102 => 0xd, 129 => 'Speed', 370 => 'GPSSpeed' },
+	'gpsspeedref' => { 102 => 0xc, 370 => 'GPSSpeedRef' },
+	'gpsstatus' => { 102 => 0x9, 370 => 'GPSStatus' },
+	'gpstimestamp' => { 102 => 0x7 },
+	'gpstrack' => { 102 => 0xf, 129 => 'Heading', 370 => 'GPSTrack' },
+	'gpstrackref' => { 102 => 0xe, 370 => 'GPSTrackRef' },
+	'gpsversionid' => { 102 => 0x0, 370 => 'GPSVersionID' },
+	'gradation' => { 231 => 0x50f },
+	'gradientbasedcorractive' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionActive'] },
+	'gradientbasedcorramount' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionAmount'] },
+	'gradientbasedcorrbrightness' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalBrightness'] },
+	'gradientbasedcorrclarity' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalClarity'] },
+	'gradientbasedcorrclarity2012' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalClarity2012'] },
+	'gradientbasedcorrcontrast' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalContrast'] },
+	'gradientbasedcorrcontrast2012' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalContrast2012'] },
+	'gradientbasedcorrdefringe' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalDefringe'] },
+	'gradientbasedcorrections' => { 366 => 'GradientBasedCorrections' },
+	'gradientbasedcorrexposure' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalExposure'] },
+	'gradientbasedcorrexposure2012' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalExposure2012'] },
+	'gradientbasedcorrhighlights2012' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalHighlights2012'] },
+	'gradientbasedcorrhue' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalToningHue'] },
+	'gradientbasedcorrluminancenoise' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalLuminanceNoise'] },
+	'gradientbasedcorrmaskalpha' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksAlpha'] },
+	'gradientbasedcorrmaskangle' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksAngle'] },
+	'gradientbasedcorrmaskbottom' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksBottom'] },
+	'gradientbasedcorrmaskcentervalue' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCenterValue'] },
+	'gradientbasedcorrmaskcenterweight' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCenterWeight'] },
+	'gradientbasedcorrmaskdabs' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksDabs'] },
+	'gradientbasedcorrmaskfeather' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksFeather'] },
+	'gradientbasedcorrmaskflipped' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksFlipped'] },
+	'gradientbasedcorrmaskflow' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksFlow'] },
+	'gradientbasedcorrmaskfullx' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksFullX'] },
+	'gradientbasedcorrmaskfully' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksFullY'] },
+	'gradientbasedcorrmaskleft' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksLeft'] },
+	'gradientbasedcorrmaskmidpoint' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMidpoint'] },
+	'gradientbasedcorrmaskperimetervalue' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksPerimeterValue'] },
+	'gradientbasedcorrmaskradius' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksRadius'] },
+	'gradientbasedcorrmaskright' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksRight'] },
+	'gradientbasedcorrmaskroundness' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksRoundness'] },
+	'gradientbasedcorrmasks' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasks'] },
+	'gradientbasedcorrmasksizex' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksSizeX'] },
+	'gradientbasedcorrmasksizey' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksSizeY'] },
+	'gradientbasedcorrmasktop' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksTop'] },
+	'gradientbasedcorrmaskvalue' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMaskValue'] },
+	'gradientbasedcorrmaskversion' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksVersion'] },
+	'gradientbasedcorrmaskwhat' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksWhat'] },
+	'gradientbasedcorrmaskx' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksX'] },
+	'gradientbasedcorrmasky' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksY'] },
+	'gradientbasedcorrmaskzerox' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksZeroX'] },
+	'gradientbasedcorrmaskzeroy' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksZeroY'] },
+	'gradientbasedcorrmoire' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalMoire'] },
+	'gradientbasedcorrsaturation' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalSaturation','GradientBasedCorrectionsLocalToningSaturation'] },
+	'gradientbasedcorrshadows2012' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalShadows2012'] },
+	'gradientbasedcorrsharpness' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalSharpness'] },
+	'gradientbasedcorrtemperature' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalTemperature'] },
+	'gradientbasedcorrtint' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalTint'] },
+	'gradientbasedcorrwhat' => { 366 => [\'GradientBasedCorrections','GradientBasedCorrectionsWhat'] },
+	'grainamount' => { 366 => 'GrainAmount' },
+	'grainfrequency' => { 366 => 'GrainFrequency' },
+	'grainsize' => { 366 => 'GrainSize' },
+	'graymixeraqua' => { 366 => 'GrayMixerAqua' },
+	'graymixerblue' => { 366 => 'GrayMixerBlue' },
+	'graymixergreen' => { 366 => 'GrayMixerGreen' },
+	'graymixermagenta' => { 366 => 'GrayMixerMagenta' },
+	'graymixerorange' => { 366 => 'GrayMixerOrange' },
+	'graymixerpurple' => { 366 => 'GrayMixerPurple' },
+	'graymixerred' => { 366 => 'GrayMixerRed' },
+	'graymixeryellow' => { 366 => 'GrayMixerYellow' },
+	'graypoint' => { 352 => 0x8021 },
+	'grayresponseunit' => { 95 => 0x122 },
+	'greencurvelimits' => { 86 => 0x1c4 },
+	'greencurvepoints' => { 86 => 0x19a },
+	'greenhue' => { 366 => 'GreenHue' },
+	'greensaturation' => { 366 => 'GreenSaturation' },
+	'griddisplay' => { 221 => '13.3', 223 => '2.2', 226 => '10.5', 227 => '3.4', 228 => '6.1', 230 => '4.2' },
+	'gripbatteryadload' => { 260 => 0x5 },
+	'gripbatteryadnoload' => { 260 => 0x4 },
+	'gripbatterystate' => { 260 => '1.2' },
+	'halftonehints' => { 95 => 0x141 },
+	'hasalternative' => { 380 => 'hasAlternative' },
+	'hascorrection' => { 380 => 'hasCorrection' },
+	'hascrop' => { 366 => 'HasCrop' },
+	'hasextendedxmp' => { 391 => 'HasExtendedXMP' },
+	'haspreviousversion' => { 380 => 'hasPreviousVersion' },
+	'hassettings' => { 366 => 'HasSettings' },
+	'hastranslation' => { 380 => 'hasTranslation' },
+	'hdr' => { 174 => 0x4, 250 => 0x9e, 281 => 0x85, 328 => 0x200a },
+	'hdrimagetype' => { 1 => 0xa },
+	'hdrinfoversion' => { 174 => 0x0 },
+	'hdrlevel' => { 174 => 0x5, 318 => 0x2e, 331 => 0x17 },
+	'hdrlevel2' => { 174 => 0x7 },
+	'hdrsetting' => { 318 => 0x2d, 331 => 0x16, 334 => 0x1148, 335 => 0x1148, 336 => 0x1124, 337 => 0x11a0, 338 => 0x117c, 339 => 0x1034, 340 => 0x22c },
+	'hdrsmoothing' => { 174 => 0x6 },
+	'headline' => { 103 => 0x69, 378 => 'Headline' },
+	'hierarchicalkeywords' => { 140 => [\'Keywords','KeywordsHierarchy'] },
+	'hierarchicalkeywords1' => { 140 => [\'Keywords','KeywordsHierarchyKeyword'] },
+	'hierarchicalkeywords1applied' => { 140 => [\'Keywords','KeywordsHierarchyApplied'] },
+	'hierarchicalkeywords1children' => { 140 => [\'Keywords','KeywordsHierarchyChildren'] },
+	'hierarchicalkeywords2' => { 140 => [\'Keywords','KeywordsHierarchyChildrenKeyword'] },
+	'hierarchicalkeywords2applied' => { 140 => [\'Keywords','KeywordsHierarchyChildrenApplied'] },
+	'hierarchicalkeywords2children' => { 140 => [\'Keywords','KeywordsHierarchyChildrenChildren'] },
+	'hierarchicalkeywords3' => { 140 => [\'Keywords','KeywordsHierarchyChildrenChildrenKeyword'] },
+	'hierarchicalkeywords3applied' => { 140 => [\'Keywords','KeywordsHierarchyChildrenChildrenApplied'] },
+	'hierarchicalkeywords3children' => { 140 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildren'] },
+	'hierarchicalkeywords4' => { 140 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildrenKeyword'] },
+	'hierarchicalkeywords4applied' => { 140 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildrenApplied'] },
+	'hierarchicalkeywords4children' => { 140 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildrenChildren'] },
+	'hierarchicalkeywords5' => { 140 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildrenChildrenKeyword'] },
+	'hierarchicalkeywords5applied' => { 140 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildrenChildrenApplied'] },
+	'hierarchicalkeywords5children' => { 140 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildrenChildrenChildren'] },
+	'hierarchicalkeywords6' => { 140 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildrenChildrenChildrenKeyword'] },
+	'hierarchicalkeywords6applied' => { 140 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildrenChildrenChildrenApplied'] },
+	'hierarchicalsubject' => { 358 => 'hierarchicalSubject' },
+	'highestbiostratigraphiczone' => { 94 => [\'GeologicalContext','GeologicalContextHighestBiostratigraphicZone'] },
+	'highisomultiplierblue' => { 254 => 0x1a },
+	'highisomultipliergreen' => { 254 => 0x19 },
+	'highisomultiplierred' => { 254 => 0x18 },
+	'highisonoisereduction' => { 14 => 0xbc, 15 => 0xbd, 18 => 0xbd, 25 => 0xc9, 68 => 0x202, 100 => 0x100e, 181 => 0xb1, 281 => 0x71, 316 => 0x2c, 317 => 0x26, 318 => 0x26, 328 => 0x2009, 331 => 0x12 },
+	'highisonoisereduction2' => { 328 => 0xb050 },
+	'highlight' => { 311 => 0xf },
+	'highlightcolordistortreduct' => { 352 => 0x8026 },
+	'highlightprotection' => { 213 => 0x6 },
+	'highlightrecovery' => { 366 => 'HighlightRecovery' },
+	'highlights' => { 360 => 'Highlights' },
+	'highlights2012' => { 366 => 'Highlights2012' },
+	'highlighttone' => { 100 => 0x1041 },
+	'highlighttonepriority' => { 11 => 0x7, 14 => 0x7, 15 => 0x7, 16 => 0x7, 18 => 0x7, 20 => 0x7, 25 => 0x7, 68 => 0x203 },
+	'highlowkeyadj' => { 281 => 0x6c },
+	'highspeedsync' => { 150 => 0x5 },
+	'histogramxml' => { 214 => 0x83a1a25 },
+	'history' => { 378 => 'History', 390 => 'History' },
+	'historyaction' => { 390 => [\'History','HistoryAction'] },
+	'historychanged' => { 390 => [\'History','HistoryChanged'] },
+	'historyinstanceid' => { 390 => [\'History','HistoryInstanceID'] },
+	'historyparameters' => { 390 => [\'History','HistoryParameters'] },
+	'historysoftwareagent' => { 390 => [\'History','HistorySoftwareAgent'] },
+	'historywhen' => { 390 => [\'History','HistoryWhen'] },
+	'hometowncity' => { 91 => 0x3006, 281 => 0x23, 286 => 0x2 },
+	'hometowncitycode' => { 287 => 0x1000 },
+	'hometowndst' => { 281 => 0x25, 286 => '0.2' },
+	'hostcomputer' => { 95 => 0x13c },
+	'hue' => { 155 => 0x3b, 281 => 0x67 },
+	'hueadj' => { 217 => 0x2f, 352 => 0x8019 },
+	'hueadjust' => { 303 => 0x1016 },
+	'hueadjustment' => { 148 => 0x4a, 149 => 0x40, 181 => 0x92, 183 => 0x36 },
+	'hueadjustmentaqua' => { 366 => 'HueAdjustmentAqua' },
+	'hueadjustmentblue' => { 366 => 'HueAdjustmentBlue' },
+	'hueadjustmentgreen' => { 366 => 'HueAdjustmentGreen' },
+	'hueadjustmentmagenta' => { 366 => 'HueAdjustmentMagenta' },
+	'hueadjustmentorange' => { 366 => 'HueAdjustmentOrange' },
+	'hueadjustmentpurple' => { 366 => 'HueAdjustmentPurple' },
+	'hueadjustmentred' => { 366 => 'HueAdjustmentRed' },
+	'hueadjustmentyellow' => { 366 => 'HueAdjustmentYellow' },
+	'huesetting' => { 239 => 0x1011 },
+	'icc_profile' => { 96 => 'ICC_Profile' },
+	'iccprofilename' => { 378 => 'ICCProfile' },
+	'idccreativestyle' => { 352 => 0x8000 },
+	'idcpreviewlength' => { 352 => 0x202 },
+	'idcpreviewstart' => { 352 => 0x201 },
+	'identification' => { 94 => 'Identification' },
+	'identificationid' => { 94 => [\'Identification','IdentificationIdentificationID'] },
+	'identificationqualifier' => { 94 => [\'Identification','IdentificationIdentificationQualifier'] },
+	'identificationreferences' => { 94 => [\'Identification','IdentificationIdentificationReferences'] },
+	'identificationremarks' => { 94 => [\'Identification','IdentificationIdentificationRemarks'] },
+	'identificationverificationstatus' => { 94 => [\'Identification','IdentificationIdentificationVerificationStatus'] },
+	'identifiedby' => { 94 => [\'Identification','IdentificationIdentifiedBy'] },
+	'identifier' => { 367 => 'identifier', 387 => 'Identifier' },
+	'illumination' => { 228 => '0.5' },
+	'imageadjustment' => { 181 => 0x80, 204 => 0x5 },
+	'imagealterationconstraints' => { 379 => 'ImageAlterationConstraints' },
+	'imagearea' => { 191 => 0x10, 194 => 0x10 },
+	'imageareaoffset' => { 281 => 0x38 },
+	'imageauthentication' => { 181 => 0x20 },
+	'imageboundary' => { 181 => 0x16 },
+	'imagecount' => { 181 => 0xa5, 329 => 0x11b, 341 => 0x32 },
+	'imagecount2' => { 341 => 0x4c },
+	'imagecreator' => { 379 => 'ImageCreator' },
+	'imagecreatorid' => { 379 => [\'ImageCreator','ImageCreatorImageCreatorID'] },
+	'imagecreatorimageid' => { 379 => 'ImageCreatorImageID' },
+	'imagecreatorname' => { 379 => [\'ImageCreator','ImageCreatorImageCreatorName'] },
+	'imagedatasize' => { 181 => 0xa2 },
+	'imagedescription' => { 95 => 0x10e, 385 => 'ImageDescription' },
+	'imageduplicationconstraints' => { 379 => 'ImageDuplicationConstraints' },
+	'imagedustoff' => { 214 => 0xfe443a45 },
+	'imageeditcount' => { 281 => 0x41 },
+	'imageediting' => { 281 => 0x32 },
+	'imageeffects' => { 303 => 0x1010 },
+	'imagefileconstraints' => { 379 => 'ImageFileConstraints' },
+	'imagefileformatasdelivered' => { 379 => 'ImageFileFormatAsDelivered' },
+	'imagefilesizeasdelivered' => { 379 => 'ImageFileSizeAsDelivered' },
+	'imagegeneration' => { 100 => 0x1436 },
+	'imageheight' => { 95 => 0x101, 154 => 0xc, 385 => 'ImageLength' },
+	'imagehistory' => { 95 => 0x9213 },
+	'imageidnumber' => { 246 => 0x340 },
+	'imagenumber' => { 95 => 0x9211, 125 => 'ImageNumber', 148 => 0xae, 149 => 0x5e, 316 => 0x9b, 318 => [0x400,'276.1',0x314], 363 => 'ImageNumber' },
+	'imagenumber2' => { 149 => 0x62 },
+	'imageoptimization' => { 181 => 0xa9 },
+	'imageorientation' => { 103 => 0x83 },
+	'imageprocessing' => { 181 => 0x1a },
+	'imageprocessingversion' => { 235 => 0x0 },
+	'imagequality' => { 125 => 'ImageQuality', 193 => '723.2', 194 => '732.2', 201 => '708.1', 250 => 0x1 },
+	'imagequality2' => { 231 => 0x603 },
+	'imageref' => { 374 => 'ImageRef' },
+	'imagereview' => { 222 => '0.4', 228 => '0.4' },
+	'imagereviewtime' => { 222 => '2.1', 223 => '19.1', 224 => '20.1', 225 => '20.1', 226 => '9.2', 227 => '20.1', 230 => '21.2' },
+	'imagesize' => { 131 => 'ImageSize' },
+	'imagesizerestriction' => { 382 => 'imageSizeRestriction' },
+	'imagesourcedata' => { 95 => 0x935c },
+	'imagestabilization' => { 29 => 0x22, 91 => 0x3020, 100 => 0x1422, 125 => 'ImageStabilization', 148 => 0xbd, 149 => 0x71, 150 => 0x57, 151 => 0x0, 152 => [0x18,0x107,0x113], 153 => 0x49c2, 181 => 0xac, 231 => 0x604, 234 => 0x1600, 250 => 0x1a, 321 => 0x12, 322 => 0x11, 328 => 0xb026 },
+	'imagestabilization2' => { 320 => 0xa },
+	'imagestabilizationsetting' => { 153 => 0x14, 316 => 0x3d, 317 => 0x3d, 327 => 0x14 },
+	'imagestyle' => { 316 => 0x2d, 317 => 0x27 },
+	'imagesupplier' => { 379 => 'ImageSupplier' },
+	'imagesupplierid' => { 379 => [\'ImageSupplier','ImageSupplierImageSupplierID'] },
+	'imagesupplierimageid' => { 379 => 'ImageSupplierImageID' },
+	'imagesuppliername' => { 379 => [\'ImageSupplier','ImageSupplierImageSupplierName'] },
+	'imagetemperaturemax' => { 97 => 0x1 },
+	'imagetemperaturemin' => { 97 => 0x2 },
+	'imagetone' => { 281 => 0x4f },
+	'imagetype' => { 103 => 0x82, 379 => 'ImageType' },
+	'imageuniqueid' => { 51 => 0x28, 95 => 0xa420, 370 => 'ImageUniqueID' },
+	'imagewidth' => { 95 => 0x100, 154 => 0xe, 385 => 'ImageWidth' },
+	'incrementaltemperature' => { 366 => 'IncrementalTemperature' },
+	'incrementaltint' => { 366 => 'IncrementalTint' },
+	'industry' => { 380 => 'industry', 381 => 'industry' },
+	'infobuttonwhenshooting' => { 68 => 0x409 },
+	'infraredilluminator' => { 299 => 0x28 },
+	'ingredients' => { 390 => 'Ingredients' },
+	'ingredientsalternatepaths' => { 390 => [\'Ingredients','IngredientsAlternatePaths'] },
+	'ingredientsdocumentid' => { 390 => [\'Ingredients','IngredientsDocumentID'] },
+	'ingredientsfilepath' => { 390 => [\'Ingredients','IngredientsFilePath'] },
+	'ingredientsfrompart' => { 390 => [\'Ingredients','IngredientsFromPart'] },
+	'ingredientsinstanceid' => { 390 => [\'Ingredients','IngredientsInstanceID'] },
+	'ingredientslastmodifydate' => { 390 => [\'Ingredients','IngredientsLastModifyDate'] },
+	'ingredientsmanager' => { 390 => [\'Ingredients','IngredientsManager'] },
+	'ingredientsmanagervariant' => { 390 => [\'Ingredients','IngredientsManagerVariant'] },
+	'ingredientsmanageto' => { 390 => [\'Ingredients','IngredientsManageTo'] },
+	'ingredientsmanageui' => { 390 => [\'Ingredients','IngredientsManageUI'] },
+	'ingredientsmaskmarkers' => { 390 => [\'Ingredients','IngredientsMaskMarkers'] },
+	'ingredientsoriginaldocumentid' => { 390 => [\'Ingredients','IngredientsOriginalDocumentID'] },
+	'ingredientspartmapping' => { 390 => [\'Ingredients','IngredientsPartMapping'] },
+	'ingredientsrenditionclass' => { 390 => [\'Ingredients','IngredientsRenditionClass'] },
+	'ingredientsrenditionparams' => { 390 => [\'Ingredients','IngredientsRenditionParams'] },
+	'ingredientstopart' => { 390 => [\'Ingredients','IngredientsToPart'] },
+	'ingredientsversionid' => { 390 => [\'Ingredients','IngredientsVersionID'] },
+	'initialhorizontalfovdegrees' => { 356 => 'InitialHorizontalFOVDegrees' },
+	'initialviewheadingdegrees' => { 356 => 'InitialViewHeadingDegrees' },
+	'initialviewpitchdegrees' => { 356 => 'InitialViewPitchDegrees' },
+	'initialviewrolldegrees' => { 356 => 'InitialViewRollDegrees' },
+	'initialzoomliveview' => { 221 => '4.4' },
+	'initialzoomsetting' => { 221 => '9.3', 226 => '27.3' },
+	'inkset' => { 95 => 0x14c },
+	'instanceid' => { 390 => 'InstanceID' },
+	'instantplaybacksetup' => { 150 => 0x3e },
+	'instantplaybacktime' => { 150 => 0x3d },
+	'instructions' => { 378 => 'Instructions' },
+	'instrument' => { 389 => 'instrument' },
+	'intellectualgenre' => { 375 => 'IntellectualGenre' },
+	'intelligentauto' => { 328 => 0xb052 },
+	'intelligentcontrast' => { 41 => 0x4 },
+	'intelligentd-range' => { 250 => 0x79 },
+	'intelligentexposure' => { 250 => 0x5d },
+	'intelligentresolution' => { 250 => 0x70 },
+	'interchangecolorspace' => { 105 => 0x40 },
+	'internalflash' => { 147 => 0x2b, 221 => '23.1', 222 => '8.1', 223 => '22.1', 225 => '23.1', 228 => '8.1', 230 => '24.1', 234 => 0x1208 },
+	'internalflashae1' => { 236 => 0x1021 },
+	'internalflashae1_0' => { 236 => 0x101d },
+	'internalflashae2' => { 236 => 0x1022 },
+	'internalflashae2_0' => { 236 => 0x101e },
+	'internalflashmode' => { 269 => 0x1 },
+	'internalflashstrength' => { 269 => 0x3 },
+	'internalflashtable' => { 236 => 0x1024 },
+	'internalndfilter' => { 250 => 0x9d },
+	'internalserialnumber' => { 51 => 0x96, 61 => 0x9, 100 => 0x10, 153 => 0x49dc, 232 => 0x102, 250 => 0x25, 261 => 0x4, 303 => 0x5 },
+	'interopindex' => { 95 => 0x1, 371 => 'InteroperabilityIndex' },
+	'interopversion' => { 95 => 0x2 },
+	'intervallength' => { 147 => 0x10 },
+	'intervalmode' => { 147 => 0x26 },
+	'intervalnumber' => { 147 => 0x11 },
+	'introtime' => { 389 => 'introTime' },
+	'introtimescale' => { 389 => [\'introTime','introTimeScale'] },
+	'introtimevalue' => { 389 => [\'introTime','introTimeValue'] },
+	'iptc' => { 96 => 'IPTC' },
+	'iptc-naa' => { 95 => 0x83bb, 254 => 0x83bb },
+	'iptcbitspersample' => { 105 => 0x56 },
+	'iptcdigest' => { 292 => 0x425 },
+	'iptcimageheight' => { 105 => 0x1e },
+	'iptcimagerotation' => { 105 => 0x66 },
+	'iptcimagewidth' => { 105 => 0x14 },
+	'iptclastedited' => { 376 => 'IptcLastEdited' },
+	'iptcpicturenumber' => { 105 => 0xa },
+	'iptcpixelheight' => { 105 => 0x32 },
+	'iptcpixelwidth' => { 105 => 0x28 },
+	'isbn' => { 380 => 'isbn' },
+	'iscorrectionof' => { 380 => 'isCorrectionOf' },
+	'iscustompicturestyle' => { 87 => 0x3 },
+	'iso' => { 5 => 0x6, 7 => 0x6, 8 => 0x75, 9 => 0x6, 10 => 0x79, 11 => 0x6, 12 => 0x6, 13 => 0x6, 14 => 0x6, 15 => 0x6, 16 => 0x6, 17 => 0x6, 18 => 0x6, 19 => 0x6, 20 => 0x6, 21 => 0x6, 22 => 0x6, 23 => 0x6, 24 => 0x6, 25 => 0x6, 26 => 0x0, 27 => 0x1, 90 => 0x14, 91 => [0x3014,0x14], 95 => 0x8827, 108 => 0xfd06, 109 => 0x1784, 111 => 0x60, 113 => [0xfa2e,0xfa46], 114 => [0x27,0x28], 115 => 0xf105, 118 => 0x14, 120 => 0x4e, 123 => 0x34, 125 => 'ISO', 147 => 0x8, 153 => 0x49ba, 175 => 0x0, 181 => 0x2, 254 => 0x17, 281 => [0x8b,0x14], 287 => 0x14, 308 => 0xa014, 370 => 'ISOSpeedRatings' },
+	'iso2' => { 175 => 0x6, 188 => 0x265, 189 => 0x25c, 190 => 0x265, 191 => 0x221, 192 => 0x25d, 193 => 0x256, 194 => 0x25d, 196 => 0x2b5, 199 => 0x265, 203 => 0x2b5 },
+	'isoauto' => { 262 => '14.4' },
+	'isoautoparameters' => { 281 => 0x7a },
+	'isodisplay' => { 223 => '2.3', 224 => '3.3', 225 => '3.3', 227 => '3.3', 230 => '4.3' },
+	'isoexpansion' => { 68 => 0x103, 69 => 0x7, 70 => 0x8, 73 => 0x8, 175 => 0x4 },
+	'isoexpansion2' => { 175 => 0xa },
+	'isofloor' => { 262 => 0x6 },
+	'isoselection' => { 181 => 0xf },
+	'isosensitivitystep' => { 227 => '6.2' },
+	'isosetting' => { 111 => 0x5e, 125 => 'ISOSetting', 147 => 0x24, 148 => 0x26, 149 => 0x1c, 150 => 0x13, 155 => 0x6, 181 => 0x13, 262 => '17.3', 302 => 0x27, 316 => 0x16, 317 => 0x14, 318 => 0x2 },
+	'isospeed' => { 95 => 0x8833, 371 => 'ISOSpeed' },
+	'isospeedexpansion' => { 67 => 0x3 },
+	'isospeedincrements' => { 68 => 0x102 },
+	'isospeedlatitudeyyy' => { 95 => 0x8834, 371 => 'ISOSpeedLatitudeyyy' },
+	'isospeedlatitudezzz' => { 95 => 0x8835, 371 => 'ISOSpeedLatitudezzz' },
+	'isospeedrange' => { 68 => 0x103 },
+	'isostepsize' => { 221 => '6.1', 226 => '4.1' },
+	'isovalue' => { 236 => 0x1001 },
+	'issn' => { 380 => 'issn' },
+	'issueidentifier' => { 380 => 'issueIdentifier' },
+	'issuename' => { 380 => 'issueName' },
+	'istranslationof' => { 380 => 'isTranslationOf' },
+	'jobid' => { 103 => 0xb8 },
+	'jobname' => { 372 => 'JobName' },
+	'jobref' => { 388 => 'JobRef' },
+	'jobrefid' => { 388 => [\'JobRef','JobRefId'] },
+	'jobrefname' => { 388 => [\'JobRef','JobRefName'] },
+	'jobrefurl' => { 388 => [\'JobRef','JobRefUrl'] },
+	'jobstatus' => { 372 => 'JobStatus' },
+	'jpegquality' => { 8 => 0x66, 252 => 0x3034, 328 => 0xb047 },
+	'jpegsize' => { 252 => 0x303a },
+	'jpgfromraw' => { 81 => 0x2007, 92 => 'JpgFromRaw', 254 => 0x2e },
+	'jpgfromrawlength' => { 95 => [0x117,0x202] },
+	'jpgfromrawstart' => { 95 => [0x111,0x201] },
+	'jpgrecordedpixels' => { 262 => '14.1' },
+	'jurisdiction' => { 364 => 'jurisdiction' },
+	'kelvinwb_01' => { 270 => 0x5 },
+	'kelvinwb_02' => { 270 => 0x9 },
+	'kelvinwb_03' => { 270 => 0xd },
+	'kelvinwb_04' => { 270 => 0x11 },
+	'kelvinwb_05' => { 270 => 0x15 },
+	'kelvinwb_06' => { 270 => 0x19 },
+	'kelvinwb_07' => { 270 => 0x1d },
+	'kelvinwb_08' => { 270 => 0x21 },
+	'kelvinwb_09' => { 270 => 0x25 },
+	'kelvinwb_10' => { 270 => 0x29 },
+	'kelvinwb_11' => { 270 => 0x2d },
+	'kelvinwb_12' => { 270 => 0x31 },
+	'kelvinwb_13' => { 270 => 0x35 },
+	'kelvinwb_14' => { 270 => 0x39 },
+	'kelvinwb_15' => { 270 => 0x3d },
+	'kelvinwb_16' => { 270 => 0x41 },
+	'kelvinwb_daylight' => { 270 => 0x1 },
+	'key' => { 389 => 'key' },
+	'keyword' => { 380 => 'keyword' },
+	'keywordinfo' => { 140 => 'Keywords' },
+	'keywords' => { 103 => 0x19, 126 => 'Keywords', 240 => 'Keywords', 294 => 'Keywords', 361 => 'keywords', 377 => 'Keywords', 387 => 'Keywords' },
+	'killdate' => { 380 => 'killDate' },
+	'kodakimageheight' => { 108 => 0xf908, 111 => 0xe, 113 => [0xfa1e,0xfa52], 119 => 0x70 },
+	'kodakimagewidth' => { 108 => 0xf907, 111 => 0xc, 113 => [0xfa1d,0xfa51], 119 => 0x6c },
+	'kodakinfotype' => { 108 => 0xfa00 },
+	'kodakmaker' => { 119 => 0x8 },
+	'kodakmodel' => { 111 => 0x0, 119 => 0x28 },
+	'label' => { 242 => 'Label', 387 => 'Label' },
+	'labelname1' => { 374 => [\'TagStructure','TagStructureLabelName'] },
+	'labelname2' => { 374 => [\'TagStructure','TagStructureSubLabelsLabelName'] },
+	'labelname3' => { 374 => [\'TagStructure','TagStructureSubLabelsSubLabelsLabelName'] },
+	'labelname4' => { 374 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsLabelName'] },
+	'labelname5' => { 374 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsSubLabelsLabelName'] },
+	'labelname6' => { 374 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsLabelName'] },
+	'landmark' => { 250 => 0x6f },
+	'landscapeoutputhighlightpoint' => { 87 => 0x26 },
+	'landscapeoutputshadowpoint' => { 87 => 0x27 },
+	'landscaperawcolortone' => { 87 => 0x1f },
+	'landscaperawcontrast' => { 87 => 0x21 },
+	'landscaperawhighlight' => { 87 => 0x77 },
+	'landscaperawhighlightpoint' => { 87 => 0x24 },
+	'landscaperawlinear' => { 87 => 0x22 },
+	'landscaperawsaturation' => { 87 => 0x20 },
+	'landscaperawshadow' => { 87 => 0x80 },
+	'landscaperawshadowpoint' => { 87 => 0x25 },
+	'landscaperawsharpness' => { 87 => 0x23 },
+	'landscapeunsharpmaskfineness' => { 87 => 0xa0 },
+	'landscapeunsharpmaskstrength' => { 87 => 0x9e },
+	'landscapeunsharpmaskthreshold' => { 87 => 0xa2 },
+	'language' => { 367 => 'language' },
+	'languageidentifier' => { 103 => 0x87 },
+	'largestvalidinteriorrectheight' => { 356 => 'LargestValidInteriorRectHeight' },
+	'largestvalidinteriorrectleft' => { 356 => 'LargestValidInteriorRectLeft' },
+	'largestvalidinteriorrecttop' => { 356 => 'LargestValidInteriorRectTop' },
+	'largestvalidinteriorrectwidth' => { 356 => 'LargestValidInteriorRectWidth' },
+	'lastfilenumber' => { 147 => 0x1b },
+	'lastkeywordiptc' => { 145 => 'LastKeywordIPTC' },
+	'lastkeywordxmp' => { 145 => 'LastKeywordXMP' },
+	'lastphotodate' => { 356 => 'LastPhotoDate' },
+	'lasturl' => { 390 => 'LastURL' },
+	'lateralchromaticaberration' => { 328 => 0x2012 },
+	'latestageorhigheststage' => { 94 => [\'GeologicalContext','GeologicalContextLatestAgeOrHighestStage'] },
+	'latesteonorhighesteonothem' => { 94 => [\'GeologicalContext','GeologicalContextLatestEonOrHighestEonothem'] },
+	'latestepochorhighestseries' => { 94 => [\'GeologicalContext','GeologicalContextLatestEpochOrHighestSeries'] },
+	'latesteraorhighesterathem' => { 94 => [\'GeologicalContext','GeologicalContextLatestEraOrHighestErathem'] },
+	'latestperiodorhighestsystem' => { 94 => [\'GeologicalContext','GeologicalContextLatestPeriodOrHighestSystem'] },
+	'lc1' => { 272 => 0x2 },
+	'lc10' => { 272 => 0xb },
+	'lc11' => { 272 => 0xc },
+	'lc12' => { 272 => 0xd },
+	'lc14' => { 272 => 0xf },
+	'lc15' => { 272 => 0x10 },
+	'lc2' => { 272 => 0x3 },
+	'lc3' => { 272 => 0x4 },
+	'lc4' => { 272 => 0x5 },
+	'lc5' => { 272 => 0x6 },
+	'lc6' => { 272 => 0x7 },
+	'lc7' => { 272 => 0x8 },
+	'lcddisplayatpoweron' => { 68 => 0x811, 72 => 0xa },
+	'lcddisplayreturntoshoot' => { 73 => 0x12 },
+	'lcdillumination' => { 221 => '17.5', 226 => '10.3', 227 => '4.2', 230 => '5.4' },
+	'lcdilluminationduringbulb' => { 68 => 0x408 },
+	'lcdpanels' => { 67 => 0x8 },
+	'lcheditor' => { 214 => 0x8ae85e },
+	'legacyiptcdigest' => { 378 => 'LegacyIPTCDigest' },
+	'legalcode' => { 364 => 'legalcode' },
+	'lens' => { 95 => 0xfdea, 181 => 0x84, 363 => 'Lens' },
+	'lensafstopbutton' => { 66 => 0x11, 67 => 0x13, 68 => 0x506, 69 => 0x10, 70 => 0x12, 73 => 0x13, 74 => 0x9 },
+	'lensaperturerange' => { 311 => [0x30,0x48] },
+	'lensdistortionparams' => { 236 => 0x206 },
+	'lensdrivenoaf' => { 68 => 0x505 },
+	'lensfirmware' => { 304 => 0x20, 308 => 0xa004 },
+	'lensfirmwareversion' => { 232 => 0x204, 250 => 0x60 },
+	'lensfocalrange' => { 311 => [0xa,0x2a] },
+	'lensformat' => { 341 => 0x106, 347 => 0x603, 348 => 0x5d },
+	'lensfstops' => { 176 => 0x7, 177 => 0xc, 178 => 0xd, 181 => 0x8b, 272 => '0.3' },
+	'lensid' => { 363 => 'LensID' },
+	'lensidnumber' => { 176 => 0x6, 177 => 0xb, 178 => 0xc },
+	'lensinfo' => { 95 => 0xa432, 278 => 0x2a, 363 => 'LensInfo', 371 => 'LensSpecification' },
+	'lenskind' => { 272 => 0x1 },
+	'lensmake' => { 95 => 0xa433, 132 => 'Make', 371 => 'LensMake' },
+	'lensmanualdistortionamount' => { 366 => 'LensManualDistortionAmount' },
+	'lensmanufacturer' => { 145 => 'LensManufacturer' },
+	'lensmaxaperturerange' => { 311 => 0x2b },
+	'lensmodel' => { 5 => 0x937, 12 => 0x92b, 13 => 0x933, 51 => 0x95, 95 => 0xa434, 132 => 'Model', 145 => 'LensModel', 179 => 0x18a, 232 => 0x203, 278 => 0xc, 371 => 'LensModel' },
+	'lensmount' => { 318 => 0x99, 341 => 0x105, 347 => 0x604, 348 => 0x5e, 351 => 0x8 },
+	'lensprofilechromaticaberrationscale' => { 366 => 'LensProfileChromaticAberrationScale' },
+	'lensprofiledigest' => { 366 => 'LensProfileDigest' },
+	'lensprofiledistortionscale' => { 366 => 'LensProfileDistortionScale' },
+	'lensprofileenable' => { 366 => 'LensProfileEnable' },
+	'lensprofilefilename' => { 366 => 'LensProfileFilename' },
+	'lensprofilename' => { 366 => 'LensProfileName' },
+	'lensprofilesetup' => { 366 => 'LensProfileSetup' },
+	'lensprofilevignettingscale' => { 366 => 'LensProfileVignettingScale' },
+	'lensproperties' => { 232 => 0x20b },
+	'lensserialnumber' => { 49 => 0x0, 95 => 0xa435, 132 => 'SerialNumber', 232 => 0x202, 250 => 0x52, 304 => 0x30, 363 => 'LensSerialNumber', 371 => 'LensSerialNumber' },
+	'lensshutterlock' => { 150 => 0x4a },
+	'lensspec' => { 314 => 0x0, 315 => 0x0, 328 => 0xb02a },
+	'lenstemperature' => { 236 => 0x1008 },
+	'lenstype' => { 5 => 0xe2, 6 => 0xd, 7 => 0x1a7, 8 => 0xc, 9 => 0x111, 10 => 0xc, 11 => 0x14f, 12 => 0xd6, 13 => 0xde, 14 => 0xf6, 15 => 0xea, 16 => 0xff, 17 => [0xc,0x97], 18 => 0xe6, 19 => 0x153, 20 => 0xea, 21 => 0xe8, 22 => 0x127, 23 => 0x161, 24 => 0x166, 25 => 0x112, 29 => 0x16, 152 => 0x10c, 153 => 0x49bd, 181 => 0x83, 232 => 0x201, 243 => 0x16, 246 => 0x310, 249 => 0x303, 250 => 0x51, 252 => 0x3405, 273 => 0x0, 274 => 0x0, 275 => 0x1, 276 => 0x1, 277 => 0x1, 279 => 0x0, 308 => 0xa003, 311 => 0x27, 328 => 0xb027, 341 => 0x109, 347 => 0x608, 348 => 0x62 },
+	'lenstype2' => { 318 => 0x3f7, 341 => 0x107, 347 => 0x605, 348 => 0x60, 351 => 0x9 },
+	'levelgaugepitch' => { 231 => 0x904 },
+	'levelgaugeroll' => { 231 => 0x903 },
+	'levelindicator' => { 255 => 0x15 },
+	'levelorientation' => { 280 => 0x0 },
+	'license' => { 364 => 'license' },
+	'licensee' => { 379 => 'Licensee' },
+	'licenseeid' => { 379 => [\'Licensee','LicenseeLicenseeID'] },
+	'licenseeimageid' => { 379 => 'LicenseeImageID' },
+	'licenseeimagenotes' => { 379 => 'LicenseeImageNotes' },
+	'licenseename' => { 379 => [\'Licensee','LicenseeLicenseeName'] },
+	'licenseenddate' => { 379 => 'LicenseEndDate' },
+	'licenseeprojectreference' => { 379 => 'LicenseeProjectReference' },
+	'licenseetransactionid' => { 379 => 'LicenseeTransactionID' },
+	'licenseid' => { 379 => 'LicenseID' },
+	'licensestartdate' => { 379 => 'LicenseStartDate' },
+	'licensetransactiondate' => { 379 => 'LicenseTransactionDate' },
+	'licensetype' => { 368 => 'licensetype' },
+	'licensor' => { 379 => 'Licensor' },
+	'licensorcity' => { 379 => [\'Licensor','LicensorLicensorCity'] },
+	'licensorcountry' => { 379 => [\'Licensor','LicensorLicensorCountry'] },
+	'licensoremail' => { 379 => [\'Licensor','LicensorLicensorEmail'] },
+	'licensorextendedaddress' => { 379 => [\'Licensor','LicensorLicensorExtendedAddress'] },
+	'licensorid' => { 379 => [\'Licensor','LicensorLicensorID'] },
+	'licensorimageid' => { 379 => 'LicensorImageID' },
+	'licensorname' => { 379 => [\'Licensor','LicensorLicensorName'] },
+	'licensornotes' => { 379 => 'LicensorNotes' },
+	'licensorpostalcode' => { 379 => [\'Licensor','LicensorLicensorPostalCode'] },
+	'licensorregion' => { 379 => [\'Licensor','LicensorLicensorRegion'] },
+	'licensorstreetaddress' => { 379 => [\'Licensor','LicensorLicensorStreetAddress'] },
+	'licensortelephone1' => { 379 => [\'Licensor','LicensorLicensorTelephone1'] },
+	'licensortelephone2' => { 379 => [\'Licensor','LicensorLicensorTelephone2'] },
+	'licensortelephonetype1' => { 379 => [\'Licensor','LicensorLicensorTelephoneType1'] },
+	'licensortelephonetype2' => { 379 => [\'Licensor','LicensorLicensorTelephoneType2'] },
+	'licensortransactionid' => { 379 => 'LicensorTransactionID' },
+	'licensorurl' => { 379 => [\'Licensor','LicensorLicensorURL'] },
+	'lightcondition' => { 236 => 0x1009 },
+	'lightingmode' => { 91 => 0x302a },
+	'lightreading' => { 281 => 0x15 },
+	'lightsource' => { 95 => 0x9208, 181 => 0x90, 239 => 0x1000, 370 => 'LightSource' },
+	'lightsourcespecial' => { 310 => 0x21d },
+	'lightswitch' => { 230 => '0.1' },
+	'lightvaluecenter' => { 236 => 0x103d },
+	'lightvalueperiphery' => { 236 => 0x103e },
+	'linearitylimitblue' => { 254 => 0x10 },
+	'linearitylimitgreen' => { 254 => 0xf },
+	'linearitylimitred' => { 254 => 0xe },
+	'linearityuppermargin' => { 36 => [0x2ba,0x2d1,0x2d5], 38 => 0x1e5, 39 => 0x1fe },
+	'linearizationtable' => { 95 => 0xc618 },
+	'linearresponselimit' => { 95 => 0xc62e },
+	'linkaetoafpoint' => { 262 => '14.2' },
+	'lithostratigraphicterms' => { 94 => [\'GeologicalContext','GeologicalContextLithostratigraphicTerms'] },
+	'liveviewaf' => { 223 => '32.1', 230 => '34.1' },
+	'liveviewafareamode' => { 227 => '34.1' },
+	'liveviewafmethod' => { 331 => 0x20 },
+	'liveviewafmode' => { 227 => '34.2' },
+	'liveviewafsetting' => { 318 => 0x36 },
+	'liveviewexposuresimulation' => { 68 => 0x810 },
+	'liveviewfocusmode' => { 318 => [0x8b,0x28b] },
+	'liveviewmetering' => { 318 => [0x84,0x284] },
+	'liveviewmonitorofftime' => { 224 => '20.2', 225 => '20.2', 227 => '20.2' },
+	'liveviewshooting' => { 46 => 0x13 },
+	'localcaption' => { 103 => 0x79 },
+	'localizedcameramodel' => { 95 => 0xc615 },
+	'locallocationname' => { 308 => 0x30 },
+	'location' => { 180 => 0x9, 250 => 0x67, 359 => 'Location', 375 => 'Location', 380 => 'location' },
+	'locationareacode' => { 365 => 'lac' },
+	'locationcreated' => { 376 => 'LocationCreated' },
+	'locationcreatedcity' => { 376 => [\'LocationCreated','LocationCreatedCity'] },
+	'locationcreatedcountrycode' => { 376 => [\'LocationCreated','LocationCreatedCountryCode'] },
+	'locationcreatedcountryname' => { 376 => [\'LocationCreated','LocationCreatedCountryName'] },
+	'locationcreatedprovincestate' => { 376 => [\'LocationCreated','LocationCreatedProvinceState'] },
+	'locationcreatedsublocation' => { 376 => [\'LocationCreated','LocationCreatedSublocation'] },
+	'locationcreatedworldregion' => { 376 => [\'LocationCreated','LocationCreatedWorldRegion'] },
+	'locationinfoversion' => { 180 => 0x0 },
+	'locationname' => { 308 => 0x31 },
+	'locationshown' => { 376 => 'LocationShown' },
+	'locationshowncity' => { 376 => [\'LocationShown','LocationShownCity'] },
+	'locationshowncountrycode' => { 376 => [\'LocationShown','LocationShownCountryCode'] },
+	'locationshowncountryname' => { 376 => [\'LocationShown','LocationShownCountryName'] },
+	'locationshownprovincestate' => { 376 => [\'LocationShown','LocationShownProvinceState'] },
+	'locationshownsublocation' => { 376 => [\'LocationShown','LocationShownSublocation'] },
+	'locationshownworldregion' => { 376 => [\'LocationShown','LocationShownWorldRegion'] },
+	'lockmicrophonebutton' => { 68 => 0x709 },
+	'logcomment' => { 389 => 'logComment' },
+	'longexposurenoisereduction' => { 68 => 0x201, 69 => 0x1, 70 => 0x2, 71 => 0x1, 72 => 0x1, 73 => 0x2, 74 => 0x1, 250 => 0x49, 316 => 0x2b, 317 => 0x25, 318 => 0x25, 328 => 0x2008, 331 => 0x11, 348 => 0x44 },
+	'longexposurenoisereduction2' => { 46 => 0x8 },
+	'loop' => { 389 => 'loop' },
+	'lowestbiostratigraphiczone' => { 94 => [\'GeologicalContext','GeologicalContextLowestBiostratigraphicZone'] },
+	'luminanceadjustmentaqua' => { 366 => 'LuminanceAdjustmentAqua' },
+	'luminanceadjustmentblue' => { 366 => 'LuminanceAdjustmentBlue' },
+	'luminanceadjustmentgreen' => { 366 => 'LuminanceAdjustmentGreen' },
+	'luminanceadjustmentmagenta' => { 366 => 'LuminanceAdjustmentMagenta' },
+	'luminanceadjustmentorange' => { 366 => 'LuminanceAdjustmentOrange' },
+	'luminanceadjustmentpurple' => { 366 => 'LuminanceAdjustmentPurple' },
+	'luminanceadjustmentred' => { 366 => 'LuminanceAdjustmentRed' },
+	'luminanceadjustmentyellow' => { 366 => 'LuminanceAdjustmentYellow' },
+	'luminancecurvelimits' => { 86 => 0x150 },
+	'luminancecurvepoints' => { 86 => 0x126 },
+	'luminancenoisereduction' => { 87 => 0x5f, 311 => 0x1b },
+	'luminancenoisereductioncontrast' => { 366 => 'LuminanceNoiseReductionContrast' },
+	'luminancenoisereductiondetail' => { 366 => 'LuminanceNoiseReductionDetail' },
+	'luminancenr_tiff_jpeg' => { 87 => 0x6d },
+	'luminancesmoothing' => { 366 => 'LuminanceSmoothing' },
+	'lvshootingareadisplay' => { 68 => 0x40b },
+	'lyrics' => { 389 => 'lyrics' },
+	'm16cversion' => { 246 => 0x333 },
+	'macro' => { 100 => 0x1020, 101 => 0x202, 236 => 0x202, 302 => 0x21, 310 => 0x202, 328 => 0xb040 },
+	'macroled' => { 234 => 0x120a },
+	'macromagnification' => { 5 => 0x1b, 9 => 0x1b, 12 => 0x1b, 13 => 0x1b, 17 => 0x1b, 18 => 0x1b, 46 => 0x10 },
+	'macromode' => { 29 => 0x1, 147 => 0xb, 231 => 0x300, 250 => 0x1c, 303 => 0x1009 },
+	'magicfilter' => { 231 => 0x52c },
+	'magnifiedview' => { 70 => 0x11, 72 => 0x9 },
+	'maindialexposurecomp' => { 228 => '0.6' },
+	'make' => { 82 => 0x0, 95 => 0x10f, 125 => 'Make', 242 => 'Make', 254 => 0x10f, 385 => 'Make' },
+	'makernote' => { 370 => 'MakerNote' },
+	'makernoteapple' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotecanon' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotecasio' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotecasio2' => { 93 => 'MakN', 95 => 0x927c },
+	'makernoteflir' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotefujifilm' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotege' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotege2' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotehasselblad' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotehp' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotehp2' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotehp4' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotehp6' => { 93 => 'MakN', 95 => 0x927c },
+	'makernoteisl' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotejvc' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotejvctext' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotekodak10' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotekodak1a' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotekodak1b' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotekodak2' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotekodak3' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotekodak4' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotekodak5' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotekodak6a' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotekodak6b' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotekodak7' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotekodak8a' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotekodak8b' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotekodak8c' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotekodak9' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotekodakunknown' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotekyocera' => { 93 => 'MakN', 95 => 0x927c },
+	'makernoteleica' => { 93 => 'MakN', 95 => 0x927c },
+	'makernoteleica2' => { 93 => 'MakN', 95 => 0x927c },
+	'makernoteleica3' => { 93 => 'MakN', 95 => 0x927c },
+	'makernoteleica4' => { 93 => 'MakN', 95 => 0x927c },
+	'makernoteleica5' => { 93 => 'MakN', 95 => 0x927c },
+	'makernoteleica6' => { 93 => 'MakN', 95 => 0x927c },
+	'makernoteminolta' => { 93 => 'MakN', 95 => 0x927c },
+	'makernoteminolta2' => { 93 => 'MakN', 95 => 0x927c },
+	'makernoteminolta3' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotenikon' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotenikon2' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotenikon3' => { 93 => 'MakN', 95 => 0x927c },
+	'makernoteoffset' => { 310 => 0xff },
+	'makernoteolympus' => { 93 => 'MakN', 95 => 0x927c },
+	'makernoteolympus2' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotepanasonic' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotepanasonic2' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotepentax' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotepentax2' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotepentax3' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotepentax4' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotepentax5' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotepentax6' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotephaseone' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotereconyx' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotericoh' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotericohtext' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotesafety' => { 95 => 0xc635 },
+	'makernotesamsung1a' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotesamsung1b' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotesamsung2' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotesanyo' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotesanyoc4' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotesanyopatch' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotesigma' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotesony' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotesony2' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotesony3' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotesony4' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotesony5' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotesonyericsson' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotesonysrf' => { 93 => 'MakN', 95 => 0x927c },
+	'makernotetype' => { 303 => 0x1 },
+	'makernoteunknown' => { 93 => 'MakN', 95 => 0x927c },
+	'makernoteunknownbinary' => { 93 => 'MakN', 95 => 0x927c },
+	'makernoteunknowntext' => { 93 => 'MakN', 95 => 0x927c },
+	'makernoteversion' => { 152 => 0x0, 181 => 0x1, 236 => 0x0, 250 => 0x8000, 306 => 0x0, 308 => 0x1, 311 => [0x1d,0x1f], 319 => 0x2000 },
+	'managedfrom' => { 390 => 'ManagedFrom' },
+	'managedfromalternatepaths' => { 390 => [\'ManagedFrom','ManagedFromAlternatePaths'] },
+	'managedfromdocumentid' => { 390 => [\'ManagedFrom','ManagedFromDocumentID'] },
+	'managedfromfilepath' => { 390 => [\'ManagedFrom','ManagedFromFilePath'] },
+	'managedfromfrompart' => { 390 => [\'ManagedFrom','ManagedFromFromPart'] },
+	'managedfrominstanceid' => { 390 => [\'ManagedFrom','ManagedFromInstanceID'] },
+	'managedfromlastmodifydate' => { 390 => [\'ManagedFrom','ManagedFromLastModifyDate'] },
+	'managedfrommanager' => { 390 => [\'ManagedFrom','ManagedFromManager'] },
+	'managedfrommanagervariant' => { 390 => [\'ManagedFrom','ManagedFromManagerVariant'] },
+	'managedfrommanageto' => { 390 => [\'ManagedFrom','ManagedFromManageTo'] },
+	'managedfrommanageui' => { 390 => [\'ManagedFrom','ManagedFromManageUI'] },
+	'managedfrommaskmarkers' => { 390 => [\'ManagedFrom','ManagedFromMaskMarkers'] },
+	'managedfromoriginaldocumentid' => { 390 => [\'ManagedFrom','ManagedFromOriginalDocumentID'] },
+	'managedfrompartmapping' => { 390 => [\'ManagedFrom','ManagedFromPartMapping'] },
+	'managedfromrenditionclass' => { 390 => [\'ManagedFrom','ManagedFromRenditionClass'] },
+	'managedfromrenditionparams' => { 390 => [\'ManagedFrom','ManagedFromRenditionParams'] },
+	'managedfromtopart' => { 390 => [\'ManagedFrom','ManagedFromToPart'] },
+	'managedfromversionid' => { 390 => [\'ManagedFrom','ManagedFromVersionID'] },
+	'manager' => { 390 => 'Manager' },
+	'managervariant' => { 390 => 'ManagerVariant' },
+	'manageto' => { 390 => 'ManageTo' },
+	'manageui' => { 390 => 'ManageUI' },
+	'manifest' => { 390 => 'Manifest' },
+	'manifestlinkform' => { 390 => [\'Manifest','ManifestLinkForm'] },
+	'manifestplacedresolutionunit' => { 390 => [\'Manifest','ManifestPlacedResolutionUnit'] },
+	'manifestplacedxresolution' => { 390 => [\'Manifest','ManifestPlacedXResolution'] },
+	'manifestplacedyresolution' => { 390 => [\'Manifest','ManifestPlacedYResolution'] },
+	'manifestreference' => { 390 => [\'Manifest','ManifestReference'] },
+	'manifestreferencealternatepaths' => { 390 => [\'Manifest','ManifestReferenceAlternatePaths'] },
+	'manifestreferencedocumentid' => { 390 => [\'Manifest','ManifestReferenceDocumentID'] },
+	'manifestreferencefilepath' => { 390 => [\'Manifest','ManifestReferenceFilePath'] },
+	'manifestreferencefrompart' => { 390 => [\'Manifest','ManifestReferenceFromPart'] },
+	'manifestreferenceinstanceid' => { 390 => [\'Manifest','ManifestReferenceInstanceID'] },
+	'manifestreferencelastmodifydate' => { 390 => [\'Manifest','ManifestReferenceLastModifyDate'] },
+	'manifestreferencemanager' => { 390 => [\'Manifest','ManifestReferenceManager'] },
+	'manifestreferencemanagervariant' => { 390 => [\'Manifest','ManifestReferenceManagerVariant'] },
+	'manifestreferencemanageto' => { 390 => [\'Manifest','ManifestReferenceManageTo'] },
+	'manifestreferencemanageui' => { 390 => [\'Manifest','ManifestReferenceManageUI'] },
+	'manifestreferencemaskmarkers' => { 390 => [\'Manifest','ManifestReferenceMaskMarkers'] },
+	'manifestreferenceoriginaldocumentid' => { 390 => [\'Manifest','ManifestReferenceOriginalDocumentID'] },
+	'manifestreferencepartmapping' => { 390 => [\'Manifest','ManifestReferencePartMapping'] },
+	'manifestreferencerenditionclass' => { 390 => [\'Manifest','ManifestReferenceRenditionClass'] },
+	'manifestreferencerenditionparams' => { 390 => [\'Manifest','ManifestReferenceRenditionParams'] },
+	'manifestreferencetopart' => { 390 => [\'Manifest','ManifestReferenceToPart'] },
+	'manifestreferenceversionid' => { 390 => [\'Manifest','ManifestReferenceVersionID'] },
+	'manometerpressure' => { 231 => 0x900, 250 => 0x86 },
+	'manometerreading' => { 231 => 0x901 },
+	'manualafpointselectpattern' => { 68 => 0x513 },
+	'manualflash' => { 234 => 0x1209 },
+	'manualflashoutput' => { 29 => 0x29, 222 => '8.2', 223 => '22.2', 224 => '23.1', 225 => '23.2', 226 => '16.2', 227 => '23.2', 228 => '8.2', 229 => '23.2', 230 => '24.2', 303 => 0x100c },
+	'manualflashstrength' => { 231 => 0x406 },
+	'manualfocusdistance' => { 181 => 0x85, 236 => 0x100c, 310 => 0x223 },
+	'manualtv' => { 67 => 0x5, 68 => 0x705 },
+	'manufacturedate' => { 261 => 0x1 },
+	'manufacturedate1' => { 305 => 0x4 },
+	'manufacturedate2' => { 305 => 0x5 },
+	'marked' => { 377 => 'Marked', 393 => 'Marked' },
+	'markers' => { 389 => 'markers' },
+	'markerscomment' => { 389 => [\'markers','markersComment'] },
+	'markerscuepointparams' => { 389 => [\'markers','markersCuePointParams'] },
+	'markerscuepointparamskey' => { 389 => [\'markers','markersCuePointParamsKey'] },
+	'markerscuepointparamsvalue' => { 389 => [\'markers','markersCuePointParamsValue'] },
+	'markerscuepointtype' => { 389 => [\'markers','markersCuePointType'] },
+	'markersduration' => { 389 => [\'markers','markersDuration'] },
+	'markerslocation' => { 389 => [\'markers','markersLocation'] },
+	'markersname' => { 389 => [\'markers','markersName'] },
+	'markersprobability' => { 389 => [\'markers','markersProbability'] },
+	'markersspeaker' => { 389 => [\'markers','markersSpeaker'] },
+	'markersstarttime' => { 389 => [\'markers','markersStartTime'] },
+	'markerstarget' => { 389 => [\'markers','markersTarget'] },
+	'markerstype' => { 389 => [\'markers','markersType'] },
+	'maskedareas' => { 95 => 0xc68e },
+	'masterdocumentid' => { 103 => 0xb9 },
+	'mastergain' => { 186 => 0x50 },
+	'maxaperture' => { 29 => 0x1a, 115 => 0x6103, 132 => 'MaxAperture', 147 => 0x17, 153 => 0x49c5, 232 => 0x20a, 272 => '14.1', 341 => 0x0 },
+	'maxapertureatmaxfocal' => { 100 => 0x1407, 132 => 'MaxApertureAtMaxFocal', 176 => 0xb, 177 => 0x10, 178 => 0x11, 232 => 0x206 },
+	'maxapertureatminfocal' => { 100 => 0x1406, 176 => 0xa, 177 => 0xf, 178 => 0x10, 232 => 0x205 },
+	'maxaperturevalue' => { 95 => 0x9205, 370 => 'MaxApertureValue' },
+	'maxavailheight' => { 376 => 'MaxAvailHeight' },
+	'maxavailwidth' => { 376 => 'MaxAvailWidth' },
+	'maxcontinuousrelease' => { 221 => 0xb, 226 => 0xc, 227 => 0xb },
+	'maxfaces' => { 235 => 0x1202 },
+	'maxfocallength' => { 5 => 0xe6, 6 => 0x10, 7 => 0x1ab, 8 => 0x13, 9 => 0x115, 10 => 0x13, 11 => 0x153, 12 => 0xda, 14 => 0xfa, 15 => 0xee, 16 => 0x103, 17 => 0x95, 18 => 0xea, 19 => 0x157, 20 => 0xee, 21 => 0xec, 22 => 0x12b, 23 => 0x165, 24 => 0x16a, 25 => 0x116, 29 => 0x17, 100 => 0x1405, 132 => 'MaxFocalLength', 176 => 0x9, 177 => 0xe, 178 => 0xf, 232 => 0x208, 338 => 0x127c, 339 => 0x1138, 340 => 0x330 },
+	'maximumdensityrange' => { 105 => 0x8c },
+	'maxpagesize' => { 394 => 'MaxPageSize' },
+	'maxpagesizeh' => { 394 => [\'MaxPageSize','MaxPageSizeH'] },
+	'maxpagesizeunit' => { 394 => [\'MaxPageSize','MaxPageSizeUnit'] },
+	'maxpagesizew' => { 394 => [\'MaxPageSize','MaxPageSizeW'] },
+	'maxsamplevalue' => { 95 => 0x119 },
+	'maxstorage' => { 384 => 'maxstorage' },
+	'mb-d10batteries' => { 221 => '12.6' },
+	'mb-d10batterytype' => { 226 => '13.3' },
+	'mb-d11batterytype' => { 227 => '2.3' },
+	'mb-d80batteries' => { 228 => '6.5' },
+	'mb-d80batterytype' => { 230 => '3.2' },
+	'mcuversion' => { 176 => 0xc, 177 => 0x11, 178 => 0x12 },
+	'md5digest' => { 133 => 'zmd5' },
+	'measuredev' => { 25 => 0x9, 62 => 0x3, 81 => 0x1814, 125 => 'MeasuredEV' },
+	'measuredev2' => { 11 => 0x8, 25 => 0x8, 62 => 0x17 },
+	'measuredev3' => { 11 => 0x9 },
+	'measuredlv' => { 153 => 0x690, 246 => 0x312, 252 => 0x3407 },
+	'measuredrggb' => { 52 => 0x1 },
+	'measuredrggbdata' => { 35 => 0x287 },
+	'measurementaccuracy' => { 94 => [\'MeasurementOrFact','MeasurementOrFactMeasurementAccuracy'] },
+	'measurementdeterminedby' => { 94 => [\'MeasurementOrFact','MeasurementOrFactMeasurementDeterminedBy'] },
+	'measurementdetermineddate' => { 94 => [\'MeasurementOrFact','MeasurementOrFactMeasurementDeterminedDate'] },
+	'measurementid' => { 94 => [\'MeasurementOrFact','MeasurementOrFactMeasurementID'] },
+	'measurementmethod' => { 94 => [\'MeasurementOrFact','MeasurementOrFactMeasurementMethod'] },
+	'measurementorfact' => { 94 => 'MeasurementOrFact' },
+	'measurementremarks' => { 94 => [\'MeasurementOrFact','MeasurementOrFactMeasurementRemarks'] },
+	'measurementtype' => { 94 => [\'MeasurementOrFact','MeasurementOrFactMeasurementType'] },
+	'measurementunit' => { 94 => [\'MeasurementOrFact','MeasurementOrFactMeasurementUnit'] },
+	'measurementvalue' => { 94 => [\'MeasurementOrFact','MeasurementOrFactMeasurementValue'] },
+	'mediaconstraints' => { 379 => 'MediaConstraints' },
+	'mediacreatedate' => { 295 => 0x1 },
+	'mediamodifydate' => { 295 => 0x2 },
+	'mediasummarycode' => { 379 => 'MediaSummaryCode' },
+	'memorycardconfiguration' => { 322 => 0x16 },
+	'menubuttondisplayposition' => { 66 => 0xb, 69 => 0xa, 70 => 0xb, 73 => 0xb },
+	'menubuttonreturn' => { 74 => 0xb },
+	'menumonitorofftime' => { 226 => '8.2', 227 => '21.1', 230 => '22.1' },
+	'metadatadate' => { 387 => 'MetadataDate' },
+	'metadatamoddate' => { 389 => 'metadataModDate' },
+	'metaversion' => { 333 => 0x34 },
+	'metering' => { 222 => '6.1' },
+	'meteringmode' => { 29 => 0x11, 95 => 0x9207, 111 => 0x1c, 147 => 0x7, 148 => 0x25, 150 => 0x12, 231 => 0x202, 281 => 0x17, 311 => 0x9, 316 => 0x15, 317 => 0x13, 318 => 0x7, 331 => 0x3, 334 => 0x1174, 335 => 0x1178, 336 => 0x1154, 337 => 0x11d0, 338 => 0x11ac, 339 => 0x1064, 340 => 0x25c, 370 => 'MeteringMode' },
+	'meteringmode2' => { 262 => '2.1' },
+	'meteringmode3' => { 262 => '16.1' },
+	'meteringoffscaleindicator' => { 150 => 0x53 },
+	'meteringtime' => { 221 => '22.2', 222 => '3.2', 223 => '17.1', 224 => '18.1', 226 => '7.3', 227 => '18.1', 228 => '3.2', 230 => '19.1' },
+	'mieversion' => { 133 => '0Vers' },
+	'minaperture' => { 29 => 0x1b, 132 => 'MinAperture', 272 => '0.2', 341 => 0x1 },
+	'minfocallength' => { 5 => 0xe4, 6 => 0xe, 7 => 0x1a9, 8 => 0x11, 9 => 0x113, 10 => 0x11, 11 => 0x151, 12 => 0xd8, 14 => 0xf8, 15 => 0xec, 16 => 0x101, 17 => 0x93, 18 => 0xe8, 19 => 0x155, 20 => 0xec, 21 => 0xea, 22 => 0x129, 23 => 0x163, 24 => 0x168, 25 => 0x114, 29 => 0x18, 100 => 0x1404, 132 => 'MinFocalLength', 176 => 0x8, 177 => 0xd, 178 => 0xe, 232 => 0x207, 338 => 0x127a, 339 => 0x1136, 340 => 0x32e },
+	'minoltadate' => { 147 => 0x15 },
+	'minoltaimagesize' => { 147 => 0x4, 148 => 0xc, 149 => 0x2, 152 => 0x103 },
+	'minoltamodelid' => { 147 => 0x25 },
+	'minoltaquality' => { 147 => 0x5, 148 => 0xd, 149 => 0x3, 152 => [0x102,0x103] },
+	'minoltatime' => { 147 => 0x16 },
+	'minormodelagedisclosure' => { 379 => 'MinorModelAgeDisclosure' },
+	'minsamplevalue' => { 95 => 0x118 },
+	'mirrorlockup' => { 66 => 0xc, 67 => 0xc, 68 => 0x60f, 69 => 0xb, 70 => 0xc, 71 => 0x6, 72 => 0x6, 73 => 0xc, 74 => 0x3 },
+	'mobilecountrycode' => { 365 => 'mcc' },
+	'mobilenetworkcode' => { 365 => 'mnc' },
+	'moddate' => { 242 => 'modify-date', 377 => 'ModDate' },
+	'modedialposition' => { 322 => 0x14 },
+	'model' => { 82 => 0x6, 95 => 0x110, 125 => 'Model', 242 => 'Model', 254 => 0x110, 385 => 'Model' },
+	'modelage' => { 376 => 'ModelAge' },
+	'modelingflash' => { 221 => '21.4', 226 => '26.4', 227 => '30.2', 228 => '7.4', 229 => '30.1', 230 => '31.3' },
+	'modelreleaseid' => { 379 => 'ModelReleaseID' },
+	'modelreleasestatus' => { 379 => 'ModelReleaseStatus' },
+	'modelreleaseyear' => { 342 => 0x52, 343 => 0x46 },
+	'modificationdate' => { 380 => 'modificationDate' },
+	'modifiedcolortemp' => { 53 => 0x9 },
+	'modifieddigitalgain' => { 53 => 0xb },
+	'modifiedparamflag' => { 47 => 0x1 },
+	'modifiedpicturestyle' => { 53 => 0xa },
+	'modifiedsaturation' => { 231 => 0x504 },
+	'modifiedsensorbluelevel' => { 53 => 0x5 },
+	'modifiedsensorredlevel' => { 53 => 0x4 },
+	'modifiedsharpness' => { 53 => 0x2 },
+	'modifiedsharpnessfreq' => { 53 => 0x3 },
+	'modifiedtonecurve' => { 53 => 0x1 },
+	'modifiedwhitebalance' => { 53 => 0x8 },
+	'modifiedwhitebalanceblue' => { 53 => 0x7 },
+	'modifiedwhitebalancered' => { 53 => 0x6 },
+	'modifydate' => { 95 => 0x132, 126 => 'ModifyDate', 240 => 'ModDate', 241 => 'tIME', 294 => 'ModDate', 296 => 0x2, 387 => 'ModifyDate' },
+	'moirefilter' => { 95 => 0xfe58, 366 => 'MoireFilter' },
+	'monitordisplayoff' => { 150 => 0x4c },
+	'monitorofftime' => { 221 => '18.2', 222 => '3.1', 228 => '3.1' },
+	'monochromecontrast' => { 87 => 0x3c },
+	'monochromefiltereffect' => { 87 => 0x3a, 281 => 0x73 },
+	'monochromelinear' => { 87 => 0x3d },
+	'monochromeoutputhighlightpoint' => { 87 => 0x41 },
+	'monochromeoutputshadowpoint' => { 87 => 0x42 },
+	'monochromerawhighlight' => { 87 => 0x7a },
+	'monochromerawhighlightpoint' => { 87 => 0x3f },
+	'monochromerawshadow' => { 87 => 0x83 },
+	'monochromerawshadowpoint' => { 87 => 0x40 },
+	'monochromesharpness' => { 87 => 0x3e },
+	'monochrometoning' => { 281 => 0x74 },
+	'monochrometoningeffect' => { 87 => 0x3b },
+	'monochromeunsharpmaskfineness' => { 87 => 0xb2 },
+	'monochromeunsharpmaskstrength' => { 87 => 0xb0 },
+	'monochromeunsharpmaskthreshold' => { 87 => 0xb4 },
+	'monthdaycreated' => { 111 => 0x12, 120 => 0xe },
+	'moonphase' => { 299 => 0x12 },
+	'morepermissions' => { 364 => 'morePermissions' },
+	'motionsensitivity' => { 299 => 0x29 },
+	'multiburstimageheight' => { 328 => 0x1002 },
+	'multiburstimagewidth' => { 328 => 0x1001 },
+	'multiburstmode' => { 328 => 0x1000 },
+	'multicontrollerwhilemetering' => { 68 => 0x517 },
+	'multiexposureautogain' => { 182 => 0x3 },
+	'multiexposuremode' => { 182 => 0x1 },
+	'multiexposureshots' => { 182 => 0x2 },
+	'multiframenoisereduction' => { 318 => 0x35, 328 => 0x200b, 331 => 0x15 },
+	'multifunctionlock' => { 68 => 0x70f },
+	'multipleexposuremode' => { 235 => 0x101c },
+	'multipleexposureset' => { 262 => '10.1' },
+	'multisample' => { 186 => 0x40 },
+	'multiselector' => { 221 => '9.4', 226 => '27.4' },
+	'multiselectorliveview' => { 221 => '4.3' },
+	'multiselectorplaybackmode' => { 221 => ['13.5','9.2'], 226 => '27.2' },
+	'multiselectorshootmode' => { 221 => '9.1', 226 => '27.1' },
+	'mycolormode' => { 55 => 0x2 },
+	'nativedigest' => { 370 => 'NativeDigest', 385 => 'NativeDigest' },
+	'ncdfileinfo' => { 109 => 0x414 },
+	'ndfilter' => { 62 => 0x1c, 231 => 0x204, 303 => 0x1019 },
+	'nefbitdepth' => { 181 => 0xe22 },
+	'nefcompression' => { 181 => 0x93 },
+	'neflinearizationtable' => { 181 => 0x96 },
+	'neutraldensityfilter' => { 281 => 0x88 },
+	'neutraloutputhighlightpoint' => { 87 => 0x2f },
+	'neutraloutputshadowpoint' => { 87 => 0x30 },
+	'neutralrawcolortone' => { 87 => 0x28 },
+	'neutralrawcontrast' => { 87 => 0x2a },
+	'neutralrawhighlight' => { 87 => 0x78 },
+	'neutralrawhighlightpoint' => { 87 => 0x2d },
+	'neutralrawlinear' => { 87 => 0x2b },
+	'neutralrawsaturation' => { 87 => 0x29 },
+	'neutralrawshadow' => { 87 => 0x81 },
+	'neutralrawshadowpoint' => { 87 => 0x2e },
+	'neutralrawsharpness' => { 87 => 0x2c },
+	'neutralunsharpmaskfineness' => { 87 => 0xa6 },
+	'neutralunsharpmaskthreshold' => { 87 => 0xa8 },
+	'neutraunsharpmaskstrength' => { 87 => 0xa4 },
+	'newrawimagedigest' => { 95 => 0xc7a7 },
+	'newsphotoversion' => { 105 => 0x0 },
+	'nickname' => { 387 => 'Nickname' },
+	'nikoncapturedata' => { 181 => 0xe01 },
+	'nikoncaptureeditversions' => { 181 => 0xe13 },
+	'nikoncaptureoutput' => { 181 => 0xe1e },
+	'nikoncaptureversion' => { 181 => 0xe09 },
+	'nikoniccprofile' => { 181 => 0xe1d },
+	'nikonimagesize' => { 193 => '723.1', 194 => '732.1', 201 => 0x2c4 },
+	'noisefilter' => { 231 => 0x527 },
+	'noiseprofile' => { 95 => 0xc761 },
+	'noisereduction' => { 100 => 0x100b, 148 => 0xb0, 149 => 0x60, 150 => 0x3f, 181 => 0x95, 214 => 0x753dcbc0, 215 => 0x17, 231 => 0x50a, 236 => 0x103a, 250 => 0x2d, 281 => 0x49, 303 => 0x100f, 305 => 0x2a },
+	'noisereduction2' => { 235 => 0x1010 },
+	'noisereductionapplied' => { 95 => 0xc6f7 },
+	'noisereductionintensity' => { 215 => 0x9 },
+	'noisereductionmethod' => { 215 => 0x11 },
+	'noisereductionmode' => { 352 => 0x801e },
+	'noisereductionsharpness' => { 215 => 0xd },
+	'noisereductionvalue' => { 352 => 0x8027 },
+	'nomemorycard' => { 221 => '22.1', 222 => '0.3', 223 => '2.4', 224 => '3.2', 225 => '3.2', 226 => '33.7', 227 => '3.2', 228 => '0.3', 230 => '4.5' },
+	'nominalmaxaperture' => { 272 => 0xa },
+	'nominalminaperture' => { 272 => '10.1' },
+	'normalwhitelevel' => { 36 => [0x2b8,0x2cf,0x2d3], 38 => 0x1e3, 39 => 0x1fc },
+	'notes' => { 353 => 'Notes', 361 => 'notes' },
+	'npages' => { 394 => 'NPages' },
+	'nrwdata' => { 181 => 0x14 },
+	'nullrecord' => { 81 => 0x0 },
+	'number' => { 380 => 'number' },
+	'numberofbeats' => { 389 => 'numberOfBeats' },
+	'numberoffocuspoints' => { 225 => '0.2', 227 => '0.3' },
+	'numfacepositions' => { 244 => 0x0 },
+	'numindexentries' => { 105 => 0x54 },
+	'object' => { 380 => 'object' },
+	'objectattributereference' => { 103 => 0x4 },
+	'objectcycle' => { 103 => 0x4b },
+	'objectdistance' => { 90 => 0x6, 91 => 0x2022 },
+	'objectname' => { 103 => 0x5 },
+	'objectpreviewdata' => { 103 => 0xca },
+	'objectpreviewfileformat' => { 103 => 0xc8 },
+	'objectpreviewfileversion' => { 103 => 0xc9 },
+	'objecttypereference' => { 103 => 0x3 },
+	'occurrence' => { 94 => 'Occurrence' },
+	'occurrenceassociatedmedia' => { 94 => [\'Occurrence','OccurrenceAssociatedMedia'] },
+	'occurrenceassociatedoccurrences' => { 94 => [\'Occurrence','OccurrenceAssociatedOccurrences'] },
+	'occurrenceassociatedreferences' => { 94 => [\'Occurrence','OccurrenceAssociatedReferences'] },
+	'occurrenceassociatedsequences' => { 94 => [\'Occurrence','OccurrenceAssociatedSequences'] },
+	'occurrenceassociatedtaxa' => { 94 => [\'Occurrence','OccurrenceAssociatedTaxa'] },
+	'occurrencebehavior' => { 94 => [\'Occurrence','OccurrenceBehavior'] },
+	'occurrencecatalognumber' => { 94 => [\'Occurrence','OccurrenceCatalogNumber'] },
+	'occurrencedetails' => { 94 => [\'Occurrence','OccurrenceOccurrenceDetails'] },
+	'occurrencedisposition' => { 94 => [\'Occurrence','OccurrenceDisposition'] },
+	'occurrenceestablishmentmeans' => { 94 => [\'Occurrence','OccurrenceEstablishmentMeans'] },
+	'occurrenceid' => { 94 => [\'Occurrence','OccurrenceOccurrenceID'] },
+	'occurrenceindividualcount' => { 94 => [\'Occurrence','OccurrenceIndividualCount'] },
+	'occurrenceindividualid' => { 94 => [\'Occurrence','OccurrenceIndividualID'] },
+	'occurrencelifestage' => { 94 => [\'Occurrence','OccurrenceLifeStage'] },
+	'occurrenceothercatalognumbers' => { 94 => [\'Occurrence','OccurrenceOtherCatalogNumbers'] },
+	'occurrencepreparations' => { 94 => [\'Occurrence','OccurrencePreparations'] },
+	'occurrencepreviousidentifications' => { 94 => [\'Occurrence','OccurrencePreviousIdentifications'] },
+	'occurrencerecordedby' => { 94 => [\'Occurrence','OccurrenceRecordedBy'] },
+	'occurrencerecordnumber' => { 94 => [\'Occurrence','OccurrenceRecordNumber'] },
+	'occurrenceremarks' => { 94 => [\'Occurrence','OccurrenceOccurrenceRemarks'] },
+	'occurrencereproductivecondition' => { 94 => [\'Occurrence','OccurrenceReproductiveCondition'] },
+	'occurrencesex' => { 94 => [\'Occurrence','OccurrenceSex'] },
+	'occurrencestatus' => { 94 => [\'Occurrence','OccurrenceOccurrenceStatus'] },
+	'oecfcolumns' => { 370 => [\'OECF','OECFColumns'] },
+	'oecfnames' => { 370 => [\'OECF','OECFNames'] },
+	'oecfrows' => { 370 => [\'OECF','OECFRows'] },
+	'oecfvalues' => { 370 => [\'OECF','OECFValues'] },
+	'offsetschema' => { 95 => 0xea1d },
+	'okbutton' => { 227 => '15.1', 230 => '16.1' },
+	'oldsubfiletype' => { 95 => 0xff },
+	'olympusimageheight' => { 236 => 0x102f },
+	'olympusimagewidth' => { 236 => 0x102e },
+	'onetouchwb' => { 236 => 0x302 },
+	'opticalzoom' => { 113 => 0xfa3d, 115 => [0x6006,0xf006], 116 => 0x1000, 117 => 0xf, 120 => 0x1e, 132 => 'OpticalZoom' },
+	'opticalzoomcode' => { 62 => 0xa },
+	'opticalzoommode' => { 250 => 0x34 },
+	'opticalzoomon' => { 310 => 0x219 },
+	'optionenddate' => { 382 => 'optionEndDate' },
+	'opto-electricconvfactor' => { 370 => 'OECF' },
+	'ordernumber' => { 100 => 0x8002 },
+	'organisationinimagecode' => { 376 => 'OrganisationInImageCode' },
+	'organisationinimagename' => { 376 => 'OrganisationInImageName' },
+	'organization' => { 380 => 'organization' },
+	'orientation' => { 95 => 0x112, 254 => 0x112, 385 => 'Orientation' },
+	'orientation2' => { 331 => 0x2e },
+	'orientationlinkedafpoint' => { 68 => 0x516 },
+	'originalbestqualitysize' => { 95 => 0xc792 },
+	'originaldecisiondata' => { 92 => 'OriginalDecisionData' },
+	'originaldecisiondataoffset' => { 51 => 0x83 },
+	'originaldefaultcropsize' => { 95 => 0xc793 },
+	'originaldefaultfinalsize' => { 95 => 0xc791 },
+	'originaldirectory' => { 248 => 0x408 },
+	'originaldocumentid' => { 390 => 'OriginalDocumentID' },
+	'originalfilename' => { 81 => 0x816, 109 => 0x3e9, 121 => 0x20, 248 => 0x407, 357 => 'OriginalFilename' },
+	'originalimageheight' => { 64 => 0xc, 99 => 0x1 },
+	'originalimagewidth' => { 64 => 0xb, 99 => 0x0 },
+	'originalrawfiledata' => { 95 => 0xc68c },
+	'originalrawfiledigest' => { 95 => 0xc71d },
+	'originalrawfilename' => { 95 => 0xc68b },
+	'originaltransmissionreference' => { 103 => 0x67 },
+	'originatingprogram' => { 103 => 0x41 },
+	'originplatform' => { 380 => 'originPlatform' },
+	'os' => { 368 => 'os' },
+	'otherconditions' => { 379 => 'OtherConditions' },
+	'otherconstraints' => { 379 => 'OtherConstraints' },
+	'otherimage' => { 92 => 'OtherImage' },
+	'otherimageinfo' => { 379 => 'OtherImageInfo' },
+	'otherimagelength' => { 95 => 0x202 },
+	'otherimagestart' => { 95 => 0x201 },
+	'otherlicensedocuments' => { 379 => 'OtherLicenseDocuments' },
+	'otherlicenseinfo' => { 379 => 'OtherLicenseInfo' },
+	'otherlicenserequirements' => { 379 => 'OtherLicenseRequirements' },
+	'outcue' => { 389 => 'outCue' },
+	'outcuescale' => { 389 => [\'outCue','outCueScale'] },
+	'outcuevalue' => { 389 => [\'outCue','outCueValue'] },
+	'outputimageheight' => { 160 => 0x3 },
+	'outputimagewidth' => { 160 => 0x2 },
+	'outputresolution' => { 160 => 0x4 },
+	'owner' => { 393 => 'Owner' },
+	'ownerid' => { 103 => 0xbc },
+	'ownername' => { 13 => 0x10f, 51 => 0x9, 81 => 0x810, 95 => [0xa430,0xfde8], 125 => 'OwnerName', 363 => 'OwnerName', 371 => 'CameraOwnerName' },
+	'padding' => { 95 => 0xea1c },
+	'pageimage' => { 387 => [\'PageInfo','PageInfoImage'] },
+	'pageimageformat' => { 387 => [\'PageInfo','PageInfoFormat'] },
+	'pageimageheight' => { 387 => [\'PageInfo','PageInfoHeight'] },
+	'pageimagepagenumber' => { 387 => [\'PageInfo','PageInfoPageNumber'] },
+	'pageimagewidth' => { 387 => [\'PageInfo','PageInfoWidth'] },
+	'pageinfo' => { 387 => 'PageInfo' },
+	'pagename' => { 95 => 0x11d },
+	'pagenumber' => { 95 => 0x129 },
+	'pagerange' => { 380 => 'pageRange' },
+	'paintbasedcorrectionmasks' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasks'] },
+	'paintbasedcorrections' => { 366 => 'PaintBasedCorrections' },
+	'paintcorrectionactive' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionActive'] },
+	'paintcorrectionamount' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionAmount'] },
+	'paintcorrectionbrightness' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalBrightness'] },
+	'paintcorrectionclarity' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalClarity'] },
+	'paintcorrectionclarity2012' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalClarity2012'] },
+	'paintcorrectioncontrast' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalContrast'] },
+	'paintcorrectioncontrast2012' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalContrast2012'] },
+	'paintcorrectiondefringe' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalDefringe'] },
+	'paintcorrectionexposure' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalExposure'] },
+	'paintcorrectionexposure2012' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalExposure2012'] },
+	'paintcorrectionhighlights2012' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalHighlights2012'] },
+	'paintcorrectionhue' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalToningHue'] },
+	'paintcorrectionluminancenoise' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalLuminanceNoise'] },
+	'paintcorrectionmaskalpha' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksAlpha'] },
+	'paintcorrectionmaskangle' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksAngle'] },
+	'paintcorrectionmaskbottom' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksBottom'] },
+	'paintcorrectionmaskcentervalue' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCenterValue'] },
+	'paintcorrectionmaskcenterweight' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCenterWeight'] },
+	'paintcorrectionmaskdabs' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksDabs'] },
+	'paintcorrectionmaskfeather' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksFeather'] },
+	'paintcorrectionmaskflipped' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksFlipped'] },
+	'paintcorrectionmaskflow' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksFlow'] },
+	'paintcorrectionmaskfullx' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksFullX'] },
+	'paintcorrectionmaskfully' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksFullY'] },
+	'paintcorrectionmaskleft' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksLeft'] },
+	'paintcorrectionmaskmidpoint' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMidpoint'] },
+	'paintcorrectionmaskperimetervalue' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksPerimeterValue'] },
+	'paintcorrectionmaskradius' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksRadius'] },
+	'paintcorrectionmaskright' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksRight'] },
+	'paintcorrectionmaskroundness' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksRoundness'] },
+	'paintcorrectionmasksizex' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksSizeX'] },
+	'paintcorrectionmasksizey' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksSizeY'] },
+	'paintcorrectionmasktop' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksTop'] },
+	'paintcorrectionmaskvalue' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMaskValue'] },
+	'paintcorrectionmaskversion' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksVersion'] },
+	'paintcorrectionmaskwhat' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksWhat'] },
+	'paintcorrectionmaskx' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksX'] },
+	'paintcorrectionmasky' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksY'] },
+	'paintcorrectionmaskzerox' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksZeroX'] },
+	'paintcorrectionmaskzeroy' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksZeroY'] },
+	'paintcorrectionmoire' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalMoire'] },
+	'paintcorrectionsaturation' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalSaturation','PaintBasedCorrectionsLocalToningSaturation'] },
+	'paintcorrectionshadows2012' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalShadows2012'] },
+	'paintcorrectionsharpness' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalSharpness'] },
+	'paintcorrectiontemperature' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalTemperature'] },
+	'paintcorrectiontint' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalTint'] },
+	'paintcorrectionwhat' => { 366 => [\'PaintBasedCorrections','PaintBasedCorrectionsWhat'] },
+	'panasonicexifversion' => { 250 => 0x26 },
+	'panasonicimageheight' => { 250 => 0x4c },
+	'panasonicimagewidth' => { 250 => 0x4b },
+	'panasonicrawversion' => { 254 => 0x1 },
+	'panasonictitle' => { 95 => 0xc6d2 },
+	'panasonictitle2' => { 95 => 0xc6d3 },
+	'panoramacropbottom' => { 332 => 0x7 },
+	'panoramacropleft' => { 332 => 0x4 },
+	'panoramacropright' => { 332 => 0x6 },
+	'panoramacroptop' => { 332 => 0x5 },
+	'panoramadirection' => { 58 => 0x5, 332 => 0x3 },
+	'panoramaframeheight' => { 332 => 0x9 },
+	'panoramaframenumber' => { 58 => 0x2 },
+	'panoramaframewidth' => { 332 => 0x8 },
+	'panoramafullheight' => { 332 => 0x2 },
+	'panoramafullwidth' => { 332 => 0x1 },
+	'panoramamode' => { 111 => 0x3c, 231 => 0x601 },
+	'panoramasize3d' => { 318 => 0x38 },
+	'panoramasourceheight' => { 332 => 0xb },
+	'panoramasourcewidth' => { 332 => 0xa },
+	'panoramicstitchcameramotion' => { 143 => 'PanoramicStitchCameraMotion', 144 => 0x1 },
+	'panoramicstitchmaptype' => { 143 => 'PanoramicStitchMapType', 144 => 0x2 },
+	'panoramicstitchphi0' => { 143 => 'PanoramicStitchPhi0', 144 => 0x5 },
+	'panoramicstitchphi1' => { 143 => 'PanoramicStitchPhi1', 144 => 0x6 },
+	'panoramicstitchtheta0' => { 143 => 'PanoramicStitchTheta0', 144 => 0x3 },
+	'panoramicstitchtheta1' => { 143 => 'PanoramicStitchTheta1', 144 => 0x4 },
+	'panoramicstitchversion' => { 144 => 0x0 },
+	'pantry' => { 390 => 'Pantry' },
+	'parallax' => { 100 => 0xb211 },
+	'parametricdarks' => { 366 => 'ParametricDarks' },
+	'parametrichighlights' => { 366 => 'ParametricHighlights' },
+	'parametrichighlightsplit' => { 366 => 'ParametricHighlightSplit' },
+	'parametriclights' => { 366 => 'ParametricLights' },
+	'parametricmidtonesplit' => { 366 => 'ParametricMidtoneSplit' },
+	'parametricshadows' => { 366 => 'ParametricShadows' },
+	'parametricshadowsplit' => { 366 => 'ParametricShadowSplit' },
+	'parentmeid' => { 357 => 'ParentMEID' },
+	'parentreference1' => { 374 => [\'TagStructure','TagStructureParentReference'] },
+	'parentreference2' => { 374 => [\'TagStructure','TagStructureSubLabelsParentReference'] },
+	'parentreference3' => { 374 => [\'TagStructure','TagStructureSubLabelsSubLabelsParentReference'] },
+	'parentreference4' => { 374 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsParentReference'] },
+	'parentreference5' => { 374 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsSubLabelsParentReference'] },
+	'parentreference6' => { 374 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsParentReference'] },
+	'partofcompilation' => { 389 => 'partOfCompilation' },
+	'patientbirthdate' => { 354 => 'PatientDOB' },
+	'patientid' => { 354 => 'PatientID' },
+	'patientname' => { 354 => 'PatientName' },
+	'patientsex' => { 354 => 'PatientSex' },
+	'pdfversion' => { 377 => 'PDFVersion' },
+	'pentaximagesize' => { 281 => 0x9 },
+	'pentaxmodelid' => { 261 => 0x0, 281 => 0x5 },
+	'pentaxmodeltype' => { 281 => 0x1 },
+	'pentaxversion' => { 281 => 0x0 },
+	'people' => { 355 => 'People', 359 => 'People' },
+	'perchannelblacklevel' => { 35 => 0xc4, 36 => [0x2b4,0x2cb,0x2cf], 38 => 0x1df, 39 => 0x1f8 },
+	'peripheralillumcentralradius' => { 352 => 0x8030 },
+	'peripheralillumcentralvalue' => { 352 => 0x8031 },
+	'peripheralillumination' => { 87 => 0x68 },
+	'peripheralilluminationon' => { 87 => 0x64 },
+	'peripheralillumperiphvalue' => { 352 => 0x8032 },
+	'peripherallighting' => { 64 => 0x2 },
+	'peripherallightingsetting' => { 65 => 0x5 },
+	'peripherallightingvalue' => { 64 => 0x6 },
+	'permissions' => { 382 => 'permissions' },
+	'permits' => { 364 => 'permits' },
+	'person' => { 380 => 'person' },
+	'personality' => { 357 => 'Personality' },
+	'personinimage' => { 376 => 'PersonInImage' },
+	'perspectiveaspect' => { 366 => 'PerspectiveAspect' },
+	'perspectivehorizontal' => { 366 => 'PerspectiveHorizontal' },
+	'perspectiverotate' => { 366 => 'PerspectiveRotate' },
+	'perspectivescale' => { 366 => 'PerspectiveScale' },
+	'perspectiveupright' => { 366 => 'PerspectiveUpright' },
+	'perspectivevertical' => { 366 => 'PerspectiveVertical' },
+	'pf0customfuncregistration' => { 76 => 0x1 },
+	'pf10retainprogramshift' => { 76 => 0xb },
+	'pf13drivepriority' => { 76 => 0xe },
+	'pf14disablefocussearch' => { 76 => 0xf },
+	'pf15disableafassistbeam' => { 76 => 0x10 },
+	'pf16autofocuspointshoot' => { 76 => 0x11 },
+	'pf17disableafpointsel' => { 76 => 0x12 },
+	'pf18enableautoafpointsel' => { 76 => 0x13 },
+	'pf19continuousshootspeed' => { 76 => 0x14 },
+	'pf19shootingspeedhigh' => { 75 => 0xa },
+	'pf19shootingspeedlow' => { 75 => 0x9 },
+	'pf1disableshootingmodes' => { 76 => 0x2 },
+	'pf1value' => { 75 => 0x1 },
+	'pf20limitcontinousshots' => { 76 => 0x15 },
+	'pf20maxcontinousshots' => { 75 => 0xb },
+	'pf21enablequietoperation' => { 76 => 0x16 },
+	'pf23felocktime' => { 75 => 0xd },
+	'pf23postreleasetime' => { 75 => 0xe },
+	'pf23settimerlengths' => { 76 => 0x18 },
+	'pf23shutterbuttontime' => { 75 => 0xc },
+	'pf24lightlcdduringbulb' => { 76 => 0x19 },
+	'pf25aemode' => { 75 => 0xf },
+	'pf25afmode' => { 75 => 0x12 },
+	'pf25afpointsel' => { 75 => 0x13 },
+	'pf25colormatrix' => { 75 => 0x17 },
+	'pf25defaultclearsettings' => { 76 => 0x1a },
+	'pf25drivemode' => { 75 => 0x11 },
+	'pf25imagesize' => { 75 => 0x14 },
+	'pf25meteringmode' => { 75 => 0x10 },
+	'pf25parameters' => { 75 => 0x16 },
+	'pf25wbmode' => { 75 => 0x15 },
+	'pf26shortenreleaselag' => { 76 => 0x1b },
+	'pf27reversedialrotation' => { 76 => 0x1c },
+	'pf27value' => { 75 => 0x18 },
+	'pf28noquickdialexpcomp' => { 76 => 0x1d },
+	'pf29quickdialswitchoff' => { 76 => 0x1e },
+	'pf2disablemeteringmodes' => { 76 => 0x3 },
+	'pf2value' => { 75 => 0x2 },
+	'pf30enlargementmode' => { 76 => 0x1f },
+	'pf31originaldecisiondata' => { 76 => 0x20 },
+	'pf3manualexposuremetering' => { 76 => 0x4 },
+	'pf3value' => { 75 => 0x3 },
+	'pf4exposuretimelimits' => { 76 => 0x5 },
+	'pf4exposuretimemax' => { 75 => 0x5 },
+	'pf4exposuretimemin' => { 75 => 0x4 },
+	'pf5aperturelimits' => { 76 => 0x6 },
+	'pf5aperturemax' => { 75 => 0x7 },
+	'pf5aperturemin' => { 75 => 0x6 },
+	'pf6presetshootingmodes' => { 76 => 0x7 },
+	'pf7bracketcontinuousshoot' => { 76 => 0x8 },
+	'pf8bracketshots' => { 75 => 0x8 },
+	'pf8setbracketshots' => { 76 => 0x9 },
+	'pf9changebracketsequence' => { 76 => 0xa },
+	'phasedetectaf' => { 158 => 0x6 },
+	'phonenumber' => { 126 => 'Phone' },
+	'photoeffect' => { 29 => 0x28 },
+	'photoeffecthistoryxml' => { 214 => 0xe9651831 },
+	'photoeffects' => { 214 => 0xab5eca5e },
+	'photoeffectsblue' => { 216 => 0x8 },
+	'photoeffectsgreen' => { 216 => 0x6 },
+	'photoeffectsred' => { 216 => 0x4 },
+	'photoeffectstype' => { 216 => 0x0 },
+	'photographicsensitivity' => { 371 => 'PhotographicSensitivity' },
+	'photoinfoplayback' => { 221 => '17.6', 226 => '33.6' },
+	'photometricinterpretation' => { 95 => 0x106, 385 => 'PhotometricInterpretation' },
+	'photoshopquality' => { 291 => 0x0 },
+	'photostyle' => { 250 => 0x89 },
+	'picklabel' => { 369 => 'PickLabel' },
+	'pictinfo' => { 310 => 0x208 },
+	'picturecontrol' => { 214 => 0xe2173c47 },
+	'picturecontrolactive' => { 217 => 0x0 },
+	'picturecontroladjust' => { 183 => 0x30 },
+	'picturecontrolbase' => { 183 => 0x18 },
+	'picturecontroldata' => { 181 => [0xbd,0x23] },
+	'picturecontrolmode' => { 217 => 0x13 },
+	'picturecontrolname' => { 183 => 0x4 },
+	'picturecontrolquickadjust' => { 183 => 0x31 },
+	'pictureeffect' => { 328 => 0x200e },
+	'pictureeffect2' => { 334 => 0x1163, 335 => 0x1167, 336 => 0x1143, 337 => 0x11bf, 338 => 0x119b, 339 => 0x1053, 340 => 0x24b, 348 => 0x46 },
+	'picturefinish' => { 148 => 0x71 },
+	'picturemode' => { 100 => 0x1031, 231 => 0x520, 281 => [0xb,0x33], 311 => 0x3d },
+	'picturemode2' => { 262 => 0x0 },
+	'picturemodebwfilter' => { 231 => 0x525 },
+	'picturemodecontrast' => { 231 => 0x523 },
+	'picturemodeeffect' => { 231 => 0x52d },
+	'picturemodehue' => { 231 => 0x522 },
+	'picturemodesaturation' => { 231 => 0x521 },
+	'picturemodesharpness' => { 231 => 0x524 },
+	'picturemodetone' => { 231 => 0x526 },
+	'picturestyle' => { 6 => [0x4b,0x51], 7 => 0xf4, 8 => 0x6c, 9 => 0x86, 10 => 0x73, 14 => 0xab, 15 => 0xa7, 16 => 0xb0, 17 => 0x6c, 18 => 0xa7, 19 => 0xf4, 20 => 0xb3, 22 => 0xf4, 23 => 0xfa, 60 => 0xa, 87 => 0x2 },
+	'picturewizard' => { 308 => 0x21 },
+	'picturewizardcolor' => { 307 => 0x1 },
+	'picturewizardcontrast' => { 307 => 0x4 },
+	'picturewizardmode' => { 307 => 0x0 },
+	'picturewizardsaturation' => { 307 => 0x2 },
+	'picturewizardsharpness' => { 307 => 0x3 },
+	'pitchangle' => { 250 => 0x91, 280 => 0x2 },
+	'planarconfiguration' => { 95 => 0x11c, 385 => 'PlanarConfiguration' },
+	'platenames' => { 394 => 'PlateNames' },
+	'playbackmenustime' => { 223 => '20.1', 224 => '21.1', 225 => '21.1' },
+	'playbackmonitorofftime' => { 226 => '8.1', 227 => '35.1', 230 => '21.1' },
+	'playdisplay' => { 150 => 0x4e },
+	'plusversion' => { 379 => 'Version' },
+	'pmversion' => { 290 => 'PMVersion' },
+	'pngwarning' => { 242 => 'Warning' },
+	'portraitoutputhighlightpoint' => { 87 => 0x1d },
+	'portraitoutputshadowpoint' => { 87 => 0x1e },
+	'portraitrawcolortone' => { 87 => 0x16 },
+	'portraitrawcontrast' => { 87 => 0x18 },
+	'portraitrawhighlight' => { 87 => 0x76 },
+	'portraitrawhighlightpoint' => { 87 => 0x1b },
+	'portraitrawlinear' => { 87 => 0x19 },
+	'portraitrawsaturation' => { 87 => 0x17 },
+	'portraitrawshadow' => { 87 => 0x7f },
+	'portraitrawshadowpoint' => { 87 => 0x1c },
+	'portraitrawsharpness' => { 87 => 0x1a },
+	'portraitrefiner' => { 91 => 0x302b },
+	'portraitunsharpmaskfineness' => { 87 => 0x9a },
+	'portraitunsharpmaskstrength' => { 87 => 0x98 },
+	'portraitunsharpmaskthreshold' => { 87 => 0x9c },
+	'poseheadingdegrees' => { 356 => 'PoseHeadingDegrees' },
+	'posepitchdegrees' => { 356 => 'PosePitchDegrees' },
+	'poserolldegrees' => { 356 => 'PoseRollDegrees' },
+	'postalcode' => { 130 => 'PostalCode' },
+	'postcropvignetteamount' => { 366 => 'PostCropVignetteAmount' },
+	'postcropvignettefeather' => { 366 => 'PostCropVignetteFeather' },
+	'postcropvignettehighlightcontrast' => { 366 => 'PostCropVignetteHighlightContrast' },
+	'postcropvignettemidpoint' => { 366 => 'PostCropVignetteMidpoint' },
+	'postcropvignetteroundness' => { 366 => 'PostCropVignetteRoundness' },
+	'postcropvignettestyle' => { 366 => 'PostCropVignetteStyle' },
+	'potentialface1position' => { 326 => 0xb },
+	'potentialface2position' => { 326 => 0x15 },
+	'potentialface3position' => { 326 => 0x1f },
+	'potentialface4position' => { 326 => 0x29 },
+	'potentialface5position' => { 326 => 0x33 },
+	'potentialface6position' => { 326 => 0x3d },
+	'potentialface7position' => { 326 => 0x47 },
+	'potentialface8position' => { 326 => 0x51 },
+	'powersource' => { 260 => '0.1' },
+	'poweruptime' => { 181 => 0xb6 },
+	'precaptureframes' => { 236 => 0x300 },
+	'predictor' => { 95 => 0x13d },
+	'preflashreturnstrength' => { 194 => 0x28a },
+	'prefs' => { 103 => 0xdd, 290 => 'Prefs' },
+	'preservedfilename' => { 390 => 'PreservedFileName' },
+	'presetwhitebalance' => { 150 => 0x24, 352 => 0x8002 },
+	'presetwhitebalanceadj' => { 352 => 0x8014 },
+	'previewapplicationname' => { 95 => 0xc716 },
+	'previewapplicationversion' => { 95 => 0xc717 },
+	'previewbutton' => { 221 => ['14.1','15.1'], 226 => '29.1', 227 => '14.1' },
+	'previewbuttonplusdials' => { 221 => ['14.2','15.2'], 226 => '31.2' },
+	'previewcolorspace' => { 95 => 0xc71a },
+	'previewcropbottom' => { 289 => 0xef },
+	'previewcropleft' => { 289 => 0xec },
+	'previewcropright' => { 289 => 0xee },
+	'previewcroptop' => { 289 => 0xed },
+	'previewdate' => { 297 => 0x0 },
+	'previewdatetime' => { 95 => 0xc71b },
+	'previewimage' => { 91 => 0x2000, 92 => 'PreviewImage', 96 => 'PreviewImage', 98 => 0x4, 135 => 'data', 152 => 0x81, 236 => 0x280, 249 => 0x300, 328 => 0x2001 },
+	'previewimageborders' => { 281 => 0x3e },
+	'previewimageheight' => { 59 => 0x4, 113 => 0xfa58 },
+	'previewimagelength' => { 59 => 0x2, 91 => 0x3, 95 => [0x117,0x202], 152 => 0x89, 184 => 0x202, 231 => 0x102, 236 => 0x1037, 281 => 0x3, 302 => 0x1e, 306 => 0x3, 311 => [0x1b,0x1d], 319 => 0x202 },
+	'previewimagename' => { 135 => '1Name' },
+	'previewimagesize' => { 91 => 0x2, 118 => 0x2, 135 => 'ImageSize', 281 => 0x2, 311 => [0x1c,0x1e], 328 => 0xb02c },
+	'previewimagestart' => { 59 => 0x5, 91 => 0x4, 95 => [0x111,0x201], 152 => 0x88, 184 => 0x201, 231 => 0x101, 236 => 0x1036, 281 => 0x4, 302 => 0x1c, 306 => 0x2, 311 => [0x1a,0x1c], 319 => 0x201 },
+	'previewimagetype' => { 135 => '0Type' },
+	'previewimagevalid' => { 231 => 0x100, 236 => 0x1035 },
+	'previewimagewidth' => { 59 => 0x3, 113 => 0xfa57 },
+	'previewquality' => { 59 => 0x1 },
+	'previewsettingsdigest' => { 95 => 0xc719 },
+	'previewsettingsname' => { 95 => 0xc718 },
+	'primaryafpoint' => { 158 => 0x7 },
+	'primarychromaticities' => { 95 => 0x13f, 385 => 'PrimaryChromaticities' },
+	'printim' => { 95 => 0xc4a5 },
+	'prioritysetupshutterrelease' => { 150 => 0x1d, 316 => 0x28 },
+	'privatertkinfo' => { 358 => 'privateRTKInfo' },
+	'processingsoftware' => { 95 => 0xb },
+	'processversion' => { 366 => 'ProcessVersion' },
+	'producer' => { 240 => 'Producer', 377 => 'Producer' },
+	'productid' => { 104 => 0x32 },
+	'productioncode' => { 261 => 0x2 },
+	'productorserviceconstraints' => { 379 => 'ProductOrServiceConstraints' },
+	'profilecalibrationsig' => { 95 => 0xc6f4 },
+	'profilecopyright' => { 95 => 0xc6fe },
+	'profileembedpolicy' => { 95 => 0xc6fd },
+	'profilehuesatmapdata1' => { 95 => 0xc6fa },
+	'profilehuesatmapdata2' => { 95 => 0xc6fb },
+	'profilehuesatmapdims' => { 95 => 0xc6f9 },
+	'profilehuesatmapencoding' => { 95 => 0xc7a3 },
+	'profilelooktabledata' => { 95 => 0xc726 },
+	'profilelooktabledims' => { 95 => 0xc725 },
+	'profilelooktableencoding' => { 95 => 0xc7a4 },
+	'profilename' => { 95 => 0xc6f8 },
+	'profiletonecurve' => { 95 => 0xc6fc },
+	'programiso' => { 250 => 0x3c },
+	'programline' => { 262 => '1.1' },
+	'programmode' => { 155 => 0x5 },
+	'programshift' => { 181 => 0xd },
+	'programversion' => { 103 => 0x46 },
+	'prohibits' => { 364 => 'prohibits' },
+	'projectiontype' => { 356 => 'ProjectionType' },
+	'projectname' => { 389 => 'projectName' },
+	'projectref' => { 389 => 'projectRef' },
+	'projectrefpath' => { 389 => [\'projectRef','projectRefPath'] },
+	'projectreftype' => { 389 => [\'projectRef','projectRefType'] },
+	'propertyreleaseid' => { 379 => 'PropertyReleaseID' },
+	'propertyreleasestatus' => { 379 => 'PropertyReleaseStatus' },
+	'province-state' => { 103 => 0x5f },
+	'publicationdate' => { 380 => 'publicationDate' },
+	'publicationname' => { 380 => 'publicationName' },
+	'publisher' => { 367 => 'publisher' },
+	'pulldown' => { 389 => 'pullDown' },
+	'quality' => { 0 => 0x1, 29 => 0x3, 90 => 0x2, 91 => 0x3002, 100 => 0x1000, 111 => 0x9, 181 => 0x4, 204 => 0x3, 236 => 0x201, 246 => 0x300, 281 => 0x8, 287 => 0x2, 311 => 0x16, 316 => 0x56, 317 => 0x56, 318 => 0xb, 328 => 0x102 },
+	'quality2' => { 334 => 0x1170, 335 => 0x1174, 336 => 0x1150, 338 => 0x11a8, 339 => 0x1060, 340 => 0x258, 342 => 0x29, 343 => 0x25, 344 => 0x2a },
+	'qualitymode' => { 91 => 0x8 },
+	'quantizationmethod' => { 105 => 0x78 },
+	'quickadjust' => { 217 => 0x2a },
+	'quickcontroldialinmeter' => { 68 => 0x703 },
+	'quickshot' => { 310 => 0x213 },
+	'rangefinder' => { 223 => '4.1', 224 => '5.1', 225 => '5.1' },
+	'rasterizedcaption' => { 103 => 0x7d },
+	'rating' => { 95 => 0x4746, 289 => 0xdf, 328 => 0x2002, 361 => 'rating', 368 => 'rating', 387 => 'Rating' },
+	'ratingpercent' => { 95 => 0x4749, 145 => 'Rating' },
+	'rawandjpgrecording' => { 66 => 0x8, 152 => 0x109, 262 => 0xd },
+	'rawbrightnessadj' => { 86 => 0x38 },
+	'rawcoloradj' => { 86 => 0x2e },
+	'rawcropbottom' => { 289 => 0xd4 },
+	'rawcropleft' => { 289 => 0xd1 },
+	'rawcropright' => { 289 => 0xd3 },
+	'rawcroptop' => { 289 => 0xd2 },
+	'rawcustomsaturation' => { 86 => 0x30 },
+	'rawcustomtone' => { 86 => 0x34 },
+	'rawdatauniqueid' => { 95 => 0xc65d },
+	'rawdepth' => { 154 => 0x10 },
+	'rawdevartfilter' => { 238 => 0x121 },
+	'rawdevautogradation' => { 238 => 0x119 },
+	'rawdevcolorspace' => { 237 => 0x108, 238 => 0x109 },
+	'rawdevcontrastvalue' => { 237 => 0x106, 238 => 0x105 },
+	'rawdeveditstatus' => { 237 => 0x10b },
+	'rawdevelopmentprocess' => { 281 => 0x62 },
+	'rawdevengine' => { 237 => 0x109, 238 => 0x10b },
+	'rawdevexposurebiasvalue' => { 237 => 0x100, 238 => 0x100 },
+	'rawdevgradation' => { 238 => 0x112 },
+	'rawdevgraypoint' => { 237 => 0x103, 238 => 0x104 },
+	'rawdevmemorycoloremphasis' => { 237 => 0x105, 238 => 0x108 },
+	'rawdevnoisereduction' => { 237 => 0x10a, 238 => 0x10a },
+	'rawdevpicturemode' => { 238 => 0x10c },
+	'rawdevpm_bwfilter' => { 238 => 0x110 },
+	'rawdevpmcontrast' => { 238 => 0x10e },
+	'rawdevpmnoisefilter' => { 238 => 0x120 },
+	'rawdevpmpicturetone' => { 238 => 0x111 },
+	'rawdevpmsaturation' => { 238 => 0x10d },
+	'rawdevpmsharpness' => { 238 => 0x10f },
+	'rawdevsaturation3' => { 238 => 0x113 },
+	'rawdevsaturationemphasis' => { 237 => 0x104, 238 => 0x107 },
+	'rawdevsettings' => { 237 => 0x10c },
+	'rawdevsharpnessvalue' => { 237 => 0x107, 238 => 0x106 },
+	'rawdevversion' => { 237 => 0x0, 238 => 0x0 },
+	'rawdevwbfineadjustment' => { 237 => 0x102, 238 => 0x103 },
+	'rawdevwhitebalance' => { 238 => 0x101 },
+	'rawdevwhitebalancevalue' => { 237 => 0x101, 238 => 0x102 },
+	'rawfile' => { 95 => 0xfe4c },
+	'rawfilename' => { 366 => 'RawFileName' },
+	'rawimagecenter' => { 181 => 0x99 },
+	'rawimagedigest' => { 95 => 0xc71c },
+	'rawimagesize' => { 281 => 0x39 },
+	'rawinfoversion' => { 239 => 0x0 },
+	'rawjpgheight' => { 83 => 0x4 },
+	'rawjpgquality' => { 46 => 0x6, 83 => 0x1 },
+	'rawjpgsize' => { 46 => 0x7, 83 => 0x2 },
+	'rawjpgwidth' => { 83 => 0x3 },
+	'rawmeasuredrggb' => { 34 => 0x26a, 36 => 0x280, 38 => 0x194, 39 => 0x1ad },
+	'rawrppused' => { 361 => 'rawrppused' },
+	'rawtopreviewgain' => { 95 => 0xc7a8 },
+	'reardisplay' => { 221 => '12.3' },
+	'recognizedface1age' => { 245 => 0x20 },
+	'recognizedface1name' => { 245 => 0x4 },
+	'recognizedface1position' => { 245 => 0x18 },
+	'recognizedface2age' => { 245 => 0x50 },
+	'recognizedface2name' => { 245 => 0x34 },
+	'recognizedface2position' => { 245 => 0x48 },
+	'recognizedface3age' => { 245 => 0x80 },
+	'recognizedface3name' => { 245 => 0x64 },
+	'recognizedface3position' => { 245 => 0x78 },
+	'recognizedfaceflags' => { 250 => 0x63 },
+	'recommendedexposureindex' => { 95 => 0x8832, 371 => 'RecommendedExposureIndex' },
+	'record' => { 94 => 'Record' },
+	'recordbasisofrecord' => { 94 => [\'Record','RecordBasisOfRecord'] },
+	'recordcollectioncode' => { 94 => [\'Record','RecordCollectionCode'] },
+	'recordcollectionid' => { 94 => [\'Record','RecordCollectionID'] },
+	'recorddatageneralizations' => { 94 => [\'Record','RecordDataGeneralizations'] },
+	'recorddatasetid' => { 94 => [\'Record','RecordDatasetID'] },
+	'recorddatasetname' => { 94 => [\'Record','RecordDatasetName'] },
+	'recorddisplay' => { 150 => 0x4d },
+	'recorddynamicproperties' => { 94 => [\'Record','RecordDynamicProperties'] },
+	'recordid' => { 81 => 0x1804 },
+	'recordinformationwithheld' => { 94 => [\'Record','RecordInformationWithheld'] },
+	'recordingformat' => { 303 => 0x1000 },
+	'recordingmode' => { 90 => 0x1, 287 => 0x1 },
+	'recordinstitutioncode' => { 94 => [\'Record','RecordInstitutionCode'] },
+	'recordinstitutionid' => { 94 => [\'Record','RecordInstitutionID'] },
+	'recordmode' => { 29 => 0x9, 91 => 0x3000 },
+	'recordownerinstitutioncode' => { 94 => [\'Record','RecordOwnerInstitutionCode'] },
+	'recordshutterrelease' => { 310 => 0x217 },
+	'redbalance' => { 165 => 0x270, 236 => 0x1017, 254 => 0x11, 281 => 0x1c },
+	'redcurvelimits' => { 86 => 0x18a },
+	'redcurvepoints' => { 86 => 0x160 },
+	'redeyecorrection' => { 218 => 0x0 },
+	'redeyeinfo' => { 366 => 'RedEyeInfo' },
+	'redeyereduction' => { 150 => 0x41, 318 => 0x28 },
+	'redhue' => { 366 => 'RedHue' },
+	'redsaturation' => { 366 => 'RedSaturation' },
+	'reductionmatrix1' => { 95 => 0xc625 },
+	'reductionmatrix2' => { 95 => 0xc626 },
+	'reelname' => { 95 => 0xc789 },
+	'reference1' => { 374 => [\'TagStructure','TagStructureReference'] },
+	'reference2' => { 374 => [\'TagStructure','TagStructureSubLabelsReference'] },
+	'reference3' => { 374 => [\'TagStructure','TagStructureSubLabelsSubLabelsReference'] },
+	'reference4' => { 374 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsReference'] },
+	'reference5' => { 374 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsSubLabelsReference'] },
+	'reference6' => { 374 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsReference'] },
+	'referenceblackwhite' => { 95 => 0x214, 385 => 'ReferenceBlackWhite' },
+	'referencedate' => { 103 => 0x2f },
+	'referencenumber' => { 103 => 0x32 },
+	'references' => { 126 => 'References' },
+	'referenceservice' => { 103 => 0x2d },
+	'regionappliedtodimensions' => { 141 => [\'Regions','RegionsAppliedToDimensions'] },
+	'regionappliedtodimensionsh' => { 141 => [\'Regions','RegionsAppliedToDimensionsH'] },
+	'regionappliedtodimensionsunit' => { 141 => [\'Regions','RegionsAppliedToDimensionsUnit'] },
+	'regionappliedtodimensionsw' => { 141 => [\'Regions','RegionsAppliedToDimensionsW'] },
+	'regionarea' => { 141 => [\'Regions','RegionsRegionListArea'] },
+	'regionaread' => { 141 => [\'Regions','RegionsRegionListAreaD'] },
+	'regionareah' => { 141 => [\'Regions','RegionsRegionListAreaH'] },
+	'regionareaunit' => { 141 => [\'Regions','RegionsRegionListAreaUnit'] },
+	'regionareaw' => { 141 => [\'Regions','RegionsRegionListAreaW'] },
+	'regionareax' => { 141 => [\'Regions','RegionsRegionListAreaX'] },
+	'regionareay' => { 141 => [\'Regions','RegionsRegionListAreaY'] },
+	'regionbarcodevalue' => { 141 => [\'Regions','RegionsRegionListBarCodeValue'] },
+	'regionconstraints' => { 379 => 'RegionConstraints' },
+	'regiondescription' => { 141 => [\'Regions','RegionsRegionListDescription'] },
+	'regionextensions' => { 141 => [\'Regions','RegionsRegionListExtensions'] },
+	'regionfocususage' => { 141 => [\'Regions','RegionsRegionListFocusUsage'] },
+	'regioninfo' => { 141 => 'Regions' },
+	'regioninfodateregionsvalid' => { 142 => [\'RegionInfo','RegionInfoDateRegionsValid'] },
+	'regioninfomp' => { 142 => 'RegionInfo' },
+	'regioninforegions' => { 142 => [\'RegionInfo','RegionInfoRegions'] },
+	'regionlist' => { 141 => [\'Regions','RegionsRegionList'] },
+	'regionname' => { 141 => [\'Regions','RegionsRegionListName'] },
+	'regionpersondisplayname' => { 142 => [\'RegionInfo','RegionInfoRegionsPersonDisplayName'] },
+	'regionpersonemaildigest' => { 142 => [\'RegionInfo','RegionInfoRegionsPersonEmailDigest'] },
+	'regionpersonliveidcid' => { 142 => [\'RegionInfo','RegionInfoRegionsPersonLiveIdCID'] },
+	'regionpersonsourceid' => { 142 => [\'RegionInfo','RegionInfoRegionsPersonSourceID'] },
+	'regionrectangle' => { 142 => [\'RegionInfo','RegionInfoRegionsRectangle'] },
+	'regionseealso' => { 141 => [\'Regions','RegionsRegionListSeeAlso'] },
+	'regiontype' => { 141 => [\'Regions','RegionsRegionListType'] },
+	'registryid' => { 376 => 'RegistryId' },
+	'registryitemid' => { 376 => [\'RegistryId','RegistryIdRegItemId'] },
+	'registryorganisationid' => { 376 => [\'RegistryId','RegistryIdRegOrgId'] },
+	'relatedaudiofile' => { 124 => 'data' },
+	'relatedaudiofilename' => { 124 => '1Name' },
+	'relatedaudiofiletype' => { 124 => '0Type' },
+	'relatedimagefileformat' => { 95 => 0x1000 },
+	'relatedimageheight' => { 95 => 0x1002 },
+	'relatedimagewidth' => { 95 => 0x1001 },
+	'relatedresourceid' => { 94 => [\'ResourceRelationship','ResourceRelationshipRelatedResourceID'] },
+	'relatedsoundfile' => { 95 => 0xa004, 370 => 'RelatedSoundFile' },
+	'relatedvideofile' => { 138 => 'data' },
+	'relatedvideofilename' => { 138 => '1Name' },
+	'relatedvideofiletype' => { 138 => '0Type' },
+	'relation' => { 367 => 'relation' },
+	'relationshipaccordingto' => { 94 => [\'ResourceRelationship','ResourceRelationshipRelationshipAccordingTo'] },
+	'relationshipestablisheddate' => { 94 => [\'ResourceRelationship','ResourceRelationshipRelationshipEstablishedDate'] },
+	'relationshipofresource' => { 94 => [\'ResourceRelationship','ResourceRelationshipRelationshipOfResource'] },
+	'relationshipremarks' => { 94 => [\'ResourceRelationship','ResourceRelationshipRelationshipRemarks'] },
+	'relativepeakaudiofilepath' => { 389 => 'relativePeakAudioFilePath' },
+	'relativetimestamp' => { 389 => 'relativeTimestamp' },
+	'relativetimestampscale' => { 389 => [\'relativeTimestamp','relativeTimestampScale'] },
+	'relativetimestampvalue' => { 389 => [\'relativeTimestamp','relativeTimestampValue'] },
+	'releasebuttontousedial' => { 221 => '17.8', 226 => '33.8', 227 => '17.6' },
+	'releasedate' => { 103 => 0x1e, 389 => 'releaseDate' },
+	'releasemode' => { 91 => 0x3001, 328 => 0xb049 },
+	'releasemode2' => { 334 => 0x112c, 335 => [0x112c,0x8], 336 => [0x1108,0x8], 337 => [0x1184,0x8], 338 => [0x1160,0x8], 339 => [0x4,0x1018], 340 => [0x4,0x210], 342 => 0x10, 343 => 0x10, 344 => 0x9, 348 => 0x34 },
+	'releasemode3' => { 334 => 0x1128, 335 => 0x1128, 336 => 0x1104, 337 => 0x1180, 338 => 0x115c, 339 => 0x1014, 340 => 0x20c },
+	'releasesetting' => { 81 => 0x1016 },
+	'releasetime' => { 103 => 0x23 },
+	'remoteonduration' => { 222 => '3.4', 223 => '17.2', 224 => '18.2', 225 => '18.2', 227 => '18.2', 228 => '4.3', 230 => '19.2' },
+	'renditionclass' => { 390 => 'RenditionClass' },
+	'renditionof' => { 390 => 'RenditionOf' },
+	'renditionofalternatepaths' => { 390 => [\'RenditionOf','RenditionOfAlternatePaths'] },
+	'renditionofdocumentid' => { 390 => [\'RenditionOf','RenditionOfDocumentID'] },
+	'renditionoffilepath' => { 390 => [\'RenditionOf','RenditionOfFilePath'] },
+	'renditionoffrompart' => { 390 => [\'RenditionOf','RenditionOfFromPart'] },
+	'renditionofinstanceid' => { 390 => [\'RenditionOf','RenditionOfInstanceID'] },
+	'renditionoflastmodifydate' => { 390 => [\'RenditionOf','RenditionOfLastModifyDate'] },
+	'renditionofmanager' => { 390 => [\'RenditionOf','RenditionOfManager'] },
+	'renditionofmanagervariant' => { 390 => [\'RenditionOf','RenditionOfManagerVariant'] },
+	'renditionofmanageto' => { 390 => [\'RenditionOf','RenditionOfManageTo'] },
+	'renditionofmanageui' => { 390 => [\'RenditionOf','RenditionOfManageUI'] },
+	'renditionofmaskmarkers' => { 390 => [\'RenditionOf','RenditionOfMaskMarkers'] },
+	'renditionoforiginaldocumentid' => { 390 => [\'RenditionOf','RenditionOfOriginalDocumentID'] },
+	'renditionofpartmapping' => { 390 => [\'RenditionOf','RenditionOfPartMapping'] },
+	'renditionofrenditionclass' => { 390 => [\'RenditionOf','RenditionOfRenditionClass'] },
+	'renditionofrenditionparams' => { 390 => [\'RenditionOf','RenditionOfRenditionParams'] },
+	'renditionoftopart' => { 390 => [\'RenditionOf','RenditionOfToPart'] },
+	'renditionofversionid' => { 390 => [\'RenditionOf','RenditionOfVersionID'] },
+	'renditionparams' => { 390 => 'RenditionParams' },
+	'repeatingflashcount' => { 170 => 0xd, 171 => 0xe, 172 => 0xe, 226 => '17.2', 227 => '24.2', 228 => '9.2', 229 => '24.2', 230 => '25.2' },
+	'repeatingflashcountbuilt-in' => { 202 => 0x4db },
+	'repeatingflashcountexternal' => { 202 => 0x4c3 },
+	'repeatingflashoutput' => { 226 => '17.1', 227 => '24.1', 228 => '9.1', 229 => '24.1', 230 => '25.1' },
+	'repeatingflashoutputexternal' => { 202 => 0x4c0 },
+	'repeatingflashrate' => { 170 => 0xc, 171 => 0xd, 172 => 0xd, 226 => '18.1', 227 => '25.1', 228 => '10.1', 229 => '25.1', 230 => '26.1' },
+	'repeatingflashratebuilt-in' => { 202 => 0x4da },
+	'repeatingflashrateexternal' => { 202 => 0x4c2 },
+	'requires' => { 364 => 'requires' },
+	'resampleparams' => { 389 => 'resampleParams' },
+	'resampleparamsquality' => { 389 => [\'resampleParams','resampleParamsQuality'] },
+	'resaved' => { 310 => 0x21e },
+	'resolution' => { 131 => 'Resolution' },
+	'resolutionmode' => { 311 => 0x4 },
+	'resolutionunit' => { 95 => 0x128, 106 => 0x2, 385 => 'ResolutionUnit' },
+	'resourceid' => { 94 => [\'ResourceRelationship','ResourceRelationshipResourceID'] },
+	'resourcerelationship' => { 94 => 'ResourceRelationship' },
+	'resourcerelationshipid' => { 94 => [\'ResourceRelationship','ResourceRelationshipResourceRelationshipID'] },
+	'restrictions' => { 382 => 'restrictions' },
+	'retouchareafeather' => { 366 => [\'RetouchAreas','RetouchAreasFeather'] },
+	'retouchareamaskalpha' => { 366 => [\'RetouchAreas','RetouchAreasMasksAlpha'] },
+	'retouchareamaskangle' => { 366 => [\'RetouchAreas','RetouchAreasMasksAngle'] },
+	'retouchareamaskbottom' => { 366 => [\'RetouchAreas','RetouchAreasMasksBottom'] },
+	'retouchareamaskcentervalue' => { 366 => [\'RetouchAreas','RetouchAreasMasksCenterValue'] },
+	'retouchareamaskcenterweight' => { 366 => [\'RetouchAreas','RetouchAreasMasksCenterWeight'] },
+	'retouchareamaskdabs' => { 366 => [\'RetouchAreas','RetouchAreasMasksDabs'] },
+	'retouchareamaskfeather' => { 366 => [\'RetouchAreas','RetouchAreasMasksFeather'] },
+	'retouchareamaskflipped' => { 366 => [\'RetouchAreas','RetouchAreasMasksFlipped'] },
+	'retouchareamaskflow' => { 366 => [\'RetouchAreas','RetouchAreasMasksFlow'] },
+	'retouchareamaskfullx' => { 366 => [\'RetouchAreas','RetouchAreasMasksFullX'] },
+	'retouchareamaskfully' => { 366 => [\'RetouchAreas','RetouchAreasMasksFullY'] },
+	'retouchareamaskleft' => { 366 => [\'RetouchAreas','RetouchAreasMasksLeft'] },
+	'retouchareamaskmidpoint' => { 366 => [\'RetouchAreas','RetouchAreasMasksMidpoint'] },
+	'retouchareamaskperimetervalue' => { 366 => [\'RetouchAreas','RetouchAreasMasksPerimeterValue'] },
+	'retouchareamaskradius' => { 366 => [\'RetouchAreas','RetouchAreasMasksRadius'] },
+	'retouchareamaskright' => { 366 => [\'RetouchAreas','RetouchAreasMasksRight'] },
+	'retouchareamaskroundness' => { 366 => [\'RetouchAreas','RetouchAreasMasksRoundness'] },
+	'retouchareamasks' => { 366 => [\'RetouchAreas','RetouchAreasMasks'] },
+	'retouchareamasksizex' => { 366 => [\'RetouchAreas','RetouchAreasMasksSizeX'] },
+	'retouchareamasksizey' => { 366 => [\'RetouchAreas','RetouchAreasMasksSizeY'] },
+	'retouchareamasktop' => { 366 => [\'RetouchAreas','RetouchAreasMasksTop'] },
+	'retouchareamaskvalue' => { 366 => [\'RetouchAreas','RetouchAreasMasksMaskValue'] },
+	'retouchareamaskversion' => { 366 => [\'RetouchAreas','RetouchAreasMasksVersion'] },
+	'retouchareamaskwhat' => { 366 => [\'RetouchAreas','RetouchAreasMasksWhat'] },
+	'retouchareamaskx' => { 366 => [\'RetouchAreas','RetouchAreasMasksX'] },
+	'retouchareamasky' => { 366 => [\'RetouchAreas','RetouchAreasMasksY'] },
+	'retouchareamaskzerox' => { 366 => [\'RetouchAreas','RetouchAreasMasksZeroX'] },
+	'retouchareamaskzeroy' => { 366 => [\'RetouchAreas','RetouchAreasMasksZeroY'] },
+	'retouchareamethod' => { 366 => [\'RetouchAreas','RetouchAreasMethod'] },
+	'retouchareaoffsety' => { 366 => [\'RetouchAreas','RetouchAreasOffsetY'] },
+	'retouchareaopacity' => { 366 => [\'RetouchAreas','RetouchAreasOpacity'] },
+	'retouchareas' => { 366 => 'RetouchAreas' },
+	'retouchareaseed' => { 366 => [\'RetouchAreas','RetouchAreasSeed'] },
+	'retouchareasourcestate' => { 366 => [\'RetouchAreas','RetouchAreasSourceState'] },
+	'retouchareasourcex' => { 366 => [\'RetouchAreas','RetouchAreasSourceX'] },
+	'retouchareaspottype' => { 366 => [\'RetouchAreas','RetouchAreasSpotType'] },
+	'retouchhistory' => { 181 => 0x9e },
+	'retouchinfo' => { 366 => 'RetouchInfo' },
+	'reuse' => { 379 => 'Reuse' },
+	'reuseallowed' => { 392 => 'ReuseAllowed' },
+	'reuseprohibited' => { 382 => 'reuseProhibited' },
+	'reverseexposurecompdial' => { 225 => '5.2' },
+	'reverseindicators' => { 221 => '12.1', 223 => '4.3', 224 => '5.2', 225 => '5.4', 226 => '33.5', 227 => '5.1', 230 => '6.2' },
+	'reverseshutterspeedaperture' => { 225 => '5.3' },
+	'revision' => { 368 => 'revision' },
+	'rgbcurvelimits' => { 86 => 0x238 },
+	'rgbcurvepoints' => { 86 => 0x20e },
+	'richtextcomment' => { 373 => 'RichTextComment' },
+	'ricohdate' => { 302 => 0x6 },
+	'ricohimageheight' => { 302 => 0x2 },
+	'ricohimagewidth' => { 302 => 0x0 },
+	'rightascension' => { 134 => 'RightAscension' },
+	'rights' => { 367 => 'rights' },
+	'rightsagent' => { 380 => 'rightsAgent', 382 => 'rightsAgent' },
+	'rightsowner' => { 382 => 'rightsOwner' },
+	'rollangle' => { 250 => 0x90, 280 => 0x1 },
+	'romoperationmode' => { 81 => 0x80d },
+	'rotation' => { 26 => 0x17, 27 => 0x18, 80 => 0x3, 86 => 0x26e, 99 => 0x4, 134 => 'Rotation', 148 => [0x65,0x50], 149 => 0x46, 150 => 0x5a, 153 => 0x10, 201 => '590.1', 214 => 0x76a43207, 250 => 0x30, 262 => '17.2', 289 => 0xd8, 316 => 0x3f, 317 => 0x3f, 327 => 0x10 },
+	'routedto' => { 372 => 'RoutedTo' },
+	'routing' => { 294 => 'Routing' },
+	'routingnotes' => { 372 => 'RoutingNotes' },
+	'rowsperstrip' => { 95 => 0x116 },
+	'rpp' => { 361 => 'rpp' },
+	'safetyshift' => { 68 => 0x108 },
+	'safetyshiftinavortv' => { 66 => 0x10, 67 => 0x10, 69 => 0xf, 70 => 0x10, 73 => 0x10 },
+	'samplebits' => { 124 => 'SampleBits' },
+	'samplerate' => { 124 => 'SampleRate' },
+	'samplesperpixel' => { 95 => 0x115, 385 => 'SamplesPerPixel' },
+	'samplestructure' => { 105 => 0x5a },
+	'sanyoquality' => { 310 => 0x201 },
+	'sanyothumbnail' => { 310 => 0x100 },
+	'saturation' => { 8 => 0x6e, 10 => 0x76, 29 => 0xe, 40 => 0x1, 90 => 0xd, 91 => [0x3013,0x1f], 95 => [0xa409,0xfe55], 100 => 0x1003, 125 => 'Saturation', 147 => 0x1f, 148 => 0x32, 149 => 0x28, 150 => 0x1a, 155 => 0x1, 181 => [0x94,0xaa], 183 => 0x35, 250 => 0x40, 252 => 0x300d, 281 => 0x1f, 287 => 0xd, 299 => 0x27, 302 => 0x28, 303 => 0x1013, 311 => 0x10, 316 => 0x1e, 317 => 0x1b, 328 => 0x2005, 366 => 'Saturation', 370 => 'Saturation' },
+	'saturationadj' => { 86 => 0x116, 213 => 0x1, 217 => 0x2e, 352 => 0x8016 },
+	'saturationadjustmentaqua' => { 366 => 'SaturationAdjustmentAqua' },
+	'saturationadjustmentblue' => { 366 => 'SaturationAdjustmentBlue' },
+	'saturationadjustmentgreen' => { 366 => 'SaturationAdjustmentGreen' },
+	'saturationadjustmentmagenta' => { 366 => 'SaturationAdjustmentMagenta' },
+	'saturationadjustmentorange' => { 366 => 'SaturationAdjustmentOrange' },
+	'saturationadjustmentpurple' => { 366 => 'SaturationAdjustmentPurple' },
+	'saturationadjustmentred' => { 366 => 'SaturationAdjustmentRed' },
+	'saturationadjustmentyellow' => { 366 => 'SaturationAdjustmentYellow' },
+	'saturationauto' => { 57 => 0x98 },
+	'saturationfaithful' => { 17 => 0xfe, 56 => 0x68, 57 => 0x68 },
+	'saturationlandscape' => { 17 => 0xfc, 56 => 0x38, 57 => 0x38 },
+	'saturationmonochrome' => { 56 => 0x80, 57 => 0x80 },
+	'saturationneutral' => { 17 => 0xfd, 56 => 0x50, 57 => 0x50 },
+	'saturationportrait' => { 17 => 0xfb, 56 => 0x20, 57 => 0x20 },
+	'saturationsetting' => { 239 => 0x1010, 318 => 0x11, 331 => 0x9 },
+	'saturationstandard' => { 17 => 0xfa, 56 => 0x8, 57 => 0x8 },
+	'saturationuserdef1' => { 17 => 0x100, 56 => 0x98, 57 => 0xb0 },
+	'saturationuserdef2' => { 17 => 0x101, 56 => 0xb0, 57 => 0xc8 },
+	'saturationuserdef3' => { 17 => 0x102, 56 => 0xc8, 57 => 0xe0 },
+	'saveid' => { 390 => 'SaveID' },
+	'scaletype' => { 389 => 'scaleType' },
+	'scanimageenhancer' => { 186 => 0x60 },
+	'scanningdirection' => { 105 => 0x64 },
+	'scene' => { 375 => 'Scene', 389 => 'scene' },
+	'scenearea' => { 234 => 0x211, 236 => 0x1031 },
+	'sceneassist' => { 181 => 0x9c },
+	'scenecapturetype' => { 95 => 0xa406, 370 => 'SceneCaptureType' },
+	'scenedetect' => { 234 => 0x210, 236 => 0x1030 },
+	'scenedetectdata' => { 234 => 0x212, 236 => 0x1033 },
+	'scenemode' => { 113 => 0xfa02, 152 => 0x100, 181 => 0x8f, 231 => 0x509, 236 => 0x403, 250 => 0x8001, 256 => 0xf, 328 => 0xb023 },
+	'scenemodeused' => { 115 => [0x6002,0xf002] },
+	'sceneselect' => { 310 => 0x21f },
+	'scenetype' => { 95 => 0xa301, 370 => 'SceneType' },
+	'screentips' => { 221 => '12.7', 226 => '13.1', 227 => '4.4', 230 => '5.1' },
+	'section' => { 380 => 'section' },
+	'securityclassification' => { 95 => 0x9212 },
+	'selectableafpoint' => { 68 => 0x509 },
+	'selectafareaselectmode' => { 68 => 0x512 },
+	'selftimer' => { 29 => 0x2, 250 => 0x2e, 310 => 0x214 },
+	'selftimer2' => { 62 => 0x1d },
+	'selftimerinterval' => { 227 => '19.2' },
+	'selftimermode' => { 95 => 0x882b },
+	'selftimershotcount' => { 223 => '18.2', 224 => '19.2', 225 => '19.2', 227 => '19.3', 230 => '20.2' },
+	'selftimertime' => { 81 => 0x1806, 150 => 0x1f, 221 => '18.1', 222 => '3.3', 223 => '18.1', 224 => '19.1', 225 => '19.1', 226 => '7.2', 227 => '19.1', 228 => '3.3', 230 => '20.1' },
+	'seminfo' => { 95 => 0x8546 },
+	'sensingmethod' => { 95 => 0xa217, 370 => 'SensingMethod' },
+	'sensitivityadjust' => { 281 => 0x40 },
+	'sensitivitysteps' => { 262 => ['14.3','17.4'], 264 => 0x1 },
+	'sensitivitytype' => { 95 => 0x8830, 371 => 'SensitivityType' },
+	'sensorareas' => { 308 => 0xa010 },
+	'sensorbitdepth' => { 252 => 0x312d },
+	'sensorbluelevel' => { 60 => 0x5 },
+	'sensorcalibration' => { 235 => 0x805 },
+	'sensorcleaning' => { 74 => 0xd },
+	'sensorfullheight' => { 108 => 0xf904 },
+	'sensorfullwidth' => { 108 => 0xf903 },
+	'sensorheight' => { 108 => 0xf901, 113 => 0xfa21, 154 => 0x8, 252 => 0x312c, 303 => 0x1602 },
+	'sensorpixelsize' => { 181 => 0x9a },
+	'sensorredlevel' => { 60 => 0x4 },
+	'sensorsize' => { 125 => 'SensorSize', 281 => 0x35 },
+	'sensortemperature' => { 234 => 0x1500, 236 => 0x1007, 311 => [0x39,0x55] },
+	'sensorwidth' => { 108 => 0xf900, 113 => 0xfa20, 154 => 0xa, 252 => 0x312b, 303 => 0x1601 },
+	'sequence' => { 299 => 0x7 },
+	'sequencefilenumber' => { 335 => 0x4, 336 => 0x4, 337 => 0x4, 338 => 0x4, 342 => 0xc, 343 => 0xc, 344 => 0x1a },
+	'sequenceimagenumber' => { 335 => 0x0, 336 => 0x0, 337 => 0x0, 338 => 0x0, 342 => 0x8, 343 => 0x8, 344 => 0x12, 348 => 0x24 },
+	'sequencelength' => { 342 => 0x22, 343 => 0x1e, 344 => [0x16,0x1e] },
+	'sequencenumber' => { 62 => 0x9, 91 => 0x301c, 100 => 0x1101, 111 => 0x1d, 202 => 0x51c, 250 => 0x2b, 318 => [0x10c,0x30c], 328 => 0xb04a },
+	'sequenceshotinterval' => { 310 => 0x224 },
+	'sequentialshot' => { 310 => 0x20e },
+	'serialnumber' => { 51 => 0xc, 81 => 0x180b, 95 => [0xa431,0xfde9], 108 => 0xfa04, 110 => 0xfa00, 112 => 0xc354, 113 => 0xfa19, 122 => 0x0, 125 => 'SerialNumber', 181 => [0xa0,0x1d], 232 => 0x101, 236 => [0x404,0x101a], 246 => 0x303, 252 => 0x3103, 281 => 0x229, 299 => 0x15, 303 => 0x5, 311 => 0x2, 363 => 'SerialNumber', 371 => 'BodySerialNumber' },
+	'serialnumberformat' => { 51 => 0x15, 81 => 0x183b },
+	'seriesdatetime' => { 354 => 'SeriesDateTime' },
+	'seriesdescription' => { 354 => 'SeriesDescription' },
+	'seriesmodality' => { 354 => 'SeriesModality' },
+	'seriesnumber' => { 354 => 'SeriesNumber' },
+	'serviceidentifier' => { 104 => 0x1e },
+	'setbuttoncrosskeysfunc' => { 71 => 0x0, 72 => 0x0 },
+	'setbuttonwhenshooting' => { 66 => 0x1, 68 => 0x704, 74 => 0xc },
+	'setfunctionwhenshooting' => { 69 => 0x0, 70 => 0x1, 73 => 0x1 },
+	'shadingcompensation' => { 231 => 0x50c, 250 => 0x8a },
+	'shadingcompensation2' => { 235 => 0x1012 },
+	'shadow' => { 311 => 0xe },
+	'shadowcorrection' => { 281 => 0x79 },
+	'shadowprotection' => { 213 => 0x0 },
+	'shadows' => { 95 => 0xfe52, 360 => 'Shadows', 366 => 'Shadows' },
+	'shadows2012' => { 366 => 'Shadows2012' },
+	'shadowscale' => { 95 => 0xc633 },
+	'shadowtint' => { 366 => 'ShadowTint' },
+	'shadowtone' => { 100 => 0x1040 },
+	'shakereduction' => { 282 => 0x1, 283 => 0x1 },
+	'sharpendetail' => { 366 => 'SharpenDetail' },
+	'sharpenedgemasking' => { 366 => 'SharpenEdgeMasking' },
+	'sharpening' => { 252 => 0x300b },
+	'sharpeningadj' => { 217 => 0x2b },
+	'sharpenradius' => { 366 => 'SharpenRadius' },
+	'sharpness' => { 6 => [0x42,0x48], 8 => 0x72, 10 => 0x74, 29 => 0xf, 60 => 0x2, 90 => 0xb, 91 => [0x3011,0x21], 95 => [0xa40a,0xfe56], 100 => 0x1001, 111 => 0x6b, 120 => 0x37, 125 => 'Sharpness', 147 => 0x21, 148 => 0x30, 149 => 0x26, 150 => 0x18, 155 => 0x3, 181 => 0x6, 183 => 0x32, 236 => 0x100f, 250 => 0x41, 281 => 0x21, 287 => 0xb, 299 => 0x26, 302 => 0x22, 303 => [0x1003,0x1014], 311 => 0x11, 316 => 0x1c, 317 => 0x19, 328 => 0x2006, 366 => 'Sharpness', 370 => 'Sharpness' },
+	'sharpnessadj' => { 86 => 0x25a, 352 => 0x801a },
+	'sharpnessauto' => { 57 => 0x94 },
+	'sharpnessfactor' => { 236 => 0x102a },
+	'sharpnessfaithful' => { 17 => 0xf5, 56 => 0x64, 57 => 0x64 },
+	'sharpnessfrequency' => { 6 => [0x41,0x47], 60 => 0x3 },
+	'sharpnesslandscape' => { 17 => 0xf3, 56 => 0x34, 57 => 0x34 },
+	'sharpnessmonochrome' => { 17 => 0xf6, 56 => 0x7c, 57 => 0x7c },
+	'sharpnessneutral' => { 17 => 0xf4, 56 => 0x4c, 57 => 0x4c },
+	'sharpnessovershoot' => { 352 => 0x801b },
+	'sharpnessportrait' => { 17 => 0xf2, 56 => 0x1c, 57 => 0x1c },
+	'sharpnesssetting' => { 231 => 0x506, 239 => 0x1013, 318 => 0x12, 331 => 0xa },
+	'sharpnessstandard' => { 17 => 0xf1, 56 => 0x4, 57 => 0x4 },
+	'sharpnessthreshold' => { 352 => 0x801d },
+	'sharpnessundershoot' => { 352 => 0x801c },
+	'sharpnessuserdef1' => { 17 => 0xf7, 56 => 0x94, 57 => 0xac },
+	'sharpnessuserdef2' => { 17 => 0xf8, 56 => 0xac, 57 => 0xc4 },
+	'sharpnessuserdef3' => { 17 => 0xf9, 56 => 0xc4, 57 => 0xdc },
+	'shootinginfodisplay' => { 221 => '13.2', 226 => '10.2', 227 => '4.1', 230 => '5.3' },
+	'shootinginfomonitorofftime' => { 226 => '9.1', 227 => '21.2', 230 => '22.2' },
+	'shootingmode' => { 125 => 'ShootingMode', 181 => 0x89, 250 => 0x1f },
+	'shootingmodesetting' => { 222 => '5.1' },
+	'shortdescription' => { 368 => 'shortdescription' },
+	'shortdocumentid' => { 103 => 0xba },
+	'shortownername' => { 17 => 0xac },
+	'shortreleasetimelag' => { 68 => 0x80d },
+	'shotdate' => { 389 => 'shotDate' },
+	'shotday' => { 389 => 'shotDay' },
+	'shotlocation' => { 389 => 'shotLocation' },
+	'shotname' => { 389 => 'shotName' },
+	'shotnumber' => { 389 => 'shotNumber' },
+	'shotnumbersincepowerup' => { 330 => 0x44e, 342 => 0x1a, 343 => 0x16, 344 => 0xa },
+	'shotnumbersincepowerup2' => { 318 => 0x200 },
+	'shotsize' => { 389 => 'shotSize' },
+	'shutter-aelock' => { 66 => 0x4, 68 => 0x701, 69 => 0x3, 70 => 0x4, 71 => 0x3, 72 => 0x3, 73 => 0x4, 74 => 0x2 },
+	'shutteraelbutton' => { 67 => 0x4 },
+	'shutterbuttonafonbutton' => { 68 => 0x701 },
+	'shuttercount' => { 9 => 0x176, 46 => 0x1, 181 => 0xa7, 187 => [0x6a,0x157,0x24d], 188 => 0x286, 189 => 0x279, 190 => 0x284, 191 => 0x242, 192 => 0x280, 193 => 0x276, 194 => [0x27d,0x27f], 195 => 0x246, 196 => 0x2d6, 197 => 0x321, 198 => 0xbd8, 199 => 0x287, 200 => 0x320, 201 => 0x24a, 202 => 0x5fb, 203 => 0x2d5, 281 => 0x5d, 327 => 0x846, 329 => [0x125,0x14a] },
+	'shuttercurtainsync' => { 66 => 0xf, 67 => 0xf, 68 => 0x305, 69 => 0xe, 70 => 0xf, 71 => 0x8, 72 => 0x8, 73 => 0xf, 74 => 0x8 },
+	'shuttermode' => { 111 => 0x1b },
+	'shutterreleasebuttonae-l' => { 221 => '17.7', 223 => '16.1', 224 => '17.1', 225 => '17.1', 226 => '7.1', 227 => '17.5', 230 => '18.2' },
+	'shutterreleasemethod' => { 81 => 0x1010 },
+	'shutterreleasenocfcard' => { 66 => 0x2, 67 => 0x2, 74 => 0xf },
+	'shutterreleasetiming' => { 81 => 0x1011 },
+	'shutterspeedrange' => { 68 => 0x10c },
+	'shutterspeedsetting' => { 150 => 0x6, 316 => 0x2f, 317 => 0x28, 318 => 0x0 },
+	'shutterspeedvalue' => { 77 => 0x1, 95 => 0x9201, 236 => 0x1000, 370 => 'ShutterSpeedValue' },
+	'shuttertype' => { 250 => 0x9f },
+	'sidecarforextension' => { 378 => 'SidecarForExtension' },
+	'similarityindex' => { 103 => 0xe4 },
+	'singleframebracketing' => { 150 => 0x21 },
+	'slaveflashmeteringsegments' => { 281 => 0x20b },
+	'slowshutter' => { 62 => 0x8 },
+	'slowsync' => { 100 => 0x1030 },
+	'smartrange' => { 308 => 0xa012 },
+	'smileshutter' => { 318 => 0x31 },
+	'smileshuttermode' => { 318 => 0x27 },
+	'smoothness' => { 95 => 0xfe57, 366 => 'Smoothness' },
+	'softskineffect' => { 328 => 0x200f },
+	'software' => { 95 => 0x131, 126 => 'Software', 242 => 'Software', 311 => 0x18, 385 => 'Software' },
+	'softwareversion' => { 310 => 0x207 },
+	'sonydatetime' => { 333 => 0x6, 335 => 0x1b6, 336 => 0x210, 337 => 0x1fe, 338 => 0x22c },
+	'sonydatetime2' => { 341 => 0x51 },
+	'sonyexposuretime' => { 341 => 0x3a },
+	'sonyexposuretime2' => { 348 => 0xe },
+	'sonyfnumber' => { 341 => 0x3c, 348 => 0x14 },
+	'sonyimageheight' => { 333 => 0x1a, 342 => 0x44, 343 => 0x3f, 344 => 0x47 },
+	'sonyimagesize' => { 150 => 0x3b, 316 => 0x54, 317 => 0x54, 318 => 0x9 },
+	'sonyimagewidth' => { 333 => 0x1c },
+	'sonymaxaperturevalue' => { 348 => 0x16 },
+	'sonymodelid' => { 328 => 0xb001 },
+	'sonyquality' => { 150 => 0x3c },
+	'source' => { 103 => 0x73, 242 => 'Source', 367 => 'source', 368 => 'source', 378 => 'Source' },
+	'sourcedirectoryindex' => { 268 => 0x0 },
+	'sourcefileindex' => { 268 => 0x2 },
+	'sourcephotoscount' => { 356 => 'SourcePhotosCount' },
+	'spatialfrequencyresponse' => { 370 => 'SpatialFrequencyResponse' },
+	'spatialfrequencyresponsecolumns' => { 370 => [\'SpatialFrequencyResponse','SpatialFrequencyResponseColumns'] },
+	'spatialfrequencyresponsenames' => { 370 => [\'SpatialFrequencyResponse','SpatialFrequencyResponseNames'] },
+	'spatialfrequencyresponserows' => { 370 => [\'SpatialFrequencyResponse','SpatialFrequencyResponseRows'] },
+	'spatialfrequencyresponsevalues' => { 370 => [\'SpatialFrequencyResponse','SpatialFrequencyResponseValues'] },
+	'speakerplacement' => { 389 => 'speakerPlacement' },
+	'specialeffectlevel' => { 91 => 0x3030 },
+	'specialeffectmode' => { 91 => 0x2076 },
+	'specialeffectsetting' => { 91 => 0x3031 },
+	'specialinstructions' => { 103 => 0x28 },
+	'specialmode' => { 236 => 0x200, 310 => 0x200 },
+	'spectralsensitivity' => { 95 => 0x8824, 370 => 'SpectralSensitivity' },
+	'specularwhitelevel' => { 36 => [0x2b9,0x2d0,0x2d4], 38 => 0x1e4, 39 => 0x1fd },
+	'splittoningbalance' => { 366 => 'SplitToningBalance' },
+	'splittoninghighlighthue' => { 366 => 'SplitToningHighlightHue' },
+	'splittoninghighlightsaturation' => { 366 => 'SplitToningHighlightSaturation' },
+	'splittoningshadowhue' => { 366 => 'SplitToningShadowHue' },
+	'splittoningshadowsaturation' => { 366 => 'SplitToningShadowSaturation' },
+	'spotfocuspointx' => { 147 => 0x2d },
+	'spotfocuspointy' => { 147 => 0x2e },
+	'spotmeteringmode' => { 29 => 0x27 },
+	'spotmeterlinktoafpoint' => { 68 => 0x107 },
+	'sractive' => { 262 => '17.1' },
+	'srawquality' => { 29 => 0x2e },
+	'srfocallength' => { 282 => 0x3 },
+	'srhalfpresstime' => { 282 => 0x2 },
+	'srresult' => { 282 => 0x0, 283 => 0x0 },
+	'standardoutputhighlightpoint' => { 87 => 0x14 },
+	'standardoutputsensitivity' => { 95 => 0x8831, 371 => 'StandardOutputSensitivity' },
+	'standardoutputshadowpoint' => { 87 => 0x15 },
+	'standardrawcolortone' => { 87 => 0xd },
+	'standardrawcontrast' => { 87 => 0xf },
+	'standardrawhighlight' => { 87 => 0x75 },
+	'standardrawhighlightpoint' => { 87 => 0x12 },
+	'standardrawlinear' => { 87 => 0x10 },
+	'standardrawsaturation' => { 87 => 0xe },
+	'standardrawshadow' => { 87 => 0x7e },
+	'standardrawshadowpoint' => { 87 => 0x13 },
+	'standardrawsharpness' => { 87 => 0x11 },
+	'standardunsharpmaskfineness' => { 87 => 0x94 },
+	'standardunsharpmaskstrength' => { 87 => 0x92 },
+	'standardunsharpmaskthreshold' => { 87 => 0x96 },
+	'standbytimer' => { 225 => '18.1' },
+	'startingpage' => { 380 => 'startingPage' },
+	'startmovieshooting' => { 68 => 0x70d },
+	'starttimecode' => { 389 => 'startTimecode' },
+	'starttimecodetimeformat' => { 389 => [\'startTimecode','startTimecodeTimeFormat'] },
+	'starttimecodetimevalue' => { 389 => [\'startTimecode','startTimecodeTimeValue'] },
+	'starttimecodevalue' => { 389 => [\'startTimecode','startTimecodeValue'] },
+	'state' => { 130 => 'State', 250 => 0x6b, 378 => 'State' },
+	'status' => { 355 => 'Status', 359 => 'Status' },
+	'stitchingsoftware' => { 356 => 'StitchingSoftware' },
+	'stopsabovebaseiso' => { 334 => 0x113e, 335 => 0x113e, 336 => 0x111a, 337 => 0x1196, 338 => 0x1172, 339 => 0x102a, 340 => 0x222 },
+	'storagemethod' => { 154 => 0x12 },
+	'straightenangle' => { 214 => 0x2fc08431 },
+	'stretchmode' => { 389 => 'stretchMode' },
+	'studydatetime' => { 354 => 'StudyDateTime' },
+	'studydescription' => { 354 => 'StudyDescription' },
+	'studyid' => { 354 => 'StudyID' },
+	'studyphysician' => { 354 => 'StudyPhysician' },
+	'sub-location' => { 103 => 0x5c },
+	'subfiledata' => { 133 => 'data' },
+	'subfiledirectory' => { 133 => '1Directory' },
+	'subfilemimetype' => { 133 => '2MIME' },
+	'subfilename' => { 133 => '1Name' },
+	'subfileresource' => { 133 => 'rsrc' },
+	'subfiletype' => { 95 => 0xfe, 133 => '0Type' },
+	'subject' => { 240 => 'Subject', 294 => 'Subject', 367 => 'subject', 377 => 'Subject', 390 => 'subject' },
+	'subjectarea' => { 95 => 0x9214, 370 => 'SubjectArea' },
+	'subjectcode' => { 375 => 'SubjectCode' },
+	'subjectdistance' => { 95 => 0x9206, 111 => 0x3e, 370 => 'SubjectDistance' },
+	'subjectdistancerange' => { 95 => 0xa40c, 370 => 'SubjectDistanceRange' },
+	'subjectlocation' => { 95 => 0xa214, 370 => 'SubjectLocation' },
+	'subjectprogram' => { 147 => 0x22 },
+	'subjectreference' => { 103 => 0xc },
+	'sublabels4' => { 374 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsSubLabels'] },
+	'sublabels5' => { 374 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabels'] },
+	'sublables1' => { 374 => [\'TagStructure','TagStructureSubLabels'] },
+	'sublables2' => { 374 => [\'TagStructure','TagStructureSubLabelsSubLabels'] },
+	'sublables3' => { 374 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabels'] },
+	'subsectime' => { 95 => 0x9290 },
+	'subsectimedigitized' => { 95 => 0x9292 },
+	'subsectimeoriginal' => { 95 => 0x9291 },
+	'subsection1' => { 380 => 'subsection1' },
+	'subsection2' => { 380 => 'subsection2' },
+	'subsection3' => { 380 => 'subsection3' },
+	'subsection4' => { 380 => 'subsection4' },
+	'subversionfilename' => { 374 => [\'SubVersions','SubVersionsFileName'] },
+	'subversionreference' => { 374 => [\'SubVersions','SubVersionsVersRef'] },
+	'subversions' => { 374 => 'SubVersions' },
+	'superimposeddisplay' => { 66 => 0xa, 68 => 0x510, 69 => 0x9, 70 => 0xa, 73 => 0xa, 74 => 0xe },
+	'supermacro' => { 51 => 0x1a },
+	'supplementalcategories' => { 103 => 0x14, 378 => 'SupplementalCategories' },
+	'supplementaltype' => { 105 => 0x37 },
+	'svisosetting' => { 262 => 0x14 },
+	'sweeppanoramadirection' => { 250 => 0x93, 318 => 0x33 },
+	'sweeppanoramafieldofview' => { 250 => 0x94 },
+	'sweeppanoramasize' => { 318 => 0x32 },
+	'switchtoregisteredafpoint' => { 67 => 0x12, 68 => 0x50a },
+	'tagged' => { 289 => 0xdd, 290 => 'Tagged', 361 => 'tagged' },
+	'tagslist' => { 369 => 'TagsList' },
+	'tagstructure' => { 374 => 'TagStructure' },
+	'takenumber' => { 389 => 'takeNumber' },
+	'tapename' => { 389 => 'tapeName' },
+	'targetaperture' => { 62 => 0x4 },
+	'targetcompressionratio' => { 79 => 0x1 },
+	'targetdistancesetting' => { 81 => 0x1807 },
+	'targetexposuretime' => { 62 => 0x5 },
+	'targetimagetype' => { 81 => 0x100a },
+	'taxon' => { 94 => 'Taxon' },
+	'taxonacceptednameusage' => { 94 => [\'Taxon','TaxonAcceptedNameUsage'] },
+	'taxonacceptednameusageid' => { 94 => [\'Taxon','TaxonAcceptedNameUsageID'] },
+	'taxonclass' => { 94 => [\'Taxon','TaxonClass'] },
+	'taxonconceptid' => { 94 => [\'Taxon','TaxonTaxonConceptID'] },
+	'taxonfamily' => { 94 => [\'Taxon','TaxonFamily'] },
+	'taxongenus' => { 94 => [\'Taxon','TaxonGenus'] },
+	'taxonhigherclassification' => { 94 => [\'Taxon','TaxonHigherClassification'] },
+	'taxonid' => { 94 => [\'Taxon','TaxonTaxonID'] },
+	'taxoninfraspecificepithet' => { 94 => [\'Taxon','TaxonInfraspecificEpithet'] },
+	'taxonkingdom' => { 94 => [\'Taxon','TaxonKingdom'] },
+	'taxonnameaccordingto' => { 94 => [\'Taxon','TaxonNameAccordingTo'] },
+	'taxonnameaccordingtoid' => { 94 => [\'Taxon','TaxonNameAccordingToID'] },
+	'taxonnamepublishedin' => { 94 => [\'Taxon','TaxonNamePublishedIn'] },
+	'taxonnamepublishedinid' => { 94 => [\'Taxon','TaxonNamePublishedInID'] },
+	'taxonnamepublishedinyear' => { 94 => [\'Taxon','TaxonNamePublishedInYear'] },
+	'taxonnomenclaturalcode' => { 94 => [\'Taxon','TaxonNomenclaturalCode'] },
+	'taxonnomenclaturalstatus' => { 94 => [\'Taxon','TaxonNomenclaturalStatus'] },
+	'taxonorder' => { 94 => [\'Taxon','TaxonOrder'] },
+	'taxonoriginalnameusage' => { 94 => [\'Taxon','TaxonOriginalNameUsage'] },
+	'taxonoriginalnameusageid' => { 94 => [\'Taxon','TaxonOriginalNameUsageID'] },
+	'taxonparentnameusage' => { 94 => [\'Taxon','TaxonParentNameUsage'] },
+	'taxonparentnameusageid' => { 94 => [\'Taxon','TaxonParentNameUsageID'] },
+	'taxonphylum' => { 94 => [\'Taxon','TaxonPhylum'] },
+	'taxonrank' => { 94 => [\'Taxon','TaxonTaxonRank'] },
+	'taxonremarks' => { 94 => [\'Taxon','TaxonTaxonRemarks'] },
+	'taxonscientificname' => { 94 => [\'Taxon','TaxonScientificName'] },
+	'taxonscientificnameauthorship' => { 94 => [\'Taxon','TaxonScientificNameAuthorship'] },
+	'taxonscientificnameid' => { 94 => [\'Taxon','TaxonScientificNameID'] },
+	'taxonspecificepithet' => { 94 => [\'Taxon','TaxonSpecificEpithet'] },
+	'taxonsubgenus' => { 94 => [\'Taxon','TaxonSubgenus'] },
+	'taxontaxonomicstatus' => { 94 => [\'Taxon','TaxonTaxonomicStatus'] },
+	'taxonverbatimtaxonrank' => { 94 => [\'Taxon','TaxonVerbatimTaxonRank'] },
+	'taxonvernacularname' => { 94 => [\'Taxon','TaxonVernacularName'] },
+	'teaser' => { 380 => 'teaser' },
+	'teleconverter' => { 152 => 0x105, 328 => 0x105 },
+	'tempo' => { 389 => 'tempo' },
+	'termsandconditionstext' => { 379 => 'TermsAndConditionsText' },
+	'termsandconditionsurl' => { 379 => 'TermsAndConditionsURL' },
+	'textencoding' => { 180 => 0x4 },
+	'textlayername' => { 378 => [\'TextLayers','TextLayersLayerName'] },
+	'textlayers' => { 378 => 'TextLayers' },
+	'textlayertext' => { 378 => [\'TextLayers','TextLayersLayerText'] },
+	'textstamp' => { 250 => [0x8008,0x8009,0x3b,0x3e] },
+	'thresholding' => { 95 => 0x107 },
+	'thumbnailfilename' => { 81 => 0x817 },
+	'thumbnailformat' => { 387 => [\'Thumbnails','ThumbnailsFormat'] },
+	'thumbnailheight' => { 113 => 0xfa55, 387 => [\'Thumbnails','ThumbnailsHeight'] },
+	'thumbnailimage' => { 81 => 0x2008, 92 => 'ThumbnailImage', 98 => 0x3, 136 => 'data', 236 => 0x100, 387 => [\'Thumbnails','ThumbnailsImage'] },
+	'thumbnailimagename' => { 136 => '1Name' },
+	'thumbnailimagesize' => { 136 => 'ImageSize' },
+	'thumbnailimagetype' => { 136 => '0Type' },
+	'thumbnailimagevalidarea' => { 51 => 0x13 },
+	'thumbnaillength' => { 95 => 0x202 },
+	'thumbnailoffset' => { 95 => 0x201 },
+	'thumbnails' => { 387 => 'Thumbnails' },
+	'thumbnailwidth' => { 113 => 0xfa54, 387 => [\'Thumbnails','ThumbnailsWidth'] },
+	'ticker' => { 380 => 'ticker' },
+	'tilelength' => { 95 => 0x143 },
+	'tilewidth' => { 95 => 0x142 },
+	'time' => { 109 => 0x401, 281 => 0x7 },
+	'timecodes' => { 95 => 0xc763 },
+	'timecreated' => { 103 => 0x3c, 111 => 0x14, 120 => 0x10, 290 => 'TimeCreated' },
+	'timeperiod' => { 380 => 'timePeriod' },
+	'timerfunctionbutton' => { 222 => '5.2', 223 => '12.1', 224 => '13.1' },
+	'timerlength' => { 68 => 0x80c },
+	'timerrecording' => { 250 => 0x96 },
+	'timescaleparams' => { 389 => 'timeScaleParams' },
+	'timescaleparamsframeoverlappingpercentage' => { 389 => [\'timeScaleParams','timeScaleParamsFrameOverlappingPercentage'] },
+	'timescaleparamsframesize' => { 389 => [\'timeScaleParams','timeScaleParamsFrameSize'] },
+	'timescaleparamsquality' => { 389 => [\'timeScaleParams','timeScaleParamsQuality'] },
+	'timesent' => { 104 => 0x50 },
+	'timesignature' => { 389 => 'timeSignature' },
+	'timesincepoweron' => { 250 => 0x29 },
+	'timestamp' => { 9 => 0x45e, 17 => 0x11c, 242 => 'TimeStamp', 362 => 'Timestamp' },
+	'timestamp1' => { 9 => 0x45a },
+	'timezone' => { 63 => 0x1, 206 => 0x0 },
+	'timezonecity' => { 63 => 0x2 },
+	'timezonecode' => { 84 => 0x1 },
+	'timezoneinfo' => { 84 => 0x2 },
+	'timezoneoffset' => { 95 => 0x882a },
+	'tint' => { 366 => 'Tint' },
+	'title' => { 126 => 'Title', 240 => 'Title', 242 => 'Title', 250 => 0x65, 294 => 'Title', 367 => 'title', 377 => 'Title', 387 => 'Title' },
+	'tonecomp' => { 181 => 0x81 },
+	'tonecurve' => { 60 => 0x1, 281 => 0x402, 366 => 'ToneCurve' },
+	'tonecurve1' => { 308 => 0xa040 },
+	'tonecurve2' => { 308 => 0xa041 },
+	'tonecurve3' => { 308 => 0xa042 },
+	'tonecurve4' => { 308 => 0xa043 },
+	'tonecurveactive' => { 86 => 0x110 },
+	'tonecurveblue' => { 366 => 'ToneCurveBlue' },
+	'tonecurvebluex' => { 352 => 0x9003 },
+	'tonecurvebluey' => { 352 => 0x9007 },
+	'tonecurvebrightnessx' => { 352 => 0x9000 },
+	'tonecurvebrightnessy' => { 352 => 0x9004 },
+	'tonecurvefilename' => { 109 => 0x1391 },
+	'tonecurvegreen' => { 366 => 'ToneCurveGreen' },
+	'tonecurvegreenx' => { 352 => 0x9002 },
+	'tonecurvegreeny' => { 352 => 0x9006 },
+	'tonecurveinterpolation' => { 86 => 0x159 },
+	'tonecurvemode' => { 86 => 0x113 },
+	'tonecurvename' => { 366 => 'ToneCurveName' },
+	'tonecurvename2012' => { 366 => 'ToneCurveName2012' },
+	'tonecurveproperty' => { 86 => 0x3c },
+	'tonecurvepv2012' => { 366 => 'ToneCurvePV2012' },
+	'tonecurvepv2012blue' => { 366 => 'ToneCurvePV2012Blue' },
+	'tonecurvepv2012green' => { 366 => 'ToneCurvePV2012Green' },
+	'tonecurvepv2012red' => { 366 => 'ToneCurvePV2012Red' },
+	'tonecurvered' => { 366 => 'ToneCurveRed' },
+	'tonecurveredx' => { 352 => 0x9001 },
+	'tonecurveredy' => { 352 => 0x9005 },
+	'tonecurves' => { 281 => 0x403 },
+	'tonelevel' => { 231 => 0x52e },
+	'toningeffect' => { 46 => 0xf, 181 => 0xb3, 183 => 0x38, 303 => 0x1015 },
+	'toningeffectauto' => { 57 => 0xa4 },
+	'toningeffectfaithful' => { 56 => 0x74, 57 => 0x74 },
+	'toningeffectlandscape' => { 56 => 0x44, 57 => 0x44 },
+	'toningeffectmonochrome' => { 17 => 0x108, 56 => 0x8c, 57 => 0x8c },
+	'toningeffectneutral' => { 56 => 0x5c, 57 => 0x5c },
+	'toningeffectportrait' => { 56 => 0x2c, 57 => 0x2c },
+	'toningeffectstandard' => { 56 => 0x14, 57 => 0x14 },
+	'toningeffectuserdef1' => { 56 => 0xa4, 57 => 0xbc },
+	'toningeffectuserdef2' => { 56 => 0xbc, 57 => 0xd4 },
+	'toningeffectuserdef3' => { 56 => 0xd4, 57 => 0xec },
+	'toningsaturation' => { 183 => 0x39 },
+	'totalzoom' => { 111 => 0x62 },
+	'touchae' => { 250 => 0xab },
+	'trackcreatedate' => { 298 => 0x1 },
+	'trackmodifydate' => { 298 => 0x2 },
+	'tracknumber' => { 389 => 'trackNumber' },
+	'tracks' => { 389 => 'Tracks' },
+	'tracksframerate' => { 389 => [\'Tracks','TracksFrameRate'] },
+	'tracksmarkers' => { 389 => [\'Tracks','TracksMarkers'] },
+	'tracksmarkerscomment' => { 389 => [\'Tracks','TracksMarkersComment'] },
+	'tracksmarkerscuepointparams' => { 389 => [\'Tracks','TracksMarkersCuePointParams'] },
+	'tracksmarkerscuepointparamskey' => { 389 => [\'Tracks','TracksMarkersCuePointParamsKey'] },
+	'tracksmarkerscuepointparamsvalue' => { 389 => [\'Tracks','TracksMarkersCuePointParamsValue'] },
+	'tracksmarkerscuepointtype' => { 389 => [\'Tracks','TracksMarkersCuePointType'] },
+	'tracksmarkersduration' => { 389 => [\'Tracks','TracksMarkersDuration'] },
+	'tracksmarkerslocation' => { 389 => [\'Tracks','TracksMarkersLocation'] },
+	'tracksmarkersname' => { 389 => [\'Tracks','TracksMarkersName'] },
+	'tracksmarkersprobability' => { 389 => [\'Tracks','TracksMarkersProbability'] },
+	'tracksmarkersspeaker' => { 389 => [\'Tracks','TracksMarkersSpeaker'] },
+	'tracksmarkersstarttime' => { 389 => [\'Tracks','TracksMarkersStartTime'] },
+	'tracksmarkerstarget' => { 389 => [\'Tracks','TracksMarkersTarget'] },
+	'tracksmarkerstype' => { 389 => [\'Tracks','TracksMarkersType'] },
+	'trackstrackname' => { 389 => [\'Tracks','TracksTrackName'] },
+	'trackstracktype' => { 389 => [\'Tracks','TracksTrackType'] },
+	'trailersignature' => { 133 => 'zmie' },
+	'transferfunction' => { 95 => 0x12d, 385 => 'TransferFunction' },
+	'transform' => { 250 => [0x8012,0x59] },
+	'transmissionreference' => { 378 => 'TransmissionReference' },
+	'trapped' => { 240 => 'Trapped', 377 => 'Trapped' },
+	'travelday' => { 250 => 0x36 },
+	'triggermode' => { 299 => 0x6 },
+	'tstop' => { 95 => 0xc772 },
+	'ttl_da_adown' => { 269 => 0x5 },
+	'ttl_da_aup' => { 269 => 0x4 },
+	'ttl_da_bdown' => { 269 => 0x7 },
+	'ttl_da_bup' => { 269 => 0x6 },
+	'tungstenawb' => { 259 => 0x1 },
+	'tvexposuretimesetting' => { 262 => 0x12 },
+	'type' => { 367 => 'type', 384 => 'type' },
+	'typestatus' => { 94 => [\'Identification','IdentificationTypeStatus'] },
+	'uniquecameramodel' => { 95 => 0xc614 },
+	'uniquedocumentid' => { 103 => 0xbb },
+	'uniqueobjectname' => { 104 => 0x64 },
+	'unknownblock' => { 281 => 0x405 },
+	'unknownblock1' => { 235 => 0x635 },
+	'unknownblock2' => { 235 => 0x636 },
+	'unknownblock3' => { 235 => 0x1103 },
+	'unknownblock4' => { 235 => 0x1104 },
+	'unknowncontrast' => { 87 => 0x45 },
+	'unknownev' => { 109 => 0x1 },
+	'unknownlinear' => { 87 => 0x46 },
+	'unknownnumber' => { 81 => 0x180b },
+	'unknownoutputhighlightpoint' => { 87 => 0x4a },
+	'unknownoutputshadowpoint' => { 87 => 0x4b },
+	'unknownrawhighlight' => { 87 => 0x7b },
+	'unknownrawhighlightpoint' => { 87 => 0x48 },
+	'unknownrawshadow' => { 87 => 0x84 },
+	'unknownrawshadowpoint' => { 87 => 0x49 },
+	'unknownsharpness' => { 87 => 0x47 },
+	'unknowntemperature' => { 97 => 0x4 },
+	'unsharp1color' => { 219 => 0x13 },
+	'unsharp1halowidth' => { 219 => 0x19 },
+	'unsharp1intensity' => { 219 => 0x17 },
+	'unsharp1threshold' => { 219 => 0x1b },
+	'unsharp2color' => { 219 => 0x2e },
+	'unsharp2halowidth' => { 219 => 0x34 },
+	'unsharp2intensity' => { 219 => 0x32 },
+	'unsharp2threshold' => { 219 => 0x36 },
+	'unsharp3color' => { 219 => 0x49 },
+	'unsharp3halowidth' => { 219 => 0x4f },
+	'unsharp3intensity' => { 219 => 0x4d },
+	'unsharp3threshold' => { 219 => 0x51 },
+	'unsharp4color' => { 219 => 0x64 },
+	'unsharp4halowidth' => { 219 => 0x6a },
+	'unsharp4intensity' => { 219 => 0x68 },
+	'unsharp4threshold' => { 219 => 0x6c },
+	'unsharpcount' => { 219 => 0x0 },
+	'unsharpmask' => { 87 => 0x90, 214 => 0x76a43200 },
+	'uprightcentermode' => { 366 => 'UprightCenterMode' },
+	'uprightcenternormx' => { 366 => 'UprightCenterNormX' },
+	'uprightcenternormy' => { 366 => 'UprightCenterNormY' },
+	'uprightdependentdigest' => { 366 => 'UprightDependentDigest' },
+	'uprightfocallength35mm' => { 366 => 'UprightFocalLength35mm' },
+	'uprightfocalmode' => { 366 => 'UprightFocalMode' },
+	'uprightpreview' => { 366 => 'UprightPreview' },
+	'uprighttransform_0' => { 366 => 'UprightTransform_0' },
+	'uprighttransform_1' => { 366 => 'UprightTransform_1' },
+	'uprighttransform_2' => { 366 => 'UprightTransform_2' },
+	'uprighttransform_3' => { 366 => 'UprightTransform_3' },
+	'uprighttransform_4' => { 366 => 'UprightTransform_4' },
+	'uprighttransformcount' => { 366 => 'UprightTransformCount' },
+	'uprightversion' => { 366 => 'UprightVersion' },
+	'urgency' => { 103 => 0xa, 378 => 'Urgency' },
+	'url' => { 126 => 'URL', 242 => 'URL', 292 => 0x40b, 380 => 'url' },
+	'usablemeteringmodes' => { 68 => 0x10a },
+	'usableshootingmodes' => { 68 => 0x109 },
+	'usage' => { 381 => 'usage' },
+	'usagefee' => { 382 => 'usageFee' },
+	'usageterms' => { 393 => 'UsageTerms' },
+	'useguidelines' => { 364 => 'useGuidelines' },
+	'usepanoramaviewer' => { 356 => 'UsePanoramaViewer' },
+	'usercomment' => { 81 => 0x805, 95 => 0x9286, 370 => 'UserComment' },
+	'userdef1picturestyle' => { 17 => 0x10c, 56 => 0xd8, 57 => 0xf0 },
+	'userdef2picturestyle' => { 17 => 0x10e, 56 => 0xda, 57 => 0xf2 },
+	'userdef3picturestyle' => { 17 => 0x110, 56 => 0xdc, 57 => 0xf4 },
+	'userfields' => { 359 => 'UserFields' },
+	'userlabel' => { 299 => 0x2b },
+	'userprofile' => { 246 => 0x302, 252 => 0x3038 },
+	'usmlenselectronicmf' => { 67 => 0x7, 68 => 0x501 },
+	'utmeasting' => { 137 => 'Easting' },
+	'utmmapdatum' => { 137 => 'Datum' },
+	'utmnorthing' => { 137 => 'Northing' },
+	'utmzone' => { 137 => 'Zone' },
+	'uv-irfiltercorrection' => { 246 => 0x325 },
+	'validbits' => { 235 => 0x611, 236 => 0x102c },
+	'validpixeldepth' => { 239 => 0x611 },
+	'variousmodes' => { 111 => 0x26 },
+	'variousmodes2' => { 111 => 0x3a },
+	'variprogram' => { 181 => 0xab },
+	'version' => { 100 => 0x0, 294 => 'Version', 366 => 'Version' },
+	'versioncreatedate' => { 352 => 0xd100 },
+	'versionid' => { 390 => 'VersionID' },
+	'versionidentifier' => { 380 => 'versionIdentifier' },
+	'versionmodifydate' => { 352 => 0xd101 },
+	'versions' => { 390 => 'Versions' },
+	'versionscomments' => { 390 => [\'Versions','VersionsComments'] },
+	'versionsevent' => { 390 => [\'Versions','VersionsEvent'] },
+	'versionseventaction' => { 390 => [\'Versions','VersionsEventAction'] },
+	'versionseventchanged' => { 390 => [\'Versions','VersionsEventChanged'] },
+	'versionseventinstanceid' => { 390 => [\'Versions','VersionsEventInstanceID'] },
+	'versionseventparameters' => { 390 => [\'Versions','VersionsEventParameters'] },
+	'versionseventsoftwareagent' => { 390 => [\'Versions','VersionsEventSoftwareAgent'] },
+	'versionseventwhen' => { 390 => [\'Versions','VersionsEventWhen'] },
+	'versionsmodifier' => { 390 => [\'Versions','VersionsModifier'] },
+	'versionsmodifydate' => { 390 => [\'Versions','VersionsModifyDate'] },
+	'versionsversion' => { 390 => [\'Versions','VersionsVersion'] },
+	'verticalafonbutton' => { 221 => '3.2' },
+	'vfdisplayillumination' => { 68 => 0x510 },
+	'vibrance' => { 360 => 'Vibrance', 366 => 'Vibrance' },
+	'vibrationreduction' => { 187 => [0x75,0x82,0x1ae], 195 => '586.1', 201 => '590.2', 205 => 0x4 },
+	'videoalphamode' => { 389 => 'videoAlphaMode' },
+	'videoalphapremultiplecolor' => { 389 => 'videoAlphaPremultipleColor' },
+	'videoalphapremultiplecolora' => { 389 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorA'] },
+	'videoalphapremultiplecolorb' => { 389 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorB'] },
+	'videoalphapremultiplecolorblack' => { 389 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorBlack'] },
+	'videoalphapremultiplecolorblue' => { 389 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorBlue'] },
+	'videoalphapremultiplecolorcyan' => { 389 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorCyan'] },
+	'videoalphapremultiplecolorgreen' => { 389 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorGreen'] },
+	'videoalphapremultiplecolorl' => { 389 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorL'] },
+	'videoalphapremultiplecolormagenta' => { 389 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorMagenta'] },
+	'videoalphapremultiplecolormode' => { 389 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorMode'] },
+	'videoalphapremultiplecolorred' => { 389 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorRed'] },
+	'videoalphapremultiplecolorswatchname' => { 389 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorSwatchName'] },
+	'videoalphapremultiplecolortint' => { 389 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorTint'] },
+	'videoalphapremultiplecolortype' => { 389 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorType'] },
+	'videoalphapremultiplecoloryellow' => { 389 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorYellow'] },
+	'videoalphaunityistransparent' => { 389 => 'videoAlphaUnityIsTransparent' },
+	'videocodec' => { 54 => 0x74 },
+	'videocolorspace' => { 389 => 'videoColorSpace' },
+	'videocompressor' => { 389 => 'videoCompressor' },
+	'videofieldorder' => { 389 => 'videoFieldOrder' },
+	'videoframerate' => { 389 => 'videoFrameRate' },
+	'videoframesize' => { 389 => 'videoFrameSize' },
+	'videoframesizeh' => { 389 => [\'videoFrameSize','videoFrameSizeH'] },
+	'videoframesizeunit' => { 389 => [\'videoFrameSize','videoFrameSizeUnit'] },
+	'videoframesizew' => { 389 => [\'videoFrameSize','videoFrameSizeW'] },
+	'videomoddate' => { 389 => 'videoModDate' },
+	'videopixelaspectratio' => { 389 => 'videoPixelAspectRatio' },
+	'videopixeldepth' => { 389 => 'videoPixelDepth' },
+	'videoquality' => { 91 => 0x4003 },
+	'viewfinderdisplay' => { 221 => '12.4' },
+	'viewfinderwarning' => { 221 => '13.4', 227 => '3.5', 228 => '6.2', 230 => '4.4' },
+	'viewfinderwarnings' => { 68 => 0x40a },
+	'viewinfoduringexposure' => { 68 => 0x407 },
+	'viewingmode' => { 318 => 0x2f, 331 => 0x18 },
+	'viewingmode2' => { 318 => [0x85,0x285] },
+	'vignetteamount' => { 366 => 'VignetteAmount' },
+	'vignettecontrol' => { 181 => 0x2a, 214 => 0x76a43205 },
+	'vignettecontrolintensity' => { 214 => 0xac6bd5c0 },
+	'vignettemidpoint' => { 366 => 'VignetteMidpoint' },
+	'vignetting' => { 303 => 0x1011 },
+	'vignettingcorrection' => { 271 => 0x2, 328 => 0x2011 },
+	'voicememo' => { 310 => 0x216 },
+	'volume' => { 380 => 'volume' },
+	'vr_0x66' => { 187 => 0x66 },
+	'vrdoffset' => { 51 => 0xd0 },
+	'vrmode' => { 205 => 0x6 },
+	'wb_bluelevel3500k' => { 153 => 0x19a },
+	'wb_bluelevel6500k' => { 153 => 0x18a },
+	'wb_bluelevelcustom' => { 153 => 0x18e },
+	'wb_bluelevelscloudy' => { 153 => 0x106 },
+	'wb_bluelevelsdaylight' => { 153 => 0xea },
+	'wb_bluelevelsflash' => { 153 => 0x122 },
+	'wb_bluelevelsfluorescent' => { 153 => [0x40a,0x15a] },
+	'wb_bluelevelskelvin' => { 153 => 0x254 },
+	'wb_bluelevelsshade' => { 153 => 0x176 },
+	'wb_bluelevelstungsten' => { 153 => 0xce },
+	'wb_gbrglevels' => { 153 => 0xae, 156 => 0x4 },
+	'wb_glevel' => { 235 => 0x11f },
+	'wb_glevel3000k' => { 235 => 0x113 },
+	'wb_glevel3300k' => { 235 => 0x114 },
+	'wb_glevel3600k' => { 235 => 0x115 },
+	'wb_glevel3900k' => { 235 => 0x116 },
+	'wb_glevel4000k' => { 235 => 0x117 },
+	'wb_glevel4300k' => { 235 => 0x118 },
+	'wb_glevel4500k' => { 235 => 0x119 },
+	'wb_glevel4800k' => { 235 => 0x11a },
+	'wb_glevel5300k' => { 235 => 0x11b },
+	'wb_glevel6000k' => { 235 => 0x11c },
+	'wb_glevel6600k' => { 235 => 0x11d },
+	'wb_glevel7500k' => { 235 => 0x11e },
+	'wb_grbglevels' => { 164 => 0x0 },
+	'wb_rbgglevels' => { 161 => 0x0 },
+	'wb_rblevels' => { 181 => 0xc, 235 => 0x100 },
+	'wb_rblevels3000k' => { 235 => 0x102 },
+	'wb_rblevels3300k' => { 235 => 0x103 },
+	'wb_rblevels3500k' => { 153 => 0x430 },
+	'wb_rblevels3600k' => { 235 => 0x104 },
+	'wb_rblevels3900k' => { 235 => 0x105 },
+	'wb_rblevels4000k' => { 235 => 0x106 },
+	'wb_rblevels4300k' => { 235 => 0x107 },
+	'wb_rblevels4500k' => { 235 => 0x108 },
+	'wb_rblevels4800k' => { 235 => 0x109 },
+	'wb_rblevels5300k' => { 235 => 0x10a },
+	'wb_rblevels6000k' => { 235 => 0x10b },
+	'wb_rblevels6500k' => { 153 => 0x420 },
+	'wb_rblevels6600k' => { 235 => 0x10c },
+	'wb_rblevels7500k' => { 235 => 0x10d },
+	'wb_rblevelsauto' => { 239 => 0x110 },
+	'wb_rblevelscloudy' => { 153 => 0x3f0, 155 => 0x10, 239 => 0x121 },
+	'wb_rblevelscoolwhitef' => { 153 => 0x308, 155 => 0x14 },
+	'wb_rblevelscoolwhitefluor' => { 239 => 0x132 },
+	'wb_rblevelscustom' => { 153 => 0x424 },
+	'wb_rblevelscwb1' => { 235 => 0x10e },
+	'wb_rblevelscwb2' => { 235 => 0x10f },
+	'wb_rblevelscwb3' => { 235 => 0x110 },
+	'wb_rblevelscwb4' => { 235 => 0x111 },
+	'wb_rblevelsdaylight' => { 153 => [0x3ec,0x528], 155 => 0xc },
+	'wb_rblevelsdaylightf' => { 155 => 0x24 },
+	'wb_rblevelsdaylightfluor' => { 239 => 0x130 },
+	'wb_rblevelsdaywhitef' => { 155 => 0x28 },
+	'wb_rblevelsdaywhitefluor' => { 239 => 0x131 },
+	'wb_rblevelseveningsunlight' => { 239 => 0x124 },
+	'wb_rblevelsfineweather' => { 239 => 0x122 },
+	'wb_rblevelsflash' => { 153 => [0x3f4,0x304], 155 => 0x18 },
+	'wb_rblevelsshade' => { 153 => 0x418, 155 => 0x20, 239 => 0x120 },
+	'wb_rblevelstungsten' => { 153 => 0x3e8, 155 => 0x8, 239 => 0x123 },
+	'wb_rblevelsunknown' => { 155 => 0x1c },
+	'wb_rblevelsused' => { 239 => 0x100 },
+	'wb_rblevelswhitef' => { 155 => 0x2c },
+	'wb_rblevelswhitefluorescent' => { 239 => 0x133 },
+	'wb_redlevel3500k' => { 153 => 0x198 },
+	'wb_redlevel6500k' => { 153 => 0x188 },
+	'wb_redlevelcustom' => { 153 => 0x18c },
+	'wb_redlevelscloudy' => { 153 => 0xf8 },
+	'wb_redlevelsdaylight' => { 153 => 0xdc },
+	'wb_redlevelsflash' => { 153 => 0x114 },
+	'wb_redlevelsfluorescent' => { 153 => [0x3fc,0x14c] },
+	'wb_redlevelskelvin' => { 153 => 0x1be },
+	'wb_redlevelsshade' => { 153 => 0x168 },
+	'wb_redlevelstungsten' => { 153 => 0xc0 },
+	'wb_rgbglevels' => { 163 => 0x0 },
+	'wb_rgblevels' => { 153 => [0x546,0x96], 247 => 0xd, 248 => 0x413, 252 => 0x3036, 334 => 0x117c, 335 => 0x1180, 336 => 0x115c, 337 => 0x11d8, 338 => 0x11b4, 339 => 0x106c, 340 => 0x264 },
+	'wb_rggblevels' => { 156 => 0x4, 162 => 0x0 },
+	'wb_rggblevelsasshot' => { 32 => 0x0, 33 => 0x19, 34 => 0x22, 35 => 0x3f, 38 => 0x3f, 39 => 0x3f },
+	'wb_rggblevelsauto' => { 30 => 0x0, 32 => 0x5, 33 => 0x1e, 34 => 0x18, 35 => 0x44, 38 => 0x44, 39 => 0x44, 308 => 0xa022 },
+	'wb_rggblevelsblack' => { 308 => 0xa028 },
+	'wb_rggblevelscloudy' => { 30 => 0xc, 32 => 0x1e, 33 => 0x2d, 34 => 0x31, 35 => 0x58, 38 => 0x71, 39 => 0x8a, 281 => 0x20f, 288 => 0x14 },
+	'wb_rggblevelscustom' => { 30 => 0x1c, 35 => 0x80 },
+	'wb_rggblevelscustom1' => { 33 => 0x41 },
+	'wb_rggblevelscustom2' => { 33 => 0x46 },
+	'wb_rggblevelsdaylight' => { 30 => 0x4, 32 => 0x14, 33 => 0x23, 34 => 0x27, 35 => 0x4e, 38 => 0x67, 39 => 0x80, 281 => 0x20d, 288 => 0x2 },
+	'wb_rggblevelsflash' => { 30 => 0x18, 32 => 0x32, 33 => 0x3c, 34 => 0x45, 35 => 0x6c, 38 => 0x85, 39 => 0x9e, 281 => 0x214, 288 => 0x41 },
+	'wb_rggblevelsfluorescent' => { 30 => 0x14, 32 => 0x28, 33 => 0x37, 34 => 0x3b, 35 => 0x62, 38 => 0x7b, 39 => 0x94 },
+	'wb_rggblevelsfluorescentd' => { 281 => 0x211, 288 => 0x26 },
+	'wb_rggblevelsfluorescentl' => { 288 => 0x4a },
+	'wb_rggblevelsfluorescentn' => { 281 => 0x212, 288 => 0x2f },
+	'wb_rggblevelsfluorescentw' => { 281 => 0x213, 288 => 0x38 },
+	'wb_rggblevelsilluminator1' => { 308 => 0xa023 },
+	'wb_rggblevelsilluminator2' => { 308 => 0xa024 },
+	'wb_rggblevelskelvin' => { 30 => 0x20, 32 => 0x2d, 34 => 0x40, 35 => 0x67, 38 => 0x80, 39 => 0x99 },
+	'wb_rggblevelsmeasured' => { 32 => 0xa, 35 => 0x49, 38 => 0x49, 39 => 0x49 },
+	'wb_rggblevelspc1' => { 34 => 0x90, 35 => 0x71 },
+	'wb_rggblevelspc2' => { 34 => 0x95, 35 => 0x76 },
+	'wb_rggblevelspc3' => { 34 => 0x9a, 35 => 0x7b },
+	'wb_rggblevelsshade' => { 30 => 0x8, 32 => 0x19, 33 => 0x28, 34 => 0x2c, 35 => 0x53, 38 => 0x6c, 39 => 0x85, 281 => 0x20e, 288 => 0xb },
+	'wb_rggblevelstungsten' => { 30 => 0x10, 32 => 0x23, 33 => 0x32, 34 => 0x36, 35 => 0x5d, 38 => 0x76, 39 => 0x8f, 281 => 0x210, 288 => 0x1d },
+	'wb_rggblevelsuncorrected' => { 308 => 0xa021 },
+	'wb_rggblevelsunknown' => { 32 => 0xf, 34 => 0x1d, 38 => 0x4e, 39 => 0x4e, 288 => 0x53 },
+	'wb_rggblevelsunknown10' => { 32 => 0x5f, 34 => 0x72, 38 => 0x9e, 39 => 0x7b },
+	'wb_rggblevelsunknown11' => { 32 => 0x64, 34 => 0x77, 38 => 0xa3, 39 => 0xa3 },
+	'wb_rggblevelsunknown12' => { 32 => 0x69, 34 => 0x7c, 38 => 0xa8, 39 => 0xa8 },
+	'wb_rggblevelsunknown13' => { 32 => 0x6e, 34 => 0x81, 38 => 0xad, 39 => 0xad },
+	'wb_rggblevelsunknown14' => { 34 => 0x86, 38 => 0xb2, 39 => 0xb2 },
+	'wb_rggblevelsunknown15' => { 34 => 0x8b, 38 => 0xb7, 39 => 0xb7 },
+	'wb_rggblevelsunknown16' => { 34 => 0x9f, 39 => 0xbc },
+	'wb_rggblevelsunknown17' => { 39 => 0xc1 },
+	'wb_rggblevelsunknown18' => { 39 => 0xc6 },
+	'wb_rggblevelsunknown19' => { 39 => 0xcb },
+	'wb_rggblevelsunknown2' => { 32 => 0x37, 34 => 0x4a, 38 => 0x53, 39 => 0x53 },
+	'wb_rggblevelsunknown20' => { 39 => 0xd0 },
+	'wb_rggblevelsunknown3' => { 32 => 0x3c, 34 => 0x4f, 38 => 0x58, 39 => 0x58 },
+	'wb_rggblevelsunknown4' => { 32 => 0x41, 34 => 0x54, 38 => 0x5d, 39 => 0x5d },
+	'wb_rggblevelsunknown5' => { 32 => 0x46, 34 => 0x59, 38 => 0x62, 39 => 0x62 },
+	'wb_rggblevelsunknown6' => { 32 => 0x4b, 34 => 0x5e, 38 => 0x8a, 39 => 0x67 },
+	'wb_rggblevelsunknown7' => { 32 => 0x50, 34 => 0x63, 38 => 0x8f, 39 => 0x6c },
+	'wb_rggblevelsunknown8' => { 32 => 0x55, 34 => 0x68, 38 => 0x94, 39 => 0x71 },
+	'wb_rggblevelsunknown9' => { 32 => 0x5a, 34 => 0x6d, 38 => 0x99, 39 => 0x76 },
+	'wb_rggblevelsuserselected' => { 288 => 0x5c },
+	'wbadjbluebalance' => { 220 => 0x8 },
+	'wbadjcolortemp' => { 86 => 0x1a },
+	'wbadjlighting' => { 220 => 0x15 },
+	'wbadjlightingsubtype' => { 220 => 0x14 },
+	'wbadjmode' => { 220 => 0x10 },
+	'wbadjredbalance' => { 220 => 0x0 },
+	'wbadjrggblevels' => { 86 => 0x6 },
+	'wbadjtemperature' => { 220 => 0x18 },
+	'wbadjtint' => { 220 => 0x25 },
+	'wbbluelevel' => { 246 => 0x324, 250 => 0x8006, 254 => 0x26 },
+	'wbbracketmode' => { 46 => 0x9 },
+	'wbbracketshotnumber' => { 153 => 0x2b, 303 => 0x101a },
+	'wbbracketvalueab' => { 46 => 0xc },
+	'wbbracketvaluegm' => { 46 => 0xd },
+	'wbfinetuneactive' => { 86 => 0x24 },
+	'wbfinetunesaturation' => { 86 => 0x28 },
+	'wbfinetunetone' => { 86 => 0x2c },
+	'wbgreenlevel' => { 246 => 0x323, 250 => 0x8005, 254 => 0x25 },
+	'wbmediaimagesizesetting' => { 68 => 0x708 },
+	'wbmode' => { 155 => 0x4, 236 => 0x1015 },
+	'wbredlevel' => { 246 => 0x322, 250 => 0x8004, 254 => 0x24 },
+	'wbscale' => { 156 => 0x0 },
+	'wbshiftab' => { 60 => 0xc, 250 => 0x46, 263 => 0x10 },
+	'wbshiftab_gm' => { 328 => 0x2014 },
+	'wbshiftgm' => { 60 => 0xd, 250 => 0x47, 263 => 0x11 },
+	'webstatement' => { 393 => 'WebStatement' },
+	'whitebalance' => { 5 => 0x6f, 6 => [0x44,0x4a], 7 => 0xbc, 8 => 0x36, 9 => 0x5e, 10 => 0x36, 11 => 0x78, 12 => 0x6f, 13 => 0x6f, 14 => 0x73, 15 => 0x6f, 16 => 0x78, 17 => 0x54, 18 => 0x6f, 19 => 0xbc, 20 => 0x7b, 22 => 0xbc, 23 => 0xc2, 25 => 0x77, 60 => 0x8, 62 => 0x7, 90 => 0x7, 91 => [0x19,0x2012], 95 => [0xa403,0xfe4e], 100 => 0x1002, 109 => 0x3fc, 110 => 0xfa0d, 111 => 0x40, 147 => 0x3, 148 => 0xe, 149 => 0x4, 150 => 0xb, 152 => 0x115, 181 => 0x5, 204 => 0x7, 246 => 0x304, 250 => 0x3, 252 => 0x3033, 281 => 0x19, 287 => 0x7, 302 => 0x26, 303 => 0x1003, 311 => [0x3c,0x7,0x58], 328 => [0x115,0xb054], 366 => 'WhiteBalance', 370 => 'WhiteBalance' },
+	'whitebalance2' => { 231 => 0x500 },
+	'whitebalanceadj' => { 86 => 0x18, 214 => 0x76a43204 },
+	'whitebalanceautoadjustment' => { 259 => 0x0 },
+	'whitebalancebias' => { 91 => 0x2011, 236 => 0x304, 250 => 0x23 },
+	'whitebalanceblue' => { 60 => 0x7 },
+	'whitebalancebracket' => { 231 => 0x502, 236 => 0x303 },
+	'whitebalancebracketing' => { 150 => 0x22, 153 => 0x2c, 327 => 0x2c },
+	'whitebalancecomp' => { 239 => 0x1001 },
+	'whitebalancefinetune' => { 100 => 0x100a, 150 => 0x38, 152 => 0x112, 181 => 0xb, 303 => 0x1004, 316 => 0x6, 328 => 0x112 },
+	'whitebalancemode' => { 281 => 0x1a },
+	'whitebalancered' => { 60 => 0x6 },
+	'whitebalanceset' => { 262 => 0xa },
+	'whitebalancesetting' => { 150 => 0x23, 318 => 0x16, 331 => 0xd },
+	'whitebalancetemperature' => { 231 => 0x501 },
+	'whiteboard' => { 236 => 0x301 },
+	'whitelevel' => { 95 => 0xc61d },
+	'whitepoint' => { 95 => 0x13e, 281 => 0x201, 385 => 'WhitePoint' },
+	'whites2012' => { 366 => 'Whites2012' },
+	'wideadapter' => { 303 => 0x1017 },
+	'widefocuszone' => { 147 => 0x2f },
+	'widerange' => { 310 => 0x20f },
+	'wordcount' => { 380 => 'wordCount' },
+	'workcolorspace' => { 86 => 0x270 },
+	'worktodo' => { 372 => 'WorkToDo' },
+	'worldtimelocation' => { 250 => 0x3a, 281 => 0x22, 286 => '0.1' },
+	'writer-editor' => { 103 => 0x7a },
+	'x3filllight' => { 311 => 0x12 },
+	'xml' => { 107 => 'xml ' },
+	'xmp' => { 85 => 0xffff00f6, 96 => 'XMP' },
+	'xmptoolkit' => { 386 => 'xmptk' },
+	'xpauthor' => { 95 => 0x9c9d },
+	'xpcomment' => { 95 => 0x9c9c },
+	'xpkeywords' => { 95 => 0x9c9e },
+	'xposition' => { 95 => 0x11e },
+	'xpsubject' => { 95 => 0x9c9f },
+	'xptitle' => { 95 => 0x9c9b },
+	'xresolution' => { 95 => 0x11a, 106 => 0x3, 293 => 0x0, 385 => 'XResolution' },
+	'xyresolution' => { 99 => 0x3 },
+	'ycbcrcoefficients' => { 95 => 0x211, 385 => 'YCbCrCoefficients' },
+	'ycbcrpositioning' => { 95 => 0x213, 385 => 'YCbCrPositioning' },
+	'ycbcrsubsampling' => { 95 => 0x212, 385 => 'YCbCrSubSampling' },
+	'yearcreated' => { 111 => 0x10, 120 => 0xc },
+	'yposition' => { 95 => 0x11f },
+	'yresolution' => { 95 => 0x11b, 106 => 0x5, 293 => 0x4, 385 => 'YResolution' },
+	'zonematching' => { 152 => 0x10a, 155 => [0x3a,0x4a], 328 => 0xb024 },
+	'zonematchingmode' => { 150 => 0x14 },
+	'zonematchingon' => { 149 => 0x75 },
+	'zonematchingvalue' => { 316 => 0x1f },
+	'zoomedpreviewlength' => { 236 => 0xf05 },
+	'zoomedpreviewsize' => { 236 => 0xf06 },
+	'zoomedpreviewstart' => { 236 => 0xf04 },
+	'zoomsourcewidth' => { 29 => 0x24 },
+	'zoomstepcount' => { 234 => 0x300, 236 => 0x100d },
+	'zoomtargetwidth' => { 29 => 0x25 },
 );
 
 # lookup for non-writable tags to check if the name exists
@@ -4189,7 +4459,6 @@ my %tagExists = (
 	'aeinfo2' => 1,
 	'aeinfo3' => 1,
 	'aeinfounknown' => 1,
-	'aeunknown' => 1,
 	'afarea' => 1,
 	'afareaheights' => 1,
 	'afareawidths' => 1,
@@ -4223,6 +4492,7 @@ my %tagExists = (
 	'allcolorflatfield1' => 1,
 	'allcolorflatfield2' => 1,
 	'allcolorflatfield3' => 1,
+	'alpha' => 1,
 	'alphabitdepth' => 1,
 	'alphabytecount' => 1,
 	'alphachannelsnames' => 1,
@@ -4242,9 +4512,12 @@ my %tagExists = (
 	'annotation' => 1,
 	'annotations' => 1,
 	'annotationusagerights' => 1,
+	'announce' => 1,
+	'announcelist1' => 1,
 	'anta' => 1,
 	'aperture' => 1,
 	'aperturedisplayed' => 1,
+	'aperturemode' => 1,
 	'apeversion' => 1,
 	'app14flags0' => 1,
 	'app14flags1' => 1,
@@ -4358,8 +4631,11 @@ my %tagExists = (
 	'authorship' => 1,
 	'authorsortorder' => 1,
 	'authorurl' => 1,
+	'autosavefilepath' => 1,
+	'autosaveformat' => 1,
 	'autosummary' => 1,
 	'aux' => 1,
+	'averagebitrate' => 1,
 	'averagelevel' => 1,
 	'avgbitrate' => 1,
 	'avgbytespersec' => 1,
@@ -4383,28 +4659,35 @@ my %tagExists = (
 	'backserial' => 1,
 	'backuptime' => 1,
 	'badfaxlines' => 1,
+	'bahpver' => 1,
 	'balance' => 1,
+	'balpver' => 1,
 	'band' => 1,
 	'bandwidthsharing' => 1,
 	'bannerimage' => 1,
 	'bannerimagedata' => 1,
 	'bannerimagetype' => 1,
 	'bannerimageurl' => 1,
+	'barcode' => 1,
 	'baselinelength' => 1,
 	'baseviewpointnum' => 1,
 	'basisobject' => 1,
 	'bass' => 1,
+	'battery' => 1,
 	'batteryinfo' => 1,
+	'bavpver' => 1,
 	'bccaddresses' => 1,
 	'bccnames' => 1,
 	'beats-per-minute' => 1,
 	'beatsperminute' => 1,
 	'belowcolor' => 1,
+	'beta' => 1,
 	'billinginformation' => 1,
 	'binaryfilter' => 1,
 	'binaryxml' => 1,
 	'birthday' => 1,
 	'bitrate' => 1,
+	'bitrateinfo' => 1,
 	'bitratemutualexclusion' => 1,
 	'bitsperextendedrunlength' => 1,
 	'bitsperpixel' => 1,
@@ -4438,6 +4721,7 @@ my %tagExists = (
 	'bluetrc' => 1,
 	'bluex' => 1,
 	'bluey' => 1,
+	'boardtemperature' => 1,
 	'booktitle' => 1,
 	'bordercolor' => 1,
 	'borderid' => 1,
@@ -4463,6 +4747,7 @@ my %tagExists = (
 	'btod2' => 1,
 	'btod3' => 1,
 	'bufferaverage' => 1,
+	'buffersize' => 1,
 	'builddate' => 1,
 	'buildversion' => 1,
 	'businessaddress' => 1,
@@ -4481,6 +4766,7 @@ my %tagExists = (
 	'bw_transferfunc' => 1,
 	'bwfversion' => 1,
 	'bytelength' => 1,
+	'byteorder' => 1,
 	'bytes' => 1,
 	'bytesperminute' => 1,
 	'cachecontrol' => 1,
@@ -4491,6 +4777,7 @@ my %tagExists = (
 	'calibrationdatetime' => 1,
 	'callbacknumber' => 1,
 	'callletters' => 1,
+	'camcore' => 1,
 	'camera' => 1,
 	'camera1' => 1,
 	'camera2' => 1,
@@ -4553,6 +4840,7 @@ my %tagExists = (
 	'canoncamerainfo60d' => 1,
 	'canoncamerainfo650d' => 1,
 	'canoncamerainfo6d' => 1,
+	'canoncamerainfo70d' => 1,
 	'canoncamerainfo7d' => 1,
 	'canoncamerainfopowershot' => 1,
 	'canoncamerainfopowershot2' => 1,
@@ -4628,6 +4916,7 @@ my %tagExists = (
 	'chapterflaghidden' => 1,
 	'chapterlanguage' => 1,
 	'chapterlist' => 1,
+	'chapterlisttrackid' => 1,
 	'chapternum' => 1,
 	'chapterphysicalequivalent' => 1,
 	'chapterprocess' => 1,
@@ -4677,10 +4966,17 @@ my %tagExists = (
 	'circleofconfusion' => 1,
 	'class' => 1,
 	'classification' => 1,
+	'cleanaperture' => 1,
 	'cleanaperturedimensions' => 1,
+	'cleanapertureheight' => 1,
+	'cleanapertureoffsetx' => 1,
+	'cleanapertureoffsety' => 1,
+	'cleanaperturewidth' => 1,
 	'cleanfaxdata' => 1,
 	'clientid' => 1,
 	'clipboundary' => 1,
+	'clipfilename' => 1,
+	'clipid' => 1,
 	'clipobjects' => 1,
 	'clippath' => 1,
 	'clippingboundary' => 1,
@@ -4693,6 +4989,11 @@ my %tagExists = (
 	'clusterduration' => 1,
 	'cmmflags' => 1,
 	'cmykequivalent' => 1,
+	'coarsedata' => 1,
+	'coarsemapimage' => 1,
+	'coarsemapimageheight' => 1,
+	'coarsemapimagetype' => 1,
+	'coarsemapimagewidth' => 1,
 	'codecdecodeall' => 1,
 	'codecdownloadurl' => 1,
 	'codecflavorid' => 1,
@@ -4767,6 +5068,7 @@ my %tagExists = (
 	'colorresponseunit' => 1,
 	'colors' => 1,
 	'colorsamplersresource' => 1,
+	'colorsamplersresource2' => 1,
 	'colorsetup' => 1,
 	'colorspacedata' => 1,
 	'colorspecapproximation' => 1,
@@ -4884,8 +5186,10 @@ my %tagExists = (
 	'copyrightfilename' => 1,
 	'copyrightlen' => 1,
 	'copyrighturl' => 1,
+	'correctionmethod' => 1,
 	'costumedesigner' => 1,
 	'count' => 1,
+	'countinfo' => 1,
 	'country-region' => 1,
 	'coverart' => 1,
 	'coverartmimetype' => 1,
@@ -5000,6 +5304,7 @@ my %tagExists = (
 	'datarate' => 1,
 	'dataref' => 1,
 	'datareference' => 1,
+	'datasign' => 1,
 	'datasize' => 1,
 	'datatype' => 1,
 	'datawindow' => 1,
@@ -5026,6 +5331,7 @@ my %tagExists = (
 	'decimationmethod' => 1,
 	'decimationprefilterwidth' => 1,
 	'decode' => 1,
+	'decodeconfig' => 1,
 	'decodertable' => 1,
 	'decodertablenumber' => 1,
 	'decoderversion' => 1,
@@ -5052,6 +5358,8 @@ my %tagExists = (
 	'designerurl' => 1,
 	'desiredreproductions' => 1,
 	'destinationid' => 1,
+	'detector' => 1,
+	'detectorboard' => 1,
 	'deviceattributes' => 1,
 	'devicemanufacturer' => 1,
 	'devicemfgdesc' => 1,
@@ -5093,14 +5401,13 @@ my %tagExists = (
 	'distortionversion' => 1,
 	'distributedby' => 1,
 	'distribution' => 1,
+	'dittokey' => 1,
 	'division' => 1,
 	'djvuversion' => 1,
 	'dlnaserverudn' => 1,
 	'dlnasourceuri' => 1,
 	'dlodata' => 1,
 	'dlodatalength' => 1,
-	'dngadobedata' => 1,
-	'dngprivatedata' => 1,
 	'docclass' => 1,
 	'docmdp' => 1,
 	'docrights' => 1,
@@ -5114,6 +5421,7 @@ my %tagExists = (
 	'dof' => 1,
 	'donotshow' => 1,
 	'dotsperinch' => 1,
+	'dpxfilesize' => 1,
 	'driveserialnumber' => 1,
 	'drivetype' => 1,
 	'drm' => 1,
@@ -5182,6 +5490,7 @@ my %tagExists = (
 	'effectivebw' => 1,
 	'effectsvisible' => 1,
 	'eighthlanguage' => 1,
+	'elementarystreamtrack' => 1,
 	'embeddedaudiofile' => 1,
 	'embeddedfile' => 1,
 	'embeddedfilename' => 1,
@@ -5190,6 +5499,7 @@ my %tagExists = (
 	'embeddedimagecolorspace' => 1,
 	'embeddedimagefilter' => 1,
 	'embeddedimageheight' => 1,
+	'embeddedimagetype' => 1,
 	'embeddedimagewidth' => 1,
 	'emphasis' => 1,
 	'encodedby' => 1,
@@ -5198,6 +5508,7 @@ my %tagExists = (
 	'encodedwith' => 1,
 	'encoder' => 1,
 	'encodersettings' => 1,
+	'encodervendor' => 1,
 	'encoderversion' => 1,
 	'encoding' => 1,
 	'encodingparams' => 1,
@@ -5233,6 +5544,7 @@ my %tagExists = (
 	'evstepinfo' => 1,
 	'exif_profile' => 1,
 	'exifdata' => 1,
+	'exifex' => 1,
 	'exifinfo' => 1,
 	'exifinfo2' => 1,
 	'exifinformation' => 1,
@@ -5309,6 +5621,7 @@ my %tagExists = (
 	'faceinfo' => 1,
 	'faceinfo1' => 1,
 	'faceinfo2' => 1,
+	'faceinfoa' => 1,
 	'faceinfolength' => 1,
 	'faceinfooffset' => 1,
 	'facepos' => 1,
@@ -5320,8 +5633,15 @@ my %tagExists = (
 	'faxrecvtime' => 1,
 	'faxsubaddress' => 1,
 	'fieldmdp' => 1,
+	'fieldofview' => 1,
 	'fieldpermissions' => 1,
 	'fifthlanguage' => 1,
+	'file1duration' => 1,
+	'file1length' => 1,
+	'file1md5sum' => 1,
+	'file1media' => 1,
+	'file1path' => 1,
+	'file1pathutf-8' => 1,
 	'fileaccessdate' => 1,
 	'fileas' => 1,
 	'fileattributes' => 1,
@@ -5375,6 +5695,7 @@ my %tagExists = (
 	'firstname' => 1,
 	'firstobject' => 1,
 	'firstobjectid' => 1,
+	'fisheyefilter' => 1,
 	'flac' => 1,
 	'flagcolor' => 1,
 	'flags' => 1,
@@ -5394,6 +5715,13 @@ my %tagExists = (
 	'flashversion' => 1,
 	'flavor' => 1,
 	'flir' => 1,
+	'flir_gps' => 1,
+	'flir_moreinfo' => 1,
+	'flir_params' => 1,
+	'flir_parts' => 1,
+	'flir_serial' => 1,
+	'flir_unknown' => 1,
+	'flir_unknownuuid' => 1,
 	'focallength35efl' => 1,
 	'focallength35mm' => 1,
 	'focalplanecolorimetryestimates' => 1,
@@ -5435,7 +5763,7 @@ my %tagExists = (
 	'fragmentlist' => 1,
 	'fragmenttable' => 1,
 	'frame' => 1,
-	'frameheight' => 1,
+	'frameid' => 1,
 	'frameinfo' => 1,
 	'framepriority' => 1,
 	'framereadouttime' => 1,
@@ -5443,7 +5771,6 @@ my %tagExists = (
 	'framesizemax' => 1,
 	'framesizemin' => 1,
 	'framespersecond' => 1,
-	'framewidth' => 1,
 	'free' => 1,
 	'free-busystatus' => 1,
 	'freebytecounts' => 1,
@@ -5461,6 +5788,11 @@ my %tagExists = (
 	'fullname' => 1,
 	'fullscreen' => 1,
 	'gain' => 1,
+	'gaindeaddata' => 1,
+	'gaindeadmapimage' => 1,
+	'gaindeadmapimageheight' => 1,
+	'gaindeadmapimagetype' => 1,
+	'gaindeadmapimagewidth' => 1,
 	'gamut' => 1,
 	'gapless' => 1,
 	'gdalmetadata' => 1,
@@ -5493,20 +5825,29 @@ my %tagExists = (
 	'geographictype' => 1,
 	'geogsemimajoraxis' => 1,
 	'geogsemiminoraxis' => 1,
-	'geotiffasciiparams' => 1,
-	'geotiffdirectory' => 1,
-	'geotiffdoubleparams' => 1,
+	'geogtowgs84' => 1,
 	'geotiffversion' => 1,
 	'getty' => 1,
+	'gidcver' => 1,
+	'gidpver' => 1,
 	'gifapplicationextension' => 1,
 	'gifgraphiccontrolextension' => 1,
 	'gifplaintextextension' => 1,
 	'gifversion' => 1,
+	'gipc_cpld' => 1,
+	'gipcver' => 1,
 	'givenname' => 1,
+	'gixiver' => 1,
 	'globalinfo' => 1,
 	'globalparametersifd' => 1,
 	'globalpixelsize' => 1,
 	'googlebot' => 1,
+	'googlehostheader' => 1,
+	'googlepingmessage' => 1,
+	'googlepingurl' => 1,
+	'googlesourcedata' => 1,
+	'googlestarttime' => 1,
+	'googletrackduration' => 1,
 	'goprotype' => 1,
 	'gpano' => 1,
 	'gps' => 1,
@@ -5558,11 +5899,13 @@ my %tagExists = (
 	'hcusage' => 1,
 	'hdrinfo' => 1,
 	'hdrl' => 1,
+	'hdrtoninginfo' => 1,
 	'hdvideo' => 1,
 	'header' => 1,
 	'headerext' => 1,
 	'headerextension' => 1,
 	'headersize' => 1,
+	'headerversion' => 1,
 	'headingpairs' => 1,
 	'heightresolution' => 1,
 	'hiddenslides' => 1,
@@ -5573,6 +5916,7 @@ my %tagExists = (
 	'hintinfo' => 1,
 	'hintsampledesc' => 1,
 	'hinttrackinfo' => 1,
+	'hinttrackversion' => 1,
 	'hintversion' => 1,
 	'historybuffersize' => 1,
 	'hobbies' => 1,
@@ -5590,6 +5934,7 @@ my %tagExists = (
 	'hotkey' => 1,
 	'howpublished' => 1,
 	'hp_tdhd' => 1,
+	'htcinfo' => 1,
 	'http-equiv' => 1,
 	'httphostheader' => 1,
 	'huffmantable' => 1,
@@ -5624,6 +5969,13 @@ my %tagExists = (
 	'im' => 1,
 	'imaddresses' => 1,
 	'image' => 1,
+	'image2description' => 1,
+	'image3description' => 1,
+	'image4description' => 1,
+	'image5description' => 1,
+	'image6description' => 1,
+	'image7description' => 1,
+	'image8description' => 1,
 	'imagearrangement' => 1,
 	'imageboardid' => 1,
 	'imagebounds' => 1,
@@ -5636,7 +5988,9 @@ my %tagExists = (
 	'imagedatadiscard' => 1,
 	'imagedataoffset' => 1,
 	'imagedepth' => 1,
+	'imageelements' => 1,
 	'imagefields' => 1,
+	'imagefilename' => 1,
 	'imageformat' => 1,
 	'imageheader' => 1,
 	'imageid' => 1,
@@ -5652,6 +6006,7 @@ my %tagExists = (
 	'imageprofile' => 1,
 	'imageprops' => 1,
 	'imagerboardid' => 1,
+	'imagereadyvariables' => 1,
 	'imageresolution' => 1,
 	'imageresources' => 1,
 	'imagerotated' => 1,
@@ -5698,12 +6053,15 @@ my %tagExists = (
 	'infourl' => 1,
 	'ingrreserved' => 1,
 	'initialdisplayeffect' => 1,
+	'initializationvector' => 1,
 	'initializeddatasize' => 1,
 	'initialkey' => 1,
 	'initialobjectdescriptor' => 1,
 	'initials' => 1,
 	'inknames' => 1,
 	'inputdataobjectlist' => 1,
+	'inputdevicename' => 1,
+	'inputdeviceserialnumber' => 1,
 	'inputprofile' => 1,
 	'insertmode' => 1,
 	'institution' => 1,
@@ -5773,6 +6131,8 @@ my %tagExists = (
 	'itemlist' => 1,
 	'itemlocation' => 1,
 	'itemprotection' => 1,
+	'itemtool' => 1,
+	'itemvendorid' => 1,
 	'iterationcount' => 1,
 	'iterationendaction' => 1,
 	'iterationmax' => 1,
@@ -5791,6 +6151,8 @@ my %tagExists = (
 	'journal' => 1,
 	'jp2header' => 1,
 	'jp2signature' => 1,
+	'jpeg-hdr' => 1,
+	'jpeg-hdrversion' => 1,
 	'jpeg_quality' => 1,
 	'jpegactables' => 1,
 	'jpegdctables' => 1,
@@ -5811,6 +6173,7 @@ my %tagExists = (
 	'keycode' => 1,
 	'keyframepositions' => 1,
 	'keyframestimes' => 1,
+	'keyid' => 1,
 	'keys' => 1,
 	'kids' => 1,
 	'kinds' => 1,
@@ -5851,8 +6214,9 @@ my %tagExists = (
 	'lastprinted' => 1,
 	'lasttimestamp' => 1,
 	'layercomps' => 1,
+	'layergroupsenabledid' => 1,
+	'layerselectionids' => 1,
 	'layersgroupinfo' => 1,
-	'layerstateinfo' => 1,
 	'layout' => 1,
 	'leadperformer' => 1,
 	'leafautoactive' => 1,
@@ -5890,6 +6254,7 @@ my %tagExists = (
 	'licenseinfourl' => 1,
 	'lightingopt' => 1,
 	'lightness' => 1,
+	'lightroomworkflow' => 1,
 	'lights' => 1,
 	'lightvalue' => 1,
 	'linearizationcoefficients1' => 1,
@@ -5903,6 +6268,8 @@ my %tagExists = (
 	'linksuptodate' => 1,
 	'linktarget' => 1,
 	'lit' => 1,
+	'ln0' => 1,
+	'ln1' => 1,
 	'localbasepath' => 1,
 	'localdeltatype' => 1,
 	'localeindicator' => 1,
@@ -5931,16 +6298,17 @@ my %tagExists = (
 	'luminance' => 1,
 	'luminanceconsts' => 1,
 	'lyricist' => 1,
-	'lyrics' => 1,
 	'lyrics_synchronised' => 1,
 	'lyricsuri' => 1,
 	'machineid' => 1,
 	'machinetype' => 1,
+	'macintoshnsprintinfo' => 1,
 	'macintoshprintinfo' => 1,
 	'magnification' => 1,
 	'magnifyobject' => 1,
 	'mailingaddress' => 1,
 	'mailstop' => 1,
+	'mainboard' => 1,
 	'maininfo' => 1,
 	'maininfoifd' => 1,
 	'majorbrand' => 1,
@@ -5985,6 +6353,7 @@ my %tagExists = (
 	'maxwidth' => 1,
 	'mc' => 1,
 	'mcdi' => 1,
+	'md5sum' => 1,
 	'mdcolortable' => 1,
 	'mdfiletag' => 1,
 	'mdfileunits' => 1,
@@ -5995,6 +6364,9 @@ my %tagExists = (
 	'mdpreptime' => 1,
 	'mdsampleinfo' => 1,
 	'mdscalepixel' => 1,
+	'meas1label' => 1,
+	'meas1params' => 1,
+	'meas1type' => 1,
 	'measuredcolor' => 1,
 	'measuredinfo' => 1,
 	'measurement' => 1,
@@ -6002,7 +6374,9 @@ my %tagExists = (
 	'measurementflare' => 1,
 	'measurementgeometry' => 1,
 	'measurementilluminant' => 1,
+	'measurementinfo' => 1,
 	'measurementobserver' => 1,
+	'measurementscale' => 1,
 	'media' => 1,
 	'mediablackpoint' => 1,
 	'mediaclassprimaryid' => 1,
@@ -6010,10 +6384,10 @@ my %tagExists = (
 	'mediacolor' => 1,
 	'mediacontenttypes' => 1,
 	'mediacreated' => 1,
-	'mediacreatedate' => 1,
 	'mediacredits' => 1,
 	'mediadata' => 1,
 	'mediaduration' => 1,
+	'mediaflags' => 1,
 	'mediaheader' => 1,
 	'mediaheaderversion' => 1,
 	'mediaindex' => 1,
@@ -6027,8 +6401,8 @@ my %tagExists = (
 	'mediaisstereo' => 1,
 	'mediaissubtitled' => 1,
 	'mediaistape' => 1,
+	'mediajukebox' => 1,
 	'medialanguagecode' => 1,
-	'mediamodifydate' => 1,
 	'medianetworkaffiliation' => 1,
 	'mediaoriginalbroadcastdatetime' => 1,
 	'mediaoriginalchannel' => 1,
@@ -6048,6 +6422,7 @@ my %tagExists = (
 	'metadataid' => 1,
 	'metadatalibrary' => 1,
 	'metadatanumber' => 1,
+	'meterlink' => 1,
 	'metermode' => 1,
 	'microsoft' => 1,
 	'microsoftxtra' => 1,
@@ -6059,6 +6434,7 @@ my %tagExists = (
 	'mincache' => 1,
 	'miniaturefilter' => 1,
 	'miniaturefilterorientation' => 1,
+	'miniaturefilterparameter' => 1,
 	'miniaturefilterposition' => 1,
 	'minimumbitrate' => 1,
 	'minoltacamerasettings' => 1,
@@ -6080,6 +6456,7 @@ my %tagExists = (
 	'mmclips' => 1,
 	'mngheader' => 1,
 	'modeextension' => 1,
+	'modeflags' => 1,
 	'model2' => 1,
 	'modelandversion' => 1,
 	'modeltiepoint' => 1,
@@ -6093,6 +6470,8 @@ my %tagExists = (
 	'month' => 1,
 	'mood' => 1,
 	'moreinfo' => 1,
+	'moreinfo0201' => 1,
+	'moreinfo0401' => 1,
 	'moreinfobannerimage' => 1,
 	'moreinfobannerurl' => 1,
 	'moreinfotext' => 1,
@@ -6103,6 +6482,7 @@ my %tagExists = (
 	'moveobjects' => 1,
 	'movie' => 1,
 	'moviedata' => 1,
+	'moviedataoffset' => 1,
 	'moviedatasize' => 1,
 	'movieheader' => 1,
 	'movieheaderversion' => 1,
@@ -6147,6 +6527,7 @@ my %tagExists = (
 	'namedcolor' => 1,
 	'namedcolor2' => 1,
 	'nametableversion' => 1,
+	'nameutf-8' => 1,
 	'narrator' => 1,
 	'nativedisplayinfo' => 1,
 	'nativeresolutionunit' => 1,
@@ -6172,6 +6553,7 @@ my %tagExists = (
 	'nikon' => 1,
 	'nikoncaptureoffsets' => 1,
 	'nikondata' => 1,
+	'nikonncdb' => 1,
 	'nikonncdt' => 1,
 	'nikonscanifd' => 1,
 	'nikontags' => 1,
@@ -6234,7 +6616,9 @@ my %tagExists = (
 	'offlineavailability' => 1,
 	'offlinestatus' => 1,
 	'offsetorigin' => 1,
+	'offsetx' => 1,
 	'offsetxy' => 1,
+	'offsety' => 1,
 	'oldxmp' => 1,
 	'olym' => 1,
 	'olympus' => 1,
@@ -6265,6 +6649,7 @@ my %tagExists = (
 	'olympustags3' => 1,
 	'olympustags4' => 1,
 	'olympusthumbnail' => 1,
+	'onionskins' => 1,
 	'opacity' => 1,
 	'opcodelist1' => 1,
 	'opcodelist2' => 1,
@@ -6278,6 +6663,7 @@ my %tagExists = (
 	'operationid' => 1,
 	'operationnumber' => 1,
 	'opiproxy' => 1,
+	'optics' => 1,
 	'optimalbitrate' => 1,
 	'optionalattendeeaddresses' => 1,
 	'optionalattendees' => 1,
@@ -6290,6 +6676,7 @@ my %tagExists = (
 	'originaldocumentsize' => 1,
 	'originalfilesize' => 1,
 	'originalfiletype' => 1,
+	'originalformat' => 1,
 	'originalimagebroker' => 1,
 	'originallyricist' => 1,
 	'originalmedia' => 1,
@@ -6339,6 +6726,12 @@ my %tagExists = (
 	'pager' => 1,
 	'pages' => 1,
 	'pagespecial' => 1,
+	'paintdata' => 1,
+	'paintimage' => 1,
+	'paintimageheight' => 1,
+	'paintimagetype' => 1,
+	'paintimagewidth' => 1,
+	'paintingfilter' => 1,
 	'palette' => 1,
 	'palettecolors' => 1,
 	'palettefilename' => 1,
@@ -6359,13 +6752,14 @@ my %tagExists = (
 	'param2' => 1,
 	'param3' => 1,
 	'parameter' => 1,
-	'paraminfo' => 1,
+	'parameterinfo' => 1,
 	'parasites' => 1,
 	'parentalrating' => 1,
 	'parentalratingreason' => 1,
 	'part' => 1,
 	'partialpalette' => 1,
 	'participants' => 1,
+	'partnumber' => 1,
 	'partofset' => 1,
 	'pastclippingboundary' => 1,
 	'pasteimage' => 1,
@@ -6378,6 +6772,7 @@ my %tagExists = (
 	'pdf' => 1,
 	'pdfx' => 1,
 	'peakbitrate' => 1,
+	'peakspectralsensitivity' => 1,
 	'peakvalue' => 1,
 	'pefversion' => 1,
 	'pentax' => 1,
@@ -6411,6 +6806,7 @@ my %tagExists = (
 	'photoshop' => 1,
 	'photoshop2colortable' => 1,
 	'photoshop2info' => 1,
+	'photoshop_profile' => 1,
 	'photoshopbgrthumbnail' => 1,
 	'photoshopdata' => 1,
 	'photoshopformat' => 1,
@@ -6421,6 +6817,7 @@ my %tagExists = (
 	'physicalstreamnumbermap' => 1,
 	'physicalstreamnumbers' => 1,
 	'physicalstreams' => 1,
+	'pic_ifd' => 1,
 	'picslabel' => 1,
 	'picture' => 1,
 	'picturebitsperpixel' => 1,
@@ -6434,10 +6831,16 @@ my %tagExists = (
 	'picturelength' => 1,
 	'picturemimetype' => 1,
 	'picturestyleinfo' => 1,
-	'picturestyleinfo2' => 1,
 	'picturetype' => 1,
 	'picturewidth' => 1,
 	'pieceinfo' => 1,
+	'piecelength' => 1,
+	'pieces' => 1,
+	'pip' => 1,
+	'pipx1' => 1,
+	'pipx2' => 1,
+	'pipy1' => 1,
+	'pipy2' => 1,
 	'pitchandfamily' => 1,
 	'pitchshift' => 1,
 	'pixelaspectratio' => 1,
@@ -6457,7 +6860,13 @@ my %tagExists = (
 	'pixheight' => 1,
 	'pixwidth' => 1,
 	'places' => 1,
+	'planckb' => 1,
+	'planckf' => 1,
+	'plancko' => 1,
+	'planckr1' => 1,
+	'planckr2' => 1,
 	'planes' => 1,
+	'platform' => 1,
 	'playallframes' => 1,
 	'playcounter' => 1,
 	'playduration' => 1,
@@ -6499,7 +6908,6 @@ my %tagExists = (
 	'preview2' => 1,
 	'previewatomindex' => 1,
 	'previewatomtype' => 1,
-	'previewdate' => 1,
 	'previewduration' => 1,
 	'previewifd' => 1,
 	'previewifd_offset' => 1,
@@ -6520,8 +6928,11 @@ my %tagExists = (
 	'printflags' => 1,
 	'printflagsinfo' => 1,
 	'printimversion' => 1,
+	'printinfo' => 1,
+	'printinfo2' => 1,
 	'printquality' => 1,
 	'printscale' => 1,
+	'printstyle' => 1,
 	'printtovideo' => 1,
 	'priority' => 1,
 	'prism' => 1,
@@ -6530,6 +6941,7 @@ my %tagExists = (
 	'prl' => 1,
 	'processing' => 1,
 	'processinginfo' => 1,
+	'processingtime' => 1,
 	'prod' => 1,
 	'prodnotes' => 1,
 	'producedby' => 1,
@@ -6548,6 +6960,10 @@ my %tagExists = (
 	'productversionnumber' => 1,
 	'profession' => 1,
 	'profile' => 1,
+	'profile1audiocodec' => 1,
+	'profile1height' => 1,
+	'profile1videocodec' => 1,
+	'profile1width' => 1,
 	'profileclass' => 1,
 	'profilecmmtype' => 1,
 	'profileconnectionspace' => 1,
@@ -6559,6 +6975,7 @@ my %tagExists = (
 	'profileheader' => 1,
 	'profileid' => 1,
 	'profileifd' => 1,
+	'profiles' => 1,
 	'profilesequencedesc' => 1,
 	'profilesequenceidentifier' => 1,
 	'profiletype' => 1,
@@ -6603,6 +7020,7 @@ my %tagExists = (
 	'propertyvectorelements' => 1,
 	'protect' => 1,
 	'protected' => 1,
+	'protectioninfo' => 1,
 	'protectiontype' => 1,
 	'provider' => 1,
 	'providercopyright' => 1,
@@ -6617,6 +7035,8 @@ my %tagExists = (
 	'publisherurl' => 1,
 	'pur' => 1,
 	'purchasedate' => 1,
+	'purchasefileformat' => 1,
+	'purchaseinfo' => 1,
 	'purpose' => 1,
 	'pyramidlevels' => 1,
 	'qualcomm' => 1,
@@ -6636,6 +7056,7 @@ my %tagExists = (
 	'rate' => 1,
 	'rated' => 1,
 	'ratingorg' => 1,
+	'ratioimage' => 1,
 	'rawcodecversion' => 1,
 	'rawdata' => 1,
 	'rawdatalength' => 1,
@@ -6660,11 +7081,30 @@ my %tagExists = (
 	'rawthermalimageheight' => 1,
 	'rawthermalimagetype' => 1,
 	'rawthermalimagewidth' => 1,
+	'rawvaluemedian' => 1,
+	'rawvaluerange' => 1,
 	'rawzorcreatorversion' => 1,
 	'rawzorrequiredversion' => 1,
 	'rdf' => 1,
 	'readerrequirements' => 1,
+	'reading1description' => 1,
+	'reading1device' => 1,
+	'reading1units' => 1,
+	'reading1value' => 1,
+	'reading2description' => 1,
+	'reading2device' => 1,
+	'reading2units' => 1,
+	'reading2value' => 1,
+	'reading3description' => 1,
+	'reading3device' => 1,
+	'reading3units' => 1,
+	'reading3value' => 1,
+	'reading4description' => 1,
+	'reading4device' => 1,
+	'reading4units' => 1,
+	'reading4value' => 1,
 	'readstatus' => 1,
+	'real2ir' => 1,
 	'realtimestreamingprotocol' => 1,
 	'receivedfrom' => 1,
 	'recengineer' => 1,
@@ -6745,6 +7185,7 @@ my %tagExists = (
 	'ricoh' => 1,
 	'ricohjunk' => 1,
 	'ricohrdc2' => 1,
+	'ricohrmkn' => 1,
 	'ricohrr1subdir' => 1,
 	'ricohsubdir' => 1,
 	'ricohsubdirifd' => 1,
@@ -6761,7 +7202,15 @@ my %tagExists = (
 	'rotationangle' => 1,
 	'roundtripversion' => 1,
 	'rowinterleavefactor' => 1,
+	'rtptimescale' => 1,
+	'runtime' => 1,
+	'runtimeepoch' => 1,
+	'runtimeflags' => 1,
+	'runtimescale' => 1,
+	'runtimesincepowerup' => 1,
+	'runtimevalue' => 1,
 	'runwindow' => 1,
+	's2n' => 1,
 	'sampledegradationpriority' => 1,
 	'sampleformat' => 1,
 	'samplegroupdescription' => 1,
@@ -6775,6 +7224,9 @@ my %tagExists = (
 	'sampletogroup' => 1,
 	'samsungifd' => 1,
 	'samsunginfo' => 1,
+	'samsungsec' => 1,
+	'samsungsmta' => 1,
+	'samsungsvss' => 1,
 	'samsungtags' => 1,
 	'sanyomov' => 1,
 	'sanyomp4' => 1,
@@ -6813,6 +7265,10 @@ my %tagExists = (
 	'scenebalancealgorithmfilmid' => 1,
 	'scenebalancealgorithmrevision' => 1,
 	'scenecolorimetryestimates' => 1,
+	'schemeinfo' => 1,
+	'schemetype' => 1,
+	'schemeurl' => 1,
+	'schemeversion' => 1,
 	'school' => 1,
 	'screenbuffersize' => 1,
 	'screendescriptor' => 1,
@@ -6850,7 +7306,6 @@ my %tagExists = (
 	'sendername' => 1,
 	'sensitivity' => 1,
 	'sensorbottomborder' => 1,
-	'sensorcalibration' => 1,
 	'sensordefects' => 1,
 	'sensorid' => 1,
 	'sensorimageheight' => 1,
@@ -6863,6 +7318,7 @@ my %tagExists = (
 	'sensortopborder' => 1,
 	'sensortopmargin' => 1,
 	'sequenceframenumber' => 1,
+	'sequencenumberrandomoffset' => 1,
 	'serialinfo' => 1,
 	'series' => 1,
 	'serviceorganizationname' => 1,
@@ -6888,6 +7344,7 @@ my %tagExists = (
 	'sharpobjname' => 1,
 	'sharpobjtype' => 1,
 	'sharpobjversion' => 1,
+	'sheetdisclosure' => 1,
 	'shimdata' => 1,
 	'shootingcount' => 1,
 	'shootingrecord' => 1,
@@ -6956,6 +7413,7 @@ my %tagExists = (
 	'size' => 1,
 	'sizemode' => 1,
 	'skip' => 1,
+	'slateinformation' => 1,
 	'slices' => 1,
 	'slides' => 1,
 	'slideshow' => 1,
@@ -6965,6 +7423,7 @@ my %tagExists = (
 	'snapshotname' => 1,
 	'softedit' => 1,
 	'softfocusfilter' => 1,
+	'softwarecomponents' => 1,
 	'softwarerelease' => 1,
 	'songwriter' => 1,
 	'songwriterkeywords' => 1,
@@ -6977,10 +7436,12 @@ my %tagExists = (
 	'sortshow' => 1,
 	'soundfile' => 1,
 	'soundschemetitle' => 1,
+	'sourcecreatedate' => 1,
 	'sourcecredits' => 1,
 	'sourcedata' => 1,
 	'sourcedate' => 1,
 	'sourceedition' => 1,
+	'sourcefilename' => 1,
 	'sourceform' => 1,
 	'sourceid' => 1,
 	'sourceimagedirectory' => 1,
@@ -7159,13 +7620,25 @@ my %tagExists = (
 	't82options' => 1,
 	't88options' => 1,
 	'tag' => 1,
+	'tag2010a' => 1,
+	'tag2010b' => 1,
+	'tag2010c' => 1,
+	'tag2010d' => 1,
+	'tag2010e' => 1,
+	'tag2010f' => 1,
+	'tag2010g' => 1,
+	'tag900b' => 1,
 	'tag9050' => 1,
 	'tag9400a' => 1,
 	'tag9400b' => 1,
+	'tag9400c' => 1,
 	'tag9402' => 1,
 	'tag9403' => 1,
+	'tag9405a' => 1,
+	'tag9405b' => 1,
 	'tag9406' => 1,
 	'tag940a' => 1,
+	'tag940c' => 1,
 	'tagattachmentuid' => 1,
 	'tagbinary' => 1,
 	'tagchapteruid' => 1,
@@ -7182,6 +7655,7 @@ my %tagExists = (
 	'targetdeltatype' => 1,
 	'targetfiledosname' => 1,
 	'targetfilesize' => 1,
+	'targetlayerid' => 1,
 	'targetprinter' => 1,
 	'targets' => 1,
 	'targettype' => 1,
@@ -7196,7 +7670,7 @@ my %tagExists = (
 	'telephonenumber' => 1,
 	'telex' => 1,
 	'temperature' => 1,
-	'tempinfok5' => 1,
+	'tempinfo' => 1,
 	'template' => 1,
 	'temporary' => 1,
 	'terminationaction' => 1,
@@ -7208,6 +7682,8 @@ my %tagExists = (
 	'textface' => 1,
 	'textfont' => 1,
 	'textinfo' => 1,
+	'textinfo1' => 1,
+	'textinfo2' => 1,
 	'textjunk' => 1,
 	'textsize' => 1,
 	'textualdata' => 1,
@@ -7219,6 +7695,7 @@ my %tagExists = (
 	'thumbinfo' => 1,
 	'thumbnail' => 1,
 	'thumbnailclip' => 1,
+	'thumbnailpng' => 1,
 	'tickspersecond' => 1,
 	'tiff' => 1,
 	'tiff-epstandardid' => 1,
@@ -7234,10 +7711,12 @@ my %tagExists = (
 	'timecodeindexparms' => 1,
 	'timecodescale' => 1,
 	'timeinfo' => 1,
+	'timelineinfo' => 1,
 	'timeoffset' => 1,
 	'timereference' => 1,
 	'timescale' => 1,
 	'timeslice' => 1,
+	'timestamprandomoffset' => 1,
 	'timetosampletable' => 1,
 	'title2' => 1,
 	'titlelen' => 1,
@@ -7258,6 +7737,8 @@ my %tagExists = (
 	'toneobjversion' => 1,
 	'tones' => 1,
 	'tonespaceflow' => 1,
+	'tool_name' => 1,
+	'tool_version' => 1,
 	'toolname' => 1,
 	'toolversion' => 1,
 	'topmag' => 1,
@@ -7279,7 +7760,6 @@ my %tagExists = (
 	'trackattachmentuid' => 1,
 	'trackcategory' => 1,
 	'trackcomments' => 1,
-	'trackcreatedate' => 1,
 	'trackdefault' => 1,
 	'trackduration' => 1,
 	'trackentry' => 1,
@@ -7293,7 +7773,6 @@ my %tagExists = (
 	'tracklanguage' => 1,
 	'tracklayer' => 1,
 	'tracklyrics' => 1,
-	'trackmodifydate' => 1,
 	'trackname' => 1,
 	'trackoffset' => 1,
 	'trackoverlay' => 1,
@@ -7309,6 +7788,7 @@ my %tagExists = (
 	'trackused' => 1,
 	'trackvolume' => 1,
 	'trademark' => 1,
+	'transactionid' => 1,
 	'transferrange' => 1,
 	'transformation' => 1,
 	'transformcreatedate' => 1,
@@ -7347,6 +7827,7 @@ my %tagExists = (
 	'units' => 1,
 	'unknown' => 1,
 	'unknown_cndb' => 1,
+	'unknown_slmt' => 1,
 	'unknownd30' => 1,
 	'unknowndata' => 1,
 	'unknowndate' => 1,
@@ -7355,6 +7836,10 @@ my %tagExists = (
 	'unknowninfo2version' => 1,
 	'unknowninfoifd' => 1,
 	'unknowninfoversion' => 1,
+	'unknownserial1' => 1,
+	'unknownserial2' => 1,
+	'unknownserial3' => 1,
+	'unknownserial4' => 1,
 	'unknowntags' => 1,
 	'unknowntemperature1' => 1,
 	'unknowntemperature2' => 1,
@@ -7362,6 +7847,7 @@ my %tagExists = (
 	'unknowntemperature4' => 1,
 	'unknowntemperature5' => 1,
 	'unknowntemperature6' => 1,
+	'unknownthumbnail' => 1,
 	'unsharpdata' => 1,
 	'untitled0' => 1,
 	'untitled1' => 1,
@@ -7369,6 +7855,7 @@ my %tagExists = (
 	'unused' => 1,
 	'ur3' => 1,
 	'url_list' => 1,
+	'urllist1' => 1,
 	'urn' => 1,
 	'usagerightsmessage' => 1,
 	'usedextensionnumbers' => 1,
@@ -7381,7 +7868,9 @@ my %tagExists = (
 	'userdefinedtext' => 1,
 	'userdefinedurl' => 1,
 	'usereffectiverating' => 1,
+	'userid' => 1,
 	'userlastplayedtime' => 1,
+	'username' => 1,
 	'userplaycount' => 1,
 	'userplaycountafternoon' => 1,
 	'userplaycountevening' => 1,
@@ -7397,6 +7886,7 @@ my %tagExists = (
 	'usptomiscellaneous' => 1,
 	'usptooriginalcontenttype' => 1,
 	'utm' => 1,
+	'uuid-canon' => 1,
 	'uuid-exif' => 1,
 	'uuid-exif2' => 1,
 	'uuid-flip' => 1,
@@ -7430,6 +7920,7 @@ my %tagExists = (
 	'versionbf' => 1,
 	'versionifd' => 1,
 	'versioninfo' => 1,
+	'versionrestrictions' => 1,
 	'versionyear' => 1,
 	'verticalcitation' => 1,
 	'verticalcstype' => 1,
@@ -7503,20 +7994,32 @@ my %tagExists = (
 	'wangtag3' => 1,
 	'wangtag4' => 1,
 	'warning' => 1,
+	'watercolorfilter' => 1,
 	'watermark' => 1,
 	'watermarktype' => 1,
 	'watermarkurl' => 1,
+	'wave' => 1,
 	'wb_grblevels' => 1,
+	'wb_grblevelsdaylight' => 1,
+	'wb_grblevelsstandard' => 1,
 	'wb_grgblevels' => 1,
 	'wb_rgbcoeffs0' => 1,
 	'wb_rgbcoeffs1' => 1,
 	'wb_rgbcoeffs2' => 1,
 	'wb_rgbcoeffs3' => 1,
+	'wb_rgblevels2500k' => 1,
+	'wb_rgblevels3200k' => 1,
+	'wb_rgblevels4500k' => 1,
+	'wb_rgblevels6000k' => 1,
+	'wb_rgblevels8500k' => 1,
 	'wb_rgblevelsauto' => 1,
 	'wb_rgblevelscloudy' => 1,
 	'wb_rgblevelsdaylight' => 1,
 	'wb_rgblevelsflash' => 1,
 	'wb_rgblevelsfluorescent' => 1,
+	'wb_rgblevelsfluorescentm1' => 1,
+	'wb_rgblevelsfluorescentp1' => 1,
+	'wb_rgblevelsfluorescentp2' => 1,
 	'wb_rgblevelsshade' => 1,
 	'wb_rgblevelstungsten' => 1,
 	'wb_rgbmul0' => 1,
@@ -7546,6 +8049,8 @@ my %tagExists = (
 	'windowlocation' => 1,
 	'windoworigin' => 1,
 	'windoworiginauto' => 1,
+	'windowsdevmode' => 1,
+	'windowsfilename' => 1,
 	'windowsize' => 1,
 	'windowtarget' => 1,
 	'wm_collectiongroupid' => 1,
@@ -7729,7 +8234,7 @@ sub AddTags($$)
         foreach $tagID (Image::ExifTool::TagTableKeys($tagTablePtr)) {
             my $newInfo = $$tagTablePtr{$tagID};
             if (ref $newInfo eq 'HASH') {
-                $$newInfo{Name} or $$newInfo{Name} = ucfirst($tagID);
+                $$newInfo{Name} or $$newInfo{Name} = Image::ExifTool::MakeTagName($tagID);
                 # use new ID of tag in Composite table in case it changed
                 $tagID = $$newInfo{NewTagID} if defined $$newInfo{NewTagID};
             } else {
@@ -7897,7 +8402,7 @@ Provides a fast, case insensitive lookup for tag names.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -74,6 +74,14 @@ types of meta information.  To determine a tag name, either consult this
 documentation or run C<exiftool -s> on a file containing the information in
 question.
 
+(This documentation is the result of years of research, testing and reverse
+engineering, and is the most complete metadata tag list available anywhere
+on the internet.  It is provided not only for ExifTool users, but more
+importantly as a public service to help augment the collective knowledge,
+and is often used as a primary source of information in the development of
+other metadata software.  Please help keep this documentation as accurate
+and complete as possible, and feed back any new discoveries to the source.)
+
 =head2 JPEG Tags
 
 This table lists information extracted by ExifTool from JPEG images.
@@ -97,7 +105,7 @@ This table lists information extracted by ExifTool from JPEG images.
   'APP3'       Meta                             Kodak Meta
                Stim                             Stim
                PreviewImage                     N
-  'APP4'       Scalado                          JPEG Scalado
+  'APP4'       Scalado                          Scalado
                FPXR                             FlashPix
                PreviewImage                     N
   'APP5'       RMETA                            Ricoh RMETA
@@ -105,9 +113,12 @@ This table lists information extracted by ExifTool from JPEG images.
   'APP6'       EPPIM                            JPEG EPPIM
                NITF                             JPEG NITF
                HP_TDHD                          HP TDHD
-  'APP7'       Qualcomm                         Qualcomm
+  'APP7'       Pentax                           Pentax
+               Qualcomm                         Qualcomm
   'APP8'       SPIFF                            JPEG SPIFF
+  'APP9'       MediaJukebox                     JPEG MediaJukebox
   'APP10'      Comment                          N
+  'APP11'      JPEG-HDR                         JPEG HDR
   'APP12'      PictureInfo                      APP12 PictureInfo
                Ducky                            APP12 Ducky
   'APP13'      Photoshop                        Photoshop
@@ -141,18 +152,6 @@ images).
   ------   --------                             --------
   'Rev'    OcadRevision                         N
 
-=head3 JPEG Scalado Tags
-
-Tags extracted from the JPEG APP4 "SCALADO" segment (presumably written by
-Scalado mobile software, L<http://www.scalado.com/>).
-
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-  'HGHT'   PreviewImageHeight                   N
-  'QUAL'   PreviewQuality                       N
-  'SPMO'   DataLength                           N
-  'WDTH'   PreviewImageWidth                    N
-
 =head3 JPEG EPPIM Tags
 
 APP6 is used in by the Toshiba PDR-M700 to store a TIFF structure containing
@@ -204,6 +203,37 @@ specification.
      18    YResolution                          N
      22    XResolution                          N
 
+=head3 JPEG MediaJukebox Tags
+
+Tags found in the XML metadata of the "Media Jukebox" APP9 segment.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  Album                                         N
+  Caption                                       N
+  Date                                          N
+  Keywords                                      N
+  Name                                          N
+  People                                        N
+  Places                                        N
+  Tool_Name                                     N
+  Tool_Version                                  N
+
+=head3 JPEG HDR Tags
+
+Information extracted from APP11 of a JPEG-HDR image.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'RatioImage'         RatioImage               N
+  'alp'                Alpha                    N
+  'bet'                Beta                     N
+  'cor'                CorrectionMethod         N
+  'ln0'                Ln0                      N
+  'ln1'                Ln1                      N
+  's2n'                S2n                      N
+  'ver'                JPEG-HDRVersion          N
+
 =head3 JPEG AdobeCM Tags
 
 The "Adobe_CM" APP13 segment presumably contains color management
@@ -266,8 +296,8 @@ other tags which are not part of the EXIF specification, but may co-exist
 with EXIF tags in some images.  Tags which are part of the EXIF 2.3
 specification have an underlined B<Tag Name> in the HTML version of this
 documentation.  See
-L<http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-008-2012_E.pdf> for the
-official EXIF 2.3 specification.
+L<http://www.cipa.jp/std/documents/e/DC-008-2012_E.pdf> for the official
+EXIF 2.3 specification.
 
   Tag ID   Tag Name                  Group      Writable
   ------   --------                  -----      --------
@@ -472,9 +502,9 @@ official EXIF 2.3 specification.
   0x8781   SharedData                -          N
   0x8782   T88Options                -          N
   0x87ac   ImageLayer                -          N
-  0x87af   GeoTiffDirectory          -          N
-  0x87b0   GeoTiffDoubleParams       -          N
-  0x87b1   GeoTiffAsciiParams        -          N
+  0x87af   GeoTiffDirectory          IFD0       undef
+  0x87b0   GeoTiffDoubleParams       IFD0       undef
+  0x87b1   GeoTiffAsciiParams        IFD0       string
   0x8822   ExposureProgram           ExifIFD    int16u
   0x8824   SpectralSensitivity       ExifIFD    string
   0x8825   GPSInfo                   -          GPS
@@ -525,7 +555,8 @@ official EXIF 2.3 specification.
   0x923b   CIP3Sheet                 -          N
   0x923c   CIP3Side                  -          N
   0x923f   StoNits                   -          N
-  0x927c   MakerNoteNikon            ExifIFD    Nikon
+  0x927c   MakerNoteApple            ExifIFD    Apple
+           MakerNoteNikon            ExifIFD    Nikon
            MakerNoteCanon            ExifIFD    Canon
            MakerNoteCasio            ExifIFD    Casio
            MakerNoteCasio2           ExifIFD    Casio Type2
@@ -552,6 +583,7 @@ official EXIF 2.3 specification.
            MakerNoteKodak7           ExifIFD    Kodak Type7
            MakerNoteKodak8a          ExifIFD    Kodak Type8
            MakerNoteKodak8b          ExifIFD    Kodak Type8
+           MakerNoteKodak8c          ExifIFD    Kodak Type8
            MakerNoteKodak9           ExifIFD    Kodak Type9
            MakerNoteKodak10          ExifIFD    Kodak Type10
            MakerNoteKodakUnknown     ExifIFD    Kodak Unknown
@@ -582,7 +614,7 @@ official EXIF 2.3 specification.
            MakerNoteRicoh            ExifIFD    Ricoh
            MakerNoteRicohText        ExifIFD    Ricoh Text
            MakerNoteSamsung1a        ExifIFD    undef
-           MakerNoteSamsung1b        ExifIFD    Samsung Type1
+           MakerNoteSamsung1b        ExifIFD    Samsung
            MakerNoteSamsung2         ExifIFD    Samsung Type2
            MakerNoteSanyo            ExifIFD    Sanyo
            MakerNoteSanyoC4          ExifIFD    Sanyo
@@ -591,7 +623,8 @@ official EXIF 2.3 specification.
            MakerNoteSony             ExifIFD    Sony
            MakerNoteSony2            ExifIFD    Olympus
            MakerNoteSony3            ExifIFD    Olympus
-           MakerNoteSony4            ExifIFD    Sony
+           MakerNoteSony4            ExifIFD    Sony PIC
+           MakerNoteSony5            ExifIFD    Sony
            MakerNoteSonyEricsson     ExifIFD    Sony Ericsson
            MakerNoteSonySRF          ExifIFD    Sony SRF
            MakerNoteUnknownText      ExifIFD    undef
@@ -680,6 +713,7 @@ official EXIF 2.3 specification.
   0xc42a   OceImageLogic             -          N
   0xc44f   Annotations               -          N
   0xc4a5   PrintIM                   IFD0       PrintIM
+  0xc573   OriginalFileName          -          N
   0xc580   USPTOOriginalContentType  -          N
   0xc612   DNGVersion                IFD0       int8u[4]!
   0xc613   DNGBackwardVersion        IFD0       int8u[4]!
@@ -716,9 +750,10 @@ official EXIF 2.3 specification.
   0xc632   AntiAliasStrength         SubIFD     rational64u!
   0xc633   ShadowScale               IFD0       rational64u!
   0xc634   SR2Private                -          Sony SR2Private
-           DNGAdobeData              -          DNG AdobeData
+           DNGAdobeData              IFD0       DNG AdobeData
            MakerNotePentax           -          Pentax
-           DNGPrivateData            -          N
+           MakerNotePentax5          -          Pentax
+           DNGPrivateData            IFD0       undef!
   0xc635   MakerNoteSafety           IFD0       int16u
   0xc640   RawImageSegmentation      -          N
   0xc65a   CalibrationIlluminant1    IFD0       int16u!
@@ -806,8 +841,8 @@ The tags listed below are part of the International Press Telecommunications
 Council (IPTC) and the Newspaper Association of America (NAA) Information
 Interchange Model (IIM).  This is an older meta information format, slowly
 being phased out in favor of XMP -- the newer IPTCCore specification uses
-XMP format.  IPTC information may be embedded in JPG, TIFF, PNG, MIFF, PS,
-PDF, PSD, XCF and DNG images.
+XMP format.  IPTC information may be found in JPG, TIFF, PNG, MIFF, PS, PDF,
+PSD, XCF and DNG images.
 
 IPTC information is separated into different records, each of which has its
 own set of tags.  See
@@ -1089,6 +1124,7 @@ L<http://www.adobe.com/devnet/xmp/> for the official XMP specification.
   digiKam                                       XMP digiKam
   dwc                                           DarwinCore
   exif                                          XMP exif
+  exifEX                                        XMP exifEX
   expressionmedia                               XMP ExpressionMedia
   extensis                                      XMP extensis
   fpv                                           XMP fpv
@@ -1172,7 +1208,7 @@ hear.)
   Author                                        string/
   Caption                                       string/
   Categories                                    string/
-  Datetime                                      date/
+  DateTime                                      date/
   DPP                                           lang-alt
   Keywords                                      string/+
   Notes                                         string/
@@ -1197,13 +1233,18 @@ RegionExtensions.
   Tag Name                                      Writable
   --------                                      --------
   AngleInfoRoll                                 integer
+  AngleInfoYaw                                  integer
   ConfidenceLevel                               integer
   FaceID                                        integer
   TimeStamp                                     integer
 
 =head3 XMP aux Tags
 
-Photoshop Auxiliary namespace tags.
+Adobe-defined auxiliary EXIF tags.  This namespace existed in the XMP
+specification until it was dropped in 2012, presumably due to the
+introduction of the EXIF 2.3 for XMP specification and the exifEX namespace
+at this time.  For this reason, tags below with equivalents in the
+L<exifEX namespace|/XMP exifEX Tags> are avoided when writing.
 
   Tag Name                                      Writable
   --------                                      --------
@@ -1213,9 +1254,10 @@ Photoshop Auxiliary namespace tags.
   ImageNumber                                   string
   Lens                                          string
   LensID                                        string
-  LensInfo                                      string
-  OwnerName                                     string
-  SerialNumber                                  string
+  LensInfo                                      string/
+  LensSerialNumber                              string/
+  OwnerName                                     string/
+  SerialNumber                                  string/
 
 =head3 XMP cc Tags
 
@@ -1252,7 +1294,8 @@ Location tags written by some Sony Ericsson phones.
 
 =head3 XMP crs Tags
 
-Photoshop Camera Raw namespace tags.
+Photoshop Camera Raw namespace tags.  It is a shame that Adobe pollutes the
+metadata space with these incredibly bulky image editing parameters.
 
   Tag Name                                      Writable
   --------                                      --------
@@ -1262,6 +1305,7 @@ Photoshop Camera Raw namespace tags.
   AutoExposure                                  boolean
   AutoLateralCA                                 integer
   AutoShadows                                   boolean
+  AutoWhiteVersion                              integer
   Blacks2012                                    integer
   BlueHue                                       integer
   BlueSaturation                                integer
@@ -1270,10 +1314,61 @@ Photoshop Camera Raw namespace tags.
   CameraProfileDigest                           string
   ChromaticAberrationB                          integer
   ChromaticAberrationR                          integer
+  CircularGradientBasedCorrections              Correction Struct+
+  CircGradBasedCorrActive                       boolean_
+  CircGradBasedCorrAmount                       real_
+  CircGradBasedCorrMasks                        CorrectionMask Struct_+
+  CircGradBasedCorrMaskAlpha                    real_
+  CircGradBasedCorrMaskAngle                    real_
+  CircGradBasedCorrMaskBottom                   real_
+  CircGradBasedCorrMaskCenterValue              real_
+  CircGradBasedCorrMaskCenterWeight             real_
+  CircGradBasedCorrMaskDabs                     string_
+  CircGradBasedCorrMaskFeather                  real_
+  CircGradBasedCorrMaskFlipped                  boolean_
+  CircGradBasedCorrMaskFlow                     real_
+  CircGradBasedCorrMaskFullX                    real_
+  CircGradBasedCorrMaskFullY                    real_
+  CircGradBasedCorrMaskLeft                     real_
+  CircGradBasedCorrMaskValue                    real_
+  CircGradBasedCorrMaskMidpoint                 real_
+  CircGradBasedCorrMaskPerimeterValue           real_
+  CircGradBasedCorrMaskRadius                   real_
+  CircGradBasedCorrMaskRight                    real_
+  CircGradBasedCorrMaskRoundness                real_
+  CircGradBasedCorrMaskSizeX                    real_
+  CircGradBasedCorrMaskSizeY                    real_
+  CircGradBasedCorrMaskTop                      real_
+  CircGradBasedCorrMaskVersion                  integer_
+  CircGradBasedCorrMaskWhat                     string_
+  CircGradBasedCorrMaskX                        real_
+  CircGradBasedCorrMaskY                        real_
+  CircGradBasedCorrMaskZeroX                    real_
+  CircGradBasedCorrMaskZeroY                    real_
+  CircGradBasedCorrBrightness                   real_
+  CircGradBasedCorrClarity                      real_
+  CircGradBasedCorrClarity2012                  real_
+  CircGradBasedCorrContrast                     real_
+  CircGradBasedCorrContrast2012                 real_
+  CircGradBasedCorrDefringe                     real_
+  CircGradBasedCorrExposure                     real_
+  CircGradBasedCorrExposure2012                 real_
+  CircGradBasedCorrHighlights2012               real_
+  CircGradBasedCorrLuminanceNoise               real_
+  CircGradBasedCorrMoire                        real_
+  CircGradBasedCorrSaturation                   real_
+  CircGradBasedCorrShadows2012                  real_
+  CircGradBasedCorrSharpness                    real_
+  CircGradBasedCorrTemperature                  real_
+  CircGradBasedCorrTint                         real_
+  CircGradBasedCorrHue                          real_
+  CircGradBasedCorrSaturation                   real_
+  CircGradBasedCorrWhat                         string_
   Clarity                                       integer
   Clarity2012                                   integer
   ColorNoiseReduction                           integer
   ColorNoiseReductionDetail                     integer
+  ColorNoiseReductionSmoothness                 integer
   Contrast                                      integer/
   Contrast2012                                  integer
   Converter                                     string
@@ -1302,14 +1397,31 @@ Photoshop Camera Raw namespace tags.
   GradientBasedCorrActive                       boolean_
   GradientBasedCorrAmount                       real_
   GradientBasedCorrMasks                        CorrectionMask Struct_+
+  GradientBasedCorrMaskAlpha                    real_
+  GradientBasedCorrMaskAngle                    real_
+  GradientBasedCorrMaskBottom                   real_
+  GradientBasedCorrMaskCenterValue              real_
   GradientBasedCorrMaskCenterWeight             real_
   GradientBasedCorrMaskDabs                     string_
+  GradientBasedCorrMaskFeather                  real_
+  GradientBasedCorrMaskFlipped                  boolean_
   GradientBasedCorrMaskFlow                     real_
   GradientBasedCorrMaskFullX                    real_
   GradientBasedCorrMaskFullY                    real_
+  GradientBasedCorrMaskLeft                     real_
   GradientBasedCorrMaskValue                    real_
+  GradientBasedCorrMaskMidpoint                 real_
+  GradientBasedCorrMaskPerimeterValue           real_
   GradientBasedCorrMaskRadius                   real_
+  GradientBasedCorrMaskRight                    real_
+  GradientBasedCorrMaskRoundness                real_
+  GradientBasedCorrMaskSizeX                    real_
+  GradientBasedCorrMaskSizeY                    real_
+  GradientBasedCorrMaskTop                      real_
+  GradientBasedCorrMaskVersion                  integer_
   GradientBasedCorrMaskWhat                     string_
+  GradientBasedCorrMaskX                        real_
+  GradientBasedCorrMaskY                        real_
   GradientBasedCorrMaskZeroX                    real_
   GradientBasedCorrMaskZeroY                    real_
   GradientBasedCorrBrightness                   real_
@@ -1383,14 +1495,31 @@ Photoshop Camera Raw namespace tags.
   PaintCorrectionActive                         boolean_
   PaintCorrectionAmount                         real_
   PaintBasedCorrectionMasks                     CorrectionMask Struct_+
+  PaintCorrectionMaskAlpha                      real_
+  PaintCorrectionMaskAngle                      real_
+  PaintCorrectionMaskBottom                     real_
+  PaintCorrectionMaskCenterValue                real_
   PaintCorrectionMaskCenterWeight               real_
   PaintCorrectionMaskDabs                       string_
+  PaintCorrectionMaskFeather                    real_
+  PaintCorrectionMaskFlipped                    boolean_
   PaintCorrectionMaskFlow                       real_
   PaintCorrectionMaskFullX                      real_
   PaintCorrectionMaskFullY                      real_
+  PaintCorrectionMaskLeft                       real_
   PaintCorrectionMaskValue                      real_
+  PaintCorrectionMaskMidpoint                   real_
+  PaintCorrectionMaskPerimeterValue             real_
   PaintCorrectionMaskRadius                     real_
+  PaintCorrectionMaskRight                      real_
+  PaintCorrectionMaskRoundness                  real_
+  PaintCorrectionMaskSizeX                      real_
+  PaintCorrectionMaskSizeY                      real_
+  PaintCorrectionMaskTop                        real_
+  PaintCorrectionMaskVersion                    integer_
   PaintCorrectionMaskWhat                       string_
+  PaintCorrectionMaskX                          real_
+  PaintCorrectionMaskY                          real_
   PaintCorrectionMaskZeroX                      real_
   PaintCorrectionMaskZeroY                      real_
   PaintCorrectionBrightness                     real_
@@ -1419,9 +1548,11 @@ Photoshop Camera Raw namespace tags.
   ParametricMidtoneSplit                        integer
   ParametricShadows                             integer
   ParametricShadowSplit                         integer
+  PerspectiveAspect                             integer
   PerspectiveHorizontal                         integer
   PerspectiveRotate                             real
   PerspectiveScale                              integer
+  PerspectiveUpright                            integer
   PerspectiveVertical                           integer
   PostCropVignetteAmount                        integer
   PostCropVignetteFeather                       integer
@@ -1434,6 +1565,43 @@ Photoshop Camera Raw namespace tags.
   RedEyeInfo                                    string+
   RedHue                                        integer
   RedSaturation                                 integer
+  RetouchAreas                                  RetouchArea Struct+
+  RetouchAreaFeather                            real_
+  RetouchAreaMasks                              CorrectionMask Struct_+
+  RetouchAreaMaskAlpha                          real_
+  RetouchAreaMaskAngle                          real_
+  RetouchAreaMaskBottom                         real_
+  RetouchAreaMaskCenterValue                    real_
+  RetouchAreaMaskCenterWeight                   real_
+  RetouchAreaMaskDabs                           string_
+  RetouchAreaMaskFeather                        real_
+  RetouchAreaMaskFlipped                        boolean_
+  RetouchAreaMaskFlow                           real_
+  RetouchAreaMaskFullX                          real_
+  RetouchAreaMaskFullY                          real_
+  RetouchAreaMaskLeft                           real_
+  RetouchAreaMaskValue                          real_
+  RetouchAreaMaskMidpoint                       real_
+  RetouchAreaMaskPerimeterValue                 real_
+  RetouchAreaMaskRadius                         real_
+  RetouchAreaMaskRight                          real_
+  RetouchAreaMaskRoundness                      real_
+  RetouchAreaMaskSizeX                          real_
+  RetouchAreaMaskSizeY                          real_
+  RetouchAreaMaskTop                            real_
+  RetouchAreaMaskVersion                        integer_
+  RetouchAreaMaskWhat                           string_
+  RetouchAreaMaskX                              real_
+  RetouchAreaMaskY                              real_
+  RetouchAreaMaskZeroX                          real_
+  RetouchAreaMaskZeroY                          real_
+  RetouchAreaMethod                             string_
+  RetouchAreaOffsetY                            real_
+  RetouchAreaOpacity                            real_
+  RetouchAreaSeed                               integer_
+  RetouchAreaSourceState                        string_
+  RetouchAreaSourceX                            real_
+  RetouchAreaSpotType                           string_
   RetouchInfo                                   string+
   Saturation                                    integer/
   SaturationAdjustmentAqua                      integer
@@ -1469,6 +1637,20 @@ Photoshop Camera Raw namespace tags.
   ToneCurvePV2012Green                          string+
   ToneCurvePV2012Red                            string+
   ToneCurveRed                                  string+
+  UprightCenterMode                             integer
+  UprightCenterNormX                            real
+  UprightCenterNormY                            real
+  UprightDependentDigest                        string
+  UprightFocalLength35mm                        real
+  UprightFocalMode                              integer
+  UprightPreview                                boolean
+  UprightTransform_0                            string
+  UprightTransform_1                            string
+  UprightTransform_2                            string
+  UprightTransform_3                            string
+  UprightTransform_4                            string
+  UprightTransformCount                         integer
+  UprightVersion                                integer
   Version                                       string
   Vibrance                                      integer
   VignetteAmount                                integer
@@ -1507,17 +1689,48 @@ Photoshop Camera Raw namespace tags.
 
   Field Name                                    Writable
   ----------                                    --------
+  Alpha                                         real
+  Angle                                         real
+  Bottom                                        real
+  CenterValue                                   real
   CenterWeight                                  real
   Dabs                                          string+
+  Feather                                       real
+  Flipped                                       boolean
   Flow                                          real
   FullX                                         real
   FullY                                         real
+  Left                                          real
   MaskValue                                     real
+  Midpoint                                      real
+  PerimeterValue                                real
   Radius                                        real
+  Right                                         real
+  Roundness                                     real
+  SizeX                                         real
+  SizeY                                         real
+  Top                                           real
+  Version                                       integer
   What                                          string
+  X                                             real
+  Y                                             real
   ZeroX                                         real
   ZeroY                                         real
 
+=head3 XMP RetouchArea Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  Feather                                       real
+  Masks                                         CorrectionMask Struct+
+  Method                                        string
+  OffsetY                                       real
+  Opacity                                       real
+  Seed                                          integer
+  SourceState                                   string
+  SourceX                                       real
+  SpotType                                      string
+
 =head3 XMP dc Tags
 
 Dublin Core namespace tags.
@@ -1595,7 +1808,9 @@ DigiKam namespace tags.
 
 =head3 XMP exif Tags
 
-EXIF namespace for EXIF tags.
+EXIF namespace for EXIF tags.  See
+L<http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-010-2012_E.pdf> for the
+specification.
 
   Tag Name                                      Writable
   --------                                      --------
@@ -1650,6 +1865,7 @@ EXIF namespace for EXIF tags.
   GPSDestLongitude                              string
   GPSDifferential                               integer
   GPSDOP                                        rational
+  GPSHPositioningError                          rational
   GPSImgDirection                               rational
   GPSImgDirectionRef                            string
   GPSLatitude                                   string
@@ -1734,13 +1950,40 @@ EXIF namespace for EXIF tags.
   Rows                                          integer
   Values                                        rational+
 
+=head3 XMP exifEX Tags
+
+EXIF tags added by the EXIF 2.3 for XMP specification (see
+L<http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-010-2012_E.pdf>).
+
+  Tag Name                                      Writable
+  --------                                      --------
+  SerialNumber                                  string
+  OwnerName                                     string
+  Gamma                                         rational
+  InteropIndex                                  string
+  ISOSpeed                                      integer
+  ISOSpeedLatitudeyyy                           integer
+  ISOSpeedLatitudezzz                           integer
+  LensMake                                      string
+  LensModel                                     string
+  LensSerialNumber                              string
+  LensInfo                                      rational+
+  PhotographicSensitivity                       integer
+  RecommendedExposureIndex                      integer
+  SensitivityType                               integer
+  StandardOutputSensitivity                     integer
+
 =head3 XMP ExpressionMedia Tags
 
-Microsoft Expression Media namespace tags.
+Microsoft Expression Media namespace tags.  These tags are avoided when
+writing due to name conflicts with tags in other schemas.
 
   Tag Name                                      Writable
   --------                                      --------
   CatalogSets                                   string/+
+  Event                                         string/
+  People                                        string/+
+  Status                                        string/
 
 =head3 XMP extensis Tags
 
@@ -2045,6 +2288,7 @@ Adobe Photoshop namespace tags.
   DateCreated                                   date
   DocumentAncestors                             Ancestor Struct+
   DocumentAncestorID                            string_+
+  EmbeddedXMPDigest                             string
   Headline                                      string
   History                                       string
   ICCProfileName                                string
@@ -2359,7 +2603,9 @@ Adobe SWF namespace tags.
 
 =head3 XMP tiff Tags
 
-EXIF namespace for TIFF tags.
+EXIF namespace for TIFF tags.  See
+L<http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-010-2012_E.pdf> for the
+specification.
 
   Tag Name                                      Writable
   --------                                      --------
@@ -2520,6 +2766,7 @@ XMP Dynamic Media namespace tags.
   Copyright                                     string/
   Director                                      string
   DirectorPhotography                           string
+  DiscNumber                                    string
   Duration                                      Time Struct
   DurationScale                                 rational_
   DurationValue                                 integer_
@@ -2534,6 +2781,7 @@ XMP Dynamic Media namespace tags.
   Key                                           string
   LogComment                                    string
   Loop                                          boolean
+  Lyrics                                        string
   Markers                                       Marker Struct+
   MarkersComment                                string_+
   MarkersCuePointParams                         CuePointParam Struct_+
@@ -2553,6 +2801,7 @@ XMP Dynamic Media namespace tags.
   OutCue                                        Time Struct
   OutCueScale                                   rational_
   OutCueValue                                   integer_
+  PartOfCompilation                             string
   ProjectName                                   string
   ProjectRef                                    ProjectLink Struct
   ProjectRefPath                                string_
@@ -3062,8 +3311,9 @@ or by suffixing the tag name with a C<#> character).
 
 When adding GPS information to an image, it is important to set all of the
 following tags: GPSLatitude, GPSLatitudeRef, GPSLongitude, GPSLongitudeRef,
-GPSAltitude and GPSAltitudeRef.  ExifTool will write the required
-GPSVersionID tag automatically if new a GPS IFD is added to an image.
+and GPSAltitude and GPSAltitudeRef if the altitude is known.  ExifTool will
+write the required GPSVersionID tag automatically if new a GPS IFD is added
+to an image.
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
@@ -3104,7 +3354,9 @@ GPSVersionID tag automatically if new a GPS IFD is added to an image.
 
 ExifTool extracts the following tags from GeoTIFF images.  See
 L<http://www.remotesensing.org/geotiff/spec/geotiffhome.html> for the
-complete GeoTIFF specification.
+complete GeoTIFF specification.  These tags are not writable individually,
+but they may be copied en mass via the containing GeoTiffDirectory,
+GeoTiffDoubleParams and GeoTiffAsciiParams tags.
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
@@ -3126,6 +3378,7 @@ complete GeoTIFF specification.
   0x080b   GeogInvFlattening                    N
   0x080c   GeogAzimuthUnits                     N
   0x080d   GeogPrimeMeridianLong                N
+  0x080e   GeogToWGS84                          N
   0x0c00   ProjectedCSType                      N
   0x0c01   PCSCitation                          N
   0x0c02   Projection                           N
@@ -3363,7 +3616,7 @@ Unknown (-u) option is used.
   0x03fd   EPSOptions?                          N
   0x03fe   QuickMaskInfo?                       N
   0x03ff   ObsoletePhotoshopTag2?               N
-  0x0400   LayerStateInfo?                      N
+  0x0400   TargetLayerID?                       N
   0x0401   WorkingPath?                         N
   0x0402   LayersGroupInfo?                     N
   0x0403   ObsoletePhotoshopTag3?               N
@@ -3402,7 +3655,26 @@ Unknown (-u) option is used.
   0x0429   LayerComps?                          N
   0x042a   AlternateDuotoneColors?              N
   0x042b   AlternateSpotColors?                 N
+  0x042d   LayerSelectionIDs?                   N
+  0x042e   HDRToningInfo?                       N
+  0x042f   PrintInfo?                           N
+  0x0430   LayerGroupsEnabledID?                N
+  0x0431   ColorSamplersResource2?              N
+  0x0432   MeasurementScale?                    N
+  0x0433   TimelineInfo?                        N
+  0x0434   SheetDisclosure?                     N
+  0x0435   DisplayInfo?                         N
+  0x0436   OnionSkins?                          N
+  0x0438   CountInfo?                           N
+  0x043a   PrintInfo2?                          N
+  0x043b   PrintStyle?                          N
+  0x043c   MacintoshNSPrintInfo?                N
+  0x043d   WindowsDEVMODE?                      N
+  0x043e   AutoSaveFilePath?                    N
+  0x043f   AutoSaveFormat?                      N
   0x0bb7   ClippingPathName                     N
+  0x1b58   ImageReadyVariables?                 N
+  0x1f40   LightroomWorkflow?                   N
   0x2710   PrintFlagsInfo?                      N
 
 =head3 Photoshop Resolution Tags
@@ -3434,6244 +3706,6576 @@ This information is found in the PSD file header.
      11    BitDepth                             N
      12    ColorMode                            N
 
-=head2 Nikon Tags
-
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-  0x0001   MakerNoteVersion                     undef[4]
-  0x0002   ISO                                  int16u[2]
-  0x0003   ColorMode                            string
-  0x0004   Quality                              string
-  0x0005   WhiteBalance                         string
-  0x0006   Sharpness                            string
-  0x0007   FocusMode                            string
-  0x0008   FlashSetting                         string
-  0x0009   FlashType                            string
-  0x000b   WhiteBalanceFineTune                 int16s[n]
-  0x000c   WB_RBLevels                          rational64u[4]
-  0x000d   ProgramShift                         undef[4]
-  0x000e   ExposureDifference                   undef[4]
-  0x000f   ISOSelection                         string
-  0x0010   DataDump                             N
-  0x0011   PreviewIFD                           Nikon PreviewIFD
-  0x0012   FlashExposureComp                    undef[4]
-  0x0013   ISOSetting                           int16u[2]
-  0x0014   ColorBalanceA                        Nikon ColorBalanceA
-           NRWData?                             Y
-  0x0016   ImageBoundary                        int16u[4]
-  0x0017   ExternalFlashExposureComp            undef[4]
-  0x0018   FlashExposureBracketValue            undef[4]
-  0x0019   ExposureBracketValue                 rational64s
-  0x001a   ImageProcessing                      string
-  0x001b   CropHiSpeed                          int16u[7]~
-  0x001c   ExposureTuning                       undef[3]
-  0x001d   SerialNumber                         string!
-  0x001e   ColorSpace                           int16u
-  0x001f   VRInfo                               Nikon VRInfo
-  0x0020   ImageAuthentication                  int8u
-  0x0021   FaceDetect                           Nikon FaceDetect
-  0x0022   ActiveD-Lighting                     int16u
-  0x0023   PictureControlData                   Nikon PictureControl
-  0x0024   WorldTime                            Nikon WorldTime
-  0x0025   ISOInfo                              Nikon ISOInfo
-  0x002a   VignetteControl                      int16u
-  0x002b   DistortInfo                          Nikon DistortInfo
-  0x002c   UnknownInfo                          Nikon UnknownInfo
-  0x0032   UnknownInfo2                         Nikon UnknownInfo2
-  0x0035   HDRInfo                              Nikon HDRInfo
-  0x0039   LocationInfo                         Nikon LocationInfo
-  0x0080   ImageAdjustment                      string
-  0x0081   ToneComp                             string
-  0x0082   AuxiliaryLens                        string
-  0x0083   LensType                             int8u
-  0x0084   Lens                                 rational64u[4]
-  0x0085   ManualFocusDistance                  rational64u
-  0x0086   DigitalZoom                          rational64u
-  0x0087   FlashMode                            int8u
-  0x0088   AFInfo                               Nikon AFInfo
-                                                Nikon AFInfo
-  0x0089   ShootingMode                         int16u~
-  0x008b   LensFStops                           undef[4]
-  0x008c   ContrastCurve                        undef!
-  0x008d   ColorHue                             string
-  0x008f   SceneMode                            string
-  0x0090   LightSource                          string
-  0x0091   ShotInfoD40                          Nikon ShotInfoD40
-           ShotInfoD80                          Nikon ShotInfoD80
-           ShotInfoD90                          Nikon ShotInfoD90
-           ShotInfoD3a                          Nikon ShotInfoD3a
-           ShotInfoD3b                          Nikon ShotInfoD3b
-           ShotInfoD3X                          Nikon ShotInfoD3X
-           ShotInfoD3S                          Nikon ShotInfoD3S
-           ShotInfoD300a                        Nikon ShotInfoD300a
-           ShotInfoD300b                        Nikon ShotInfoD300b
-           ShotInfoD300S                        Nikon ShotInfoD300S
-           ShotInfoD700                         Nikon ShotInfoD700
-           ShotInfoD800                         Nikon ShotInfoD800
-           ShotInfoD5000                        Nikon ShotInfoD5000
-           ShotInfoD5100                        Nikon ShotInfoD5100
-           ShotInfoD5200                        Nikon ShotInfoD5200
-           ShotInfoD7000                        Nikon ShotInfoD7000
-           ShotInfo02xx                         Nikon ShotInfo
-           ShotInfoUnknown                      Nikon ShotInfo
-  0x0092   HueAdjustment                        int16s
-  0x0093   NEFCompression                       int16u
-  0x0094   Saturation                           int16s
-  0x0095   NoiseReduction                       string
-  0x0096   NEFLinearizationTable                undef!
-  0x0097   ColorBalance0100                     Nikon ColorBalance1
-           ColorBalance0102                     Nikon ColorBalance2
-           ColorBalance0103                     Nikon ColorBalance3
-           ColorBalance0205                     Nikon ColorBalance2
-           ColorBalance0209                     Nikon ColorBalance4
-           ColorBalance02                       Nikon ColorBalance2
-           ColorBalance0211                     Nikon ColorBalance4
-           ColorBalance0213                     Nikon ColorBalance2
-           ColorBalance0215                     Nikon ColorBalance4
-           ColorBalanceUnknown                  N
-  0x0098   LensData0100                         Nikon LensData00
-           LensData0101                         Nikon LensData01
-           LensData0201                         Nikon LensData01
-           LensData0204                         Nikon LensData0204
-           LensData0400                         Nikon LensData0400
-           LensDataUnknown                      Nikon LensDataUnknown
-  0x0099   RawImageCenter                       int16u[2]
-  0x009a   SensorPixelSize                      rational64u[2]
-  0x009c   SceneAssist                          string
-  0x009e   RetouchHistory                       int16u[10]
-  0x00a0   SerialNumber                         string
-  0x00a2   ImageDataSize                        int32u
-  0x00a5   ImageCount                           int32u
-  0x00a6   DeletedImageCount                    int32u
-  0x00a7   ShutterCount                         int32u!
-  0x00a8   FlashInfo0100                        Nikon FlashInfo0100
-           FlashInfo0102                        Nikon FlashInfo0102
-           FlashInfo0103                        Nikon FlashInfo0103
-           FlashInfoUnknown                     Nikon FlashInfoUnknown
-  0x00a9   ImageOptimization                    string
-  0x00aa   Saturation                           string
-  0x00ab   VariProgram                          string
-  0x00ac   ImageStabilization                   string
-  0x00ad   AFResponse                           string
-  0x00b0   MultiExposure                        Nikon MultiExposure
-  0x00b1   HighISONoiseReduction                int16u
-  0x00b3   ToningEffect                         string
-  0x00b6   PowerUpTime                          undef
-  0x00b7   AFInfo2                              Nikon AFInfo2
-  0x00b8   FileInfo                             Nikon FileInfo
-                                                Nikon FileInfo
-  0x00b9   AFTune                               Nikon AFTune
-  0x00bd   PictureControlData                   Nikon PictureControl
-  0x0e00   PrintIM                              PrintIM
-  0x0e01   NikonCaptureData                     NikonCapture
-  0x0e09   NikonCaptureVersion                  string
-  0x0e0e   NikonCaptureOffsets                  Nikon CaptureOffsets
-  0x0e10   NikonScanIFD                         Nikon Scan
-  0x0e13   NikonCaptureEditVersions             NikonCapture
-           NikonCaptureEditVersions             undef!
-  0x0e1d   NikonICCProfile                      ICC_Profile
-  0x0e1e   NikonCaptureOutput                   Nikon CaptureOutput
-  0x0e22   NEFBitDepth                          int16u[4]!
+=head2 Apple Tags
 
-=head3 Nikon PreviewIFD Tags
+Tags extracted from maker notes of images from the iPhone 5 with iOS 7.
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
-  0x00fe   SubfileType                          N
-  0x0103   Compression                          N
-  0x011a   XResolution                          N
-  0x011b   YResolution                          N
-  0x0128   ResolutionUnit                       N
-  0x0201   PreviewImageStart                    int32u*
-  0x0202   PreviewImageLength                   int32u*
-  0x0213   YCbCrPositioning                     N
-
-=head3 Nikon ColorBalanceA Tags
-
-  Index2   Tag Name                             Writable
-  ------   --------                             --------
-    624    RedBalance                           int16u!
-    625    BlueBalance                          int16u!
-
-=head3 Nikon VRInfo Tags
-
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-      0    VRInfoVersion                        N
-      4    VibrationReduction                   int8u
-      6    VRMode                               int8u
-
-=head3 Nikon FaceDetect Tags
-
-  Index2   Tag Name                             Writable
-  ------   --------                             --------
-      1    FaceDetectFrameSize                  int16u[2]
-      3    FacesDetected                        int16u
-      4    Face1Position                        int16u[4]
-      8    Face2Position                        int16u[4]
-     12    Face3Position                        int16u[4]
-     16    Face4Position                        int16u[4]
-     20    Face5Position                        int16u[4]
-     24    Face6Position                        int16u[4]
-     28    Face7Position                        int16u[4]
-     32    Face8Position                        int16u[4]
-     36    Face9Position                        int16u[4]
-     40    Face10Position                       int16u[4]
-     44    Face11Position                       int16u[4]
-     48    Face12Position                       int16u[4]
-
-=head3 Nikon PictureControl Tags
+  0x0003   RunTime                              Apple RunTime
+  0x000a   HDRImageType                         int32s
 
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-      0    PictureControlVersion                N
-      4    PictureControlName                   string[20]
-     24    PictureControlBase                   string[20]
-     48    PictureControlAdjust                 int8u
-     49    PictureControlQuickAdjust            int8u
-     50    Sharpness                            int8u
-     51    Contrast                             int8u
-     52    Brightness                           int8u
-     53    Saturation                           int8u
-     54    HueAdjustment                        int8u
-     55    FilterEffect                         int8u
-     56    ToningEffect                         int8u
-     57    ToningSaturation                     int8u
+=head3 Apple RunTime Tags
 
-=head3 Nikon WorldTime Tags
+This PLIST-format information contains the elements of a CMTime structure
+representing the amount of time the phone has been running since the last
+boot, not including standby time.
 
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-      0    Timezone                             int16s
-      2    DaylightSavings                      int8u
-      3    DateDisplayFormat                    int8u
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'epoch'              RunTimeEpoch             N
+  'flags'              RunTimeFlags             N
+  'timescale'          RunTimeScale             N
+  'value'              RunTimeValue             N
 
-=head3 Nikon ISOInfo Tags
+=head2 Canon Tags
 
-  Index1   Tag Name                             Writable
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      0    ISO                                  int8u
-      4    ISOExpansion                         int16u
-      6    ISO2                                 int8u
-     10    ISOExpansion2                        int16u
-
-=head3 Nikon DistortInfo Tags
+  0x0001   CanonCameraSettings                  Canon CameraSettings
+  0x0002   CanonFocalLength                     Canon FocalLength
+  0x0003   CanonFlashInfo?                      N
+  0x0004   CanonShotInfo                        Canon ShotInfo
+  0x0005   CanonPanorama                        Canon Panorama
+  0x0006   CanonImageType                       string
+  0x0007   CanonFirmwareVersion                 string
+  0x0008   FileNumber                           int32u
+  0x0009   OwnerName                            string
+  0x000a   UnknownD30                           Canon UnknownD30
+  0x000c   SerialNumber                         int32u
+  0x000d   CanonCameraInfo1D                    Canon CameraInfo1D
+           CanonCameraInfo1DmkII                Canon CameraInfo1DmkII
+           CanonCameraInfo1DmkIIN               Canon CameraInfo1DmkIIN
+           CanonCameraInfo1DmkIII               Canon CameraInfo1DmkIII
+           CanonCameraInfo1DmkIV                Canon CameraInfo1DmkIV
+           CanonCameraInfo1DX                   Canon CameraInfo1DX
+           CanonCameraInfo5D                    Canon CameraInfo5D
+           CanonCameraInfo5DmkII                Canon CameraInfo5DmkII
+           CanonCameraInfo5DmkIII               Canon CameraInfo5DmkIII
+           CanonCameraInfo6D                    Canon CameraInfo6D
+           CanonCameraInfo7D                    Canon CameraInfo7D
+           CanonCameraInfo40D                   Canon CameraInfo40D
+           CanonCameraInfo50D                   Canon CameraInfo50D
+           CanonCameraInfo60D                   Canon CameraInfo60D
+           CanonCameraInfo70D                   Canon CameraInfo70D
+           CanonCameraInfo450D                  Canon CameraInfo450D
+           CanonCameraInfo500D                  Canon CameraInfo500D
+           CanonCameraInfo550D                  Canon CameraInfo550D
+           CanonCameraInfo600D                  Canon CameraInfo600D
+           CanonCameraInfo650D                  Canon CameraInfo650D
+           CanonCameraInfo1000D                 Canon CameraInfo1000D
+           CanonCameraInfo1100D                 Canon CameraInfo600D
+           CanonCameraInfoPowerShot             Canon CameraInfoPowerShot
+           CanonCameraInfoPowerShot2            Canon CameraInfoPowerShot2
+           CanonCameraInfoUnknown32             Canon CameraInfoUnknown32
+           CanonCameraInfoUnknown16             Canon CameraInfoUnknown16
+           CanonCameraInfoUnknown               Canon CameraInfoUnknown
+  0x000e   CanonFileLength                      int32u
+  0x000f   CustomFunctions1D                    CanonCustom Functions1D
+           CustomFunctions5D                    CanonCustom Functions5D
+           CustomFunctions10D                   CanonCustom Functions10D
+           CustomFunctions20D                   CanonCustom Functions20D
+           CustomFunctions30D                   CanonCustom Functions30D
+           CustomFunctions350D                  CanonCustom Functions350D
+           CustomFunctions400D                  CanonCustom Functions400D
+           CustomFunctionsD30                   CanonCustom FunctionsD30
+           CustomFunctionsD60                   CanonCustom FunctionsD30
+           CustomFunctionsUnknown               CanonCustom FuncsUnknown
+  0x0010   CanonModelID                         int32u
+  0x0011   MovieInfo                            Canon MovieInfo
+  0x0012   CanonAFInfo                          Canon AFInfo
+  0x0013   ThumbnailImageValidArea              int16u[4]
+  0x0015   SerialNumberFormat                   int32u
+  0x001a   SuperMacro                           int16u
+  0x001c   DateStampMode                        int16u
+  0x001d   MyColors                             Canon MyColors
+  0x001e   FirmwareRevision                     int32u
+  0x0023   Categories                           int32u[2]
+  0x0024   FaceDetect1                          Canon FaceDetect1
+  0x0025   FaceDetect2                          Canon FaceDetect2
+  0x0026   CanonAFInfo2                         Canon AFInfo2
+  0x0027   ContrastInfo                         Canon ContrastInfo
+  0x0028   ImageUniqueID                        int8u
+  0x002f   FaceDetect3                          Canon FaceDetect3
+  0x0035   TimeInfo                             Canon TimeInfo
+  0x0081   RawDataOffset                        N
+  0x0083   OriginalDecisionDataOffset           int32u*
+  0x0090   CustomFunctions1D                    CanonCustom Functions1D
+  0x0091   PersonalFunctions                    CanonCustom PersonalFuncs
+  0x0092   PersonalFunctionValues               CanonCustom PersonalFuncValues
+  0x0093   CanonFileInfo                        Canon FileInfo
+  0x0094   AFPointsInFocus1D                    N
+  0x0095   LensModel                            string
+  0x0096   SerialInfo                           Canon SerialInfo
+           InternalSerialNumber                 string
+  0x0097   DustRemovalData                      undef!
+  0x0098   CropInfo                             Canon CropInfo
+  0x0099   CustomFunctions2                     CanonCustom Functions2
+  0x009a   AspectInfo                           Canon AspectInfo
+  0x00a0   ProcessingInfo                       Canon Processing
+  0x00a1   ToneCurveTable                       N
+  0x00a2   SharpnessTable                       N
+  0x00a3   SharpnessFreqTable                   N
+  0x00a4   WhiteBalanceTable                    N
+  0x00a9   ColorBalance                         Canon ColorBalance
+  0x00aa   MeasuredColor                        Canon MeasuredColor
+  0x00ae   ColorTemperature                     int16u
+  0x00b0   CanonFlags                           Canon Flags
+  0x00b1   ModifiedInfo                         Canon ModifiedInfo
+  0x00b2   ToneCurveMatching                    N
+  0x00b3   WhiteBalanceMatching                 N
+  0x00b4   ColorSpace                           int16u
+  0x00b6   PreviewImageInfo                     Canon PreviewImageInfo
+  0x00d0   VRDOffset                            int32u*
+  0x00e0   SensorInfo                           Canon SensorInfo
+  0x4001   ColorData1                           Canon ColorData1
+           ColorData2                           Canon ColorData2
+           ColorData3                           Canon ColorData3
+           ColorData4                           Canon ColorData4
+           ColorData5                           Canon ColorData5
+           ColorData6                           Canon ColorData6
+           ColorData7                           Canon ColorData7
+           ColorDataUnknown                     Canon ColorDataUnknown
+  0x4002   CRWParam?                            N
+  0x4003   ColorInfo                            Canon ColorInfo
+  0x4005   Flavor?                              N
+  0x4008   BlackLevel?                          N
+  0x4010   CustomPictureStyleFileName           string
+  0x4013   AFMicroAdj                           Canon AFMicroAdj
+  0x4015   VignettingCorr                       Canon VignettingCorr
+  0x4016   VignettingCorr2                      Canon VignettingCorr2
+  0x4018   LightingOpt                          Canon LightingOpt
+  0x4019   LensInfo                             Canon LensInfo
+  0x4020   AmbienceInfo                         Canon Ambience
+  0x4024   FilterInfo                           Canon FilterInfo
 
-  Index1   Tag Name                             Writable
+=head3 Canon CameraSettings Tags
+
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-      0    DistortionVersion?                   N
-      4    AutoDistortionControl                int8u
+      1    MacroMode                            int16s
+      2    SelfTimer                            int16s
+      3    Quality                              int16s
+      4    CanonFlashMode                       int16s
+      5    ContinuousDrive                      int16s
+      7    FocusMode                            int16s
+      9    RecordMode                           int16s
+     10    CanonImageSize                       int16s
+     11    EasyMode                             int16s
+     12    DigitalZoom                          int16s
+     13    Contrast                             int16s
+     14    Saturation                           int16s
+     15    Sharpness                            int16s
+     16    CameraISO                            int16s
+     17    MeteringMode                         int16s
+     18    FocusRange                           int16s
+     19    AFPoint                              int16s
+     20    CanonExposureMode                    int16s
+     22    LensType                             int16s
+     23    MaxFocalLength                       int16u
+     24    MinFocalLength                       int16u
+     25    FocalUnits                           int16s
+     26    MaxAperture                          int16s
+     27    MinAperture                          int16s
+     28    FlashActivity                        int16s
+     29    FlashBits                            int16s
+     32    FocusContinuous                      int16s
+     33    AESetting                            int16s
+     34    ImageStabilization                   int16s
+     35    DisplayAperture                      int16s
+     36    ZoomSourceWidth                      int16s
+     37    ZoomTargetWidth                      int16s
+     39    SpotMeteringMode                     int16s
+     40    PhotoEffect                          int16s
+     41    ManualFlashOutput                    int16s
+     42    ColorTone                            int16s
+     46    SRAWQuality                          int16s
 
-=head3 Nikon UnknownInfo Tags
+=head3 Canon FocalLength Tags
 
-  Index4   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-      0    UnknownInfoVersion?                  N
+      0    FocalType                            int16u
+      1    FocalLength                          int16u
+      2    FocalPlaneXSize                      int16u
+           FocalPlaneXUnknown?                  int16u
+      3    FocalPlaneYSize                      int16u
+           FocalPlaneYUnknown?                  int16u
 
-=head3 Nikon UnknownInfo2 Tags
+=head3 Canon ShotInfo Tags
 
-  Index4   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-      0    UnknownInfo2Version?                 N
+      1    AutoISO                              int16s
+      2    BaseISO                              int16s
+      3    MeasuredEV                           int16s
+      4    TargetAperture                       int16s
+      5    TargetExposureTime                   int16s
+      6    ExposureCompensation                 int16s
+      7    WhiteBalance                         int16s
+      8    SlowShutter                          int16s
+      9    SequenceNumber                       int16s
+     10    OpticalZoomCode                      int16s
+     12    CameraTemperature                    int16s
+     13    FlashGuideNumber                     int16s
+     14    AFPointsInFocus                      int16s
+     15    FlashExposureComp                    int16s
+     16    AutoExposureBracketing               int16s
+     17    AEBBracketValue                      int16s
+     18    ControlMode                          int16s
+     19    FocusDistanceUpper                   int16u
+     20    FocusDistanceLower                   int16u
+     21    FNumber                              int16s
+     22    ExposureTime                         int16s
+     23    MeasuredEV2                          int16s
+     24    BulbDuration                         int16s
+     26    CameraType                           int16s
+     27    AutoRotate                           int16s
+     28    NDFilter                             int16s
+     29    SelfTimer2                           int16s
+     33    FlashOutput                          int16s
 
-=head3 Nikon HDRInfo Tags
+=head3 Canon Panorama Tags
 
-  Index1   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-      0    HDRInfoVersion                       string[4]
-      4    HDR                                  int8u
-      5    HDRLevel                             int8u
-      6    HDRSmoothing                         int8u
-      7    HDRLevel2                            int8u
-
-=head3 Nikon LocationInfo Tags
+      2    PanoramaFrameNumber                  int16s
+      5    PanoramaDirection                    int16s
 
-Tags written by some Nikon GPS-equipped cameras like the AW100.
+=head3 Canon UnknownD30 Tags
 
-  Index1   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-      0    LocationInfoVersion                  undef[4]
-      4    TextEncoding                         int8u
-      5    CountryCode                          string[3]
-      9    Location                             undef[70]
+  [no tags known]
 
-=head3 Nikon AFInfo Tags
+=head3 Canon CameraInfo1D Tags
+
+Information in the "CameraInfo" records is tricky to decode because the
+encodings are very different than in other Canon records (even sometimes
+switching endianness between values within a single camera), plus there is
+considerable variation in format from model to model. The first table below
+lists CameraInfo tags for the 1D and 1DS.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    AFAreaMode                           int8u
-      1    AFPoint                              int8u
-      2    AFPointsInFocus                      int16u
+      4    ExposureTime                         int8u
+     10    FocalLength                          int16u
+     13    LensType                             int16uRev
+     14    MinFocalLength                       int16u
+     16    MaxFocalLength                       int16u
+     65    SharpnessFrequency                   int8u
+     66    Sharpness                            int8s
+     68    WhiteBalance                         int8u
+     71    SharpnessFrequency                   int8u
+     72    ColorTemperature                     int16u
+           Sharpness                            int8s
+     74    WhiteBalance                         int8u
+     75    PictureStyle                         int8u
+     78    ColorTemperature                     int16u
+     81    PictureStyle                         int8u
 
-=head3 Nikon ShotInfoD40 Tags
+=head3 Canon CameraInfo1DmkII Tags
 
-These tags are extracted from encrypted data in D40 and D40X images.
+CameraInfo tags for the 1DmkII and 1DSmkII.
 
-   Index   Tag Name                             Writable
-   -----   --------                             --------
-      0    ShotInfoVersion                      N
-    582    ShutterCount                         int32u
-  586.1    VibrationReduction                   int8u & 0x08
-    729    CustomSettingsD40                    NikonCustom SettingsD40
-
-=head3 Nikon ShotInfoD80 Tags
-
-These tags are extracted from encrypted data in D80 images.
-
-   Index   Tag Name                             Writable
-   -----   --------                             --------
-      0    ShotInfoVersion                      N
-    586    ShutterCount                         int32u
-  590.1    Rotation                             int8u & 0x07
-  590.2    VibrationReduction                   int8u & 0x18
-  590.3    FlashFired                           int8u & 0xe0
-    708    NikonImageSize                       int8u & 0xf0
-  708.1    ImageQuality                         int8u & 0x0f
-    748    CustomSettingsD80                    NikonCustom SettingsD80
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      4    ExposureTime                         int8u
+      9    FocalLength                          int16uRev
+     12    LensType                             int16uRev
+     17    MinFocalLength                       int16uRev
+     19    MaxFocalLength                       int16uRev
+     45    FocalType                            int8u
+     54    WhiteBalance                         int8u
+     55    ColorTemperature                     int16uRev
+     57    CanonImageSize                       int16u
+    102    JPEGQuality                          int8u
+    108    PictureStyle                         int8u
+    110    Saturation                           int8s
+    111    ColorTone                            int8s
+    114    Sharpness                            int8s
+    115    Contrast                             int8s
+    117    ISO                                  string[5]
 
-=head3 Nikon ShotInfoD90 Tags
+=head3 Canon CameraInfo1DmkIIN Tags
 
-These tags are extracted from encrypted data in images from the D90 with
-firmware 1.00.
+CameraInfo tags for the 1DmkIIN.
 
-   Index   Tag Name                             Writable
-   -----   --------                             --------
-      0    ShotInfoVersion                      N
-      4    FirmwareVersion                      N
-    693    ISO2                                 int8u
-    725    ShutterCount                         int32u
-    884    CustomSettingsD90                    NikonCustom SettingsD90
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      4    ExposureTime                         int8u
+      9    FocalLength                          int16uRev
+     12    LensType                             int16uRev
+     17    MinFocalLength                       int16uRev
+     19    MaxFocalLength                       int16uRev
+     54    WhiteBalance                         int8u
+     55    ColorTemperature                     int16uRev
+    115    PictureStyle                         int8u
+    116    Sharpness                            int8s
+    117    Contrast                             int8s
+    118    Saturation                           int8s
+    119    ColorTone                            int8s
+    121    ISO                                  string[5]
 
-=head3 Nikon ShotInfoD3a Tags
+=head3 Canon CameraInfo1DmkIII Tags
 
-These tags are extracted from encrypted data in images from the D3 with
-firmware 1.00 and earlier.
+CameraInfo tags for the 1DmkIII and 1DSmkIII.
 
-   Index   Tag Name                             Writable
-   -----   --------                             --------
-      0    ShotInfoVersion                      N
-    598    ISO2                                 int8u
-    630    ShutterCount                         int32u
-  723.1    NikonImageSize                       int8u & 0x18
-  723.2    ImageQuality                         int8u & 0x07
-    769    CustomSettingsD3                     NikonCustom SettingsD3
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+     24    CameraTemperature                    int8u
+     27    MacroMagnification                   int8u
+     29    FocalLength                          int16uRev
+     48    CameraOrientation                    int8u
+     67    FocusDistanceUpper                   int16uRev
+     69    FocusDistanceLower                   int16uRev
+     94    WhiteBalance                         int16u
+     98    ColorTemperature                     int16u
+    134    PictureStyle                         int8u
+    273    LensType                             int16uRev
+    275    MinFocalLength                       int16uRev
+    277    MaxFocalLength                       int16uRev
+    310    FirmwareVersion                      string[6]
+    370    FileIndex                            int32u
+    374    ShutterCount                         int32u
+    382    DirectoryIndex                       int32u
+    682    PictureStyleInfo                     Canon PSInfo
+   1114    TimeStamp1                           int32u
+   1118    TimeStamp                            int32u
 
-=head3 Nikon ShotInfoD3b Tags
+=head3 Canon PSInfo Tags
 
-These tags are extracted from encrypted data in images from the D3 with
-firmware 1.10, 2.00, 2.01 and 2.02.
+Custom picture style information for various models.
 
-   Index   Tag Name                             Writable
-   -----   --------                             --------
-      0    ShotInfoVersion                      N
-      4    FirmwareVersion                      N
-     16    ImageArea                            int8u
-    605    ISO2                                 int8u
-    637    ShutterCount                         int32u
-    639    ShutterCount                         int32u
-    650    PreFlashReturnStrength               int8u
-  732.1    NikonImageSize                       int8u & 0x18
-  732.2    ImageQuality                         int8u & 0x07
-    778    CustomSettingsD3                     NikonCustom SettingsD3
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    ContrastStandard                     int32s
+      4    SharpnessStandard                    int32s
+      8    SaturationStandard                   int32s
+     12    ColorToneStandard                    int32s
+     16    FilterEffectStandard?                int32s
+     20    ToningEffectStandard?                int32s
+     24    ContrastPortrait                     int32s
+     28    SharpnessPortrait                    int32s
+     32    SaturationPortrait                   int32s
+     36    ColorTonePortrait                    int32s
+     40    FilterEffectPortrait?                int32s
+     44    ToningEffectPortrait?                int32s
+     48    ContrastLandscape                    int32s
+     52    SharpnessLandscape                   int32s
+     56    SaturationLandscape                  int32s
+     60    ColorToneLandscape                   int32s
+     64    FilterEffectLandscape?               int32s
+     68    ToningEffectLandscape?               int32s
+     72    ContrastNeutral                      int32s
+     76    SharpnessNeutral                     int32s
+     80    SaturationNeutral                    int32s
+     84    ColorToneNeutral                     int32s
+     88    FilterEffectNeutral?                 int32s
+     92    ToningEffectNeutral?                 int32s
+     96    ContrastFaithful                     int32s
+    100    SharpnessFaithful                    int32s
+    104    SaturationFaithful                   int32s
+    108    ColorToneFaithful                    int32s
+    112    FilterEffectFaithful?                int32s
+    116    ToningEffectFaithful?                int32s
+    120    ContrastMonochrome                   int32s
+    124    SharpnessMonochrome                  int32s
+    128    SaturationMonochrome?                int32s
+    132    ColorToneMonochrome?                 int32s
+    136    FilterEffectMonochrome               int32s
+    140    ToningEffectMonochrome               int32s
+    144    ContrastUserDef1                     int32s
+    148    SharpnessUserDef1                    int32s
+    152    SaturationUserDef1                   int32s
+    156    ColorToneUserDef1                    int32s
+    160    FilterEffectUserDef1                 int32s
+    164    ToningEffectUserDef1                 int32s
+    168    ContrastUserDef2                     int32s
+    172    SharpnessUserDef2                    int32s
+    176    SaturationUserDef2                   int32s
+    180    ColorToneUserDef2                    int32s
+    184    FilterEffectUserDef2                 int32s
+    188    ToningEffectUserDef2                 int32s
+    192    ContrastUserDef3                     int32s
+    196    SharpnessUserDef3                    int32s
+    200    SaturationUserDef3                   int32s
+    204    ColorToneUserDef3                    int32s
+    208    FilterEffectUserDef3                 int32s
+    212    ToningEffectUserDef3                 int32s
+    216    UserDef1PictureStyle                 int16u
+    218    UserDef2PictureStyle                 int16u
+    220    UserDef3PictureStyle                 int16u
 
-=head3 Nikon ShotInfoD3X Tags
+=head3 Canon CameraInfo1DmkIV Tags
 
-These tags are extracted from encrypted data in images from the D3X with
-firmware 1.00.
+CameraInfo tags for the EOS 1D Mark IV.  Indices shown are for firmware
+versions 1.0.x, but they may be different for other firmware versions.
 
-   Index   Tag Name                             Writable
-   -----   --------                             --------
-      0    ShotInfoVersion                      N
-      4    FirmwareVersion                      N
-    605    ISO2                                 int8u
-    640    ShutterCount                         int32u
-    779    CustomSettingsD3X                    NikonCustom SettingsD3
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+      7    HighlightTonePriority                int8u
+      8    MeasuredEV2                          int8u
+      9    MeasuredEV3                          int8u
+     21    FlashMeteringMode                    int8u
+     25    CameraTemperature                    int8u
+     30    FocalLength                          int16uRev
+     53    CameraOrientation                    int8u
+     84    FocusDistanceUpper                   int16uRev
+     86    FocusDistanceLower                   int16uRev
+    120    WhiteBalance                         int16u
+    124    ColorTemperature                     int16u
+    335    LensType                             int16uRev
+    337    MinFocalLength                       int16uRev
+    339    MaxFocalLength                       int16uRev
+    493    FirmwareVersion                      N
+    556    FileIndex                            int32u
+    568    DirectoryIndex                       int32u
+    872    PictureStyleInfo                     Canon PSInfo
 
-=head3 Nikon ShotInfoD3S Tags
+=head3 Canon CameraInfo1DX Tags
 
-These tags are extracted from encrypted data in images from the D3S with
-firmware 1.00 and earlier.
+CameraInfo tags for the EOS 1D X.  Indices shown are for firmware version
+1.0.2, but they may be different for other firmware versions.
 
-   Index   Tag Name                             Writable
-   -----   --------                             --------
-      0    ShotInfoVersion                      N
-      4    FirmwareVersion                      N
-     16    ImageArea                            int8u
-    545    ISO2                                 int8u
-    578    ShutterCount                         int32u
-    718    CustomSettingsD3S                    NikonCustom SettingsD3
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+     27    CameraTemperature                    int8u
+     35    FocalLength                          int16uRev
+    125    CameraOrientation                    int8u
+    140    FocusDistanceUpper                   int16uRev
+    142    FocusDistanceLower                   int16uRev
+    188    WhiteBalance                         int16u
+    192    ColorTemperature                     int16u
+    244    PictureStyle                         int8u
+    423    LensType                             int16uRev
+    425    MinFocalLength                       int16uRev
+    427    MaxFocalLength                       int16uRev
+    640    FirmwareVersion                      N
+    720    FileIndex                            int32u
+    732    DirectoryIndex                       int32u
+   1012    PictureStyleInfo                     Canon PSInfo2
 
-=head3 Nikon ShotInfoD300a Tags
+=head3 Canon PSInfo2 Tags
 
-These tags are extracted from encrypted data in images from the D300 with
-firmware 1.00 and earlier.
+Custom picture style information for the EOS 5DmkIII, 60D, 600D and 1100D.
 
-   Index   Tag Name                             Writable
-   -----   --------                             --------
-      0    ShotInfoVersion                      N
-    604    ISO2                                 int8u
-    633    ShutterCount                         int32u
-    721    AFFineTuneAdj                        int16u
-    790    CustomSettingsD300                   NikonCustom SettingsD3
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    ContrastStandard                     int32s
+      4    SharpnessStandard                    int32s
+      8    SaturationStandard                   int32s
+     12    ColorToneStandard                    int32s
+     16    FilterEffectStandard?                int32s
+     20    ToningEffectStandard?                int32s
+     24    ContrastPortrait                     int32s
+     28    SharpnessPortrait                    int32s
+     32    SaturationPortrait                   int32s
+     36    ColorTonePortrait                    int32s
+     40    FilterEffectPortrait?                int32s
+     44    ToningEffectPortrait?                int32s
+     48    ContrastLandscape                    int32s
+     52    SharpnessLandscape                   int32s
+     56    SaturationLandscape                  int32s
+     60    ColorToneLandscape                   int32s
+     64    FilterEffectLandscape?               int32s
+     68    ToningEffectLandscape?               int32s
+     72    ContrastNeutral                      int32s
+     76    SharpnessNeutral                     int32s
+     80    SaturationNeutral                    int32s
+     84    ColorToneNeutral                     int32s
+     88    FilterEffectNeutral?                 int32s
+     92    ToningEffectNeutral?                 int32s
+     96    ContrastFaithful                     int32s
+    100    SharpnessFaithful                    int32s
+    104    SaturationFaithful                   int32s
+    108    ColorToneFaithful                    int32s
+    112    FilterEffectFaithful?                int32s
+    116    ToningEffectFaithful?                int32s
+    120    ContrastMonochrome                   int32s
+    124    SharpnessMonochrome                  int32s
+    128    SaturationMonochrome?                int32s
+    132    ColorToneMonochrome?                 int32s
+    136    FilterEffectMonochrome               int32s
+    140    ToningEffectMonochrome               int32s
+    144    ContrastAuto                         int32s
+    148    SharpnessAuto                        int32s
+    152    SaturationAuto                       int32s
+    156    ColorToneAuto                        int32s
+    160    FilterEffectAuto                     int32s
+    164    ToningEffectAuto                     int32s
+    168    ContrastUserDef1                     int32s
+    172    SharpnessUserDef1                    int32s
+    176    SaturationUserDef1                   int32s
+    180    ColorToneUserDef1                    int32s
+    184    FilterEffectUserDef1                 int32s
+    188    ToningEffectUserDef1                 int32s
+    192    ContrastUserDef2                     int32s
+    196    SharpnessUserDef2                    int32s
+    200    SaturationUserDef2                   int32s
+    204    ColorToneUserDef2                    int32s
+    208    FilterEffectUserDef2                 int32s
+    212    ToningEffectUserDef2                 int32s
+    216    ContrastUserDef3                     int32s
+    220    SharpnessUserDef3                    int32s
+    224    SaturationUserDef3                   int32s
+    228    ColorToneUserDef3                    int32s
+    232    FilterEffectUserDef3                 int32s
+    236    ToningEffectUserDef3                 int32s
+    240    UserDef1PictureStyle                 int16u
+    242    UserDef2PictureStyle                 int16u
+    244    UserDef3PictureStyle                 int16u
 
-=head3 Nikon ShotInfoD300b Tags
+=head3 Canon CameraInfo5D Tags
 
-These tags are extracted from encrypted data in images from the D300 with
-firmware 1.10.
+CameraInfo tags for the EOS 5D.
 
-   Index   Tag Name                             Writable
-   -----   --------                             --------
-      0    ShotInfoVersion                      N
-      4    FirmwareVersion                      N
-    613    ISO2                                 int8u
-    644    ShutterCount                         int32u
-    732    AFFineTuneAdj                        int16u
-    802    CustomSettingsD300                   NikonCustom SettingsD3
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+     12    LensType                             int16uRev
+     23    CameraTemperature                    int8u
+     27    MacroMagnification                   int8s
+     39    CameraOrientation                    int8s
+     40    FocalLength                          int16uRev
+     56    AFPointsInFocus5D                    int16uRev
+     84    WhiteBalance                         int16u
+     88    ColorTemperature                     int16u
+    108    PictureStyle                         int8u
+    147    MinFocalLength                       int16uRev
+    149    MaxFocalLength                       int16uRev
+    151    LensType                             int16uRev
+    164    FirmwareRevision                     string[8]
+    172    ShortOwnerName                       string[16]
+    204    DirectoryIndex                       int32u
+    208    FileIndex                            int16u
+    232    ContrastStandard                     int8s
+    233    ContrastPortrait                     int8s
+    234    ContrastLandscape                    int8s
+    235    ContrastNeutral                      int8s
+    236    ContrastFaithful                     int8s
+    237    ContrastMonochrome                   int8s
+    238    ContrastUserDef1                     int8s
+    239    ContrastUserDef2                     int8s
+    240    ContrastUserDef3                     int8s
+    241    SharpnessStandard                    int8s
+    242    SharpnessPortrait                    int8s
+    243    SharpnessLandscape                   int8s
+    244    SharpnessNeutral                     int8s
+    245    SharpnessFaithful                    int8s
+    246    SharpnessMonochrome                  int8s
+    247    SharpnessUserDef1                    int8s
+    248    SharpnessUserDef2                    int8s
+    249    SharpnessUserDef3                    int8s
+    250    SaturationStandard                   int8s
+    251    SaturationPortrait                   int8s
+    252    SaturationLandscape                  int8s
+    253    SaturationNeutral                    int8s
+    254    SaturationFaithful                   int8s
+    255    FilterEffectMonochrome               int8s
+    256    SaturationUserDef1                   int8s
+    257    SaturationUserDef2                   int8s
+    258    SaturationUserDef3                   int8s
+    259    ColorToneStandard                    int8s
+    260    ColorTonePortrait                    int8s
+    261    ColorToneLandscape                   int8s
+    262    ColorToneNeutral                     int8s
+    263    ColorToneFaithful                    int8s
+    264    ToningEffectMonochrome               int8s
+    265    ColorToneUserDef1                    int8s
+    266    ColorToneUserDef2                    int8s
+    267    ColorToneUserDef3                    int8s
+    268    UserDef1PictureStyle                 int16u
+    270    UserDef2PictureStyle                 int16u
+    272    UserDef3PictureStyle                 int16u
+    284    TimeStamp                            int32u
 
-=head3 Nikon ShotInfoD300S Tags
+=head3 Canon CameraInfo5DmkII Tags
 
-These tags are extracted from encrypted data in images from the D300S with
-firmware 1.00.
+CameraInfo tags for the EOS 5D Mark II.  Indices shown are for firmware
+version 1.0.6, but they may be different for other firmware versions.
 
-   Index   Tag Name                             Writable
-   -----   --------                             --------
-      0    ShotInfoVersion                      N
-      4    FirmwareVersion                      N
-    613    ISO2                                 int8u
-    646    ShutterCount                         int32u
-    804    CustomSettingsD300S                  NikonCustom SettingsD3
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+      7    HighlightTonePriority                int8u
+     21    FlashMeteringMode                    int8u
+     25    CameraTemperature                    int8u
+     27    MacroMagnification                   int8u
+     30    FocalLength                          int16uRev
+     49    CameraOrientation                    int8u
+     80    FocusDistanceUpper                   int16uRev
+     82    FocusDistanceLower                   int16uRev
+    111    WhiteBalance                         int16u
+    115    ColorTemperature                     int16u
+    167    PictureStyle                         int8u
+    189    HighISONoiseReduction                int8u
+    191    AutoLightingOptimizer                int8u
+    230    LensType                             int16uRev
+    232    MinFocalLength                       int16uRev
+    234    MaxFocalLength                       int16uRev
+    382    FirmwareVersion                      N
+    443    FileIndex                            int32u
+    455    DirectoryIndex                       int32u
+    759    PictureStyleInfo                     Canon PSInfo
 
-=head3 Nikon ShotInfoD700 Tags
+=head3 Canon CameraInfo5DmkIII Tags
 
-These tags are extracted from encrypted data in images from the D700 with
-firmware 1.02f.
+CameraInfo tags for the EOS 5D Mark III.  Indices shown are for firmware
+versions 1.0.x, but they may be different for other firmware versions.
 
-   Index   Tag Name                             Writable
-   -----   --------                             --------
-      0    ShotInfoVersion                      N
-      4    FirmwareVersion                      N
-    613    ISO2                                 int8u
-    647    ShutterCount                         int32u
-    804    CustomSettingsD700                   NikonCustom SettingsD700
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+     27    CameraTemperature                    int8u
+     35    FocalLength                          int16uRev
+    125    CameraOrientation                    int8u
+    140    FocusDistanceUpper                   int16uRev
+    142    FocusDistanceLower                   int16uRev
+    188    WhiteBalance                         int16u
+    192    ColorTemperature                     int16u
+    244    PictureStyle                         int8u
+    339    LensType                             int16uRev
+    341    MinFocalLength                       int16uRev
+    343    MaxFocalLength                       int16uRev
+    572    FirmwareVersion                      N
+    652    FileIndex                            int32u
+    656    FileIndex2                           int32u
+    664    DirectoryIndex                       int32u
+    668    DirectoryIndex2                      int32u
+    944    PictureStyleInfo                     Canon PSInfo2
 
-=head3 Nikon ShotInfoD800 Tags
+=head3 Canon CameraInfo6D Tags
 
-These tags are extracted from encrypted data in images from the D800.
+CameraInfo tags for the EOS 6D.
 
-   Index   Tag Name                             Writable
-   -----   --------                             --------
-      0    ShotInfoVersion                      N
-      4    FirmwareVersion                      N
-   1216    RepeatingFlashOutputExternal         int8u
-   1218    RepeatingFlashRateExternal           int8u
-   1219    RepeatingFlashCountExternal          int8u
-   1234    FlashExposureComp2                   int8s
-   1242    RepeatingFlashRateBuilt-in           int8u
-   1243    RepeatingFlashCountBuilt-in          int8u
-   1308    SequenceNumber                       int8u
-   1531    ShutterCount                         int32u
-   1772    CustomSettingsD800                   NikonCustom SettingsD800
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+     27    CameraTemperature                    int8u
+     35    FocalLength                          int16uRev
+    131    CameraOrientation                    int8u
+    146    FocusDistanceUpper                   int16uRev
+    148    FocusDistanceLower                   int16uRev
+    194    WhiteBalance                         int16u
+    198    ColorTemperature                     int16u
+    250    PictureStyle                         int8u
+    353    LensType                             int16uRev
+    355    MinFocalLength                       int16uRev
+    357    MaxFocalLength                       int16uRev
+    598    FirmwareVersion                      N
+    682    FileIndex                            int32u
+    694    DirectoryIndex                       int32u
+    966    PictureStyleInfo                     Canon PSInfo2
 
-=head3 Nikon ShotInfoD5000 Tags
+=head3 Canon CameraInfo7D Tags
 
-These tags are extracted from encrypted data in images from the D5000 with
-firmware 1.00.
-
-   Index   Tag Name                             Writable
-   -----   --------                             --------
-      0    ShotInfoVersion                      N
-      4    FirmwareVersion                      N
-    693    ISO2                                 int8u
-    726    ShutterCount                         int32u
-    888    CustomSettingsD5000                  NikonCustom SettingsD5000
-
-=head3 Nikon ShotInfoD5100 Tags
-
-   Index   Tag Name                             Writable
-   -----   --------                             --------
-      0    ShotInfoVersion                      N
-      4    FirmwareVersion                      N
-    801    ShutterCount                         int32u
-   1031    CustomSettingsD5100                  NikonCustom SettingsD5100
-
-=head3 Nikon ShotInfoD5200 Tags
-
-   Index   Tag Name                             Writable
-   -----   --------                             --------
-      0    ShotInfoVersion                      N
-      4    FirmwareVersion                      N
-   3032    ShutterCount                         int32u
-   3285    CustomSettingsD5200                  NikonCustom SettingsD5200
-
-=head3 Nikon ShotInfoD7000 Tags
-
-These tags are extracted from encrypted data in images from the D7000 with
-firmware 1.01b.
-
-   Index   Tag Name                             Writable
-   -----   --------                             --------
-      0    ShotInfoVersion                      N
-      4    FirmwareVersion                      N
-    800    ShutterCount                         int32u
-   1028    CustomSettingsD7000                  NikonCustom SettingsD7000
-
-=head3 Nikon ShotInfo Tags
-
-This information is encrypted for ShotInfoVersion 02xx, and some tags are
-only valid for specific models.
+CameraInfo tags for the EOS 7D.  Indices shown are for firmware versions
+1.0.x, but they may be different for other firmware versions.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    ShotInfoVersion                      N
-      4    FirmwareVersion                      N
-     16    DistortionControl                    int8u
-    102    VR_0x66?                             int8u
-    106    ShutterCount                         int32u
-    110    DeletedImageCount                    int32u
-    117    VibrationReduction                   int8u
-    130    VibrationReduction                   int8u
-    343    ShutterCount                         undef[2]
-    430    VibrationReduction                   int8u
-    589    ShutterCount                         int32u
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+      7    HighlightTonePriority                int8u
+      8    MeasuredEV2                          int8u
+      9    MeasuredEV                           int8u
+     21    FlashMeteringMode                    int8u
+     25    CameraTemperature                    int8u
+     30    FocalLength                          int16uRev
+     53    CameraOrientation                    int8u
+     84    FocusDistanceUpper                   int16uRev
+     86    FocusDistanceLower                   int16uRev
+    119    WhiteBalance                         int16u
+    123    ColorTemperature                     int16u
+    201    HighISONoiseReduction                int8u
+    274    LensType                             int16uRev
+    276    MinFocalLength                       int16uRev
+    278    MaxFocalLength                       int16uRev
+    428    FirmwareVersion                      N
+    491    FileIndex                            int32u
+    503    DirectoryIndex                       int32u
+    807    PictureStyleInfo                     Canon PSInfo
 
-=head3 Nikon ColorBalance1 Tags
+=head3 Canon CameraInfo40D Tags
 
-  Index2   Tag Name                             Writable
+CameraInfo tags for the EOS 40D.
+
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    WB_RBGGLevels                        int16u[4]!
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+     21    FlashMeteringMode                    int8u
+     24    CameraTemperature                    int8u
+     27    MacroMagnification                   int8u
+     29    FocalLength                          int16uRev
+     48    CameraOrientation                    int8u
+     67    FocusDistanceUpper                   int16uRev
+     69    FocusDistanceLower                   int16uRev
+    111    WhiteBalance                         int16u
+    115    ColorTemperature                     int16u
+    214    LensType                             int16uRev
+    216    MinFocalLength                       int16uRev
+    218    MaxFocalLength                       int16uRev
+    255    FirmwareVersion                      string[6]
+    307    FileIndex                            int32u
+    319    DirectoryIndex                       int32u
+    603    PictureStyleInfo                     Canon PSInfo
+   2347    LensModel                            string[64]
 
-=head3 Nikon ColorBalance2 Tags
+=head3 Canon CameraInfo50D Tags
 
-This information is encrypted for most camera models.
+CameraInfo tags for the EOS 50D.  Indices shown are for firmware versions
+1.0.x, but they may be different for other firmware versions.
 
-  Index2   Tag Name                             Writable
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    WB_RGGBLevels                        int16u[4]!
-
-=head3 Nikon ColorBalance3 Tags
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+      7    HighlightTonePriority                int8u
+     21    FlashMeteringMode                    int8u
+     25    CameraTemperature                    int8u
+     30    FocalLength                          int16uRev
+     49    CameraOrientation                    int8u
+     80    FocusDistanceUpper                   int16uRev
+     82    FocusDistanceLower                   int16uRev
+    111    WhiteBalance                         int16u
+    115    ColorTemperature                     int16u
+    167    PictureStyle                         int8u
+    189    HighISONoiseReduction                int8u
+    191    AutoLightingOptimizer                int8u
+    234    LensType                             int16uRev
+    236    MinFocalLength                       int16uRev
+    238    MaxFocalLength                       int16uRev
+    350    FirmwareVersion                      N
+    411    FileIndex                            int32u
+    423    DirectoryIndex                       int32u
+    727    PictureStyleInfo                     Canon PSInfo
 
-  Index2   Tag Name                             Writable
-  ------   --------                             --------
-      0    WB_RGBGLevels                        int16u[4]!
+=head3 Canon CameraInfo60D Tags
 
-=head3 Nikon ColorBalance4 Tags
+CameraInfo tags for the EOS 60D.
 
-  Index2   Tag Name                             Writable
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    WB_GRBGLevels                        int16u[4]!
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+     25    CameraTemperature                    int8u
+     30    FocalLength                          int16uRev
+     54    CameraOrientation                    int8u
+     85    FocusDistanceUpper                   int16uRev
+     87    FocusDistanceLower                   int16uRev
+    125    ColorTemperature                     int16u
+    232    LensType                             int16uRev
+    234    MinFocalLength                       int16uRev
+    236    MaxFocalLength                       int16uRev
+    409    FirmwareVersion                      N
+    473    FileIndex                            int32u
+    485    DirectoryIndex                       int32u
+    801    PictureStyleInfo                     Canon PSInfo2
 
-=head3 Nikon LensData00 Tags
+=head3 Canon CameraInfo70D Tags
 
-This structure is used by the D100, and D1X with firmware version 1.1.
+CameraInfo tags for the EOS 70D.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    LensDataVersion                      N
-      6    LensIDNumber                         int8u
-      7    LensFStops                           int8u
-      8    MinFocalLength                       int8u
-      9    MaxFocalLength                       int8u
-     10    MaxApertureAtMinFocal                int8u
-     11    MaxApertureAtMaxFocal                int8u
-     12    MCUVersion                           int8u
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+     27    CameraTemperature                    int8u
+     35    FocalLength                          int16uRev
+    132    CameraOrientation                    int8u
+    147    FocusDistanceUpper                   int16uRev
+    149    FocusDistanceLower                   int16uRev
+    199    ColorTemperature                     int16u
+    358    LensType                             int16uRev
+    360    MinFocalLength                       int16uRev
+    362    MaxFocalLength                       int16uRev
+    606    FirmwareVersion                      N
+    691    FileIndex                            int32u
+    703    DirectoryIndex                       int32u
+    975    PictureStyleInfo                     Canon PSInfo2
 
-=head3 Nikon LensData01 Tags
+=head3 Canon CameraInfo450D Tags
 
-Nikon encrypts the LensData information below if LensDataVersion is 0201 or
-higher, but  the decryption algorithm is known so the information can be
-extracted.
+CameraInfo tags for the EOS 450D.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    LensDataVersion                      N
-      4    ExitPupilPosition                    int8u
-      5    AFAperture                           int8u
-      8    FocusPosition                        int8u
-      9    FocusDistance                        int8u
-     10    FocalLength                          int8u
-     11    LensIDNumber                         int8u
-     12    LensFStops                           int8u
-     13    MinFocalLength                       int8u
-     14    MaxFocalLength                       int8u
-     15    MaxApertureAtMinFocal                int8u
-     16    MaxApertureAtMaxFocal                int8u
-     17    MCUVersion                           int8u
-     18    EffectiveMaxAperture                 int8u
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+     21    FlashMeteringMode                    int8u
+     24    CameraTemperature                    int8u
+     27    MacroMagnification                   int8u
+     29    FocalLength                          int16uRev
+     48    CameraOrientation                    int8u
+     67    FocusDistanceUpper                   int16uRev
+     69    FocusDistanceLower                   int16uRev
+    111    WhiteBalance                         int16u
+    115    ColorTemperature                     int16u
+    222    LensType                             int16uRev
+    263    FirmwareVersion                      string[6]
+    271    OwnerName                            string[32]
+    307    DirectoryIndex                       int32u
+    319    FileIndex                            int32u
+    611    PictureStyleInfo                     Canon PSInfo
+   2355    LensModel                            string[64]
 
-=head3 Nikon LensData0204 Tags
+=head3 Canon CameraInfo500D Tags
 
-Nikon encrypts the LensData information below if LensDataVersion is 0201 or
-higher, but  the decryption algorithm is known so the information can be
-extracted.
+CameraInfo tags for the EOS 500D.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    LensDataVersion                      N
-      4    ExitPupilPosition                    int8u
-      5    AFAperture                           int8u
-      8    FocusPosition                        int8u
-     10    FocusDistance                        int8u
-     11    FocalLength                          int8u
-     12    LensIDNumber                         int8u
-     13    LensFStops                           int8u
-     14    MinFocalLength                       int8u
-     15    MaxFocalLength                       int8u
-     16    MaxApertureAtMinFocal                int8u
-     17    MaxApertureAtMaxFocal                int8u
-     18    MCUVersion                           int8u
-     19    EffectiveMaxAperture                 int8u
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+      7    HighlightTonePriority                int8u
+     21    FlashMeteringMode                    int8u
+     25    CameraTemperature                    int8u
+     30    FocalLength                          int16uRev
+     49    CameraOrientation                    int8u
+     80    FocusDistanceUpper                   int16uRev
+     82    FocusDistanceLower                   int16uRev
+    115    WhiteBalance                         int16u
+    119    ColorTemperature                     int16u
+    171    PictureStyle                         int8u
+    188    HighISONoiseReduction                int8u
+    190    AutoLightingOptimizer                int8u
+    246    LensType                             int16uRev
+    248    MinFocalLength                       int16uRev
+    250    MaxFocalLength                       int16uRev
+    400    FirmwareVersion                      N
+    467    FileIndex                            int32u
+    479    DirectoryIndex                       int32u
+    779    PictureStyleInfo                     Canon PSInfo
 
-=head3 Nikon LensData0400 Tags
+=head3 Canon CameraInfo550D Tags
 
-Tags extracted from the encrypted lens data of Nikon 1 models.
+CameraInfo tags for the EOS 550D.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    LensDataVersion                      N
-    394    LensModel                            string[64]
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+      7    HighlightTonePriority                int8u
+     21    FlashMeteringMode                    int8u
+     25    CameraTemperature                    int8u
+     30    FocalLength                          int16uRev
+     53    CameraOrientation                    int8u
+     84    FocusDistanceUpper                   int16uRev
+     86    FocusDistanceLower                   int16uRev
+    120    WhiteBalance                         int16u
+    124    ColorTemperature                     int16u
+    176    PictureStyle                         int8u
+    255    LensType                             int16uRev
+    257    MinFocalLength                       int16uRev
+    259    MaxFocalLength                       int16uRev
+    420    FirmwareVersion                      N
+    484    FileIndex                            int32u
+    496    DirectoryIndex                       int32u
+    796    PictureStyleInfo                     Canon PSInfo
 
-=head3 Nikon LensDataUnknown Tags
+=head3 Canon CameraInfo600D Tags
+
+CameraInfo tags for the EOS 600D and 1100D.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    LensDataVersion                      N
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+      7    HighlightTonePriority                int8u
+     21    FlashMeteringMode                    int8u
+     25    CameraTemperature                    int8u
+     30    FocalLength                          int16uRev
+     56    CameraOrientation                    int8u
+     87    FocusDistanceUpper                   int16uRev
+     89    FocusDistanceLower                   int16uRev
+    123    WhiteBalance                         int16u
+    127    ColorTemperature                     int16u
+    179    PictureStyle                         int8u
+    234    LensType                             int16uRev
+    236    MinFocalLength                       int16uRev
+    238    MaxFocalLength                       int16uRev
+    411    FirmwareVersion                      N
+    475    FileIndex                            int32u
+    487    DirectoryIndex                       int32u
+    763    PictureStyleInfo                     Canon PSInfo2
 
-=head3 Nikon FlashInfo0100 Tags
+=head3 Canon CameraInfo650D Tags
 
-These tags are used by the D2H, D2Hs, D2X, D2Xs, D50, D70, D70s, D80 and
-D200.
+CameraInfo tags for the EOS 650D and 700D.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    FlashInfoVersion                     N
-      4    FlashSource                          int8u
-      6    ExternalFlashFirmware                int8u[2]
-      8    ExternalFlashFlags                   int8u
-    9.1    FlashCommanderMode                   int8u & 0x80
-    9.2    FlashControlMode                     int8u & 0x7f
-     10    FlashOutput                          int8u
-           FlashCompensation                    int8s
-     11    FlashFocalLength                     int8u
-     12    RepeatingFlashRate                   int8u
-     13    RepeatingFlashCount                  int8u
-     14    FlashGNDistance                      int8u
-     15    FlashGroupAControlMode               int8u & 0x0f
-     16    FlashGroupBControlMode               int8u & 0x0f
-     17    FlashGroupAOutput                    int8u
-           FlashGroupACompensation              int8s
-     18    FlashGroupBOutput                    int8u
-           FlashGroupBCompensation              int8s
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+     27    CameraTemperature                    int8u
+     35    FocalLength                          int16uRev
+    125    CameraOrientation                    int8u
+    140    FocusDistanceUpper                   int16uRev
+    142    FocusDistanceLower                   int16uRev
+    188    WhiteBalance                         int16u
+    192    ColorTemperature                     int16u
+    244    PictureStyle                         int8u
+    295    LensType                             int16uRev
+    297    MinFocalLength                       int16uRev
+    299    MaxFocalLength                       int16uRev
+    539    FirmwareVersion                      N
+    544    FirmwareVersion                      N
+    624    FileIndex                            int32u
+    628    FileIndex                            int32u
+    636    DirectoryIndex                       int32u
+    640    DirectoryIndex                       int32u
+    912    PictureStyleInfo                     Canon PSInfo2
 
-=head3 Nikon FlashInfo0102 Tags
+=head3 Canon CameraInfo1000D Tags
 
-These tags are used by the D3 (firmware 1.x), D40, D40X, D60 and D300
-(firmware 1.00).
+CameraInfo tags for the EOS 1000D.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    FlashInfoVersion                     N
-      4    FlashSource                          int8u
-      6    ExternalFlashFirmware                int8u[2]
-      8    ExternalFlashFlags                   int8u
-    9.1    FlashCommanderMode                   int8u & 0x80
-    9.2    FlashControlMode                     int8u & 0x7f
-     10    FlashOutput                          int8u
-           FlashCompensation                    int8s
-     12    FlashFocalLength                     int8u
-     13    RepeatingFlashRate                   int8u
-     14    RepeatingFlashCount                  int8u
-     15    FlashGNDistance                      int8u
-   16.1    FlashGroupAControlMode               int8u & 0x0f
-   17.1    FlashGroupBControlMode               int8u & 0xf0
-   17.2    FlashGroupCControlMode               int8u & 0x0f
-     18    FlashGroupAOutput                    int8u
-           FlashGroupACompensation              int8s
-     19    FlashGroupBOutput                    int8u
-           FlashGroupBCompensation              int8s
-     20    FlashGroupCOutput                    int8u
-           FlashGroupCCompensation              int8s
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+     21    FlashMeteringMode                    int8u
+     24    CameraTemperature                    int8u
+     27    MacroMagnification                   int8u
+     29    FocalLength                          int16uRev
+     48    CameraOrientation                    int8u
+     67    FocusDistanceUpper                   int16uRev
+     69    FocusDistanceLower                   int16uRev
+    111    WhiteBalance                         int16u
+    115    ColorTemperature                     int16u
+    226    LensType                             int16uRev
+    228    MinFocalLength                       int16uRev
+    230    MaxFocalLength                       int16uRev
+    267    FirmwareVersion                      string[6]
+    311    DirectoryIndex                       int32u
+    323    FileIndex                            int32u
+    615    PictureStyleInfo                     Canon PSInfo
+   2359    LensModel                            string[64]
 
-=head3 Nikon FlashInfo0103 Tags
+=head3 Canon CameraInfoPowerShot Tags
 
-These tags are used by the D3 (firmware 2.x), D3X, D3S, D4, D90, D300
-(firmware 1.10), D300S, D600, D700, D800, D3000, D3100, D3200, D5000, D5100,
-D5200, D7000.
+CameraInfo tags for PowerShot models such as the A450, A460, A550, A560,
+A570, A630, A640, A650, A710, A720, G7, G9, S5, SD40, SD750, SD800, SD850,
+SD870, SD900, SD950, SD1000, SX100 and TX1.
 
-  Index1   Tag Name                             Writable
+  Index4   Tag Name                             Writable
   ------   --------                             --------
-      0    FlashInfoVersion                     N
-      4    FlashSource                          int8u
-      6    ExternalFlashFirmware                int8u[2]
-      8    ExternalFlashFlags                   int8u
-    9.1    FlashCommanderMode                   int8u & 0x80
-    9.2    FlashControlMode                     int8u & 0x7f
-     10    FlashOutput                          int8u
-           FlashCompensation                    int8s
-     12    FlashFocalLength                     int8u
-     13    RepeatingFlashRate                   int8u
-     14    RepeatingFlashCount                  int8u
-     15    FlashGNDistance                      int8u
-     16    FlashColorFilter                     int8u
-   17.1    FlashGroupAControlMode               int8u & 0x0f
-   18.1    FlashGroupBControlMode               int8u & 0xf0
-   18.2    FlashGroupCControlMode               int8u & 0x0f
-     19    FlashGroupAOutput                    int8u
-           FlashGroupACompensation              int8s
-     20    FlashGroupBOutput                    int8u
-           FlashGroupBCompensation              int8s
-     21    FlashGroupCOutput                    int8u
-           FlashGroupCCompensation              int8s
-     27    ExternalFlashCompensation            int8s
-     29    FlashExposureComp3                   int8s
-     39    FlashExposureComp4                   int8s
-
-=head3 Nikon FlashInfoUnknown Tags
+      0    ISO                                  int32s
+      5    FNumber                              int32s
+      6    ExposureTime                         int32s
+     23    Rotation                             int32s
+    135    CameraTemperature                    int32s
+    145    CameraTemperature                    int32s
 
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-      0    FlashInfoVersion                     N
+=head3 Canon CameraInfoPowerShot2 Tags
 
-=head3 Nikon MultiExposure Tags
+CameraInfo tags for PowerShot models such as the A470, A480, A490, A495,
+A580, A590, A1000, A1100, A2000, A2100, A3000, A3100, D10, E1, G10, G11,
+S90, S95, SD770, SD780, SD790, SD880, SD890, SD940, SD960, SD970, SD980,
+SD990, SD1100, SD1200, SD1300, SD1400, SD3500, SD4000, SD4500, SX1, SX10,
+SX20, SX110, SX120, SX130, SX200 and SX210.
 
   Index4   Tag Name                             Writable
   ------   --------                             --------
-      0    MultiExposureVersion                 N
-      1    MultiExposureMode                    int32u
-      2    MultiExposureShots                   int32u
-      3    MultiExposureAutoGain                int32u
+      1    ISO                                  int32s
+      6    FNumber                              int32s
+      7    ExposureTime                         int32s
+     24    Rotation                             int32s
+    153    CameraTemperature                    int32s
+    159    CameraTemperature                    int32s
+    164    CameraTemperature                    int32s
+    168    CameraTemperature                    int32s
+    261    CameraTemperature                    int32s
 
-=head3 Nikon AFInfo2 Tags
+=head3 Canon CameraInfoUnknown32 Tags
 
-These tags are written by Nikon DSLR's which have the live view feature.
+Unknown CameraInfo tags are divided into 3 tables based on format size.
 
-  Index1   Tag Name                             Writable
+  Index4   Tag Name                             Writable
   ------   --------                             --------
-      0    AFInfo2Version                       N
-      4    ContrastDetectAF                     int8u
-      5    AFAreaMode                           int8u
-      6    PhaseDetectAF                        int8u
-      7    PrimaryAFPoint                       int8u
-      8    AFPointsUsed                         undef[7]
-           AFPointsUsed                         undef[2]
-           AFPointsUsed                         undef[7]
-           AFPointsUsed                         undef[17]
-           AFPointsUsed                         undef[7]
-     16    AFImageWidth                         int16u
-     18    AFImageHeight                        int16u
-     20    AFAreaXPosition                      int16u
-     22    AFAreaYPosition                      int16u
-     24    AFAreaWidth                          int16u
-     26    AFAreaHeight                         int16u
-     28    ContrastDetectAFInFocus              int8u
+     71    CameraTemperature                    int32s
+     83    CameraTemperature                    int32s
+     91    CameraTemperature                    int32s
+     92    CameraTemperature                    int32s
+    100    CameraTemperature                    int32s
+     -3    CameraTemperature                    int32s
 
-=head3 Nikon FileInfo Tags
+=head3 Canon CameraInfoUnknown16 Tags
 
-  Index1   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-      0    FileInfoVersion                      N
-      6    DirectoryNumber                      int16u
-      8    FileNumber                           int16u
+  [no tags known]
 
-=head3 Nikon AFTune Tags
+=head3 Canon CameraInfoUnknown Tags
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    AFFineTune                           int8u
-      1    AFFineTuneIndex                      int8u
-      2    AFFineTuneAdj                        int8s
-
-=head3 Nikon CaptureOffsets Tags
-
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-  0x0001   IFD0_Offset                          N
-  0x0002   PreviewIFD_Offset                    N
-  0x0003   SubIFD_Offset                        N
+  [no tags known]
 
-=head3 Nikon Scan Tags
+=head3 Canon MovieInfo Tags
 
-This information is written by the Nikon Scan software.
+Tags written by some Canon cameras when recording video.
 
-  Tag ID   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-  0x0002   FilmType                             string
-  0x0040   MultiSample                          string
-  0x0041   BitDepth                             int16u
-  0x0050   MasterGain                           rational64s
-  0x0051   ColorGain                            rational64s[3]
-  0x0060   ScanImageEnhancer                    int32u
-  0x0100   DigitalICE                           string
-  0x0110   ROCInfo                              Nikon ROC
-  0x0120   GEMInfo                              Nikon GEM
-  0x0200   DigitalDEEShadowAdj                  int32u
-  0x0201   DigitalDEEThreshold                  int32u
-  0x0202   DigitalDEEHighlightAdj               int32u
-
-=head3 Nikon ROC Tags
+      1    FrameRate                            int16u
+      2    FrameCount                           int16u
+      4    FrameCount                           int32u
+      6    FrameRate                            rational32u
+    106    Duration                             int32u
+    108    AudioBitrate                         int32u
+    110    AudioSampleRate                      int32u
+    112    AudioChannels                        int32u
+    116    VideoCodec                           undef[4]
 
-  Index4   Tag Name                             Writable
-  ------   --------                             --------
-      0    DigitalROC                           int32u
+=head3 Canon AFInfo Tags
 
-=head3 Nikon GEM Tags
+Auto-focus information used by many older Canon models.  The values in this
+record are sequential, and some have variable sizes based on the value of
+NumAFPoints (which may be 1,5,7,9,15,45 or 53).  The AFArea coordinates are
+given in a system where the image has dimensions given by AFImageWidth and
+AFImageHeight, and 0,0 is the image center. The direction of the Y axis
+depends on the camera model, with positive Y upwards for EOS models, but
+apparently downwards for PowerShot models.
 
-  Index4   Tag Name                             Writable
-  ------   --------                             --------
-      0    DigitalGEM                           int32u
+  Sequence Tag Name                             Writable
+  -------- --------                             --------
+      0    NumAFPoints                          N
+      1    ValidAFPoints                        N
+      2    CanonImageWidth                      N
+      3    CanonImageHeight                     N
+      4    AFImageWidth                         N
+      5    AFImageHeight                        N
+      6    AFAreaWidth                          N
+      7    AFAreaHeight                         N
+      8    AFAreaXPositions                     N
+      9    AFAreaYPositions                     N
+     10    AFPointsInFocus                      N
+     11    PrimaryAFPoint                       N
+           Canon_AFInfo_0x000b?                 N
+     12    PrimaryAFPoint                       N
 
-=head3 Nikon CaptureOutput Tags
+=head3 Canon MyColors Tags
 
-  Index4   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-      2    OutputImageWidth                     int32u
-      3    OutputImageHeight                    int32u
-      4    OutputResolution                     int32u
+      2    MyColorMode                          int16u
 
-=head3 Nikon Type2 Tags
+=head3 Canon FaceDetect1 Tags
 
-  Tag ID   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-  0x0003   Quality                              Y
-  0x0004   ColorMode                            Y
-  0x0005   ImageAdjustment                      Y
-  0x0006   CCDSensitivity                       Y
-  0x0007   WhiteBalance                         Y
-  0x0008   Focus                                Y
-  0x000a   DigitalZoom                          Y
-  0x000b   Converter                            Y
-
-=head3 Nikon NCDT Tags
+      2    FacesDetected                        int16u
+      3    FaceDetectFrameSize                  int16u[2]
+      8    Face1Position                        int16s[2]
+     10    Face2Position                        int16s[2]
+     12    Face3Position                        int16s[2]
+     14    Face4Position                        int16s[2]
+     16    Face5Position                        int16s[2]
+     18    Face6Position                        int16s[2]
+     20    Face7Position                        int16s[2]
+     22    Face8Position                        int16s[2]
+     24    Face9Position                        int16s[2]
 
-Nikon-specific QuickTime tags found in the NCDT atom of MOV videos from some
-Nikon cameras such as the Coolpix S8000.
+=head3 Canon FaceDetect2 Tags
 
-  Tag ID   Tag Name                             Writable
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-  'NCHD'   MakerNoteVersion                     N
-  'NCTG'   NikonTags                            Nikon NCTG
-  'NCTH'   ThumbnailImage                       N
-  'NCVW'   PreviewImage                         N
-
-=head3 Nikon NCTG Tags
+      1    FaceWidth                            int8u
+      2    FacesDetected                        int8u
 
-These tags are found in proprietary-format records of the NCTG atom in MOV
-videos from some Nikon cameras.
+=head3 Canon AFInfo2 Tags
 
-  Tag ID       Tag Name                         Writable
-  ------       --------                         --------
-  0x0001       Make                             N
-  0x0002       Model                            N
-  0x0003       Software                         N
-  0x0011       CreateDate                       N
-  0x0012       DateTimeOriginal                 N
-  0x0013       FrameCount                       N
-  0x0016       FrameRate                        N
-  0x0022       FrameWidth                       N
-  0x0023       FrameHeight                      N
-  0x0032       AudioChannels                    N
-  0x0033       AudioBitsPerSample               N
-  0x0034       AudioSampleRate                  N
-  0x1108822    ExposureProgram                  N
-  0x1109204    ExposureCompensation             N
-  0x1109207    MeteringMode                     N
-  0x110a434    LensModel                        N
-  0x1200000    GPSVersionID                     N
-  0x1200001    GPSLatitudeRef                   N
-  0x1200002    GPSLatitude                      N
-  0x1200003    GPSLongitudeRef                  N
-  0x1200004    GPSLongitude                     N
-  0x1200005    GPSAltitudeRef                   N
-  0x1200006    GPSAltitude                      N
-  0x1200007    GPSTimeStamp                     N
-  0x1200008    GPSSatellites                    N
-  0x1200010    GPSImgDirectionRef               N
-  0x1200011    GPSImgDirection                  N
-  0x1200012    GPSMapDatum                      N
-  0x120001d    GPSDateStamp                     N
-  0x2000001    MakerNoteVersion                 N
-  0x2000005    WhiteBalance                     N
-  0x200000b    WhiteBalanceFineTune             N
-  0x200001e    ColorSpace                       N
-  0x2000023    PictureControlData               Nikon PictureControl
-  0x2000024    WorldTime                        Nikon WorldTime
-  0x200002c    UnknownInfo                      Nikon UnknownInfo
-  0x2000032    UnknownInfo2                     Nikon UnknownInfo
-  0x2000039    LocationInfo                     Nikon LocationInfo
-  0x2000083    LensType                         N
-  0x2000084    Lens                             N
-  0x20000ab    VariProgram                      string
+Newer version of the AFInfo record containing much of the same information
+(and coordinate confusion) as the older version.  In this record, NumAFPoints
+may be 7, 9, 11, 19, 31, 45 or 61, depending on the camera model.
 
-=head3 Nikon MOV Tags
+  Sequence Tag Name                             Writable
+  -------- --------                             --------
+      0    AFInfoSize?                          N
+      1    AFAreaMode                           N
+      2    NumAFPoints                          N
+      3    ValidAFPoints                        N
+      4    CanonImageWidth                      N
+      5    CanonImageHeight                     N
+      6    AFImageWidth                         N
+      7    AFImageHeight                        N
+      8    AFAreaWidths                         N
+      9    AFAreaHeights                        N
+     10    AFAreaXPositions                     N
+     11    AFAreaYPositions                     N
+     12    AFPointsInFocus                      N
+     13    AFPointsSelected                     N
+           Canon_AFInfo2_0x000d?                N
+     14    PrimaryAFPoint                       N
 
-This information is found in MOV and QT videos from some Nikon cameras.
+=head3 Canon ContrastInfo Tags
 
-  Index1   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-      0    Make                                 N
-     24    Model                                N
-     38    ExposureTime                         N
-     42    FNumber                              N
-     50    ExposureCompensation                 N
-     68    WhiteBalance                         N
-     72    FocalLength                          N
-    175    Software                             N
-    223    ISO                                  N
-
-=head3 Nikon AVI Tags
+      4    IntelligentContrast                  int16u
 
-Nikon-specific RIFF tags found in AVI videos.
+=head3 Canon FaceDetect3 Tags
 
-  Tag ID   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-  'nctg'   NikonTags                            Nikon AVITags
-  'ncth'   ThumbnailImage                       N
-  'ncvr'   NikonVers                            Nikon AVIVers
-  'ncvw'   PreviewImage                         N
-
-=head3 Nikon AVITags Tags
+      3    FacesDetected                        int16u
 
-These tags and the AVIVer tags below are found in proprietary-format records
-of Nikon AVI videos.
+=head3 Canon TimeInfo Tags
 
-  Tag ID   Tag Name                             Writable
+  Index4   Tag Name                             Writable
   ------   --------                             --------
-  0x0003   Make                                 N
-  0x0004   Model                                N
-  0x0005   Software                             N
-  0x0006   Equipment                            N
-  0x0007   Orientation                          N
-  0x0008   ExposureTime                         N
-  0x0009   FNumber                              N
-  0x000a   ExposureCompensation                 N
-  0x000b   MaxApertureValue                     N
-  0x000c   MeteringMode                         N
-  0x000f   FocalLength                          N
-  0x0010   XResolution                          N
-  0x0011   YResolution                          N
-  0x0012   ResolutionUnit                       N
-  0x0013   DateTimeOriginal                     N
-  0x0014   CreateDate                           N
-  0x0016   Duration                             N
-  0x0018   FocusMode                            N
-  0x001b   DigitalZoom                          N
-  0x001d   ColorMode                            N
-  0x001e   Sharpness                            N
-  0x001f   WhiteBalance                         N
-  0x0020   NoiseReduction                       N
+      1    TimeZone                             int32s
+      2    TimeZoneCity                         int32s
+      3    DaylightSavings                      int32s
 
-=head3 Nikon AVIVers Tags
+=head3 Canon FileInfo Tags
 
-  Tag ID   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-  0x0001   MakerNoteType                        N
-  0x0002   MakerNoteVersion                     N
+      1    FileNumber                           int32u
+           ShutterCount                         int32u
+      3    BracketMode                          int16s
+      4    BracketValue                         int16s
+      5    BracketShotNumber                    int16s
+      6    RawJpgQuality                        int16s
+      7    RawJpgSize                           int16s
+      8    LongExposureNoiseReduction2          int16s
+      9    WBBracketMode                        int16s
+     12    WBBracketValueAB                     int16s
+     13    WBBracketValueGM                     int16s
+     14    FilterEffect                         int16s
+     15    ToningEffect                         int16s
+     16    MacroMagnification                   int16s
+     19    LiveViewShooting                     int16s
+     25    FlashExposureLock                    int16s
 
-=head2 NikonCustom Tags
+=head3 Canon SerialInfo Tags
 
-=head3 NikonCustom SettingsD40 Tags
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      9    InternalSerialNumber                 string
 
-Custom settings for the Nikon D40.
+=head3 Canon CropInfo Tags
 
-  Index1   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-    0.1    Beep                                 int8u & 0x80
-    0.2    AFAssist                             int8u & 0x40
-    0.3    NoMemoryCard                         int8u & 0x20
-    0.4    ImageReview                          int8u & 0x10
-    1.1    AutoISO                              int8u & 0x80
-    1.2    AutoISOMax                           int8u & 0x30
-    1.3    AutoISOMinShutterSpeed               int8u & 0x07
-    2.1    ImageReviewTime                      int8u & 0x07
-    3.1    MonitorOffTime                       int8u & 0xe0
-    3.2    MeteringTime                         int8u & 0x1c
-    3.3    SelfTimerTime                        int8u & 0x03
-    3.4    RemoteOnDuration                     int8u & 0xc0
-    4.1    AELockButton                         int8u & 0x0e
-    4.2    AELock                               int8u & 0x01
-    5.1    ShootingModeSetting                  int8u & 0x70
-    5.2    TimerFunctionButton                  int8u & 0x07
-    6.1    Metering                             int8u & 0x03
-    8.1    InternalFlash                        int8u & 0x10
-    8.2    ManualFlashOutput                    int8u & 0x07
-      9    FlashLevel                           int8s
-   10.1    FocusModeSetting                     int8u & 0xc0
-   11.1    AFAreaModeSetting                    int8u & 0x30
-
-=head3 NikonCustom SettingsD80 Tags
+      0    CropLeftMargin                       int16u
+      1    CropRightMargin                      int16u
+      2    CropTopMargin                        int16u
+      3    CropBottomMargin                     int16u
 
-Custom settings for the Nikon D80.
+=head3 Canon AspectInfo Tags
 
-  Index1   Tag Name                             Writable
+  Index4   Tag Name                             Writable
   ------   --------                             --------
-    0.1    Beep                                 int8u & 0x80
-    0.2    AFAssist                             int8u & 0x40
-    0.3    NoMemoryCard                         int8u & 0x20
-    0.4    ImageReview                          int8u & 0x10
-    0.5    Illumination                         int8u & 0x08
-    0.6    MainDialExposureComp                 int8u & 0x04
-    0.7    EVStepSize                           int8u & 0x01
-    1.1    AutoISO                              int8u & 0x40
-    1.2    AutoISOMax                           int8u & 0x30
-    1.3    AutoISOMinShutterSpeed               int8u & 0x0f
-    2.1    AutoBracketSet                       int8u & 0xc0
-    2.2    AutoBracketOrder                     int8u & 0x20
-    3.1    MonitorOffTime                       int8u & 0xe0
-    3.2    MeteringTime                         int8u & 0x1c
-    3.3    SelfTimerTime                        int8u & 0x03
-    4.1    AELockButton                         int8u & 0x1e
-    4.2    AELock                               int8u & 0x01
-    4.3    RemoteOnDuration                     int8u & 0xc0
-    5.1    CommandDials                         int8u & 0x80
-    5.2    FunctionButton                       int8u & 0x78
-    6.1    GridDisplay                          int8u & 0x80
-    6.2    ViewfinderWarning                    int8u & 0x40
-    6.3    CenterWeightedAreaSize               int8u & 0x0c
-    6.4    ExposureDelayMode                    int8u & 0x20
-    6.5    MB-D80Batteries                      int8u & 0x03
-    7.1    FlashWarning                         int8u & 0x80
-    7.2    FlashShutterSpeed                    int8u & 0x78
-    7.3    AutoFP                               int8u & 0x04
-    7.4    ModelingFlash                        int8u & 0x02
-    8.1    InternalFlash                        int8u & 0xc0
-    8.2    ManualFlashOutput                    int8u & 0x07
-    9.1    RepeatingFlashOutput                 int8u & 0x70
-    9.2    RepeatingFlashCount                  int8u & 0x0f
-   10.1    RepeatingFlashRate                   int8u & 0xf0
-   10.2    CommanderChannel                     int8u & 0x03
-   11.1    CommanderInternalFlash               int8u & 0xc0
-   11.2    CommanderGroupAMode                  int8u & 0x30
-   11.3    CommanderGroupBMode                  int8u & 0x0c
-   12.1    CommanderInternalTTLComp             int8u & 0x1f
-   12.2    CommanderInternalManualOutput        int8u & 0xe0
-   13.1    CommanderGroupA_TTL-AAComp           int8u & 0x1f
-   13.2    CommanderGroupAManualOutput          int8u & 0xe0
-   14.1    CommanderGroupB_TTL-AAComp           int8u & 0x1f
-   14.2    CommanderGroupBManualOutput          int8u & 0xe0
-   15.1    CenterAFArea                         int8u & 0x80
-   15.2    FocusAreaSelection                   int8u & 0x04
-   15.3    AFAreaIllumination                   int8u & 0x03
-   16.1    AFAreaModeSetting                    int8u & 0xc0
-
-=head3 NikonCustom SettingsD90 Tags
+      0    AspectRatio                          int32u
+      1    CroppedImageWidth                    int32u
+      2    CroppedImageHeight                   int32u
+      3    CroppedImageLeft                     int32u
+      4    CroppedImageTop                      int32u
 
-Custom settings for the D90.
+=head3 Canon Processing Tags
 
-  Index1   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-    0.1    LightSwitch                          int8u & 0x08
-    2.1    AFAreaModeSetting                    int8u & 0x60
-    2.2    CenterFocusPoint                     int8u & 0x10
-    2.3    AFAssist                             int8u & 0x01
-    2.4    AFPointIllumination                  int8u & 0x06
-    2.5    FocusPointWrap                       int8u & 0x08
-    3.1    AELockForMB-D80                      int8u & 0x1c
-    3.2    MB-D80BatteryType                    int8u & 0x03
-    4.1    Beep                                 int8u & 0x40
-    4.2    GridDisplay                          int8u & 0x02
-    4.3    ISODisplay                           int8u & 0x0c
-    4.4    ViewfinderWarning                    int8u & 0x01
-    4.5    NoMemoryCard                         int8u & 0x20
-    5.1    ScreenTips                           int8u & 0x04
-    5.2    FileNumberSequence                   int8u & 0x08
-    5.3    ShootingInfoDisplay                  int8u & 0xc0
-    5.4    LCDIllumination                      int8u & 0x20
-    6.1    EasyExposureComp                     int8u & 0x01
-    6.2    ReverseIndicators                    int8u & 0x80
-    7.1    ExposureControlStepSize              int8u & 0x40
-    8.1    CenterWeightedAreaSize               int8u & 0x60
-    8.2    FineTuneOptMatrixMetering            int8u & 0x0f
-    9.1    FineTuneOptCenterWeighted            int8u & 0xf0
-    9.2    FineTuneOptSpotMetering              int8u & 0x0f
-   11.1    CLModeShootingSpeed                  int8u & 0x07
-   11.2    ExposureDelayMode                    int8u & 0x40
-   13.1    AutoBracketSet                       int8u & 0xe0
-   13.2    AutoBracketOrder                     int8u & 0x10
-   14.1    FuncButton                           int8u & 0x78
-   16.1    OKButton                             int8u & 0x18
-   17.1    AELockButton                         int8u & 0x38
-   18.1    CommandDialsReverseRotation          int8u & 0x80
-   18.2    ShutterReleaseButtonAE-L             int8u & 0x02
-   19.1    MeteringTime                         int8u & 0xf0
-   19.2    RemoteOnDuration                     int8u & 0x03
-   20.1    SelfTimerTime                        int8u & 0xc0
-   20.2    SelfTimerShotCount                   int8u & 0x1e
-   21.1    PlaybackMonitorOffTime               int8u & 0x1c
-   21.2    ImageReviewTime                      int8u & 0xe0
-   22.1    MenuMonitorOffTime                   int8u & 0xe0
-   22.2    ShootingInfoMonitorOffTime           int8u & 0x1c
-   23.1    FlashShutterSpeed                    int8u & 0x0f
-   24.1    InternalFlash                        int8u & 0xc0
-   24.2    ManualFlashOutput                    int8u & 0x1f
-   25.1    RepeatingFlashOutput                 int8u & 0x70
-   25.2    RepeatingFlashCount                  int8u & 0x0f
-   26.1    RepeatingFlashRate                   int8u & 0xf0
-   31.1    FlashWarning                         int8u & 0x80
-   31.2    CommanderInternalTTLComp             int8u & 0x1f
-   31.3    ModelingFlash                        int8u & 0x20
-   31.4    AutoFP                               int8u & 0x40
-   32.1    CommanderGroupA_TTLComp              int8u & 0x1f
-   33.1    CommanderGroupB_TTLComp              int8u & 0x1f
-   34.1    LiveViewAF                           int8u & 0xc0
+      1    ToneCurve                            int16s
+      2    Sharpness                            int16s
+      3    SharpnessFrequency                   int16s
+      4    SensorRedLevel                       int16s
+      5    SensorBlueLevel                      int16s
+      6    WhiteBalanceRed                      int16s
+      7    WhiteBalanceBlue                     int16s
+      8    WhiteBalance                         int16s
+      9    ColorTemperature                     int16s
+     10    PictureStyle                         int16s
+     11    DigitalGain                          int16s
+     12    WBShiftAB                            int16s
+     13    WBShiftGM                            int16s
 
-=head3 NikonCustom SettingsD3 Tags
+=head3 Canon ColorBalance Tags
 
-Custom settings for the D3, D3S, D3X, D300 and D300S.
+These tags are used by the 10D and 300D.
 
-  Index1   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-    0.1    CustomSettingsBank                   int8u & 0x03
-    0.2    CustomSettingsAllDefault             int8u & 0x80
-    1.1    AF-CPrioritySelection                int8u & 0xc0
-    1.2    AF-SPrioritySelection                int8u & 0x20
-    1.3    AFPointSelection                     int8u & 0x10
-    1.4    DynamicAFArea                        int8u & 0x0c
-    1.5    FocusTrackingLockOn                  int8u & 0x03
-    2.1    AFActivation                         int8u & 0x80
-    2.2    FocusPointWrap                       int8u & 0x08
-    2.3    AFPointIllumination                  int8u & 0x60
-           AFPointIllumination                  int8u & 0x06
-    2.4    AFPointBrightness                    int8u & 0x06
-    2.5    AFAssist                             int8u & 0x01
-    3.1    AFOnButton                           int8u & 0x07
-    3.2    VerticalAFOnButton                   int8u & 0x70
-    3.3    AF-OnForMB-D10                       int8u & 0x70
-    4.1    FocusTrackingLockOn                  int8u & 0x07
-    4.2    AssignBktButton                      int8u & 0x08
-    4.3    MultiSelectorLiveView                int8u & 0xc0
-    4.4    InitialZoomLiveView                  int8u & 0x30
-    6.1    ISOStepSize                          int8u & 0xc0
-    6.2    ExposureControlStepSize              int8u & 0x30
-    6.3    ExposureCompStepSize                 int8u & 0x0c
-    6.4    EasyExposureCompensation             int8u & 0x03
-    7.1    CenterWeightedAreaSize               int8u & 0xe0
-    7.2    FineTuneOptCenterWeighted            int8u & 0x0f
-    8.1    FineTuneOptMatrixMetering            int8u & 0xf0
-    8.2    FineTuneOptSpotMetering              int8u & 0x0f
-    9.1    MultiSelectorShootMode               int8u & 0xc0
-    9.2    MultiSelectorPlaybackMode            int8u & 0x30
-    9.3    InitialZoomSetting                   int8u & 0x0c
-    9.4    MultiSelector                        int8u & 0x01
-   10.1    ExposureDelayMode                    int8u & 0x40
-   10.2    CLModeShootingSpeed                  int8u & 0x07
-   10.3    CHModeShootingSpeed                  int8u & 0x30
-     11    MaxContinuousRelease                 int8u
-   12.1    ReverseIndicators                    int8u & 0x20
-   12.2    FileNumberSequence                   int8u & 0x02
-           FileNumberSequence                   int8u & 0x08
-   12.3    RearDisplay                          int8u & 0x80
-   12.4    ViewfinderDisplay                    int8u & 0x40
-   12.5    BatteryOrder                         int8u & 0x04
-   12.6    MB-D10Batteries                      int8u & 0x03
-   12.7    ScreenTips                           int8u & 0x10
-   13.1    Beep                                 int8u & 0xc0
-   13.2    ShootingInfoDisplay                  int8u & 0x30
-   13.3    GridDisplay                          int8u & 0x02
-   13.4    ViewfinderWarning                    int8u & 0x01
-   13.5    MultiSelectorPlaybackMode            int8u & 0x03
-   14.1    PreviewButton                        int8u & 0xf8
-           FuncButton                           int8u & 0xf8
-   14.2    PreviewButtonPlusDials               int8u & 0x07
-           FuncButtonPlusDials                  int8u & 0x07
-   15.1    FuncButton                           int8u & 0xf8
-           PreviewButton                        int8u & 0xf8
-   15.2    FuncButtonPlusDials                  int8u & 0x07
-           PreviewButtonPlusDials               int8u & 0x07
-   16.1    AELockButton                         int8u & 0xf8
-   16.2    AELockButtonPlusDials                int8u & 0x07
-   17.1    CommandDialsReverseRotation          int8u & 0x80
-   17.2    CommandDialsChangeMainSub            int8u & 0x40
-   17.3    CommandDialsApertureSetting          int8u & 0x20
-   17.4    CommandDialsMenuAndPlayback          int8u & 0x10
-   17.5    LCDIllumination                      int8u & 0x08
-   17.6    PhotoInfoPlayback                    int8u & 0x04
-   17.7    ShutterReleaseButtonAE-L             int8u & 0x02
-   17.8    ReleaseButtonToUseDial               int8u & 0x01
-   18.1    SelfTimerTime                        int8u & 0x18
-   18.2    MonitorOffTime                       int8u & 0x07
-   20.1    FlashSyncSpeed                       int8u & 0xe0
-           FlashSyncSpeed                       int8u & 0xf0
-   20.2    FlashShutterSpeed                    int8u & 0x0f
-   21.1    AutoBracketSet                       int8u & 0xc0
-   21.2    AutoBracketModeM                     int8u & 0x30
-   21.3    AutoBracketOrder                     int8u & 0x08
-   21.4    ModelingFlash                        int8u & 0x01
-   22.1    NoMemoryCard                         int8u & 0x80
-   22.2    MeteringTime                         int8u & 0x0f
-   23.1    InternalFlash                        int8u & 0xc0
-
-=head3 NikonCustom SettingsD700 Tags
+      0    WB_RGGBLevelsAuto                    int16s[4]
+      4    WB_RGGBLevelsDaylight                int16s[4]
+      8    WB_RGGBLevelsShade                   int16s[4]
+     12    WB_RGGBLevelsCloudy                  int16s[4]
+     16    WB_RGGBLevelsTungsten                int16s[4]
+     20    WB_RGGBLevelsFluorescent             int16s[4]
+     24    WB_RGGBLevelsFlash                   int16s[4]
+     28    WB_RGGBLevelsCustom                  int16s[4]
+     32    WB_RGGBLevelsKelvin                  int16s[4]
 
-Custom settings for the D700.
+=head3 Canon MeasuredColor Tags
 
-  Index1   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-    0.1    CustomSettingsBank                   int8u & 0x03
-    0.2    CustomSettingsAllDefault             int8u & 0x80
-    1.1    AF-CPrioritySelection                int8u & 0xc0
-    1.2    AF-SPrioritySelection                int8u & 0x20
-    1.3    AFPointSelection                     int8u & 0x10
-    1.4    DynamicAFArea                        int8u & 0x0c
-    2.1    AFActivation                         int8u & 0x80
-    2.2    FocusPointWrap                       int8u & 0x08
-    2.3    AFPointIllumination                  int8u & 0x06
-    2.4    AFAssist                             int8u & 0x01
-    3.1    FocusTrackingLockOn                  int8u & 0x07
-    3.2    AF-OnForMB-D10                       int8u & 0x70
-    4.1    ISOStepSize                          int8u & 0xc0
-    4.2    ExposureControlStepSize              int8u & 0x30
-    4.3    ExposureCompStepSize                 int8u & 0x0c
-    4.4    EasyExposureCompensation             int8u & 0x03
-    5.1    CenterWeightedAreaSize               int8u & 0x70
-    6.1    FineTuneOptMatrixMetering            int8u & 0xf0
-    6.2    FineTuneOptSpotMetering              int8u & 0x0f
-    7.1    ShutterReleaseButtonAE-L             int8u & 0x80
-    7.2    SelfTimerTime                        int8u & 0x30
-    7.3    MeteringTime                         int8u & 0x0f
-    8.1    PlaybackMonitorOffTime               int8u & 0x38
-    8.2    MenuMonitorOffTime                   int8u & 0x07
-    9.1    ShootingInfoMonitorOffTime           int8u & 0x38
-    9.2    ImageReviewTime                      int8u & 0x07
-   10.1    Beep                                 int8u & 0xc0
-   10.2    ShootingInfoDisplay                  int8u & 0x30
-   10.3    LCDIllumination                      int8u & 0x08
-   10.4    ExposureDelayMode                    int8u & 0x04
-   10.5    GridDisplay                          int8u & 0x02
-   11.1    FileNumberSequence                   int8u & 0x40
-   11.2    CLModeShootingSpeed                  int8u & 0x07
-     12    MaxContinuousRelease                 int8u
-   13.1    ScreenTips                           int8u & 0x08
-   13.2    BatteryOrder                         int8u & 0x04
-   13.3    MB-D10BatteryType                    int8u & 0x03
-   15.1    FlashSyncSpeed                       int8u & 0xf0
-   15.2    FlashShutterSpeed                    int8u & 0x0f
-   16.1    FlashControlBuilt-in                 int8u & 0xc0
-   16.2    ManualFlashOutput                    int8u & 0x1f
-   17.1    RepeatingFlashOutput                 int8u & 0x70
-   17.2    RepeatingFlashCount                  int8u & 0x0f
-   18.1    RepeatingFlashRate                   int8u & 0xf0
-   18.2    CommanderInternalTTLChannel          int8u & 0x03
-   20.1    CommanderInternalTTLCompBuiltin      int8u & 0x1f
-   21.1    CommanderInternalTTLCompGroupA       int8u & 0x1f
-   22.1    CommanderInternalTTLCompGroupB       int8u & 0x1f
-   26.1    AutoBracketSet                       int8u & 0xc0
-   26.2    AutoBracketModeM                     int8u & 0x30
-   26.3    AutoBracketOrder                     int8u & 0x08
-   26.4    ModelingFlash                        int8u & 0x01
-   27.1    MultiSelectorShootMode               int8u & 0xc0
-   27.2    MultiSelectorPlaybackMode            int8u & 0x30
-   27.3    InitialZoomSetting                   int8u & 0x0c
-   27.4    MultiSelector                        int8u & 0x01
-   28.1    FuncButton                           int8u & 0xf8
-   29.1    PreviewButton                        int8u & 0xf8
-   30.1    AELockButton                         int8u & 0xf8
-   31.1    FuncButtonPlusDials                  int8u & 0x70
-   31.2    PreviewButtonPlusDials               int8u & 0x07
-   32.1    AELockButtonPlusDials                int8u & 0x70
-   33.1    CommandDialsReverseRotation          int8u & 0x80
-   33.2    CommandDialsChangeMainSub            int8u & 0x40
-   33.3    CommandDialsApertureSetting          int8u & 0x20
-   33.4    CommandDialsMenuAndPlayback          int8u & 0x10
-   33.5    ReverseIndicators                    int8u & 0x08
-   33.6    PhotoInfoPlayback                    int8u & 0x04
-   33.7    NoMemoryCard                         int8u & 0x02
-   33.8    ReleaseButtonToUseDial               int8u & 0x01
-
-=head3 NikonCustom SettingsD800 Tags
+      1    MeasuredRGGB                         int16u[4]
 
-Custom settings for the D800.
+=head3 Canon Flags Tags
 
-  Index1   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-   12.1    AutoBracketingSet                    int8u & 0xe0
-   12.2    AutoBracketOrder                     int8u & 0x10
-   12.3    AutoBracketingMode                   int8u & 0x0c
-   22.1    FlashSyncSpeed                       int8u & 0xf0
-   22.2    FlashShutterSpeed                    int8u & 0x0f
-   23.1    FlashControlBuilt-in                 int8u & 0xc0
-   23.2    ManualFlashOutput                    int8u & 0x1f
-   24.1    RepeatingFlashOutput                 int8u & 0x70
-   24.2    RepeatingFlashCount                  int8u & 0x0f
-   25.1    RepeatingFlashRate                   int8u & 0xf0
-   25.2    CommanderChannel                     int8u & 0x03
-   27.1    CommanderInternalFlash               int8u & 0xc0
-   27.2    CommanderInternalManualOutput        int8u & 0x1f
-   28.1    CommanderGroupAMode                  int8u & 0xc0
-   28.2    CommanderGroupAManualOutput          int8u & 0x1f
-   29.1    CommanderGroupBMode                  int8u & 0xc0
-   29.2    CommanderGroupBManualOutput          int8u & 0x1f
-   30.1    ModelingFlash                        int8u & 0x20
-   30.2    CommanderInternalTTLComp             int8u & 0x1f
-   31.1    CommanderGroupA_TTL-AAComp           int8u & 0x1f
-   32.1    CommanderGroupB_TTL-AAComp           int8u & 0x1f
-
-=head3 NikonCustom SettingsD5000 Tags
+      1    ModifiedParamFlag                    int16s
 
-Custom settings for the D5000.
+=head3 Canon ModifiedInfo Tags
 
-  Index1   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-    0.1    AFAreaModeSetting                    int8u & 0x60
-    0.2    AFAssist                             int8u & 0x01
-    2.1    Beep                                 int8u & 0xc0
-    2.2    GridDisplay                          int8u & 0x02
-    2.3    ISODisplay                           int8u & 0x08
-    2.4    NoMemoryCard                         int8u & 0x20
-    3.1    FileNumberSequence                   int8u & 0x08
-    4.1    RangeFinder                          int8u & 0x10
-    4.2    DateImprint                          int8u & 0x08
-    4.3    ReverseIndicators                    int8u & 0x80
-    5.1    EVStepSize                           int8u & 0x40
-    9.1    ExposureDelayMode                    int8u & 0x40
-   11.1    AutoBracketSet                       int8u & 0xc0
-   12.1    TimerFunctionButton                  int8u & 0x38
-   15.1    AELockButton                         int8u & 0x38
-   16.1    ShutterReleaseButtonAE-L             int8u & 0x02
-   16.2    CommandDialsReverseRotation          int8u & 0x80
-   17.1    MeteringTime                         int8u & 0x70
-   17.2    RemoteOnDuration                     int8u & 0x03
-   18.1    SelfTimerTime                        int8u & 0xc0
-   18.2    SelfTimerShotCount                   int8u & 0x1e
-   19.1    ImageReviewTime                      int8u & 0xe0
-   20.1    PlaybackMenusTime                    int8u & 0xe0
-   22.1    InternalFlash                        int8u & 0xc0
-   22.2    ManualFlashOutput                    int8u & 0x1f
-   32.1    LiveViewAF                           int8u & 0x60
+      1    ModifiedToneCurve                    int16s
+      2    ModifiedSharpness                    int16s
+      3    ModifiedSharpnessFreq                int16s
+      4    ModifiedSensorRedLevel               int16s
+      5    ModifiedSensorBlueLevel              int16s
+      6    ModifiedWhiteBalanceRed              int16s
+      7    ModifiedWhiteBalanceBlue             int16s
+      8    ModifiedWhiteBalance                 int16s
+      9    ModifiedColorTemp                    int16s
+     10    ModifiedPictureStyle                 int16s
+     11    ModifiedDigitalGain                  int16s
 
-=head3 NikonCustom SettingsD5100 Tags
+=head3 Canon PreviewImageInfo Tags
 
-Custom settings for the D5100.
+  Index4   Tag Name                             Writable
+  ------   --------                             --------
+      1    PreviewQuality                       int32u
+      2    PreviewImageLength                   int32u*
+      3    PreviewImageWidth                    int32u
+      4    PreviewImageHeight                   int32u
+      5    PreviewImageStart                    int32u*
 
-  Index1   Tag Name                             Writable
+=head3 Canon SensorInfo Tags
+
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-    0.1    AF-CPrioritySelection                int8u & 0x80
-    1.1    AFAssist                             int8u & 0x01
-    3.1    Beep                                 int8u & 0xc0
-    3.2    NoMemoryCard                         int8u & 0x20
-    3.3    ISODisplay                           int8u & 0x08
-    4.1    FileNumberSequence                   int8u & 0x08
-    5.1    RangeFinder                          int8u & 0x10
-    5.2    ReverseIndicators                    int8u & 0x80
-    6.1    EVStepSize                           int8u & 0x40
-   10.1    ExposureDelayMode                    int8u & 0x40
-   12.1    AutoBracketSet                       int8u & 0xc0
-   13.1    TimerFunctionButton                  int8u & 0x38
-   16.1    AELockButton                         int8u & 0x38
-   17.1    ShutterReleaseButtonAE-L             int8u & 0x02
-   17.2    CommandDialsReverseRotation          int8u & 0x80
-   18.1    MeteringTime                         int8u & 0x70
-   18.2    RemoteOnDuration                     int8u & 0x03
-   19.1    SelfTimerTime                        int8u & 0xc0
-   19.2    SelfTimerShotCount                   int8u & 0x0f
-   20.1    ImageReviewTime                      int8u & 0xe0
-   20.2    LiveViewMonitorOffTime               int8u & 0x1c
-   21.1    PlaybackMenusTime                    int8u & 0xe0
-   23.1    ManualFlashOutput                    int8u & 0x1f
+      1    SensorWidth                          N
+      2    SensorHeight                         N
+      5    SensorLeftBorder                     N
+      6    SensorTopBorder                      N
+      7    SensorRightBorder                    N
+      8    SensorBottomBorder                   N
+      9    BlackMaskLeftBorder                  N
+     10    BlackMaskTopBorder                   N
+     11    BlackMaskRightBorder                 N
+     12    BlackMaskBottomBorder                N
 
-=head3 NikonCustom SettingsD5200 Tags
+=head3 Canon ColorData1 Tags
 
-Custom settings for the D5200.
+These tags are used by the 20D and 350D.
 
-  Index1   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-    0.1    AF-CPrioritySelection                int8u & 0x80
-    0.2    NumberOfFocusPoints                  int8u & 0x10
-    1.1    AFAssist                             int8u & 0x01
-    3.1    Beep                                 int8u & 0xc0
-    3.2    NoMemoryCard                         int8u & 0x20
-    3.3    ISODisplay                           int8u & 0x08
-    4.1    FileNumberSequence                   int8u & 0x08
-    5.1    RangeFinder                          int8u & 0x04
-    5.2    ReverseExposureCompDial              int8u & 0x10
-    5.3    ReverseShutterSpeedAperture          int8u & 0x08
-    5.4    ReverseIndicators                    int8u & 0x80
-    6.1    EVStepSize                           int8u & 0x40
-   10.1    ExposureDelayMode                    int8u & 0x40
-   12.1    AutoBracketSet                       int8u & 0xc0
-   13.1    FunctionButton                       int8u & 0x1f
-   16.1    AELockButton                         int8u & 0x0f
-   17.1    ShutterReleaseButtonAE-L             int8u & 0x02
-   18.1    StandbyTimer                         int8u & 0xe0
-   18.2    RemoteOnDuration                     int8u & 0x03
-   19.1    SelfTimerTime                        int8u & 0xc0
-   19.2    SelfTimerShotCount                   int8u & 0x0f
-   20.1    ImageReviewTime                      int8u & 0xe0
-   20.2    LiveViewMonitorOffTime               int8u & 0x1c
-   21.1    PlaybackMenusTime                    int8u & 0xe0
-   23.1    InternalFlash                        int8u & 0xc0
-   23.2    ManualFlashOutput                    int8u & 0x1f
+     25    WB_RGGBLevelsAsShot                  int16s[4]
+     29    ColorTempAsShot                      int16s
+     30    WB_RGGBLevelsAuto                    int16s[4]
+     34    ColorTempAuto                        int16s
+     35    WB_RGGBLevelsDaylight                int16s[4]
+     39    ColorTempDaylight                    int16s
+     40    WB_RGGBLevelsShade                   int16s[4]
+     44    ColorTempShade                       int16s
+     45    WB_RGGBLevelsCloudy                  int16s[4]
+     49    ColorTempCloudy                      int16s
+     50    WB_RGGBLevelsTungsten                int16s[4]
+     54    ColorTempTungsten                    int16s
+     55    WB_RGGBLevelsFluorescent             int16s[4]
+     59    ColorTempFluorescent                 int16s
+     60    WB_RGGBLevelsFlash                   int16s[4]
+     64    ColorTempFlash                       int16s
+     65    WB_RGGBLevelsCustom1                 int16s[4]
+     69    ColorTempCustom1                     int16s
+     70    WB_RGGBLevelsCustom2                 int16s[4]
+     74    ColorTempCustom2                     int16s
+     75    ColorCalib?                          Canon ColorCalib
 
-=head3 NikonCustom SettingsD7000 Tags
+=head3 Canon ColorCalib Tags
 
-Custom settings for the D7000.
+Camera color calibration data.  For the 20D, 350D, 1DmkII and 1DSmkII the
+order of the cooefficients is A, B, C, Temperature, but for newer models it
+is B, C, A, Temperature.  These tags are extracted only when the Unknown
+option is used.
 
-  Index1   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-    0.1    AF-CPrioritySelection                int8u & 0x80
-    0.2    AF-SPrioritySelection                int8u & 0x20
-    0.3    NumberOfFocusPoints                  int8u & 0x10
-    0.4    FocusTrackingLockOn                  int8u & 0x07
-    1.2    FocusPointWrap                       int8u & 0x08
-    1.3    AFPointIllumination                  int8u & 0x06
-    1.4    AFAssist                             int8u & 0x01
-    2.1    BatteryOrder                         int8u & 0x40
-    2.2    AF-OnForMB-D11                       int8u & 0x1c
-    2.3    MB-D11BatteryType                    int8u & 0x03
-    3.1    BeepPitch                            int8u & 0xc0
-    3.2    NoMemoryCard                         int8u & 0x20
-    3.3    ISODisplay                           int8u & 0x0c
-    3.4    GridDisplay                          int8u & 0x02
-    3.5    ViewfinderWarning                    int8u & 0x01
-    4.1    ShootingInfoDisplay                  int8u & 0xc0
-    4.2    LCDIllumination                      int8u & 0x20
-    4.3    FileNumberSequence                   int8u & 0x08
-    4.4    ScreenTips                           int8u & 0x04
-    4.5    BeepVolume                           int8u & 0x03
-    5.1    ReverseIndicators                    int8u & 0x80
-    5.2    EasyExposureCompensation             int8u & 0x03
-    6.1    ExposureControlStep                  int8u & 0x40
-    6.2    ISOSensitivityStep                   int8u & 0x10
-    7.1    CenterWeightedAreaSize               int8u & 0xe0
-   10.1    ExposureDelayMode                    int8u & 0x40
-   10.2    CLModeShootingSpeed                  int8u & 0x07
-     11    MaxContinuousRelease                 int8u
-   12.1    AutoBracketSet                       int8u & 0xe0
-   12.2    AutoBracketOrder                     int8u & 0x10
-   13.1    FuncButton                           int8u & 0xf8
-   14.1    PreviewButton                        int8u & 0xf8
-   15.1    OKButton                             int8u & 0x18
-   16.1    AELockButton                         int8u & 0x38
-   17.1    CommandDialsReverseRotation          int8u & 0x80
-   17.2    CommandDialsChangeMainSub            int8u & 0x60
-   17.3    CommandDialsApertureSetting          int8u & 0x04
-   17.4    CommandDialsMenuAndPlayback          int8u & 0x18
-   17.5    ShutterReleaseButtonAE-L             int8u & 0x02
-   17.6    ReleaseButtonToUseDial               int8u & 0x01
-   18.1    MeteringTime                         int8u & 0xf0
-   18.2    RemoteOnDuration                     int8u & 0x03
-   19.1    SelfTimerTime                        int8u & 0xc0
-   19.2    SelfTimerInterval                    int8u & 0x30
-   19.3    SelfTimerShotCount                   int8u & 0x0f
-   20.1    ImageReviewTime                      int8u & 0xe0
-   20.2    LiveViewMonitorOffTime               int8u & 0x1c
-   21.1    MenuMonitorOffTime                   int8u & 0xe0
-   21.2    ShootingInfoMonitorOffTime           int8u & 0x1c
-   22.1    FlashSyncSpeed                       int8u & 0xf0
-   22.2    FlashShutterSpeed                    int8u & 0x0f
-   23.1    FlashControlBuilt-in                 int8u & 0xc0
-   23.2    ManualFlashOutput                    int8u & 0x1f
-   24.1    RepeatingFlashOutput                 int8u & 0x70
-   24.2    RepeatingFlashCount                  int8u & 0x0f
-   25.1    RepeatingFlashRate                   int8u & 0xf0
-   26.1    CommanderInternalTTLCompBuiltin      int8u & 0x1f
-   27.1    CommanderInternalTTLCompGroupA       int8u & 0x1f
-   28.1    CommanderInternalTTLCompGroupB       int8u & 0x1f
-   30.1    FlashWarning                         int8u & 0x80
-   30.2    ModelingFlash                        int8u & 0x20
-   34.1    LiveViewAFAreaMode                   int8u & 0x60
-   34.2    LiveViewAFMode                       int8u & 0x02
-   35.1    PlaybackMonitorOffTime               int8u & 0xe0
+      0    CameraColorCalibration01?            int16s[4]
+      4    CameraColorCalibration02?            int16s[4]
+      8    CameraColorCalibration03?            int16s[4]
+     12    CameraColorCalibration04?            int16s[4]
+     16    CameraColorCalibration05?            int16s[4]
+     20    CameraColorCalibration06?            int16s[4]
+     24    CameraColorCalibration07?            int16s[4]
+     28    CameraColorCalibration08?            int16s[4]
+     32    CameraColorCalibration09?            int16s[4]
+     36    CameraColorCalibration10?            int16s[4]
+     40    CameraColorCalibration11?            int16s[4]
+     44    CameraColorCalibration12?            int16s[4]
+     48    CameraColorCalibration13?            int16s[4]
+     52    CameraColorCalibration14?            int16s[4]
+     56    CameraColorCalibration15?            int16s[4]
 
-=head2 NikonCapture Tags
+=head3 Canon ColorData2 Tags
 
-This information is written by the Nikon Capture software in tag 0x0e01 of
-the maker notes of NEF images.
+These tags are used by the 1DmkII and 1DSmkII.
 
-  Tag ID       Tag Name                         Writable
-  ------       --------                         --------
-  0x8ae85e     LCHEditor                        int8u
-  0x83a1a25    HistogramXML                     undef
-  0xc89224b    ColorAberrationControl           int8u
-  0x116fea21   HighlightData                    NikonCapture HighlightData
-  0x2175eb78   D-LightingHQ                     int8u
-  0x2fc08431   StraightenAngle                  double
-  0x374233e0   CropData                         NikonCapture CropData
-  0x39c456ac   PictureCtrl                      NikonCapture PictureCtrl
-  0x3cfc73c6   RedEyeData                       NikonCapture RedEyeData
-  0x3d136244   EditVersionName                  string
-  0x56a54260   Exposure                         NikonCapture Exposure
-  0x5f0e7d23   ColorBooster                     int8u
-  0x6a6e36b6   D-LightingHQSelected             int8u
-  0x753dcbc0   NoiseReduction                   int8u
-  0x76a43200   UnsharpMask                      int8u
-  0x76a43201   Curves                           int8u
-  0x76a43202   ColorBalanceAdj                  int8u
-  0x76a43203   AdvancedRaw                      int8u
-  0x76a43204   WhiteBalanceAdj                  int8u
-  0x76a43205   VignetteControl                  int8u
-  0x76a43206   FlipHorizontal                   int8u
-  0x76a43207   Rotation                         int16u
-  0x84589434   BrightnessData                   NikonCapture Brightness
-  0x890ff591   D-LightingHQData                 NikonCapture DLightingHQ
-  0x926f13e0   NoiseReductionData               NikonCapture NoiseReduction
-  0x9ef5f6e0   IPTCData                         IPTC
-  0xab5eca5e   PhotoEffects                     int8u
-  0xac6bd5c0   VignetteControlIntensity         int16s
-  0xb0384e1e   PhotoEffectsData                 NikonCapture PhotoEffects
-  0xb999a36f   ColorBoostData                   NikonCapture ColorBoost
-  0xbf3c6c20   WBAdjData                        NikonCapture WBAdjData
-  0xce5554aa   D-LightingHS                     int8u
-  0xe2173c47   PictureControl                   int8u
-  0xe37b4337   D-LightingHSData                 NikonCapture DLightingHS
-  0xe42b5161   UnsharpData                      NikonCapture UnsharpData
-  0xe9651831   PhotoEffectHistoryXML            undef
-  0xfe28a44f   AutoRedEye                       int8u
-  0xfe443a45   ImageDustOff                     int8u
+  Index2   Tag Name                             Writable
+  ------   --------                             --------
+     24    WB_RGGBLevelsAuto                    int16s[4]
+     28    ColorTempAuto                        int16s
+     29    WB_RGGBLevelsUnknown?                int16s[4]
+     33    ColorTempUnknown?                    int16s
+     34    WB_RGGBLevelsAsShot                  int16s[4]
+     38    ColorTempAsShot                      int16s
+     39    WB_RGGBLevelsDaylight                int16s[4]
+     43    ColorTempDaylight                    int16s
+     44    WB_RGGBLevelsShade                   int16s[4]
+     48    ColorTempShade                       int16s
+     49    WB_RGGBLevelsCloudy                  int16s[4]
+     53    ColorTempCloudy                      int16s
+     54    WB_RGGBLevelsTungsten                int16s[4]
+     58    ColorTempTungsten                    int16s
+     59    WB_RGGBLevelsFluorescent             int16s[4]
+     63    ColorTempFluorescent                 int16s
+     64    WB_RGGBLevelsKelvin                  int16s[4]
+     68    ColorTempKelvin                      int16s
+     69    WB_RGGBLevelsFlash                   int16s[4]
+     73    ColorTempFlash                       int16s
+     74    WB_RGGBLevelsUnknown2?               int16s[4]
+     78    ColorTempUnknown2?                   int16s
+     79    WB_RGGBLevelsUnknown3?               int16s[4]
+     83    ColorTempUnknown3?                   int16s
+     84    WB_RGGBLevelsUnknown4?               int16s[4]
+     88    ColorTempUnknown4?                   int16s
+     89    WB_RGGBLevelsUnknown5?               int16s[4]
+     93    ColorTempUnknown5?                   int16s
+     94    WB_RGGBLevelsUnknown6?               int16s[4]
+     98    ColorTempUnknown6?                   int16s
+     99    WB_RGGBLevelsUnknown7?               int16s[4]
+    103    ColorTempUnknown7?                   int16s
+    104    WB_RGGBLevelsUnknown8?               int16s[4]
+    108    ColorTempUnknown8?                   int16s
+    109    WB_RGGBLevelsUnknown9?               int16s[4]
+    113    ColorTempUnknown9?                   int16s
+    114    WB_RGGBLevelsUnknown10?              int16s[4]
+    118    ColorTempUnknown10?                  int16s
+    119    WB_RGGBLevelsUnknown11?              int16s[4]
+    123    ColorTempUnknown11?                  int16s
+    124    WB_RGGBLevelsUnknown12?              int16s[4]
+    128    ColorTempUnknown12?                  int16s
+    129    WB_RGGBLevelsUnknown13?              int16s[4]
+    133    ColorTempUnknown13?                  int16s
+    134    WB_RGGBLevelsUnknown14?              int16s[4]
+    138    ColorTempUnknown14?                  int16s
+    139    WB_RGGBLevelsUnknown15?              int16s[4]
+    143    ColorTempUnknown15?                  int16s
+    144    WB_RGGBLevelsPC1                     int16s[4]
+    148    ColorTempPC1                         int16s
+    149    WB_RGGBLevelsPC2                     int16s[4]
+    153    ColorTempPC2                         int16s
+    154    WB_RGGBLevelsPC3                     int16s[4]
+    158    ColorTempPC3                         int16s
+    159    WB_RGGBLevelsUnknown16?              int16s[4]
+    163    ColorTempUnknown16?                  int16s
+    164    ColorCalib?                          Canon ColorCalib
+    618    RawMeasuredRGGB                      int32u[4]
 
-=head3 NikonCapture HighlightData Tags
+=head3 Canon ColorData3 Tags
 
-  Index1   Tag Name                             Writable
+These tags are used by the 1DmkIIN, 5D, 30D and 400D.
+
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-      0    ShadowProtection                     int8s
-      1    SaturationAdj                        int8s
-      6    HighlightProtection                  int8s
+      0    ColorDataVersion                     int16s
+     63    WB_RGGBLevelsAsShot                  int16s[4]
+     67    ColorTempAsShot                      int16s
+     68    WB_RGGBLevelsAuto                    int16s[4]
+     72    ColorTempAuto                        int16s
+     73    WB_RGGBLevelsMeasured                int16s[4]
+     77    ColorTempMeasured                    int16s
+     78    WB_RGGBLevelsDaylight                int16s[4]
+     82    ColorTempDaylight                    int16s
+     83    WB_RGGBLevelsShade                   int16s[4]
+     87    ColorTempShade                       int16s
+     88    WB_RGGBLevelsCloudy                  int16s[4]
+     92    ColorTempCloudy                      int16s
+     93    WB_RGGBLevelsTungsten                int16s[4]
+     97    ColorTempTungsten                    int16s
+     98    WB_RGGBLevelsFluorescent             int16s[4]
+    102    ColorTempFluorescent                 int16s
+    103    WB_RGGBLevelsKelvin                  int16s[4]
+    107    ColorTempKelvin                      int16s
+    108    WB_RGGBLevelsFlash                   int16s[4]
+    112    ColorTempFlash                       int16s
+    113    WB_RGGBLevelsPC1                     int16s[4]
+    117    ColorTempPC1                         int16s
+    118    WB_RGGBLevelsPC2                     int16s[4]
+    122    ColorTempPC2                         int16s
+    123    WB_RGGBLevelsPC3                     int16s[4]
+    127    ColorTempPC3                         int16s
+    128    WB_RGGBLevelsCustom                  int16s[4]
+    132    ColorTempCustom                      int16s
+    133    ColorCalib?                          Canon ColorCalib
+    196    PerChannelBlackLevel                 int16u[4]
+    584    FlashOutput                          int16s
+    585    FlashBatteryLevel                    int16s
+    586    ColorTempFlashData                   int16s
+    647    MeasuredRGGBData                     int32u[4]
 
-=head3 NikonCapture CropData Tags
+=head3 Canon ColorData4 Tags
 
-  Index1   Tag Name                             Writable
+These tags are used by the 1DmkIII, 1DSmkIII, 1DmkIV, 5DmkII, 7D, 40D, 50D,
+60D, 450D, 500D, 550D, 1000D and 1100D.
+
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-     30    CropLeft                             double
-     38    CropTop                              double
-     46    CropRight                            double
-     54    CropBottom                           double
-    142    CropOutputWidthInches                double
-    150    CropOutputHeightInches               double
-    158    CropScaledResolution                 double
-    174    CropSourceResolution                 double
-    182    CropOutputResolution                 double
-    190    CropOutputScale                      double
-    198    CropOutputWidth                      double
-    206    CropOutputHeight                     double
-    214    CropOutputPixels                     double
+      0    ColorDataVersion                     int16s
+     63    ColorCoefs                           Canon ColorCoefs
+    168    ColorCalib?                          Canon ColorCalib
+    231    AverageBlackLevel                    int16u[4]
+    640    RawMeasuredRGGB                      int32u[4]
+    692    PerChannelBlackLevel                 int16u[4]
+    696    NormalWhiteLevel                     int16u
+    697    SpecularWhiteLevel                   int16u
+    698    LinearityUpperMargin                 int16u
+    715    PerChannelBlackLevel                 int16u[4]
+    719    NormalWhiteLevel                     int16u
+           PerChannelBlackLevel                 int16u[4]
+    720    SpecularWhiteLevel                   int16u
+    721    LinearityUpperMargin                 int16u
+    723    NormalWhiteLevel                     int16u
+    724    SpecularWhiteLevel                   int16u
+    725    LinearityUpperMargin                 int16u
 
-=head3 NikonCapture PictureCtrl Tags
+=head3 Canon ColorCoefs Tags
 
-  Index1   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-      0    PictureControlActive                 int8u
-     19    PictureControlMode                   string[16]
-     42    QuickAdjust                          int8u
-     43    SharpeningAdj                        int8u
-     44    ContrastAdj                          int8u
-     45    BrightnessAdj                        int8u
-     46    SaturationAdj                        int8u
-     47    HueAdj                               int8u
-
-=head3 NikonCapture RedEyeData Tags
+      0    WB_RGGBLevelsAsShot                  int16s[4]
+      4    ColorTempAsShot                      int16s
+      5    WB_RGGBLevelsAuto                    int16s[4]
+      9    ColorTempAuto                        int16s
+     10    WB_RGGBLevelsMeasured                int16s[4]
+     14    ColorTempMeasured                    int16s
+     15    WB_RGGBLevelsUnknown?                int16s[4]
+     19    ColorTempUnknown?                    int16s
+     20    WB_RGGBLevelsDaylight                int16s[4]
+     24    ColorTempDaylight                    int16s
+     25    WB_RGGBLevelsShade                   int16s[4]
+     29    ColorTempShade                       int16s
+     30    WB_RGGBLevelsCloudy                  int16s[4]
+     34    ColorTempCloudy                      int16s
+     35    WB_RGGBLevelsTungsten                int16s[4]
+     39    ColorTempTungsten                    int16s
+     40    WB_RGGBLevelsFluorescent             int16s[4]
+     44    ColorTempFluorescent                 int16s
+     45    WB_RGGBLevelsKelvin                  int16s[4]
+     49    ColorTempKelvin                      int16s
+     50    WB_RGGBLevelsFlash                   int16s[4]
+     54    ColorTempFlash                       int16s
+     55    WB_RGGBLevelsUnknown2?               int16s[4]
+     59    ColorTempUnknown2?                   int16s
+     60    WB_RGGBLevelsUnknown3?               int16s[4]
+     64    ColorTempUnknown3?                   int16s
+     65    WB_RGGBLevelsUnknown4?               int16s[4]
+     69    ColorTempUnknown4?                   int16s
+     70    WB_RGGBLevelsUnknown5?               int16s[4]
+     74    ColorTempUnknown5?                   int16s
+     75    WB_RGGBLevelsUnknown6?               int16s[4]
+     79    ColorTempUnknown6?                   int16s
+     80    WB_RGGBLevelsUnknown7?               int16s[4]
+     84    ColorTempUnknown7?                   int16s
+     85    WB_RGGBLevelsUnknown8?               int16s[4]
+     89    ColorTempUnknown8?                   int16s
+     90    WB_RGGBLevelsUnknown9?               int16s[4]
+     94    ColorTempUnknown9?                   int16s
+     95    WB_RGGBLevelsUnknown10?              int16s[4]
+     99    ColorTempUnknown10?                  int16s
+    100    WB_RGGBLevelsUnknown11?              int16s[4]
+    104    ColorTempUnknown11?                  int16s
+    105    WB_RGGBLevelsUnknown12?              int16s[4]
+    109    ColorTempUnknown12?                  int16s
+    110    WB_RGGBLevelsUnknown13?              int16s[4]
+    114    ColorTempUnknown13?                  int16s
 
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-      0    RedEyeCorrection                     int8u
+=head3 Canon ColorData5 Tags
 
-=head3 NikonCapture Exposure Tags
+These tags are used by the PowerShot G10.
 
-  Index1   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-      0    ExposureAdj                          int16s
-     18    ExposureAdj2                         double
-     36    ActiveD-Lighting                     int8u
-     37    ActiveD-LightingMode                 int8u
-
-=head3 NikonCapture Brightness Tags
+     71    ColorCoefs                           Canon ColorCoefs
+    186    CameraColorCalibration01?            int16s[5]
+    191    CameraColorCalibration02?            int16s[5]
+    196    CameraColorCalibration03?            int16s[5]
+    201    CameraColorCalibration04?            int16s[5]
+    206    CameraColorCalibration05?            int16s[5]
+    211    CameraColorCalibration06?            int16s[5]
+    216    CameraColorCalibration07?            int16s[5]
+    221    CameraColorCalibration08?            int16s[5]
+    226    CameraColorCalibration09?            int16s[5]
+    231    CameraColorCalibration10?            int16s[5]
+    236    CameraColorCalibration11?            int16s[5]
+    241    CameraColorCalibration12?            int16s[5]
+    246    CameraColorCalibration13?            int16s[5]
+    251    CameraColorCalibration14?            int16s[5]
+    256    CameraColorCalibration15?            int16s[5]
 
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-      0    BrightnessAdj                        double
-      8    EnhanceDarkTones                     int8u
+=head3 Canon ColorData6 Tags
 
-=head3 NikonCapture DLightingHQ Tags
+These tags are used by the EOS 600D and 1200D.
 
-  Index4   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-      0    D-LightingHQShadow                   int32u
-      1    D-LightingHQHighlight                int32u
-      2    D-LightingHQColorBoost               int32u
-
-=head3 NikonCapture NoiseReduction Tags
+      0    ColorDataVersion                     int16s
+     63    WB_RGGBLevelsAsShot                  int16s[4]
+     67    ColorTempAsShot                      int16s
+     68    WB_RGGBLevelsAuto                    int16s[4]
+     72    ColorTempAuto                        int16s
+     73    WB_RGGBLevelsMeasured                int16s[4]
+     77    ColorTempMeasured                    int16s
+     78    WB_RGGBLevelsUnknown?                int16s[4]
+     82    ColorTempUnknown?                    int16s
+     83    WB_RGGBLevelsUnknown2?               int16s[4]
+     87    ColorTempUnknown2?                   int16s
+     88    WB_RGGBLevelsUnknown3?               int16s[4]
+     92    ColorTempUnknown3?                   int16s
+     93    WB_RGGBLevelsUnknown4?               int16s[4]
+     97    ColorTempUnknown4?                   int16s
+     98    WB_RGGBLevelsUnknown5?               int16s[4]
+    102    ColorTempUnknown5?                   int16s
+    103    WB_RGGBLevelsDaylight                int16s[4]
+    107    ColorTempDaylight                    int16s
+    108    WB_RGGBLevelsShade                   int16s[4]
+    112    ColorTempShade                       int16s
+    113    WB_RGGBLevelsCloudy                  int16s[4]
+    117    ColorTempCloudy                      int16s
+    118    WB_RGGBLevelsTungsten                int16s[4]
+    122    ColorTempTungsten                    int16s
+    123    WB_RGGBLevelsFluorescent             int16s[4]
+    127    ColorTempFluorescent                 int16s
+    128    WB_RGGBLevelsKelvin                  int16s[4]
+    132    ColorTempKelvin                      int16s
+    133    WB_RGGBLevelsFlash                   int16s[4]
+    137    ColorTempFlash                       int16s
+    138    WB_RGGBLevelsUnknown6?               int16s[4]
+    142    ColorTempUnknown6?                   int16s
+    143    WB_RGGBLevelsUnknown7?               int16s[4]
+    147    ColorTempUnknown7?                   int16s
+    148    WB_RGGBLevelsUnknown8?               int16s[4]
+    152    ColorTempUnknown8?                   int16s
+    153    WB_RGGBLevelsUnknown9?               int16s[4]
+    157    ColorTempUnknown9?                   int16s
+    158    WB_RGGBLevelsUnknown10?              int16s[4]
+    162    ColorTempUnknown10?                  int16s
+    163    WB_RGGBLevelsUnknown11?              int16s[4]
+    167    ColorTempUnknown11?                  int16s
+    168    WB_RGGBLevelsUnknown12?              int16s[4]
+    172    ColorTempUnknown12?                  int16s
+    173    WB_RGGBLevelsUnknown13?              int16s[4]
+    177    ColorTempUnknown13?                  int16s
+    178    WB_RGGBLevelsUnknown14?              int16s[4]
+    182    ColorTempUnknown14?                  int16s
+    183    WB_RGGBLevelsUnknown15?              int16s[4]
+    187    ColorTempUnknown15?                  int16s
+    188    ColorCalib?                          Canon ColorCalib
+    251    AverageBlackLevel                    int16u[4]
+    404    RawMeasuredRGGB                      int32u[4]
+    479    PerChannelBlackLevel                 int16u[4]
+    483    NormalWhiteLevel                     int16u
+    484    SpecularWhiteLevel                   int16u
+    485    LinearityUpperMargin                 int16u
 
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-      4    EdgeNoiseReduction                   int8u
-      5    ColorMoireReductionMode              int8u
-      9    NoiseReductionIntensity              int32u
-     13    NoiseReductionSharpness              int32u
-     17    NoiseReductionMethod                 int16u
-     21    ColorMoireReduction                  int8u
-     23    NoiseReduction                       int8u
-     24    ColorNoiseReductionIntensity         int32u
-     28    ColorNoiseReductionSharpness         int32u
+=head3 Canon ColorData7 Tags
 
-=head3 NikonCapture PhotoEffects Tags
+These tags are used by the EOS 1DX, 5DmkIII, 6D, 100D, 650D, 700D and M.
 
-  Index1   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-      0    PhotoEffectsType                     int8u
-      4    PhotoEffectsRed                      int16s
-      6    PhotoEffectsGreen                    int16s
-      8    PhotoEffectsBlue                     int16s
+      0    ColorDataVersion                     int16s
+     63    WB_RGGBLevelsAsShot                  int16s[4]
+     67    ColorTempAsShot                      int16s
+     68    WB_RGGBLevelsAuto                    int16s[4]
+     72    ColorTempAuto                        int16s
+     73    WB_RGGBLevelsMeasured                int16s[4]
+     77    ColorTempMeasured                    int16s
+     78    WB_RGGBLevelsUnknown?                int16s[4]
+     82    ColorTempUnknown?                    int16s
+     83    WB_RGGBLevelsUnknown2?               int16s[4]
+     87    ColorTempUnknown2?                   int16s
+     88    WB_RGGBLevelsUnknown3?               int16s[4]
+     92    ColorTempUnknown3?                   int16s
+     93    WB_RGGBLevelsUnknown4?               int16s[4]
+     97    ColorTempUnknown4?                   int16s
+     98    WB_RGGBLevelsUnknown5?               int16s[4]
+    102    ColorTempUnknown5?                   int16s
+    103    WB_RGGBLevelsUnknown6?               int16s[4]
+    107    ColorTempUnknown6?                   int16s
+    108    WB_RGGBLevelsUnknown7?               int16s[4]
+    112    ColorTempUnknown7?                   int16s
+    113    WB_RGGBLevelsUnknown8?               int16s[4]
+    117    ColorTempUnknown8?                   int16s
+    118    WB_RGGBLevelsUnknown9?               int16s[4]
+    122    ColorTempUnknown9?                   int16s
+    123    WB_RGGBLevelsUnknown10?              int16s[4]
+    127    ColorTempUnknown10?                  int16s
+    128    WB_RGGBLevelsDaylight                int16s[4]
+    132    ColorTempDaylight                    int16s
+    133    WB_RGGBLevelsShade                   int16s[4]
+    137    ColorTempShade                       int16s
+    138    WB_RGGBLevelsCloudy                  int16s[4]
+    142    ColorTempCloudy                      int16s
+    143    WB_RGGBLevelsTungsten                int16s[4]
+    147    ColorTempTungsten                    int16s
+    148    WB_RGGBLevelsFluorescent             int16s[4]
+    152    ColorTempFluorescent                 int16s
+    153    WB_RGGBLevelsKelvin                  int16s[4]
+    157    ColorTempKelvin                      int16s
+    158    WB_RGGBLevelsFlash                   int16s[4]
+    162    ColorTempFlash                       int16s
+    163    WB_RGGBLevelsUnknown11?              int16s[4]
+    167    ColorTempUnknown11?                  int16s
+    168    WB_RGGBLevelsUnknown12?              int16s[4]
+    172    ColorTempUnknown12?                  int16s
+    173    WB_RGGBLevelsUnknown13?              int16s[4]
+    177    ColorTempUnknown13?                  int16s
+    178    WB_RGGBLevelsUnknown14?              int16s[4]
+    182    ColorTempUnknown14?                  int16s
+    183    WB_RGGBLevelsUnknown15?              int16s[4]
+    187    ColorTempUnknown15?                  int16s
+    188    WB_RGGBLevelsUnknown16?              int16s[4]
+    192    ColorTempUnknown16?                  int16s
+    193    WB_RGGBLevelsUnknown17?              int16s[4]
+    197    ColorTempUnknown17?                  int16s
+    198    WB_RGGBLevelsUnknown18?              int16s[4]
+    202    ColorTempUnknown18?                  int16s
+    203    WB_RGGBLevelsUnknown19?              int16s[4]
+    207    ColorTempUnknown19?                  int16s
+    208    WB_RGGBLevelsUnknown20?              int16s[4]
+    212    ColorTempUnknown20?                  int16s
+    213    ColorCalib?                          Canon ColorCalib
+    276    AverageBlackLevel                    int16u[4]
+    429    RawMeasuredRGGB                      int32u[4]
+    504    PerChannelBlackLevel                 int16u[4]
+    508    NormalWhiteLevel                     int16u
+    509    SpecularWhiteLevel                   int16u
+    510    LinearityUpperMargin                 int16u
 
-=head3 NikonCapture ColorBoost Tags
+=head3 Canon ColorDataUnknown Tags
 
-  Index1   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-      0    ColorBoostType                       int8u
-      1    ColorBoostLevel                      int32u
+      0    ColorDataVersion                     N
 
-=head3 NikonCapture WBAdjData Tags
+=head3 Canon ColorInfo Tags
 
-  Index1   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-      0    WBAdjRedBalance                      double
-      8    WBAdjBlueBalance                     double
-     16    WBAdjMode                            int8u
-     20    WBAdjLightingSubtype                 int8u
-     21    WBAdjLighting                        int8u
-     24    WBAdjTemperature                     int16u
-     37    WBAdjTint                            int32s
+      1    Saturation                           int16s
+      2    ColorTone                            int16s
+      3    ColorSpace                           int16s
 
-=head3 NikonCapture DLightingHS Tags
+=head3 Canon AFMicroAdj Tags
 
   Index4   Tag Name                             Writable
   ------   --------                             --------
-      0    D-LightingHSAdjustment               int32u
-      1    D-LightingHSColorBoost               int32u
+      1    AFMicroAdjMode                       int32s
+      2    AFMicroAdjValue                      rational64s
 
-=head3 NikonCapture UnsharpData Tags
+=head3 Canon VignettingCorr Tags
+
+This information is found in images from the 1DmkIV, 5DmkII, 7D, 50D, 60D,
+500D and 550D.
+
+  Index2   Tag Name                             Writable
+  ------   --------                             --------
+      2    PeripheralLighting                   int16s
+      4    ChromaticAberrationCorr              int16s
+      5    ChromaticAberrationCorr              int16s
+      6    PeripheralLightingValue              int16s
+     11    OriginalImageWidth                   int16s
+     12    OriginalImageHeight                  int16s
+
+=head3 Canon VignettingCorr2 Tags
+
+  Index4   Tag Name                             Writable
+  ------   --------                             --------
+      5    PeripheralLightingSetting            int32s
+      6    ChromaticAberrationSetting           int32s
+
+=head3 Canon LightingOpt Tags
+
+This information is new in images from the EOS 7D.
+
+  Index4   Tag Name                             Writable
+  ------   --------                             --------
+      2    AutoLightingOptimizer                int32s
+
+=head3 Canon LensInfo Tags
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    UnsharpCount                         int8u
-     19    Unsharp1Color                        int16u
-     23    Unsharp1Intensity                    int16u
-     25    Unsharp1HaloWidth                    int16u
-     27    Unsharp1Threshold                    int8u
-     46    Unsharp2Color                        int16u
-     50    Unsharp2Intensity                    int16u
-     52    Unsharp2HaloWidth                    int16u
-     54    Unsharp2Threshold                    int8u
-     73    Unsharp3Color                        int16u
-     77    Unsharp3Intensity                    int16u
-     79    Unsharp3HaloWidth                    int16u
-     81    Unsharp3Threshold                    int8u
-    100    Unsharp4Color                        int16u
-    104    Unsharp4Intensity                    int16u
-    106    Unsharp4HaloWidth                    int16u
-    108    Unsharp4Threshold                    int8u
+      0    LensSerialNumber                     undef[5]
 
-=head2 Olympus Tags
+=head3 Canon Ambience Tags
 
-Tags 0x0000 through 0x0103 are used by some older Olympus cameras, and are
-the same as Konica/Minolta tags.  These tags are also used for some models
-from other brands such as Acer, BenQ, Epson, Hitachi, HP, Maginon, Minolta,
-Pentax, Ricoh, Samsung, Sanyo, SeaLife, Sony, Supra and Vivitar.
+  Index4   Tag Name                             Writable
+  ------   --------                             --------
+      1    AmbienceSelection                    int32s
+
+=head3 Canon FilterInfo Tags
+
+Information about creative filter settings.
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
-  0x0000   MakerNoteVersion                     undef
-  0x0001   MinoltaCameraSettingsOld             Minolta CameraSettings
-  0x0003   MinoltaCameraSettings                Minolta CameraSettings
-  0x0040   CompressedImageSize                  int32u
-  0x0081   PreviewImageData                     N
-  0x0088   PreviewImageStart                    N
-  0x0089   PreviewImageLength                   N
-  0x0100   ThumbnailImage                       undef
-  0x0104   BodyFirmwareVersion                  string
-  0x0200   SpecialMode                          int32u[3]~
-  0x0201   Quality                              int16u~
-  0x0202   Macro                                int16u
-  0x0203   BWMode                               int16u
-  0x0204   DigitalZoom                          rational64u
-  0x0205   FocalPlaneDiagonal                   rational64u
-  0x0206   LensDistortionParams                 int16s[6]
-  0x0207   CameraType                           string
-  0x0208   TextInfo                             Olympus TextInfo
-  0x0209   CameraID                             string
-  0x020b   EpsonImageWidth                      int16u
-  0x020c   EpsonImageHeight                     int16u
-  0x020d   EpsonSoftware                        string
-  0x0280   PreviewImage                         int8u
-  0x0300   PreCaptureFrames                     int16u
-  0x0301   WhiteBoard                           int16u
-  0x0302   OneTouchWB                           int16u
-  0x0303   WhiteBalanceBracket                  int16u
-  0x0304   WhiteBalanceBias                     int16u
-  0x0403   SceneMode                            int16u
-  0x0404   SerialNumber                         string
-  0x0405   Firmware                             string
-  0x0e00   PrintIM                              PrintIM
-  0x0f00   DataDump                             N
-  0x0f01   DataDump2                            N
-  0x0f04   ZoomedPreviewStart                   int32u*
-  0x0f05   ZoomedPreviewLength                  int32u*
-  0x0f06   ZoomedPreviewSize                    int16u[2]
-  0x1000   ShutterSpeedValue                    rational64s
-  0x1001   ISOValue                             rational64s
-  0x1002   ApertureValue                        rational64s
-  0x1003   BrightnessValue                      rational64s
-  0x1004   FlashMode                            int16u
-  0x1005   FlashDevice                          int16u
-  0x1006   ExposureCompensation                 rational64s
-  0x1007   SensorTemperature                    int16s
-  0x1008   LensTemperature                      int16s
-  0x1009   LightCondition                       int16u
-  0x100a   FocusRange                           int16u
-  0x100b   FocusMode                            int16u
-  0x100c   ManualFocusDistance                  rational64u
-  0x100d   ZoomStepCount                        int16u
-  0x100e   FocusStepCount                       int16u
-  0x100f   Sharpness                            int16u
-  0x1010   FlashChargeLevel                     int16u
-  0x1011   ColorMatrix                          int16u[9]
-  0x1012   BlackLevel                           int16u[4]
-  0x1013   ColorTemperatureBG?                  int16u
-  0x1014   ColorTemperatureRG?                  int16u
-  0x1015   WBMode                               int16u[2]
-  0x1017   RedBalance                           int16u[2]
-  0x1018   BlueBalance                          int16u[2]
-  0x1019   ColorMatrixNumber                    int16u
-  0x101a   SerialNumber                         string
-  0x101b   ExternalFlashAE1_0?                  int32u
-  0x101c   ExternalFlashAE2_0?                  int32u
-  0x101d   InternalFlashAE1_0?                  int32u
-  0x101e   InternalFlashAE2_0?                  int32u
-  0x101f   ExternalFlashAE1?                    int32u
-  0x1020   ExternalFlashAE2?                    int32u
-  0x1021   InternalFlashAE1?                    int32u
-  0x1022   InternalFlashAE2?                    int32u
-  0x1023   FlashExposureComp                    rational64s
-  0x1024   InternalFlashTable                   int16u
-  0x1025   ExternalFlashGValue                  rational64s
-  0x1026   ExternalFlashBounce                  int16u
-  0x1027   ExternalFlashZoom                    int16u
-  0x1028   ExternalFlashMode                    int16u
-  0x1029   Contrast                             int16u
-  0x102a   SharpnessFactor                      int16u
-  0x102b   ColorControl                         int16u[6]
-  0x102c   ValidBits                            int16u[2]
-  0x102d   CoringFilter                         int16u
-  0x102e   OlympusImageWidth                    int32u
-  0x102f   OlympusImageHeight                   int32u
-  0x1030   SceneDetect                          int16u
-  0x1031   SceneArea?                           int32u[8]
-  0x1033   SceneDetectData?                     int32u[720]
-  0x1034   CompressionRatio                     rational64u
-  0x1035   PreviewImageValid                    int32u
-  0x1036   PreviewImageStart                    int32u*
-  0x1037   PreviewImageLength                   int32u*
-  0x1038   AFResult                             int16u
-  0x1039   CCDScanMode                          int16u
-  0x103a   NoiseReduction                       int16u
-  0x103b   FocusStepInfinity                    int16u
-  0x103c   FocusStepNear                        int16u
-  0x103d   LightValueCenter                     rational64s
-  0x103e   LightValuePeriphery                  rational64s
-  0x103f   FieldCount?                          int16u
-  0x2010   Equipment                            Olympus Equipment
-           EquipmentIFD                         Olympus Equipment
-  0x2020   CameraSettings                       Olympus CameraSettings
-           CameraSettingsIFD                    Olympus CameraSettings
-  0x2030   RawDevelopment                       Olympus RawDevelopment
-           RawDevelopmentIFD                    Olympus RawDevelopment
-  0x2031   RawDev2                              Olympus RawDevelopment2
-           RawDev2IFD                           Olympus RawDevelopment2
-  0x2040   ImageProcessing                      Olympus ImageProcessing
-           ImageProcessingIFD                   Olympus ImageProcessing
-  0x2050   FocusInfo                            Olympus FocusInfo
-           FocusInfoIFD                         Olympus FocusInfo
-           CameraParameters                     undef
-  0x2100   Olympus2100                          Olympus FE
-           Olympus2100IFD                       Olympus FE
-  0x2200   Olympus2200                          Olympus FE
-           Olympus2200IFD                       Olympus FE
-  0x2300   Olympus2300                          Olympus FE
-           Olympus2300IFD                       Olympus FE
-  0x2400   Olympus2400                          Olympus FE
-           Olympus2400IFD                       Olympus FE
-  0x2500   Olympus2500                          Olympus FE
-           Olympus2500IFD                       Olympus FE
-  0x2600   Olympus2600                          Olympus FE
-           Olympus2600IFD                       Olympus FE
-  0x2700   Olympus2700                          Olympus FE
-           Olympus2700IFD                       Olympus FE
-  0x2800   Olympus2800                          Olympus FE
-           Olympus2800IFD                       Olympus FE
-  0x2900   Olympus2900                          Olympus FE
-           Olympus2900IFD                       Olympus FE
-  0x3000   RawInfo                              Olympus RawInfo
-           RawInfoIFD                           Olympus RawInfo
-  0x4000   MainInfo                             Olympus
-           MainInfoIFD                          Olympus
-  0x5000   UnknownInfo                          Olympus UnknownInfo
-           UnknownInfoIFD                       Olympus UnknownInfo
+  0x0101   GrainyBWFilter                       N
+  0x0201   SoftFocusFilter                      N
+  0x0301   ToyCameraFilter                      N
+  0x0401   MiniatureFilter                      N
+  0x0402   MiniatureFilterOrientation           N
+  0x0403   MiniatureFilterPosition              N
+  0x0404   MiniatureFilterParameter             N
+  0x0501   FisheyeFilter                        N
+  0x0601   PaintingFilter                       N
+  0x0701   WatercolorFilter                     N
 
-=head3 Olympus TextInfo Tags
+=head3 Canon CNTH Tags
 
-This information is in text format (similar to APP12 information, but with
-spaces instead of linefeeds).  Below are tags which have been observed, but
-any information found here will be extracted, even if the tag is not listed.
+Canon-specific QuickTime tags found in the CNTH atom of MOV videos from some
+cameras such as the PowerShot S95.
 
-  Tag ID               Tag Name                 Writable
-  ------               --------                 --------
-  'Resolution'         Resolution               N
-  'Type'               CameraType               N
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'CNDA'   ThumbnailImage                       N
 
-=head3 Olympus Equipment Tags
+=head3 Canon uuid Tags
+
+Tags extracted from the uuid atom of MP4 videos from cameras such as the
+SX280.
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
-  0x0000   EquipmentVersion                     undef[4]
-  0x0100   CameraType2                          string[6]
-  0x0101   SerialNumber                         string[32]
-  0x0102   InternalSerialNumber                 string[32]
-  0x0103   FocalPlaneDiagonal                   rational64u
-  0x0104   BodyFirmwareVersion                  int32u
-  0x0201   LensType                             int8u[6]
-  0x0202   LensSerialNumber                     string[32]
-  0x0203   LensModel                            string
-  0x0204   LensFirmwareVersion                  int32u
-  0x0205   MaxApertureAtMinFocal                int16u
-  0x0206   MaxApertureAtMaxFocal                int16u
-  0x0207   MinFocalLength                       int16u
-  0x0208   MaxFocalLength                       int16u
-  0x020a   MaxAperture                          int16u
-  0x020b   LensProperties                       int16u
-  0x0301   Extender                             int8u[6]
-  0x0302   ExtenderSerialNumber                 string[32]
-  0x0303   ExtenderModel                        string
-  0x0304   ExtenderFirmwareVersion              int32u
-  0x0403   ConversionLens                       string
-  0x1000   FlashType                            int16u
-  0x1001   FlashModel                           int16u
-  0x1002   FlashFirmwareVersion                 int32u
-  0x1003   FlashSerialNumber                    string[32]
+  'CNCV'   CompressorVersion                    N
+  'CNTH'   CanonCNTH                            Canon CNTH
 
-=head3 Olympus CameraSettings Tags
+=head3 Canon Skip Tags
+
+Information found in the "skip" atom of Canon MOV videos.
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
-  0x0000   CameraSettingsVersion                undef[4]
-  0x0100   PreviewImageValid                    int32u
-  0x0101   PreviewImageStart                    int32u*
-  0x0102   PreviewImageLength                   int32u*
-  0x0200   ExposureMode                         int16u
-  0x0201   AELock                               int16u
-  0x0202   MeteringMode                         int16u
-  0x0203   ExposureShift                        rational64s
-  0x0300   MacroMode                            int16u
-  0x0301   FocusMode                            int16u[n]
-  0x0302   FocusProcess                         int16u[n]
-  0x0303   AFSearch                             int16u
-  0x0304   AFAreas                              int32u[64]~
-  0x0305   AFPointSelected                      rational64s[5]~
-  0x0306   AFFineTune                           int8u
-  0x0307   AFFineTuneAdj                        int16s[3]
-  0x0400   FlashMode                            int16u
-  0x0401   FlashExposureComp                    rational64s
-  0x0403   FlashRemoteControl                   int16u
-  0x0404   FlashControlMode                     int16u[3]
-  0x0405   FlashIntensity                       rational64s[3]
-  0x0406   ManualFlashStrength                  rational64s[3]
-  0x0500   WhiteBalance2                        int16u
-  0x0501   WhiteBalanceTemperature              int16u
-  0x0502   WhiteBalanceBracket                  int16s
-  0x0503   CustomSaturation                     int16s[3]~
-  0x0504   ModifiedSaturation                   int16u
-  0x0505   ContrastSetting                      int16s[3]
-  0x0506   SharpnessSetting                     int16s[3]
-  0x0507   ColorSpace                           int16u
-  0x0509   SceneMode                            int16u
-  0x050a   NoiseReduction                       int16u
-  0x050b   DistortionCorrection                 int16u
-  0x050c   ShadingCompensation                  int16u
-  0x050d   CompressionFactor                    rational64u
-  0x050f   Gradation                            int16s[n]
-  0x0520   PictureMode                          int16u[n]
-  0x0521   PictureModeSaturation                int16s[3]
-  0x0522   PictureModeHue?                      int16s
-  0x0523   PictureModeContrast                  int16s[3]
-  0x0524   PictureModeSharpness                 int16s[3]
-  0x0525   PictureModeBWFilter                  int16s
-  0x0526   PictureModeTone                      int16s
-  0x0527   NoiseFilter                          int16s[3]
-  0x0529   ArtFilter                            int16u[4]
-  0x052c   MagicFilter                          int16u[4]
-  0x052d   PictureModeEffect                    int16s[3]
-  0x052f   ArtFilterEffect                      int16u[20]
-  0x0600   DriveMode                            int16u[n]~
-  0x0601   PanoramaMode                         int16u~
-  0x0603   ImageQuality2                        int16u
-  0x0604   ImageStabilization                   int32u
-  0x0900   ManometerPressure                    int16u
-  0x0901   ManometerReading                     int32s[2]
-  0x0902   ExtendedWBDetect                     int16u
-  0x0903   LevelGaugeRoll                       int16u
-  0x0904   LevelGaugePitch                      int16u
-
-=head3 Olympus RawDevelopment Tags
-
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-  0x0000   RawDevVersion                        undef[4]
-  0x0100   RawDevExposureBiasValue              rational64s
-  0x0101   RawDevWhiteBalanceValue              int16u
-  0x0102   RawDevWBFineAdjustment               int16s
-  0x0103   RawDevGrayPoint                      int16u[3]
-  0x0104   RawDevSaturationEmphasis             int16s[3]
-  0x0105   RawDevMemoryColorEmphasis            int16u
-  0x0106   RawDevContrastValue                  int16s[3]
-  0x0107   RawDevSharpnessValue                 int16s[3]
-  0x0108   RawDevColorSpace                     int16u
-  0x0109   RawDevEngine                         int16u
-  0x010a   RawDevNoiseReduction                 int16u
-  0x010b   RawDevEditStatus                     int16u
-  0x010c   RawDevSettings                       int16u
+  'CNDB'   Unknown_CNDB?                        N
 
-=head3 Olympus RawDevelopment2 Tags
+=head2 CanonCustom Tags
 
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-  0x0000   RawDevVersion                        undef[4]
-  0x0100   RawDevExposureBiasValue              rational64s
-  0x0101   RawDevWhiteBalance                   int16u
-  0x0102   RawDevWhiteBalanceValue              int16u
-  0x0103   RawDevWBFineAdjustment               int16s
-  0x0104   RawDevGrayPoint                      int16u[3]
-  0x0105   RawDevContrastValue                  int16s[3]
-  0x0106   RawDevSharpnessValue                 int16s[3]
-  0x0107   RawDevSaturationEmphasis             int16s[3]
-  0x0108   RawDevMemoryColorEmphasis            int16u
-  0x0109   RawDevColorSpace                     int16u
-  0x010a   RawDevNoiseReduction                 int16u
-  0x010b   RawDevEngine                         int16u
-  0x010c   RawDevPictureMode                    int16u
-  0x010d   RawDevPMSaturation                   int16s[3]
-  0x010e   RawDevPMContrast                     int16s[3]
-  0x010f   RawDevPMSharpness                    int16s[3]
-  0x0110   RawDevPM_BWFilter                    int16u
-  0x0111   RawDevPMPictureTone                  int16u
-  0x0112   RawDevGradation                      int16s[3]
-  0x0113   RawDevSaturation3                    int16s[3]
-  0x0119   RawDevAutoGradation                  int16u
-  0x0120   RawDevPMNoiseFilter                  int16u
+=head3 CanonCustom Functions1D Tags
 
-=head3 Olympus ImageProcessing Tags
+These custom functions are used by all 1D models up to but not including the
+Mark III.
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
-  0x0000   ImageProcessingVersion               undef[4]
-  0x0100   WB_RBLevels                          int16u[2]
-  0x0102   WB_RBLevels3000K                     int16u[2]
-  0x0103   WB_RBLevels3300K                     int16u[2]
-  0x0104   WB_RBLevels3600K                     int16u[2]
-  0x0105   WB_RBLevels3900K                     int16u[2]
-  0x0106   WB_RBLevels4000K                     int16u[2]
-  0x0107   WB_RBLevels4300K                     int16u[2]
-  0x0108   WB_RBLevels4500K                     int16u[2]
-  0x0109   WB_RBLevels4800K                     int16u[2]
-  0x010a   WB_RBLevels5300K                     int16u[2]
-  0x010b   WB_RBLevels6000K                     int16u[2]
-  0x010c   WB_RBLevels6600K                     int16u[2]
-  0x010d   WB_RBLevels7500K                     int16u[2]
-  0x010e   WB_RBLevelsCWB1                      int16u[2]
-  0x010f   WB_RBLevelsCWB2                      int16u[2]
-  0x0110   WB_RBLevelsCWB3                      int16u[2]
-  0x0111   WB_RBLevelsCWB4                      int16u[2]
-  0x0113   WB_GLevel3000K                       int16u
-  0x0114   WB_GLevel3300K                       int16u
-  0x0115   WB_GLevel3600K                       int16u
-  0x0116   WB_GLevel3900K                       int16u
-  0x0117   WB_GLevel4000K                       int16u
-  0x0118   WB_GLevel4300K                       int16u
-  0x0119   WB_GLevel4500K                       int16u
-  0x011a   WB_GLevel4800K                       int16u
-  0x011b   WB_GLevel5300K                       int16u
-  0x011c   WB_GLevel6000K                       int16u
-  0x011d   WB_GLevel6600K                       int16u
-  0x011e   WB_GLevel7500K                       int16u
-  0x011f   WB_GLevel                            int16u
-  0x0200   ColorMatrix                          int16u[9]
-  0x0300   Enhancer                             int16u
-  0x0301   EnhancerValues                       int16u[7]
-  0x0310   CoringFilter                         int16u
-  0x0311   CoringValues                         int16u[7]
-  0x0600   BlackLevel2                          int16u[4]
-  0x0610   GainBase                             int16u
-  0x0611   ValidBits                            int16u[2]
-  0x0612   CropLeft                             int16u[2]
-  0x0613   CropTop                              int16u[2]
-  0x0614   CropWidth                            int32u
-  0x0615   CropHeight                           int32u
-  0x0635   UnknownBlock1?                       undef
-  0x0636   UnknownBlock2?                       undef
-  0x1010   NoiseReduction2                      int16u
-  0x1011   DistortionCorrection2                int16u
-  0x1012   ShadingCompensation2                 int16u
-  0x101c   MultipleExposureMode                 int16u[2]
-  0x1103   UnknownBlock3?                       undef
-  0x1104   UnknownBlock4?                       undef
-  0x1112   AspectRatio                          int8u[2]
-  0x1113   AspectFrame                          int16u[4]
-  0x1200   FacesDetected                        int32u[n]
-  0x1201   FaceDetectArea                       int16s[n]
-  0x1202   MaxFaces                             int32u[3]
-  0x1203   FaceDetectFrameSize                  int16u[6]
-  0x1207   FaceDetectFrameCrop                  int16s[12]
+      0    FocusingScreen                       int8u
+      1    FinderDisplayDuringExposure          int8u
+      2    ShutterReleaseNoCFCard               int8u
+      3    ISOSpeedExpansion                    int8u
+      4    ShutterAELButton                     int8u
+      5    ManualTv                             int8u
+      6    ExposureLevelIncrements              int8u
+      7    USMLensElectronicMF                  int8u
+      8    LCDPanels                            int8u
+      9    AEBSequenceAutoCancel                int8u
+     10    AFPointIllumination                  int8u
+     11    AFPointSelection                     int8u
+     12    MirrorLockup                         int8u
+     13    AFPointSpotMetering                  int8u
+     14    FillFlashAutoReduction               int8u
+     15    ShutterCurtainSync                   int8u
+     16    SafetyShiftInAvOrTv                  int8u
+     17    AFPointActivationArea                int8u
+     18    SwitchToRegisteredAFPoint            int8u
+     19    LensAFStopButton                     int8u
+     20    AIServoTrackingSensitivity           int8u
+     21    AIServoContinuousShooting            int8u
 
-=head3 Olympus FocusInfo Tags
+=head3 CanonCustom Functions5D Tags
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
-  0x0000   FocusInfoVersion                     undef[4]
-  0x0209   AutoFocus?                           int16u
-  0x0210   SceneDetect                          int16u
-  0x0211   SceneArea?                           int32u[8]
-  0x0212   SceneDetectData?                     int32u[720]
-  0x0300   ZoomStepCount                        int16u
-  0x0301   FocusStepCount                       int16u
-  0x0303   FocusStepInfinity                    int16u
-  0x0304   FocusStepNear                        int16u
-  0x0305   FocusDistance                        rational64u
-  0x0308   AFPoint                              int16u
-  0x1201   ExternalFlash                        int16u[2]
-  0x1203   ExternalFlashGuideNumber?            rational64s
-  0x1204   ExternalFlashBounce                  int16u
-  0x1205   ExternalFlashZoom                    rational64u
-  0x1208   InternalFlash                        int16u[n]
-  0x1209   ManualFlash                          int16u[2]~
-  0x120a   MacroLED                             int16u
-  0x1500   SensorTemperature                    int16s
-  0x1600   ImageStabilization                   undef~
-
-=head3 Olympus FE Tags
+      0    FocusingScreen                       int8u
+      1    SetFunctionWhenShooting              int8u
+      2    LongExposureNoiseReduction           int8u
+      3    FlashSyncSpeedAv                     int8u
+      4    Shutter-AELock                       int8u
+      5    AFAssistBeam                         int8u
+      6    ExposureLevelIncrements              int8u
+      7    FlashFiring                          int8u
+      8    ISOExpansion                         int8u
+      9    AEBSequenceAutoCancel                int8u
+     10    SuperimposedDisplay                  int8u
+     11    MenuButtonDisplayPosition            int8u
+     12    MirrorLockup                         int8u
+     13    AFPointSelectionMethod               int8u
+     14    ETTLII                               int8u
+     15    ShutterCurtainSync                   int8u
+     16    SafetyShiftInAvOrTv                  int8u
+     17    AFPointActivationArea                int8u
+     18    LCDDisplayReturnToShoot              int8u
+     19    LensAFStopButton                     int8u
+     20    AddOriginalDecisionData              int8u
 
-Some FE models write a large number of tags here, but most of this
-information remains unknown.
+=head3 CanonCustom Functions10D Tags
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
-  0x0100   BodyFirmwareVersion                  string
-
-=head3 Olympus RawInfo Tags
+      1    SetButtonWhenShooting                int8u
+      2    ShutterReleaseNoCFCard               int8u
+      3    FlashSyncSpeedAv                     int8u
+      4    Shutter-AELock                       int8u
+      5    AFAssist                             int8u
+      6    ExposureLevelIncrements              int8u
+      7    AFPointRegistration                  int8u
+      8    RawAndJpgRecording                   int8u
+      9    AEBSequenceAutoCancel                int8u
+     10    SuperimposedDisplay                  int8u
+     11    MenuButtonDisplayPosition            int8u
+     12    MirrorLockup                         int8u
+     13    AssistButtonFunction                 int8u
+     14    FillFlashAutoReduction               int8u
+     15    ShutterCurtainSync                   int8u
+     16    SafetyShiftInAvOrTv                  int8u
+     17    LensAFStopButton                     int8u
 
-These tags are found only in ORF images of some models (ie. C8080WZ).
+=head3 CanonCustom Functions20D Tags
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
-  0x0000   RawInfoVersion                       undef[4]
-  0x0100   WB_RBLevelsUsed                      int16u[2]
-  0x0110   WB_RBLevelsAuto                      int16u[2]
-  0x0120   WB_RBLevelsShade                     int16u[2]
-  0x0121   WB_RBLevelsCloudy                    int16u[2]
-  0x0122   WB_RBLevelsFineWeather               int16u[2]
-  0x0123   WB_RBLevelsTungsten                  int16u[2]
-  0x0124   WB_RBLevelsEveningSunlight           int16u[2]
-  0x0130   WB_RBLevelsDaylightFluor             int16u[2]
-  0x0131   WB_RBLevelsDayWhiteFluor             int16u[2]
-  0x0132   WB_RBLevelsCoolWhiteFluor            int16u[2]
-  0x0133   WB_RBLevelsWhiteFluorescent          int16u[2]
-  0x0200   ColorMatrix2                         int16u[9]
-  0x0310   CoringFilter                         int16u
-  0x0311   CoringValues                         int16u[11]
-  0x0600   BlackLevel2                          int16u[4]
-  0x0601   YCbCrCoefficients                    N
-  0x0611   ValidPixelDepth                      int16u[2]
-  0x0612   CropLeft                             int16u
-  0x0613   CropTop                              int16u
-  0x0614   CropWidth                            int32u
-  0x0615   CropHeight                           int32u
-  0x1000   LightSource                          int16u
-  0x1001   WhiteBalanceComp                     int16s[3]
-  0x1010   SaturationSetting                    int16s[3]
-  0x1011   HueSetting                           int16s[3]
-  0x1012   ContrastSetting                      int16s[3]
-  0x1013   SharpnessSetting                     int16s[3]
-  0x2000   CMExposureCompensation               rational64s
-  0x2001   CMWhiteBalance                       int16u
-  0x2002   CMWhiteBalanceComp                   int16s
-  0x2010   CMWhiteBalanceGrayPoint              int16u[3]
-  0x2020   CMSaturation                         int16s[3]
-  0x2021   CMHue                                int16s[3]
-  0x2022   CMContrast                           int16s[3]
-  0x2023   CMSharpness                          int16s[3]
+      0    SetFunctionWhenShooting              int8u
+      1    LongExposureNoiseReduction           int8u
+      2    FlashSyncSpeedAv                     int8u
+      3    Shutter-AELock                       int8u
+      4    AFAssistBeam                         int8u
+      5    ExposureLevelIncrements              int8u
+      6    FlashFiring                          int8u
+      7    ISOExpansion                         int8u
+      8    AEBSequenceAutoCancel                int8u
+      9    SuperimposedDisplay                  int8u
+     10    MenuButtonDisplayPosition            int8u
+     11    MirrorLockup                         int8u
+     12    AFPointSelectionMethod               int8u
+     13    ETTLII                               int8u
+     14    ShutterCurtainSync                   int8u
+     15    SafetyShiftInAvOrTv                  int8u
+     16    LensAFStopButton                     int8u
+     17    AddOriginalDecisionData              int8u
 
-=head3 Olympus UnknownInfo Tags
+=head3 CanonCustom Functions30D Tags
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
-  [no tags known]
-
-=head3 Olympus MOV1 Tags
-
-This information is found in MOV videos from Olympus models such as the
-D540Z, D595Z, FE100, FE110, FE115, FE170 and FE200.
-
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-      0    Make                                 N
-     24    Model                                N
-     38    ExposureUnknown?                     N
-     42    FNumber                              N
-     50    ExposureCompensation                 N
-     72    FocalLength                          N
-
-=head3 Olympus MOV2 Tags
-
-This information is found in MOV videos from Olympus models such as the
-FE120, FE140 and FE190.
-
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-      0    Make                                 N
-     24    Model                                N
-     54    ExposureTime                         N
-     58    FNumber                              N
-     66    ExposureCompensation                 N
-     88    FocalLength                          N
-    193    ISO                                  N
-
-=head3 Olympus MP4 Tags
-
-This information is found in MP4 videos from Olympus models such as the
-u7040 and u9010.
-
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-      0    Make                                 N
-     24    Model                                N
-     40    FNumber                              N
-     48    ExposureCompensation                 N
-    104    MovableInfo                          Olympus MovableInfo
-    114    MovableInfo                          Olympus MovableInfo
+      1    SetFunctionWhenShooting              int8u
+      2    LongExposureNoiseReduction           int8u
+      3    FlashSyncSpeedAv                     int8u
+      4    Shutter-AELock                       int8u
+      5    AFAssistBeam                         int8u
+      6    ExposureLevelIncrements              int8u
+      7    FlashFiring                          int8u
+      8    ISOExpansion                         int8u
+      9    AEBSequenceAutoCancel                int8u
+     10    SuperimposedDisplay                  int8u
+     11    MenuButtonDisplayPosition            int8u
+     12    MirrorLockup                         int8u
+     13    AFPointSelectionMethod               int8u
+     14    ETTLII                               int8u
+     15    ShutterCurtainSync                   int8u
+     16    SafetyShiftInAvOrTv                  int8u
+     17    MagnifiedView                        int8u
+     18    LensAFStopButton                     int8u
+     19    AddOriginalDecisionData              int8u
 
-=head3 Olympus MovableInfo Tags
+=head3 CanonCustom Functions350D Tags
 
-  Index1   Tag Name                             Writable
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      4    ISO                                  N
-     44    EncoderVersion                       N
-     60    DecoderVersion                       N
-    131    Thumbnail                            Olympus Thumbnail
+      0    SetButtonCrossKeysFunc               int8u
+      1    LongExposureNoiseReduction           int8u
+      2    FlashSyncSpeedAv                     int8u
+      3    Shutter-AELock                       int8u
+      4    AFAssistBeam                         int8u
+      5    ExposureLevelIncrements              int8u
+      6    MirrorLockup                         int8u
+      7    ETTLII                               int8u
+      8    ShutterCurtainSync                   int8u
 
-=head3 Olympus Thumbnail Tags
+=head3 CanonCustom Functions400D Tags
 
-  Index4   Tag Name                             Writable
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      1    ThumbnailWidth                       N
-      2    ThumbnailHeight                      N
-      3    ThumbnailLength                      N
-      4    ThumbnailOffset                      N
+      0    SetButtonCrossKeysFunc               int8u
+      1    LongExposureNoiseReduction           int8u
+      2    FlashSyncSpeedAv                     int8u
+      3    Shutter-AELock                       int8u
+      4    AFAssistBeam                         int8u
+      5    ExposureLevelIncrements              int8u
+      6    MirrorLockup                         int8u
+      7    ETTLII                               int8u
+      8    ShutterCurtainSync                   int8u
+      9    MagnifiedView                        int8u
+     10    LCDDisplayAtPowerOn                  int8u
 
-=head3 Olympus MOV3 Tags
+=head3 CanonCustom FunctionsD30 Tags
 
-QuickTime information found in the TAGS atom of MOV videos from the E-M5.
+Custom functions for the EOS D30 and D60.
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
-  'OLYM'   OlympusAtom                          Olympus OLYM2
+      1    LongExposureNoiseReduction           int8u
+      2    Shutter-AELock                       int8u
+      3    MirrorLockup                         int8u
+      4    ExposureLevelIncrements              int8u
+      5    AFAssist                             int8u
+      6    FlashSyncSpeedAv                     int8u
+      7    AEBSequenceAutoCancel                int8u
+      8    ShutterCurtainSync                   int8u
+      9    LensAFStopButton                     int8u
+     10    FillFlashAutoReduction               int8u
+     11    MenuButtonReturn                     int8u
+     12    SetButtonWhenShooting                int8u
+     13    SensorCleaning                       int8u
+     14    SuperimposedDisplay                  int8u
+     15    ShutterReleaseNoCFCard               int8u
 
-=head3 Olympus OLYM2 Tags
+=head3 CanonCustom FuncsUnknown Tags
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
-  'prms'   MakerNotes                           Olympus prms
-  'scrn'   PreviewInfo                          Olympus scrn2
-  'thmb'   ThumbInfo                            Olympus thmb2
+  [no tags known]
 
-=head3 Olympus prms Tags
+=head3 CanonCustom PersonalFuncs Tags
 
-Information extracted from the "prms" atom in MOV videos from Olympus models
-such as the OM E-M5.
+Personal function settings for the EOS-1D.
 
-  Index1   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-     18    Make                                 N
-     44    Model                                N
-    131    DateTime1                            N
-    157    DateTime2                            N
+      1    PF0CustomFuncRegistration            int16u
+      2    PF1DisableShootingModes              int16u
+      3    PF2DisableMeteringModes              int16u
+      4    PF3ManualExposureMetering            int16u
+      5    PF4ExposureTimeLimits                int16u
+      6    PF5ApertureLimits                    int16u
+      7    PF6PresetShootingModes               int16u
+      8    PF7BracketContinuousShoot            int16u
+      9    PF8SetBracketShots                   int16u
+     10    PF9ChangeBracketSequence             int16u
+     11    PF10RetainProgramShift               int16u
+     14    PF13DrivePriority                    int16u
+     15    PF14DisableFocusSearch               int16u
+     16    PF15DisableAFAssistBeam              int16u
+     17    PF16AutoFocusPointShoot              int16u
+     18    PF17DisableAFPointSel                int16u
+     19    PF18EnableAutoAFPointSel             int16u
+     20    PF19ContinuousShootSpeed             int16u
+     21    PF20LimitContinousShots              int16u
+     22    PF21EnableQuietOperation             int16u
+     24    PF23SetTimerLengths                  int16u
+     25    PF24LightLCDDuringBulb               int16u
+     26    PF25DefaultClearSettings             int16u
+     27    PF26ShortenReleaseLag                int16u
+     28    PF27ReverseDialRotation              int16u
+     29    PF28NoQuickDialExpComp               int16u
+     30    PF29QuickDialSwitchOff               int16u
+     31    PF30EnlargementMode                  int16u
+     32    PF31OriginalDecisionData             int16u
 
-=head3 Olympus scrn2 Tags
+=head3 CanonCustom PersonalFuncValues Tags
 
-  Index1   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-      2    OlympusPreview                       Olympus scrn
-
-=head3 Olympus scrn Tags
-
-Information extracted from the "scrn" atom of Olympus MP4 videos.
+      1    PF1Value                             int16u
+      2    PF2Value                             int16u
+      3    PF3Value                             int16u
+      4    PF4ExposureTimeMin                   int16u
+      5    PF4ExposureTimeMax                   int16u
+      6    PF5ApertureMin                       int16u
+      7    PF5ApertureMax                       int16u
+      8    PF8BracketShots                      int16u
+      9    PF19ShootingSpeedLow                 int16u
+     10    PF19ShootingSpeedHigh                int16u
+     11    PF20MaxContinousShots                int16u
+     12    PF23ShutterButtonTime                int16u
+     13    PF23FELockTime                       int16u
+     14    PF23PostReleaseTime                  int16u
+     15    PF25AEMode                           int16u
+     16    PF25MeteringMode                     int16u
+     17    PF25DriveMode                        int16u
+     18    PF25AFMode                           int16u
+     19    PF25AFPointSel                       int16u
+     20    PF25ImageSize                        int16u
+     21    PF25WBMode                           int16u
+     22    PF25Parameters                       int16u
+     23    PF25ColorMatrix                      int16u
+     24    PF27Value                            int16u
 
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-      0    PreviewImageLength                   N
-      4    PreviewImage                         N
+=head3 CanonCustom Functions2 Tags
 
-=head3 Olympus thmb2 Tags
+Beginning with the EOS 1D Mark III, Canon finally created a set of custom
+function tags which are (reasonably) consistent across models.  The EOS 1D
+Mark III has 57 custom function tags divided into four main groups: 1.
+Exposure (0x0101-0x010f), 2. Image (0x0201-0x0203), Flash Exposure
+(0x0304-0x0306) and Display (0x0407-0x0409), 3. Auto Focus (0x0501-0x050e)
+and Drive (0x060f-0x0611), and 4. Operation (0x0701-0x070a) and Others
+(0x080b-0x0810).  The table below lists tags used by the EOS 1D Mark III, as
+well as newer tags and values added by later models.
 
-  Index1   Tag Name                             Writable
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      0    ThumbnailWidth                       N
-      2    ThumbnailHeight                      N
-      4    ThumbnailLength                      N
-      8    ThumbnailImage                       N
-
-=head3 Olympus thmb Tags
+  0x0101   ExposureLevelIncrements              int32s
+  0x0102   ISOSpeedIncrements                   int32s
+  0x0103   ISOSpeedRange                        int32s[3]
+           ISOExpansion                         int32s
+  0x0104   AEBAutoCancel                        int32s
+  0x0105   AEBSequence                          int32s
+  0x0106   AEBShotCount                         int32s[n]
+  0x0107   SpotMeterLinkToAFPoint               int32s
+  0x0108   SafetyShift                          int32s
+  0x0109   UsableShootingModes                  int32s[2]
+  0x010a   UsableMeteringModes                  int32s[2]
+  0x010b   ExposureModeInManual                 int32s
+  0x010c   ShutterSpeedRange                    int32s[3]
+  0x010d   ApertureRange                        int32s[3]
+  0x010e   ApplyShootingMeteringMode            int32s[8]
+  0x010f   FlashSyncSpeedAv                     int32s
+  0x0110   FEMicroadjustment                    int32s[3]
+  0x0111   AEMicroadjustment                    int32s[3]
+  0x0201   LongExposureNoiseReduction           int32s
+  0x0202   HighISONoiseReduction                int32s
+  0x0203   HighlightTonePriority                int32s
+  0x0204   AutoLightingOptimizer                int32s
+  0x0304   ETTLII                               int32s
+  0x0305   ShutterCurtainSync                   int32s
+  0x0306   FlashFiring                          int32s
+  0x0407   ViewInfoDuringExposure               int32s
+  0x0408   LCDIlluminationDuringBulb            int32s
+  0x0409   InfoButtonWhenShooting               int32s
+  0x040a   ViewfinderWarnings                   int32s
+  0x040b   LVShootingAreaDisplay                int32s
+  0x0501   USMLensElectronicMF                  int32s
+  0x0502   AIServoTrackingSensitivity           int32s
+  0x0503   AIServoImagePriority                 int32s
+  0x0504   AIServoTrackingMethod                int32s
+  0x0505   LensDriveNoAF                        int32s
+  0x0506   LensAFStopButton                     int32s
+  0x0507   AFMicroadjustment                    int32s[5]
+  0x0508   AFPointAreaExpansion                 int32s
+  0x0509   SelectableAFPoint                    int32s
+  0x050a   SwitchToRegisteredAFPoint            int32s
+  0x050b   AFPointAutoSelection                 int32s
+  0x050c   AFPointDisplayDuringFocus            int32s
+  0x050d   AFPointBrightness                    int32s
+  0x050e   AFAssistBeam                         int32s
+  0x050f   AFPointSelectionMethod               int32s
+  0x0510   VFDisplayIllumination                int32s
+           SuperimposedDisplay                  int32s
+  0x0511   AFDuringLiveView                     int32s
+  0x0512   SelectAFAreaSelectMode               int32s
+  0x0513   ManualAFPointSelectPattern           int32s
+  0x0514   DisplayAllAFPoints                   int32s
+  0x0515   FocusDisplayAIServoAndMF             int32s
+  0x0516   OrientationLinkedAFPoint             int32s
+  0x0517   MultiControllerWhileMetering         int32s
+  0x0518   AccelerationTracking                 int32s
+  0x0519   AIServoFirstImagePriority            int32s
+  0x051a   AIServoSecondImagePriority           int32s
+  0x060f   MirrorLockup                         int32s
+  0x0610   ContinuousShootingSpeed              int32s[3]
+  0x0611   ContinuousShotLimit                  int32s[2]
+  0x0701   Shutter-AELock                       int32s
+           AFAndMeteringButtons                 int32s
+           ShutterButtonAFOnButton              int32s
+  0x0702   AFOnAELockButtonSwitch               int32s
+  0x0703   QuickControlDialInMeter              int32s
+  0x0704   SetButtonWhenShooting                int32s
+  0x0705   ManualTv                             int32s
+  0x0706   DialDirectionTvAv                    int32s
+  0x0707   AvSettingWithoutLens                 int32s
+  0x0708   WBMediaImageSizeSetting              int32s
+  0x0709   LockMicrophoneButton                 int32s
+  0x070a   ButtonFunctionControlOff             int32s
+  0x070b   AssignFuncButton                     int32s
+  0x070c   CustomControls                       int32s
+  0x070d   StartMovieShooting                   int32s
+  0x070e   FlashButtonFunction                  int32s
+  0x070f   MultiFunctionLock                    int32s
+  0x080b   FocusingScreen                       int32s
+  0x080c   TimerLength                          int32s[4]
+  0x080d   ShortReleaseTimeLag                  int32s
+  0x080e   AddAspectRatioInfo                   int32s
+  0x080f   AddOriginalDecisionData              int32s
+  0x0810   LiveViewExposureSimulation           int32s
+  0x0811   LCDDisplayAtPowerOn                  int32s
+  0x0813   DefaultEraseOption                   int32s
 
-Information extracted from the "thmb" atom of Olympus MP4 videos.
+=head2 CanonVRD Tags
 
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-      0    ThumbnailLength                      N
-      4    ThumbnailImage                       N
+Canon Digital Photo Professional writes VRD (Recipe Data) information as a
+trailer record to JPEG, TIFF, CRW and CR2 images, or as a stand-alone VRD
+file.  The tags listed below represent information found in this record.
+The complete VRD data record may be accessed as a block using the Extra
+'CanonVRD' tag, but this tag is not extracted or copied unless specified
+explicitly.
 
-=head3 Olympus OLYM Tags
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  0xffff00f4   EditData                         CanonVRD Edit
+  0xffff00f5   IHLData                          CanonVRD IHL
+  0xffff00f6   XMP                              XMP
 
-Tags found in the OLYM atom of MP4 videos from the TG-810.
+=head3 CanonVRD Edit Tags
 
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-     14    Make                                 N
-     40    Model                                N
-     90    FNumber                              N
-    127    DateTimeOriginal                     N
-    153    DateTime2                            N
-    265    ThumbnailWidth                       N
-    267    ThumbnailHeight                      N
+Canon VRD edit information.
 
-=head3 Olympus AVI Tags
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    VRD1                                 CanonVRD Ver1
+      1    VRDStampTool                         CanonVRD StampTool
+      2    VRD2                                 CanonVRD Ver2
 
-This information is found in Olympus AVI videos.
+=head3 CanonVRD Ver1 Tags
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-     18    Make                                 N
-     44    Model                                N
-     94    FNumber                              N
-    131    DateTime1                            N
-    157    DateTime2                            N
-    297    ThumbInfo                            Olympus thmb2
-
-=head3 Olympus WAV Tags
+      2    VRDVersion                           N
+      6    WBAdjRGGBLevels                      int16u[4]
+     24    WhiteBalanceAdj                      int16u
+     26    WBAdjColorTemp                       int16u
+     36    WBFineTuneActive                     int16u
+     40    WBFineTuneSaturation                 int16u
+     44    WBFineTuneTone                       int16u
+     46    RawColorAdj                          int16u
+     48    RawCustomSaturation                  int32s
+     52    RawCustomTone                        int32s
+     56    RawBrightnessAdj                     int32s
+     60    ToneCurveProperty                    int16u
+    122    DynamicRangeMin                      int16u
+    124    DynamicRangeMax                      int16u
+    272    ToneCurveActive                      int16u
+    275    ToneCurveMode                        int8u
+    276    BrightnessAdj                        int8s
+    277    ContrastAdj                          int8s
+    278    SaturationAdj                        int16s
+    286    ColorToneAdj                         int32s
+    294    LuminanceCurvePoints                 int16u[21]
+    336    LuminanceCurveLimits                 int16u[4]
+    345    ToneCurveInterpolation               int8u
+    352    RedCurvePoints                       int16u[21]
+    394    RedCurveLimits                       int16u[4]
+    410    GreenCurvePoints                     int16u[21]
+    452    GreenCurveLimits                     int16u[4]
+    468    BlueCurvePoints                      int16u[21]
+    510    BlueCurveLimits                      int16u[4]
+    526    RGBCurvePoints                       int16u[21]
+    568    RGBCurveLimits                       int16u[4]
+    580    CropActive                           int16u
+    582    CropLeft                             int16u
+    584    CropTop                              int16u
+    586    CropWidth                            int16u
+    588    CropHeight                           int16u
+    602    SharpnessAdj                         int16u
+    608    CropAspectRatio                      int16u
+    610    ConstrainedCropWidth                 float
+    614    ConstrainedCropHeight                float
+    618    CheckMark                            int16u
+    622    Rotation                             int16u
+    624    WorkColorSpace                       int16u
 
-This information is found in WAV files from Olympus PCM linear recorders
-like the LS-5, LS-10, LS-11.
+=head3 CanonVRD StampTool Tags
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-     12    Model                                N
-     28    FileNumber                           N
-     38    DateTimeOriginal                     N
-     50    DateTimeEnd                          N
-     62    RecordingTime                        N
-    512    Duration                             N
-    522    Index01                              N
-    532    Index02                              N
-    542    Index03                              N
-    552    Index04                              N
-    562    Index05                              N
-    572    Index06                              N
-    582    Index07                              N
-    592    Index08                              N
-    602    Index09                              N
-    612    Index10                              N
-    622    Index11                              N
-    632    Index12                              N
-    642    Index13                              N
-    652    Index14                              N
-    662    Index15                              N
-    672    Index16                              N
+      0    StampToolCount                       N
 
-=head2 Canon Tags
+=head3 CanonVRD Ver2 Tags
 
-  Tag ID   Tag Name                             Writable
+Tags added in DPP version 2.0 and later.
+
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-  0x0001   CanonCameraSettings                  Canon CameraSettings
-  0x0002   CanonFocalLength                     Canon FocalLength
-  0x0003   CanonFlashInfo?                      N
-  0x0004   CanonShotInfo                        Canon ShotInfo
-  0x0005   CanonPanorama                        Canon Panorama
-  0x0006   CanonImageType                       string
-  0x0007   CanonFirmwareVersion                 string
-  0x0008   FileNumber                           int32u
-  0x0009   OwnerName                            string
-  0x000a   UnknownD30                           Canon UnknownD30
-  0x000c   SerialNumber                         int32u
-  0x000d   CanonCameraInfo1D                    Canon CameraInfo1D
-           CanonCameraInfo1DmkII                Canon CameraInfo1DmkII
-           CanonCameraInfo1DmkIIN               Canon CameraInfo1DmkIIN
-           CanonCameraInfo1DmkIII               Canon CameraInfo1DmkIII
-           CanonCameraInfo1DmkIV                Canon CameraInfo1DmkIV
-           CanonCameraInfo1DX                   Canon CameraInfo1DX
-           CanonCameraInfo5D                    Canon CameraInfo5D
-           CanonCameraInfo5DmkII                Canon CameraInfo5DmkII
-           CanonCameraInfo5DmkIII               Canon CameraInfo5DmkIII
-           CanonCameraInfo6D                    Canon CameraInfo6D
-           CanonCameraInfo7D                    Canon CameraInfo7D
-           CanonCameraInfo40D                   Canon CameraInfo40D
-           CanonCameraInfo50D                   Canon CameraInfo50D
-           CanonCameraInfo60D                   Canon CameraInfo60D
-           CanonCameraInfo450D                  Canon CameraInfo450D
-           CanonCameraInfo500D                  Canon CameraInfo500D
-           CanonCameraInfo550D                  Canon CameraInfo550D
-           CanonCameraInfo600D                  Canon CameraInfo600D
-           CanonCameraInfo650D                  Canon CameraInfo650D
-           CanonCameraInfo1000D                 Canon CameraInfo1000D
-           CanonCameraInfo1100D                 Canon CameraInfo600D
-           CanonCameraInfoPowerShot             Canon CameraInfoPowerShot
-           CanonCameraInfoPowerShot2            Canon CameraInfoPowerShot2
-           CanonCameraInfoUnknown32             Canon CameraInfoUnknown32
-           CanonCameraInfoUnknown16             Canon CameraInfoUnknown16
-           CanonCameraInfoUnknown               Canon CameraInfoUnknown
-  0x000e   CanonFileLength                      int32u
-  0x000f   CustomFunctions1D                    CanonCustom Functions1D
-           CustomFunctions5D                    CanonCustom Functions5D
-           CustomFunctions10D                   CanonCustom Functions10D
-           CustomFunctions20D                   CanonCustom Functions20D
-           CustomFunctions30D                   CanonCustom Functions30D
-           CustomFunctions350D                  CanonCustom Functions350D
-           CustomFunctions400D                  CanonCustom Functions400D
-           CustomFunctionsD30                   CanonCustom FunctionsD30
-           CustomFunctionsD60                   CanonCustom FunctionsD30
-           CustomFunctionsUnknown               CanonCustom FuncsUnknown
-  0x0010   CanonModelID                         int32u
-  0x0011   MovieInfo                            Canon MovieInfo
-  0x0012   CanonAFInfo                          Canon AFInfo
-  0x0013   ThumbnailImageValidArea              int16u[4]
-  0x0015   SerialNumberFormat                   int32u
-  0x001a   SuperMacro                           int16u
-  0x001c   DateStampMode                        int16u
-  0x001d   MyColors                             Canon MyColors
-  0x001e   FirmwareRevision                     int32u
-  0x0023   Categories                           int32u[2]
-  0x0024   FaceDetect1                          Canon FaceDetect1
-  0x0025   FaceDetect2                          Canon FaceDetect2
-  0x0026   CanonAFInfo2                         Canon AFInfo2
-  0x0027   ContrastInfo                         Canon ContrastInfo
-  0x0028   ImageUniqueID                        int8u
-  0x002f   FaceDetect3                          Canon FaceDetect3
-  0x0035   TimeInfo                             Canon TimeInfo
-  0x0081   RawDataOffset                        N
-  0x0083   OriginalDecisionDataOffset           int32u*
-  0x0090   CustomFunctions1D                    CanonCustom Functions1D
-  0x0091   PersonalFunctions                    CanonCustom PersonalFuncs
-  0x0092   PersonalFunctionValues               CanonCustom PersonalFuncValues
-  0x0093   CanonFileInfo                        Canon FileInfo
-  0x0094   AFPointsInFocus1D                    N
-  0x0095   LensModel                            string
-  0x0096   SerialInfo                           Canon SerialInfo
-           InternalSerialNumber                 string
-  0x0097   DustRemovalData                      undef!
-  0x0098   CropInfo                             Canon CropInfo
-  0x0099   CustomFunctions2                     CanonCustom Functions2
-  0x009a   AspectInfo                           Canon AspectInfo
-  0x00a0   ProcessingInfo                       Canon Processing
-  0x00a1   ToneCurveTable                       N
-  0x00a2   SharpnessTable                       N
-  0x00a3   SharpnessFreqTable                   N
-  0x00a4   WhiteBalanceTable                    N
-  0x00a9   ColorBalance                         Canon ColorBalance
-  0x00aa   MeasuredColor                        Canon MeasuredColor
-  0x00ae   ColorTemperature                     int16u
-  0x00b0   CanonFlags                           Canon Flags
-  0x00b1   ModifiedInfo                         Canon ModifiedInfo
-  0x00b2   ToneCurveMatching                    N
-  0x00b3   WhiteBalanceMatching                 N
-  0x00b4   ColorSpace                           int16u
-  0x00b6   PreviewImageInfo                     Canon PreviewImageInfo
-  0x00d0   VRDOffset                            int32u*
-  0x00e0   SensorInfo                           Canon SensorInfo
-  0x4001   ColorData1                           Canon ColorData1
-           ColorData2                           Canon ColorData2
-           ColorData3                           Canon ColorData3
-           ColorData4                           Canon ColorData4
-           ColorData5                           Canon ColorData5
-           ColorData6                           Canon ColorData6
-           ColorData7                           Canon ColorData7
-           ColorDataUnknown                     Canon ColorDataUnknown
-  0x4002   CRWParam?                            N
-  0x4003   ColorInfo                            Canon ColorInfo
-  0x4005   Flavor?                              N
-  0x4008   BlackLevel?                          N
-  0x4010   CustomPictureStyleFileName           string
-  0x4013   AFMicroAdj                           Canon AFMicroAdj
-  0x4015   VignettingCorr                       Canon VignettingCorr
-  0x4016   VignettingCorr2                      Canon VignettingCorr2
-  0x4018   LightingOpt                          Canon LightingOpt
-  0x4019   LensInfo                             Canon LensInfo
-  0x4020   AmbienceInfo                         Canon Ambience
-  0x4024   FilterInfo                           Canon FilterInfo
-
-=head3 Canon CameraSettings Tags
-
-  Index2   Tag Name                             Writable
-  ------   --------                             --------
-      1    MacroMode                            int16s
-      2    SelfTimer                            int16s
-      3    Quality                              int16s
-      4    CanonFlashMode                       int16s
-      5    ContinuousDrive                      int16s
-      7    FocusMode                            int16s
-      9    RecordMode                           int16s
-     10    CanonImageSize                       int16s
-     11    EasyMode                             int16s
-     12    DigitalZoom                          int16s
-     13    Contrast                             int16s
-     14    Saturation                           int16s
-     15    Sharpness                            int16s
-     16    CameraISO                            int16s
-     17    MeteringMode                         int16s
-     18    FocusRange                           int16s
-     19    AFPoint                              int16s
-     20    CanonExposureMode                    int16s
-     22    LensType                             int16s
-     23    MaxFocalLength                       int16u
-     24    MinFocalLength                       int16u
-     25    FocalUnits                           int16s
-     26    MaxAperture                          int16s
-     27    MinAperture                          int16s
-     28    FlashActivity                        int16s
-     29    FlashBits                            int16s
-     32    FocusContinuous                      int16s
-     33    AESetting                            int16s
-     34    ImageStabilization                   int16s
-     35    DisplayAperture                      int16s
-     36    ZoomSourceWidth                      int16s
-     37    ZoomTargetWidth                      int16s
-     39    SpotMeteringMode                     int16s
-     40    PhotoEffect                          int16s
-     41    ManualFlashOutput                    int16s
-     42    ColorTone                            int16s
-     46    SRAWQuality                          int16s
-
-=head3 Canon FocalLength Tags
-
-  Index2   Tag Name                             Writable
-  ------   --------                             --------
-      0    FocalType                            int16u
-      1    FocalLength                          int16u
-      2    FocalPlaneXSize                      int16u
-           FocalPlaneXUnknown?                  int16u
-      3    FocalPlaneYSize                      int16u
-           FocalPlaneYUnknown?                  int16u
-
-=head3 Canon ShotInfo Tags
-
-  Index2   Tag Name                             Writable
-  ------   --------                             --------
-      1    AutoISO                              int16s
-      2    BaseISO                              int16s
-      3    MeasuredEV                           int16s
-      4    TargetAperture                       int16s
-      5    TargetExposureTime                   int16s
-      6    ExposureCompensation                 int16s
-      7    WhiteBalance                         int16s
-      8    SlowShutter                          int16s
-      9    SequenceNumber                       int16s
-     10    OpticalZoomCode                      int16s
-     12    CameraTemperature                    int16s
-     13    FlashGuideNumber                     int16s
-     14    AFPointsInFocus                      int16s
-     15    FlashExposureComp                    int16s
-     16    AutoExposureBracketing               int16s
-     17    AEBBracketValue                      int16s
-     18    ControlMode                          int16s
-     19    FocusDistanceUpper                   int16u
-     20    FocusDistanceLower                   int16u
-     21    FNumber                              int16s
-     22    ExposureTime                         int16s
-     23    MeasuredEV2                          int16s
-     24    BulbDuration                         int16s
-     26    CameraType                           int16s
-     27    AutoRotate                           int16s
-     28    NDFilter                             int16s
-     29    SelfTimer2                           int16s
-     33    FlashOutput                          int16s
-
-=head3 Canon Panorama Tags
-
-  Index2   Tag Name                             Writable
-  ------   --------                             --------
-      2    PanoramaFrameNumber                  int16s
-      5    PanoramaDirection                    int16s
-
-=head3 Canon UnknownD30 Tags
-
-  Index2   Tag Name                             Writable
-  ------   --------                             --------
-  [no tags known]
-
-=head3 Canon CameraInfo1D Tags
-
-Information in the "CameraInfo" records is tricky to decode because the
-encodings are very different than in other Canon records (even sometimes
-switching endianness between values within a single camera), plus there is
-considerable variation in format from model to model. The first table below
-lists CameraInfo tags for the 1D and 1DS.
-
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-      4    ExposureTime                         int8u
-     10    FocalLength                          int16u
-     13    LensType                             int16uRev
-     14    MinFocalLength                       int16u
-     16    MaxFocalLength                       int16u
-     65    SharpnessFrequency                   int8u
-     66    Sharpness                            int8s
-     68    WhiteBalance                         int8u
-     71    SharpnessFrequency                   int8u
-     72    ColorTemperature                     int16u
-           Sharpness                            int8s
-     74    WhiteBalance                         int8u
-     75    PictureStyle                         int8u
-     78    ColorTemperature                     int16u
-     81    PictureStyle                         int8u
-
-=head3 Canon CameraInfo1DmkII Tags
-
-CameraInfo tags for the 1DmkII and 1DSmkII.
-
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-      4    ExposureTime                         int8u
-      9    FocalLength                          int16uRev
-     12    LensType                             int16uRev
-     17    MinFocalLength                       int16uRev
-     19    MaxFocalLength                       int16uRev
-     45    FocalType                            int8u
-     54    WhiteBalance                         int8u
-     55    ColorTemperature                     int16uRev
-     57    CanonImageSize                       int16u
-    102    JPEGQuality                          int8u
-    108    PictureStyle                         int8u
-    110    Saturation                           int8s
-    111    ColorTone                            int8s
-    114    Sharpness                            int8s
-    115    Contrast                             int8s
-    117    ISO                                  string[5]
-
-=head3 Canon CameraInfo1DmkIIN Tags
-
-CameraInfo tags for the 1DmkIIN.
-
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-      4    ExposureTime                         int8u
-      9    FocalLength                          int16uRev
-     12    LensType                             int16uRev
-     17    MinFocalLength                       int16uRev
-     19    MaxFocalLength                       int16uRev
-     54    WhiteBalance                         int8u
-     55    ColorTemperature                     int16uRev
-    115    PictureStyle                         int8u
-    116    Sharpness                            int8s
-    117    Contrast                             int8s
-    118    Saturation                           int8s
-    119    ColorTone                            int8s
-    121    ISO                                  string[5]
-
-=head3 Canon CameraInfo1DmkIII Tags
-
-CameraInfo tags for the 1DmkIII and 1DSmkIII.
-
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-      3    FNumber                              int8u
-      4    ExposureTime                         int8u
-      6    ISO                                  int8u
-     24    CameraTemperature                    int8u
-     27    MacroMagnification                   int8u
-     29    FocalLength                          int16uRev
-     48    CameraOrientation                    int8u
-     67    FocusDistanceUpper                   int16uRev
-     69    FocusDistanceLower                   int16uRev
-     94    WhiteBalance                         int16u
-     98    ColorTemperature                     int16u
-    134    PictureStyle                         int8u
-    273    LensType                             int16uRev
-    275    MinFocalLength                       int16uRev
-    277    MaxFocalLength                       int16uRev
-    310    FirmwareVersion                      string[6]
-    370    FileIndex                            int32u
-    374    ShutterCount                         int32u
-    382    DirectoryIndex                       int32u
-    682    PictureStyleInfo                     Canon PSInfo
-   1114    TimeStamp1                           int32u
-   1118    TimeStamp                            int32u
-
-=head3 Canon PSInfo Tags
-
-Custom picture style information for various models.
-
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-      0    ContrastStandard                     int32s
-      4    SharpnessStandard                    int32s
-      8    SaturationStandard                   int32s
-     12    ColorToneStandard                    int32s
-     16    FilterEffectStandard?                int32s
-     20    ToningEffectStandard?                int32s
-     24    ContrastPortrait                     int32s
-     28    SharpnessPortrait                    int32s
-     32    SaturationPortrait                   int32s
-     36    ColorTonePortrait                    int32s
-     40    FilterEffectPortrait?                int32s
-     44    ToningEffectPortrait?                int32s
-     48    ContrastLandscape                    int32s
-     52    SharpnessLandscape                   int32s
-     56    SaturationLandscape                  int32s
-     60    ColorToneLandscape                   int32s
-     64    FilterEffectLandscape?               int32s
-     68    ToningEffectLandscape?               int32s
-     72    ContrastNeutral                      int32s
-     76    SharpnessNeutral                     int32s
-     80    SaturationNeutral                    int32s
-     84    ColorToneNeutral                     int32s
-     88    FilterEffectNeutral?                 int32s
-     92    ToningEffectNeutral?                 int32s
-     96    ContrastFaithful                     int32s
-    100    SharpnessFaithful                    int32s
-    104    SaturationFaithful                   int32s
-    108    ColorToneFaithful                    int32s
-    112    FilterEffectFaithful?                int32s
-    116    ToningEffectFaithful?                int32s
-    120    ContrastMonochrome                   int32s
-    124    SharpnessMonochrome                  int32s
-    128    SaturationMonochrome?                int32s
-    132    ColorToneMonochrome?                 int32s
-    136    FilterEffectMonochrome               int32s
-    140    ToningEffectMonochrome               int32s
-    144    ContrastUserDef1                     int32s
-    148    SharpnessUserDef1                    int32s
-    152    SaturationUserDef1                   int32s
-    156    ColorToneUserDef1                    int32s
-    160    FilterEffectUserDef1                 int32s
-    164    ToningEffectUserDef1                 int32s
-    168    ContrastUserDef2                     int32s
-    172    SharpnessUserDef2                    int32s
-    176    SaturationUserDef2                   int32s
-    180    ColorToneUserDef2                    int32s
-    184    FilterEffectUserDef2                 int32s
-    188    ToningEffectUserDef2                 int32s
-    192    ContrastUserDef3                     int32s
-    196    SharpnessUserDef3                    int32s
-    200    SaturationUserDef3                   int32s
-    204    ColorToneUserDef3                    int32s
-    208    FilterEffectUserDef3                 int32s
-    212    ToningEffectUserDef3                 int32s
-    216    UserDef1PictureStyle                 int16u
-    218    UserDef2PictureStyle                 int16u
-    220    UserDef3PictureStyle                 int16u
-
-=head3 Canon CameraInfo1DmkIV Tags
+      2    PictureStyle                         int16s
+      3    IsCustomPictureStyle                 int16s
+     13    StandardRawColorTone                 int16s
+     14    StandardRawSaturation                int16s
+     15    StandardRawContrast                  int16s
+     16    StandardRawLinear                    int16s
+     17    StandardRawSharpness                 int16s
+     18    StandardRawHighlightPoint            int16s
+     19    StandardRawShadowPoint               int16s
+     20    StandardOutputHighlightPoint         int16s
+     21    StandardOutputShadowPoint            int16s
+     22    PortraitRawColorTone                 int16s
+     23    PortraitRawSaturation                int16s
+     24    PortraitRawContrast                  int16s
+     25    PortraitRawLinear                    int16s
+     26    PortraitRawSharpness                 int16s
+     27    PortraitRawHighlightPoint            int16s
+     28    PortraitRawShadowPoint               int16s
+     29    PortraitOutputHighlightPoint         int16s
+     30    PortraitOutputShadowPoint            int16s
+     31    LandscapeRawColorTone                int16s
+     32    LandscapeRawSaturation               int16s
+     33    LandscapeRawContrast                 int16s
+     34    LandscapeRawLinear                   int16s
+     35    LandscapeRawSharpness                int16s
+     36    LandscapeRawHighlightPoint           int16s
+     37    LandscapeRawShadowPoint              int16s
+     38    LandscapeOutputHighlightPoint        int16s
+     39    LandscapeOutputShadowPoint           int16s
+     40    NeutralRawColorTone                  int16s
+     41    NeutralRawSaturation                 int16s
+     42    NeutralRawContrast                   int16s
+     43    NeutralRawLinear                     int16s
+     44    NeutralRawSharpness                  int16s
+     45    NeutralRawHighlightPoint             int16s
+     46    NeutralRawShadowPoint                int16s
+     47    NeutralOutputHighlightPoint          int16s
+     48    NeutralOutputShadowPoint             int16s
+     49    FaithfulRawColorTone                 int16s
+     50    FaithfulRawSaturation                int16s
+     51    FaithfulRawContrast                  int16s
+     52    FaithfulRawLinear                    int16s
+     53    FaithfulRawSharpness                 int16s
+     54    FaithfulRawHighlightPoint            int16s
+     55    FaithfulRawShadowPoint               int16s
+     56    FaithfulOutputHighlightPoint         int16s
+     57    FaithfulOutputShadowPoint            int16s
+     58    MonochromeFilterEffect               int16s
+     59    MonochromeToningEffect               int16s
+     60    MonochromeContrast                   int16s
+     61    MonochromeLinear                     int16s
+     62    MonochromeSharpness                  int16s
+     63    MonochromeRawHighlightPoint          int16s
+     64    MonochromeRawShadowPoint             int16s
+     65    MonochromeOutputHighlightPoint       int16s
+     66    MonochromeOutputShadowPoint          int16s
+     69    UnknownContrast?                     int16s
+     70    UnknownLinear?                       int16s
+     71    UnknownSharpness?                    int16s
+     72    UnknownRawHighlightPoint?            int16s
+     73    UnknownRawShadowPoint?               int16s
+     74    UnknownOutputHighlightPoint?         int16s
+     75    UnknownOutputShadowPoint?            int16s
+     78    CustomContrast                       int16s
+     79    CustomLinear                         int16s
+     80    CustomSharpness                      int16s
+     81    CustomRawHighlightPoint              int16s
+     82    CustomRawShadowPoint                 int16s
+     83    CustomOutputHighlightPoint           int16s
+     84    CustomOutputShadowPoint              int16s
+     88    CustomPictureStyleData               N
+     94    ChrominanceNoiseReduction            int16s
+     95    LuminanceNoiseReduction              int16s
+     96    ChrominanceNR_TIFF_JPEG              int16s
+     98    ChromaticAberrationOn                int16s
+     99    DistortionCorrectionOn               int16s
+    100    PeripheralIlluminationOn             int16s
+    101    ColorBlur                            int16s
+    102    ChromaticAberration                  int16s
+    103    DistortionCorrection                 int16s
+    104    PeripheralIllumination               int16s
+    105    AberrationCorrectionDistance         int16s
+    106    ChromaticAberrationRed               int16s
+    107    ChromaticAberrationBlue              int16s
+    109    LuminanceNR_TIFF_JPEG                int16s
+    110    AutoLightingOptimizerOn              int16s
+    111    AutoLightingOptimizer                int16s
+    117    StandardRawHighlight                 int16s
+    118    PortraitRawHighlight                 int16s
+    119    LandscapeRawHighlight                int16s
+    120    NeutralRawHighlight                  int16s
+    121    FaithfulRawHighlight                 int16s
+    122    MonochromeRawHighlight               int16s
+    123    UnknownRawHighlight?                 int16s
+    124    CustomRawHighlight                   int16s
+    126    StandardRawShadow                    int16s
+    127    PortraitRawShadow                    int16s
+    128    LandscapeRawShadow                   int16s
+    129    NeutralRawShadow                     int16s
+    130    FaithfulRawShadow                    int16s
+    131    MonochromeRawShadow                  int16s
+    132    UnknownRawShadow?                    int16s
+    133    CustomRawShadow                      int16s
+    139    AngleAdj                             int32s
+    142    CheckMark2                           int16u
+    144    UnsharpMask                          int16s
+    146    StandardUnsharpMaskStrength          int16s
+    148    StandardUnsharpMaskFineness          int16s
+    150    StandardUnsharpMaskThreshold         int16s
+    152    PortraitUnsharpMaskStrength          int16s
+    154    PortraitUnsharpMaskFineness          int16s
+    156    PortraitUnsharpMaskThreshold         int16s
+    158    LandscapeUnsharpMaskStrength         int16s
+    160    LandscapeUnsharpMaskFineness         int16s
+    162    LandscapeUnsharpMaskThreshold        int16s
+    164    NeutraUnsharpMaskStrength            int16s
+    166    NeutralUnsharpMaskFineness           int16s
+    168    NeutralUnsharpMaskThreshold          int16s
+    170    FaithfulUnsharpMaskStrength          int16s
+    172    FaithfulUnsharpMaskFineness          int16s
+    174    FaithfulUnsharpMaskThreshold         int16s
+    176    MonochromeUnsharpMaskStrength        int16s
+    178    MonochromeUnsharpMaskFineness        int16s
+    180    MonochromeUnsharpMaskThreshold       int16s
+    182    CustomUnsharpMaskStrength            int16s
+    184    CustomUnsharpMaskFineness            int16s
+    186    CustomUnsharpMaskThreshold           int16s
+    188    CustomDefaultUnsharpStrength         int16s
+    190    CustomDefaultUnsharpFineness         int16s
+    192    CustomDefaultUnsharpThreshold        int16s
+    214    CropCircleActive                     int16s
+    215    CropCircleX                          int16s
+    216    CropCircleY                          int16s
+    217    CropCircleRadius                     int16s
+    220    DLOOn                                int16s
+    221    DLOSetting                           int16s
+    222    DLOShootingDistance                  int16s
+    223    DLODataLength                        N
+    228    DLOSettingApplied                    int16s
+    229    DLOVersion                           string[10]
+    234    DLOData                              N
 
-CameraInfo tags for the EOS 1D Mark IV.  Indices shown are for firmware
-versions 1.0.x, but they may be different for other firmware versions.
+=head3 CanonVRD IHL Tags
 
-  Index1   Tag Name                             Writable
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      3    FNumber                              int8u
-      4    ExposureTime                         int8u
-      6    ISO                                  int8u
-      7    HighlightTonePriority                int8u
-      8    MeasuredEV2                          int8u
-      9    MeasuredEV3                          int8u
-     21    FlashMeteringMode                    int8u
-     25    CameraTemperature                    int8u
-     30    FocalLength                          int16uRev
-     53    CameraOrientation                    int8u
-     84    FocusDistanceUpper                   int16uRev
-     86    FocusDistanceLower                   int16uRev
-    120    WhiteBalance                         int16u
-    124    ColorTemperature                     int16u
-    335    LensType                             int16uRev
-    337    MinFocalLength                       int16uRev
-    339    MaxFocalLength                       int16uRev
-    493    FirmwareVersion                      N
-    556    FileIndex                            int32u
-    568    DirectoryIndex                       int32u
-    872    PictureStyleInfo                     Canon PSInfo
-
-=head3 Canon CameraInfo1DX Tags
+  0x0001   IHL_EXIF                             EXIF
+           IHL_EXIF?                            N
+  0x0003   ThumbnailImage                       N
+  0x0004   PreviewImage                         N
+  0x0005   RawCodecVersion                      N
+  0x0006   CRCDevelParams?                      N
 
-CameraInfo tags for the EOS 1D X.  Indices shown are for firmware version
-1.0.2, but they may be different for other firmware versions.
+=head2 Casio Tags
 
-  Index1   Tag Name                             Writable
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      3    FNumber                              int8u
-      4    ExposureTime                         int8u
-      6    ISO                                  int8u
-     27    CameraTemperature                    int8u
-     35    FocalLength                          int16uRev
-    125    CameraOrientation                    int8u
-    140    FocusDistanceUpper                   int16uRev
-    142    FocusDistanceLower                   int16uRev
-    188    WhiteBalance                         int16u
-    192    ColorTemperature                     int16u
-    244    PictureStyle                         int8u
-    423    LensType                             int16uRev
-    425    MinFocalLength                       int16uRev
-    427    MaxFocalLength                       int16uRev
-    640    FirmwareVersion                      N
-    720    FileIndex                            int32u
-    732    DirectoryIndex                       int32u
-   1012    PictureStyleInfo                     Canon PSInfo2
-
-=head3 Canon PSInfo2 Tags
+  0x0001   RecordingMode                        int16u
+  0x0002   Quality                              int16u
+  0x0003   FocusMode                            int16u
+  0x0004   FlashMode                            int16u
+  0x0005   FlashIntensity                       int16u
+  0x0006   ObjectDistance                       int32u
+  0x0007   WhiteBalance                         int16u
+  0x000a   DigitalZoom                          int32u
+  0x000b   Sharpness                            int16u
+  0x000c   Contrast                             int16u
+  0x000d   Saturation                           int16u
+  0x0014   ISO                                  int16u
+  0x0015   FirmwareDate                         string[18]
+  0x0016   Enhancement                          int16u
+  0x0017   ColorFilter                          int16u
+  0x0018   AFPoint                              int16u
+  0x0019   FlashIntensity                       int16u
+  0x0e00   PrintIM                              PrintIM
 
-Custom picture style information for the EOS 5DmkIII, 60D, 600D and 1100D.
+=head3 Casio Type2 Tags
 
-  Index1   Tag Name                             Writable
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      0    ContrastStandard                     int32s
-      4    SharpnessStandard                    int32s
-      8    SaturationStandard                   int32s
-     12    ColorToneStandard                    int32s
-     16    FilterEffectStandard?                int32s
-     20    ToningEffectStandard?                int32s
-     24    ContrastPortrait                     int32s
-     28    SharpnessPortrait                    int32s
-     32    SaturationPortrait                   int32s
-     36    ColorTonePortrait                    int32s
-     40    FilterEffectPortrait?                int32s
-     44    ToningEffectPortrait?                int32s
-     48    ContrastLandscape                    int32s
-     52    SharpnessLandscape                   int32s
-     56    SaturationLandscape                  int32s
-     60    ColorToneLandscape                   int32s
-     64    FilterEffectLandscape?               int32s
-     68    ToningEffectLandscape?               int32s
-     72    ContrastNeutral                      int32s
-     76    SharpnessNeutral                     int32s
-     80    SaturationNeutral                    int32s
-     84    ColorToneNeutral                     int32s
-     88    FilterEffectNeutral?                 int32s
-     92    ToningEffectNeutral?                 int32s
-     96    ContrastFaithful                     int32s
-    100    SharpnessFaithful                    int32s
-    104    SaturationFaithful                   int32s
-    108    ColorToneFaithful                    int32s
-    112    FilterEffectFaithful?                int32s
-    116    ToningEffectFaithful?                int32s
-    120    ContrastMonochrome                   int32s
-    124    SharpnessMonochrome                  int32s
-    128    SaturationMonochrome?                int32s
-    132    ColorToneMonochrome?                 int32s
-    136    FilterEffectMonochrome               int32s
-    140    ToningEffectMonochrome               int32s
-    144    ContrastUnknown?                     int32s
-    148    SharpnessUnknown?                    int32s
-    152    SaturationUnknown?                   int32s
-    156    ColorToneUnknown?                    int32s
-    160    FilterEffectUnknown?                 int32s
-    164    ToningEffectUnknown?                 int32s
-    168    ContrastUserDef1                     int32s
-    172    SharpnessUserDef1                    int32s
-    176    SaturationUserDef1                   int32s
-    180    ColorToneUserDef1                    int32s
-    184    FilterEffectUserDef1                 int32s
-    188    ToningEffectUserDef1                 int32s
-    192    ContrastUserDef2                     int32s
-    196    SharpnessUserDef2                    int32s
-    200    SaturationUserDef2                   int32s
-    204    ColorToneUserDef2                    int32s
-    208    FilterEffectUserDef2                 int32s
-    212    ToningEffectUserDef2                 int32s
-    216    ContrastUserDef3                     int32s
-    220    SharpnessUserDef3                    int32s
-    224    SaturationUserDef3                   int32s
-    228    ColorToneUserDef3                    int32s
-    232    FilterEffectUserDef3                 int32s
-    236    ToningEffectUserDef3                 int32s
-    240    UserDef1PictureStyle                 int16u
-    242    UserDef2PictureStyle                 int16u
-    244    UserDef3PictureStyle                 int16u
+  0x0002   PreviewImageSize                     int16u[2]
+  0x0003   PreviewImageLength                   int32u*
+  0x0004   PreviewImageStart                    int32u*
+  0x0008   QualityMode                          int16u
+  0x0009   CasioImageSize                       int16u
+  0x000d   FocusMode                            int16u
+  0x0014   ISO                                  int16u
+  0x0019   WhiteBalance                         int16u
+  0x001d   FocalLength                          rational64u
+  0x001f   Saturation                           int16u
+  0x0020   Contrast                             int16u
+  0x0021   Sharpness                            int16u
+  0x0e00   PrintIM                              PrintIM
+  0x2000   PreviewImage                         undef
+  0x2001   FirmwareDate                         string[18]
+  0x2011   WhiteBalanceBias                     int16u[2]
+  0x2012   WhiteBalance                         int16u
+  0x2021   AFPointPosition                      int16u[4]~
+  0x2022   ObjectDistance                       int32u
+  0x2034   FlashDistance                        int16u
+  0x2076   SpecialEffectMode                    int8u[3]
+  0x2089   FaceInfo1                            Casio FaceInfo1
+           FaceInfo2                            Casio FaceInfo2
+           FaceInfoUnknown?                     Y
+  0x211c   FacesDetected                        int8u
+  0x3000   RecordMode                           int16u
+  0x3001   ReleaseMode                          int16u
+  0x3002   Quality                              int16u
+  0x3003   FocusMode                            int16u
+  0x3006   HometownCity                         string
+  0x3007   BestShotMode                         int16u
+  0x3008   AutoISO                              int16u
+  0x3009   AFMode                               int16u
+  0x3011   Sharpness                            undef[2]
+  0x3012   Contrast                             undef[2]
+  0x3013   Saturation                           undef[2]
+  0x3014   ISO                                  int16u
+  0x3015   ColorMode                            int16u
+  0x3016   Enhancement                          int16u
+  0x3017   ColorFilter                          int16u
+  0x301b   ArtMode                              int16u
+  0x301c   SequenceNumber                       int16u
+  0x301d   BracketSequence                      int16u[2]
+  0x3020   ImageStabilization                   int16u
+  0x302a   LightingMode                         int16u
+  0x302b   PortraitRefiner                      int16u
+  0x3030   SpecialEffectLevel                   int16u
+  0x3031   SpecialEffectSetting                 int16u
+  0x3103   DriveMode                            int16u
+  0x310b   ArtModeParameters                    int8u[3]
+  0x4001   CaptureFrameRate                     int16u[n]
+  0x4003   VideoQuality                         int16u
 
-=head3 Canon CameraInfo5D Tags
+=head3 Casio FaceInfo1 Tags
 
-CameraInfo tags for the EOS 5D.
+Face-detect tags extracted from models such as the EX-H5.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      3    FNumber                              int8u
-      4    ExposureTime                         int8u
-      6    ISO                                  int8u
-     12    LensType                             int16uRev
-     23    CameraTemperature                    int8u
-     27    MacroMagnification                   int8s
-     39    CameraOrientation                    int8s
-     40    FocalLength                          int16uRev
-     56    AFPointsInFocus5D                    int16uRev
-     84    WhiteBalance                         int16u
-     88    ColorTemperature                     int16u
-    108    PictureStyle                         int8u
-    147    MinFocalLength                       int16uRev
-    149    MaxFocalLength                       int16uRev
-    151    LensType                             int16uRev
-    164    FirmwareRevision                     string[8]
-    172    ShortOwnerName                       string[16]
-    204    DirectoryIndex                       int32u
-    208    FileIndex                            int16u
-    232    ContrastStandard                     int8s
-    233    ContrastPortrait                     int8s
-    234    ContrastLandscape                    int8s
-    235    ContrastNeutral                      int8s
-    236    ContrastFaithful                     int8s
-    237    ContrastMonochrome                   int8s
-    238    ContrastUserDef1                     int8s
-    239    ContrastUserDef2                     int8s
-    240    ContrastUserDef3                     int8s
-    241    SharpnessStandard                    int8s
-    242    SharpnessPortrait                    int8s
-    243    SharpnessLandscape                   int8s
-    244    SharpnessNeutral                     int8s
-    245    SharpnessFaithful                    int8s
-    246    SharpnessMonochrome                  int8s
-    247    SharpnessUserDef1                    int8s
-    248    SharpnessUserDef2                    int8s
-    249    SharpnessUserDef3                    int8s
-    250    SaturationStandard                   int8s
-    251    SaturationPortrait                   int8s
-    252    SaturationLandscape                  int8s
-    253    SaturationNeutral                    int8s
-    254    SaturationFaithful                   int8s
-    255    FilterEffectMonochrome               int8s
-    256    SaturationUserDef1                   int8s
-    257    SaturationUserDef2                   int8s
-    258    SaturationUserDef3                   int8s
-    259    ColorToneStandard                    int8s
-    260    ColorTonePortrait                    int8s
-    261    ColorToneLandscape                   int8s
-    262    ColorToneNeutral                     int8s
-    263    ColorToneFaithful                    int8s
-    264    ToningEffectMonochrome               int8s
-    265    ColorToneUserDef1                    int8s
-    266    ColorToneUserDef2                    int8s
-    267    ColorToneUserDef3                    int8s
-    268    UserDef1PictureStyle                 int16u
-    270    UserDef2PictureStyle                 int16u
-    272    UserDef3PictureStyle                 int16u
-    284    TimeStamp                            int32u
+      0    FacesDetected                        int8u
+      1    FaceDetectFrameSize                  int16u[2]
+     13    Face1Position                        int16u[4]
+    124    Face2Position                        int16u[4]
+    235    Face3Position                        int16u[4]
+    346    Face4Position                        int16u[4]
+    457    Face5Position                        int16u[4]
+    568    Face6Position                        int16u[4]
+    679    Face7Position                        int16u[4]
+    790    Face8Position                        int16u[4]
+    901    Face9Position                        int16u[4]
+   1012    Face10Position                       int16u[4]
 
-=head3 Canon CameraInfo5DmkII Tags
+=head3 Casio FaceInfo2 Tags
 
-CameraInfo tags for the EOS 5D Mark II.  Indices shown are for firmware
-version 1.0.6, but they may be different for other firmware versions.
+Face-detect tags extracted from models such as the EX-H20G and EX-ZR100.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      3    FNumber                              int8u
-      4    ExposureTime                         int8u
-      6    ISO                                  int8u
-      7    HighlightTonePriority                int8u
-     21    FlashMeteringMode                    int8u
-     25    CameraTemperature                    int8u
-     27    MacroMagnification                   int8u
-     30    FocalLength                          int16uRev
-     49    CameraOrientation                    int8u
-     80    FocusDistanceUpper                   int16uRev
-     82    FocusDistanceLower                   int16uRev
-    111    WhiteBalance                         int16u
-    115    ColorTemperature                     int16u
-    167    PictureStyle                         int8u
-    189    HighISONoiseReduction                int8u
-    191    AutoLightingOptimizer                int8u
-    230    LensType                             int16uRev
-    232    MinFocalLength                       int16uRev
-    234    MaxFocalLength                       int16uRev
-    382    FirmwareVersion                      N
-    443    FileIndex                            int32u
-    455    DirectoryIndex                       int32u
-    759    PictureStyleInfo                     Canon PSInfo
+      2    FacesDetected                        int8u
+      4    FaceDetectFrameSize                  int16u[2]
+      8    FaceOrientation                      int8u
+     24    Face1Position                        int16u[4]
+     76    Face2Position                        int16u[4]
+    128    Face3Position                        int16u[4]
+    180    Face4Position                        int16u[4]
+    232    Face5Position                        int16u[4]
+    284    Face6Position                        int16u[4]
+    336    Face7Position                        int16u[4]
+    388    Face8Position                        int16u[4]
+    440    Face9Position                        int16u[4]
+    492    Face10Position                       int16u[4]
 
-=head3 Canon CameraInfo5DmkIII Tags
+=head3 Casio QVCI Tags
 
-CameraInfo tags for the EOS 5D Mark III.  Indices shown are for firmware
-versions 1.0.x, but they may be different for other firmware versions.
+This information is found in the APP1 QVCI segment of JPEG images from the
+Casio QV-7000SX.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      3    FNumber                              int8u
-      4    ExposureTime                         int8u
-      6    ISO                                  int8u
-     27    CameraTemperature                    int8u
-     35    FocalLength                          int16uRev
-    125    CameraOrientation                    int8u
-    140    FocusDistanceUpper                   int16uRev
-    142    FocusDistanceLower                   int16uRev
-    188    WhiteBalance                         int16u
-    192    ColorTemperature                     int16u
-    244    PictureStyle                         int8u
-    339    LensType                             int16uRev
-    341    MinFocalLength                       int16uRev
-    343    MaxFocalLength                       int16uRev
-    572    FirmwareVersion                      N
-    652    FileIndex                            int32u
-    656    FileIndex2                           int32u
-    664    DirectoryIndex                       int32u
-    668    DirectoryIndex2                      int32u
-    944    PictureStyleInfo                     Canon PSInfo2
+     44    CasioQuality                         N
+     55    FocalRange?                          N
+     77    DateTimeOriginal                     N
+     98    ModelType                            N
+    114    ManufactureIndex                     N
+    124    ManufactureCode                      N
 
-=head3 Canon CameraInfo6D Tags
+=head3 Casio AVI Tags
 
-CameraInfo tags for the EOS 6D.
+This information is found in Casio GV-10 AVI videos.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      3    FNumber                              int8u
-      4    ExposureTime                         int8u
-      6    ISO                                  int8u
-     27    CameraTemperature                    int8u
-     35    FocalLength                          int16uRev
-    131    CameraOrientation                    int8u
-    146    FocusDistanceUpper                   int16uRev
-    148    FocusDistanceLower                   int16uRev
-    194    WhiteBalance                         int16u
-    198    ColorTemperature                     int16u
-    250    PictureStyle                         int8u
-    353    LensType                             int16uRev
-    355    MinFocalLength                       int16uRev
-    357    MaxFocalLength                       int16uRev
-    598    FirmwareVersion                      N
-    682    FileIndex                            int32u
-    694    DirectoryIndex                       int32u
-    966    PictureStyleInfo                     Canon PSInfo2
+      0    Software                             N
 
-=head3 Canon CameraInfo7D Tags
+=head2 FLIR Tags
 
-CameraInfo tags for the EOS 7D.  Indices shown are for firmware versions
-1.0.x, but they may be different for other firmware versions.
+Information extracted from the maker notes of JPEG images from thermal
+imaging cameras by FLIR Systems Inc.
 
-  Index1   Tag Name                             Writable
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      3    FNumber                              int8u
-      4    ExposureTime                         int8u
-      6    ISO                                  int8u
-      7    HighlightTonePriority                int8u
-      8    MeasuredEV2                          int8u
-      9    MeasuredEV                           int8u
-     21    FlashMeteringMode                    int8u
-     25    CameraTemperature                    int8u
-     30    FocalLength                          int16uRev
-     53    CameraOrientation                    int8u
-     84    FocusDistanceUpper                   int16uRev
-     86    FocusDistanceLower                   int16uRev
-    119    WhiteBalance                         int16u
-    123    ColorTemperature                     int16u
-    201    HighISONoiseReduction                int8u
-    274    LensType                             int16uRev
-    276    MinFocalLength                       int16uRev
-    278    MaxFocalLength                       int16uRev
-    428    FirmwareVersion                      N
-    491    FileIndex                            int32u
-    503    DirectoryIndex                       int32u
-    807    PictureStyleInfo                     Canon PSInfo
+  0x0001   ImageTemperatureMax                  rational64u
+  0x0002   ImageTemperatureMin                  rational64u
+  0x0003   Emissivity                           rational64u
+  0x0004   UnknownTemperature?                  rational64u
+  0x0005   CameraTemperatureRangeMax?           rational64u
+  0x0006   CameraTemperatureRangeMin?           rational64u
+
+=head3 FLIR FFF Tags
+
+Information extracted from FLIR FFF images and the FLIR APP1 segment of JPEG
+images.  These tags may also be extracted from the first frame of an FLIR
+SEQ file, even though SEQ is not listed as a supported file type.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0001   RawData                              FLIR RawData
+  0x0005   GainDeadData                         FLIR GainDeadData
+  0x0006   CoarseData                           FLIR CoarseData
+  0x000e   EmbeddedImage                        FLIR EmbeddedImage
+  0x0020   CameraInfo                           FLIR CameraInfo
+  0x0021   MeasurementInfo                      FLIR MeasInfo
+  0x0022   PaletteInfo                          FLIR PaletteInfo
+  0x0023   TextInfo                             FLIR TextInfo
+  0x0024   EmbeddedAudioFile                    N
+  0x0028   PaintData                            FLIR PaintData
+  0x002a   PiP                                  FLIR PiP
+  0x002b   GPSInfo                              FLIR GPSInfo
+  0x002c   MeterLink                            FLIR MeterLink
+  0x002e   ParameterInfo                        FLIR ParamInfo
+
+=head3 FLIR RawData Tags
+
+The thermal image data may be stored either as raw data, or in PNG format.
+If stored as raw data, ExifTool adds a TIFF header to allow the data to be
+viewed as a TIFF image.  If stored in PNG format, the PNG image is extracted
+as-is.  Note that most FLIR cameras using the PNG format seem to write the
+16-bit raw image data in the wrong byte order.
+
+  Index2   Tag Name                             Writable
+  ------   --------                             --------
+      1    RawThermalImageWidth                 N
+      2    RawThermalImageHeight                N
+     16    RawThermalImageType                  N
+   16.1    RawThermalImage                      N
 
-=head3 Canon CameraInfo40D Tags
+=head3 FLIR GainDeadData Tags
 
-CameraInfo tags for the EOS 40D.
+Information found in FFF-format .GAN calibration image files.
 
-  Index1   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-      3    FNumber                              int8u
-      4    ExposureTime                         int8u
-      6    ISO                                  int8u
-     21    FlashMeteringMode                    int8u
-     24    CameraTemperature                    int8u
-     27    MacroMagnification                   int8u
-     29    FocalLength                          int16uRev
-     48    CameraOrientation                    int8u
-     67    FocusDistanceUpper                   int16uRev
-     69    FocusDistanceLower                   int16uRev
-    111    WhiteBalance                         int16u
-    115    ColorTemperature                     int16u
-    214    LensType                             int16uRev
-    216    MinFocalLength                       int16uRev
-    218    MaxFocalLength                       int16uRev
-    255    FirmwareVersion                      string[6]
-    307    FileIndex                            int32u
-    319    DirectoryIndex                       int32u
-    603    PictureStyleInfo                     Canon PSInfo
-   2347    LensModel                            string[64]
+      1    GainDeadMapImageWidth                N
+      2    GainDeadMapImageHeight               N
+     16    GainDeadMapImageType                 N
+   16.1    GainDeadMapImage                     N
 
-=head3 Canon CameraInfo50D Tags
+=head3 FLIR CoarseData Tags
 
-CameraInfo tags for the EOS 50D.  Indices shown are for firmware versions
-1.0.x, but they may be different for other firmware versions.
+Information found in FFF-format .CRS correction image files.
 
-  Index1   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-      3    FNumber                              int8u
-      4    ExposureTime                         int8u
-      6    ISO                                  int8u
-      7    HighlightTonePriority                int8u
-     21    FlashMeteringMode                    int8u
-     25    CameraTemperature                    int8u
-     30    FocalLength                          int16uRev
-     49    CameraOrientation                    int8u
-     80    FocusDistanceUpper                   int16uRev
-     82    FocusDistanceLower                   int16uRev
-    111    WhiteBalance                         int16u
-    115    ColorTemperature                     int16u
-    167    PictureStyle                         int8u
-    189    HighISONoiseReduction                int8u
-    191    AutoLightingOptimizer                int8u
-    234    LensType                             int16uRev
-    236    MinFocalLength                       int16uRev
-    238    MaxFocalLength                       int16uRev
-    350    FirmwareVersion                      N
-    411    FileIndex                            int32u
-    423    DirectoryIndex                       int32u
-    727    PictureStyleInfo                     Canon PSInfo
+      1    CoarseMapImageWidth                  N
+      2    CoarseMapImageHeight                 N
+     16    CoarseMapImageType                   N
+   16.1    CoarseMapImage                       N
 
-=head3 Canon CameraInfo60D Tags
+=head3 FLIR EmbeddedImage Tags
 
-CameraInfo tags for the EOS 60D.
+  Index2   Tag Name                             Writable
+  ------   --------                             --------
+      1    EmbeddedImageWidth                   N
+      2    EmbeddedImageHeight                  N
+     16    EmbeddedImageType                    N
+   16.1    EmbeddedImage                        N
+
+=head3 FLIR CameraInfo Tags
+
+FLIR camera information.  The Planck tags are variables used in the
+temperature calculation.  See
+L<http://u88.n24.queensu.ca/exiftool/forum/index.php?topic=4898.msg23972#msg23972>
+for details.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      3    FNumber                              int8u
-      4    ExposureTime                         int8u
-      6    ISO                                  int8u
-     25    CameraTemperature                    int8u
-     30    FocalLength                          int16uRev
-     54    CameraOrientation                    int8u
-     85    FocusDistanceUpper                   int16uRev
-     87    FocusDistanceLower                   int16uRev
-    125    ColorTemperature                     int16u
-    232    LensType                             int16uRev
-    234    MinFocalLength                       int16uRev
-    236    MaxFocalLength                       int16uRev
-    409    FirmwareVersion                      N
-    473    FileIndex                            int32u
-    485    DirectoryIndex                       int32u
-    801    PictureStyleInfo2                    Canon PSInfo2
+     32    Emissivity                           N
+     36    ObjectDistance                       N
+     40    ReflectedApparentTemperature         N
+     44    AtmosphericTemperature               N
+     48    IRWindowTemperature                  N
+     52    IRWindowTransmission                 N
+     60    RelativeHumidity                     N
+     88    PlanckR1                             N
+     92    PlanckB                              N
+     96    PlanckF                              N
+    144    CameraTemperatureRangeMax            N
+    148    CameraTemperatureRangeMin            N
+    152    UnknownTemperature1?                 N
+    156    UnknownTemperature2?                 N
+    160    UnknownTemperature3?                 N
+    164    UnknownTemperature4?                 N
+    168    UnknownTemperature5?                 N
+    172    UnknownTemperature6?                 N
+    212    CameraModel                          N
+    244    CameraPartNumber                     N
+    260    CameraSerialNumber                   N
+    276    CameraSoftware                       N
+    368    LensModel                            N
+    400    LensPartNumber                       N
+    416    LensSerialNumber                     N
+    436    FieldOfView                          N
+    492    FilterModel                          N
+    508    FilterPartNumber                     N
+    540    FilterSerialNumber                   N
+    776    PlanckO                              N
+    780    PlanckR2                             N
+    824    RawValueMedian                       N
+    828    RawValueRange                        N
+    900    DateTimeOriginal                     N
+    912    FocusStepCount                       N
+   1116    FocusDistance                        N
 
-=head3 Canon CameraInfo450D Tags
+=head3 FLIR MeasInfo Tags
 
-CameraInfo tags for the EOS 450D.
+Tags listed below are only for the first measurement tool, however multiple
+measurements may be added, and information is extracted for all of them.
+Tags for subsequent measurements are generated as required with the prefixes
+"Meas2", "Meas3", etc.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  Meas1Label                                    N
+  Meas1Params                                   N
+  Meas1Type                                     N
+
+=head3 FLIR PaletteInfo Tags
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      3    FNumber                              int8u
-      4    ExposureTime                         int8u
-      6    ISO                                  int8u
-     21    FlashMeteringMode                    int8u
-     24    CameraTemperature                    int8u
-     27    MacroMagnification                   int8u
-     29    FocalLength                          int16uRev
-     48    CameraOrientation                    int8u
-     67    FocusDistanceUpper                   int16uRev
-     69    FocusDistanceLower                   int16uRev
-    111    WhiteBalance                         int16u
-    115    ColorTemperature                     int16u
-    222    LensType                             int16uRev
-    263    FirmwareVersion                      string[6]
-    271    OwnerName                            string[32]
-    307    DirectoryIndex                       int32u
-    319    FileIndex                            int32u
-    611    PictureStyleInfo                     Canon PSInfo
-   2355    LensModel                            string[64]
+      0    PaletteColors                        N
+      6    AboveColor                           N
+      9    BelowColor                           N
+     12    OverflowColor                        N
+     15    UnderflowColor                       N
+     18    Isotherm1Color                       N
+     21    Isotherm2Color                       N
+     26    PaletteMethod                        N
+     27    PaletteStretch                       N
+     48    PaletteFileName                      N
+     80    PaletteName                          N
+    112    Palette                              N
 
-=head3 Canon CameraInfo500D Tags
+=head3 FLIR TextInfo Tags
 
-CameraInfo tags for the EOS 500D.
+  Tag Name                                      Writable
+  --------                                      --------
+  Label0                                        N
+  Label1                                        N
+  Label2                                        N
+  Label3                                        N
+  Value0                                        N
+  Value1                                        N
+  Value2                                        N
+  Value3                                        N
 
-  Index1   Tag Name                             Writable
+=head3 FLIR PaintData Tags
+
+Information generated by FLIR Tools "Paint colors" tool.
+
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-      3    FNumber                              int8u
-      4    ExposureTime                         int8u
-      6    ISO                                  int8u
-      7    HighlightTonePriority                int8u
-     21    FlashMeteringMode                    int8u
-     25    CameraTemperature                    int8u
-     30    FocalLength                          int16uRev
-     49    CameraOrientation                    int8u
-     80    FocusDistanceUpper                   int16uRev
-     82    FocusDistanceLower                   int16uRev
-    115    WhiteBalance                         int16u
-    119    ColorTemperature                     int16u
-    171    PictureStyle                         int8u
-    188    HighISONoiseReduction                int8u
-    190    AutoLightingOptimizer                int8u
-    246    LensType                             int16uRev
-    248    MinFocalLength                       int16uRev
-    250    MaxFocalLength                       int16uRev
-    400    FirmwareVersion                      N
-    467    FileIndex                            int32u
-    479    DirectoryIndex                       int32u
-    779    PictureStyleInfo                     Canon PSInfo
+      5    PaintImageWidth                      N
+      6    PaintImageHeight                     N
+     20    PaintImageType                       N
+   20.1    PaintImage                           N
 
-=head3 Canon CameraInfo550D Tags
+=head3 FLIR PiP Tags
 
-CameraInfo tags for the EOS 550D.
+FLIR Picture in Picture tags.
+
+  Index2   Tag Name                             Writable
+  ------   --------                             --------
+      0    Real2IR                              N
+      2    OffsetX                              N
+      3    OffsetY                              N
+      4    PiPX1                                N
+      5    PiPX2                                N
+      6    PiPY1                                N
+      7    PiPY2                                N
+
+=head3 FLIR GPSInfo Tags
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      3    FNumber                              int8u
-      4    ExposureTime                         int8u
-      6    ISO                                  int8u
-      7    HighlightTonePriority                int8u
-     21    FlashMeteringMode                    int8u
-     25    CameraTemperature                    int8u
-     30    FocalLength                          int16uRev
-     53    CameraOrientation                    int8u
-     84    FocusDistanceUpper                   int16uRev
-     86    FocusDistanceLower                   int16uRev
-    120    WhiteBalance                         int16u
-    124    ColorTemperature                     int16u
-    176    PictureStyle                         int8u
-    255    LensType                             int16uRev
-    257    MinFocalLength                       int16uRev
-    259    MaxFocalLength                       int16uRev
-    420    FirmwareVersion                      N
-    484    FileIndex                            int32u
-    496    DirectoryIndex                       int32u
-    796    PictureStyleInfo                     Canon PSInfo
+     88    GPSMapDatum                          N
 
-=head3 Canon CameraInfo600D Tags
+=head3 FLIR MeterLink Tags
 
-CameraInfo tags for the EOS 600D and 1100D.
+Tags containing Meterlink humidity meter information.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      3    FNumber                              int8u
-      4    ExposureTime                         int8u
-      6    ISO                                  int8u
-      7    HighlightTonePriority                int8u
-     21    FlashMeteringMode                    int8u
-     25    CameraTemperature                    int8u
-     30    FocalLength                          int16uRev
-     56    CameraOrientation                    int8u
-     87    FocusDistanceUpper                   int16uRev
-     89    FocusDistanceLower                   int16uRev
-    123    WhiteBalance                         int16u
-    127    ColorTemperature                     int16u
-    179    PictureStyle                         int8u
-    234    LensType                             int16uRev
-    236    MinFocalLength                       int16uRev
-    238    MaxFocalLength                       int16uRev
-    411    FirmwareVersion                      N
-    475    FileIndex                            int32u
-    487    DirectoryIndex                       int32u
-    763    PictureStyleInfo                     Canon PSInfo2
+     26    Reading1Units                        N
+     28    Reading1Description                  N
+     32    Reading1Device                       N
+     96    Reading1Value                        N
+    126    Reading2Units                        N
+    128    Reading2Description                  N
+    132    Reading2Device                       N
+    196    Reading2Value                        N
+    226    Reading3Units                        N
+    228    Reading3Description                  N
+    232    Reading3Device                       N
+    296    Reading3Value                        N
+    326    Reading4Units                        N
+    328    Reading4Description                  N
+    332    Reading4Device                       N
+    396    Reading4Value                        N
 
-=head3 Canon CameraInfo650D Tags
+=head3 FLIR ParamInfo Tags
+
+  Tag Name                                      Writable
+  --------                                      --------
+  DateTimeGenerated                             N
+  Param0                                        N
+  Param1                                        N
+  Param2                                        N
+  Param3                                        N
 
-CameraInfo tags for the EOS 650D.
+=head3 FLIR UserData Tags
 
-  Index1   Tag Name                             Writable
+Tags written by some FLIR cameras in a top-level (!) "udta" atom of MP4
+videos.
+
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      3    FNumber                              int8u
-      4    ExposureTime                         int8u
-      6    ISO                                  int8u
-     27    CameraTemperature                    int8u
-     32    FocalLength                          int16uRev
-    125    CameraOrientation                    int8u
-    140    FocusDistanceUpper                   int16uRev
-    142    FocusDistanceLower                   int16uRev
-    188    WhiteBalance                         int16u
-    192    ColorTemperature                     int16u
-    244    PictureStyle                         int8u
-    295    LensType                             int16uRev
-    297    MinFocalLength                       int16uRev
-    299    MaxFocalLength                       int16uRev
-    539    FirmwareVersion                      N
-    624    FileIndex                            int32u
-    636    DirectoryIndex                       int32u
-    912    PictureStyleInfo                     Canon PSInfo2
+  'uuid'   FLIR_Parts                           FLIR Parts
+           FLIR_Serial                          FLIR SerialNums
+           FLIR_Params                          FLIR Params
+           FLIR_UnknownUUID                     FLIR UnknownUUID
+           FLIR_GPS                             FLIR GPS_UUID
+           FLIR_MoreInfo                        FLIR MoreInfo
+           SoftwareComponents?                  N
+           FLIR_Unknown?                        N
+           Units                                N+
+           ThumbnailImage                       N
 
-=head3 Canon CameraInfo1000D Tags
+=head3 FLIR Parts Tags
 
-CameraInfo tags for the EOS 1000D.
+Tags extracted from the "uuid" box with ID 43c3993b0f94424b82056b66513f485d
+in FLIR MP4 videos.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      3    FNumber                              int8u
-      4    ExposureTime                         int8u
-      6    ISO                                  int8u
-     21    FlashMeteringMode                    int8u
-     24    CameraTemperature                    int8u
-     27    MacroMagnification                   int8u
-     29    FocalLength                          int16uRev
-     48    CameraOrientation                    int8u
-     67    FocusDistanceUpper                   int16uRev
-     69    FocusDistanceLower                   int16uRev
-    111    WhiteBalance                         int16u
-    115    ColorTemperature                     int16u
-    226    LensType                             int16uRev
-    228    MinFocalLength                       int16uRev
-    230    MaxFocalLength                       int16uRev
-    267    FirmwareVersion                      string[6]
-    311    DirectoryIndex                       int32u
-    323    FileIndex                            int32u
-    615    PictureStyleInfo                     Canon PSInfo
-   2359    LensModel                            string[64]
+      4    BAHPVer                              N
+           BALPVer                              N
+           Battery                              N
+           BAVPVer                              N
+           CamCore                              N
+           DetectorBoard                        N
+           Detector                             N
+           GIDCVer                              N
+           GIDPVer                              N
+           GIPC_CPLD                            N
+           GIPCVer                              N
+           GIXIVer                              N
+           MainBoard                            N
+           Optics                               N
+           PartNumber                           N
+
+=head3 FLIR SerialNums Tags
+
+Tags extracted from the "uuid" box with ID 57f5b93e51e448afa0d9c3ef1b37f712
+in FLIR MP4 videos.
 
-=head3 Canon CameraInfoPowerShot Tags
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+     12    UnknownSerial1?                      N
+     45    UnknownSerial2?                      N
+     78    UnknownSerial3?                      N
+    111    UnknownSerial4?                      N
+    123    UnknownNumber?                       N
+    126    CameraSerialNumber                   N
 
-CameraInfo tags for PowerShot models such as the A450, A460, A550, A560,
-A570, A630, A640, A650, A710, A720, G7, G9, S5, SD40, SD750, SD800, SD850,
-SD870, SD900, SD950, SD1000, SX100 and TX1.
+=head3 FLIR Params Tags
+
+Tags extracted from the "uuid" box with ID 41e5dcf9e80a41ceadfe7f0c58082c19
+in FLIR MP4 videos.
 
   Index4   Tag Name                             Writable
   ------   --------                             --------
-      0    ISO                                  int32s
-      5    FNumber                              int32s
-      6    ExposureTime                         int32s
-     23    Rotation                             int32s
-    135    CameraTemperature                    int32s
-    145    CameraTemperature                    int32s
+      1    ReflectedApparentTemperature         N
+      2    AtmosphericTemperature               N
+      3    Emissivity                           N
+      4    ObjectDistance                       N
+      5    RelativeHumidity                     N
+      6    EstimatedAtmosphericTrans            N
+      7    IRWindowTemperature                  N
+      8    IRWindowTransmission                 N
 
-=head3 Canon CameraInfoPowerShot2 Tags
+=head3 FLIR UnknownUUID Tags
 
-CameraInfo tags for PowerShot models such as the A470, A480, A490, A495,
-A580, A590, A1000, A1100, A2000, A2100, A3000, A3100, D10, E1, G10, G11,
-S90, S95, SD770, SD780, SD790, SD880, SD890, SD940, SD960, SD970, SD980,
-SD990, SD1100, SD1200, SD1300, SD1400, SD3500, SD4000, SD4500, SX1, SX10,
-SX20, SX110, SX120, SX130, SX200 and SX210.
+Tags extracted from the "uuid" box with ID 574520502cbb44adae5415e9b839d903
+in FLIR MP4 videos.
 
   Index4   Tag Name                             Writable
   ------   --------                             --------
-      1    ISO                                  int32s
-      6    FNumber                              int32s
-      7    ExposureTime                         int32s
-     24    Rotation                             int32s
-    153    CameraTemperature                    int32s
-    159    CameraTemperature                    int32s
-    164    CameraTemperature                    int32s
-    168    CameraTemperature                    int32s
-    261    CameraTemperature                    int32s
+  [no tags known]
 
-=head3 Canon CameraInfoUnknown32 Tags
+=head3 FLIR GPS_UUID Tags
 
-Unknown CameraInfo tags are divided into 3 tables based on format size.
+Tags extracted from the "uuid" box with ID 7f2e21008b464918afb1de709a74f6f5
+in FLIR MP4 videos.
 
   Index4   Tag Name                             Writable
   ------   --------                             --------
-     71    CameraTemperature                    int32s
-     83    CameraTemperature                    int32s
-     91    CameraTemperature                    int32s
-     92    CameraTemperature                    int32s
-    100    CameraTemperature                    int32s
-    466    CameraTemperature                    int32s
-    503    CameraTemperature                    int32s
-    506    CameraTemperature                    int32s
-    520    CameraTemperature                    int32s
-    524    CameraTemperature                    int32s
+      1    GPSLatitude                          N
+      2    GPSLongitude                         N
+      3    GPSAltitude                          N
 
-=head3 Canon CameraInfoUnknown16 Tags
+=head3 FLIR MoreInfo Tags
 
-  Index2   Tag Name                             Writable
+Tags extracted from the "uuid" box with ID 2b452fdc74354094baee22a6b23a7cf8
+in FLIR MP4 videos.
+
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-  [no tags known]
+      5    LensModel                            N
+     11    UnknownTemperature1?                 N
+     15    UnknownTemperature2?                 N
 
-=head3 Canon CameraInfoUnknown Tags
+=head3 FLIR FPF Tags
+
+Tags extracted from FLIR Public image Format (FPF) files.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-  [no tags known]
+     32    FPFVersion                           N
+     36    ImageDataOffset                      N
+     40    ImageType                            N
+     42    ImagePixelFormat                     N
+     44    ImageWidth                           N
+     46    ImageHeight                          N
+     48    ExternalTriggerCount                 N
+     52    SequenceFrameNumber                  N
+    120    CameraModel                          N
+    152    CameraPartNumber                     N
+    184    CameraSerialNumber                   N
+    216    CameraTemperatureRangeMin            N
+    220    CameraTemperatureRangeMax            N
+    224    LensModel                            N
+    256    LensPartNumber                       N
+    288    LensSerialNumber                     N
+    320    FilterModel                          N
+    336    FilterPartNumber                     N
+    384    FilterSerialNumber                   N
+    480    Emissivity                           N
+    484    ObjectDistance                       N
+    488    ReflectedApparentTemperature         N
+    492    AtmosphericTemperature               N
+    496    RelativeHumidity                     N
+    500    ComputedAtmosphericTrans             N
+    504    EstimatedAtmosphericTrans            N
+    508    ReferenceTemperature                 N
+    512    IRWindowTemperature                  N
+    516    IRWindowTransmission                 N
+    584    DateTimeOriginal                     N
+    676    CameraScaleMin                       N
+    680    CameraScaleMax                       N
+    684    CalculatedScaleMin                   N
+    688    CalculatedScaleMax                   N
+    692    ActualScaleMin                       N
+    696    ActualScaleMax                       N
 
-=head3 Canon MovieInfo Tags
+=head2 FujiFilm Tags
 
-Tags written by some Canon cameras when recording video.
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   Version                              undef
+  0x0010   InternalSerialNumber                 string
+  0x1000   Quality                              string
+  0x1001   Sharpness                            int16u
+  0x1002   WhiteBalance                         int16u
+  0x1003   Saturation                           int16u
+  0x1004   Contrast                             int16u
+  0x1005   ColorTemperature                     int16u
+  0x1006   Contrast                             int16u
+  0x100a   WhiteBalanceFineTune                 int32s[2]
+  0x100b   NoiseReduction                       int16u
+  0x100e   HighISONoiseReduction                int16u
+  0x1010   FujiFlashMode                        int16u
+  0x1011   FlashExposureComp                    rational64s
+  0x1020   Macro                                int16u
+  0x1021   FocusMode                            int16u
+  0x1022   AFPointSet                           int16u
+  0x1023   FocusPixel                           int16u[2]
+  0x1030   SlowSync                             int16u
+  0x1031   PictureMode                          int16u
+  0x1032   ExposureCount                        int16u
+  0x1033   EXRAuto                              int16u
+  0x1034   EXRMode                              int16u
+  0x1040   ShadowTone                           int32s
+  0x1041   HighlightTone                        int32s
+  0x1100   AutoBracketing                       int16u
+  0x1101   SequenceNumber                       int16u
+  0x1210   ColorMode                            int16u
+  0x1300   BlurWarning                          int16u
+  0x1301   FocusWarning                         int16u
+  0x1302   ExposureWarning                      int16u
+  0x1304   GEImageSize                          string
+  0x1400   DynamicRange                         int16u
+  0x1401   FilmMode                             int16u
+  0x1402   DynamicRangeSetting                  int16u
+  0x1403   DevelopmentDynamicRange              int16u
+  0x1404   MinFocalLength                       rational64s
+  0x1405   MaxFocalLength                       rational64s
+  0x1406   MaxApertureAtMinFocal                rational64s
+  0x1407   MaxApertureAtMaxFocal                rational64s
+  0x140b   AutoDynamicRange                     int16u
+  0x1422   ImageStabilization                   int16u[3]
+  0x1436   ImageGeneration                      int16u
+  0x3820   FrameRate                            int16u
+  0x3821   FrameWidth                           int16u
+  0x3822   FrameHeight                          int16u
+  0x4100   FacesDetected                        int16u
+  0x4103   FacePositions                        int16u[n]
+  0x4282   FaceRecInfo                          FujiFilm FaceRecInfo
+  0x8000   FileSource                           string
+  0x8002   OrderNumber                          int32u
+  0x8003   FrameNumber                          int16u
+  0xb211   Parallax                             rational64s
 
-  Index2   Tag Name                             Writable
+=head3 FujiFilm FaceRecInfo Tags
+
+Face recognition information.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  Face1Birthday                                 N
+  Face1Category                                 N
+  Face1Name                                     N
+  Face2Birthday                                 N
+  Face2Category                                 N
+  Face2Name                                     N
+  Face3Birthday                                 N
+  Face3Category                                 N
+  Face3Name                                     N
+  Face4Birthday                                 N
+  Face4Category                                 N
+  Face4Name                                     N
+  Face5Birthday                                 N
+  Face5Category                                 N
+  Face5Name                                     N
+  Face6Birthday                                 N
+  Face6Category                                 N
+  Face6Name                                     N
+  Face7Birthday                                 N
+  Face7Category                                 N
+  Face7Name                                     N
+  Face8Birthday                                 N
+  Face8Category                                 N
+  Face8Name                                     N
+
+=head3 FujiFilm RAF Tags
+
+FujiFilm RAF images contain meta information stored in a proprietary
+FujiFilm RAF format, as well as EXIF information stored inside an embedded
+JPEG preview image.  The table below lists tags currently decoded from the
+RAF-format information.
+
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      1    FrameRate                            int16u
-      2    FrameCount                           int16u
-      4    FrameCount                           int32u
-      6    FrameRate                            rational32u
-    106    Duration                             int32u
-    108    AudioBitrate                         int32u
-    110    AudioSampleRate                      int32u
-    112    AudioChannels                        int32u
-    116    VideoCodec                           undef[4]
+  0x0100   RawImageFullSize                     N
+  0x0121   RawImageSize                         N
+  0x0130   FujiLayout                           N
+  0x2ff0   WB_GRGBLevels                        N
+  0xc000   RAFData                              FujiFilm RAFData
 
-=head3 Canon AFInfo Tags
+=head3 FujiFilm RAFData Tags
 
-Auto-focus information used by many older Canon models.  The values in this
-record are sequential, and some have variable sizes based on the value of
-NumAFPoints (which may be 1,5,7,9,15,45 or 53).  The AFArea coordinates are
-given in a system where the image has dimensions given by AFImageWidth and
-AFImageHeight, and 0,0 is the image center. The direction of the Y axis
-depends on the camera model, with positive Y upwards for EOS models, but
-apparently downwards for PowerShot models.
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    RawImageWidth                        N
+      4    RawImageWidth                        N
+           RawImageHeight                       N
+      8    RawImageHeight                       N
 
-  Sequence Tag Name                             Writable
-  -------- --------                             --------
-      0    NumAFPoints                          N
-      1    ValidAFPoints                        N
-      2    CanonImageWidth                      N
-      3    CanonImageHeight                     N
-      4    AFImageWidth                         N
-      5    AFImageHeight                        N
-      6    AFAreaWidth                          N
-      7    AFAreaHeight                         N
-      8    AFAreaXPositions                     N
-      9    AFAreaYPositions                     N
-     10    AFPointsInFocus                      N
-     11    PrimaryAFPoint                       N
-           Canon_AFInfo_0x000b?                 N
-     12    PrimaryAFPoint                       N
+=head3 FujiFilm IFD Tags
+
+Tags found in the FujiIFD information of RAF images from some models.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0xf000   FujiIFD                              FujiFilm IFD
+  0xf001   RawImageFullWidth                    N
+  0xf002   RawImageFullHeight                   N
+  0xf003   BitsPerSample                        N
+  0xf007   StripOffsets                         N
+  0xf008   StripByteCounts                      N
+  0xf00a   BlackLevel                           N
+  0xf00c   WB_GRBLevelsStandard                 N
+  0xf00d   WB_GRBLevelsDaylight                 N
+  0xf00e   WB_GRBLevels                         N
+
+=head3 FujiFilm FFMV Tags
+
+Information found in the FFMV atom of MOV videos.
+
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    MovieStreamName                      N
 
-=head3 Canon MyColors Tags
+=head3 FujiFilm MOV Tags
 
-  Index2   Tag Name                             Writable
+This information is found in MOV videos from some FujiFilm cameras.
+
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-      2    MyColorMode                          int16u
+      0    Make                                 N
+     24    Model                                N
+     46    ExposureTime                         N
+     50    FNumber                              N
+     58    ExposureCompensation                 N
 
-=head3 Canon FaceDetect1 Tags
+=head2 GE Tags
 
-  Index2   Tag Name                             Writable
+This table lists tags found in the maker notes of some General Imaging
+camera models.
+
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      2    FacesDetected                        int16u
-      3    FaceDetectFrameSize                  int16u[2]
-      8    Face1Position                        int16s[2]
-     10    Face2Position                        int16s[2]
-     12    Face3Position                        int16s[2]
-     14    Face4Position                        int16s[2]
-     16    Face5Position                        int16s[2]
-     18    Face6Position                        int16s[2]
-     20    Face7Position                        int16s[2]
-     22    Face8Position                        int16s[2]
-     24    Face9Position                        int16s[2]
+  0x0202   Macro                                int16u
+  0x0207   GEModel                              string
+  0x0300   GEMake                               string
 
-=head3 Canon FaceDetect2 Tags
+=head2 HP Tags
 
-  Index1   Tag Name                             Writable
+These tables list tags found in the maker notes of some Hewlett-Packard
+camera models.
+
+The first table lists tags found in the EXIF-format maker notes of the
+PhotoSmart 720 (also used by the Vivitar ViviCam 3705, 3705B and 3715).
+
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      1    FaceWidth                            int8u
-      2    FacesDetected                        int8u
+  0x0e00   PrintIM                              PrintIM
 
-=head3 Canon AFInfo2 Tags
+=head3 HP Type2 Tags
 
-Newer version of the AFInfo record containing much of the same information
-(and coordinate confusion) as the older version.  In this record, NumAFPoints
-may be 7, 9, 11, 19, 31, 45 or 61, depending on the camera model.
+These tags are used by the PhotoSmart E427.
 
-  Sequence Tag Name                             Writable
-  -------- --------                             --------
-      0    AFInfoSize?                          N
-      1    AFAreaMode                           N
-      2    NumAFPoints                          N
-      3    ValidAFPoints                        N
-      4    CanonImageWidth                      N
-      5    CanonImageHeight                     N
-      6    AFImageWidth                         N
-      7    AFImageHeight                        N
-      8    AFAreaWidths                         N
-      9    AFAreaHeights                        N
-     10    AFAreaXPositions                     N
-     11    AFAreaYPositions                     N
-     12    AFPointsInFocus                      N
-     13    AFPointsSelected                     N
-           Canon_AFInfo2_0x000d?                N
-     14    PrimaryAFPoint                       N
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Lens Shading'       LensShading              N
+  'PreviewImage'       PreviewImage             N
+  'Serial Number'      SerialNumber             N
 
-=head3 Canon ContrastInfo Tags
+=head3 HP Type4 Tags
 
-  Index2   Tag Name                             Writable
+These tags are used by the PhotoSmart M627.
+
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-      4    IntelligentContrast                  int16u
+     12    MaxAperture                          N
+     16    ExposureTime                         N
+     20    CameraDateTime                       N
+     52    ISO                                  N
+     92    SerialNumber                         N
 
-=head3 Canon FaceDetect3 Tags
+=head3 HP Type6 Tags
 
-  Index2   Tag Name                             Writable
+These tags are used by the PhotoSmart M425, M525 and M527.
+
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-      3    FacesDetected                        int16u
+     12    FNumber                              N
+     16    ExposureTime                         N
+     20    CameraDateTime                       N
+     52    ISO                                  N
+     88    SerialNumber                         N
 
-=head3 Canon TimeInfo Tags
+=head3 HP TDHD Tags
 
-  Index4   Tag Name                             Writable
+These tags are extracted from the APP6 "TDHD" segment of Photosmart R837
+JPEG images.  Many other unknown tags exist in is data, and can be seen with
+the Unknown (-u) option.
+
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      1    TimeZone                             int32s
-      2    TimeZoneCity                         int32s
-      3    DaylightSavings                      int32s
+  'CMSN'   SerialNumber                         N
+  'FWRV'   FirmwareVersion                      N
+  'LSLV'   LSLV                                 HP TDHD
+  'TDHD'   TDHD                                 HP TDHD
 
-=head3 Canon FileInfo Tags
+=head2 JVC Tags
 
-  Index2   Tag Name                             Writable
+JVC EXIF maker note tags.
+
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      1    FileNumber                           int32u
-           ShutterCount                         int32u
-      3    BracketMode                          int16s
-      4    BracketValue                         int16s
-      5    BracketShotNumber                    int16s
-      6    RawJpgQuality                        int16s
-      7    RawJpgSize                           int16s
-      8    LongExposureNoiseReduction2          int16s
-      9    WBBracketMode                        int16s
-     12    WBBracketValueAB                     int16s
-     13    WBBracketValueGM                     int16s
-     14    FilterEffect                         int16s
-     15    ToningEffect                         int16s
-     16    MacroMagnification                   int16s
-     19    LiveViewShooting                     int16s
-     25    FlashExposureLock                    int16s
+  0x0002   CPUVersions                          N
+  0x0003   Quality                              N
 
-=head3 Canon SerialInfo Tags
+=head3 JVC Text Tags
 
-  Index1   Tag Name                             Writable
+JVC/Victor text-based maker note tags.
+
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      9    InternalSerialNumber                 string
+  'QTY'    Quality                              N
+  'VER'    MakerNoteVersion                     N
 
-=head3 Canon CropInfo Tags
+=head2 Kodak Tags
 
-  Index2   Tag Name                             Writable
-  ------   --------                             --------
-      0    CropLeftMargin                       int16u
-      1    CropRightMargin                      int16u
-      2    CropTopMargin                        int16u
-      3    CropBottomMargin                     int16u
+Many Kodak models don't store the maker notes in standard IFD format, and
+these formats vary with different models.  Some information has been
+decoded, but much of the Kodak information remains unknown.
 
-=head3 Canon AspectInfo Tags
+The table below contains the most common set of Kodak tags.  The following
+Kodak camera models have been tested and found to use these tags: C360,
+C663, C875, CX6330, CX6445, CX7330, CX7430, CX7525, CX7530, DC4800, DC4900,
+DX3500, DX3600, DX3900, DX4330, DX4530, DX4900, DX6340, DX6440, DX6490,
+DX7440, DX7590, DX7630, EasyShare-One, LS420, LS443, LS633, LS743, LS753,
+V530, V550, V570, V603, V610, V705, Z650, Z700, Z710, Z730, Z740, Z760 and
+Z7590.
 
-  Index4   Tag Name                             Writable
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    AspectRatio                          int32u
-      1    CroppedImageWidth                    int32u
-      2    CroppedImageHeight                   int32u
-      3    CroppedImageLeft                     int32u
-      4    CroppedImageTop                      int32u
+      0    KodakModel                           string[8]
+      9    Quality                              int8u
+     10    BurstMode                            int8u
+     12    KodakImageWidth                      int16u
+     14    KodakImageHeight                     int16u
+     16    YearCreated                          int16u
+     18    MonthDayCreated                      int8u[2]
+     20    TimeCreated                          int8u[4]
+     24    BurstMode2?                          int16u
+     27    ShutterMode                          int8u
+     28    MeteringMode                         int8u
+     29    SequenceNumber                       int8u
+     30    FNumber                              int16u
+     32    ExposureTime                         int32u
+     36    ExposureCompensation                 int16s
+     38    VariousModes?                        int16u
+     40    Distance1?                           int32u
+     44    Distance2?                           int32u
+     48    Distance3?                           int32u
+     52    Distance4?                           int32u
+     56    FocusMode                            int8u
+     58    VariousModes2?                       int16u
+     60    PanoramaMode?                        int16u
+     62    SubjectDistance?                     int16u
+     64    WhiteBalance                         int8u
+     92    FlashMode                            int8u
+     93    FlashFired                           int8u
+     94    ISOSetting                           int16u
+     96    ISO                                  int16u
+     98    TotalZoom                            int16u
+    100    DateTimeStamp                        int16u
+    102    ColorMode                            int16u
+    104    DigitalZoom                          int16u
+    107    Sharpness                            int8s
 
-=head3 Canon Processing Tags
+=head3 Kodak Type2 Tags
 
-  Index2   Tag Name                             Writable
+These tags are used by the Kodak DC220, DC260, DC265 and DC290,
+Hewlett-Packard PhotoSmart 618, C500 and C912, Pentax EI-200 and EI-2000,
+and Minolta EX1500Z.
+
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-      1    ToneCurve                            int16s
-      2    Sharpness                            int16s
-      3    SharpnessFrequency                   int16s
-      4    SensorRedLevel                       int16s
-      5    SensorBlueLevel                      int16s
-      6    WhiteBalanceRed                      int16s
-      7    WhiteBalanceBlue                     int16s
-      8    WhiteBalance                         int16s
-      9    ColorTemperature                     int16s
-     10    PictureStyle                         int16s
-     11    DigitalGain                          int16s
-     12    WBShiftAB                            int16s
-     13    WBShiftGM                            int16s
+      8    KodakMaker                           string[32]
+     40    KodakModel                           string[32]
+    108    KodakImageWidth                      int32u
+    112    KodakImageHeight                     int32u
 
-=head3 Canon ColorBalance Tags
+=head3 Kodak Type3 Tags
 
-These tags are used by the 10D and 300D.
+These tags are used by the DC240, DC280, DC3400 and DC5000.
 
-  Index2   Tag Name                             Writable
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    WB_RGGBLevelsAuto                    int16s[4]
-      4    WB_RGGBLevelsDaylight                int16s[4]
-      8    WB_RGGBLevelsShade                   int16s[4]
-     12    WB_RGGBLevelsCloudy                  int16s[4]
-     16    WB_RGGBLevelsTungsten                int16s[4]
-     20    WB_RGGBLevelsFluorescent             int16s[4]
-     24    WB_RGGBLevelsFlash                   int16s[4]
-     28    WB_RGGBLevelsCustom                  int16s[4]
-     32    WB_RGGBLevelsKelvin                  int16s[4]
+     12    YearCreated                          int16u
+     14    MonthDayCreated                      int8u[2]
+     16    TimeCreated                          int8u[4]
+     30    OpticalZoom                          int16u
+     55    Sharpness                            int8s
+     56    ExposureTime                         int32u
+     60    FNumber                              int16u
+     78    ISO                                  int16u
 
-=head3 Canon MeasuredColor Tags
+=head3 Kodak Type4 Tags
 
-  Index2   Tag Name                             Writable
+These tags are used by the DC200 and DC215.
+
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-      1    MeasuredRGGB                         int16u[4]
+     32    OriginalFileName                     string[12]
 
-=head3 Canon Flags Tags
+=head3 Kodak Type5 Tags
 
-  Index2   Tag Name                             Writable
+These tags are used by the CX4200, CX4210, CX4230, CX4300, CX4310, CX6200
+and CX6230.
+
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-      1    ModifiedParamFlag                    int16s
+     20    ExposureTime                         int32u
+     26    WhiteBalance                         int8u
+     28    FNumber                              int16u
+     30    ISO                                  int16u
+     32    OpticalZoom                          int16u
+     34    DigitalZoom                          int16u
+     39    FlashMode                            int8u
+     42    ImageRotated                         int8u
+     43    Macro                                int8u
 
-=head3 Canon ModifiedInfo Tags
+=head3 Kodak Type6 Tags
 
-  Index2   Tag Name                             Writable
+These tags are used by the DX3215 and DX3700.
+
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-      1    ModifiedToneCurve                    int16s
-      2    ModifiedSharpness                    int16s
-      3    ModifiedSharpnessFreq                int16s
-      4    ModifiedSensorRedLevel               int16s
-      5    ModifiedSensorBlueLevel              int16s
-      6    ModifiedWhiteBalanceRed              int16s
-      7    ModifiedWhiteBalanceBlue             int16s
-      8    ModifiedWhiteBalance                 int16s
-      9    ModifiedColorTemp                    int16s
-     10    ModifiedPictureStyle                 int16s
-     11    ModifiedDigitalGain                  int16s
+     16    ExposureTime                         int32u
+     20    ISOSetting?                          int32u
+     24    FNumber                              int16u
+     26    ISO                                  int16u
+     28    OpticalZoom                          int16u
+     30    DigitalZoom                          int16u
+     34    Flash                                int16u
 
-=head3 Canon PreviewImageInfo Tags
+=head3 Kodak Type7 Tags
 
-  Index4   Tag Name                             Writable
+The maker notes of models such as the C340, C433, CC533, LS755, V803 and
+V1003 seem to start with the camera serial number.  The C310, C315, C330,
+C643, C743, CD33, CD43, CX7220 and CX7300 maker notes are also decoded using
+this table, although the strings for these cameras don't conform to the
+usual Kodak serial number format, and instead have the model name followed
+by 8 digits.
+
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-      1    PreviewQuality                       int32u
-      2    PreviewImageLength                   int32u*
-      3    PreviewImageWidth                    int32u
-      4    PreviewImageHeight                   int32u
-      5    PreviewImageStart                    int32u*
+      0    SerialNumber                         string[16]
 
-=head3 Canon SensorInfo Tags
+=head3 Kodak Type8 Tags
 
-  Index2   Tag Name                             Writable
+Kodak models such as the ZD710, P712, P850, P880, V1233, V1253, V1275,
+V1285, Z612, Z712, Z812, Z885 use standard TIFF IFD format for the maker
+notes.  In keeping with Kodak's strategy of inconsistent makernotes, models
+such as the M380, M1033, M1093, V1073, V1273, Z1012, Z1085 and Z8612
+also use these tags, but these makernotes begin with a TIFF header instead
+of an IFD entry count and use relative instead of absolute offsets.  There
+is a large amount of information stored in these maker notes (apparently
+with much duplication), but relatively few tags have so far been decoded.
+
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      1    SensorWidth                          N
-      2    SensorHeight                         N
-      5    SensorLeftBorder                     N
-      6    SensorTopBorder                      N
-      7    SensorRightBorder                    N
-      8    SensorBottomBorder                   N
-      9    BlackMaskLeftBorder                  N
-     10    BlackMaskTopBorder                   N
-     11    BlackMaskRightBorder                 N
-     12    BlackMaskBottomBorder                N
+  0xfc00   SubIFD0                              Kodak SubIFD0
+                                                Kodak SubIFD0
+  0xfc01   SubIFD1                              Kodak SubIFD1
+                                                Kodak SubIFD1
+  0xfc02   SubIFD2                              Kodak SubIFD2
+                                                Kodak SubIFD2
+  0xfc03   SubIFD3                              Kodak SubIFD3
+                                                Kodak SubIFD3
+  0xfc04   SubIFD4                              Kodak SubIFD4
+                                                Kodak SubIFD4
+  0xfc05   SubIFD5                              Kodak SubIFD5
+                                                Kodak SubIFD5
+  0xfc06   SubIFD6                              Kodak SubIFD6
+                                                Kodak SubIFD6
+  0xfcff   SubIFD255                            Kodak SubIFD0
+  0xff00   CameraInfo                           Kodak CameraInfo
 
-=head3 Canon ColorData1 Tags
+=head3 Kodak SubIFD0 Tags
 
-These tags are used by the 20D and 350D.
+SubIFD0 through SubIFD5 tags are written a number of newer Kodak models.
 
-  Index2   Tag Name                             Writable
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-     25    WB_RGGBLevelsAsShot                  int16s[4]
-     29    ColorTempAsShot                      int16s
-     30    WB_RGGBLevelsAuto                    int16s[4]
-     34    ColorTempAuto                        int16s
-     35    WB_RGGBLevelsDaylight                int16s[4]
-     39    ColorTempDaylight                    int16s
-     40    WB_RGGBLevelsShade                   int16s[4]
-     44    ColorTempShade                       int16s
-     45    WB_RGGBLevelsCloudy                  int16s[4]
-     49    ColorTempCloudy                      int16s
-     50    WB_RGGBLevelsTungsten                int16s[4]
-     54    ColorTempTungsten                    int16s
-     55    WB_RGGBLevelsFluorescent             int16s[4]
-     59    ColorTempFluorescent                 int16s
-     60    WB_RGGBLevelsFlash                   int16s[4]
-     64    ColorTempFlash                       int16s
-     65    WB_RGGBLevelsCustom1                 int16s[4]
-     69    ColorTempCustom1                     int16s
-     70    WB_RGGBLevelsCustom2                 int16s[4]
-     74    ColorTempCustom2                     int16s
-     75    ColorCalib?                          Canon ColorCalib
-
-=head3 Canon ColorCalib Tags
+  0xfa02   SceneMode                            int16u
+  0xfa19   SerialNumber                         string
+  0xfa1d   KodakImageWidth                      int16u
+  0xfa1e   KodakImageHeight                     int16u
+  0xfa20   SensorWidth                          int16u
+  0xfa21   SensorHeight                         int16u
+  0xfa23   FNumber                              int16u
+  0xfa24   ExposureTime                         int32u
+  0xfa2e   ISO                                  int16u
+  0xfa3d   OpticalZoom                          int16u
+  0xfa46   ISO                                  int16u
+  0xfa51   KodakImageWidth                      int16u
+  0xfa52   KodakImageHeight                     int16u
+  0xfa54   ThumbnailWidth                       int16u
+  0xfa55   ThumbnailHeight                      int16u
+  0xfa57   PreviewImageWidth                    int16u
+  0xfa58   PreviewImageHeight                   int16u
 
-Camera color calibration data.  For the 20D, 350D, 1DmkII and 1DSmkII the
-order of the cooefficients is A, B, C, Temperature, but for newer models it
-is B, C, A, Temperature.  These tags are extracted only when the Unknown
-option is used.
+=head3 Kodak SubIFD1 Tags
 
-  Index2   Tag Name                             Writable
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      0    CameraColorCalibration01?            int16s[4]
-      4    CameraColorCalibration02?            int16s[4]
-      8    CameraColorCalibration03?            int16s[4]
-     12    CameraColorCalibration04?            int16s[4]
-     16    CameraColorCalibration05?            int16s[4]
-     20    CameraColorCalibration06?            int16s[4]
-     24    CameraColorCalibration07?            int16s[4]
-     28    CameraColorCalibration08?            int16s[4]
-     32    CameraColorCalibration09?            int16s[4]
-     36    CameraColorCalibration10?            int16s[4]
-     40    CameraColorCalibration11?            int16s[4]
-     44    CameraColorCalibration12?            int16s[4]
-     48    CameraColorCalibration13?            int16s[4]
-     52    CameraColorCalibration14?            int16s[4]
-     56    CameraColorCalibration15?            int16s[4]
+  0x0027   ISO                                  int16u
+  0x0028   ISO                                  int16u
 
-=head3 Canon ColorData2 Tags
+=head3 Kodak SubIFD2 Tags
 
-These tags are used by the 1DmkII and 1DSmkII.
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x6002   SceneModeUsed                        int32u
+  0x6006   OpticalZoom                          int32u
+  0x6103   MaxAperture                          int32u
+  0xf002   SceneModeUsed                        int32u
+  0xf006   OpticalZoom                          int32u
+  0xf103   FNumber                              int32u
+  0xf104   ExposureTime                         int32u
+  0xf105   ISO                                  int32u
 
-  Index2   Tag Name                             Writable
+=head3 Kodak SubIFD3 Tags
+
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-     24    WB_RGGBLevelsAuto                    int16s[4]
-     28    ColorTempAuto                        int16s
-     29    WB_RGGBLevelsUnknown?                int16s[4]
-     33    ColorTempUnknown?                    int16s
-     34    WB_RGGBLevelsAsShot                  int16s[4]
-     38    ColorTempAsShot                      int16s
-     39    WB_RGGBLevelsDaylight                int16s[4]
-     43    ColorTempDaylight                    int16s
-     44    WB_RGGBLevelsShade                   int16s[4]
-     48    ColorTempShade                       int16s
-     49    WB_RGGBLevelsCloudy                  int16s[4]
-     53    ColorTempCloudy                      int16s
-     54    WB_RGGBLevelsTungsten                int16s[4]
-     58    ColorTempTungsten                    int16s
-     59    WB_RGGBLevelsFluorescent             int16s[4]
-     63    ColorTempFluorescent                 int16s
-     64    WB_RGGBLevelsKelvin                  int16s[4]
-     68    ColorTempKelvin                      int16s
-     69    WB_RGGBLevelsFlash                   int16s[4]
-     73    ColorTempFlash                       int16s
-     74    WB_RGGBLevelsUnknown2?               int16s[4]
-     78    ColorTempUnknown2?                   int16s
-     79    WB_RGGBLevelsUnknown3?               int16s[4]
-     83    ColorTempUnknown3?                   int16s
-     84    WB_RGGBLevelsUnknown4?               int16s[4]
-     88    ColorTempUnknown4?                   int16s
-     89    WB_RGGBLevelsUnknown5?               int16s[4]
-     93    ColorTempUnknown5?                   int16s
-     94    WB_RGGBLevelsUnknown6?               int16s[4]
-     98    ColorTempUnknown6?                   int16s
-     99    WB_RGGBLevelsUnknown7?               int16s[4]
-    103    ColorTempUnknown7?                   int16s
-    104    WB_RGGBLevelsUnknown8?               int16s[4]
-    108    ColorTempUnknown8?                   int16s
-    109    WB_RGGBLevelsUnknown9?               int16s[4]
-    113    ColorTempUnknown9?                   int16s
-    114    WB_RGGBLevelsUnknown10?              int16s[4]
-    118    ColorTempUnknown10?                  int16s
-    119    WB_RGGBLevelsUnknown11?              int16s[4]
-    123    ColorTempUnknown11?                  int16s
-    124    WB_RGGBLevelsUnknown12?              int16s[4]
-    128    ColorTempUnknown12?                  int16s
-    129    WB_RGGBLevelsUnknown13?              int16s[4]
-    133    ColorTempUnknown13?                  int16s
-    134    WB_RGGBLevelsUnknown14?              int16s[4]
-    138    ColorTempUnknown14?                  int16s
-    139    WB_RGGBLevelsUnknown15?              int16s[4]
-    143    ColorTempUnknown15?                  int16s
-    144    WB_RGGBLevelsPC1                     int16s[4]
-    148    ColorTempPC1                         int16s
-    149    WB_RGGBLevelsPC2                     int16s[4]
-    153    ColorTempPC2                         int16s
-    154    WB_RGGBLevelsPC3                     int16s[4]
-    158    ColorTempPC3                         int16s
-    159    WB_RGGBLevelsUnknown16?              int16s[4]
-    163    ColorTempUnknown16?                  int16s
-    164    ColorCalib?                          Canon ColorCalib
-    618    RawMeasuredRGGB                      int32u[4]
+  0x1000   OpticalZoom                          int16u
+
+=head3 Kodak SubIFD4 Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  [no tags known]
 
-=head3 Canon ColorData3 Tags
+=head3 Kodak SubIFD5 Tags
 
-These tags are used by the 1DmkIIN, 5D, 30D and 400D.
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x000f   OpticalZoom                          int16u
 
-  Index2   Tag Name                             Writable
+=head3 Kodak SubIFD6 Tags
+
+SubIFD6 is written by the M580.
+
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      0    ColorDataVersion                     int16s
-     63    WB_RGGBLevelsAsShot                  int16s[4]
-     67    ColorTempAsShot                      int16s
-     68    WB_RGGBLevelsAuto                    int16s[4]
-     72    ColorTempAuto                        int16s
-     73    WB_RGGBLevelsMeasured                int16s[4]
-     77    ColorTempMeasured                    int16s
-     78    WB_RGGBLevelsDaylight                int16s[4]
-     82    ColorTempDaylight                    int16s
-     83    WB_RGGBLevelsShade                   int16s[4]
-     87    ColorTempShade                       int16s
-     88    WB_RGGBLevelsCloudy                  int16s[4]
-     92    ColorTempCloudy                      int16s
-     93    WB_RGGBLevelsTungsten                int16s[4]
-     97    ColorTempTungsten                    int16s
-     98    WB_RGGBLevelsFluorescent             int16s[4]
-    102    ColorTempFluorescent                 int16s
-    103    WB_RGGBLevelsKelvin                  int16s[4]
-    107    ColorTempKelvin                      int16s
-    108    WB_RGGBLevelsFlash                   int16s[4]
-    112    ColorTempFlash                       int16s
-    113    WB_RGGBLevelsPC1                     int16s[4]
-    117    ColorTempPC1                         int16s
-    118    WB_RGGBLevelsPC2                     int16s[4]
-    122    ColorTempPC2                         int16s
-    123    WB_RGGBLevelsPC3                     int16s[4]
-    127    ColorTempPC3                         int16s
-    128    WB_RGGBLevelsCustom                  int16s[4]
-    132    ColorTempCustom                      int16s
-    133    ColorCalib?                          Canon ColorCalib
-    584    FlashOutput                          int16s
-    585    FlashBatteryLevel                    int16s
-    586    ColorTempFlashData                   int16s
-    647    MeasuredRGGBData                     int32u[4]
+  [no tags known]
 
-=head3 Canon ColorData4 Tags
+=head3 Kodak CameraInfo Tags
 
-These tags are used by the 1DmkIII, 1DSmkIII, 1DmkIV, 5DmkII, 7D, 40D, 50D,
-60D, 450D, 500D, 550D, 1000D and 1100D.
+These tags are used by the  P712, P850 and P880.
 
-  Index2   Tag Name                             Writable
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      0    ColorDataVersion                     int16s
-     63    ColorCoefs                           Canon ColorCoefs
-    168    ColorCalib?                          Canon ColorCalib
-    640    RawMeasuredRGGB                      int32u[4]
+  0xf900   SensorWidth                          int16u
+  0xf901   SensorHeight                         int16u
+  0xf902   BayerPattern                         string
+  0xf903   SensorFullWidth                      int16u
+  0xf904   SensorFullHeight                     int16u
+  0xf907   KodakImageWidth                      int16u
+  0xf908   KodakImageHeight                     int16u
+  0xfa00   KodakInfoType                        string
+  0xfa04   SerialNumber                         string
+  0xfd04   FNumber                              int16u
+  0xfd05   ExposureTime                         int32u
+  0xfd06   ISO                                  int16u
 
-=head3 Canon ColorCoefs Tags
+=head3 Kodak Type9 Tags
 
-  Index2   Tag Name                             Writable
+These tags are used by the Kodak C140, C180, C913, C1013, M320, M340 and
+M550, as well as various cameras marketed by other manufacturers.
+
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    WB_RGGBLevelsAsShot                  int16s[4]
-      4    ColorTempAsShot                      int16s
-      5    WB_RGGBLevelsAuto                    int16s[4]
-      9    ColorTempAuto                        int16s
-     10    WB_RGGBLevelsMeasured                int16s[4]
-     14    ColorTempMeasured                    int16s
-     15    WB_RGGBLevelsUnknown?                int16s[4]
-     19    ColorTempUnknown?                    int16s
-     20    WB_RGGBLevelsDaylight                int16s[4]
-     24    ColorTempDaylight                    int16s
-     25    WB_RGGBLevelsShade                   int16s[4]
-     29    ColorTempShade                       int16s
-     30    WB_RGGBLevelsCloudy                  int16s[4]
-     34    ColorTempCloudy                      int16s
-     35    WB_RGGBLevelsTungsten                int16s[4]
-     39    ColorTempTungsten                    int16s
-     40    WB_RGGBLevelsFluorescent             int16s[4]
-     44    ColorTempFluorescent                 int16s
-     45    WB_RGGBLevelsKelvin                  int16s[4]
-     49    ColorTempKelvin                      int16s
-     50    WB_RGGBLevelsFlash                   int16s[4]
-     54    ColorTempFlash                       int16s
-     55    WB_RGGBLevelsUnknown2?               int16s[4]
-     59    ColorTempUnknown2?                   int16s
-     60    WB_RGGBLevelsUnknown3?               int16s[4]
-     64    ColorTempUnknown3?                   int16s
-     65    WB_RGGBLevelsUnknown4?               int16s[4]
-     69    ColorTempUnknown4?                   int16s
-     70    WB_RGGBLevelsUnknown5?               int16s[4]
-     74    ColorTempUnknown5?                   int16s
-     75    WB_RGGBLevelsUnknown6?               int16s[4]
-     79    ColorTempUnknown6?                   int16s
-     80    WB_RGGBLevelsUnknown7?               int16s[4]
-     84    ColorTempUnknown7?                   int16s
-     85    WB_RGGBLevelsUnknown8?               int16s[4]
-     89    ColorTempUnknown8?                   int16s
-     90    WB_RGGBLevelsUnknown9?               int16s[4]
-     94    ColorTempUnknown9?                   int16s
-     95    WB_RGGBLevelsUnknown10?              int16s[4]
-     99    ColorTempUnknown10?                  int16s
-    100    WB_RGGBLevelsUnknown11?              int16s[4]
-    104    ColorTempUnknown11?                  int16s
-    105    WB_RGGBLevelsUnknown12?              int16s[4]
-    109    ColorTempUnknown12?                  int16s
-    110    WB_RGGBLevelsUnknown13?              int16s[4]
-    114    ColorTempUnknown13?                  int16s
+     12    FNumber                              int16u
+     16    ExposureTime                         int32u
+     20    DateTimeOriginal                     string[20]
+     52    ISO                                  int16u
+     87    FirmwareVersion                      string[16]
+    168    UnknownNumber                        N
+    196    UnknownNumber                        N
 
-=head3 Canon ColorData5 Tags
+=head3 Kodak Type10 Tags
 
-These tags are used by the PowerShot G10.
+Another variation of the IFD-format type, this time with just a byte order
+indicator instead of a full TIFF header.  These tags are used by the Z980.
 
-  Index2   Tag Name                             Writable
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-     71    ColorCoefs                           Canon ColorCoefs
-    186    CameraColorCalibration01?            int16s[5]
-    191    CameraColorCalibration02?            int16s[5]
-    196    CameraColorCalibration03?            int16s[5]
-    201    CameraColorCalibration04?            int16s[5]
-    206    CameraColorCalibration05?            int16s[5]
-    211    CameraColorCalibration06?            int16s[5]
-    216    CameraColorCalibration07?            int16s[5]
-    221    CameraColorCalibration08?            int16s[5]
-    226    CameraColorCalibration09?            int16s[5]
-    231    CameraColorCalibration10?            int16s[5]
-    236    CameraColorCalibration11?            int16s[5]
-    241    CameraColorCalibration12?            int16s[5]
-    246    CameraColorCalibration13?            int16s[5]
-    251    CameraColorCalibration14?            int16s[5]
-    256    CameraColorCalibration15?            int16s[5]
+  0x0002   PreviewImageSize                     int16u[2]
+  0x0012   ExposureTime                         int32u
+  0x0013   FNumber                              int16u
+  0x0014   ISO                                  int16u
+  0x001d   FocalLength                          int32u
 
-=head3 Canon ColorData6 Tags
+=head3 Kodak Unknown Tags
 
-These tags are used by the EOS 600D.
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+  [no tags known]
 
-  Index2   Tag Name                             Writable
+=head3 Kodak IFD Tags
+
+These tags are found in a separate IFD of JPEG, TIFF, DCR and KDC images
+from some older Kodak models such as the DC50, DC120, DCS760C, DCS Pro 14N,
+14nx, SLR/n, Pro Back and Canon EOS D2000.
+
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      0    ColorDataVersion                     int16s
-     63    WB_RGGBLevelsAsShot                  int16s[4]
-     67    ColorTempAsShot                      int16s
-     68    WB_RGGBLevelsAuto                    int16s[4]
-     72    ColorTempAuto                        int16s
-     73    WB_RGGBLevelsMeasured                int16s[4]
-     77    ColorTempMeasured                    int16s
-     78    WB_RGGBLevelsUnknown?                int16s[4]
-     82    ColorTempUnknown?                    int16s
-     83    WB_RGGBLevelsUnknown2?               int16s[4]
-     87    ColorTempUnknown2?                   int16s
-     88    WB_RGGBLevelsUnknown3?               int16s[4]
-     92    ColorTempUnknown3?                   int16s
-     93    WB_RGGBLevelsUnknown4?               int16s[4]
-     97    ColorTempUnknown4?                   int16s
-     98    WB_RGGBLevelsUnknown5?               int16s[4]
-    102    ColorTempUnknown5?                   int16s
-    103    WB_RGGBLevelsDaylight                int16s[4]
-    107    ColorTempDaylight                    int16s
-    108    WB_RGGBLevelsShade                   int16s[4]
-    112    ColorTempShade                       int16s
-    113    WB_RGGBLevelsCloudy                  int16s[4]
-    117    ColorTempCloudy                      int16s
-    118    WB_RGGBLevelsTungsten                int16s[4]
-    122    ColorTempTungsten                    int16s
-    123    WB_RGGBLevelsFluorescent             int16s[4]
-    127    ColorTempFluorescent                 int16s
-    128    WB_RGGBLevelsKelvin                  int16s[4]
-    132    ColorTempKelvin                      int16s
-    133    WB_RGGBLevelsFlash                   int16s[4]
-    137    ColorTempFlash                       int16s
-    138    WB_RGGBLevelsUnknown6?               int16s[4]
-    142    ColorTempUnknown6?                   int16s
-    143    WB_RGGBLevelsUnknown7?               int16s[4]
-    147    ColorTempUnknown7?                   int16s
-    148    WB_RGGBLevelsUnknown8?               int16s[4]
-    152    ColorTempUnknown8?                   int16s
-    153    WB_RGGBLevelsUnknown9?               int16s[4]
-    157    ColorTempUnknown9?                   int16s
-    158    WB_RGGBLevelsUnknown10?              int16s[4]
-    162    ColorTempUnknown10?                  int16s
-    163    WB_RGGBLevelsUnknown11?              int16s[4]
-    167    ColorTempUnknown11?                  int16s
-    168    WB_RGGBLevelsUnknown12?              int16s[4]
-    172    ColorTempUnknown12?                  int16s
-    173    WB_RGGBLevelsUnknown13?              int16s[4]
-    177    ColorTempUnknown13?                  int16s
-    178    WB_RGGBLevelsUnknown14?              int16s[4]
-    182    ColorTempUnknown14?                  int16s
-    183    WB_RGGBLevelsUnknown15?              int16s[4]
-    187    ColorTempUnknown15?                  int16s
-    188    ColorCalib?                          Canon ColorCalib
-    404    RawMeasuredRGGB                      int32u[4]
+  0x0001   UnknownEV?                           rational64u
+  0x0003   ExposureValue                        rational64u
+  0x03e9   OriginalFileName                     string
+  0x03eb   SensorLeftBorder                     N
+  0x03ec   SensorTopBorder                      N
+  0x03ed   SensorImageWidth                     N
+  0x03ee   SensorImageHeight                    N
+  0x03f1   TextualInfo                          Kodak TextualInfo
+  0x03fc   WhiteBalance                         int16u
+  0x03fd   Processing                           Kodak Processing
+  0x0401   Time                                 string
+  0x0414   NCDFileInfo                          string
+  0x0846   ColorTemperature                     int16u
+  0x0852   WB_RGBMul0                           N
+  0x0853   WB_RGBMul1                           N
+  0x0854   WB_RGBMul2                           N
+  0x0855   WB_RGBMul3                           N
+  0x085c   WB_RGBCoeffs0                        N
+  0x085d   WB_RGBCoeffs1                        N
+  0x085e   WB_RGBCoeffs2                        N
+  0x085f   WB_RGBCoeffs3                        N
+  0x0ce5   FirmwareVersion                      string
+  0x1391   ToneCurveFileName                    string
+  0x1784   ISO                                  int32u
+
+=head3 Kodak TextualInfo Tags
+
+Below is a list of tags which have been observed in the Kodak TextualInfo
+data, however ExifTool will extract information from any tags found here.
 
-=head3 Canon ColorData7 Tags
+  Tag ID                Tag Name                Writable
+  ------                --------                --------
+  'AF Function'         AFMode                  N
+  'Actual Compensation' ActualCompensation      N
+  'Aperture'            Aperture                N
+  'Auto Bracket'        AutoBracket             N
+  'Brightness Value'    BrightnessValue         N
+  'Camera'              CameraModel             N
+  'Camera body'         CameraBody              N
+  'Compensation'        ExposureCompensation    N
+  'Date'                Date                    N
+  'Exposure Bias'       ExposureBias            N
+  'Exposure Mode'       ExposureMode            N
+  'Firmware Version'    FirmwareVersion         N
+  'Flash Compensation'  FlashExposureComp       N
+  'Flash Fired'         FlashFired              N
+  'Flash Sync Mode'     FlashSyncMode           N
+  'Focal Length'        FocalLength             N
+  'Height'              KodakImageHeight        N
+  'ISO'                 ISO                     N
+  'ISO Speed'           ISO                     N
+  'Image Number'        ImageNumber             N
+  'Max Aperture'        MaxAperture             N
+  'Meter Mode'          MeterMode               N
+  'Min Aperture'        MinAperture             N
+  'Popup Flash'         PopupFlash              N
+  'Serial Number'       SerialNumber            N
+  'Shooting Mode'       ShootingMode            N
+  'Shutter'             ShutterSpeed            N
+  'Temperature'         Temperature             N
+  'Time'                Time                    N
+  'White balance'       WhiteBalance            N
+  'Width'               KodakImageWidth         N
+  '_other_info'         OtherInfo               N
 
-These tags are used by the EOS 1DX, 5DmkIII, 6D, 100D, 650D, 700D and M.
+=head3 Kodak Processing Tags
 
   Index2   Tag Name                             Writable
   ------   --------                             --------
-      0    ColorDataVersion                     int16s
-     63    WB_RGGBLevelsAsShot                  int16s[4]
-     67    ColorTempAsShot                      int16s
-     68    WB_RGGBLevelsAuto                    int16s[4]
-     72    ColorTempAuto                        int16s
-     73    WB_RGGBLevelsMeasured                int16s[4]
-     77    ColorTempMeasured                    int16s
-     78    WB_RGGBLevelsUnknown?                int16s[4]
-     82    ColorTempUnknown?                    int16s
-     83    WB_RGGBLevelsUnknown2?               int16s[4]
-     87    ColorTempUnknown2?                   int16s
-     88    WB_RGGBLevelsUnknown3?               int16s[4]
-     92    ColorTempUnknown3?                   int16s
-     93    WB_RGGBLevelsUnknown4?               int16s[4]
-     97    ColorTempUnknown4?                   int16s
-     98    WB_RGGBLevelsUnknown5?               int16s[4]
-    102    ColorTempUnknown5?                   int16s
-    103    WB_RGGBLevelsUnknown6?               int16s[4]
-    107    ColorTempUnknown6?                   int16s
-    108    WB_RGGBLevelsUnknown7?               int16s[4]
-    112    ColorTempUnknown7?                   int16s
-    113    WB_RGGBLevelsUnknown8?               int16s[4]
-    117    ColorTempUnknown8?                   int16s
-    118    WB_RGGBLevelsUnknown9?               int16s[4]
-    122    ColorTempUnknown9?                   int16s
-    123    WB_RGGBLevelsUnknown10?              int16s[4]
-    127    ColorTempUnknown10?                  int16s
-    128    WB_RGGBLevelsDaylight                int16s[4]
-    132    ColorTempDaylight                    int16s
-    133    WB_RGGBLevelsShade                   int16s[4]
-    137    ColorTempShade                       int16s
-    138    WB_RGGBLevelsCloudy                  int16s[4]
-    142    ColorTempCloudy                      int16s
-    143    WB_RGGBLevelsTungsten                int16s[4]
-    147    ColorTempTungsten                    int16s
-    148    WB_RGGBLevelsFluorescent             int16s[4]
-    152    ColorTempFluorescent                 int16s
-    153    WB_RGGBLevelsKelvin                  int16s[4]
-    157    ColorTempKelvin                      int16s
-    158    WB_RGGBLevelsFlash                   int16s[4]
-    162    ColorTempFlash                       int16s
-    163    WB_RGGBLevelsUnknown11?              int16s[4]
-    167    ColorTempUnknown11?                  int16s
-    168    WB_RGGBLevelsUnknown12?              int16s[4]
-    172    ColorTempUnknown12?                  int16s
-    173    WB_RGGBLevelsUnknown13?              int16s[4]
-    177    ColorTempUnknown13?                  int16s
-    178    WB_RGGBLevelsUnknown14?              int16s[4]
-    182    ColorTempUnknown14?                  int16s
-    183    WB_RGGBLevelsUnknown15?              int16s[4]
-    187    ColorTempUnknown15?                  int16s
-    188    WB_RGGBLevelsUnknown16?              int16s[4]
-    192    ColorTempUnknown16?                  int16s
-    193    WB_RGGBLevelsUnknown17?              int16s[4]
-    197    ColorTempUnknown17?                  int16s
-    198    WB_RGGBLevelsUnknown18?              int16s[4]
-    202    ColorTempUnknown18?                  int16s
-    203    WB_RGGBLevelsUnknown19?              int16s[4]
-    207    ColorTempUnknown19?                  int16s
-    208    WB_RGGBLevelsUnknown20?              int16s[4]
-    212    ColorTempUnknown20?                  int16s
-    213    ColorCalib?                          Canon ColorCalib
-    429    RawMeasuredRGGB                      int32u[4]
+     20    WB_RGBLevels                         N
 
-=head3 Canon ColorDataUnknown Tags
+=head3 Kodak Meta Tags
 
-  Index2   Tag Name                             Writable
+These tags are found in the APP3 "Meta" segment of JPEG images from Kodak
+cameras such as the DC280, DC3400, DC5000, MC3, M580, Z950 and Z981.  The
+structure of this segment is similar to the APP1 "Exif" segment, but a
+different set of tags is used.
+
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      0    ColorDataVersion                     N
+  0xc350   FilmProductCode                      N
+  0xc351   ImageSourceEK                        N
+  0xc352   CaptureConditionsPAR                 N
+  0xc353   CameraOwner                          undef
+  0xc354   SerialNumber                         undef
+  0xc355   UserSelectGroupTitle                 N
+  0xc356   DealerIDNumber                       N
+  0xc357   CaptureDeviceFID                     N
+  0xc358   EnvelopeNumber                       N
+  0xc359   FrameNumber                          N
+  0xc35a   FilmCategory                         N
+  0xc35b   FilmGencode                          N
+  0xc35c   ModelAndVersion                      N
+  0xc35d   FilmSize                             N
+  0xc35e   SBA_RGBShifts                        N
+  0xc35f   SBAInputImageColorspace              N
+  0xc360   SBAInputImageBitDepth                N
+  0xc361   SBAExposureRecord                    N
+  0xc362   UserAdjSBA_RGBShifts                 N
+  0xc363   ImageRotationStatus                  N
+  0xc364   RollGuidElements                     N
+  0xc365   MetadataNumber                       N
+  0xc366   EditTagArray                         N
+  0xc367   Magnification                        N
+  0xc36c   NativeXResolution                    N
+  0xc36d   NativeYResolution                    N
+  0xc36e   KodakEffectsIFD                      Kodak SpecialEffects
+  0xc36f   KodakBordersIFD                      Kodak Borders
+  0xc37a   NativeResolutionUnit                 N
+  0xc418   SourceImageDirectory                 N
+  0xc419   SourceImageFileName                  N
+  0xc41a   SourceImageVolumeName                N
+  0xc46c   PrintQuality                         N
+  0xc46e   ImagePrintStatus                     N
 
-=head3 Canon ColorInfo Tags
+=head3 Kodak SpecialEffects Tags
 
-  Index2   Tag Name                             Writable
+The Kodak SpecialEffects and Borders tags are found in sub-IFD's within the
+Kodak JPEG APP3 "Meta" segment.
+
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      1    Saturation                           int16s
-      2    ColorTone                            int16s
-      3    ColorSpace                           int16s
+  0x0000   DigitalEffectsVersion                N
+  0x0001   DigitalEffectsName                   N
+  0x0002   DigitalEffectsType                   N
 
-=head3 Canon AFMicroAdj Tags
+=head3 Kodak Borders Tags
 
-  Index4   Tag Name                             Writable
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      1    AFMicroAdjMode                       int32s
-      2    AFMicroAdjValue                      rational64s
+  0x0000   BordersVersion                       N
+  0x0001   BorderName                           N
+  0x0002   BorderID                             N
+  0x0003   BorderLocation                       N
+  0x0004   BorderType                           N
+  0x0008   WatermarkType                        N
 
-=head3 Canon VignettingCorr Tags
+=head3 Kodak KDC_IFD Tags
 
-This information is found in images from the 1DmkIV, 5DmkII, 7D, 50D, 60D,
-500D and 550D.
+These tags are found in a separate IFD of KDC images from some newer Kodak
+models such as the P880 and Z1015IS.
 
-  Index2   Tag Name                             Writable
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      2    PeripheralLighting                   int16s
-      4    ChromaticAberrationCorr              int16s
-      5    ChromaticAberrationCorr              int16s
-      6    PeripheralLightingValue              int16s
-     11    OriginalImageWidth                   int16s
-     12    OriginalImageHeight                  int16s
+  0xfa00   SerialNumber                         string
+  0xfa0d   WhiteBalance                         int8u
+  0xfa25   WB_RGBLevelsAuto                     N
+  0xfa27   WB_RGBLevelsTungsten                 N
+  0xfa28   WB_RGBLevelsFluorescent              N
+  0xfa29   WB_RGBLevelsDaylight                 N
+  0xfa2a   WB_RGBLevelsShade                    N
 
-=head3 Canon VignettingCorr2 Tags
+=head3 Kodak Free Tags
 
-  Index4   Tag Name                             Writable
+Information stored in the "free" atom of Kodak MP4 videos. (VERY bad form
+for Kodak to store useful information in an atom intended for unused space!)
+
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      5    PeripheralLightingSetting            int32s
-      6    ChromaticAberrationSetting           int32s
+  'AprV'   ApertureValue                        N
+  'BrtV'   BrightnessValue                      N
+  'Expc'   ExposureCompensation                 N
+  'Expo'   ExposureTime                         N
+  'FL35'   FocalLengthIn35mmFormat              N
+  'FNum'   FNumber                              N
+  'FoLn'   FocalLength                          N
+  'ISOS'   ISO                                  N
+  'SVer'   FirmwareVersion                      N
+  'Scrn'   PreviewInfo                          Kodak Scrn
+  'Seri'   SerialNumber                         N
+  'StSV'   ShutterSpeedValue                    N
 
-=head3 Canon LightingOpt Tags
+=head3 Kodak Scrn Tags
 
-This information is new in images from the EOS 7D.
+  Index2   Tag Name                             Writable
+  ------   --------                             --------
+      0    PreviewImageWidth                    N
+      1    PreviewImageHeight                   N
+      2    PreviewImageLength                   N
+      4    PreviewImage                         N
 
-  Index4   Tag Name                             Writable
+=head3 Kodak DcMD Tags
+
+Metadata directory found in MOV and MP4 videos from some Kodak cameras.
+
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      2    AutoLightingOptimizer                int32s
+  'CMbo'   CameraByteOrder                      N
+  'Cmbo'   CameraByteOrder                      N
+  'DcEM'   DcEM                                 Kodak DcEM
+  'DcME'   DcME                                 Kodak DcME
 
-=head3 Canon LensInfo Tags
+=head3 Kodak DcEM Tags
 
-  Index1   Tag Name                             Writable
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      0    LensSerialNumber                     undef[5]
+  [no tags known]
 
-=head3 Canon Ambience Tags
+=head3 Kodak DcME Tags
 
-  Index4   Tag Name                             Writable
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      1    AmbienceSelection                    int32s
+  [no tags known]
 
-=head3 Canon FilterInfo Tags
+=head3 Kodak MOV Tags
 
-Information about creative filter settings.
+This information is found in the TAGS atom of MOV videos from Kodak models
+such as the P880.
+
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    Make                                 N
+     22    Model                                N
+     64    ModelType                            N
+     78    ExposureTime                         N
+     82    FNumber                              N
+     90    ExposureCompensation                 N
+    112    FocalLength                          N
 
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-  0x0101   GrainyBWFilter                       N
-  0x0201   SoftFocusFilter                      N
-  0x0301   ToyCameraFilter                      N
-  0x0401   MiniatureFilter                      N
-  0x0402   MiniatureFilterOrientation           N
-  0x0403   MiniatureFilterPosition              N
+=head2 Leaf Tags
 
-=head3 Canon CNTH Tags
+These tags are found in .MOS images from Leaf digital camera backs as
+written by Creo Leaf Capture.  They exist within the Leaf-specific directory
+structure of EXIF tag 0x8606.  The tables below list observed Leaf tags,
+however ExifTool will extract any tags found in the Leaf directories even if
+they don't appear in these tables.
 
-Canon-specific QuickTime tags found in the CNTH atom of MOV videos from some
-cameras such as the PowerShot S95.
+  Tag ID                          Tag Name      Writable
+  ------                          --------      --------
+  'JPEG_preview_data'             PreviewImage  undef
+  'JPEG_preview_info'             PreviewInfo   N
+  'PDA_histogram_data'            PDAHistogram  N
+  'back_serial_number'            BackSerial    N
+  'camera_profile'                CameraProfile Leaf CameraProfile
+  'icc_camera_profile'            ICC_Profile   ICC_Profile
+  'icc_camera_to_tone_matrix'     ToneMatrix    N
+  'icc_camera_to_tone_space_flow' ToneSpaceFlow N
+  'icc_rgb_ws_profile'            RGB_Profile   ICC_Profile
+  'image_offset'                  ImageOffset   N
+  'pattern_ratation_angle'        PatternAngle  N
 
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-  'CNDA'   ThumbnailImage                       N
+=head3 Leaf CameraProfile Tags
 
-=head3 Canon Skip Tags
+All B<Tag ID>'s in the following table have a leading 'CamProf_' which
+has been removed.
 
-Information found in the "skip" atom of Canon MOV videos.
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'back_type'          CameraBackType           N
+  'capture_profile'    CaptureProfile           Leaf CaptureProfile
+  'image_profile'      ImageProfile             Leaf ImageProfile
+  'name'               CameraName               N
+  'type'               CameraType               N
+  'version'            CameraProfileVersion     N
 
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-  'CNDB'   Unknown_CNDB?                        N
+=head3 Leaf CaptureProfile Tags
 
-=head2 CanonCustom Tags
+All B<Tag ID>'s in the following table have a leading 'CaptProf_' which
+has been removed.
 
-=head3 CanonCustom Functions1D Tags
+  Tag ID                 Tag Name               Writable
+  ------                 --------               --------
+  'CCD_rect'             CCDRect                N
+  'CCD_valid_rect'       CCDValidRect           N
+  'CCD_video_rect'       CCDVideoRect           N
+  'back_type'            CaptProfBackType       N
+  'center_dark_rect'     CenterDarkRect         N
+  'color_averages'       ColorAverages          N
+  'color_matrix'         ColorMatrix            N
+  'dark_correction_type' DarkCorrectionType     N
+  'image_bounds'         ImageBounds            N
+  'image_fields'         ImageFields            N
+  'image_offset'         ImageOffset            N
+  'left_dark_rect'       LeftDarkRect           N
+  'luminance_consts'     LuminanceConsts        N
+  'mosaic_pattern'       MosaicPattern          N
+  'name'                 CaptProfName           N
+  'number_of_planes'     NumberOfPlanes         N
+  'raw_data_rotation'    RawDataRotation        N
+  'reconstruction_type'  ReconstructionType     N
+  'right_dark_rect'      RightDarkRect          N
+  'serial_number'        CaptureSerial          N
+  'type'                 CaptProfType           N
+  'version'              CaptProfVersion        N
+  'xy_offset_info'       XYOffsetInfo           N
 
-These custom functions are used by all 1D models up to but not including the
-Mark III.
+=head3 Leaf ImageProfile Tags
 
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-      0    FocusingScreen                       int8u
-      1    FinderDisplayDuringExposure          int8u
-      2    ShutterReleaseNoCFCard               int8u
-      3    ISOSpeedExpansion                    int8u
-      4    ShutterAELButton                     int8u
-      5    ManualTv                             int8u
-      6    ExposureLevelIncrements              int8u
-      7    USMLensElectronicMF                  int8u
-      8    LCDPanels                            int8u
-      9    AEBSequenceAutoCancel                int8u
-     10    AFPointIllumination                  int8u
-     11    AFPointSelection                     int8u
-     12    MirrorLockup                         int8u
-     13    AFPointSpotMetering                  int8u
-     14    FillFlashAutoReduction               int8u
-     15    ShutterCurtainSync                   int8u
-     16    SafetyShiftInAvOrTv                  int8u
-     17    AFPointActivationArea                int8u
-     18    SwitchToRegisteredAFPoint            int8u
-     19    LensAFStopButton                     int8u
-     20    AIServoTrackingSensitivity           int8u
-     21    AIServoContinuousShooting            int8u
+All B<Tag ID>'s in the following table have a leading 'ImgProf_' which
+has been removed.
 
-=head3 CanonCustom Functions5D Tags
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'back_type'          ImgProfBackType          N
+  'image_status'       ImageStatus              N
+  'name'               ImgProfName              N
+  'rotation_angle'     RotationAngle            N
+  'shoot_setup'        ShootSetup               Leaf ShootSetup
+  'type'               ImgProfType              N
+  'version'            ImgProfVersion           N
 
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-      0    FocusingScreen                       int8u
-      1    SetFunctionWhenShooting              int8u
-      2    LongExposureNoiseReduction           int8u
-      3    FlashSyncSpeedAv                     int8u
-      4    Shutter-AELock                       int8u
-      5    AFAssistBeam                         int8u
-      6    ExposureLevelIncrements              int8u
-      7    FlashFiring                          int8u
-      8    ISOExpansion                         int8u
-      9    AEBSequenceAutoCancel                int8u
-     10    SuperimposedDisplay                  int8u
-     11    MenuButtonDisplayPosition            int8u
-     12    MirrorLockup                         int8u
-     13    AFPointSelectionMethod               int8u
-     14    ETTLII                               int8u
-     15    ShutterCurtainSync                   int8u
-     16    SafetyShiftInAvOrTv                  int8u
-     17    AFPointActivationArea                int8u
-     18    LCDDisplayReturnToShoot              int8u
-     19    LensAFStopButton                     int8u
-     20    AddOriginalDecisionData              int8u
+=head3 Leaf ShootSetup Tags
 
-=head3 CanonCustom Functions10D Tags
+All B<Tag ID>'s in the following table have a leading 'ShootObj_' which
+has been removed.
 
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-      1    SetButtonWhenShooting                int8u
-      2    ShutterReleaseNoCFCard               int8u
-      3    FlashSyncSpeedAv                     int8u
-      4    Shutter-AELock                       int8u
-      5    AFAssist                             int8u
-      6    ExposureLevelIncrements              int8u
-      7    AFPointRegistration                  int8u
-      8    RawAndJpgRecording                   int8u
-      9    AEBSequenceAutoCancel                int8u
-     10    SuperimposedDisplay                  int8u
-     11    MenuButtonDisplayPosition            int8u
-     12    MirrorLockup                         int8u
-     13    AssistButtonFunction                 int8u
-     14    FillFlashAutoReduction               int8u
-     15    ShutterCurtainSync                   int8u
-     16    SafetyShiftInAvOrTv                  int8u
-     17    LensAFStopButton                     int8u
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'back_type'          ShootObjBackType         N
+  'camera_setup'       CameraSetup              Leaf CameraSetup
+  'capture_setup'      CaptureSetup             Leaf CaptureSetup
+  'color_setup'        ColorSetup               Leaf ColorSetup
+  'look_header'        LookHeader               Leaf LookHeader
+  'name'               ShootObjName             N
+  'save_setup'         SaveSetup                Leaf SaveSetup
+  'type'               ShootObjType             N
+  'version'            ShootObjVersion          N
 
-=head3 CanonCustom Functions20D Tags
+=head3 Leaf CameraSetup Tags
 
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-      0    SetFunctionWhenShooting              int8u
-      1    LongExposureNoiseReduction           int8u
-      2    FlashSyncSpeedAv                     int8u
-      3    Shutter-AELock                       int8u
-      4    AFAssistBeam                         int8u
-      5    ExposureLevelIncrements              int8u
-      6    FlashFiring                          int8u
-      7    ISOExpansion                         int8u
-      8    AEBSequenceAutoCancel                int8u
-      9    SuperimposedDisplay                  int8u
-     10    MenuButtonDisplayPosition            int8u
-     11    MirrorLockup                         int8u
-     12    AFPointSelectionMethod               int8u
-     13    ETTLII                               int8u
-     14    ShutterCurtainSync                   int8u
-     15    SafetyShiftInAvOrTv                  int8u
-     16    LensAFStopButton                     int8u
-     17    AddOriginalDecisionData              int8u
+All B<Tag ID>'s in the following table have a leading 'CameraObj_' which
+has been removed.
 
-=head3 CanonCustom Functions30D Tags
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'ISO_speed'          ISOSpeed                 N
+  'back_type'          CameraObjBackType        N
+  'camera_type'        CameraType               N
+  'lens_ID'            LensID                   N
+  'lens_type'          LensType                 N
+  'name'               CameraObjName            N
+  'strobe'             Strobe                   N
+  'type'               CameraObjType            N
+  'version'            CameraObjVersion         N
 
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-      1    SetFunctionWhenShooting              int8u
-      2    LongExposureNoiseReduction           int8u
-      3    FlashSyncSpeedAv                     int8u
-      4    Shutter-AELock                       int8u
-      5    AFAssistBeam                         int8u
-      6    ExposureLevelIncrements              int8u
-      7    FlashFiring                          int8u
-      8    ISOExpansion                         int8u
-      9    AEBSequenceAutoCancel                int8u
-     10    SuperimposedDisplay                  int8u
-     11    MenuButtonDisplayPosition            int8u
-     12    MirrorLockup                         int8u
-     13    AFPointSelectionMethod               int8u
-     14    ETTLII                               int8u
-     15    ShutterCurtainSync                   int8u
-     16    SafetyShiftInAvOrTv                  int8u
-     17    MagnifiedView                        int8u
-     18    LensAFStopButton                     int8u
-     19    AddOriginalDecisionData              int8u
+=head3 Leaf CaptureSetup Tags
 
-=head3 CanonCustom Functions350D Tags
+All B<Tag ID>'s in the following table have a leading 'CaptureObj_' which
+has been removed.
 
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-      0    SetButtonCrossKeysFunc               int8u
-      1    LongExposureNoiseReduction           int8u
-      2    FlashSyncSpeedAv                     int8u
-      3    Shutter-AELock                       int8u
-      4    AFAssistBeam                         int8u
-      5    ExposureLevelIncrements              int8u
-      6    MirrorLockup                         int8u
-      7    ETTLII                               int8u
-      8    ShutterCurtainSync                   int8u
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Multi_quality'      MultiQuality             N
+  'back_type'          CaptureObjBackType       N
+  'name'               CaptureObjName           N
+  'neutals'            Neutals                  Leaf Neutrals
+  'selection'          Selection                Leaf Selection
+  'sharpness'          Sharpness                Leaf Sharpness
+  'single_quality'     SingleQuality            N
+  'tone_curve'         ToneCurve                Leaf ToneCurve
+  'type'               CaptureObjType           N
+  'version'            CaptureObjVersion        N
 
-=head3 CanonCustom Functions400D Tags
+=head3 Leaf Neutrals Tags
 
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-      0    SetButtonCrossKeysFunc               int8u
-      1    LongExposureNoiseReduction           int8u
-      2    FlashSyncSpeedAv                     int8u
-      3    Shutter-AELock                       int8u
-      4    AFAssistBeam                         int8u
-      5    ExposureLevelIncrements              int8u
-      6    MirrorLockup                         int8u
-      7    ETTLII                               int8u
-      8    ShutterCurtainSync                   int8u
-      9    MagnifiedView                        int8u
-     10    LCDDisplayAtPowerOn                  int8u
+All B<Tag ID>'s in the following table have a leading 'NeutObj_' which
+has been removed.
 
-=head3 CanonCustom FunctionsD30 Tags
+  Tag ID                 Tag Name               Writable
+  ------                 --------               --------
+  'back_type'            NeutObjBackType        N
+  'color_casts'          ColorCasts             N
+  'highlight_end_points' HighlightEndPoints     N
+  'name'                 NeutObjName            N
+  'neutrals'             Neutrals               N
+  'shadow_end_points'    ShadowEndPoints        N
+  'type'                 NeutObjType            N
+  'version'              NeutObjVersion         N
 
-Custom functions for the EOS D30 and D60.
+=head3 Leaf Selection Tags
 
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-      1    LongExposureNoiseReduction           int8u
-      2    Shutter-AELock                       int8u
-      3    MirrorLockup                         int8u
-      4    ExposureLevelIncrements              int8u
-      5    AFAssist                             int8u
-      6    FlashSyncSpeedAv                     int8u
-      7    AEBSequenceAutoCancel                int8u
-      8    ShutterCurtainSync                   int8u
-      9    LensAFStopButton                     int8u
-     10    FillFlashAutoReduction               int8u
-     11    MenuButtonReturn                     int8u
-     12    SetButtonWhenShooting                int8u
-     13    SensorCleaning                       int8u
-     14    SuperimposedDisplay                  int8u
-     15    ShutterReleaseNoCFCard               int8u
+All B<Tag ID>'s in the following table have a leading 'SelObj_' which
+has been removed.
 
-=head3 CanonCustom FuncsUnknown Tags
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'back_type'          SelObjBackType           N
+  'locks'              Locks                    N
+  'name'               SelObjName               N
+  'orientation'        Orientation              N
+  'rect'               Rect                     N
+  'resolution'         Resolution               N
+  'scale'              Scale                    N
+  'type'               SelObjType               N
+  'version'            SelObjVersion            N
 
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-  [no tags known]
+=head3 Leaf Sharpness Tags
 
-=head3 CanonCustom PersonalFuncs Tags
+All B<Tag ID>'s in the following table have a leading 'SharpObj_' which
+has been removed.
 
-Personal function settings for the EOS-1D.
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'back_type'          SharpObjBackType         N
+  'data_len'           DataLen                  N
+  'name'               SharpObjName             N
+  'sharp_info'         SharpInfo                N
+  'sharp_method'       SharpMethod              N
+  'type'               SharpObjType             N
+  'version'            SharpObjVersion          N
 
-  Index2   Tag Name                             Writable
-  ------   --------                             --------
-      1    PF0CustomFuncRegistration            int16u
-      2    PF1DisableShootingModes              int16u
-      3    PF2DisableMeteringModes              int16u
-      4    PF3ManualExposureMetering            int16u
-      5    PF4ExposureTimeLimits                int16u
-      6    PF5ApertureLimits                    int16u
-      7    PF6PresetShootingModes               int16u
-      8    PF7BracketContinuousShoot            int16u
-      9    PF8SetBracketShots                   int16u
-     10    PF9ChangeBracketSequence             int16u
-     11    PF10RetainProgramShift               int16u
-     14    PF13DrivePriority                    int16u
-     15    PF14DisableFocusSearch               int16u
-     16    PF15DisableAFAssistBeam              int16u
-     17    PF16AutoFocusPointShoot              int16u
-     18    PF17DisableAFPointSel                int16u
-     19    PF18EnableAutoAFPointSel             int16u
-     20    PF19ContinuousShootSpeed             int16u
-     21    PF20LimitContinousShots              int16u
-     22    PF21EnableQuietOperation             int16u
-     24    PF23SetTimerLengths                  int16u
-     25    PF24LightLCDDuringBulb               int16u
-     26    PF25DefaultClearSettings             int16u
-     27    PF26ShortenReleaseLag                int16u
-     28    PF27ReverseDialRotation              int16u
-     29    PF28NoQuickDialExpComp               int16u
-     30    PF29QuickDialSwitchOff               int16u
-     31    PF30EnlargementMode                  int16u
-     32    PF31OriginalDecisionData             int16u
+=head3 Leaf ToneCurve Tags
 
-=head3 CanonCustom PersonalFuncValues Tags
+All B<Tag ID>'s in the following table have a leading 'ToneObj_' which
+has been removed.
 
-  Index2   Tag Name                             Writable
-  ------   --------                             --------
-      1    PF1Value                             int16u
-      2    PF2Value                             int16u
-      3    PF3Value                             int16u
-      4    PF4ExposureTimeMin                   int16u
-      5    PF4ExposureTimeMax                   int16u
-      6    PF5ApertureMin                       int16u
-      7    PF5ApertureMax                       int16u
-      8    PF8BracketShots                      int16u
-      9    PF19ShootingSpeedLow                 int16u
-     10    PF19ShootingSpeedHigh                int16u
-     11    PF20MaxContinousShots                int16u
-     12    PF23ShutterButtonTime                int16u
-     13    PF23FELockTime                       int16u
-     14    PF23PostReleaseTime                  int16u
-     15    PF25AEMode                           int16u
-     16    PF25MeteringMode                     int16u
-     17    PF25DriveMode                        int16u
-     18    PF25AFMode                           int16u
-     19    PF25AFPointSel                       int16u
-     20    PF25ImageSize                        int16u
-     21    PF25WBMode                           int16u
-     22    PF25Parameters                       int16u
-     23    PF25ColorMatrix                      int16u
-     24    PF27Value                            int16u
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'back_type'          ToneObjBackType          N
+  'gamma'              Gamma                    N
+  'name'               ToneObjName              N
+  'npts'               Npts                     N
+  'tones'              Tones                    N
+  'type'               ToneObjType              N
+  'version'            ToneObjVersion           N
 
-=head3 CanonCustom Functions2 Tags
+=head3 Leaf ColorSetup Tags
 
-Beginning with the EOS 1D Mark III, Canon finally created a set of custom
-function tags which are (reasonably) consistent across models.  The EOS 1D
-Mark III has 57 custom function tags divided into four main groups: 1.
-Exposure (0x0101-0x010f), 2. Image (0x0201-0x0203), Flash Exposure
-(0x0304-0x0306) and Display (0x0407-0x0409), 3. Auto Focus (0x0501-0x050e)
-and Drive (0x060f-0x0611), and 4. Operation (0x0701-0x070a) and Others
-(0x080b-0x0810).  The table below lists tags used by the EOS 1D Mark III, as
-well as newer tags and values added by later models.
+All B<Tag ID>'s in the following table have a leading 'ColorObj_' which
+has been removed.
 
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-  0x0101   ExposureLevelIncrements              int32s
-  0x0102   ISOSpeedIncrements                   int32s
-  0x0103   ISOSpeedRange                        int32s[3]
-           ISOExpansion                         int32s
-  0x0104   AEBAutoCancel                        int32s
-  0x0105   AEBSequence                          int32s
-  0x0106   AEBShotCount                         int32s[n]
-  0x0107   SpotMeterLinkToAFPoint               int32s
-  0x0108   SafetyShift                          int32s
-  0x0109   UsableShootingModes                  int32s[2]
-  0x010a   UsableMeteringModes                  int32s[2]
-  0x010b   ExposureModeInManual                 int32s
-  0x010c   ShutterSpeedRange                    int32s[3]
-  0x010d   ApertureRange                        int32s[3]
-  0x010e   ApplyShootingMeteringMode            int32s[8]
-  0x010f   FlashSyncSpeedAv                     int32s
-  0x0110   FEMicroadjustment                    int32s[3]
-  0x0111   AEMicroadjustment                    int32s[3]
-  0x0201   LongExposureNoiseReduction           int32s
-  0x0202   HighISONoiseReduction                int32s
-  0x0203   HighlightTonePriority                int32s
-  0x0204   AutoLightingOptimizer                int32s
-  0x0304   ETTLII                               int32s
-  0x0305   ShutterCurtainSync                   int32s
-  0x0306   FlashFiring                          int32s
-  0x0407   ViewInfoDuringExposure               int32s
-  0x0408   LCDIlluminationDuringBulb            int32s
-  0x0409   InfoButtonWhenShooting               int32s
-  0x040a   ViewfinderWarnings                   int32s
-  0x040b   LVShootingAreaDisplay                int32s
-  0x0501   USMLensElectronicMF                  int32s
-  0x0502   AIServoTrackingSensitivity           int32s
-  0x0503   AIServoImagePriority                 int32s
-  0x0504   AIServoTrackingMethod                int32s
-  0x0505   LensDriveNoAF                        int32s
-  0x0506   LensAFStopButton                     int32s
-  0x0507   AFMicroadjustment                    int32s[5]
-  0x0508   AFPointAreaExpansion                 int32s
-  0x0509   SelectableAFPoint                    int32s
-  0x050a   SwitchToRegisteredAFPoint            int32s
-  0x050b   AFPointAutoSelection                 int32s
-  0x050c   AFPointDisplayDuringFocus            int32s
-  0x050d   AFPointBrightness                    int32s
-  0x050e   AFAssistBeam                         int32s
-  0x050f   AFPointSelectionMethod               int32s
-  0x0510   VFDisplayIllumination                int32s
-           SuperimposedDisplay                  int32s
-  0x0511   AFDuringLiveView                     int32s
-  0x0512   SelectAFAreaSelectMode               int32s
-  0x0513   ManualAFPointSelectPattern           int32s
-  0x0514   DisplayAllAFPoints                   int32s
-  0x0515   FocusDisplayAIServoAndMF             int32s
-  0x0516   OrientationLinkedAFPoint             int32s
-  0x0517   MultiControllerWhileMetering         int32s
-  0x0518   AccelerationTracking                 int32s
-  0x0519   AIServoFirstImagePriority            int32s
-  0x051a   AIServoSecondImagePriority           int32s
-  0x060f   MirrorLockup                         int32s
-  0x0610   ContinuousShootingSpeed              int32s[3]
-  0x0611   ContinuousShotLimit                  int32s[2]
-  0x0701   Shutter-AELock                       int32s
-           AFAndMeteringButtons                 int32s
-           ShutterButtonAFOnButton              int32s
-  0x0702   AFOnAELockButtonSwitch               int32s
-  0x0703   QuickControlDialInMeter              int32s
-  0x0704   SetButtonWhenShooting                int32s
-  0x0705   ManualTv                             int32s
-  0x0706   DialDirectionTvAv                    int32s
-  0x0707   AvSettingWithoutLens                 int32s
-  0x0708   WBMediaImageSizeSetting              int32s
-  0x0709   LockMicrophoneButton                 int32s
-  0x070a   ButtonFunctionControlOff             int32s
-  0x070b   AssignFuncButton                     int32s
-  0x070c   CustomControls                       int32s
-  0x070d   StartMovieShooting                   int32s
-  0x070e   FlashButtonFunction                  int32s
-  0x070f   MultiFunctionLock                    int32s
-  0x080b   FocusingScreen                       int32s
-  0x080c   TimerLength                          int32s[4]
-  0x080d   ShortReleaseTimeLag                  int32s
-  0x080e   AddAspectRatioInfo                   int32s
-  0x080f   AddOriginalDecisionData              int32s
-  0x0810   LiveViewExposureSimulation           int32s
-  0x0811   LCDDisplayAtPowerOn                  int32s
-  0x0813   DefaultEraseOption                   int32s
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'back_type'          ColorObjBackType         N
+  'color_mode'         ColorMode                N
+  'color_type'         ColorType                N
+  'has_ICC'            HasICC                   N
+  'input_profile'      InputProfile             N
+  'name'               ColorObjName             N
+  'output_profile'     OutputProfile            N
+  'type'               ColorObjType             N
+  'version'            ColorObjVersion          N
 
-=head2 CanonVRD Tags
+=head3 Leaf LookHeader Tags
 
-Canon Digital Photo Professional writes VRD (Recipe Data) information as a
-trailer record to JPEG, TIFF, CRW and CR2 images, or as a stand-alone VRD
-file.  The tags listed below represent information found in this record.
-The complete VRD data record may be accessed as a block using the Extra
-'CanonVRD' tag, but this tag is not extracted or copied unless specified
-explicitly.
+All B<Tag ID>'s in the following table have a leading 'LookHead_' which
+has been removed.
 
-  Tag ID       Tag Name                         Writable
-  ------       --------                         --------
-  0xffff00f4   EditData                         CanonVRD Edit
-  0xffff00f5   IHLData                          CanonVRD IHL
-  0xffff00f6   XMP                              XMP
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'back_type'          LookHeadBackType         N
+  'name'               LookHeadName             N
+  'type'               LookHeadType             N
+  'version'            LookHeadVersion          N
 
-=head3 CanonVRD Edit Tags
+=head3 Leaf SaveSetup Tags
 
-Canon VRD edit information.
+All B<Tag ID>'s in the following table have a leading 'SaveObj_' which
+has been removed.
 
-   Index   Tag Name                             Writable
-   -----   --------                             --------
-      0    VRD1                                 CanonVRD Ver1
-      1    VRDStampTool                         CanonVRD StampTool
-      2    VRD2                                 CanonVRD Ver2
+  Tag ID                  Tag Name              Writable
+  ------                  --------              --------
+  'back_type'             SaveObjBackType       N
+  'leaf_auto_active'      LeafAutoActive        N
+  'leaf_auto_base_name'   LeafAutoBaseName      N
+  'leaf_hot_folder'       LeafHotFolder         N
+  'leaf_open_proc_HDR'    LeafOpenProcHDR       N
+  'leaf_output_file_type' LeafOutputFileType    N
+  'leaf_save_selection'   LeafSaveSelection     N
+  'name'                  SaveObjName           N
+  'std_auto_active'       StdAutoActive         N
+  'std_base_name'         StdBaseName           N
+  'std_hot_folder'        StdHotFolder          N
+  'std_open_in_photoshop' StdOpenInPhotoshop    N
+  'std_output_bit_depth'  StdOutputBitDepth     N
+  'std_output_color_mode' StdOutputColorMode    N
+  'std_output_file_type'  StdOutputFileType     N
+  'std_oxygen'            StdOxygen             N
+  'std_save_selection'    StdSaveSelection      N
+  'std_scaled_output'     StdScaledOutput       N
+  'std_sharpen_output'    StdSharpenOutput      N
+  'type'                  SaveObjType           N
+  'version'               SaveObjVersion        N
 
-=head3 CanonVRD Ver1 Tags
+=head3 Leaf SubIFD Tags
 
-  Index1   Tag Name                             Writable
+Leaf writes a TIFF-format sub-IFD inside IFD0 of a MOS image.  No tags in
+this sub-IFD are currently known, except for tag 0x8606 which really
+shouldn't be here anyway (so it doesn't appear in the table below) because
+it duplicates a reference to the same data of tag 0x8606 in IFD0.
+
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      2    VRDVersion                           N
-      6    WBAdjRGGBLevels                      int16u[4]
-     24    WhiteBalanceAdj                      int16u
-     26    WBAdjColorTemp                       int16u
-     36    WBFineTuneActive                     int16u
-     40    WBFineTuneSaturation                 int16u
-     44    WBFineTuneTone                       int16u
-     46    RawColorAdj                          int16u
-     48    RawCustomSaturation                  int32s
-     52    RawCustomTone                        int32s
-     56    RawBrightnessAdj                     int32s
-     60    ToneCurveProperty                    int16u
-    122    DynamicRangeMin                      int16u
-    124    DynamicRangeMax                      int16u
-    272    ToneCurveActive                      int16u
-    275    ToneCurveMode                        int8u
-    276    BrightnessAdj                        int8s
-    277    ContrastAdj                          int8s
-    278    SaturationAdj                        int16s
-    286    ColorToneAdj                         int32s
-    294    LuminanceCurvePoints                 int16u[21]
-    336    LuminanceCurveLimits                 int16u[4]
-    345    ToneCurveInterpolation               int8u
-    352    RedCurvePoints                       int16u[21]
-    394    RedCurveLimits                       int16u[4]
-    410    GreenCurvePoints                     int16u[21]
-    452    GreenCurveLimits                     int16u[4]
-    468    BlueCurvePoints                      int16u[21]
-    510    BlueCurveLimits                      int16u[4]
-    526    RGBCurvePoints                       int16u[21]
-    568    RGBCurveLimits                       int16u[4]
-    580    CropActive                           int16u
-    582    CropLeft                             int16u
-    584    CropTop                              int16u
-    586    CropWidth                            int16u
-    588    CropHeight                           int16u
-    602    SharpnessAdj                         int16u
-    608    CropAspectRatio                      int16u
-    610    ConstrainedCropWidth                 float
-    614    ConstrainedCropHeight                float
-    618    CheckMark                            int16u
-    622    Rotation                             int16u
-    624    WorkColorSpace                       int16u
+  [no tags known]
+
+=head2 Minolta Tags
+
+These tags are used by Minolta, Konica/Minolta as well as some Sony cameras.
+Minolta doesn't make things easy for decoders because the meaning of some
+tags and the location where some information is stored is different for
+different camera models.  (Take MinoltaQuality for example, which may be
+located in 5 different places.)
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   MakerNoteVersion                     undef[4]
+  0x0001   MinoltaCameraSettingsOld             Minolta CameraSettings
+  0x0003   MinoltaCameraSettings                Minolta CameraSettings
+  0x0004   MinoltaCameraSettings7D              Minolta CameraSettings7D
+  0x0010   CameraInfoA100                       Minolta CameraInfoA100
+  0x0018   ISInfoA100                           Minolta ISInfoA100
+           ImageStabilization                   N
+  0x0020   WBInfoA100                           Minolta WBInfoA100
+  0x0040   CompressedImageSize                  int32u
+  0x0081   PreviewImage                         undef
+  0x0088   PreviewImageStart                    int32u*
+  0x0089   PreviewImageLength                   int32u*
+  0x0100   SceneMode                            int32u
+  0x0101   ColorMode                            int32u
+  0x0102   MinoltaQuality                       int32u
+  0x0103   MinoltaQuality                       int32u
+           MinoltaImageSize                     int32u
+  0x0104   FlashExposureComp                    rational64s
+  0x0105   Teleconverter                        int32u
+  0x0107   ImageStabilization                   int32u
+  0x0109   RawAndJpgRecording                   int32u
+  0x010a   ZoneMatching                         int32u
+  0x010b   ColorTemperature                     int32u
+  0x010c   LensType                             int32u
+  0x0111   ColorCompensationFilter              int32s
+  0x0112   WhiteBalanceFineTune                 int32u
+  0x0113   ImageStabilization                   int32u
+  0x0114   MinoltaCameraSettings5D              Minolta CameraSettings5D
+           CameraSettingsA100                   Minolta CameraSettingsA100
+  0x0115   WhiteBalance                         int32u
+  0x0e00   PrintIM                              PrintIM
+  0x0f00   MinoltaCameraSettings2               N
+
+=head3 Minolta CameraSettings Tags
+
+There is some variability in CameraSettings information between different
+models (and sometimes even between different firmware versions), so this
+information may not be as reliable as it should be.  Because of this, tags
+in the following tables are set to lower priority to prevent them from
+superceding the values of same-named tags in other locations when duplicate
+tags are disabled.
+
+  Index4   Tag Name                             Writable
+  ------   --------                             --------
+      1    ExposureMode                         int32u
+      2    FlashMode                            int32u
+      3    WhiteBalance                         int32u~
+      4    MinoltaImageSize                     int32u
+      5    MinoltaQuality                       int32u
+      6    DriveMode                            int32u
+      7    MeteringMode                         int32u
+      8    ISO                                  int32u
+      9    ExposureTime                         int32u
+     10    FNumber                              int32u
+     11    MacroMode                            int32u
+     12    DigitalZoom                          int32u
+     13    ExposureCompensation                 int32u
+     14    BracketStep                          int32u
+     16    IntervalLength                       int32u
+     17    IntervalNumber                       int32u
+     18    FocalLength                          int32u
+     19    FocusDistance                        int32u
+     20    FlashFired                           int32u
+     21    MinoltaDate                          int32u
+     22    MinoltaTime                          int32u
+     23    MaxAperture                          int32u
+     26    FileNumberMemory                     int32u
+     27    LastFileNumber                       int32u
+     28    ColorBalanceRed                      int32u
+     29    ColorBalanceGreen                    int32u
+     30    ColorBalanceBlue                     int32u
+     31    Saturation                           int32u
+     32    Contrast                             int32u
+     33    Sharpness                            int32u
+     34    SubjectProgram                       int32u
+     35    FlashExposureComp                    int32u
+     36    ISOSetting                           int32u
+     37    MinoltaModelID                       int32u
+     38    IntervalMode                         int32u
+     39    FolderName                           int32u
+     40    ColorMode                            int32u
+     41    ColorFilter                          int32u
+     42    BWFilter                             int32u
+     43    InternalFlash                        int32u
+     44    Brightness                           int32u
+     45    SpotFocusPointX                      int32u
+     46    SpotFocusPointY                      int32u
+     47    WideFocusZone                        int32u
+     48    FocusMode                            int32u
+     49    FocusArea                            int32u
+     50    DECPosition                          int32u
+     51    ColorProfile                         int32u
+     52    DataImprint                          int32u
+     63    FlashMetering                        int32u
+
+=head3 Minolta CameraSettings7D Tags
+
+  Index2   Tag Name                             Writable
+  ------   --------                             --------
+      0    ExposureMode                         int16u
+      2    MinoltaImageSize                     int16u
+      3    MinoltaQuality                       int16u
+      4    WhiteBalance                         int16u
+     14    FocusMode                            int16u
+     16    AFPoints                             int16u
+     21    Flash                                int16u
+     22    FlashMode                            int16u
+     28    ISOSetting                           int16u
+     30    ExposureCompensation                 int16s
+     37    ColorSpace                           int16u
+     38    Sharpness                            int16u
+     39    Contrast                             int16u
+     40    Saturation                           int16u
+     45    FreeMemoryCardImages                 int16u
+     63    ColorTemperature                     int16s
+     64    HueAdjustment                        int16u
+     70    Rotation                             int16u
+     71    FNumber                              int16u
+     72    ExposureTime                         int16u
+     74    FreeMemoryCardImages                 int16u
+     94    ImageNumber                          int16u
+     96    NoiseReduction                       int16u
+     98    ImageNumber2                         int16u
+    113    ImageStabilization                   int16u
+    117    ZoneMatchingOn                       int16u
+
+=head3 Minolta CameraInfoA100 Tags
+
+Camera information for the Sony DSLR-A100.
+
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      1    AFSensorActive                       int8u
+      2    AFStatusActiveSensor                 int16s
+      4    AFStatusTop-Right                    int16s
+      6    AFStatusBottom-Right                 int16s
+      8    AFStatusBottom                       int16s
+     10    AFStatusMiddleHorizontal             int16s
+     12    AFStatusCenterVertical               int16s
+     14    AFStatusTop                          int16s
+     16    AFStatusTop-Left                     int16s
+     18    AFStatusBottom-Left                  int16s
+     20    FocusLocked                          int8u
+     21    AFPoint                              int8u
+     22    AFMode                               int8u
+     45    AFStatusLeft                         int16s
+     47    AFStatusCenterHorizontal             int16s
+     49    AFStatusRight                        int16s
+     51    AFAreaMode                           int8u
 
-=head3 CanonVRD StampTool Tags
+=head3 Minolta ISInfoA100 Tags
+
+Image stabilization information for the Sony DSLR-A100.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    StampToolCount                       N
+      0    ImageStabilization                   int16u
 
-=head3 CanonVRD Ver2 Tags
+=head3 Minolta WBInfoA100 Tags
 
-Tags added in DPP version 2.0 and later.
+White balance information for the Sony DSLR-A100.
+
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+     14    DriveMode                            int8u
+     16    Rotation                             int8u
+     20    ImageStabilizationSetting            int8u
+     21    DynamicRangeOptimizerMode            int8u
+     42    ExposureCompensationMode             int8u
+     43    WBBracketShotNumber                  int8u
+     44    WhiteBalanceBracketing               int8u
+     45    ExposureBracketShotNumber            int8u
+     49    FlashFunction                        int16u
+     52    ExposureMode                         int16u
+     54    ColorMode                            int16u
+     56    AverageLV                            int16u
+     60    FrameNumber                          int8u
+    150    WB_RGBLevels                         int16u[3]
+    174    WB_GBRGLevels                        int16u[4]
+    192    WB_RedLevelsTungsten                 int16u[7]
+    206    WB_BlueLevelsTungsten                int16u[7]
+    220    WB_RedLevelsDaylight                 int16u[7]
+    234    WB_BlueLevelsDaylight                int16u[7]
+    248    WB_RedLevelsCloudy                   int16u[7]
+    262    WB_BlueLevelsCloudy                  int16u[7]
+    276    WB_RedLevelsFlash                    int16u[7]
+    290    WB_BlueLevelsFlash                   int16u[7]
+    332    WB_RedLevelsFluorescent              int16u[7]
+    346    WB_BlueLevelsFluorescent             int16u[7]
+    360    WB_RedLevelsShade                    int16u[7]
+    374    WB_BlueLevelsShade                   int16u[7]
+    392    WB_RedLevel6500K                     int16u
+    394    WB_BlueLevel6500K                    int16u
+    396    WB_RedLevelCustom                    int16u
+    398    WB_BlueLevelCustom                   int16u
+    408    WB_RedLevel3500K                     int16u
+    410    WB_BlueLevel3500K                    int16u
+    446    WB_RedLevelsKelvin                   int16u[75]
+    596    WB_BlueLevelsKelvin                  int16u[75]
+    772    WB_RBLevelsFlash                     int16u[2]
+    776    WB_RBLevelsCoolWhiteF                int16u[2]
+   1000    WB_RBLevelsTungsten                  int16u[2]
+   1004    WB_RBLevelsDaylight                  int16u[2]
+   1008    WB_RBLevelsCloudy                    int16u[2]
+   1012    WB_RBLevelsFlash                     int16u[2]
+   1020    WB_RedLevelsFluorescent              int16u[7]
+   1034    WB_BlueLevelsFluorescent             int16u[7]
+   1048    WB_RBLevelsShade                     int16u[2]
+   1056    WB_RBLevels6500K                     int16u[2]
+   1060    WB_RBLevelsCustom                    int16u[2]
+   1072    WB_RBLevels3500K                     int16u[2]
+   1320    WB_RBLevelsDaylight                  int16u[2]
+   1350    WB_RGBLevels                         int16u[3]
+   1576    AEMeteringSegments                   int8u[40]
+   1680    MeasuredLV                           int8u
+   1681    BrightnessValue                      int8u
+  18872    ExposureTime                         int8u
+  18874    ISO                                  int8u
+  18875    FocusDistance                        int8u
+  18877    LensType                             int16uRev
+  18880    ExposureCompensation                 int8s
+  18881    FlashExposureComp                    int8s
+  18882    ImageStabilization                   int8u
+  18883    BrightnessValue                      int8u
+  18885    MaxAperture                          int8u
+  18887    FNumber                              int8u
+  18908    InternalSerialNumber                 string[12]
+
+=head3 Minolta CameraSettings5D Tags
 
   Index2   Tag Name                             Writable
   ------   --------                             --------
-      2    PictureStyle                         int16s
-      3    IsCustomPictureStyle                 int16s
-     13    StandardRawColorTone                 int16s
-     14    StandardRawSaturation                int16s
-     15    StandardRawContrast                  int16s
-     16    StandardRawLinear                    int16s
-     17    StandardRawSharpness                 int16s
-     18    StandardRawHighlightPoint            int16s
-     19    StandardRawShadowPoint               int16s
-     20    StandardOutputHighlightPoint         int16s
-     21    StandardOutputShadowPoint            int16s
-     22    PortraitRawColorTone                 int16s
-     23    PortraitRawSaturation                int16s
-     24    PortraitRawContrast                  int16s
-     25    PortraitRawLinear                    int16s
-     26    PortraitRawSharpness                 int16s
-     27    PortraitRawHighlightPoint            int16s
-     28    PortraitRawShadowPoint               int16s
-     29    PortraitOutputHighlightPoint         int16s
-     30    PortraitOutputShadowPoint            int16s
-     31    LandscapeRawColorTone                int16s
-     32    LandscapeRawSaturation               int16s
-     33    LandscapeRawContrast                 int16s
-     34    LandscapeRawLinear                   int16s
-     35    LandscapeRawSharpness                int16s
-     36    LandscapeRawHighlightPoint           int16s
-     37    LandscapeRawShadowPoint              int16s
-     38    LandscapeOutputHighlightPoint        int16s
-     39    LandscapeOutputShadowPoint           int16s
-     40    NeutralRawColorTone                  int16s
-     41    NeutralRawSaturation                 int16s
-     42    NeutralRawContrast                   int16s
-     43    NeutralRawLinear                     int16s
-     44    NeutralRawSharpness                  int16s
-     45    NeutralRawHighlightPoint             int16s
-     46    NeutralRawShadowPoint                int16s
-     47    NeutralOutputHighlightPoint          int16s
-     48    NeutralOutputShadowPoint             int16s
-     49    FaithfulRawColorTone                 int16s
-     50    FaithfulRawSaturation                int16s
-     51    FaithfulRawContrast                  int16s
-     52    FaithfulRawLinear                    int16s
-     53    FaithfulRawSharpness                 int16s
-     54    FaithfulRawHighlightPoint            int16s
-     55    FaithfulRawShadowPoint               int16s
-     56    FaithfulOutputHighlightPoint         int16s
-     57    FaithfulOutputShadowPoint            int16s
-     58    MonochromeFilterEffect               int16s
-     59    MonochromeToningEffect               int16s
-     60    MonochromeContrast                   int16s
-     61    MonochromeLinear                     int16s
-     62    MonochromeSharpness                  int16s
-     63    MonochromeRawHighlightPoint          int16s
-     64    MonochromeRawShadowPoint             int16s
-     65    MonochromeOutputHighlightPoint       int16s
-     66    MonochromeOutputShadowPoint          int16s
-     69    UnknownContrast?                     int16s
-     70    UnknownLinear?                       int16s
-     71    UnknownSharpness?                    int16s
-     72    UnknownRawHighlightPoint?            int16s
-     73    UnknownRawShadowPoint?               int16s
-     74    UnknownOutputHighlightPoint?         int16s
-     75    UnknownOutputShadowPoint?            int16s
-     78    CustomContrast                       int16s
-     79    CustomLinear                         int16s
-     80    CustomSharpness                      int16s
-     81    CustomRawHighlightPoint              int16s
-     82    CustomRawShadowPoint                 int16s
-     83    CustomOutputHighlightPoint           int16s
-     84    CustomOutputShadowPoint              int16s
-     88    CustomPictureStyleData               N
-     94    ChrominanceNoiseReduction            int16s
-     95    LuminanceNoiseReduction              int16s
-     96    ChrominanceNR_TIFF_JPEG              int16s
-     98    ChromaticAberrationOn                int16s
-     99    DistortionCorrectionOn               int16s
-    100    PeripheralIlluminationOn             int16s
-    101    ColorBlur                            int16s
-    102    ChromaticAberration                  int16s
-    103    DistortionCorrection                 int16s
-    104    PeripheralIllumination               int16s
-    105    AberrationCorrectionDistance         int16s
-    106    ChromaticAberrationRed               int16s
-    107    ChromaticAberrationBlue              int16s
-    109    LuminanceNR_TIFF_JPEG                int16s
-    110    AutoLightingOptimizerOn              int16s
-    111    AutoLightingOptimizer                int16s
-    117    StandardRawHighlight                 int16s
-    118    PortraitRawHighlight                 int16s
-    119    LandscapeRawHighlight                int16s
-    120    NeutralRawHighlight                  int16s
-    121    FaithfulRawHighlight                 int16s
-    122    MonochromeRawHighlight               int16s
-    123    UnknownRawHighlight?                 int16s
-    124    CustomRawHighlight                   int16s
-    126    StandardRawShadow                    int16s
-    127    PortraitRawShadow                    int16s
-    128    LandscapeRawShadow                   int16s
-    129    NeutralRawShadow                     int16s
-    130    FaithfulRawShadow                    int16s
-    131    MonochromeRawShadow                  int16s
-    132    UnknownRawShadow?                    int16s
-    133    CustomRawShadow                      int16s
-    139    AngleAdj                             int32s
-    142    CheckMark2                           int16u
-    144    UnsharpMask                          int16s
-    146    StandardUnsharpMaskStrength          int16s
-    148    StandardUnsharpMaskFineness          int16s
-    150    StandardUnsharpMaskThreshold         int16s
-    152    PortraitUnsharpMaskStrength          int16s
-    154    PortraitUnsharpMaskFineness          int16s
-    156    PortraitUnsharpMaskThreshold         int16s
-    158    LandscapeUnsharpMaskStrength         int16s
-    160    LandscapeUnsharpMaskFineness         int16s
-    162    LandscapeUnsharpMaskThreshold        int16s
-    164    NeutraUnsharpMaskStrength            int16s
-    166    NeutralUnsharpMaskFineness           int16s
-    168    NeutralUnsharpMaskThreshold          int16s
-    170    FaithfulUnsharpMaskStrength          int16s
-    172    FaithfulUnsharpMaskFineness          int16s
-    174    FaithfulUnsharpMaskThreshold         int16s
-    176    MonochromeUnsharpMaskStrength        int16s
-    178    MonochromeUnsharpMaskFineness        int16s
-    180    MonochromeUnsharpMaskThreshold       int16s
-    182    CustomUnsharpMaskStrength            int16s
-    184    CustomUnsharpMaskFineness            int16s
-    186    CustomUnsharpMaskThreshold           int16s
-    188    CustomDefaultUnsharpStrength         int16s
-    190    CustomDefaultUnsharpFineness         int16s
-    192    CustomDefaultUnsharpThreshold        int16s
-    214    CropCircleActive                     int16s
-    215    CropCircleX                          int16s
-    216    CropCircleY                          int16s
-    217    CropCircleRadius                     int16s
-    220    DLOOn                                int16s
-    221    DLOSetting                           int16s
-    222    DLOShootingDistance                  int16s
-    223    DLODataLength                        N
-    228    DLOSettingApplied                    int16s
-    229    DLOVersion                           string[10]
-    234    DLOData                              N
+     10    ExposureMode                         int16u
+     12    MinoltaImageSize                     int16u
+     13    MinoltaQuality                       int16u
+     14    WhiteBalance                         int16u
+     31    Flash                                int16u
+     32    FlashMode                            int16u
+     37    MeteringMode                         int16u
+     38    ISOSetting                           int16u
+     47    ColorSpace                           int16u
+     48    Sharpness                            int16u
+     49    Contrast                             int16u
+     50    Saturation                           int16u
+     53    ExposureTime                         int16u
+     54    FNumber                              int16u
+     55    FreeMemoryCardImages                 int16u
+     73    ColorTemperature                     int16s
+     74    HueAdjustment                        int16u
+     80    Rotation                             int16u
+     83    ExposureCompensation                 int16u
+     84    FreeMemoryCardImages                 int16u
+    101    Rotation                             int16u
+    110    ColorTemperature                     int16s
+    113    PictureFinish                        int16u
+    174    ImageNumber                          int16u
+    176    NoiseReduction                       int16u
+    189    ImageStabilization                   int16u
 
-=head3 CanonVRD IHL Tags
+=head3 Minolta CameraSettingsA100 Tags
 
-  Tag ID   Tag Name                             Writable
+Camera settings information for the Sony DSLR-A100.
+
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-  0x0001   IHL_EXIF                             EXIF
-           IHL_EXIF?                            N
-  0x0003   ThumbnailImage                       N
-  0x0004   PreviewImage                         N
-  0x0005   RawCodecVersion                      N
-  0x0006   CRCDevelParams?                      N
+      0    ExposureMode                         int16u
+      1    ExposureCompensationSetting          int16u
+      5    HighSpeedSync                        int16u
+      6    ShutterSpeedSetting                  int16u
+      7    ApertureSetting                      int16u
+      8    ExposureTime                         int16u
+      9    FNumber                              int16u
+     10    DriveMode2                           int16u
+     11    WhiteBalance                         int16u
+     12    FocusMode                            int16u
+     13    AFPointSelected                      int16u
+     14    AFAreaMode                           int16u
+     15    FlashMode                            int16u
+     16    FlashExposureCompSet                 int16u
+     18    MeteringMode                         int16u
+     19    ISOSetting                           int16u
+     20    ZoneMatchingMode                     int16u
+     21    DynamicRangeOptimizer                int16u
+     22    ColorMode                            int16u
+     23    ColorSpace                           int16u
+     24    Sharpness                            int16u
+     25    Contrast                             int16u
+     26    Saturation                           int16u
+     28    FlashMetering                        int16u
+     29    PrioritySetupShutterRelease          int16u
+     30    DriveMode                            int16u
+     31    SelfTimerTime                        int16u
+     32    ContinuousBracketing                 int16u
+     33    SingleFrameBracketing                int16u
+     34    WhiteBalanceBracketing               int16u
+     35    WhiteBalanceSetting                  int16u
+     36    PresetWhiteBalance                   int16u
+     37    ColorTemperatureSetting              int16u
+     38    CustomWBSetting                      int16u
+     39    DynamicRangeOptimizerSetting         int16u
+     50    FreeMemoryCardImages                 int16u
+     52    CustomWBRedLevel                     int16u
+     53    CustomWBGreenLevel                   int16u
+     54    CustomWBBlueLevel                    int16u
+     55    CustomWBError                        int16u
+     56    WhiteBalanceFineTune                 int16s
+     57    ColorTemperature                     int16u
+     58    ColorCompensationFilter              int16s
+     59    SonyImageSize                        int16u
+     60    SonyQuality                          int16u
+     61    InstantPlaybackTime                  int16u
+     62    InstantPlaybackSetup                 int16u
+     63    NoiseReduction                       int16u
+     64    EyeStartAF                           int16u
+     65    RedEyeReduction                      int16u
+     66    FlashDefault                         int16u
+     67    AutoBracketOrder                     int16u
+     68    FocusHoldButton                      int16u
+     69    AELButton                            int16u
+     70    ControlDialSet                       int16u
+     71    ExposureCompensationMode             int16u
+     72    AFAssist                             int16u
+     73    CardShutterLock                      int16u
+     74    LensShutterLock                      int16u
+     75    AFAreaIllumination                   int16u
+     76    MonitorDisplayOff                    int16u
+     77    RecordDisplay                        int16u
+     78    PlayDisplay                          int16u
+     80    ExposureIndicator                    int16u
+     81    AELExposureIndicator                 int16u
+     82    ExposureBracketingIndicatorLast      int16u
+     83    MeteringOffScaleIndicator            int16u
+     84    FlashExposureIndicator               int16u
+     85    FlashExposureIndicatorNext           int16u
+     86    FlashExposureIndicatorLast           int16u
+     87    ImageStabilization                   int16u
+     88    FocusModeSwitch                      int16u
+     89    FlashType                            int16u
+     90    Rotation                             int16u
+     91    AELock                               int16u
+     94    ColorTemperature                     int16u
+     95    ColorCompensationFilter              int16s
+     96    BatteryState                         int16u
 
-=head2 Casio Tags
+=head3 Minolta MMA Tags
+
+This information is found in MOV videos from Minolta models such as the
+DiMAGE A2, S414 and 7Hi.
+
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    Make                                 N
+     20    SoftwareVersion                      N
+
+=head3 Minolta MOV1 Tags
+
+This information is found in MOV videos from some Konica Minolta models such
+as the DiMage Z10 and X50.
+
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    Make                                 N
+     32    ModelType                            N
+     46    ExposureTime                         N
+     50    FNumber                              N
+     58    ExposureCompensation                 N
+     80    FocalLength                          N
+
+=head3 Minolta MOV2 Tags
+
+This information is found in MOV videos from some Minolta models such as the
+DiMAGE X and Xt.
+
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    Make                                 N
+     24    ModelType                            N
+     38    ExposureTime                         N
+     42    FNumber                              N
+     50    ExposureCompensation                 N
+     72    FocalLength                          N
+
+=head2 Nikon Tags
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
-  0x0001   RecordingMode                        int16u
-  0x0002   Quality                              int16u
-  0x0003   FocusMode                            int16u
-  0x0004   FlashMode                            int16u
-  0x0005   FlashIntensity                       int16u
-  0x0006   ObjectDistance                       int32u
-  0x0007   WhiteBalance                         int16u
-  0x000a   DigitalZoom                          int32u
-  0x000b   Sharpness                            int16u
-  0x000c   Contrast                             int16u
-  0x000d   Saturation                           int16u
-  0x0014   ISO                                  int16u
-  0x0015   FirmwareDate                         string[18]
-  0x0016   Enhancement                          int16u
-  0x0017   ColorFilter                          int16u
-  0x0018   AFPoint                              int16u
-  0x0019   FlashIntensity                       int16u
+  0x0001   MakerNoteVersion                     undef[4]
+  0x0002   ISO                                  int16u[2]
+  0x0003   ColorMode                            string
+  0x0004   Quality                              string
+  0x0005   WhiteBalance                         string
+  0x0006   Sharpness                            string
+  0x0007   FocusMode                            string
+  0x0008   FlashSetting                         string
+  0x0009   FlashType                            string
+  0x000b   WhiteBalanceFineTune                 int16s[n]
+  0x000c   WB_RBLevels                          rational64u[4]
+  0x000d   ProgramShift                         undef[4]
+  0x000e   ExposureDifference                   undef[4]
+  0x000f   ISOSelection                         string
+  0x0010   DataDump                             N
+  0x0011   PreviewIFD                           Nikon PreviewIFD
+  0x0012   FlashExposureComp                    undef[4]
+  0x0013   ISOSetting                           int16u[2]
+  0x0014   ColorBalanceA                        Nikon ColorBalanceA
+           NRWData?                             Y
+  0x0016   ImageBoundary                        int16u[4]
+  0x0017   ExternalFlashExposureComp            undef[4]
+  0x0018   FlashExposureBracketValue            undef[4]
+  0x0019   ExposureBracketValue                 rational64s
+  0x001a   ImageProcessing                      string
+  0x001b   CropHiSpeed                          int16u[7]~
+  0x001c   ExposureTuning                       undef[3]
+  0x001d   SerialNumber                         string!
+  0x001e   ColorSpace                           int16u
+  0x001f   VRInfo                               Nikon VRInfo
+  0x0020   ImageAuthentication                  int8u
+  0x0021   FaceDetect                           Nikon FaceDetect
+  0x0022   ActiveD-Lighting                     int16u
+  0x0023   PictureControlData                   Nikon PictureControl
+  0x0024   WorldTime                            Nikon WorldTime
+  0x0025   ISOInfo                              Nikon ISOInfo
+  0x002a   VignetteControl                      int16u
+  0x002b   DistortInfo                          Nikon DistortInfo
+  0x002c   UnknownInfo                          Nikon UnknownInfo
+  0x0032   UnknownInfo2                         Nikon UnknownInfo2
+  0x0035   HDRInfo                              Nikon HDRInfo
+  0x0039   LocationInfo                         Nikon LocationInfo
+  0x003d   BlackLevel                           int16u[4]
+  0x0080   ImageAdjustment                      string
+  0x0081   ToneComp                             string
+  0x0082   AuxiliaryLens                        string
+  0x0083   LensType                             int8u
+  0x0084   Lens                                 rational64u[4]
+  0x0085   ManualFocusDistance                  rational64u
+  0x0086   DigitalZoom                          rational64u
+  0x0087   FlashMode                            int8u
+  0x0088   AFInfo                               Nikon AFInfo
+                                                Nikon AFInfo
+  0x0089   ShootingMode                         int16u~
+  0x008b   LensFStops                           undef[4]
+  0x008c   ContrastCurve                        undef!
+  0x008d   ColorHue                             string
+  0x008f   SceneMode                            string
+  0x0090   LightSource                          string
+  0x0091   ShotInfoD40                          Nikon ShotInfoD40
+           ShotInfoD80                          Nikon ShotInfoD80
+           ShotInfoD90                          Nikon ShotInfoD90
+           ShotInfoD3a                          Nikon ShotInfoD3a
+           ShotInfoD3b                          Nikon ShotInfoD3b
+           ShotInfoD3X                          Nikon ShotInfoD3X
+           ShotInfoD3S                          Nikon ShotInfoD3S
+           ShotInfoD300a                        Nikon ShotInfoD300a
+           ShotInfoD300b                        Nikon ShotInfoD300b
+           ShotInfoD300S                        Nikon ShotInfoD300S
+           ShotInfoD700                         Nikon ShotInfoD700
+           ShotInfoD800                         Nikon ShotInfoD800
+           ShotInfoD5000                        Nikon ShotInfoD5000
+           ShotInfoD5100                        Nikon ShotInfoD5100
+           ShotInfoD5200                        Nikon ShotInfoD5200
+           ShotInfoD7000                        Nikon ShotInfoD7000
+           ShotInfo02xx                         Nikon ShotInfo
+           ShotInfoUnknown                      Nikon ShotInfo
+  0x0092   HueAdjustment                        int16s
+  0x0093   NEFCompression                       int16u
+  0x0094   Saturation                           int16s
+  0x0095   NoiseReduction                       string
+  0x0096   NEFLinearizationTable                undef!
+  0x0097   ColorBalance0100                     Nikon ColorBalance1
+           ColorBalance0102                     Nikon ColorBalance2
+           ColorBalance0103                     Nikon ColorBalance3
+           ColorBalance0205                     Nikon ColorBalance2
+           ColorBalance0209                     Nikon ColorBalance4
+           ColorBalance02                       Nikon ColorBalance2
+           ColorBalance0211                     Nikon ColorBalance4
+           ColorBalance0213                     Nikon ColorBalance2
+           ColorBalance0215                     Nikon ColorBalance4
+           ColorBalanceUnknown                  Nikon ColorBalanceUnknown
+  0x0098   LensData0100                         Nikon LensData00
+           LensData0101                         Nikon LensData01
+           LensData0201                         Nikon LensData01
+           LensData0204                         Nikon LensData0204
+           LensData0400                         Nikon LensData0400
+           LensDataUnknown                      Nikon LensDataUnknown
+  0x0099   RawImageCenter                       int16u[2]
+  0x009a   SensorPixelSize                      rational64u[2]
+  0x009c   SceneAssist                          string
+  0x009e   RetouchHistory                       int16u[10]
+  0x00a0   SerialNumber                         string
+  0x00a2   ImageDataSize                        int32u
+  0x00a5   ImageCount                           int32u
+  0x00a6   DeletedImageCount                    int32u
+  0x00a7   ShutterCount                         int32u!
+  0x00a8   FlashInfo0100                        Nikon FlashInfo0100
+           FlashInfo0102                        Nikon FlashInfo0102
+           FlashInfo0103                        Nikon FlashInfo0103
+           FlashInfoUnknown                     Nikon FlashInfoUnknown
+  0x00a9   ImageOptimization                    string
+  0x00aa   Saturation                           string
+  0x00ab   VariProgram                          string
+  0x00ac   ImageStabilization                   string
+  0x00ad   AFResponse                           string
+  0x00b0   MultiExposure                        Nikon MultiExposure
+  0x00b1   HighISONoiseReduction                int16u
+  0x00b3   ToningEffect                         string
+  0x00b6   PowerUpTime                          undef
+  0x00b7   AFInfo2                              Nikon AFInfo2
+  0x00b8   FileInfo                             Nikon FileInfo
+                                                Nikon FileInfo
+  0x00b9   AFTune                               Nikon AFTune
+  0x00bd   PictureControlData                   Nikon PictureControl
   0x0e00   PrintIM                              PrintIM
+  0x0e01   NikonCaptureData                     NikonCapture
+  0x0e09   NikonCaptureVersion                  string
+  0x0e0e   NikonCaptureOffsets                  Nikon CaptureOffsets
+  0x0e10   NikonScanIFD                         Nikon Scan
+  0x0e13   NikonCaptureEditVersions             NikonCapture
+           NikonCaptureEditVersions             undef!
+  0x0e1d   NikonICCProfile                      ICC_Profile
+  0x0e1e   NikonCaptureOutput                   Nikon CaptureOutput
+  0x0e22   NEFBitDepth                          int16u[4]!
 
-=head3 Casio Type2 Tags
+=head3 Nikon PreviewIFD Tags
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
-  0x0002   PreviewImageSize                     int16u[2]
-  0x0003   PreviewImageLength                   int32u*
-  0x0004   PreviewImageStart                    int32u*
-  0x0008   QualityMode                          int16u
-  0x0009   CasioImageSize                       int16u
-  0x000d   FocusMode                            int16u
-  0x0014   ISO                                  int16u
-  0x0019   WhiteBalance                         int16u
-  0x001d   FocalLength                          rational64u
-  0x001f   Saturation                           int16u
-  0x0020   Contrast                             int16u
-  0x0021   Sharpness                            int16u
-  0x0e00   PrintIM                              PrintIM
-  0x2000   PreviewImage                         undef
-  0x2001   FirmwareDate                         string[18]
-  0x2011   WhiteBalanceBias                     int16u[2]
-  0x2012   WhiteBalance                         int16u
-  0x2021   AFPointPosition                      int16u[4]~
-  0x2022   ObjectDistance                       int32u
-  0x2034   FlashDistance                        int16u
-  0x2076   SpecialEffectMode                    int8u[3]
-  0x2089   FaceInfo1                            Casio FaceInfo1
-           FaceInfo2                            Casio FaceInfo2
-           FaceInfoUnknown?                     Y
-  0x211c   FacesDetected                        int8u
-  0x3000   RecordMode                           int16u
-  0x3001   ReleaseMode                          int16u
-  0x3002   Quality                              int16u
-  0x3003   FocusMode                            int16u
-  0x3006   HometownCity                         string
-  0x3007   BestShotMode                         int16u
-  0x3008   AutoISO                              int16u
-  0x3009   AFMode                               int16u
-  0x3011   Sharpness                            undef[2]
-  0x3012   Contrast                             undef[2]
-  0x3013   Saturation                           undef[2]
-  0x3014   ISO                                  int16u
-  0x3015   ColorMode                            int16u
-  0x3016   Enhancement                          int16u
-  0x3017   ColorFilter                          int16u
-  0x301b   ArtMode                              int16u
-  0x301c   SequenceNumber                       int16u
-  0x301d   BracketSequence                      int16u[2]
-  0x3020   ImageStabilization                   int16u
-  0x302a   LightingMode                         int16u
-  0x302b   PortraitRefiner                      int16u
-  0x3030   SpecialEffectLevel                   int16u
-  0x3031   SpecialEffectSetting                 int16u
-  0x3103   DriveMode                            int16u
-  0x310b   ArtModeParameters                    int8u[3]
-  0x4001   CaptureFrameRate                     int16u[n]
-  0x4003   VideoQuality                         int16u
-
-=head3 Casio FaceInfo1 Tags
+  0x00fe   SubfileType                          N
+  0x0103   Compression                          N
+  0x011a   XResolution                          N
+  0x011b   YResolution                          N
+  0x0128   ResolutionUnit                       N
+  0x0201   PreviewImageStart                    int32u*
+  0x0202   PreviewImageLength                   int32u*
+  0x0213   YCbCrPositioning                     N
 
-Face-detect tags extracted from models such as the EX-H5.
+=head3 Nikon ColorBalanceA Tags
 
-  Index1   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-      0    FacesDetected                        int8u
-      1    FaceDetectFrameSize                  int16u[2]
-     13    Face1Position                        int16u[4]
-    124    Face2Position                        int16u[4]
-    235    Face3Position                        int16u[4]
-    346    Face4Position                        int16u[4]
-    457    Face5Position                        int16u[4]
-    568    Face6Position                        int16u[4]
-    679    Face7Position                        int16u[4]
-    790    Face8Position                        int16u[4]
-    901    Face9Position                        int16u[4]
-   1012    Face10Position                       int16u[4]
-
-=head3 Casio FaceInfo2 Tags
+    624    RedBalance                           int16u!
+    625    BlueBalance                          int16u!
 
-Face-detect tags extracted from models such as the EX-H20G and EX-ZR100.
+=head3 Nikon VRInfo Tags
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      2    FacesDetected                        int8u
-      4    FaceDetectFrameSize                  int16u[2]
-      8    FaceOrientation                      int8u
-     24    Face1Position                        int16u[4]
-     76    Face2Position                        int16u[4]
-    128    Face3Position                        int16u[4]
-    180    Face4Position                        int16u[4]
-    232    Face5Position                        int16u[4]
-    284    Face6Position                        int16u[4]
-    336    Face7Position                        int16u[4]
-    388    Face8Position                        int16u[4]
-    440    Face9Position                        int16u[4]
-    492    Face10Position                       int16u[4]
-
-=head3 Casio QVCI Tags
+      0    VRInfoVersion                        N
+      4    VibrationReduction                   int8u
+      6    VRMode                               int8u
 
-This information is found in the APP1 QVCI segment of JPEG images from the
-Casio QV-7000SX.
+=head3 Nikon FaceDetect Tags
 
-  Index1   Tag Name                             Writable
+  Index2   Tag Name                             Writable
   ------   --------                             --------
-     44    CasioQuality                         N
-     55    FocalRange?                          N
-     77    DateTimeOriginal                     N
-     98    ModelType                            N
-    114    ManufactureIndex                     N
-    124    ManufactureCode                      N
-
-=head3 Casio AVI Tags
+      1    FaceDetectFrameSize                  int16u[2]
+      3    FacesDetected                        int16u
+      4    Face1Position                        int16u[4]
+      8    Face2Position                        int16u[4]
+     12    Face3Position                        int16u[4]
+     16    Face4Position                        int16u[4]
+     20    Face5Position                        int16u[4]
+     24    Face6Position                        int16u[4]
+     28    Face7Position                        int16u[4]
+     32    Face8Position                        int16u[4]
+     36    Face9Position                        int16u[4]
+     40    Face10Position                       int16u[4]
+     44    Face11Position                       int16u[4]
+     48    Face12Position                       int16u[4]
 
-This information is found in Casio GV-10 AVI videos.
+=head3 Nikon PictureControl Tags
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    Software                             N
-
-=head2 FLIR Tags
-
-Information extracted from the maker notes of JPEG images from thermal
-imaging cameras by FLIR Systems Inc.
-
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-  0x0001   ImageTemperatureMax                  rational64u
-  0x0002   ImageTemperatureMin                  rational64u
-  0x0003   Emissivity                           rational64u
-  0x0004   UnknownTemperature?                  rational64u
-  0x0005   CameraTemperatureRangeMax?           rational64u
-  0x0006   CameraTemperatureRangeMin?           rational64u
-
-=head3 FLIR FFF Tags
-
-Information extracted from FLIR FFF images and the FLIR APP1 segment of JPEG
-images.
-
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-  0x0001   RawData                              FLIR RawData
-  0x0020   CameraInfo                           FLIR CameraInfo
-  0x0022   PaletteInfo                          FLIR PaletteInfo
-  0x0023   TextInfo                             FLIR TextInfo
-  0x0024   EmbeddedAudioFile                    N
-  0x002b   GPSInfo                              FLIR GPSInfo
-  0x002e   ParamInfo                            FLIR ParamInfo
-
-=head3 FLIR RawData Tags
+      0    PictureControlVersion                N
+      4    PictureControlName                   string[20]
+     24    PictureControlBase                   string[20]
+     48    PictureControlAdjust                 int8u
+     49    PictureControlQuickAdjust            int8u
+     50    Sharpness                            int8u
+     51    Contrast                             int8u
+     52    Brightness                           int8u
+     53    Saturation                           int8u
+     54    HueAdjustment                        int8u
+     55    FilterEffect                         int8u
+     56    ToningEffect                         int8u
+     57    ToningSaturation                     int8u
 
-The thermal image data may be stored either as raw data, or in PNG format.
-If stored as raw data, ExifTool adds a TIFF header to allow the data to be
-viewed as a TIFF image.  If stored in PNG format, the PNG image is extracted
-as-is.  Note that most FLIR cameras using the PNG format seem to write the
-16-bit raw image data in the wrong byte order.
+=head3 Nikon WorldTime Tags
 
-  Index2   Tag Name                             Writable
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-      1    RawThermalImageWidth                 N
-      2    RawThermalImageHeight                N
-     16    RawThermalImageType                  N
-   16.1    RawThermalImage                      N
+      0    Timezone                             int16s
+      2    DaylightSavings                      int8u
+      3    DateDisplayFormat                    int8u
 
-=head3 FLIR CameraInfo Tags
+=head3 Nikon ISOInfo Tags
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-     32    Emissivity                           N
-     36    ObjectDistance                       N
-     40    ReflectedApparentTemperature         N
-     44    AtmosphericTemperature               N
-     48    IRWindowTemperature                  N
-     52    IRWindowTransmission                 N
-     60    RelativeHumidity                     N
-    144    CameraTemperatureRangeMax            N
-    148    CameraTemperatureRangeMin            N
-    152    UnknownTemperature1?                 N
-    156    UnknownTemperature2?                 N
-    160    UnknownTemperature3?                 N
-    164    UnknownTemperature4?                 N
-    168    UnknownTemperature5?                 N
-    172    UnknownTemperature6?                 N
-    212    CameraModel                          N
-    244    CameraPartNumber                     N
-    260    CameraSerialNumber                   N
-    276    CameraSoftware                       N
-    368    LensModel                            N
-    400    LensPartNumber                       N
-    416    LensSerialNumber                     N
-    492    FilterModel                          N
-    508    FilterPartNumber                     N
-    540    FilterSerialNumber                   N
-    900    DateTimeOriginal                     N
+      0    ISO                                  int8u
+      4    ISOExpansion                         int16u
+      6    ISO2                                 int8u
+     10    ISOExpansion2                        int16u
 
-=head3 FLIR PaletteInfo Tags
+=head3 Nikon DistortInfo Tags
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    PaletteColors                        N
-      6    AboveColor                           N
-      9    BelowColor                           N
-     12    OverflowColor                        N
-     15    UnderflowColor                       N
-     18    Isotherm1Color                       N
-     21    Isotherm2Color                       N
-     26    PaletteMethod                        N
-     27    PaletteStretch                       N
-     48    PaletteFileName                      N
-     80    PaletteName                          N
-    112    Palette                              N
+      0    DistortionVersion?                   N
+      4    AutoDistortionControl                int8u
 
-=head3 FLIR TextInfo Tags
+=head3 Nikon UnknownInfo Tags
 
-  Tag Name                                      Writable
-  --------                                      --------
-  Label0                                        N
-  Label1                                        N
-  Label2                                        N
-  Label3                                        N
-  Value0                                        N
-  Value1                                        N
-  Value2                                        N
-  Value3                                        N
+  Index4   Tag Name                             Writable
+  ------   --------                             --------
+      0    UnknownInfoVersion?                  N
 
-=head3 FLIR GPSInfo Tags
+=head3 Nikon UnknownInfo2 Tags
 
-  Index1   Tag Name                             Writable
+  Index4   Tag Name                             Writable
   ------   --------                             --------
-     88    GPSMapDatum                          N
+      0    UnknownInfo2Version?                 N
 
-=head3 FLIR ParamInfo Tags
+=head3 Nikon HDRInfo Tags
 
-  Tag Name                                      Writable
-  --------                                      --------
-  DateTimeGenerated                             N
-  Param0                                        N
-  Param1                                        N
-  Param2                                        N
-  Param3                                        N
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    HDRInfoVersion                       string[4]
+      4    HDR                                  int8u
+      5    HDRLevel                             int8u
+      6    HDRSmoothing                         int8u
+      7    HDRLevel2                            int8u
 
-=head3 FLIR FPF Tags
+=head3 Nikon LocationInfo Tags
 
-Tags extracted from FLIR Public image Format (FPF) files.
+Tags written by some Nikon GPS-equipped cameras like the AW100.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-     32    FPFVersion                           N
-     36    ImageDataOffset                      N
-     40    ImageType                            N
-     42    ImagePixelFormat                     N
-     44    ImageWidth                           N
-     46    ImageHeight                          N
-     48    ExternalTriggerCount                 N
-     52    SequenceFrameNumber                  N
-    120    CameraModel                          N
-    152    CameraPartNumber                     N
-    184    CameraSerialNumber                   N
-    216    CameraTemperatureRangeMin            N
-    220    CameraTemperatureRangeMax            N
-    224    LensModel                            N
-    256    LensPartNumber                       N
-    288    LensSerialNumber                     N
-    320    FilterModel                          N
-    336    FilterPartNumber                     N
-    384    FilterSerialNumber                   N
-    480    Emissivity                           N
-    484    ObjectDistance                       N
-    488    ReflectedApparentTemperature         N
-    492    AtmosphericTemperature               N
-    496    RelativeHumidity                     N
-    500    ComputedAtmosphericTrans             N
-    504    EstimatedAtmosphericTrans            N
-    508    ReferenceTemperature                 N
-    512    IRWindowTemperature                  N
-    516    IRWindowTransmission                 N
-    584    DateTimeOriginal                     N
-    676    CameraScaleMin                       N
-    680    CameraScaleMax                       N
-    684    CalculatedScaleMin                   N
-    688    CalculatedScaleMax                   N
-    692    ActualScaleMin                       N
-    696    ActualScaleMax                       N
+      0    LocationInfoVersion                  undef[4]
+      4    TextEncoding                         int8u
+      5    CountryCode                          string[3]
+      9    Location                             undef[70]
 
-=head2 FujiFilm Tags
+=head3 Nikon AFInfo Tags
 
-  Tag ID   Tag Name                             Writable
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-  0x0000   Version                              undef
-  0x0010   InternalSerialNumber                 string
-  0x1000   Quality                              string
-  0x1001   Sharpness                            int16u
-  0x1002   WhiteBalance                         int16u
-  0x1003   Saturation                           int16u
-  0x1004   Contrast                             int16u
-  0x1005   ColorTemperature                     int16u
-  0x1006   Contrast                             int16u
-  0x100a   WhiteBalanceFineTune                 int32s[2]
-  0x100b   NoiseReduction                       int16u
-  0x100e   HighISONoiseReduction                int16u
-  0x1010   FujiFlashMode                        int16u
-  0x1011   FlashExposureComp                    rational64s
-  0x1020   Macro                                int16u
-  0x1021   FocusMode                            int16u
-  0x1023   FocusPixel                           int16u[2]
-  0x1030   SlowSync                             int16u
-  0x1031   PictureMode                          int16u
-  0x1033   EXRAuto                              int16u
-  0x1034   EXRMode                              int16u
-  0x1100   AutoBracketing                       int16u
-  0x1101   SequenceNumber                       int16u
-  0x1210   ColorMode                            int16u
-  0x1300   BlurWarning                          int16u
-  0x1301   FocusWarning                         int16u
-  0x1302   ExposureWarning                      int16u
-  0x1304   GEImageSize                          string
-  0x1400   DynamicRange                         int16u
-  0x1401   FilmMode                             int16u
-  0x1402   DynamicRangeSetting                  int16u
-  0x1403   DevelopmentDynamicRange              int16u
-  0x1404   MinFocalLength                       rational64s
-  0x1405   MaxFocalLength                       rational64s
-  0x1406   MaxApertureAtMinFocal                rational64s
-  0x1407   MaxApertureAtMaxFocal                rational64s
-  0x140b   AutoDynamicRange                     int16u
-  0x4100   FacesDetected                        int16u
-  0x4103   FacePositions                        int16u[n]
-  0x4282   FaceRecInfo                          FujiFilm FaceRecInfo
-  0x8000   FileSource                           string
-  0x8002   OrderNumber                          int32u
-  0x8003   FrameNumber                          int16u
-  0xb211   Parallax                             rational64s
+      0    AFAreaMode                           int8u
+      1    AFPoint                              int8u
+      2    AFPointsInFocus                      int16u
 
-=head3 FujiFilm FaceRecInfo Tags
+=head3 Nikon ShotInfoD40 Tags
 
-Face recognition information.
+These tags are extracted from encrypted data in D40 and D40X images.
 
-  Tag Name                                      Writable
-  --------                                      --------
-  Face1Birthday                                 N
-  Face1Category                                 N
-  Face1Name                                     N
-  Face2Birthday                                 N
-  Face2Category                                 N
-  Face2Name                                     N
-  Face3Birthday                                 N
-  Face3Category                                 N
-  Face3Name                                     N
-  Face4Birthday                                 N
-  Face4Category                                 N
-  Face4Name                                     N
-  Face5Birthday                                 N
-  Face5Category                                 N
-  Face5Name                                     N
-  Face6Birthday                                 N
-  Face6Category                                 N
-  Face6Name                                     N
-  Face7Birthday                                 N
-  Face7Category                                 N
-  Face7Name                                     N
-  Face8Birthday                                 N
-  Face8Category                                 N
-  Face8Name                                     N
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+    582    ShutterCount                         int32u
+  586.1    VibrationReduction                   int8u & 0x08
+    729    CustomSettingsD40                    NikonCustom SettingsD40
 
-=head3 FujiFilm RAF Tags
+=head3 Nikon ShotInfoD80 Tags
 
-FujiFilm RAF images contain meta information stored in a proprietary
-FujiFilm RAF format, as well as EXIF information stored inside an embedded
-JPEG preview image.  The table below lists tags currently decoded from the
-RAF-format information.
+These tags are extracted from encrypted data in D80 images.
 
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-  0x0100   RawImageFullSize                     N
-  0x0121   RawImageSize                         N
-  0x0130   FujiLayout                           N
-  0x2ff0   WB_GRGBLevels                        N
-  0xc000   RAFData                              FujiFilm RAFData
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+    586    ShutterCount                         int32u
+  590.1    Rotation                             int8u & 0x07
+  590.2    VibrationReduction                   int8u & 0x18
+  590.3    FlashFired                           int8u & 0xe0
+    708    NikonImageSize                       int8u & 0xf0
+  708.1    ImageQuality                         int8u & 0x0f
+    748    CustomSettingsD80                    NikonCustom SettingsD80
 
-=head3 FujiFilm RAFData Tags
+=head3 Nikon ShotInfoD90 Tags
 
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-      0    RawImageWidth                        N
-      4    RawImageWidth                        N
-           RawImageHeight                       N
-      8    RawImageHeight                       N
+These tags are extracted from encrypted data in images from the D90 with
+firmware 1.00.
 
-=head3 FujiFilm IFD Tags
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+      4    FirmwareVersion                      N
+    693    ISO2                                 int8u
+    725    ShutterCount                         int32u
+    884    CustomSettingsD90                    NikonCustom SettingsD90
 
-Tags found in the FujiIFD information of RAF images from some models.
+=head3 Nikon ShotInfoD3a Tags
 
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-  0xf000   FujiIFD                              FujiFilm IFD
-  0xf001   RawImageFullWidth                    N
-  0xf002   RawImageFullHeight                   N
-  0xf003   BitsPerSample                        N
-  0xf007   StripOffsets                         N
-  0xf008   StripByteCounts                      N
-  0xf00e   WB_GRBLevels                         N
+These tags are extracted from encrypted data in images from the D3 with
+firmware 1.00 and earlier.
 
-=head3 FujiFilm FFMV Tags
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+    598    ISO2                                 int8u
+    630    ShutterCount                         int32u
+  723.1    NikonImageSize                       int8u & 0x18
+  723.2    ImageQuality                         int8u & 0x07
+    769    CustomSettingsD3                     NikonCustom SettingsD3
+
+=head3 Nikon ShotInfoD3b Tags
+
+These tags are extracted from encrypted data in images from the D3 with
+firmware 1.10, 2.00, 2.01 and 2.02.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+      4    FirmwareVersion                      N
+     16    ImageArea                            int8u
+    605    ISO2                                 int8u
+    637    ShutterCount                         int32u
+    639    ShutterCount                         int32u
+    650    PreFlashReturnStrength               int8u
+  732.1    NikonImageSize                       int8u & 0x18
+  732.2    ImageQuality                         int8u & 0x07
+    778    CustomSettingsD3                     NikonCustom SettingsD3
 
-Information found in the FFMV atom of MOV videos.
+=head3 Nikon ShotInfoD3X Tags
 
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-      0    MovieStreamName                      N
+These tags are extracted from encrypted data in images from the D3X with
+firmware 1.00.
 
-=head3 FujiFilm MOV Tags
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+      4    FirmwareVersion                      N
+    605    ISO2                                 int8u
+    640    ShutterCount                         int32u
+    779    CustomSettingsD3X                    NikonCustom SettingsD3
 
-This information is found in MOV videos from some FujiFilm cameras.
+=head3 Nikon ShotInfoD3S Tags
 
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-      0    Make                                 N
-     24    Model                                N
-     46    ExposureTime                         N
-     50    FNumber                              N
-     58    ExposureCompensation                 N
+These tags are extracted from encrypted data in images from the D3S with
+firmware 1.00 and earlier.
 
-=head2 GE Tags
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+      4    FirmwareVersion                      N
+     16    ImageArea                            int8u
+    545    ISO2                                 int8u
+    578    ShutterCount                         int32u
+    718    CustomSettingsD3S                    NikonCustom SettingsD3
 
-This table lists tags found in the maker notes of some General Imaging
-camera models.
+=head3 Nikon ShotInfoD300a Tags
 
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-  0x0202   Macro                                int16u
-  0x0207   GEModel                              string
-  0x0300   GEMake                               string
+These tags are extracted from encrypted data in images from the D300 with
+firmware 1.00 and earlier.
 
-=head2 HP Tags
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+    604    ISO2                                 int8u
+    633    ShutterCount                         int32u
+    721    AFFineTuneAdj                        int16u
+    790    CustomSettingsD300                   NikonCustom SettingsD3
 
-These tables list tags found in the maker notes of some Hewlett-Packard
-camera models.
+=head3 Nikon ShotInfoD300b Tags
 
-The first table lists tags found in the EXIF-format maker notes of the
-PhotoSmart 720 (also used by the Vivitar ViviCam 3705, 3705B and 3715).
+These tags are extracted from encrypted data in images from the D300 with
+firmware 1.10.
 
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-  0x0e00   PrintIM                              PrintIM
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+      4    FirmwareVersion                      N
+    613    ISO2                                 int8u
+    644    ShutterCount                         int32u
+    732    AFFineTuneAdj                        int16u
+    802    CustomSettingsD300                   NikonCustom SettingsD3
 
-=head3 HP Type2 Tags
+=head3 Nikon ShotInfoD300S Tags
 
-These tags are used by the PhotoSmart E427.
+These tags are extracted from encrypted data in images from the D300S with
+firmware 1.00.
 
-  Tag ID               Tag Name                 Writable
-  ------               --------                 --------
-  'Lens Shading'       LensShading              N
-  'PreviewImage'       PreviewImage             N
-  'Serial Number'      SerialNumber             N
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+      4    FirmwareVersion                      N
+    613    ISO2                                 int8u
+    646    ShutterCount                         int32u
+    804    CustomSettingsD300S                  NikonCustom SettingsD3
 
-=head3 HP Type4 Tags
+=head3 Nikon ShotInfoD700 Tags
 
-These tags are used by the PhotoSmart M627.
+These tags are extracted from encrypted data in images from the D700 with
+firmware 1.02f.
 
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-     12    MaxAperture                          N
-     16    ExposureTime                         N
-     20    CameraDateTime                       N
-     52    ISO                                  N
-     92    SerialNumber                         N
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+      4    FirmwareVersion                      N
+    613    ISO2                                 int8u
+    647    ShutterCount                         int32u
+    804    CustomSettingsD700                   NikonCustom SettingsD700
 
-=head3 HP Type6 Tags
+=head3 Nikon ShotInfoD800 Tags
 
-These tags are used by the PhotoSmart M425, M525 and M527.
+These tags are extracted from encrypted data in images from the D800.
 
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-     12    FNumber                              N
-     16    ExposureTime                         N
-     20    CameraDateTime                       N
-     52    ISO                                  N
-     88    SerialNumber                         N
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+      4    FirmwareVersion                      N
+   1216    RepeatingFlashOutputExternal         int8u
+   1218    RepeatingFlashRateExternal           int8u
+   1219    RepeatingFlashCountExternal          int8u
+   1234    FlashExposureComp2                   int8s
+   1242    RepeatingFlashRateBuilt-in           int8u
+   1243    RepeatingFlashCountBuilt-in          int8u
+   1308    SequenceNumber                       int8u
+   1531    ShutterCount                         int32u
+   1772    CustomSettingsD800                   NikonCustom SettingsD800
 
-=head3 HP TDHD Tags
+=head3 Nikon ShotInfoD5000 Tags
 
-These tags are extracted from the APP6 "TDHD" segment of Photosmart R837
-JPEG images.  Many other unknown tags exist in is data, and can be seen with
-the Unknown (-u) option.
+These tags are extracted from encrypted data in images from the D5000 with
+firmware 1.00.
 
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-  'CMSN'   SerialNumber                         N
-  'FWRV'   FirmwareVersion                      N
-  'LSLV'   LSLV                                 HP TDHD
-  'TDHD'   TDHD                                 HP TDHD
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+      4    FirmwareVersion                      N
+    693    ISO2                                 int8u
+    726    ShutterCount                         int32u
+    888    CustomSettingsD5000                  NikonCustom SettingsD5000
 
-=head2 JVC Tags
+=head3 Nikon ShotInfoD5100 Tags
 
-JVC EXIF maker note tags.
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+      4    FirmwareVersion                      N
+    801    ShutterCount                         int32u
+   1031    CustomSettingsD5100                  NikonCustom SettingsD5100
 
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-  0x0002   CPUVersions                          N
-  0x0003   Quality                              N
+=head3 Nikon ShotInfoD5200 Tags
 
-=head3 JVC Text Tags
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+      4    FirmwareVersion                      N
+   3032    ShutterCount                         int32u
+   3285    CustomSettingsD5200                  NikonCustom SettingsD5200
 
-JVC/Victor text-based maker note tags.
+=head3 Nikon ShotInfoD7000 Tags
 
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-  'QTY'    Quality                              N
-  'VER'    MakerNoteVersion                     N
+These tags are extracted from encrypted data in images from the D7000 with
+firmware 1.01b.
 
-=head2 Kodak Tags
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+      4    FirmwareVersion                      N
+    800    ShutterCount                         int32u
+   1028    CustomSettingsD7000                  NikonCustom SettingsD7000
 
-Many Kodak models don't store the maker notes in standard IFD format, and
-these formats vary with different models.  Some information has been
-decoded, but much of the Kodak information remains unknown.
+=head3 Nikon ShotInfo Tags
 
-The table below contains the most common set of Kodak tags.  The following
-Kodak camera models have been tested and found to use these tags: C360,
-C663, C875, CX6330, CX6445, CX7330, CX7430, CX7525, CX7530, DC4800, DC4900,
-DX3500, DX3600, DX3900, DX4330, DX4530, DX4900, DX6340, DX6440, DX6490,
-DX7440, DX7590, DX7630, EasyShare-One, LS420, LS443, LS633, LS743, LS753,
-V530, V550, V570, V603, V610, V705, Z650, Z700, Z710, Z730, Z740, Z760 and
-Z7590.
+This information is encrypted for ShotInfoVersion 02xx, and some tags are
+only valid for specific models.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    KodakModel                           string[8]
-      9    Quality                              int8u
-     10    BurstMode                            int8u
-     12    KodakImageWidth                      int16u
-     14    KodakImageHeight                     int16u
-     16    YearCreated                          int16u
-     18    MonthDayCreated                      int8u[2]
-     20    TimeCreated                          int8u[4]
-     24    BurstMode2?                          int16u
-     27    ShutterMode                          int8u
-     28    MeteringMode                         int8u
-     29    SequenceNumber                       int8u
-     30    FNumber                              int16u
-     32    ExposureTime                         int32u
-     36    ExposureCompensation                 int16s
-     38    VariousModes?                        int16u
-     40    Distance1?                           int32u
-     44    Distance2?                           int32u
-     48    Distance3?                           int32u
-     52    Distance4?                           int32u
-     56    FocusMode                            int8u
-     58    VariousModes2?                       int16u
-     60    PanoramaMode?                        int16u
-     62    SubjectDistance?                     int16u
-     64    WhiteBalance                         int8u
-     92    FlashMode                            int8u
-     93    FlashFired                           int8u
-     94    ISOSetting                           int16u
-     96    ISO                                  int16u
-     98    TotalZoom                            int16u
-    100    DateTimeStamp                        int16u
-    102    ColorMode                            int16u
-    104    DigitalZoom                          int16u
-    107    Sharpness                            int8s
+      0    ShotInfoVersion                      N
+      4    FirmwareVersion                      N
+     16    DistortionControl                    int8u
+    102    VR_0x66?                             int8u
+    106    ShutterCount                         int32u
+    110    DeletedImageCount                    int32u
+    117    VibrationReduction                   int8u
+    130    VibrationReduction                   int8u
+    343    ShutterCount                         undef[2]
+    430    VibrationReduction                   int8u
+    589    ShutterCount                         int32u
+
+=head3 Nikon ColorBalance1 Tags
 
-=head3 Kodak Type2 Tags
+  Index2   Tag Name                             Writable
+  ------   --------                             --------
+      0    WB_RBGGLevels                        int16u[4]!
 
-These tags are used by the Kodak DC220, DC260, DC265 and DC290,
-Hewlett-Packard PhotoSmart 618, C500 and C912, Pentax EI-200 and EI-2000,
-and Minolta EX1500Z.
+=head3 Nikon ColorBalance2 Tags
+
+This information is encrypted for most camera models.
+
+  Index2   Tag Name                             Writable
+  ------   --------                             --------
+      0    WB_RGGBLevels                        int16u[4]!
+
+=head3 Nikon ColorBalance3 Tags
+
+  Index2   Tag Name                             Writable
+  ------   --------                             --------
+      0    WB_RGBGLevels                        int16u[4]!
+
+=head3 Nikon ColorBalance4 Tags
+
+  Index2   Tag Name                             Writable
+  ------   --------                             --------
+      0    WB_GRBGLevels                        int16u[4]!
+
+=head3 Nikon ColorBalanceUnknown Tags
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      8    KodakMaker                           string[32]
-     40    KodakModel                           string[32]
-    108    KodakImageWidth                      int32u
-    112    KodakImageHeight                     int32u
+      0    ColorBalanceVersion                  undef[4]
 
-=head3 Kodak Type3 Tags
+=head3 Nikon LensData00 Tags
 
-These tags are used by the DC240, DC280, DC3400 and DC5000.
+This structure is used by the D100, and D1X with firmware version 1.1.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-     12    YearCreated                          int16u
-     14    MonthDayCreated                      int8u[2]
-     16    TimeCreated                          int8u[4]
-     30    OpticalZoom                          int16u
-     55    Sharpness                            int8s
-     56    ExposureTime                         int32u
-     60    FNumber                              int16u
-     78    ISO                                  int16u
+      0    LensDataVersion                      N
+      6    LensIDNumber                         int8u
+      7    LensFStops                           int8u
+      8    MinFocalLength                       int8u
+      9    MaxFocalLength                       int8u
+     10    MaxApertureAtMinFocal                int8u
+     11    MaxApertureAtMaxFocal                int8u
+     12    MCUVersion                           int8u
 
-=head3 Kodak Type4 Tags
+=head3 Nikon LensData01 Tags
 
-These tags are used by the DC200 and DC215.
+Nikon encrypts the LensData information below if LensDataVersion is 0201 or
+higher, but  the decryption algorithm is known so the information can be
+extracted.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-     32    OriginalFileName                     string[12]
+      0    LensDataVersion                      N
+      4    ExitPupilPosition                    int8u
+      5    AFAperture                           int8u
+      8    FocusPosition                        int8u
+      9    FocusDistance                        int8u
+     10    FocalLength                          int8u
+     11    LensIDNumber                         int8u
+     12    LensFStops                           int8u
+     13    MinFocalLength                       int8u
+     14    MaxFocalLength                       int8u
+     15    MaxApertureAtMinFocal                int8u
+     16    MaxApertureAtMaxFocal                int8u
+     17    MCUVersion                           int8u
+     18    EffectiveMaxAperture                 int8u
 
-=head3 Kodak Type5 Tags
+=head3 Nikon LensData0204 Tags
 
-These tags are used by the CX4200, CX4210, CX4230, CX4300, CX4310, CX6200
-and CX6230.
+Nikon encrypts the LensData information below if LensDataVersion is 0201 or
+higher, but  the decryption algorithm is known so the information can be
+extracted.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-     20    ExposureTime                         int32u
-     26    WhiteBalance                         int8u
-     28    FNumber                              int16u
-     30    ISO                                  int16u
-     32    OpticalZoom                          int16u
-     34    DigitalZoom                          int16u
-     39    FlashMode                            int8u
-     42    ImageRotated                         int8u
-     43    Macro                                int8u
+      0    LensDataVersion                      N
+      4    ExitPupilPosition                    int8u
+      5    AFAperture                           int8u
+      8    FocusPosition                        int8u
+     10    FocusDistance                        int8u
+     11    FocalLength                          int8u
+     12    LensIDNumber                         int8u
+     13    LensFStops                           int8u
+     14    MinFocalLength                       int8u
+     15    MaxFocalLength                       int8u
+     16    MaxApertureAtMinFocal                int8u
+     17    MaxApertureAtMaxFocal                int8u
+     18    MCUVersion                           int8u
+     19    EffectiveMaxAperture                 int8u
 
-=head3 Kodak Type6 Tags
+=head3 Nikon LensData0400 Tags
 
-These tags are used by the DX3215 and DX3700.
+Tags extracted from the encrypted lens data of Nikon 1 models.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-     16    ExposureTime                         int32u
-     20    ISOSetting?                          int32u
-     24    FNumber                              int16u
-     26    ISO                                  int16u
-     28    OpticalZoom                          int16u
-     30    DigitalZoom                          int16u
-     34    Flash                                int16u
+      0    LensDataVersion                      N
+    394    LensModel                            string[64]
 
-=head3 Kodak Type7 Tags
+=head3 Nikon LensDataUnknown Tags
 
-The maker notes of models such as the C340, C433, CC533, LS755, V803 and
-V1003 seem to start with the camera serial number.  The C310, C315, C330,
-C643, C743, CD33, CD43, CX7220 and CX7300 maker notes are also decoded using
-this table, although the strings for these cameras don't conform to the
-usual Kodak serial number format, and instead have the model name followed
-by 8 digits.
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    LensDataVersion                      N
+
+=head3 Nikon FlashInfo0100 Tags
+
+These tags are used by the D2H, D2Hs, D2X, D2Xs, D50, D70, D70s, D80 and
+D200.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    SerialNumber                         string[16]
+      0    FlashInfoVersion                     N
+      4    FlashSource                          int8u
+      6    ExternalFlashFirmware                int8u[2]
+      8    ExternalFlashFlags                   int8u
+    9.1    FlashCommanderMode                   int8u & 0x80
+    9.2    FlashControlMode                     int8u & 0x7f
+     10    FlashOutput                          int8u
+           FlashCompensation                    int8s
+     11    FlashFocalLength                     int8u
+     12    RepeatingFlashRate                   int8u
+     13    RepeatingFlashCount                  int8u
+     14    FlashGNDistance                      int8u
+     15    FlashGroupAControlMode               int8u & 0x0f
+     16    FlashGroupBControlMode               int8u & 0x0f
+     17    FlashGroupAOutput                    int8u
+           FlashGroupACompensation              int8s
+     18    FlashGroupBOutput                    int8u
+           FlashGroupBCompensation              int8s
 
-=head3 Kodak Type8 Tags
+=head3 Nikon FlashInfo0102 Tags
 
-Kodak models such as the ZD710, P712, P850, P880, V1233, V1253, V1275,
-V1285, Z612, Z712, Z812, Z885 use standard TIFF IFD format for the maker
-notes.  In keeping with Kodak's strategy of inconsistent makernotes, models
-such as the M380, M1033, M1093, V1073, V1273, Z1012, Z1085 and Z8612
-also use these tags, but these makernotes begin with a TIFF header instead
-of an IFD entry count and use relative instead of absolute offsets.  There
-is a large amount of information stored in these maker notes (apparently
-with much duplication), but relatively few tags have so far been decoded.
+These tags are used by the D3 (firmware 1.x), D40, D40X, D60 and D300
+(firmware 1.00).
 
-  Tag ID   Tag Name                             Writable
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-  0xfc00   SubIFD0                              Kodak SubIFD0
-                                                Kodak SubIFD0
-  0xfc01   SubIFD1                              Kodak SubIFD1
-                                                Kodak SubIFD1
-  0xfc02   SubIFD2                              Kodak SubIFD2
-                                                Kodak SubIFD2
-  0xfc03   SubIFD3                              Kodak SubIFD3
-                                                Kodak SubIFD3
-  0xfc04   SubIFD4                              Kodak SubIFD4
-                                                Kodak SubIFD4
-  0xfc05   SubIFD5                              Kodak SubIFD5
-                                                Kodak SubIFD5
-  0xfc06   SubIFD6                              Kodak SubIFD6
-                                                Kodak SubIFD6
-  0xfcff   SubIFD255                            Kodak SubIFD0
-  0xff00   CameraInfo                           Kodak CameraInfo
+      0    FlashInfoVersion                     N
+      4    FlashSource                          int8u
+      6    ExternalFlashFirmware                int8u[2]
+      8    ExternalFlashFlags                   int8u
+    9.1    FlashCommanderMode                   int8u & 0x80
+    9.2    FlashControlMode                     int8u & 0x7f
+     10    FlashOutput                          int8u
+           FlashCompensation                    int8s
+     12    FlashFocalLength                     int8u
+     13    RepeatingFlashRate                   int8u
+     14    RepeatingFlashCount                  int8u
+     15    FlashGNDistance                      int8u
+   16.1    FlashGroupAControlMode               int8u & 0x0f
+   17.1    FlashGroupBControlMode               int8u & 0xf0
+   17.2    FlashGroupCControlMode               int8u & 0x0f
+     18    FlashGroupAOutput                    int8u
+           FlashGroupACompensation              int8s
+     19    FlashGroupBOutput                    int8u
+           FlashGroupBCompensation              int8s
+     20    FlashGroupCOutput                    int8u
+           FlashGroupCCompensation              int8s
 
-=head3 Kodak SubIFD0 Tags
+=head3 Nikon FlashInfo0103 Tags
 
-SubIFD0 through SubIFD5 tags are written a number of newer Kodak models.
+These tags are used by the D3 (firmware 2.x), D3X, D3S, D4, D90, D300
+(firmware 1.10), D300S, D600, D700, D800, D3000, D3100, D3200, D5000, D5100,
+D5200, D7000.
 
-  Tag ID   Tag Name                             Writable
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-  0xfa02   SceneMode                            int16u
-  0xfa19   SerialNumber                         string
-  0xfa1d   KodakImageWidth                      int16u
-  0xfa1e   KodakImageHeight                     int16u
-  0xfa20   SensorWidth                          int16u
-  0xfa21   SensorHeight                         int16u
-  0xfa23   FNumber                              int16u
-  0xfa24   ExposureTime                         int32u
-  0xfa2e   ISO                                  int16u
-  0xfa3d   OpticalZoom                          int16u
-  0xfa46   ISO                                  int16u
-  0xfa51   KodakImageWidth                      int16u
-  0xfa52   KodakImageHeight                     int16u
-  0xfa54   ThumbnailWidth                       int16u
-  0xfa55   ThumbnailHeight                      int16u
-  0xfa57   PreviewImageWidth                    int16u
-  0xfa58   PreviewImageHeight                   int16u
+      0    FlashInfoVersion                     N
+      4    FlashSource                          int8u
+      6    ExternalFlashFirmware                int8u[2]
+      8    ExternalFlashFlags                   int8u
+    9.1    FlashCommanderMode                   int8u & 0x80
+    9.2    FlashControlMode                     int8u & 0x7f
+     10    FlashOutput                          int8u
+           FlashCompensation                    int8s
+     12    FlashFocalLength                     int8u
+     13    RepeatingFlashRate                   int8u
+     14    RepeatingFlashCount                  int8u
+     15    FlashGNDistance                      int8u
+     16    FlashColorFilter                     int8u
+   17.1    FlashGroupAControlMode               int8u & 0x0f
+   18.1    FlashGroupBControlMode               int8u & 0xf0
+   18.2    FlashGroupCControlMode               int8u & 0x0f
+     19    FlashGroupAOutput                    int8u
+           FlashGroupACompensation              int8s
+     20    FlashGroupBOutput                    int8u
+           FlashGroupBCompensation              int8s
+     21    FlashGroupCOutput                    int8u
+           FlashGroupCCompensation              int8s
+     27    ExternalFlashCompensation            int8s
+     29    FlashExposureComp3                   int8s
+     39    FlashExposureComp4                   int8s
+
+=head3 Nikon FlashInfoUnknown Tags
+
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    FlashInfoVersion                     N
 
-=head3 Kodak SubIFD1 Tags
+=head3 Nikon MultiExposure Tags
 
-  Tag ID   Tag Name                             Writable
+  Index4   Tag Name                             Writable
   ------   --------                             --------
-  0x0027   ISO                                  int16u
-  0x0028   ISO                                  int16u
+      0    MultiExposureVersion                 N
+      1    MultiExposureMode                    int32u
+      2    MultiExposureShots                   int32u
+      3    MultiExposureAutoGain                int32u
 
-=head3 Kodak SubIFD2 Tags
+=head3 Nikon AFInfo2 Tags
 
-  Tag ID   Tag Name                             Writable
+These tags are written by Nikon DSLR's which have the live view feature.
+
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-  0x6002   SceneModeUsed                        int32u
-  0x6006   OpticalZoom                          int32u
-  0x6103   MaxAperture                          int32u
-  0xf002   SceneModeUsed                        int32u
-  0xf006   OpticalZoom                          int32u
-  0xf103   FNumber                              int32u
-  0xf104   ExposureTime                         int32u
-  0xf105   ISO                                  int32u
+      0    AFInfo2Version                       N
+      4    ContrastDetectAF                     int8u
+      5    AFAreaMode                           int8u
+      6    PhaseDetectAF                        int8u
+      7    PrimaryAFPoint                       int8u
+      8    AFPointsUsed                         undef[7]
+           AFPointsUsed                         undef[2]
+           AFPointsUsed                         undef[7]
+           AFPointsUsed                         undef[17]
+           AFPointsUsed                         undef[7]
+     16    AFImageWidth                         int16u
+     18    AFImageHeight                        int16u
+     20    AFAreaXPosition                      int16u
+     22    AFAreaYPosition                      int16u
+     24    AFAreaWidth                          int16u
+     26    AFAreaHeight                         int16u
+     28    ContrastDetectAFInFocus              int8u
 
-=head3 Kodak SubIFD3 Tags
+=head3 Nikon FileInfo Tags
 
-  Tag ID   Tag Name                             Writable
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-  0x1000   OpticalZoom                          int16u
+      0    FileInfoVersion                      N
+      6    DirectoryNumber                      int16u
+      8    FileNumber                           int16u
 
-=head3 Kodak SubIFD4 Tags
+=head3 Nikon AFTune Tags
 
-  Tag ID   Tag Name                             Writable
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-  [no tags known]
+      0    AFFineTune                           int8u
+      1    AFFineTuneIndex                      int8u
+      2    AFFineTuneAdj                        int8s
 
-=head3 Kodak SubIFD5 Tags
+=head3 Nikon CaptureOffsets Tags
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
-  0x000f   OpticalZoom                          int16u
+  0x0001   IFD0_Offset                          N
+  0x0002   PreviewIFD_Offset                    N
+  0x0003   SubIFD_Offset                        N
 
-=head3 Kodak SubIFD6 Tags
+=head3 Nikon Scan Tags
 
-SubIFD6 is written by the M580.
+This information is written by the Nikon Scan software.
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
-  [no tags known]
-
-=head3 Kodak CameraInfo Tags
+  0x0002   FilmType                             string
+  0x0040   MultiSample                          string
+  0x0041   BitDepth                             int16u
+  0x0050   MasterGain                           rational64s
+  0x0051   ColorGain                            rational64s[3]
+  0x0060   ScanImageEnhancer                    int32u
+  0x0100   DigitalICE                           string
+  0x0110   ROCInfo                              Nikon ROC
+  0x0120   GEMInfo                              Nikon GEM
+  0x0200   DigitalDEEShadowAdj                  int32u
+  0x0201   DigitalDEEThreshold                  int32u
+  0x0202   DigitalDEEHighlightAdj               int32u
 
-These tags are used by the  P712, P850 and P880.
+=head3 Nikon ROC Tags
 
-  Tag ID   Tag Name                             Writable
+  Index4   Tag Name                             Writable
   ------   --------                             --------
-  0xf900   SensorWidth                          int16u
-  0xf901   SensorHeight                         int16u
-  0xf902   BayerPattern                         string
-  0xf903   SensorFullWidth                      int16u
-  0xf904   SensorFullHeight                     int16u
-  0xf907   KodakImageWidth                      int16u
-  0xf908   KodakImageHeight                     int16u
-  0xfa00   KodakInfoType                        string
-  0xfa04   SerialNumber                         string
-  0xfd04   FNumber                              int16u
-  0xfd05   ExposureTime                         int32u
-  0xfd06   ISO                                  int16u
-
-=head3 Kodak Type9 Tags
+      0    DigitalROC                           int32u
 
-These tags are used by the Kodak C140, C180, C913, C1013, M320, M340 and
-M550, as well as various cameras marketed by other manufacturers.
+=head3 Nikon GEM Tags
 
-  Index1   Tag Name                             Writable
+  Index4   Tag Name                             Writable
   ------   --------                             --------
-     12    FNumber                              int16u
-     16    ExposureTime                         int32u
-     20    DateTimeOriginal                     string[20]
-     52    ISO                                  int16u
-     87    FirmwareVersion                      string[16]
-    168    UnknownNumber                        N
-    196    UnknownNumber                        N
+      0    DigitalGEM                           int32u
 
-=head3 Kodak Type10 Tags
+=head3 Nikon CaptureOutput Tags
 
-Another variation of the IFD-format type, this time with just a byte order
-indicator instead of a full TIFF header.  These tags are used by the Z980.
+  Index4   Tag Name                             Writable
+  ------   --------                             --------
+      2    OutputImageWidth                     int32u
+      3    OutputImageHeight                    int32u
+      4    OutputResolution                     int32u
+
+=head3 Nikon Type2 Tags
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
-  0x0002   PreviewImageSize                     int16u[2]
-  0x0012   ExposureTime                         int32u
-  0x0013   FNumber                              int16u
-  0x0014   ISO                                  int16u
-  0x001d   FocalLength                          int32u
+  0x0003   Quality                              Y
+  0x0004   ColorMode                            Y
+  0x0005   ImageAdjustment                      Y
+  0x0006   CCDSensitivity                       Y
+  0x0007   WhiteBalance                         Y
+  0x0008   Focus                                Y
+  0x000a   DigitalZoom                          Y
+  0x000b   Converter                            Y
 
-=head3 Kodak Unknown Tags
+=head3 Nikon NCDT Tags
 
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-  [no tags known]
+Nikon-specific QuickTime tags found in the NCDT atom of MOV videos from some
+Nikon cameras such as the Coolpix S8000.
 
-=head3 Kodak IFD Tags
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'NCDB'   NikonNCDB                            Nikon NCDB
+  'NCHD'   MakerNoteVersion                     N
+  'NCTG'   NikonTags                            Nikon NCTG
+  'NCTH'   ThumbnailImage                       N
+  'NCVW'   PreviewImage                         N
 
-These tags are found in a separate IFD of JPEG, TIFF, DCR and KDC images
-from some older Kodak models such as the DC50, DC120, DCS760C, DCS Pro 14N,
-14nx, SLR/n, Pro Back and Canon EOS D2000.
+=head3 Nikon NCDB Tags
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
-  0x0001   UnknownEV?                           rational64u
-  0x0003   ExposureValue                        rational64u
-  0x03e9   OriginalFileName                     string
-  0x03eb   SensorLeftBorder                     N
-  0x03ec   SensorTopBorder                      N
-  0x03ed   SensorImageWidth                     N
-  0x03ee   SensorImageHeight                    N
-  0x03f1   TextualInfo                          Kodak TextualInfo
-  0x03fc   WhiteBalance                         int16u
-  0x03fd   Processing                           Kodak Processing
-  0x0401   Time                                 string
-  0x0414   NCDFileInfo                          string
-  0x0846   ColorTemperature                     int16u
-  0x0852   WB_RGBMul0                           N
-  0x0853   WB_RGBMul1                           N
-  0x0854   WB_RGBMul2                           N
-  0x0855   WB_RGBMul3                           N
-  0x085c   WB_RGBCoeffs0                        N
-  0x085d   WB_RGBCoeffs1                        N
-  0x085e   WB_RGBCoeffs2                        N
-  0x085f   WB_RGBCoeffs3                        N
-  0x0ce5   FirmwareVersion                      string
-  0x1391   ToneCurveFileName                    string
-  0x1784   ISO                                  int32u
+  [no tags known]
 
-=head3 Kodak TextualInfo Tags
+=head3 Nikon NCTG Tags
 
-Below is a list of tags which have been observed in the Kodak TextualInfo
-data, however ExifTool will extract information from any tags found here.
+These tags are found in proprietary-format records of the NCTG atom in MOV
+videos from some Nikon cameras.
 
-  Tag ID                Tag Name                Writable
-  ------                --------                --------
-  'AF Function'         AFMode                  N
-  'Actual Compensation' ActualCompensation      N
-  'Aperture'            Aperture                N
-  'Auto Bracket'        AutoBracket             N
-  'Brightness Value'    BrightnessValue         N
-  'Camera'              CameraModel             N
-  'Camera body'         CameraBody              N
-  'Compensation'        ExposureCompensation    N
-  'Date'                Date                    N
-  'Exposure Bias'       ExposureBias            N
-  'Exposure Mode'       ExposureMode            N
-  'Firmware Version'    FirmwareVersion         N
-  'Flash Compensation'  FlashExposureComp       N
-  'Flash Fired'         FlashFired              N
-  'Flash Sync Mode'     FlashSyncMode           N
-  'Focal Length'        FocalLength             N
-  'Height'              KodakImageHeight        N
-  'ISO'                 ISO                     N
-  'ISO Speed'           ISO                     N
-  'Image Number'        ImageNumber             N
-  'Max Aperture'        MaxAperture             N
-  'Meter Mode'          MeterMode               N
-  'Min Aperture'        MinAperture             N
-  'Popup Flash'         PopupFlash              N
-  'Serial Number'       SerialNumber            N
-  'Shooting Mode'       ShootingMode            N
-  'Shutter'             ShutterSpeed            N
-  'Temperature'         Temperature             N
-  'Time'                Time                    N
-  'White balance'       WhiteBalance            N
-  'Width'               KodakImageWidth         N
-  '_other_info'         OtherInfo               N
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  0x0001       Make                             N
+  0x0002       Model                            N
+  0x0003       Software                         N
+  0x0011       CreateDate                       N
+  0x0012       DateTimeOriginal                 N
+  0x0013       FrameCount                       N
+  0x0016       FrameRate                        N
+  0x0022       FrameWidth                       N
+  0x0023       FrameHeight                      N
+  0x0032       AudioChannels                    N
+  0x0033       AudioBitsPerSample               N
+  0x0034       AudioSampleRate                  N
+  0x1108822    ExposureProgram                  N
+  0x1109204    ExposureCompensation             N
+  0x1109207    MeteringMode                     N
+  0x110a434    LensModel                        N
+  0x1200000    GPSVersionID                     N
+  0x1200001    GPSLatitudeRef                   N
+  0x1200002    GPSLatitude                      N
+  0x1200003    GPSLongitudeRef                  N
+  0x1200004    GPSLongitude                     N
+  0x1200005    GPSAltitudeRef                   N
+  0x1200006    GPSAltitude                      N
+  0x1200007    GPSTimeStamp                     N
+  0x1200008    GPSSatellites                    N
+  0x1200010    GPSImgDirectionRef               N
+  0x1200011    GPSImgDirection                  N
+  0x1200012    GPSMapDatum                      N
+  0x120001d    GPSDateStamp                     N
+  0x2000001    MakerNoteVersion                 N
+  0x2000005    WhiteBalance                     N
+  0x200000b    WhiteBalanceFineTune             N
+  0x200001e    ColorSpace                       N
+  0x2000023    PictureControlData               Nikon PictureControl
+  0x2000024    WorldTime                        Nikon WorldTime
+  0x200002c    UnknownInfo                      Nikon UnknownInfo
+  0x2000032    UnknownInfo2                     Nikon UnknownInfo
+  0x2000039    LocationInfo                     Nikon LocationInfo
+  0x2000083    LensType                         N
+  0x2000084    Lens                             N
+  0x20000ab    VariProgram                      string
 
-=head3 Kodak Processing Tags
+=head3 Nikon MOV Tags
 
-  Index2   Tag Name                             Writable
+This information is found in MOV and QT videos from some Nikon cameras.
+
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-     20    WB_RGBLevels                         N
+      0    Make                                 N
+     24    Model                                N
+     38    ExposureTime                         N
+     42    FNumber                              N
+     50    ExposureCompensation                 N
+     68    WhiteBalance                         N
+     72    FocalLength                          N
+    175    Software                             N
+    223    ISO                                  N
 
-=head3 Kodak Meta Tags
+=head3 Nikon AVI Tags
 
-These tags are found in the APP3 "Meta" segment of JPEG images from Kodak
-cameras such as the DC280, DC3400, DC5000, MC3, M580, Z950 and Z981.  The
-structure of this segment is similar to the APP1 "Exif" segment, but a
-different set of tags is used.
+Nikon-specific RIFF tags found in AVI videos.
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
-  0xc350   FilmProductCode                      N
-  0xc351   ImageSourceEK                        N
-  0xc352   CaptureConditionsPAR                 N
-  0xc353   CameraOwner                          undef
-  0xc354   SerialNumber                         undef
-  0xc355   UserSelectGroupTitle                 N
-  0xc356   DealerIDNumber                       N
-  0xc357   CaptureDeviceFID                     N
-  0xc358   EnvelopeNumber                       N
-  0xc359   FrameNumber                          N
-  0xc35a   FilmCategory                         N
-  0xc35b   FilmGencode                          N
-  0xc35c   ModelAndVersion                      N
-  0xc35d   FilmSize                             N
-  0xc35e   SBA_RGBShifts                        N
-  0xc35f   SBAInputImageColorspace              N
-  0xc360   SBAInputImageBitDepth                N
-  0xc361   SBAExposureRecord                    N
-  0xc362   UserAdjSBA_RGBShifts                 N
-  0xc363   ImageRotationStatus                  N
-  0xc364   RollGuidElements                     N
-  0xc365   MetadataNumber                       N
-  0xc366   EditTagArray                         N
-  0xc367   Magnification                        N
-  0xc36c   NativeXResolution                    N
-  0xc36d   NativeYResolution                    N
-  0xc36e   KodakEffectsIFD                      Kodak SpecialEffects
-  0xc36f   KodakBordersIFD                      Kodak Borders
-  0xc37a   NativeResolutionUnit                 N
-  0xc418   SourceImageDirectory                 N
-  0xc419   SourceImageFileName                  N
-  0xc41a   SourceImageVolumeName                N
-  0xc46c   PrintQuality                         N
-  0xc46e   ImagePrintStatus                     N
+  'nctg'   NikonTags                            Nikon AVITags
+  'ncth'   ThumbnailImage                       N
+  'ncvr'   NikonVers                            Nikon AVIVers
+  'ncvw'   PreviewImage                         N
 
-=head3 Kodak SpecialEffects Tags
+=head3 Nikon AVITags Tags
 
-The Kodak SpecialEffects and Borders tags are found in sub-IFD's within the
-Kodak JPEG APP3 "Meta" segment.
+These tags and the AVIVer tags below are found in proprietary-format records
+of Nikon AVI videos.
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
-  0x0000   DigitalEffectsVersion                N
-  0x0001   DigitalEffectsName                   N
-  0x0002   DigitalEffectsType                   N
+  0x0003   Make                                 N
+  0x0004   Model                                N
+  0x0005   Software                             N
+  0x0006   Equipment                            N
+  0x0007   Orientation                          N
+  0x0008   ExposureTime                         N
+  0x0009   FNumber                              N
+  0x000a   ExposureCompensation                 N
+  0x000b   MaxApertureValue                     N
+  0x000c   MeteringMode                         N
+  0x000f   FocalLength                          N
+  0x0010   XResolution                          N
+  0x0011   YResolution                          N
+  0x0012   ResolutionUnit                       N
+  0x0013   DateTimeOriginal                     N
+  0x0014   CreateDate                           N
+  0x0016   Duration                             N
+  0x0018   FocusMode                            N
+  0x001b   DigitalZoom                          N
+  0x001d   ColorMode                            N
+  0x001e   Sharpness                            N
+  0x001f   WhiteBalance                         N
+  0x0020   NoiseReduction                       N
 
-=head3 Kodak Borders Tags
+=head3 Nikon AVIVers Tags
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
-  0x0000   BordersVersion                       N
-  0x0001   BorderName                           N
-  0x0002   BorderID                             N
-  0x0003   BorderLocation                       N
-  0x0004   BorderType                           N
-  0x0008   WatermarkType                        N
+  0x0001   MakerNoteType                        N
+  0x0002   MakerNoteVersion                     N
+
+=head2 NikonCustom Tags
+
+=head3 NikonCustom SettingsD40 Tags
+
+Custom settings for the Nikon D40.
+
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+    0.1    Beep                                 int8u & 0x80
+    0.2    AFAssist                             int8u & 0x40
+    0.3    NoMemoryCard                         int8u & 0x20
+    0.4    ImageReview                          int8u & 0x10
+    1.1    AutoISO                              int8u & 0x80
+    1.2    AutoISOMax                           int8u & 0x30
+    1.3    AutoISOMinShutterSpeed               int8u & 0x07
+    2.1    ImageReviewTime                      int8u & 0x07
+    3.1    MonitorOffTime                       int8u & 0xe0
+    3.2    MeteringTime                         int8u & 0x1c
+    3.3    SelfTimerTime                        int8u & 0x03
+    3.4    RemoteOnDuration                     int8u & 0xc0
+    4.1    AELockButton                         int8u & 0x0e
+    4.2    AELock                               int8u & 0x01
+    5.1    ShootingModeSetting                  int8u & 0x70
+    5.2    TimerFunctionButton                  int8u & 0x07
+    6.1    Metering                             int8u & 0x03
+    8.1    InternalFlash                        int8u & 0x10
+    8.2    ManualFlashOutput                    int8u & 0x07
+      9    FlashLevel                           int8s
+   10.1    FocusModeSetting                     int8u & 0xc0
+   11.1    AFAreaModeSetting                    int8u & 0x30
+
+=head3 NikonCustom SettingsD80 Tags
+
+Custom settings for the Nikon D80.
+
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+    0.1    Beep                                 int8u & 0x80
+    0.2    AFAssist                             int8u & 0x40
+    0.3    NoMemoryCard                         int8u & 0x20
+    0.4    ImageReview                          int8u & 0x10
+    0.5    Illumination                         int8u & 0x08
+    0.6    MainDialExposureComp                 int8u & 0x04
+    0.7    EVStepSize                           int8u & 0x01
+    1.1    AutoISO                              int8u & 0x40
+    1.2    AutoISOMax                           int8u & 0x30
+    1.3    AutoISOMinShutterSpeed               int8u & 0x0f
+    2.1    AutoBracketSet                       int8u & 0xc0
+    2.2    AutoBracketOrder                     int8u & 0x20
+    3.1    MonitorOffTime                       int8u & 0xe0
+    3.2    MeteringTime                         int8u & 0x1c
+    3.3    SelfTimerTime                        int8u & 0x03
+    4.1    AELockButton                         int8u & 0x1e
+    4.2    AELock                               int8u & 0x01
+    4.3    RemoteOnDuration                     int8u & 0xc0
+    5.1    CommandDials                         int8u & 0x80
+    5.2    FunctionButton                       int8u & 0x78
+    6.1    GridDisplay                          int8u & 0x80
+    6.2    ViewfinderWarning                    int8u & 0x40
+    6.3    CenterWeightedAreaSize               int8u & 0x0c
+    6.4    ExposureDelayMode                    int8u & 0x20
+    6.5    MB-D80Batteries                      int8u & 0x03
+    7.1    FlashWarning                         int8u & 0x80
+    7.2    FlashShutterSpeed                    int8u & 0x78
+    7.3    AutoFP                               int8u & 0x04
+    7.4    ModelingFlash                        int8u & 0x02
+    8.1    InternalFlash                        int8u & 0xc0
+    8.2    ManualFlashOutput                    int8u & 0x07
+    9.1    RepeatingFlashOutput                 int8u & 0x70
+    9.2    RepeatingFlashCount                  int8u & 0x0f
+   10.1    RepeatingFlashRate                   int8u & 0xf0
+   10.2    CommanderChannel                     int8u & 0x03
+   11.1    CommanderInternalFlash               int8u & 0xc0
+   11.2    CommanderGroupAMode                  int8u & 0x30
+   11.3    CommanderGroupBMode                  int8u & 0x0c
+   12.1    CommanderInternalTTLComp             int8u & 0x1f
+   12.2    CommanderInternalManualOutput        int8u & 0xe0
+   13.1    CommanderGroupA_TTL-AAComp           int8u & 0x1f
+   13.2    CommanderGroupAManualOutput          int8u & 0xe0
+   14.1    CommanderGroupB_TTL-AAComp           int8u & 0x1f
+   14.2    CommanderGroupBManualOutput          int8u & 0xe0
+   15.1    CenterAFArea                         int8u & 0x80
+   15.2    FocusAreaSelection                   int8u & 0x04
+   15.3    AFAreaIllumination                   int8u & 0x03
+   16.1    AFAreaModeSetting                    int8u & 0xc0
+
+=head3 NikonCustom SettingsD90 Tags
+
+Custom settings for the D90.
+
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+    0.1    LightSwitch                          int8u & 0x08
+    2.1    AFAreaModeSetting                    int8u & 0x60
+    2.2    CenterFocusPoint                     int8u & 0x10
+    2.3    AFAssist                             int8u & 0x01
+    2.4    AFPointIllumination                  int8u & 0x06
+    2.5    FocusPointWrap                       int8u & 0x08
+    3.1    AELockForMB-D80                      int8u & 0x1c
+    3.2    MB-D80BatteryType                    int8u & 0x03
+    4.1    Beep                                 int8u & 0x40
+    4.2    GridDisplay                          int8u & 0x02
+    4.3    ISODisplay                           int8u & 0x0c
+    4.4    ViewfinderWarning                    int8u & 0x01
+    4.5    NoMemoryCard                         int8u & 0x20
+    5.1    ScreenTips                           int8u & 0x04
+    5.2    FileNumberSequence                   int8u & 0x08
+    5.3    ShootingInfoDisplay                  int8u & 0xc0
+    5.4    LCDIllumination                      int8u & 0x20
+    6.1    EasyExposureComp                     int8u & 0x01
+    6.2    ReverseIndicators                    int8u & 0x80
+    7.1    ExposureControlStepSize              int8u & 0x40
+    8.1    CenterWeightedAreaSize               int8u & 0x60
+    8.2    FineTuneOptMatrixMetering            int8u & 0x0f
+    9.1    FineTuneOptCenterWeighted            int8u & 0xf0
+    9.2    FineTuneOptSpotMetering              int8u & 0x0f
+   11.1    CLModeShootingSpeed                  int8u & 0x07
+   11.2    ExposureDelayMode                    int8u & 0x40
+   13.1    AutoBracketSet                       int8u & 0xe0
+   13.2    AutoBracketOrder                     int8u & 0x10
+   14.1    FuncButton                           int8u & 0x78
+   16.1    OKButton                             int8u & 0x18
+   17.1    AELockButton                         int8u & 0x38
+   18.1    CommandDialsReverseRotation          int8u & 0x80
+   18.2    ShutterReleaseButtonAE-L             int8u & 0x02
+   19.1    MeteringTime                         int8u & 0xf0
+   19.2    RemoteOnDuration                     int8u & 0x03
+   20.1    SelfTimerTime                        int8u & 0xc0
+   20.2    SelfTimerShotCount                   int8u & 0x1e
+   21.1    PlaybackMonitorOffTime               int8u & 0x1c
+   21.2    ImageReviewTime                      int8u & 0xe0
+   22.1    MenuMonitorOffTime                   int8u & 0xe0
+   22.2    ShootingInfoMonitorOffTime           int8u & 0x1c
+   23.1    FlashShutterSpeed                    int8u & 0x0f
+   24.1    InternalFlash                        int8u & 0xc0
+   24.2    ManualFlashOutput                    int8u & 0x1f
+   25.1    RepeatingFlashOutput                 int8u & 0x70
+   25.2    RepeatingFlashCount                  int8u & 0x0f
+   26.1    RepeatingFlashRate                   int8u & 0xf0
+   31.1    FlashWarning                         int8u & 0x80
+   31.2    CommanderInternalTTLComp             int8u & 0x1f
+   31.3    ModelingFlash                        int8u & 0x20
+   31.4    AutoFP                               int8u & 0x40
+   32.1    CommanderGroupA_TTLComp              int8u & 0x1f
+   33.1    CommanderGroupB_TTLComp              int8u & 0x1f
+   34.1    LiveViewAF                           int8u & 0xc0
 
-=head3 Kodak KDC_IFD Tags
+=head3 NikonCustom SettingsD3 Tags
 
-These tags are found in a separate IFD of KDC images from some newer Kodak
-models such as the P880 and Z1015IS.
+Custom settings for the D3, D3S, D3X, D300 and D300S.
 
-  Tag ID   Tag Name                             Writable
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-  0xfa00   SerialNumber                         string
-  0xfa0d   WhiteBalance                         int8u
-  0xfa25   WB_RGBLevelsAuto                     N
-  0xfa27   WB_RGBLevelsTungsten                 N
-  0xfa28   WB_RGBLevelsFluorescent              N
-  0xfa29   WB_RGBLevelsDaylight                 N
-  0xfa2a   WB_RGBLevelsShade                    N
-
-=head3 Kodak Free Tags
-
-Information stored in the "free" atom of Kodak MP4 videos. (VERY bad form
-for Kodak to store useful information in an atom intended for unused space!)
+    0.1    CustomSettingsBank                   int8u & 0x03
+    0.2    CustomSettingsAllDefault             int8u & 0x80
+    1.1    AF-CPrioritySelection                int8u & 0xc0
+    1.2    AF-SPrioritySelection                int8u & 0x20
+    1.3    AFPointSelection                     int8u & 0x10
+    1.4    DynamicAFArea                        int8u & 0x0c
+    1.5    FocusTrackingLockOn                  int8u & 0x03
+    2.1    AFActivation                         int8u & 0x80
+    2.2    FocusPointWrap                       int8u & 0x08
+    2.3    AFPointIllumination                  int8u & 0x60
+           AFPointIllumination                  int8u & 0x06
+    2.4    AFPointBrightness                    int8u & 0x06
+    2.5    AFAssist                             int8u & 0x01
+    3.1    AFOnButton                           int8u & 0x07
+    3.2    VerticalAFOnButton                   int8u & 0x70
+    3.3    AF-OnForMB-D10                       int8u & 0x70
+    4.1    FocusTrackingLockOn                  int8u & 0x07
+    4.2    AssignBktButton                      int8u & 0x08
+    4.3    MultiSelectorLiveView                int8u & 0xc0
+    4.4    InitialZoomLiveView                  int8u & 0x30
+    6.1    ISOStepSize                          int8u & 0xc0
+    6.2    ExposureControlStepSize              int8u & 0x30
+    6.3    ExposureCompStepSize                 int8u & 0x0c
+    6.4    EasyExposureCompensation             int8u & 0x03
+    7.1    CenterWeightedAreaSize               int8u & 0xe0
+    7.2    FineTuneOptCenterWeighted            int8u & 0x0f
+    8.1    FineTuneOptMatrixMetering            int8u & 0xf0
+    8.2    FineTuneOptSpotMetering              int8u & 0x0f
+    9.1    MultiSelectorShootMode               int8u & 0xc0
+    9.2    MultiSelectorPlaybackMode            int8u & 0x30
+    9.3    InitialZoomSetting                   int8u & 0x0c
+    9.4    MultiSelector                        int8u & 0x01
+   10.1    ExposureDelayMode                    int8u & 0x40
+   10.2    CLModeShootingSpeed                  int8u & 0x07
+   10.3    CHModeShootingSpeed                  int8u & 0x30
+     11    MaxContinuousRelease                 int8u
+   12.1    ReverseIndicators                    int8u & 0x20
+   12.2    FileNumberSequence                   int8u & 0x02
+           FileNumberSequence                   int8u & 0x08
+   12.3    RearDisplay                          int8u & 0x80
+   12.4    ViewfinderDisplay                    int8u & 0x40
+   12.5    BatteryOrder                         int8u & 0x04
+   12.6    MB-D10Batteries                      int8u & 0x03
+   12.7    ScreenTips                           int8u & 0x10
+   13.1    Beep                                 int8u & 0xc0
+   13.2    ShootingInfoDisplay                  int8u & 0x30
+   13.3    GridDisplay                          int8u & 0x02
+   13.4    ViewfinderWarning                    int8u & 0x01
+   13.5    MultiSelectorPlaybackMode            int8u & 0x03
+   14.1    PreviewButton                        int8u & 0xf8
+           FuncButton                           int8u & 0xf8
+   14.2    PreviewButtonPlusDials               int8u & 0x07
+           FuncButtonPlusDials                  int8u & 0x07
+   15.1    FuncButton                           int8u & 0xf8
+           PreviewButton                        int8u & 0xf8
+   15.2    FuncButtonPlusDials                  int8u & 0x07
+           PreviewButtonPlusDials               int8u & 0x07
+   16.1    AELockButton                         int8u & 0xf8
+   16.2    AELockButtonPlusDials                int8u & 0x07
+   17.1    CommandDialsReverseRotation          int8u & 0x80
+   17.2    CommandDialsChangeMainSub            int8u & 0x40
+   17.3    CommandDialsApertureSetting          int8u & 0x20
+   17.4    CommandDialsMenuAndPlayback          int8u & 0x10
+   17.5    LCDIllumination                      int8u & 0x08
+   17.6    PhotoInfoPlayback                    int8u & 0x04
+   17.7    ShutterReleaseButtonAE-L             int8u & 0x02
+   17.8    ReleaseButtonToUseDial               int8u & 0x01
+   18.1    SelfTimerTime                        int8u & 0x18
+   18.2    MonitorOffTime                       int8u & 0x07
+   20.1    FlashSyncSpeed                       int8u & 0xe0
+           FlashSyncSpeed                       int8u & 0xf0
+   20.2    FlashShutterSpeed                    int8u & 0x0f
+   21.1    AutoBracketSet                       int8u & 0xc0
+   21.2    AutoBracketModeM                     int8u & 0x30
+   21.3    AutoBracketOrder                     int8u & 0x08
+   21.4    ModelingFlash                        int8u & 0x01
+   22.1    NoMemoryCard                         int8u & 0x80
+   22.2    MeteringTime                         int8u & 0x0f
+   23.1    InternalFlash                        int8u & 0xc0
 
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-  'AprV'   ApertureValue                        N
-  'BrtV'   BrightnessValue                      N
-  'Expc'   ExposureCompensation                 N
-  'Expo'   ExposureTime                         N
-  'FL35'   FocalLengthIn35mmFormat              N
-  'FNum'   FNumber                              N
-  'FoLn'   FocalLength                          N
-  'ISOS'   ISO                                  N
-  'SVer'   FirmwareVersion                      N
-  'Scrn'   PreviewInfo                          Kodak Scrn
-  'Seri'   SerialNumber                         N
-  'StSV'   ShutterSpeedValue                    N
+=head3 NikonCustom SettingsD700 Tags
 
-=head3 Kodak Scrn Tags
+Custom settings for the D700.
 
-  Index2   Tag Name                             Writable
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    PreviewImageWidth                    N
-      1    PreviewImageHeight                   N
-      2    PreviewImageLength                   N
-      4    PreviewImage                         N
+    0.1    CustomSettingsBank                   int8u & 0x03
+    0.2    CustomSettingsAllDefault             int8u & 0x80
+    1.1    AF-CPrioritySelection                int8u & 0xc0
+    1.2    AF-SPrioritySelection                int8u & 0x20
+    1.3    AFPointSelection                     int8u & 0x10
+    1.4    DynamicAFArea                        int8u & 0x0c
+    2.1    AFActivation                         int8u & 0x80
+    2.2    FocusPointWrap                       int8u & 0x08
+    2.3    AFPointIllumination                  int8u & 0x06
+    2.4    AFAssist                             int8u & 0x01
+    3.1    FocusTrackingLockOn                  int8u & 0x07
+    3.2    AF-OnForMB-D10                       int8u & 0x70
+    4.1    ISOStepSize                          int8u & 0xc0
+    4.2    ExposureControlStepSize              int8u & 0x30
+    4.3    ExposureCompStepSize                 int8u & 0x0c
+    4.4    EasyExposureCompensation             int8u & 0x03
+    5.1    CenterWeightedAreaSize               int8u & 0x70
+    6.1    FineTuneOptMatrixMetering            int8u & 0xf0
+    6.2    FineTuneOptSpotMetering              int8u & 0x0f
+    7.1    ShutterReleaseButtonAE-L             int8u & 0x80
+    7.2    SelfTimerTime                        int8u & 0x30
+    7.3    MeteringTime                         int8u & 0x0f
+    8.1    PlaybackMonitorOffTime               int8u & 0x38
+    8.2    MenuMonitorOffTime                   int8u & 0x07
+    9.1    ShootingInfoMonitorOffTime           int8u & 0x38
+    9.2    ImageReviewTime                      int8u & 0x07
+   10.1    Beep                                 int8u & 0xc0
+   10.2    ShootingInfoDisplay                  int8u & 0x30
+   10.3    LCDIllumination                      int8u & 0x08
+   10.4    ExposureDelayMode                    int8u & 0x04
+   10.5    GridDisplay                          int8u & 0x02
+   11.1    FileNumberSequence                   int8u & 0x40
+   11.2    CLModeShootingSpeed                  int8u & 0x07
+     12    MaxContinuousRelease                 int8u
+   13.1    ScreenTips                           int8u & 0x08
+   13.2    BatteryOrder                         int8u & 0x04
+   13.3    MB-D10BatteryType                    int8u & 0x03
+   15.1    FlashSyncSpeed                       int8u & 0xf0
+   15.2    FlashShutterSpeed                    int8u & 0x0f
+   16.1    FlashControlBuilt-in                 int8u & 0xc0
+   16.2    ManualFlashOutput                    int8u & 0x1f
+   17.1    RepeatingFlashOutput                 int8u & 0x70
+   17.2    RepeatingFlashCount                  int8u & 0x0f
+   18.1    RepeatingFlashRate                   int8u & 0xf0
+   18.2    CommanderInternalTTLChannel          int8u & 0x03
+   20.1    CommanderInternalTTLCompBuiltin      int8u & 0x1f
+   21.1    CommanderInternalTTLCompGroupA       int8u & 0x1f
+   22.1    CommanderInternalTTLCompGroupB       int8u & 0x1f
+   26.1    AutoBracketSet                       int8u & 0xc0
+   26.2    AutoBracketModeM                     int8u & 0x30
+   26.3    AutoBracketOrder                     int8u & 0x08
+   26.4    ModelingFlash                        int8u & 0x01
+   27.1    MultiSelectorShootMode               int8u & 0xc0
+   27.2    MultiSelectorPlaybackMode            int8u & 0x30
+   27.3    InitialZoomSetting                   int8u & 0x0c
+   27.4    MultiSelector                        int8u & 0x01
+   28.1    FuncButton                           int8u & 0xf8
+   29.1    PreviewButton                        int8u & 0xf8
+   30.1    AELockButton                         int8u & 0xf8
+   31.1    FuncButtonPlusDials                  int8u & 0x70
+   31.2    PreviewButtonPlusDials               int8u & 0x07
+   32.1    AELockButtonPlusDials                int8u & 0x70
+   33.1    CommandDialsReverseRotation          int8u & 0x80
+   33.2    CommandDialsChangeMainSub            int8u & 0x40
+   33.3    CommandDialsApertureSetting          int8u & 0x20
+   33.4    CommandDialsMenuAndPlayback          int8u & 0x10
+   33.5    ReverseIndicators                    int8u & 0x08
+   33.6    PhotoInfoPlayback                    int8u & 0x04
+   33.7    NoMemoryCard                         int8u & 0x02
+   33.8    ReleaseButtonToUseDial               int8u & 0x01
 
-=head3 Kodak DcMD Tags
+=head3 NikonCustom SettingsD800 Tags
 
-Metadata directory found in MOV and MP4 videos from some Kodak cameras.
+Custom settings for the D800.
 
-  Tag ID   Tag Name                             Writable
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-  'CMbo'   CameraByteOrder                      N
-  'Cmbo'   CameraByteOrder                      N
-  'DcEM'   DcEM                                 Kodak DcEM
-  'DcME'   DcME                                 Kodak DcME
+   12.1    AutoBracketingSet                    int8u & 0xe0
+   12.2    AutoBracketOrder                     int8u & 0x10
+   12.3    AutoBracketingMode                   int8u & 0x0c
+   22.1    FlashSyncSpeed                       int8u & 0xf0
+   22.2    FlashShutterSpeed                    int8u & 0x0f
+   23.1    FlashControlBuilt-in                 int8u & 0xc0
+   23.2    ManualFlashOutput                    int8u & 0x1f
+   24.1    RepeatingFlashOutput                 int8u & 0x70
+   24.2    RepeatingFlashCount                  int8u & 0x0f
+   25.1    RepeatingFlashRate                   int8u & 0xf0
+   25.2    CommanderChannel                     int8u & 0x03
+   27.1    CommanderInternalFlash               int8u & 0xc0
+   27.2    CommanderInternalManualOutput        int8u & 0x1f
+   28.1    CommanderGroupAMode                  int8u & 0xc0
+   28.2    CommanderGroupAManualOutput          int8u & 0x1f
+   29.1    CommanderGroupBMode                  int8u & 0xc0
+   29.2    CommanderGroupBManualOutput          int8u & 0x1f
+   30.1    ModelingFlash                        int8u & 0x20
+   30.2    CommanderInternalTTLComp             int8u & 0x1f
+   31.1    CommanderGroupA_TTL-AAComp           int8u & 0x1f
+   32.1    CommanderGroupB_TTL-AAComp           int8u & 0x1f
 
-=head3 Kodak DcEM Tags
+=head3 NikonCustom SettingsD5000 Tags
 
-  Tag ID   Tag Name                             Writable
+Custom settings for the D5000.
+
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-  [no tags known]
+    0.1    AFAreaModeSetting                    int8u & 0x60
+    0.2    AFAssist                             int8u & 0x01
+    2.1    Beep                                 int8u & 0xc0
+    2.2    GridDisplay                          int8u & 0x02
+    2.3    ISODisplay                           int8u & 0x08
+    2.4    NoMemoryCard                         int8u & 0x20
+    3.1    FileNumberSequence                   int8u & 0x08
+    4.1    RangeFinder                          int8u & 0x10
+    4.2    DateImprint                          int8u & 0x08
+    4.3    ReverseIndicators                    int8u & 0x80
+    5.1    EVStepSize                           int8u & 0x40
+    9.1    ExposureDelayMode                    int8u & 0x40
+   11.1    AutoBracketSet                       int8u & 0xc0
+   12.1    TimerFunctionButton                  int8u & 0x38
+   15.1    AELockButton                         int8u & 0x38
+   16.1    ShutterReleaseButtonAE-L             int8u & 0x02
+   16.2    CommandDialsReverseRotation          int8u & 0x80
+   17.1    MeteringTime                         int8u & 0x70
+   17.2    RemoteOnDuration                     int8u & 0x03
+   18.1    SelfTimerTime                        int8u & 0xc0
+   18.2    SelfTimerShotCount                   int8u & 0x1e
+   19.1    ImageReviewTime                      int8u & 0xe0
+   20.1    PlaybackMenusTime                    int8u & 0xe0
+   22.1    InternalFlash                        int8u & 0xc0
+   22.2    ManualFlashOutput                    int8u & 0x1f
+   32.1    LiveViewAF                           int8u & 0x60
 
-=head3 Kodak DcME Tags
+=head3 NikonCustom SettingsD5100 Tags
 
-  Tag ID   Tag Name                             Writable
+Custom settings for the D5100.
+
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-  [no tags known]
+    0.1    AF-CPrioritySelection                int8u & 0x80
+    1.1    AFAssist                             int8u & 0x01
+    3.1    Beep                                 int8u & 0xc0
+    3.2    NoMemoryCard                         int8u & 0x20
+    3.3    ISODisplay                           int8u & 0x08
+    4.1    FileNumberSequence                   int8u & 0x08
+    5.1    RangeFinder                          int8u & 0x10
+    5.2    ReverseIndicators                    int8u & 0x80
+    6.1    EVStepSize                           int8u & 0x40
+   10.1    ExposureDelayMode                    int8u & 0x40
+   12.1    AutoBracketSet                       int8u & 0xc0
+   13.1    TimerFunctionButton                  int8u & 0x38
+   16.1    AELockButton                         int8u & 0x38
+   17.1    ShutterReleaseButtonAE-L             int8u & 0x02
+   17.2    CommandDialsReverseRotation          int8u & 0x80
+   18.1    MeteringTime                         int8u & 0x70
+   18.2    RemoteOnDuration                     int8u & 0x03
+   19.1    SelfTimerTime                        int8u & 0xc0
+   19.2    SelfTimerShotCount                   int8u & 0x0f
+   20.1    ImageReviewTime                      int8u & 0xe0
+   20.2    LiveViewMonitorOffTime               int8u & 0x1c
+   21.1    PlaybackMenusTime                    int8u & 0xe0
+   23.1    ManualFlashOutput                    int8u & 0x1f
 
-=head3 Kodak MOV Tags
+=head3 NikonCustom SettingsD5200 Tags
 
-This information is found in the TAGS atom of MOV videos from Kodak models
-such as the P880.
+Custom settings for the D5200.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    Make                                 N
-     22    Model                                N
-     64    ModelType                            N
-     78    ExposureTime                         N
-     82    FNumber                              N
-     90    ExposureCompensation                 N
-    112    FocalLength                          N
+    0.1    AF-CPrioritySelection                int8u & 0x80
+    0.2    NumberOfFocusPoints                  int8u & 0x10
+    1.1    AFAssist                             int8u & 0x01
+    3.1    Beep                                 int8u & 0xc0
+    3.2    NoMemoryCard                         int8u & 0x20
+    3.3    ISODisplay                           int8u & 0x08
+    4.1    FileNumberSequence                   int8u & 0x08
+    5.1    RangeFinder                          int8u & 0x04
+    5.2    ReverseExposureCompDial              int8u & 0x10
+    5.3    ReverseShutterSpeedAperture          int8u & 0x08
+    5.4    ReverseIndicators                    int8u & 0x80
+    6.1    EVStepSize                           int8u & 0x40
+   10.1    ExposureDelayMode                    int8u & 0x40
+   12.1    AutoBracketSet                       int8u & 0xc0
+   13.1    FunctionButton                       int8u & 0x1f
+   16.1    AELockButton                         int8u & 0x0f
+   17.1    ShutterReleaseButtonAE-L             int8u & 0x02
+   18.1    StandbyTimer                         int8u & 0xe0
+   18.2    RemoteOnDuration                     int8u & 0x03
+   19.1    SelfTimerTime                        int8u & 0xc0
+   19.2    SelfTimerShotCount                   int8u & 0x0f
+   20.1    ImageReviewTime                      int8u & 0xe0
+   20.2    LiveViewMonitorOffTime               int8u & 0x1c
+   21.1    PlaybackMenusTime                    int8u & 0xe0
+   23.1    InternalFlash                        int8u & 0xc0
+   23.2    ManualFlashOutput                    int8u & 0x1f
 
-=head2 Leaf Tags
+=head3 NikonCustom SettingsD7000 Tags
 
-These tags are found in .MOS images from Leaf digital camera backs as
-written by Creo Leaf Capture.  They exist within the Leaf-specific directory
-structure of EXIF tag 0x8606.  The tables below list observed Leaf tags,
-however ExifTool will extract any tags found in the Leaf directories even if
-they don't appear in these tables.
+Custom settings for the D7000.
 
-  Tag ID                          Tag Name      Writable
-  ------                          --------      --------
-  'JPEG_preview_data'             PreviewImage  undef
-  'JPEG_preview_info'             PreviewInfo   N
-  'PDA_histogram_data'            PDAHistogram  N
-  'back_serial_number'            BackSerial    N
-  'camera_profile'                CameraProfile Leaf CameraProfile
-  'icc_camera_profile'            ICC_Profile   ICC_Profile
-  'icc_camera_to_tone_matrix'     ToneMatrix    N
-  'icc_camera_to_tone_space_flow' ToneSpaceFlow N
-  'icc_rgb_ws_profile'            RGB_Profile   ICC_Profile
-  'image_offset'                  ImageOffset   N
-  'pattern_ratation_angle'        PatternAngle  N
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+    0.1    AF-CPrioritySelection                int8u & 0x80
+    0.2    AF-SPrioritySelection                int8u & 0x20
+    0.3    NumberOfFocusPoints                  int8u & 0x10
+    0.4    FocusTrackingLockOn                  int8u & 0x07
+    1.2    FocusPointWrap                       int8u & 0x08
+    1.3    AFPointIllumination                  int8u & 0x06
+    1.4    AFAssist                             int8u & 0x01
+    2.1    BatteryOrder                         int8u & 0x40
+    2.2    AF-OnForMB-D11                       int8u & 0x1c
+    2.3    MB-D11BatteryType                    int8u & 0x03
+    3.1    BeepPitch                            int8u & 0xc0
+    3.2    NoMemoryCard                         int8u & 0x20
+    3.3    ISODisplay                           int8u & 0x0c
+    3.4    GridDisplay                          int8u & 0x02
+    3.5    ViewfinderWarning                    int8u & 0x01
+    4.1    ShootingInfoDisplay                  int8u & 0xc0
+    4.2    LCDIllumination                      int8u & 0x20
+    4.3    FileNumberSequence                   int8u & 0x08
+    4.4    ScreenTips                           int8u & 0x04
+    4.5    BeepVolume                           int8u & 0x03
+    5.1    ReverseIndicators                    int8u & 0x80
+    5.2    EasyExposureCompensation             int8u & 0x03
+    6.1    ExposureControlStep                  int8u & 0x40
+    6.2    ISOSensitivityStep                   int8u & 0x10
+    7.1    CenterWeightedAreaSize               int8u & 0xe0
+   10.1    ExposureDelayMode                    int8u & 0x40
+   10.2    CLModeShootingSpeed                  int8u & 0x07
+     11    MaxContinuousRelease                 int8u
+   12.1    AutoBracketSet                       int8u & 0xe0
+   12.2    AutoBracketOrder                     int8u & 0x10
+   13.1    FuncButton                           int8u & 0xf8
+   14.1    PreviewButton                        int8u & 0xf8
+   15.1    OKButton                             int8u & 0x18
+   16.1    AELockButton                         int8u & 0x38
+   17.1    CommandDialsReverseRotation          int8u & 0x80
+   17.2    CommandDialsChangeMainSub            int8u & 0x60
+   17.3    CommandDialsApertureSetting          int8u & 0x04
+   17.4    CommandDialsMenuAndPlayback          int8u & 0x18
+   17.5    ShutterReleaseButtonAE-L             int8u & 0x02
+   17.6    ReleaseButtonToUseDial               int8u & 0x01
+   18.1    MeteringTime                         int8u & 0xf0
+   18.2    RemoteOnDuration                     int8u & 0x03
+   19.1    SelfTimerTime                        int8u & 0xc0
+   19.2    SelfTimerInterval                    int8u & 0x30
+   19.3    SelfTimerShotCount                   int8u & 0x0f
+   20.1    ImageReviewTime                      int8u & 0xe0
+   20.2    LiveViewMonitorOffTime               int8u & 0x1c
+   21.1    MenuMonitorOffTime                   int8u & 0xe0
+   21.2    ShootingInfoMonitorOffTime           int8u & 0x1c
+   22.1    FlashSyncSpeed                       int8u & 0xf0
+   22.2    FlashShutterSpeed                    int8u & 0x0f
+   23.1    FlashControlBuilt-in                 int8u & 0xc0
+   23.2    ManualFlashOutput                    int8u & 0x1f
+   24.1    RepeatingFlashOutput                 int8u & 0x70
+   24.2    RepeatingFlashCount                  int8u & 0x0f
+   25.1    RepeatingFlashRate                   int8u & 0xf0
+   26.1    CommanderInternalTTLCompBuiltin      int8u & 0x1f
+   27.1    CommanderInternalTTLCompGroupA       int8u & 0x1f
+   28.1    CommanderInternalTTLCompGroupB       int8u & 0x1f
+   30.1    FlashWarning                         int8u & 0x80
+   30.2    ModelingFlash                        int8u & 0x20
+   34.1    LiveViewAFAreaMode                   int8u & 0x60
+   34.2    LiveViewAFMode                       int8u & 0x02
+   35.1    PlaybackMonitorOffTime               int8u & 0xe0
 
-=head3 Leaf CameraProfile Tags
+=head2 NikonCapture Tags
 
-All B<Tag ID>'s in the following table have a leading 'CamProf_' which
-has been removed.
+This information is written by the Nikon Capture software in tag 0x0e01 of
+the maker notes of NEF images.
 
-  Tag ID               Tag Name                 Writable
-  ------               --------                 --------
-  'back_type'          CameraBackType           N
-  'capture_profile'    CaptureProfile           Leaf CaptureProfile
-  'image_profile'      ImageProfile             Leaf ImageProfile
-  'name'               CameraName               N
-  'type'               CameraType               N
-  'version'            CameraProfileVersion     N
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  0x8ae85e     LCHEditor                        int8u
+  0x83a1a25    HistogramXML                     undef
+  0xc89224b    ColorAberrationControl           int8u
+  0x116fea21   HighlightData                    NikonCapture HighlightData
+  0x2175eb78   D-LightingHQ                     int8u
+  0x2fc08431   StraightenAngle                  double
+  0x374233e0   CropData                         NikonCapture CropData
+  0x39c456ac   PictureCtrl                      NikonCapture PictureCtrl
+  0x3cfc73c6   RedEyeData                       NikonCapture RedEyeData
+  0x3d136244   EditVersionName                  string
+  0x56a54260   Exposure                         NikonCapture Exposure
+  0x5f0e7d23   ColorBooster                     int8u
+  0x6a6e36b6   D-LightingHQSelected             int8u
+  0x753dcbc0   NoiseReduction                   int8u
+  0x76a43200   UnsharpMask                      int8u
+  0x76a43201   Curves                           int8u
+  0x76a43202   ColorBalanceAdj                  int8u
+  0x76a43203   AdvancedRaw                      int8u
+  0x76a43204   WhiteBalanceAdj                  int8u
+  0x76a43205   VignetteControl                  int8u
+  0x76a43206   FlipHorizontal                   int8u
+  0x76a43207   Rotation                         int16u
+  0x84589434   BrightnessData                   NikonCapture Brightness
+  0x890ff591   D-LightingHQData                 NikonCapture DLightingHQ
+  0x926f13e0   NoiseReductionData               NikonCapture NoiseReduction
+  0x9ef5f6e0   IPTCData                         IPTC
+  0xab5eca5e   PhotoEffects                     int8u
+  0xac6bd5c0   VignetteControlIntensity         int16s
+  0xb0384e1e   PhotoEffectsData                 NikonCapture PhotoEffects
+  0xb999a36f   ColorBoostData                   NikonCapture ColorBoost
+  0xbf3c6c20   WBAdjData                        NikonCapture WBAdjData
+  0xce5554aa   D-LightingHS                     int8u
+  0xe2173c47   PictureControl                   int8u
+  0xe37b4337   D-LightingHSData                 NikonCapture DLightingHS
+  0xe42b5161   UnsharpData                      NikonCapture UnsharpData
+  0xe9651831   PhotoEffectHistoryXML            undef
+  0xfe28a44f   AutoRedEye                       int8u
+  0xfe443a45   ImageDustOff                     int8u
 
-=head3 Leaf CaptureProfile Tags
+=head3 NikonCapture HighlightData Tags
 
-All B<Tag ID>'s in the following table have a leading 'CaptProf_' which
-has been removed.
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    ShadowProtection                     int8s
+      1    SaturationAdj                        int8s
+      6    HighlightProtection                  int8s
 
-  Tag ID                 Tag Name               Writable
-  ------                 --------               --------
-  'CCD_rect'             CCDRect                N
-  'CCD_valid_rect'       CCDValidRect           N
-  'CCD_video_rect'       CCDVideoRect           N
-  'back_type'            CaptProfBackType       N
-  'center_dark_rect'     CenterDarkRect         N
-  'color_averages'       ColorAverages          N
-  'color_matrix'         ColorMatrix            N
-  'dark_correction_type' DarkCorrectionType     N
-  'image_bounds'         ImageBounds            N
-  'image_fields'         ImageFields            N
-  'image_offset'         ImageOffset            N
-  'left_dark_rect'       LeftDarkRect           N
-  'luminance_consts'     LuminanceConsts        N
-  'mosaic_pattern'       MosaicPattern          N
-  'name'                 CaptProfName           N
-  'number_of_planes'     NumberOfPlanes         N
-  'raw_data_rotation'    RawDataRotation        N
-  'reconstruction_type'  ReconstructionType     N
-  'right_dark_rect'      RightDarkRect          N
-  'serial_number'        CaptureSerial          N
-  'type'                 CaptProfType           N
-  'version'              CaptProfVersion        N
-  'xy_offset_info'       XYOffsetInfo           N
+=head3 NikonCapture CropData Tags
+
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+     30    CropLeft                             double
+     38    CropTop                              double
+     46    CropRight                            double
+     54    CropBottom                           double
+    142    CropOutputWidthInches                double
+    150    CropOutputHeightInches               double
+    158    CropScaledResolution                 double
+    174    CropSourceResolution                 double
+    182    CropOutputResolution                 double
+    190    CropOutputScale                      double
+    198    CropOutputWidth                      double
+    206    CropOutputHeight                     double
+    214    CropOutputPixels                     double
 
-=head3 Leaf ImageProfile Tags
+=head3 NikonCapture PictureCtrl Tags
 
-All B<Tag ID>'s in the following table have a leading 'ImgProf_' which
-has been removed.
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    PictureControlActive                 int8u
+     19    PictureControlMode                   string[16]
+     42    QuickAdjust                          int8u
+     43    SharpeningAdj                        int8u
+     44    ContrastAdj                          int8u
+     45    BrightnessAdj                        int8u
+     46    SaturationAdj                        int8u
+     47    HueAdj                               int8u
 
-  Tag ID               Tag Name                 Writable
-  ------               --------                 --------
-  'back_type'          ImgProfBackType          N
-  'image_status'       ImageStatus              N
-  'name'               ImgProfName              N
-  'rotation_angle'     RotationAngle            N
-  'shoot_setup'        ShootSetup               Leaf ShootSetup
-  'type'               ImgProfType              N
-  'version'            ImgProfVersion           N
+=head3 NikonCapture RedEyeData Tags
 
-=head3 Leaf ShootSetup Tags
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    RedEyeCorrection                     int8u
 
-All B<Tag ID>'s in the following table have a leading 'ShootObj_' which
-has been removed.
+=head3 NikonCapture Exposure Tags
 
-  Tag ID               Tag Name                 Writable
-  ------               --------                 --------
-  'back_type'          ShootObjBackType         N
-  'camera_setup'       CameraSetup              Leaf CameraSetup
-  'capture_setup'      CaptureSetup             Leaf CaptureSetup
-  'color_setup'        ColorSetup               Leaf ColorSetup
-  'look_header'        LookHeader               Leaf LookHeader
-  'name'               ShootObjName             N
-  'save_setup'         SaveSetup                Leaf SaveSetup
-  'type'               ShootObjType             N
-  'version'            ShootObjVersion          N
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    ExposureAdj                          int16s
+     18    ExposureAdj2                         double
+     36    ActiveD-Lighting                     int8u
+     37    ActiveD-LightingMode                 int8u
 
-=head3 Leaf CameraSetup Tags
+=head3 NikonCapture Brightness Tags
 
-All B<Tag ID>'s in the following table have a leading 'CameraObj_' which
-has been removed.
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    BrightnessAdj                        double
+      8    EnhanceDarkTones                     int8u
 
-  Tag ID               Tag Name                 Writable
-  ------               --------                 --------
-  'ISO_speed'          ISOSpeed                 N
-  'back_type'          CameraObjBackType        N
-  'camera_type'        CameraType               N
-  'lens_ID'            LensID                   N
-  'lens_type'          LensType                 N
-  'name'               CameraObjName            N
-  'strobe'             Strobe                   N
-  'type'               CameraObjType            N
-  'version'            CameraObjVersion         N
+=head3 NikonCapture DLightingHQ Tags
 
-=head3 Leaf CaptureSetup Tags
+  Index4   Tag Name                             Writable
+  ------   --------                             --------
+      0    D-LightingHQShadow                   int32u
+      1    D-LightingHQHighlight                int32u
+      2    D-LightingHQColorBoost               int32u
 
-All B<Tag ID>'s in the following table have a leading 'CaptureObj_' which
-has been removed.
+=head3 NikonCapture NoiseReduction Tags
 
-  Tag ID               Tag Name                 Writable
-  ------               --------                 --------
-  'Multi_quality'      MultiQuality             N
-  'back_type'          CaptureObjBackType       N
-  'name'               CaptureObjName           N
-  'neutals'            Neutals                  Leaf Neutrals
-  'selection'          Selection                Leaf Selection
-  'sharpness'          Sharpness                Leaf Sharpness
-  'single_quality'     SingleQuality            N
-  'tone_curve'         ToneCurve                Leaf ToneCurve
-  'type'               CaptureObjType           N
-  'version'            CaptureObjVersion        N
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      4    EdgeNoiseReduction                   int8u
+      5    ColorMoireReductionMode              int8u
+      9    NoiseReductionIntensity              int32u
+     13    NoiseReductionSharpness              int32u
+     17    NoiseReductionMethod                 int16u
+     21    ColorMoireReduction                  int8u
+     23    NoiseReduction                       int8u
+     24    ColorNoiseReductionIntensity         int32u
+     28    ColorNoiseReductionSharpness         int32u
 
-=head3 Leaf Neutrals Tags
+=head3 NikonCapture PhotoEffects Tags
 
-All B<Tag ID>'s in the following table have a leading 'NeutObj_' which
-has been removed.
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    PhotoEffectsType                     int8u
+      4    PhotoEffectsRed                      int16s
+      6    PhotoEffectsGreen                    int16s
+      8    PhotoEffectsBlue                     int16s
 
-  Tag ID                 Tag Name               Writable
-  ------                 --------               --------
-  'back_type'            NeutObjBackType        N
-  'color_casts'          ColorCasts             N
-  'highlight_end_points' HighlightEndPoints     N
-  'name'                 NeutObjName            N
-  'neutrals'             Neutrals               N
-  'shadow_end_points'    ShadowEndPoints        N
-  'type'                 NeutObjType            N
-  'version'              NeutObjVersion         N
+=head3 NikonCapture ColorBoost Tags
 
-=head3 Leaf Selection Tags
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    ColorBoostType                       int8u
+      1    ColorBoostLevel                      int32u
 
-All B<Tag ID>'s in the following table have a leading 'SelObj_' which
-has been removed.
+=head3 NikonCapture WBAdjData Tags
 
-  Tag ID               Tag Name                 Writable
-  ------               --------                 --------
-  'back_type'          SelObjBackType           N
-  'locks'              Locks                    N
-  'name'               SelObjName               N
-  'orientation'        Orientation              N
-  'rect'               Rect                     N
-  'resolution'         Resolution               N
-  'scale'              Scale                    N
-  'type'               SelObjType               N
-  'version'            SelObjVersion            N
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    WBAdjRedBalance                      double
+      8    WBAdjBlueBalance                     double
+     16    WBAdjMode                            int8u
+     20    WBAdjLightingSubtype                 int8u
+     21    WBAdjLighting                        int8u
+     24    WBAdjTemperature                     int16u
+     37    WBAdjTint                            int32s
 
-=head3 Leaf Sharpness Tags
+=head3 NikonCapture DLightingHS Tags
 
-All B<Tag ID>'s in the following table have a leading 'SharpObj_' which
-has been removed.
+  Index4   Tag Name                             Writable
+  ------   --------                             --------
+      0    D-LightingHSAdjustment               int32u
+      1    D-LightingHSColorBoost               int32u
 
-  Tag ID               Tag Name                 Writable
-  ------               --------                 --------
-  'back_type'          SharpObjBackType         N
-  'data_len'           DataLen                  N
-  'name'               SharpObjName             N
-  'sharp_info'         SharpInfo                N
-  'sharp_method'       SharpMethod              N
-  'type'               SharpObjType             N
-  'version'            SharpObjVersion          N
+=head3 NikonCapture UnsharpData Tags
 
-=head3 Leaf ToneCurve Tags
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    UnsharpCount                         int8u
+     19    Unsharp1Color                        int16u
+     23    Unsharp1Intensity                    int16u
+     25    Unsharp1HaloWidth                    int16u
+     27    Unsharp1Threshold                    int8u
+     46    Unsharp2Color                        int16u
+     50    Unsharp2Intensity                    int16u
+     52    Unsharp2HaloWidth                    int16u
+     54    Unsharp2Threshold                    int8u
+     73    Unsharp3Color                        int16u
+     77    Unsharp3Intensity                    int16u
+     79    Unsharp3HaloWidth                    int16u
+     81    Unsharp3Threshold                    int8u
+    100    Unsharp4Color                        int16u
+    104    Unsharp4Intensity                    int16u
+    106    Unsharp4HaloWidth                    int16u
+    108    Unsharp4Threshold                    int8u
 
-All B<Tag ID>'s in the following table have a leading 'ToneObj_' which
-has been removed.
+=head2 Olympus Tags
 
-  Tag ID               Tag Name                 Writable
-  ------               --------                 --------
-  'back_type'          ToneObjBackType          N
-  'gamma'              Gamma                    N
-  'name'               ToneObjName              N
-  'npts'               Npts                     N
-  'tones'              Tones                    N
-  'type'               ToneObjType              N
-  'version'            ToneObjVersion           N
+Tags 0x0000 through 0x0103 are used by some older Olympus cameras, and are
+the same as Konica/Minolta tags.  These tags are also used for some models
+from other brands such as Acer, BenQ, Epson, Hitachi, HP, Maginon, Minolta,
+Pentax, Ricoh, Samsung, Sanyo, SeaLife, Sony, Supra and Vivitar.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   MakerNoteVersion                     undef
+  0x0001   MinoltaCameraSettingsOld             Minolta CameraSettings
+  0x0003   MinoltaCameraSettings                Minolta CameraSettings
+  0x0040   CompressedImageSize                  int32u
+  0x0081   PreviewImageData                     N
+  0x0088   PreviewImageStart                    N
+  0x0089   PreviewImageLength                   N
+  0x0100   ThumbnailImage                       undef
+  0x0104   BodyFirmwareVersion                  string
+  0x0200   SpecialMode                          int32u[3]~
+  0x0201   Quality                              int16u~
+  0x0202   Macro                                int16u
+  0x0203   BWMode                               int16u
+  0x0204   DigitalZoom                          rational64u
+  0x0205   FocalPlaneDiagonal                   rational64u
+  0x0206   LensDistortionParams                 int16s[6]
+  0x0207   CameraType                           string
+  0x0208   TextInfo                             Olympus TextInfo
+  0x0209   CameraID                             string
+  0x020b   EpsonImageWidth                      int16u
+  0x020c   EpsonImageHeight                     int16u
+  0x020d   EpsonSoftware                        string
+  0x0280   PreviewImage                         int8u
+  0x0300   PreCaptureFrames                     int16u
+  0x0301   WhiteBoard                           int16u
+  0x0302   OneTouchWB                           int16u
+  0x0303   WhiteBalanceBracket                  int16u
+  0x0304   WhiteBalanceBias                     int16u
+  0x0403   SceneMode                            int16u
+  0x0404   SerialNumber                         string
+  0x0405   Firmware                             string
+  0x0e00   PrintIM                              PrintIM
+  0x0f00   DataDump                             N
+  0x0f01   DataDump2                            N
+  0x0f04   ZoomedPreviewStart                   int32u*
+  0x0f05   ZoomedPreviewLength                  int32u*
+  0x0f06   ZoomedPreviewSize                    int16u[2]
+  0x1000   ShutterSpeedValue                    rational64s
+  0x1001   ISOValue                             rational64s
+  0x1002   ApertureValue                        rational64s
+  0x1003   BrightnessValue                      rational64s
+  0x1004   FlashMode                            int16u
+  0x1005   FlashDevice                          int16u
+  0x1006   ExposureCompensation                 rational64s
+  0x1007   SensorTemperature                    int16s
+  0x1008   LensTemperature                      int16s
+  0x1009   LightCondition                       int16u
+  0x100a   FocusRange                           int16u
+  0x100b   FocusMode                            int16u
+  0x100c   ManualFocusDistance                  rational64u
+  0x100d   ZoomStepCount                        int16u
+  0x100e   FocusStepCount                       int16u
+  0x100f   Sharpness                            int16u
+  0x1010   FlashChargeLevel                     int16u
+  0x1011   ColorMatrix                          int16u[9]
+  0x1012   BlackLevel                           int16u[4]
+  0x1013   ColorTemperatureBG?                  int16u
+  0x1014   ColorTemperatureRG?                  int16u
+  0x1015   WBMode                               int16u[2]
+  0x1017   RedBalance                           int16u[2]
+  0x1018   BlueBalance                          int16u[2]
+  0x1019   ColorMatrixNumber                    int16u
+  0x101a   SerialNumber                         string
+  0x101b   ExternalFlashAE1_0?                  int32u
+  0x101c   ExternalFlashAE2_0?                  int32u
+  0x101d   InternalFlashAE1_0?                  int32u
+  0x101e   InternalFlashAE2_0?                  int32u
+  0x101f   ExternalFlashAE1?                    int32u
+  0x1020   ExternalFlashAE2?                    int32u
+  0x1021   InternalFlashAE1?                    int32u
+  0x1022   InternalFlashAE2?                    int32u
+  0x1023   FlashExposureComp                    rational64s
+  0x1024   InternalFlashTable                   int16u
+  0x1025   ExternalFlashGValue                  rational64s
+  0x1026   ExternalFlashBounce                  int16u
+  0x1027   ExternalFlashZoom                    int16u
+  0x1028   ExternalFlashMode                    int16u
+  0x1029   Contrast                             int16u
+  0x102a   SharpnessFactor                      int16u
+  0x102b   ColorControl                         int16u[6]
+  0x102c   ValidBits                            int16u[2]
+  0x102d   CoringFilter                         int16u
+  0x102e   OlympusImageWidth                    int32u
+  0x102f   OlympusImageHeight                   int32u
+  0x1030   SceneDetect                          int16u
+  0x1031   SceneArea?                           int32u[8]
+  0x1033   SceneDetectData?                     int32u[720]
+  0x1034   CompressionRatio                     rational64u
+  0x1035   PreviewImageValid                    int32u
+  0x1036   PreviewImageStart                    int32u*
+  0x1037   PreviewImageLength                   int32u*
+  0x1038   AFResult                             int16u
+  0x1039   CCDScanMode                          int16u
+  0x103a   NoiseReduction                       int16u
+  0x103b   FocusStepInfinity                    int16u
+  0x103c   FocusStepNear                        int16u
+  0x103d   LightValueCenter                     rational64s
+  0x103e   LightValuePeriphery                  rational64s
+  0x103f   FieldCount?                          int16u
+  0x2010   Equipment                            Olympus Equipment
+           EquipmentIFD                         Olympus Equipment
+  0x2020   CameraSettings                       Olympus CameraSettings
+           CameraSettingsIFD                    Olympus CameraSettings
+  0x2030   RawDevelopment                       Olympus RawDevelopment
+           RawDevelopmentIFD                    Olympus RawDevelopment
+  0x2031   RawDev2                              Olympus RawDevelopment2
+           RawDev2IFD                           Olympus RawDevelopment2
+  0x2040   ImageProcessing                      Olympus ImageProcessing
+           ImageProcessingIFD                   Olympus ImageProcessing
+  0x2050   FocusInfo                            Olympus FocusInfo
+           FocusInfoIFD                         Olympus FocusInfo
+           CameraParameters                     undef
+  0x2100   Olympus2100                          Olympus FE
+           Olympus2100IFD                       Olympus FE
+  0x2200   Olympus2200                          Olympus FE
+           Olympus2200IFD                       Olympus FE
+  0x2300   Olympus2300                          Olympus FE
+           Olympus2300IFD                       Olympus FE
+  0x2400   Olympus2400                          Olympus FE
+           Olympus2400IFD                       Olympus FE
+  0x2500   Olympus2500                          Olympus FE
+           Olympus2500IFD                       Olympus FE
+  0x2600   Olympus2600                          Olympus FE
+           Olympus2600IFD                       Olympus FE
+  0x2700   Olympus2700                          Olympus FE
+           Olympus2700IFD                       Olympus FE
+  0x2800   Olympus2800                          Olympus FE
+           Olympus2800IFD                       Olympus FE
+  0x2900   Olympus2900                          Olympus FE
+           Olympus2900IFD                       Olympus FE
+  0x3000   RawInfo                              Olympus RawInfo
+           RawInfoIFD                           Olympus RawInfo
+  0x4000   MainInfo                             Olympus
+           MainInfoIFD                          Olympus
+  0x5000   UnknownInfo                          Olympus UnknownInfo
+           UnknownInfoIFD                       Olympus UnknownInfo
 
-=head3 Leaf ColorSetup Tags
+=head3 Olympus TextInfo Tags
 
-All B<Tag ID>'s in the following table have a leading 'ColorObj_' which
-has been removed.
+This information is in text format (similar to APP12 information, but with
+spaces instead of linefeeds).  Below are tags which have been observed, but
+any information found here will be extracted, even if the tag is not listed.
 
   Tag ID               Tag Name                 Writable
   ------               --------                 --------
-  'back_type'          ColorObjBackType         N
-  'color_mode'         ColorMode                N
-  'color_type'         ColorType                N
-  'has_ICC'            HasICC                   N
-  'input_profile'      InputProfile             N
-  'name'               ColorObjName             N
-  'output_profile'     OutputProfile            N
-  'type'               ColorObjType             N
-  'version'            ColorObjVersion          N
-
-=head3 Leaf LookHeader Tags
+  'Resolution'         Resolution               N
+  'Type'               CameraType               N
 
-All B<Tag ID>'s in the following table have a leading 'LookHead_' which
-has been removed.
+=head3 Olympus Equipment Tags
 
-  Tag ID               Tag Name                 Writable
-  ------               --------                 --------
-  'back_type'          LookHeadBackType         N
-  'name'               LookHeadName             N
-  'type'               LookHeadType             N
-  'version'            LookHeadVersion          N
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   EquipmentVersion                     undef[4]
+  0x0100   CameraType2                          string[6]
+  0x0101   SerialNumber                         string[32]
+  0x0102   InternalSerialNumber                 string[32]
+  0x0103   FocalPlaneDiagonal                   rational64u
+  0x0104   BodyFirmwareVersion                  int32u
+  0x0201   LensType                             int8u[6]
+  0x0202   LensSerialNumber                     string[32]
+  0x0203   LensModel                            string
+  0x0204   LensFirmwareVersion                  int32u
+  0x0205   MaxApertureAtMinFocal                int16u
+  0x0206   MaxApertureAtMaxFocal                int16u
+  0x0207   MinFocalLength                       int16u
+  0x0208   MaxFocalLength                       int16u
+  0x020a   MaxAperture                          int16u
+  0x020b   LensProperties                       int16u
+  0x0301   Extender                             int8u[6]
+  0x0302   ExtenderSerialNumber                 string[32]
+  0x0303   ExtenderModel                        string
+  0x0304   ExtenderFirmwareVersion              int32u
+  0x0403   ConversionLens                       string
+  0x1000   FlashType                            int16u
+  0x1001   FlashModel                           int16u
+  0x1002   FlashFirmwareVersion                 int32u
+  0x1003   FlashSerialNumber                    string[32]
 
-=head3 Leaf SaveSetup Tags
+=head3 Olympus CameraSettings Tags
 
-All B<Tag ID>'s in the following table have a leading 'SaveObj_' which
-has been removed.
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   CameraSettingsVersion                undef[4]
+  0x0100   PreviewImageValid                    int32u
+  0x0101   PreviewImageStart                    int32u*
+  0x0102   PreviewImageLength                   int32u*
+  0x0200   ExposureMode                         int16u
+  0x0201   AELock                               int16u
+  0x0202   MeteringMode                         int16u
+  0x0203   ExposureShift                        rational64s
+  0x0204   NDFilter                             Y
+  0x0300   MacroMode                            int16u
+  0x0301   FocusMode                            int16u[n]
+  0x0302   FocusProcess                         int16u[n]
+  0x0303   AFSearch                             int16u
+  0x0304   AFAreas                              int32u[64]~
+  0x0305   AFPointSelected                      rational64s[5]~
+  0x0306   AFFineTune                           int8u
+  0x0307   AFFineTuneAdj                        int16s[3]
+  0x0400   FlashMode                            int16u
+  0x0401   FlashExposureComp                    rational64s
+  0x0403   FlashRemoteControl                   int16u
+  0x0404   FlashControlMode                     int16u[3]
+  0x0405   FlashIntensity                       rational64s[3]
+  0x0406   ManualFlashStrength                  rational64s[3]
+  0x0500   WhiteBalance2                        int16u
+  0x0501   WhiteBalanceTemperature              int16u
+  0x0502   WhiteBalanceBracket                  int16s
+  0x0503   CustomSaturation                     int16s[3]~
+  0x0504   ModifiedSaturation                   int16u
+  0x0505   ContrastSetting                      int16s[3]
+  0x0506   SharpnessSetting                     int16s[3]
+  0x0507   ColorSpace                           int16u
+  0x0509   SceneMode                            int16u
+  0x050a   NoiseReduction                       int16u
+  0x050b   DistortionCorrection                 int16u
+  0x050c   ShadingCompensation                  int16u
+  0x050d   CompressionFactor                    rational64u
+  0x050f   Gradation                            int16s[n]
+  0x0520   PictureMode                          int16u[n]
+  0x0521   PictureModeSaturation                int16s[3]
+  0x0522   PictureModeHue?                      int16s
+  0x0523   PictureModeContrast                  int16s[3]
+  0x0524   PictureModeSharpness                 int16s[3]
+  0x0525   PictureModeBWFilter                  int16s
+  0x0526   PictureModeTone                      int16s
+  0x0527   NoiseFilter                          int16s[3]
+  0x0529   ArtFilter                            int16u[4]
+  0x052c   MagicFilter                          int16u[4]
+  0x052d   PictureModeEffect                    int16s[3]
+  0x052e   ToneLevel                            Y
+  0x052f   ArtFilterEffect                      int16u[20]
+  0x0600   DriveMode                            int16u[n]~
+  0x0601   PanoramaMode                         int16u~
+  0x0603   ImageQuality2                        int16u
+  0x0604   ImageStabilization                   int32u
+  0x0900   ManometerPressure                    int16u
+  0x0901   ManometerReading                     int32s[2]
+  0x0902   ExtendedWBDetect                     int16u
+  0x0903   LevelGaugeRoll                       int16u
+  0x0904   LevelGaugePitch                      int16u
+  0x0908   DateTimeUTC                          string
 
-  Tag ID                  Tag Name              Writable
-  ------                  --------              --------
-  'back_type'             SaveObjBackType       N
-  'leaf_auto_active'      LeafAutoActive        N
-  'leaf_auto_base_name'   LeafAutoBaseName      N
-  'leaf_hot_folder'       LeafHotFolder         N
-  'leaf_open_proc_HDR'    LeafOpenProcHDR       N
-  'leaf_output_file_type' LeafOutputFileType    N
-  'leaf_save_selection'   LeafSaveSelection     N
-  'name'                  SaveObjName           N
-  'std_auto_active'       StdAutoActive         N
-  'std_base_name'         StdBaseName           N
-  'std_hot_folder'        StdHotFolder          N
-  'std_open_in_photoshop' StdOpenInPhotoshop    N
-  'std_output_bit_depth'  StdOutputBitDepth     N
-  'std_output_color_mode' StdOutputColorMode    N
-  'std_output_file_type'  StdOutputFileType     N
-  'std_oxygen'            StdOxygen             N
-  'std_save_selection'    StdSaveSelection      N
-  'std_scaled_output'     StdScaledOutput       N
-  'std_sharpen_output'    StdSharpenOutput      N
-  'type'                  SaveObjType           N
-  'version'               SaveObjVersion        N
+=head3 Olympus RawDevelopment Tags
 
-=head3 Leaf SubIFD Tags
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   RawDevVersion                        undef[4]
+  0x0100   RawDevExposureBiasValue              rational64s
+  0x0101   RawDevWhiteBalanceValue              int16u
+  0x0102   RawDevWBFineAdjustment               int16s
+  0x0103   RawDevGrayPoint                      int16u[3]
+  0x0104   RawDevSaturationEmphasis             int16s[3]
+  0x0105   RawDevMemoryColorEmphasis            int16u
+  0x0106   RawDevContrastValue                  int16s[3]
+  0x0107   RawDevSharpnessValue                 int16s[3]
+  0x0108   RawDevColorSpace                     int16u
+  0x0109   RawDevEngine                         int16u
+  0x010a   RawDevNoiseReduction                 int16u
+  0x010b   RawDevEditStatus                     int16u
+  0x010c   RawDevSettings                       int16u
 
-Leaf writes a TIFF-format sub-IFD inside IFD0 of a MOS image.  No tags in
-this sub-IFD are currently known, except for tag 0x8606 which really
-shouldn't be here anyway (so it doesn't appear in the table below) because
-it duplicates a reference to the same data of tag 0x8606 in IFD0.
+=head3 Olympus RawDevelopment2 Tags
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
-  [no tags known]
+  0x0000   RawDevVersion                        undef[4]
+  0x0100   RawDevExposureBiasValue              rational64s
+  0x0101   RawDevWhiteBalance                   int16u
+  0x0102   RawDevWhiteBalanceValue              int16u
+  0x0103   RawDevWBFineAdjustment               int16s
+  0x0104   RawDevGrayPoint                      int16u[3]
+  0x0105   RawDevContrastValue                  int16s[3]
+  0x0106   RawDevSharpnessValue                 int16s[3]
+  0x0107   RawDevSaturationEmphasis             int16s[3]
+  0x0108   RawDevMemoryColorEmphasis            int16u
+  0x0109   RawDevColorSpace                     int16u
+  0x010a   RawDevNoiseReduction                 int16u
+  0x010b   RawDevEngine                         int16u
+  0x010c   RawDevPictureMode                    int16u
+  0x010d   RawDevPMSaturation                   int16s[3]
+  0x010e   RawDevPMContrast                     int16s[3]
+  0x010f   RawDevPMSharpness                    int16s[3]
+  0x0110   RawDevPM_BWFilter                    int16u
+  0x0111   RawDevPMPictureTone                  int16u
+  0x0112   RawDevGradation                      int16s[3]
+  0x0113   RawDevSaturation3                    int16s[3]
+  0x0119   RawDevAutoGradation                  int16u
+  0x0120   RawDevPMNoiseFilter                  int16u
+  0x0121   RawDevArtFilter                      int16u[4]
 
-=head2 Minolta Tags
+=head3 Olympus ImageProcessing Tags
 
-These tags are used by Minolta, Konica/Minolta as well as some Sony cameras.
-Minolta doesn't make things easy for decoders because the meaning of some
-tags and the location where some information is stored is different for
-different camera models.  (Take MinoltaQuality for example, which may be
-located in 5 different places.)
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   ImageProcessingVersion               undef[4]
+  0x0100   WB_RBLevels                          int16u[2]
+  0x0102   WB_RBLevels3000K                     int16u[2]
+  0x0103   WB_RBLevels3300K                     int16u[2]
+  0x0104   WB_RBLevels3600K                     int16u[2]
+  0x0105   WB_RBLevels3900K                     int16u[2]
+  0x0106   WB_RBLevels4000K                     int16u[2]
+  0x0107   WB_RBLevels4300K                     int16u[2]
+  0x0108   WB_RBLevels4500K                     int16u[2]
+  0x0109   WB_RBLevels4800K                     int16u[2]
+  0x010a   WB_RBLevels5300K                     int16u[2]
+  0x010b   WB_RBLevels6000K                     int16u[2]
+  0x010c   WB_RBLevels6600K                     int16u[2]
+  0x010d   WB_RBLevels7500K                     int16u[2]
+  0x010e   WB_RBLevelsCWB1                      int16u[2]
+  0x010f   WB_RBLevelsCWB2                      int16u[2]
+  0x0110   WB_RBLevelsCWB3                      int16u[2]
+  0x0111   WB_RBLevelsCWB4                      int16u[2]
+  0x0113   WB_GLevel3000K                       int16u
+  0x0114   WB_GLevel3300K                       int16u
+  0x0115   WB_GLevel3600K                       int16u
+  0x0116   WB_GLevel3900K                       int16u
+  0x0117   WB_GLevel4000K                       int16u
+  0x0118   WB_GLevel4300K                       int16u
+  0x0119   WB_GLevel4500K                       int16u
+  0x011a   WB_GLevel4800K                       int16u
+  0x011b   WB_GLevel5300K                       int16u
+  0x011c   WB_GLevel6000K                       int16u
+  0x011d   WB_GLevel6600K                       int16u
+  0x011e   WB_GLevel7500K                       int16u
+  0x011f   WB_GLevel                            int16u
+  0x0200   ColorMatrix                          int16u[9]
+  0x0300   Enhancer                             int16u
+  0x0301   EnhancerValues                       int16u[7]
+  0x0310   CoringFilter                         int16u
+  0x0311   CoringValues                         int16u[7]
+  0x0600   BlackLevel2                          int16u[4]
+  0x0610   GainBase                             int16u
+  0x0611   ValidBits                            int16u[2]
+  0x0612   CropLeft                             int16u[2]
+  0x0613   CropTop                              int16u[2]
+  0x0614   CropWidth                            int32u
+  0x0615   CropHeight                           int32u
+  0x0635   UnknownBlock1?                       undef
+  0x0636   UnknownBlock2?                       undef
+  0x0805   SensorCalibration                    int16s[2]
+  0x1010   NoiseReduction2                      int16u
+  0x1011   DistortionCorrection2                int16u
+  0x1012   ShadingCompensation2                 int16u
+  0x101c   MultipleExposureMode                 int16u[2]
+  0x1103   UnknownBlock3?                       undef
+  0x1104   UnknownBlock4?                       undef
+  0x1112   AspectRatio                          int8u[2]
+  0x1113   AspectFrame                          int16u[4]
+  0x1200   FacesDetected                        int32u[n]
+  0x1201   FaceDetectArea                       int16s[n]
+  0x1202   MaxFaces                             int32u[3]
+  0x1203   FaceDetectFrameSize                  int16u[6]
+  0x1207   FaceDetectFrameCrop                  int16s[12]
+  0x1306   CameraTemperature                    N
+
+=head3 Olympus FocusInfo Tags
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
-  0x0000   MakerNoteVersion                     undef[4]
-  0x0001   MinoltaCameraSettingsOld             Minolta CameraSettings
-  0x0003   MinoltaCameraSettings                Minolta CameraSettings
-  0x0004   MinoltaCameraSettings7D              Minolta CameraSettings7D
-  0x0010   CameraInfoA100                       Minolta CameraInfoA100
-  0x0018   ISInfoA100                           Minolta ISInfoA100
-           ImageStabilization                   N
-  0x0020   WBInfoA100                           Minolta WBInfoA100
-  0x0040   CompressedImageSize                  int32u
-  0x0081   PreviewImage                         undef
-  0x0088   PreviewImageStart                    int32u*
-  0x0089   PreviewImageLength                   int32u*
-  0x0100   SceneMode                            int32u
-  0x0101   ColorMode                            int32u
-  0x0102   MinoltaQuality                       int32u
-  0x0103   MinoltaQuality                       int32u
-           MinoltaImageSize                     int32u
-  0x0104   FlashExposureComp                    rational64s
-  0x0105   Teleconverter                        int32u
-  0x0107   ImageStabilization                   int32u
-  0x0109   RawAndJpgRecording                   int32u
-  0x010a   ZoneMatching                         int32u
-  0x010b   ColorTemperature                     int32u
-  0x010c   LensType                             int32u
-  0x0111   ColorCompensationFilter              int32s
-  0x0112   WhiteBalanceFineTune                 int32u
-  0x0113   ImageStabilization                   int32u
-  0x0114   MinoltaCameraSettings5D              Minolta CameraSettings5D
-           CameraSettingsA100                   Minolta CameraSettingsA100
-  0x0115   WhiteBalance                         int32u
-  0x0e00   PrintIM                              PrintIM
-  0x0f00   MinoltaCameraSettings2               N
+  0x0000   FocusInfoVersion                     undef[4]
+  0x0209   AutoFocus?                           int16u
+  0x0210   SceneDetect                          int16u
+  0x0211   SceneArea?                           int32u[8]
+  0x0212   SceneDetectData?                     int32u[720]
+  0x0300   ZoomStepCount                        int16u
+  0x0301   FocusStepCount                       int16u
+  0x0303   FocusStepInfinity                    int16u
+  0x0304   FocusStepNear                        int16u
+  0x0305   FocusDistance                        rational64u
+  0x0308   AFPoint                              int16u
+  0x1201   ExternalFlash                        int16u[2]
+  0x1203   ExternalFlashGuideNumber?            rational64s
+  0x1204   ExternalFlashBounce                  int16u
+  0x1205   ExternalFlashZoom                    rational64u
+  0x1208   InternalFlash                        int16u[n]
+  0x1209   ManualFlash                          int16u[2]~
+  0x120a   MacroLED                             int16u
+  0x1500   SensorTemperature                    int16s
+  0x1600   ImageStabilization                   undef~
 
-=head3 Minolta CameraSettings Tags
+=head3 Olympus FE Tags
 
-There is some variability in CameraSettings information between different
-models (and sometimes even between different firmware versions), so this
-information may not be as reliable as it should be.  Because of this, tags
-in the following tables are set to lower priority to prevent them from
-superceding the values of same-named tags in other locations when duplicate
-tags are disabled.
+Some FE models write a large number of tags here, but most of this
+information remains unknown.
 
-  Index4   Tag Name                             Writable
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      1    ExposureMode                         int32u
-      2    FlashMode                            int32u
-      3    WhiteBalance                         int32u~
-      4    MinoltaImageSize                     int32u
-      5    MinoltaQuality                       int32u
-      6    DriveMode                            int32u
-      7    MeteringMode                         int32u
-      8    ISO                                  int32u
-      9    ExposureTime                         int32u
-     10    FNumber                              int32u
-     11    MacroMode                            int32u
-     12    DigitalZoom                          int32u
-     13    ExposureCompensation                 int32u
-     14    BracketStep                          int32u
-     16    IntervalLength                       int32u
-     17    IntervalNumber                       int32u
-     18    FocalLength                          int32u
-     19    FocusDistance                        int32u
-     20    FlashFired                           int32u
-     21    MinoltaDate                          int32u
-     22    MinoltaTime                          int32u
-     23    MaxAperture                          int32u
-     26    FileNumberMemory                     int32u
-     27    LastFileNumber                       int32u
-     28    ColorBalanceRed                      int32u
-     29    ColorBalanceGreen                    int32u
-     30    ColorBalanceBlue                     int32u
-     31    Saturation                           int32u
-     32    Contrast                             int32u
-     33    Sharpness                            int32u
-     34    SubjectProgram                       int32u
-     35    FlashExposureComp                    int32u
-     36    ISOSetting                           int32u
-     37    MinoltaModelID                       int32u
-     38    IntervalMode                         int32u
-     39    FolderName                           int32u
-     40    ColorMode                            int32u
-     41    ColorFilter                          int32u
-     42    BWFilter                             int32u
-     43    InternalFlash                        int32u
-     44    Brightness                           int32u
-     45    SpotFocusPointX                      int32u
-     46    SpotFocusPointY                      int32u
-     47    WideFocusZone                        int32u
-     48    FocusMode                            int32u
-     49    FocusArea                            int32u
-     50    DECPosition                          int32u
-     51    ColorProfile                         int32u
-     52    DataImprint                          int32u
-     63    FlashMetering                        int32u
+  0x0100   BodyFirmwareVersion                  string
 
-=head3 Minolta CameraSettings7D Tags
+=head3 Olympus RawInfo Tags
 
-  Index2   Tag Name                             Writable
-  ------   --------                             --------
-      0    ExposureMode                         int16u
-      2    MinoltaImageSize                     int16u
-      3    MinoltaQuality                       int16u
-      4    WhiteBalance                         int16u
-     14    FocusMode                            int16u
-     16    AFPoints                             int16u
-     21    Flash                                int16u
-     22    FlashMode                            int16u
-     28    ISOSetting                           int16u
-     30    ExposureCompensation                 int16s
-     37    ColorSpace                           int16u
-     38    Sharpness                            int16u
-     39    Contrast                             int16u
-     40    Saturation                           int16u
-     45    FreeMemoryCardImages                 int16u
-     63    ColorTemperature                     int16s
-     64    HueAdjustment                        int16u
-     70    Rotation                             int16u
-     71    FNumber                              int16u
-     72    ExposureTime                         int16u
-     74    FreeMemoryCardImages                 int16u
-     94    ImageNumber                          int16u
-     96    NoiseReduction                       int16u
-     98    ImageNumber2                         int16u
-    113    ImageStabilization                   int16u
-    117    ZoneMatchingOn                       int16u
+These tags are found only in ORF images of some models (ie. C8080WZ).
 
-=head3 Minolta CameraInfoA100 Tags
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   RawInfoVersion                       undef[4]
+  0x0100   WB_RBLevelsUsed                      int16u[2]
+  0x0110   WB_RBLevelsAuto                      int16u[2]
+  0x0120   WB_RBLevelsShade                     int16u[2]
+  0x0121   WB_RBLevelsCloudy                    int16u[2]
+  0x0122   WB_RBLevelsFineWeather               int16u[2]
+  0x0123   WB_RBLevelsTungsten                  int16u[2]
+  0x0124   WB_RBLevelsEveningSunlight           int16u[2]
+  0x0130   WB_RBLevelsDaylightFluor             int16u[2]
+  0x0131   WB_RBLevelsDayWhiteFluor             int16u[2]
+  0x0132   WB_RBLevelsCoolWhiteFluor            int16u[2]
+  0x0133   WB_RBLevelsWhiteFluorescent          int16u[2]
+  0x0200   ColorMatrix2                         int16u[9]
+  0x0310   CoringFilter                         int16u
+  0x0311   CoringValues                         int16u[11]
+  0x0600   BlackLevel2                          int16u[4]
+  0x0601   YCbCrCoefficients                    N
+  0x0611   ValidPixelDepth                      int16u[2]
+  0x0612   CropLeft                             int16u
+  0x0613   CropTop                              int16u
+  0x0614   CropWidth                            int32u
+  0x0615   CropHeight                           int32u
+  0x1000   LightSource                          int16u
+  0x1001   WhiteBalanceComp                     int16s[3]
+  0x1010   SaturationSetting                    int16s[3]
+  0x1011   HueSetting                           int16s[3]
+  0x1012   ContrastSetting                      int16s[3]
+  0x1013   SharpnessSetting                     int16s[3]
+  0x2000   CMExposureCompensation               rational64s
+  0x2001   CMWhiteBalance                       int16u
+  0x2002   CMWhiteBalanceComp                   int16s
+  0x2010   CMWhiteBalanceGrayPoint              int16u[3]
+  0x2020   CMSaturation                         int16s[3]
+  0x2021   CMHue                                int16s[3]
+  0x2022   CMContrast                           int16s[3]
+  0x2023   CMSharpness                          int16s[3]
 
-Camera information for the Sony DSLR-A100.
+=head3 Olympus UnknownInfo Tags
 
-  Index1   Tag Name                             Writable
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      1    AFSensorActive                       int8u
-      2    AFStatusActiveSensor                 int16s
-      4    AFStatusTop-Right                    int16s
-      6    AFStatusBottom-Right                 int16s
-      8    AFStatusBottom                       int16s
-     10    AFStatusMiddleHorizontal             int16s
-     12    AFStatusCenterVertical               int16s
-     14    AFStatusTop                          int16s
-     16    AFStatusTop-Left                     int16s
-     18    AFStatusBottom-Left                  int16s
-     20    FocusLocked                          int8u
-     21    AFPoint                              int8u
-     22    AFMode                               int8u
-     45    AFStatusLeft                         int16s
-     47    AFStatusCenterHorizontal             int16s
-     49    AFStatusRight                        int16s
-     51    AFAreaMode                           int8u
+  [no tags known]
 
-=head3 Minolta ISInfoA100 Tags
+=head3 Olympus MOV1 Tags
 
-Image stabilization information for the Sony DSLR-A100.
+This information is found in MOV videos from Olympus models such as the
+D540Z, D595Z, FE100, FE110, FE115, FE170 and FE200.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    ImageStabilization                   int16u
+      0    Make                                 N
+     24    Model                                N
+     38    ExposureUnknown?                     N
+     42    FNumber                              N
+     50    ExposureCompensation                 N
+     72    FocalLength                          N
 
-=head3 Minolta WBInfoA100 Tags
+=head3 Olympus MOV2 Tags
 
-White balance information for the Sony DSLR-A100.
+This information is found in MOV videos from Olympus models such as the
+FE120, FE140 and FE190.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-     14    DriveMode                            int8u
-     16    Rotation                             int8u
-     20    ImageStabilizationSetting            int8u
-     21    DynamicRangeOptimizerMode            int8u
-     42    ExposureCompensationMode             int8u
-     43    WBBracketShotNumber                  int8u
-     44    WhiteBalanceBracketing               int8u
-     45    ExposureBracketShotNumber            int8u
-     49    FlashFunction                        int16u
-     52    ExposureMode                         int16u
-     54    ColorMode                            int16u
-     56    AverageLV                            int16u
-     60    FrameNumber                          int8u
-    150    WB_RGBLevels                         int16u[3]
-    174    WB_GBRGLevels                        int16u[4]
-    192    WB_RedLevelsTungsten                 int16u[7]
-    206    WB_BlueLevelsTungsten                int16u[7]
-    220    WB_RedLevelsDaylight                 int16u[7]
-    234    WB_BlueLevelsDaylight                int16u[7]
-    248    WB_RedLevelsCloudy                   int16u[7]
-    262    WB_BlueLevelsCloudy                  int16u[7]
-    276    WB_RedLevelsFlash                    int16u[7]
-    290    WB_BlueLevelsFlash                   int16u[7]
-    332    WB_RedLevelsFluorescent              int16u[7]
-    346    WB_BlueLevelsFluorescent             int16u[7]
-    360    WB_RedLevelsShade                    int16u[7]
-    374    WB_BlueLevelsShade                   int16u[7]
-    392    WB_RedLevel6500K                     int16u
-    394    WB_BlueLevel6500K                    int16u
-    396    WB_RedLevelCustom                    int16u
-    398    WB_BlueLevelCustom                   int16u
-    408    WB_RedLevel3500K                     int16u
-    410    WB_BlueLevel3500K                    int16u
-    446    WB_RedLevelsKelvin                   int16u[75]
-    596    WB_BlueLevelsKelvin                  int16u[75]
-    772    WB_RBLevelsFlash                     int16u[2]
-    776    WB_RBLevelsCoolWhiteF                int16u[2]
-   1000    WB_RBLevelsTungsten                  int16u[2]
-   1004    WB_RBLevelsDaylight                  int16u[2]
-   1008    WB_RBLevelsCloudy                    int16u[2]
-   1012    WB_RBLevelsFlash                     int16u[2]
-   1020    WB_RedLevelsFluorescent              int16u[7]
-   1034    WB_BlueLevelsFluorescent             int16u[7]
-   1048    WB_RBLevelsShade                     int16u[2]
-   1056    WB_RBLevels6500K                     int16u[2]
-   1060    WB_RBLevelsCustom                    int16u[2]
-   1072    WB_RBLevels3500K                     int16u[2]
-   1320    WB_RBLevelsDaylight                  int16u[2]
-   1350    WB_RGBLevels                         int16u[3]
-   1576    AEMeteringSegments                   int8u[40]
-   1680    MeasuredLV                           int8u
-   1681    BrightnessValue                      int8u
-  18872    ExposureTime                         int8u
-  18874    ISO                                  int8u
-  18875    FocusDistance                        int8u
-  18877    LensType                             int16uRev
-  18880    ExposureCompensation                 int8s
-  18881    FlashExposureComp                    int8s
-  18882    ImageStabilization                   int8u
-  18883    BrightnessValue                      int8u
-  18885    MaxAperture                          int8u
-  18887    FNumber                              int8u
-  18908    InternalSerialNumber                 string[12]
+      0    Make                                 N
+     24    Model                                N
+     54    ExposureTime                         N
+     58    FNumber                              N
+     66    ExposureCompensation                 N
+     88    FocalLength                          N
+    193    ISO                                  N
 
-=head3 Minolta CameraSettings5D Tags
+=head3 Olympus MP4 Tags
 
-  Index2   Tag Name                             Writable
-  ------   --------                             --------
-     10    ExposureMode                         int16u
-     12    MinoltaImageSize                     int16u
-     13    MinoltaQuality                       int16u
-     14    WhiteBalance                         int16u
-     31    Flash                                int16u
-     32    FlashMode                            int16u
-     37    MeteringMode                         int16u
-     38    ISOSetting                           int16u
-     47    ColorSpace                           int16u
-     48    Sharpness                            int16u
-     49    Contrast                             int16u
-     50    Saturation                           int16u
-     53    ExposureTime                         int16u
-     54    FNumber                              int16u
-     55    FreeMemoryCardImages                 int16u
-     73    ColorTemperature                     int16s
-     74    HueAdjustment                        int16u
-     80    Rotation                             int16u
-     83    ExposureCompensation                 int16u
-     84    FreeMemoryCardImages                 int16u
-    101    Rotation                             int16u
-    110    ColorTemperature                     int16s
-    113    PictureFinish                        int16u
-    174    ImageNumber                          int16u
-    176    NoiseReduction                       int16u
-    189    ImageStabilization                   int16u
+This information is found in MP4 videos from Olympus models such as the
+u7040 and u9010.
 
-=head3 Minolta CameraSettingsA100 Tags
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    Make                                 N
+     24    Model                                N
+     40    FNumber                              N
+     48    ExposureCompensation                 N
+    104    MovableInfo                          Olympus MovableInfo
+    114    MovableInfo                          Olympus MovableInfo
 
-Camera settings information for the Sony DSLR-A100.
+=head3 Olympus MovableInfo Tags
 
-  Index2   Tag Name                             Writable
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    ExposureMode                         int16u
-      1    ExposureCompensationSetting          int16u
-      5    HighSpeedSync                        int16u
-      6    ShutterSpeedSetting                  int16u
-      7    ApertureSetting                      int16u
-      8    ExposureTime                         int16u
-      9    FNumber                              int16u
-     10    DriveMode2                           int16u
-     11    WhiteBalance                         int16u
-     12    FocusMode                            int16u
-     13    AFPointSelected                      int16u
-     14    AFAreaMode                           int16u
-     15    FlashMode                            int16u
-     16    FlashExposureCompSet                 int16u
-     18    MeteringMode                         int16u
-     19    ISOSetting                           int16u
-     20    ZoneMatchingMode                     int16u
-     21    DynamicRangeOptimizer                int16u
-     22    ColorMode                            int16u
-     23    ColorSpace                           int16u
-     24    Sharpness                            int16u
-     25    Contrast                             int16u
-     26    Saturation                           int16u
-     28    FlashMetering                        int16u
-     29    PrioritySetupShutterRelease          int16u
-     30    DriveMode                            int16u
-     31    SelfTimerTime                        int16u
-     32    ContinuousBracketing                 int16u
-     33    SingleFrameBracketing                int16u
-     34    WhiteBalanceBracketing               int16u
-     35    WhiteBalanceSetting                  int16u
-     36    PresetWhiteBalance                   int16u
-     37    ColorTemperatureSetting              int16u
-     38    CustomWBSetting                      int16u
-     39    DynamicRangeOptimizerSetting         int16u
-     50    FreeMemoryCardImages                 int16u
-     52    CustomWBRedLevel                     int16u
-     53    CustomWBGreenLevel                   int16u
-     54    CustomWBBlueLevel                    int16u
-     55    CustomWBError                        int16u
-     56    WhiteBalanceFineTune                 int16s
-     57    ColorTemperature                     int16u
-     58    ColorCompensationFilter              int16s
-     59    SonyImageSize                        int16u
-     60    SonyQuality                          int16u
-     61    InstantPlaybackTime                  int16u
-     62    InstantPlaybackSetup                 int16u
-     63    NoiseReduction                       int16u
-     64    EyeStartAF                           int16u
-     65    RedEyeReduction                      int16u
-     66    FlashDefault                         int16u
-     67    AutoBracketOrder                     int16u
-     68    FocusHoldButton                      int16u
-     69    AELButton                            int16u
-     70    ControlDialSet                       int16u
-     71    ExposureCompensationMode             int16u
-     72    AFAssist                             int16u
-     73    CardShutterLock                      int16u
-     74    LensShutterLock                      int16u
-     75    AFAreaIllumination                   int16u
-     76    MonitorDisplayOff                    int16u
-     77    RecordDisplay                        int16u
-     78    PlayDisplay                          int16u
-     80    ExposureIndicator                    int16u
-     81    AELExposureIndicator                 int16u
-     82    ExposureBracketingIndicatorLast      int16u
-     83    MeteringOffScaleIndicator            int16u
-     84    FlashExposureIndicator               int16u
-     85    FlashExposureIndicatorNext           int16u
-     86    FlashExposureIndicatorLast           int16u
-     87    ImageStabilization                   int16u
-     88    FocusModeSwitch                      int16u
-     89    FlashType                            int16u
-     90    Rotation                             int16u
-     91    AELock                               int16u
-     94    ColorTemperature                     int16u
-     95    ColorCompensationFilter              int16s
-     96    BatteryState                         int16u
+      4    ISO                                  N
+     44    EncoderVersion                       N
+     60    DecoderVersion                       N
+    131    Thumbnail                            Olympus Thumbnail
 
-=head3 Minolta MMA Tags
+=head3 Olympus Thumbnail Tags
 
-This information is found in MOV videos from Minolta models such as the
-DiMAGE A2, S414 and 7Hi.
+  Index4   Tag Name                             Writable
+  ------   --------                             --------
+      1    ThumbnailWidth                       N
+      2    ThumbnailHeight                      N
+      3    ThumbnailLength                      N
+      4    ThumbnailOffset                      N
+
+=head3 Olympus MOV3 Tags
+
+QuickTime information found in the TAGS atom of MOV videos from the E-M5.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'OLYM'   OlympusAtom                          Olympus OLYM2
+
+=head3 Olympus OLYM2 Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'prms'   MakerNotes                           Olympus prms
+  'scrn'   PreviewInfo                          Olympus scrn2
+  'thmb'   ThumbInfo                            Olympus thmb2
+
+=head3 Olympus prms Tags
+
+Information extracted from the "prms" atom in MOV videos from Olympus models
+such as the OM E-M5.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    Make                                 N
-     20    SoftwareVersion                      N
+     18    Make                                 N
+     44    Model                                N
+    131    DateTime1                            N
+    157    DateTime2                            N
 
-=head3 Minolta MOV1 Tags
+=head3 Olympus scrn2 Tags
 
-This information is found in MOV videos from some Konica Minolta models such
-as the DiMage Z10 and X50.
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      2    OlympusPreview                       Olympus scrn
+
+=head3 Olympus scrn Tags
+
+Information extracted from the "scrn" atom of Olympus MP4 videos.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    Make                                 N
-     32    ModelType                            N
-     46    ExposureTime                         N
-     50    FNumber                              N
-     58    ExposureCompensation                 N
-     80    FocalLength                          N
+      0    PreviewImageLength                   N
+      4    PreviewImage                         N
 
-=head3 Minolta MOV2 Tags
+=head3 Olympus thmb2 Tags
 
-This information is found in MOV videos from some Minolta models such as the
-DiMAGE X and Xt.
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    ThumbnailWidth                       N
+      2    ThumbnailHeight                      N
+      4    ThumbnailLength                      N
+      8    ThumbnailImage                       N
+
+=head3 Olympus thmb Tags
+
+Information extracted from the "thmb" atom of Olympus MP4 videos.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    Make                                 N
-     24    ModelType                            N
-     38    ExposureTime                         N
-     42    FNumber                              N
-     50    ExposureCompensation                 N
-     72    FocalLength                          N
+      0    ThumbnailLength                      N
+      4    ThumbnailImage                       N
+
+=head3 Olympus OLYM Tags
+
+Tags found in the OLYM atom of MP4 videos from the TG-810.
+
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+     14    Make                                 N
+     40    Model                                N
+     90    FNumber                              N
+    127    DateTimeOriginal                     N
+    153    DateTime2                            N
+    265    ThumbnailWidth                       N
+    267    ThumbnailHeight                      N
+
+=head3 Olympus AVI Tags
+
+This information is found in Olympus AVI videos.
+
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+     18    Make                                 N
+     44    Model                                N
+     94    FNumber                              N
+    131    DateTime1                            N
+    157    DateTime2                            N
+    297    ThumbInfo                            Olympus thmb2
+
+=head3 Olympus WAV Tags
+
+This information is found in WAV files from Olympus PCM linear recorders
+like the LS-5, LS-10, LS-11.
+
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+     12    Model                                N
+     28    FileNumber                           N
+     38    DateTimeOriginal                     N
+     50    DateTimeEnd                          N
+     62    RecordingTime                        N
+    512    Duration                             N
+    522    Index01                              N
+    532    Index02                              N
+    542    Index03                              N
+    552    Index04                              N
+    562    Index05                              N
+    572    Index06                              N
+    582    Index07                              N
+    592    Index08                              N
+    602    Index09                              N
+    612    Index10                              N
+    622    Index11                              N
+    632    Index12                              N
+    642    Index13                              N
+    652    Index14                              N
+    662    Index15                              N
+    672    Index16                              N
 
 =head2 Panasonic Tags
 
@@ -9718,18 +10322,22 @@ These tags are used in Panasonic/Leica cameras.
   0x0041   Sharpness                            int16u
   0x0042   FilmMode                             int16u
   0x0044   ColorTempKelvin                      int16u
+  0x0045   BracketSettings                      int16u
   0x0046   WBShiftAB                            int16u
   0x0047   WBShiftGM                            int16u
   0x0048   FlashCurtain                         int16u
+  0x0049   LongExposureNoiseReduction           int16u
   0x004b   PanasonicImageWidth                  int32u
   0x004c   PanasonicImageHeight                 int32u
   0x004d   AFPointPosition                      rational64u[2]
   0x004e   FaceDetInfo                          Panasonic FaceDetInfo
-  0x0051   LensType                             N
-  0x0052   LensSerialNumber                     N
-  0x0053   AccessoryType                        N
+  0x0051   LensType                             string
+  0x0052   LensSerialNumber                     string
+  0x0053   AccessoryType                        string
+  0x0054   AccessorySerialNumber                string
   0x0059   Transform                            undef[4]
   0x005d   IntelligentExposure                  int16u
+  0x0060   LensFirmwareVersion                  undef[4]
   0x0061   FaceRecInfo                          Panasonic FaceRecInfo
   0x0062   FlashWarning                         int16u
   0x0063   RecognizedFaceFlags?                 undef[4]
@@ -9741,9 +10349,26 @@ These tags are used in Panasonic/Leica cameras.
   0x006d   City                                 undef
   0x006f   Landmark                             undef
   0x0070   IntelligentResolution                int8u
+  0x0077   BurstSpeed                           int16u
   0x0079   IntelligentD-Range                   int16u
+  0x007c   ClearRetouch                         int16u
   0x0086   ManometerPressure                    int16u
   0x0089   PhotoStyle                           int16u
+  0x008a   ShadingCompensation                  int16u
+  0x008c   AccelerometerZ                       int16u
+  0x008d   AccelerometerX                       int16u
+  0x008e   AccelerometerY                       int16u
+  0x008f   CameraOrientation                    int8u
+  0x0090   RollAngle                            int16u
+  0x0091   PitchAngle                           int16u
+  0x0093   SweepPanoramaDirection               int8u
+  0x0094   SweepPanoramaFieldOfView             int16u
+  0x0096   TimerRecording                       int8u
+  0x009d   InternalNDFilter                     rational64u
+  0x009e   HDR                                  int16u
+  0x009f   ShutterType                          int16u
+  0x00a3   ClearRetouchValue                    rational64u
+  0x00ab   TouchAE                              int16u
   0x0e00   PrintIM                              PrintIM
   0x8000   MakerNoteVersion                     undef
   0x8001   SceneMode                            int16u
@@ -9892,13 +10517,14 @@ This information is written by the X1.
 
 =head3 Panasonic Leica6 Tags
 
-This information is written by the S2 (as a trailer in JPEG images).
+This information is written by the S2 and M (Typ 240), as a trailer in JPEG
+images.
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
   0x0300   PreviewImage                         undef
   0x0301   UnknownBlock?                        N
-  0x0303   LensType                             N
+  0x0303   LensType                             string
 
 =head3 Panasonic Type2 Tags
 
@@ -9922,6 +10548,10 @@ as the DMC-FT20.
      88    ThumbnailWidth                       N
      90    ThumbnailHeight                      N
      92    ThumbnailImage                       N
+   1334    ThumbnailWidth                       N
+   1338    ThumbnailHeight                      N
+   1342    ThumbnailLength                      N
+   1350    ThumbnailImage                       N
   16488    ExifData                             EXIF
 
 =head2 Pentax Tags
@@ -9945,6 +10575,7 @@ These tags are used in Pentax/Asahi cameras.
   0x000d   FocusMode                            int16u
   0x000e   AFPointSelected                      int16u
   0x000f   AFPointsInFocus                      int16u
+           AFPointsInFocus                      int32u
   0x0010   FocusPosition                        int16u
   0x0012   ExposureTime                         int32u
   0x0013   FNumber                              int16u
@@ -9988,6 +10619,7 @@ These tags are used in Pentax/Asahi cameras.
   0x0048   AELock                               int16u
   0x0049   NoiseReduction                       int16u
   0x004d   FlashExposureComp                    int32s
+           FlashExposureComp                    int8s[2]
   0x004f   ImageTone                            int16u
   0x0050   ColorTemperature                     int16u
   0x0053   ColorTempDaylight                    undef[4]
@@ -9999,6 +10631,7 @@ These tags are used in Pentax/Asahi cameras.
   0x0059   ColorTempFluorescentW                undef[4]
   0x005a   ColorTempFlash                       undef[4]
   0x005c   ShakeReductionInfo                   Pentax SRInfo
+                                                Pentax SRInfo2
   0x005d   ShutterCount                         undef[4]
   0x0060   FaceInfo                             Pentax FaceInfo
   0x0062   RawDevelopmentProcess                int16u
@@ -10024,6 +10657,7 @@ These tags are used in Pentax/Asahi cameras.
   0x007f   BleachBypassToning                   int16u
   0x0080   AspectRatio                          Y
   0x0082   BlurControl                          int8u[4]
+  0x0085   HDR                                  int8u[4]
   0x0088   NeutralDensityFilter                 int8u
   0x008b   ISO                                  int32u
   0x0200   BlackPoint                           int16u[4]
@@ -10076,7 +10710,7 @@ These tags are used in Pentax/Asahi cameras.
   0x0235   CrossProcessParams                   undef[10]
   0x0239   LensInfoQ                            Pentax LensInfoQ
   0x03fe   DataDump                             N
-  0x03ff   TempInfoK5                           Pentax TempInfoK5
+  0x03ff   TempInfo                             Pentax TempInfo
            UnknownInfo                          Pentax UnknownInfo
   0x0402   ToneCurve                            Y~
   0x0403   ToneCurves                           Y~
@@ -10103,6 +10737,15 @@ Shake reduction information.
       2    SRHalfPressTime                      int8u
       3    SRFocalLength                        int8u
 
+=head3 Pentax SRInfo2 Tags
+
+Shake reduction information for the K-3.
+
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    SRResult?                            int8u
+      1    ShakeReduction                       int8u
+
 =head3 Pentax FaceInfo Tags
 
   Index1   Tag Name                             Writable
@@ -10133,6 +10776,7 @@ Shake reduction information.
   ------   --------                             --------
       0    DistortionCorrection                 int8u
       1    ChromaticAberrationCorrection        int8u
+      2    VignettingCorrection                 int8u
 
 =head3 Pentax CameraSettings Tags
 
@@ -10193,13 +10837,16 @@ Auto-exposure information for most Pentax models.
       4    AEBXv                                int8s
       5    AEMinExposureTime                    int8u
       6    AEProgramMode                        int8u
-      7    AEFlags?                             N
-      8    AEUnknown                            N
+      7    AEFlags                              N
+      8    AEApertureSteps                      int8u
       9    AEMaxAperture                        int8u
      10    AEMaxAperture2                       int8u
      11    AEMinAperture                        int8u
      12    AEMeteringMode                       int8u
+     13    AEWhiteBalance                       int8u & 0xf0
+   13.1    AEMeteringMode2                      int8u & 0x0f
      14    FlashExposureCompSet                 int8s
+     21    LevelIndicator                       int8u
 
 =head3 Pentax AEInfo2 Tags
 
@@ -10213,6 +10860,7 @@ Auto-exposure information for the K-01.
       5    AEXv                                 int8u
       6    AEBXv                                int8s
       8    AEError                              int8s
+     11    AEApertureSteps                      int8u
      15    SceneMode                            int8u
      16    AEMaxAperture                        int8u
      17    AEMaxAperture2                       int8u
@@ -10221,7 +10869,7 @@ Auto-exposure information for the K-01.
 
 =head3 Pentax AEInfo3 Tags
 
-Auto-exposure information for the K-30
+Auto-exposure information for the K-3, K-30, K-50 and K-500.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
@@ -10305,7 +10953,7 @@ Pentax lens information structure for models such as the K-5 and K-r.
 
 =head3 Pentax LensInfo5 Tags
 
-Pentax lens information structure for the K-01.
+Pentax lens information structure for the K-01 and newer models.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
@@ -10525,7 +11173,8 @@ used.
 
 =head3 Pentax LevelInfo Tags
 
-Tags decoded from the electronic level information.
+Tags decoded from the electronic level information for the K-5.  May not be
+valid for other models.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
@@ -10562,11 +11211,12 @@ More lens information stored by the Pentax Q.
      12    LensModel                            string[30]
      42    LensInfo                             string[20]
 
-=head3 Pentax TempInfoK5 Tags
+=head3 Pentax TempInfo Tags
 
 A number of additional temperature readings are extracted from this 256-byte
-binary-data block in images from the K-5.  It is currently not known where
-the corresponding temperature sensors are located in the camera.
+binary-data block in images from models such as the K-01, K-3, K-5, K-50 and
+K-500.  It is currently not known where the corresponding temperature
+sensors are located in the camera.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
@@ -10790,123 +11440,87 @@ cameras such as the HC500, HC600 and PC900.
      42    BatteryVoltage                       int16u
      43    UserLabel                            string[22]
 
-=head2 Ricoh Tags
+=head2 Sanyo Tags
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
-  0x0001   MakerNoteType                        string
-  0x0002   FirmwareVersion                      string
-  0x0005   SerialNumber                         undef[16]
-           InternalSerialNumber                 undef[16]
+  0x00ff   MakerNoteOffset                      int32u
+  0x0100   SanyoThumbnail                       undef
+  0x0200   SpecialMode                          int32u[3]
+  0x0201   SanyoQuality                         int16u
+  0x0202   Macro                                int16u
+  0x0204   DigitalZoom                          rational64u
+  0x0207   SoftwareVersion                      Y
+  0x0208   PictInfo                             Y
+  0x0209   CameraID                             Y
+  0x020e   SequentialShot                       int16u
+  0x020f   WideRange                            int16u
+  0x0210   ColorAdjustmentMode                  int16u
+  0x0213   QuickShot                            int16u
+  0x0214   SelfTimer                            int16u
+  0x0216   VoiceMemo                            int16u
+  0x0217   RecordShutterRelease                 int16u
+  0x0218   FlickerReduce                        int16u
+  0x0219   OpticalZoomOn                        int16u
+  0x021b   DigitalZoomOn                        int16u
+  0x021d   LightSourceSpecial                   int16u
+  0x021e   Resaved                              int16u
+  0x021f   SceneSelect                          int16u
+  0x0223   ManualFocusDistance                  rational64u
+           FaceInfo                             -
+  0x0224   SequenceShotInterval                 int16u
+  0x0225   FlashMode                            int16u
   0x0e00   PrintIM                              PrintIM
-  0x1001   ImageInfo                            Ricoh ImageInfo
-  0x1003   Sharpness                            int32u
-  0x2001   RicohSubdir                          Ricoh Subdir
-           RicohSubdirIFD                       Ricoh Subdir
-           RicohRR1Subdir                       Ricoh Subdir
-
-=head3 Ricoh ImageInfo Tags
-
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-      0    RicohImageWidth                      int16u
-      2    RicohImageHeight                     int16u
-      6    RicohDate                            int8u[7]
-     28    PreviewImageStart                    int16u*
-     30    PreviewImageLength                   int16u*
-     32    FlashMode                            int8u
-     33    Macro                                int8u
-     34    Sharpness                            int8u
-     38    WhiteBalance                         int8u
-     39    ISOSetting                           int8u
-     40    Saturation                           int8u
-
-=head3 Ricoh Subdir Tags
-
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-  0x0004   ManufactureDate1                     string[20]
-  0x0005   ManufactureDate2                     string[20]
-  0x001a   FaceInfo                             Ricoh FaceInfo
-  0x0029   FirmwareInfo                         Ricoh FirmwareInfo
-  0x002a   NoiseReduction                       int32u
-  0x002c   SerialInfo                           Ricoh SerialInfo
-
-=head3 Ricoh FaceInfo Tags
-
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-    181    FacesDetected                        int8u
-    182    FaceDetectFrameSize                  int16u[2]
-    188    Face1Position                        int16u[4]
-    200    Face2Position                        int16u[4]
-    212    Face3Position                        int16u[4]
-    224    Face4Position                        int16u[4]
-    236    Face5Position                        int16u[4]
-    248    Face6Position                        int16u[4]
-    260    Face7Position                        int16u[4]
-    272    Face8Position                        int16u[4]
-
-=head3 Ricoh FirmwareInfo Tags
-
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-      0    FirmwareRevision                     string[12]
-     12    FirmwareRevision2                    string[12]
-
-=head3 Ricoh SerialInfo Tags
+  0x0f00   DataDump                             N
 
-This information is found in images from the GXR.
+=head3 Sanyo FaceInfo Tags
 
-  Index1   Tag Name                             Writable
+  Index4   Tag Name                             Writable
   ------   --------                             --------
-      0    BodyFirmware                         string[16]
-     16    BodySerialNumber                     string[16]
-     32    LensFirmware                         string[16]
-     48    LensSerialNumber                     string[16]
-
-=head3 Ricoh Text Tags
+      0    FacesDetected                        int32u
+      4    FacePosition                         int32u[4]
 
-Some Ricoh DC and RDC models use a text-based format for their maker notes
-instead of the IFD format used by the Caplio models.  Below is a list of known
-tags in this information.
+=head3 Sanyo MOV Tags
 
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-  'Bg'     BlueGain                             N
-  'Gg'     GreenGain                            N
-  'Rev'    FirmwareVersion                      N
-  'Rg'     RedGain                              N
-  'Rv'     FirmwareVersion                      N
+This information is found in Sanyo MOV videos.
 
-=head3 Ricoh RMETA Tags
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    Make                                 N
+     24    Model                                N
+     38    ExposureTime                         N
+     42    FNumber                              N
+     50    ExposureCompensation                 N
+     68    WhiteBalance                         N
+     72    FocalLength                          N
 
-The Ricoh Caplio Pro G3 has the ability to add custom fields to the APP5
-"RMETA" segment of JPEG images.  While only a few observed tags have been
-defined below, ExifTool will extract any information found here.
+=head3 Sanyo MP4 Tags
 
-  Tag ID               Tag Name                 Writable
-  ------               --------                 --------
-  'Azimuth'            Azimuth                  N
-  'Condition'          Condition                N
-  'Lit'                Lit                      N
-  'Location'           Location                 N
-  'Sign type'          SignType                 N
-  '_audio'             SoundFile                N
+This information is found in Sanyo MP4 videos.
 
-=head3 Ricoh AVI Tags
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    Make                                 N
+     24    Model                                N
+     50    FNumber                              N
+     58    ExposureCompensation                 N
+    106    ISO                                  N
+    209    Software                             N
+    210    Software                             N
+    241    Thumbnail                            Sanyo Thumbnail
+    242    Thumbnail                            Sanyo Thumbnail
 
-  Tag ID   Tag Name                             Writable
+=head3 Sanyo Thumbnail Tags
+
+  Index4   Tag Name                             Writable
   ------   --------                             --------
-  'mnrt'   MakerNoteRicoh                       Ricoh
-  'rdc2'   RicohRDC2?                           N
-  'thum'   ThumbnailImage                       N
-  'ucmt'   Comment                              N
+      1    ThumbnailWidth                       N
+      2    ThumbnailHeight                      N
+      3    ThumbnailLength                      N
+      4    ThumbnailOffset                      N
 
 =head2 Samsung Tags
 
-=head3 Samsung Type1 Tags
-
 Tags found in the binary "STMN" format maker notes written by a number of
 Samsung models.
 
@@ -10919,7 +11533,7 @@ Samsung models.
 
 =head3 Samsung IFD Tags
 
-This is a standard-format IFD found in the Type1 maker notes of some Samsung
+This is a standard-format IFD found in the maker notes of some Samsung
 models, except that the entry count is a 4-byte integer and the offsets are
 relative to the end of the IFD.  Currently, no tags in this IFD are known,
 so the Unknown (-u) or Verbose (-v) option must be used to see this
@@ -10976,6 +11590,20 @@ Tags found in the EXIF-format maker notes of newer Samsung models.
       3    PictureWizardSharpness               int16u
       4    PictureWizardContrast                int16u
 
+=head3 Samsung sec Tags
+
+This information is found in the @sec atom of Samsung MP4 videos from models
+such as the WB30F.
+
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    Make                                 N
+     32    Model                                N
+    512    ThumbnailWidth                       N
+    516    ThumbnailHeight                      N
+    520    ThumbnailLength                      N
+    524    ThumbnailImage                       N
+
 =head3 Samsung INFO Tags
 
 This information is found in MP4 videos from Samsung models such as the
@@ -11011,84 +11639,174 @@ WP10.
       3    ThumbnailLength                      N
       4    ThumbnailOffset                      N
 
-=head2 Sanyo Tags
+=head3 Samsung smta Tags
+
+This information is found in the smta atom of Samsung MP4 videos from models
+such as the Galaxy S4.
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
-  0x00ff   MakerNoteOffset                      int32u
-  0x0100   SanyoThumbnail                       undef
-  0x0200   SpecialMode                          int32u[3]
-  0x0201   SanyoQuality                         int16u
-  0x0202   Macro                                int16u
-  0x0204   DigitalZoom                          rational64u
-  0x0207   SoftwareVersion                      Y
-  0x0208   PictInfo                             Y
-  0x0209   CameraID                             Y
-  0x020e   SequentialShot                       int16u
-  0x020f   WideRange                            int16u
-  0x0210   ColorAdjustmentMode                  int16u
-  0x0213   QuickShot                            int16u
-  0x0214   SelfTimer                            int16u
-  0x0216   VoiceMemo                            int16u
-  0x0217   RecordShutterRelease                 int16u
-  0x0218   FlickerReduce                        int16u
-  0x0219   OpticalZoomOn                        int16u
-  0x021b   DigitalZoomOn                        int16u
-  0x021d   LightSourceSpecial                   int16u
-  0x021e   Resaved                              int16u
-  0x021f   SceneSelect                          int16u
-  0x0223   ManualFocusDistance                  rational64u
-           FaceInfo                             -
-  0x0224   SequenceShotInterval                 int16u
-  0x0225   FlashMode                            int16u
+  'svss'   SamsungSvss                          Samsung svss
+
+=head3 Samsung svss Tags
+
+This information is found in the svss atom of Samsung MP4 videos from models
+such as the Galaxy S4.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  [no tags known]
+
+=head2 Ricoh Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0001   MakerNoteType                        string
+  0x0002   FirmwareVersion                      string
+  0x0005   SerialNumber                         undef[16]
+           InternalSerialNumber                 undef[16]
   0x0e00   PrintIM                              PrintIM
-  0x0f00   DataDump                             N
+  0x1000   RecordingFormat                      int16u
+  0x1001   ImageInfo                            Ricoh ImageInfo
+           ExposureProgram                      int16u
+  0x1002   DriveMode                            int16u
+  0x1003   Sharpness                            int32u
+           WhiteBalance                         int16u
+  0x1004   WhiteBalanceFineTune                 int16u
+  0x1006   FocusMode                            int16u
+  0x1007   AutoBracketing                       int16u
+  0x1009   MacroMode                            int16u
+  0x100a   FlashMode                            int16u
+  0x100b   FlashExposureComp                    rational64s
+  0x100c   ManualFlashOutput                    rational64s
+  0x100d   FullPressSnap                        int16u
+  0x100e   DynamicRangeExpansion                int16u
+  0x100f   NoiseReduction                       int16u
+  0x1010   ImageEffects                         int16u
+  0x1011   Vignetting                           int16u
+  0x1012   Contrast                             int32u
+  0x1013   Saturation                           int32u
+  0x1014   Sharpness                            int32u
+  0x1015   ToningEffect                         int16u
+  0x1016   HueAdjust                            int16u
+  0x1017   WideAdapter                          int16u
+  0x1018   CropMode35mm                         int16u
+  0x1019   NDFilter                             int16u
+  0x101a   WBBracketShotNumber                  int16u
+  0x1200   AFStatus                             int16u
+  0x1201   AFAreaXPosition1                     int32u
+  0x1202   AFAreaYPosition1                     int32u
+  0x1203   AFAreaXPosition                      int32u
+  0x1204   AFAreaYPosition                      int32u
+  0x1205   AFAreaMode                           int16u
+  0x1307   ColorTempKelvin                      int32u
+  0x1308   ColorTemperature                     int32u
+  0x1500   FocalLength                          rational64u
+  0x1601   SensorWidth                          int32u
+  0x1602   SensorHeight                         int32u
+  0x1603   CroppedImageWidth                    int32u
+  0x1604   CroppedImageHeight                   int32u
+  0x2001   RicohSubdir                          Ricoh Subdir
+           RicohSubdirIFD                       Ricoh Subdir
+           RicohRR1Subdir                       Ricoh Subdir
 
-=head3 Sanyo FaceInfo Tags
+=head3 Ricoh ImageInfo Tags
 
-  Index4   Tag Name                             Writable
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    FacesDetected                        int32u
-      4    FacePosition                         int32u[4]
+      0    RicohImageWidth                      int16u
+      2    RicohImageHeight                     int16u
+      6    RicohDate                            int8u[7]
+     28    PreviewImageStart                    int16u*
+     30    PreviewImageLength                   int16u*
+     32    FlashMode                            int8u
+     33    Macro                                int8u
+     34    Sharpness                            int8u
+     38    WhiteBalance                         int8u
+     39    ISOSetting                           int8u
+     40    Saturation                           int8u
 
-=head3 Sanyo MOV Tags
+=head3 Ricoh Subdir Tags
 
-This information is found in Sanyo MOV videos.
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0004   ManufactureDate1                     string[20]
+  0x0005   ManufactureDate2                     string[20]
+  0x001a   FaceInfo                             Ricoh FaceInfo
+  0x0029   FirmwareInfo                         Ricoh FirmwareInfo
+  0x002a   NoiseReduction                       int32u
+  0x002c   SerialInfo                           Ricoh SerialInfo
+
+=head3 Ricoh FaceInfo Tags
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    Make                                 N
-     24    Model                                N
-     38    ExposureTime                         N
-     42    FNumber                              N
-     50    ExposureCompensation                 N
-     68    WhiteBalance                         N
-     72    FocalLength                          N
+    181    FacesDetected                        int8u
+    182    FaceDetectFrameSize                  int16u[2]
+    188    Face1Position                        int16u[4]
+    200    Face2Position                        int16u[4]
+    212    Face3Position                        int16u[4]
+    224    Face4Position                        int16u[4]
+    236    Face5Position                        int16u[4]
+    248    Face6Position                        int16u[4]
+    260    Face7Position                        int16u[4]
+    272    Face8Position                        int16u[4]
 
-=head3 Sanyo MP4 Tags
+=head3 Ricoh FirmwareInfo Tags
 
-This information is found in Sanyo MP4 videos.
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    FirmwareRevision                     string[12]
+     12    FirmwareRevision2                    string[12]
+
+=head3 Ricoh SerialInfo Tags
+
+This information is found in images from the GXR.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    Make                                 N
-     24    Model                                N
-     50    FNumber                              N
-     58    ExposureCompensation                 N
-    106    ISO                                  N
-    209    Software                             N
-    210    Software                             N
-    241    Thumbnail                            Sanyo Thumbnail
-    242    Thumbnail                            Sanyo Thumbnail
+      0    BodyFirmware                         string[16]
+     16    BodySerialNumber                     string[16]
+     32    LensFirmware                         string[16]
+     48    LensSerialNumber                     string[16]
 
-=head3 Sanyo Thumbnail Tags
+=head3 Ricoh Text Tags
 
-  Index4   Tag Name                             Writable
+Some Ricoh DC and RDC models use a text-based format for their maker notes
+instead of the IFD format used by the Caplio models.  Below is a list of known
+tags in this information.
+
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      1    ThumbnailWidth                       N
-      2    ThumbnailHeight                      N
-      3    ThumbnailLength                      N
-      4    ThumbnailOffset                      N
+  'Bg'     BlueGain                             N
+  'Gg'     GreenGain                            N
+  'Rev'    FirmwareVersion                      N
+  'Rg'     RedGain                              N
+  'Rv'     FirmwareVersion                      N
+
+=head3 Ricoh RMETA Tags
+
+The Ricoh Caplio Pro G3 has the ability to add custom fields to the APP5
+"RMETA" segment of JPEG images.  While only a few observed tags have been
+defined below, ExifTool will extract any information found here.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Azimuth'            Azimuth                  N
+  'Condition'          Condition                N
+  'Lit'                Lit                      N
+  'Location'           Location                 N
+  'Sign type'          SignType                 N
+  '_audio'             SoundFile                N
+
+=head3 Ricoh AVI Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'mnrt'   MakerNoteRicoh                       Ricoh
+  'rdc2'   RicohRDC2?                           N
+  'thum'   ThumbnailImage                       N
+  'ucmt'   Comment                              N
 
 =head2 Sigma Tags
 
@@ -11212,6 +11930,13 @@ MakerNotes.
   0x200b   MultiFrameNoiseReduction             int32u
   0x200e   PictureEffect                        int16u
   0x200f   SoftSkinEffect                       int32u
+  0x2010   Tag2010a                             Sony Tag2010a
+           Tag2010b                             Sony Tag2010b
+           Tag2010c                             Sony Tag2010c
+           Tag2010d                             Sony Tag2010d
+           Tag2010e                             Sony Tag2010e
+           Tag2010f                             Sony Tag2010f
+           Tag2010g                             Sony Tag2010g
   0x2011   VignettingCorrection                 int32u
   0x2012   LateralChromaticAberration           int32u
   0x2013   DistortionCorrection                 int32u
@@ -11221,14 +11946,20 @@ MakerNotes.
   0x201c   AFAreaModeSetting                    int8u
   0x201d   FlexibleSpotPosition                 int16u[2]
   0x201e   AFPointSelected                      int8u
+  0x2020   AFInfo2                              Sony AFInfo2
   0x3000   ShotInfo                             Sony ShotInfo
+  0x900b   Tag900b                              Sony Tag900b
   0x9050   Tag9050                              Sony Tag9050
   0x9400   Tag9400a                             Sony Tag9400a
            Tag9400b                             Sony Tag9400b
+           Tag9400c                             Sony Tag9400c
   0x9402   Tag9402                              Sony Tag9402
   0x9403   Tag9403                              Sony Tag9403
+  0x9405   Tag9405a                             Sony Tag9405a
+           Tag9405b                             Sony Tag9405b
   0x9406   Tag9406                              Sony Tag9406
   0x940a   Tag940a                              Sony Tag940a
+  0x940c   Tag940c                              Sony Tag940c
   0x940e   AFInfo                               Sony AFInfo
   0xb000   FileFormat                           int8u[4]
   0xb001   SonyModelID                          int16u
@@ -11256,7 +11987,6 @@ MakerNotes.
   0xb04a   SequenceNumber                       int16u
   0xb04b   Anti-Blur                            int16u
   0xb04e   FocusMode                            int16u
-           LongExposureNoiseReduction           int16u
   0xb04f   DynamicRangeOptimizer                int16u
   0xb050   HighISONoiseReduction2               int16u
   0xb052   IntelligentAuto                      int16u
@@ -11265,7 +11995,7 @@ MakerNotes.
 =head3 Sony CameraInfo Tags
 
 Camera information stored by the A33, A35, A55, A450, A500, A550, A560,
-A580, NEX-3/5/C3 and VG10E.  Some tags are valid only for some of these
+A580, NEX-3/5/5C/C3 and VG10E.  Some tags are valid only for some of these
 models.
 
   Index1   Tag Name                             Writable
@@ -11273,6 +12003,8 @@ models.
       0    LensSpec                             undef[8]
      14    FocalLength                          int16u
      16    FocalLengthTeleZoom                  int16u
+     20    AFPointSelected                      int8u
+     21    FocusMode                            int8u
      25    FocusStatus                          int8u
      28    AFPointSelected                      int8u
      29    FocusMode                            int8u
@@ -11285,6 +12017,9 @@ Camera information for other DSLR and NEX models.
   Index1   Tag Name                             Writable
   ------   --------                             --------
       0    LensSpec                             undef[8]
+     20    FocusModeSetting                     int8u
+     21    AFPointSelected                      int8u
+     25    AFPoint                              int8u
     304    AFMicroAdjValue                      int8u
     305    AFMicroAdjMode                       int8u & 0x80
   305.1    AFMicroAdjRegisteredLenses           int8u & 0x7f
@@ -11307,6 +12042,7 @@ A200, A230, A290, A300, A330, A350, A380, A390, A700, A850 and A900.
      47    ExposureBracketShotNumber            int8u
      63    ExposureProgram                      int8u
      65    CreativeStyle                        int8u
+   2118    ShutterCount                         int32u
    2491    FocusPosition                        int8u
 
 =head3 Sony MoreInfo Tags
@@ -11318,7 +12054,10 @@ A580, A33, A35, A55, NEX-3/5/C3 and VG10E.
   ------   --------                             --------
   0x0001   MoreSettings                         Sony MoreSettings
   0x0002   FaceInfo                             Sony FaceInfo
+           FaceInfoA                            Sony FaceInfoA
   0x0107   TiffMeteringImage                    N
+  0x0201   MoreInfo0201                         Sony MoreInfo0201
+  0x0401   MoreInfo0401                         Sony MoreInfo0401
 
 =head3 Sony MoreSettings Tags
 
@@ -11352,6 +12091,7 @@ A580, A33, A35, A55, NEX-3/5/C3 and VG10E.
      32    LiveViewAFMethod                     int8u
      38    FNumber                              int8u
      39    ExposureTime                         int8u
+     41    FocalLength2                         int8u
      42    ExposureCompensation2                int16s
      44    FlashExposureCompSet2                int16s
      46    Orientation2                         int8u
@@ -11372,6 +12112,38 @@ A580, A33, A35, A55, NEX-3/5/C3 and VG10E.
      31    Face7Position                        int16u[4]
      36    Face8Position                        int16u[4]
 
+=head3 Sony FaceInfoA Tags
+
+  Index2   Tag Name                             Writable
+  ------   --------                             --------
+      3    FacesDetected                        N
+     11    PotentialFace1Position               int16u[4]
+     21    PotentialFace2Position               int16u[4]
+     31    PotentialFace3Position               int16u[4]
+     41    PotentialFace4Position               int16u[4]
+     51    PotentialFace5Position               int16u[4]
+     61    PotentialFace6Position               int16u[4]
+     71    PotentialFace7Position               int16u[4]
+     81    PotentialFace8Position               int16u[4]
+     91    Face1Position                        int16u[4]
+    101    Face2Position                        int16u[4]
+    111    Face3Position                        int16u[4]
+    121    Face4Position                        int16u[4]
+
+=head3 Sony MoreInfo0201 Tags
+
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+    283    ImageCount                           int32u
+    293    ShutterCount                         int32u
+    330    ShutterCount                         int32u
+
+=head3 Sony MoreInfo0401 Tags
+
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+   1102    ShotNumberSincePowerUp               int32u
+
 =head3 Sony CameraSettings Tags
 
 Camera settings for the A200, A300, A350, A700, A850 and A900.
@@ -11386,7 +12158,7 @@ Camera settings for the A200, A300, A350, A700, A850 and A900.
      13    ColorCompensationFilterSet           int16u
      16    FocusModeSetting                     int16u
      17    AFAreaMode                           int16u
-     18    AFPointSelected                      int16u
+     18    AFPointSetting                       int16u
      21    MeteringMode                         int16u
      22    ISOSetting                           int16u
      24    DynamicRangeOptimizerMode            int16u
@@ -11418,7 +12190,8 @@ Camera settings for the A200, A300, A350, A700, A850 and A900.
      85    AspectRatio                          int16u
      86    Quality                              int16u
      88    ExposureLevelIncrements              int16u
-    155    ImageNumber                          int16u
+    154    FolderNumber                         int16u & 0x3ff
+    155    ImageNumber                          int16u & 0x3fff
 
 =head3 Sony CameraSettings2 Tags
 
@@ -11432,7 +12205,7 @@ Camera settings for the A230, A290, A330, A380 and A390.
      12    ColorCompensationFilterSet           int16u
      15    FocusModeSetting                     int16u
      16    AFAreaMode                           int16u
-     17    AFPointSelected                      int16u
+     17    AFPointSetting                       int16u
      19    MeteringMode                         int16u
      20    ISOSetting                           int16u
      22    DynamicRangeOptimizerMode            int16u
@@ -11513,12 +12286,23 @@ A560, A580, NEX-3, NEX-5, NEX-C3 and NEX-VG10E.
     134    AELock                               int8u
     135    FlashAction                          int8u
     139    LiveViewFocusMode                    int8u
+    153    LensMount                            int8u
     268    SequenceNumber                       int8u
-    276    ImageNumber                          int16u & 0x3fff
+    276    FolderNumber                         int32u & 0xffc000
+  276.1    ImageNumber                          int32u & 0x3fff
+    512    ShotNumberSincePowerUp2              int32u
+    643    AFButtonPressed                      int8u
+    644    LiveViewMetering                     int8u
+    645    ViewingMode2                         int8u
+    646    AELock                               int8u
     647    FlashAction                          int8u
+    651    LiveViewFocusMode                    int8u
     780    SequenceNumber                       int8u
     788    ImageNumber                          int16u & 0x3fff
+    790    FolderNumber                         int16u & 0x3ff
+   1015    LensType2                            int16u
    1024    ImageNumber                          int16u & 0x3fff
+   1026    FolderNumber                         int16u & 0x3ff
 
 =head3 Sony CameraSettingsUnknown Tags
 
@@ -11564,28 +12348,198 @@ A580 and NEX-3/5/C3/VG10.
      20    BatteryState                         int8u
            ExposureProgram                      int8u
            ModeDialPosition                     int8u
-     22    MemoryCardConfiguration              int8u
+     22    MemoryCardConfiguration              int8u & 0xc0
+           CameraOrientation                    int8u
      24    CameraOrientation                    int8u & 0x30
 
-=head3 Sony Panorama Tags
+=head3 Sony Panorama Tags
+
+Tags found in panorama images from various Sony DSC, NEX, SLT and DSLR
+cameras.  The width/height values of these tags are not affected by camera
+rotation -- the width is always the longer dimension.
+
+  Index4   Tag Name                             Writable
+  ------   --------                             --------
+      1    PanoramaFullWidth                    int32u
+      2    PanoramaFullHeight                   int32u
+      3    PanoramaDirection                    int32u
+      4    PanoramaCropLeft                     int32u
+      5    PanoramaCropTop                      int32u
+      6    PanoramaCropRight                    int32u
+      7    PanoramaCropBottom                   int32u
+      8    PanoramaFrameWidth                   int32u
+      9    PanoramaFrameHeight                  int32u
+     10    PanoramaSourceWidth                  int32u
+     11    PanoramaSourceHeight                 int32u
+
+=head3 Sony Tag2010a Tags
+
+Valid for NEX-5N.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x1128   ReleaseMode3                         int8u
+  0x112c   ReleaseMode2                         int8u
+  0x113e   StopsAboveBaseISO                    int16u
+  0x1140   BrightnessValue                      int16u
+  0x1144   DynamicRangeOptimizer                int8u
+  0x1148   HDRSetting                           int8u
+  0x114c   ExposureCompensation                 int16s
+  0x1163   PictureEffect2                       int8u
+  0x1170   Quality2                             int8u
+  0x1174   MeteringMode                         int8u
+  0x1175   ExposureProgram                      int8u
+  0x117c   WB_RGBLevels                         int16u[3]
+
+=head3 Sony Tag2010b Tags
+
+Valid for SLT-A65/A77, NEX-7/VG20E.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   SequenceImageNumber                  int32u
+  0x0004   SequenceFileNumber                   int32u
+  0x0008   ReleaseMode2                         int32u
+  0x01b6   SonyDateTime                         undef[7]
+  0x1128   ReleaseMode3                         int8u
+  0x112c   ReleaseMode2                         int8u
+  0x113e   StopsAboveBaseISO                    int16u
+  0x1140   BrightnessValue                      int16u
+  0x1144   DynamicRangeOptimizer                int8u
+  0x1148   HDRSetting                           int8u
+  0x114c   ExposureCompensation                 int16s
+  0x1167   PictureEffect2                       int8u
+  0x1174   Quality2                             int8u
+  0x1178   MeteringMode                         int8u
+  0x1179   ExposureProgram                      int8u
+  0x1180   WB_RGBLevels                         int16u[3]
+
+=head3 Sony Tag2010c Tags
+
+Valid for SLT-A37/A57 and NEX-F3.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   SequenceImageNumber                  int32u
+  0x0004   SequenceFileNumber                   int32u
+  0x0008   ReleaseMode2                         int32u
+  0x0200   DigitalZoomRatio                     int8u
+  0x0210   SonyDateTime                         undef[7]
+  0x1104   ReleaseMode3                         int8u
+  0x1108   ReleaseMode2                         int8u
+  0x111a   StopsAboveBaseISO                    int16u
+  0x111c   BrightnessValue                      int16u
+  0x1120   DynamicRangeOptimizer                int8u
+  0x1124   HDRSetting                           int8u
+  0x1128   ExposureCompensation                 int16s
+  0x1143   PictureEffect2                       int8u
+  0x1150   Quality2                             int8u
+  0x1154   MeteringMode                         int8u
+  0x1155   ExposureProgram                      int8u
+  0x115c   WB_RGBLevels                         int16u[3]
+
+=head3 Sony Tag2010d Tags
+
+Valid for DSC-HX10V/HX20V/HX200V/TX66/TX200V/TX300V/WX50/WX100/WX150, but
+not valid for panorama images.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   SequenceImageNumber                  int32u
+  0x0004   SequenceFileNumber                   int32u
+  0x0008   ReleaseMode2                         int32u
+  0x01fe   SonyDateTime                         undef[7]
+  0x1180   ReleaseMode3                         int8u
+  0x1184   ReleaseMode2                         int8u
+  0x1196   StopsAboveBaseISO                    int16u
+  0x1198   BrightnessValue                      int16u
+  0x119c   DynamicRangeOptimizer                int8u
+  0x11a0   HDRSetting                           int8u
+  0x11bf   PictureEffect2                       int8u
+  0x11d0   MeteringMode                         int8u
+  0x11d1   ExposureProgram                      int8u
+  0x11d8   WB_RGBLevels                         int16u[3]
+
+=head3 Sony Tag2010e Tags
+
+Valid for SLT-A58/A99, ILCE-3000, NEX-3N/5R/5T/6/VG30E/VG900, DSC-RX100,
+DSC-RX1/RX1R. Also valid for DSC-HX300/HX50V/TX30/WX60/WX200/WX300, but not
+for panorama images.
 
-Tags found only in panorama images from Sony cameras such as the HX1, HX5
-and TX7.  The width/height values of these tags are not affected by camera
-rotation -- the width is always the longer dimension.
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   SequenceImageNumber                  int32u
+  0x0004   SequenceFileNumber                   int32u
+  0x0008   ReleaseMode2                         int32u
+  0x021c   DigitalZoomRatio                     int8u
+  0x022c   SonyDateTime                         undef[7]
+  0x115c   ReleaseMode3                         int8u
+  0x1160   ReleaseMode2                         int8u
+  0x1172   StopsAboveBaseISO                    int16u
+  0x1174   BrightnessValue                      int16u
+  0x1178   DynamicRangeOptimizer                int8u
+  0x117c   HDRSetting                           int8u
+  0x1180   ExposureCompensation                 int16s
+  0x119b   PictureEffect2                       int8u
+  0x11a8   Quality2                             int8u
+  0x11ac   MeteringMode                         int8u
+  0x11ad   ExposureProgram                      int8u
+  0x11b4   WB_RGBLevels                         int16u[3]
+  0x1278   FocalLength                          int16u
+  0x127a   MinFocalLength                       int16u
+  0x127c   MaxFocalLength                       int16u
+
+=head3 Sony Tag2010f Tags
+
+Valid for DSC-RX100M2, DSC-QX10/QX100.
 
-  Index4   Tag Name                             Writable
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      1    PanoramaFullWidth                    int32u
-      2    PanoramaFullHeight                   int32u
-      3    PanoramaDirection                    int32u
-      4    PanoramaCropLeft                     int32u
-      5    PanoramaCropTop                      int32u
-      6    PanoramaCropRight                    int32u
-      7    PanoramaCropBottom                   int32u
-      8    PanoramaFrameWidth                   int32u
-      9    PanoramaFrameHeight                  int32u
-     10    PanoramaSourceWidth                  int32u
-     11    PanoramaSourceHeight                 int32u
+  0x0004   ReleaseMode2                         int32u
+  0x1014   ReleaseMode3                         int8u
+  0x1018   ReleaseMode2                         int8u
+  0x102a   StopsAboveBaseISO                    int16u
+  0x102c   BrightnessValue                      int16u
+  0x1030   DynamicRangeOptimizer                int8u
+  0x1034   HDRSetting                           int8u
+  0x1038   ExposureCompensation                 int16s
+  0x1053   PictureEffect2                       int8u
+  0x1060   Quality2                             int8u
+  0x1064   MeteringMode                         int8u
+  0x1065   ExposureProgram                      int8u
+  0x106c   WB_RGBLevels                         int16u[3]
+  0x1134   FocalLength                          int16u
+  0x1136   MinFocalLength                       int16u
+  0x1138   MaxFocalLength                       int16u
+
+=head3 Sony Tag2010g Tags
+
+Valid for DSC-RX10/HX60V/HX400V, ILCE-7/7R/5000/6000.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0004   ReleaseMode2                         int32u
+  0x020c   ReleaseMode3                         int8u
+  0x0210   ReleaseMode2                         int8u
+  0x0222   StopsAboveBaseISO                    int16u
+  0x0224   BrightnessValue                      int16u
+  0x0228   DynamicRangeOptimizer                int8u
+  0x022c   HDRSetting                           int8u
+  0x0230   ExposureCompensation                 int16s
+  0x024b   PictureEffect2                       int8u
+  0x0258   Quality2                             int8u
+  0x025c   MeteringMode                         int8u
+  0x025d   ExposureProgram                      int8u
+  0x0264   WB_RGBLevels                         int16u[3]
+  0x032c   FocalLength                          int16u
+  0x032e   MinFocalLength                       int16u
+  0x0330   MaxFocalLength                       int16u
+
+=head3 Sony AFInfo2 Tags
+
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    AFPointsUsed                         int32u
 
 =head3 Sony ShotInfo Tags
 
@@ -11597,6 +12551,7 @@ rotation -- the width is always the longer dimension.
      28    SonyImageWidth                       int16u
      48    FacesDetected                        int16u
      50    FaceInfoLength                       N
+     52    MetaVersion                          string[16]
      72    FaceInfo1                            Sony FaceInfo1
      94    FaceInfo2                            Sony FaceInfo2
 
@@ -11626,6 +12581,13 @@ rotation -- the width is always the longer dimension.
     222    Face7Position                        int16u[4]
     259    Face8Position                        int16u[4]
 
+=head3 Sony Tag900b Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0002   FacesDetected                        N
+  0x00bd   FaceDetection                        N
+
 =head3 Sony Tag9050 Tags
 
 Data for tags 0x9050, 0x94xx and 0x2010 is encrypted by a simple
@@ -11636,36 +12598,73 @@ substitution cipher, but the deciphered values are listed below.
   0x0000   MaxAperture                          int8u
   0x0001   MinAperture                          int8u
   0x0031   FlashStatus                          int8u
+  0x0032   ImageCount                           int32u
+  0x003a   SonyExposureTime                     int16u
+  0x003c   SonyFNumber                          int16u
+  0x004c   ImageCount2                          int32u
+  0x0051   SonyDateTime2                        undef[6]
+  0x0105   LensMount                            int8u
+  0x0106   LensFormat                           int8u
+  0x0107   LensType2                            int16u
+  0x0109   LensType                             int16u
 
 =head3 Sony Tag9400a Tags
 
+Valid for many DSC, NEX and SLT models
+
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
   0x0008   SequenceImageNumber                  int32u
   0x000c   SequenceFileNumber                   int32u
   0x0010   ReleaseMode2                         int8u
+  0x0012   DigitalZoom                          int8u
   0x001a   ShotNumberSincePowerUp               int32u
   0x0022   SequenceLength                       int8u
   0x0028   CameraOrientation                    int8u
   0x0029   Quality2                             int8u
+  0x0044   SonyImageHeight                      int16u~
+  0x0052   ModelReleaseYear                     int8u~
 
 =head3 Sony Tag9400b Tags
 
+Valid for NEX-3N, ILCE-3000, SLT-A58, DSC-WX60, DSC-WX300, DSC-RX100M2,
+DSC-HX50V, DSC-QX10/QX100.
+
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
   0x0008   SequenceImageNumber                  int32u
   0x000c   SequenceFileNumber                   int32u
   0x0010   ReleaseMode2                         int8u
+  0x0012   DigitalZoom                          int8u
   0x0016   ShotNumberSincePowerUp               int32u
   0x001e   SequenceLength                       int8u
   0x0024   CameraOrientation                    int8u
   0x0025   Quality2                             int8u
+  0x003f   SonyImageHeight                      int16u~
+  0x0046   ModelReleaseYear                     int8u~
+
+=head3 Sony Tag9400c Tags
+
+Valid for DSC-RX10/HX60V/HX400V, ILCE-7/7R/5000/6000.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0009   ReleaseMode2                         int8u
+  0x000a   ShotNumberSincePowerUp               int32u
+  0x0012   SequenceImageNumber                  int32u
+  0x0016   SequenceLength                       int8u
+  0x001a   SequenceFileNumber                   int32u
+  0x001e   SequenceLength                       int8u
+  0x0029   CameraOrientation                    int8u
+  0x002a   Quality2                             int8u
+  0x0047   SonyImageHeight                      int16u~
 
 =head3 Sony Tag9402 Tags
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
   0x0004   AmbientTemperature                   int8s
+  0x0016   FocusMode                            int8u & 0x7f
   0x0017   AFAreaMode                           int8u
 
 =head3 Sony Tag9403 Tags
@@ -11674,11 +12673,46 @@ substitution cipher, but the deciphered values are listed below.
   ------   --------                             --------
   0x0005   CameraTemperature                    int8s
 
+=head3 Sony Tag9405a Tags
+
+Valid for SLT, NEX, ILCE-3000 and several DSC models.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0603   LensFormat                           int8u
+  0x0604   LensMount                            int8u
+  0x0605   LensType2                            int16u
+  0x0608   LensType                             int16u
+
+=head3 Sony Tag9405b Tags
+
+Valid for the DSC-RX10/HX60V/HX400V and ILCE-7/7R/5000/6000.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x000e   SonyExposureTime2                    int16u
+  0x0010   ExposureTime                         rational32u
+  0x0014   SonyFNumber                          int16u
+  0x0016   SonyMaxApertureValue                 int16u
+  0x0024   SequenceImageNumber                  int32u
+  0x0034   ReleaseMode2                         int8u
+  0x0044   LongExposureNoiseReduction           int8u
+  0x0046   PictureEffect2                       int8u
+  0x0048   ExposureProgram                      int8u
+  0x004a   CreativeStyle                        int8u
+  0x005d   LensFormat                           int8u
+  0x005e   LensMount                            int8u
+  0x0060   LensType2                            int16u
+  0x0062   LensType                             int16u
+
 =head3 Sony Tag9406 Tags
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
+  0x0005   BatteryTemperature                   int8u
+  0x0006   BatteryLevelGrip1                    int8u
   0x0007   BatteryLevel                         int8u
+  0x0008   BatteryLevelGrip2                    int8u
 
 =head3 Sony Tag940a Tags
 
@@ -11688,6 +12722,13 @@ These tags are currently extracted for SLT models only.
   ------   --------                             --------
   0x0004   AFPointsSelected                     int32u
 
+=head3 Sony Tag940c Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0008   LensMount                            int8u
+  0x0009   LensType2                            int16u
+
 =head3 Sony AFInfo Tags
 
 These tags are currently extracted for SLT models only.
@@ -11703,6 +12744,25 @@ These tags are currently extracted for SLT models only.
   0x017d   AFMicroAdj                           int8s
   0x017e   ExposureProgram                      int8u
 
+=head3 Sony PIC Tags
+
+The TextInfo data is extracted as a block to preserve the formatting, and
+some of the more interesting information is extracted as separate tags.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'BC:'                Barcode                  N
+  'BarCode:'           Barcode                  N
+  'Capt:'              SensorTemperature        N
+  'FWVer:'             FirmwareVersion          N
+  'IFD'                PIC_IFD                  Sony
+  'Temp:'              CameraTemperature        N
+  'Temp:Clbt:'         BoardTemperature         N
+  'TextInfo1'          TextInfo1                N
+  'TextInfo2'          TextInfo2                N
+  'VR Enable C:'       VibrationReduction       N
+  'barcode:'           Barcode                  N
+
 =head3 Sony Ericsson Tags
 
 Maker notes found in images from some Sony Ericsson phones.
@@ -11760,16 +12820,27 @@ Tags in the encrypted SR2SubIFD
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
   0x7303   WB_GRBGLevels                        N
+  0x7310   BlackLevel                           N
   0x7313   WB_RGGBLevels                        N
   0x74a0   MaxApertureAtMaxFocal                N
   0x74a1   MaxApertureAtMinFocal                N
   0x74c0   SR2DataIFD                           Sony SR2DataIFD
+  0x7800   ColorMatrix                          N
   0x7820   WB_RGBLevelsDaylight                 N
   0x7821   WB_RGBLevelsCloudy                   N
   0x7822   WB_RGBLevelsTungsten                 N
+  0x7823   WB_RGBLevelsFlash                    N
+  0x7824   WB_RGBLevels4500K                    N
   0x7825   WB_RGBLevelsShade                    N
   0x7826   WB_RGBLevelsFluorescent              N
-  0x7828   WB_RGBLevelsFlash                    N
+  0x7827   WB_RGBLevelsFluorescentP1            N
+  0x7828   WB_RGBLevelsFluorescentP2            N
+  0x7829   WB_RGBLevelsFluorescentM1            N
+  0x782a   WB_RGBLevels8500K                    N
+  0x782b   WB_RGBLevels6000K                    N
+  0x782c   WB_RGBLevels3200K                    N
+  0x782d   WB_RGBLevels2500K                    N
+  0x787f   WhiteLevel                           N
 
 =head3 Sony SR2DataIFD Tags
 
@@ -11884,7 +12955,8 @@ still proprietary) Adobe format.
   'Koda'   AdobeKoda                            Kodak IFD
   'Leaf'   AdobeLeaf                            Leaf SubIFD
   'MRW '   AdobeMRW                             MinoltaRaw
-  'MakN'   MakerNoteNikon                       Nikon
+  'MakN'   MakerNoteApple                       Apple
+           MakerNoteNikon                       Nikon
            MakerNoteCanon                       Canon
            MakerNoteCasio                       Casio
            MakerNoteCasio2                      Casio Type2
@@ -11911,6 +12983,7 @@ still proprietary) Adobe format.
            MakerNoteKodak7                      Kodak Type7
            MakerNoteKodak8a                     Kodak Type8
            MakerNoteKodak8b                     Kodak Type8
+           MakerNoteKodak8c                     Kodak Type8
            MakerNoteKodak9                      Kodak Type9
            MakerNoteKodak10                     Kodak Type10
            MakerNoteKodakUnknown                Kodak Unknown
@@ -11941,7 +13014,7 @@ still proprietary) Adobe format.
            MakerNoteRicoh                       Ricoh
            MakerNoteRicohText                   Ricoh Text
            MakerNoteSamsung1a                   undef
-           MakerNoteSamsung1b                   Samsung Type1
+           MakerNoteSamsung1b                   Samsung
            MakerNoteSamsung2                    Samsung Type2
            MakerNoteSanyo                       Sanyo
            MakerNoteSanyoC4                     Sanyo
@@ -11950,7 +13023,8 @@ still proprietary) Adobe format.
            MakerNoteSony                        Sony
            MakerNoteSony2                       Olympus
            MakerNoteSony3                       Olympus
-           MakerNoteSony4                       Sony
+           MakerNoteSony4                       Sony PIC
+           MakerNoteSony5                       Sony
            MakerNoteSonyEricsson                Sony Ericsson
            MakerNoteSonySRF                     Sony SRF
            MakerNoteUnknownText                 undef
@@ -12224,9 +13298,21 @@ These tags are found in IFD0 of Panasonic/Leica RAW, RW2 and RWL images.
   0x0005   SensorLeftBorder                     N
   0x0006   SensorBottomBorder                   N
   0x0007   SensorRightBorder                    N
+  0x0008   BlackLevel1                          int16u
+  0x0009   BlackLevel2                          int16u
+  0x000a   BlackLevel3                          int16u
+  0x000e   LinearityLimitRed                    int16u
+  0x000f   LinearityLimitGreen                  int16u
+  0x0010   LinearityLimitBlue                   int16u
   0x0011   RedBalance                           int16u
   0x0012   BlueBalance                          int16u
   0x0017   ISO                                  int16u
+  0x0018   HighISOMultiplierRed                 int16u
+  0x0019   HighISOMultiplierGreen               int16u
+  0x001a   HighISOMultiplierBlue                int16u
+  0x001c   BlackLevelRed                        int16u
+  0x001d   BlackLevelGreen                      int16u
+  0x001e   BlackLevelBlue                       int16u
   0x0024   WBRedLevel                           int16u
   0x0025   WBGreenLevel                         int16u
   0x0026   WBBlueLevel                          int16u
@@ -12360,10 +13446,10 @@ L<http://www.jpeg.org/public/jfif.pdf> for the JFIF 1.02 specification.
 
   Index1   Tag Name                             Writable
   ------   --------                             --------
-      0    JFIFVersion                          N
-      2    ResolutionUnit                       int8u
-      3    XResolution                          int16u
-      5    YResolution                          int16u
+      0    JFIFVersion                          N:
+      2    ResolutionUnit                       int8u:
+      3    XResolution                          int16u:
+      5    YResolution                          int16u:
 
 =head3 JFIF Extension Tags
 
@@ -12766,6 +13852,19 @@ official specification.
       7    CropYViewpointNumber2                N
       8    CropYOffset2                         N
 
+=head2 Scalado Tags
+
+Tags extracted from the JPEG APP4 "SCALADO" segment found in images from
+HTC, LG and Samsung phones.  (Presumably written by Scalado mobile software,
+L<http://www.scalado.com/>.)
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'HGHT'   PreviewImageHeight                   N
+  'QUAL'   PreviewQuality                       N
+  'SPMO'   DataLength?                          N
+  'WDTH'   PreviewImageWidth                    N
+
 =head2 Qualcomm Tags
 
 The tags below have been observed in the JPEG APP7 "Qualcomm Camera
@@ -14024,6 +15123,10 @@ incompatible with some file formats.
 ExifTool will read and write (but not create) AFCP IPTC information in JPEG
 and TIFF images.
 
+See
+L<http://web.archive.org/web/20080828211305/http://www.tocarte.com/media/axs_afcp_spec.pdf>
+for the AFCP specification.
+
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
   'IPTC'   IPTC                                 IPTC
@@ -14052,6 +15155,7 @@ L<http://rs.tdwg.org/dwc/index.htm> for the official specification.
   DCFootprintWKT                                string_
   DCGeodeticDatum                               string_
   DCGeoreferencedBy                             string_
+  DCGeoreferencedDate                           string_
   DCGeoreferenceProtocol                        string_
   DCGeoreferenceRemarks                         string_
   DCGeoreferenceSources                         string_
@@ -14113,6 +15217,7 @@ L<http://rs.tdwg.org/dwc/index.htm> for the official specification.
   LatestAgeOrHighestStage                       string_
   LatestEonOrHighestEonothem                    string_
   LatestEpochOrHighestSeries                    string_
+  LatestEraOrHighestErathem                     string_
   LatestPeriodOrHighestSystem                   string_
   LithostratigraphicTerms                       string_
   LowestBiostratigraphicZone                    string_
@@ -14123,6 +15228,7 @@ L<http://rs.tdwg.org/dwc/index.htm> for the official specification.
   IdentificationQualifier                       string_
   IdentificationReferences                      string_
   IdentificationRemarks                         string_
+  IdentificationVerificationStatus              string_
   IdentifiedBy                                  string_
   TypeStatus                                    string_
   MeasurementOrFact                             DarwinCore MeasurementOrFact Struct
@@ -14192,10 +15298,12 @@ L<http://rs.tdwg.org/dwc/index.htm> for the official specification.
   TaxonNameAccordingToID                        string_
   TaxonNamePublishedIn                          string_
   TaxonNamePublishedInID                        string_
+  TaxonNamePublishedInYear                      string_
   TaxonNomenclaturalCode                        string_
   TaxonNomenclaturalStatus                      string_
   TaxonOrder                                    string_
   TaxonOriginalNameUsage                        string_
+  TaxonOriginalNameUsageID                      string_
   TaxonParentNameUsage                          string_
   TaxonParentNameUsageID                        string_
   TaxonPhylum                                   string_
@@ -14233,6 +15341,7 @@ L<http://rs.tdwg.org/dwc/index.htm> for the official specification.
   GeoreferenceSources                           string
   GeoreferenceVerificationStatus                string
   GeoreferencedBy                               string
+  GeoreferencedDate                             string
   HigherGeography                               string
   HigherGeographyID                             string
   Island                                        string
@@ -14298,6 +15407,7 @@ L<http://rs.tdwg.org/dwc/index.htm> for the official specification.
   LatestAgeOrHighestStage                       string
   LatestEonOrHighestEonothem                    string
   LatestEpochOrHighestSeries                    string
+  LatestEraOrHighestErathem                     string
   LatestPeriodOrHighestSystem                   string
   LithostratigraphicTerms                       string
   LowestBiostratigraphicZone                    string
@@ -14312,6 +15422,7 @@ L<http://rs.tdwg.org/dwc/index.htm> for the official specification.
   IdentificationQualifier                       string
   IdentificationReferences                      string
   IdentificationRemarks                         string
+  IdentificationVerificationStatus              string
   IdentifiedBy                                  string
   TypeStatus                                    string
 
@@ -14401,10 +15512,12 @@ L<http://rs.tdwg.org/dwc/index.htm> for the official specification.
   NameAccordingToID                             string
   NamePublishedIn                               string
   NamePublishedInID                             string
+  NamePublishedInYear                           string
   NomenclaturalCode                             string
   NomenclaturalStatus                           string
   Order                                         string
   OriginalNameUsage                             string
+  OriginalNameUsageID                           string
   ParentNameUsage                               string
   ParentNameUsageID                             string
   Phylum                                        string
@@ -14827,7 +15940,7 @@ are not shown because some are unruly GUID's.
   Gender                                        N
   DueDate                                       N
   BusinessCity                                  N
-  Filename                                      N
+  WindowsFileName                               N
   DateArchived                                  N
   BusinessStateOrProvince                       N
   BroadcastDate                                 N
@@ -14846,7 +15959,7 @@ are not shown because some are unruly GUID's.
   Beats-per-minute                              N
   Conductors                                    N
   PartOfSet                                     N
-  Subtitle                                      N
+  SubTitle                                      N
   Mood                                          N
   AlbumTitle                                    N
   Year                                          N
@@ -15714,35 +16827,36 @@ Tags extracted from PNG images.  See
 L<http://www.libpng.org/pub/png/spec/1.2/> for the official PNG 1.2
 specification.
 
-  Tag ID   Tag Name                             Writable
-  ------   --------                             --------
-  'IHDR'   ImageHeader                          PNG ImageHeader
-  'PLTE'   Palette                              N
-  'bKGD'   BackgroundColor                      N
-  'cHRM'   PrimaryChromaticities                PNG PrimaryChromaticities
-  'dSIG'   DigitalSignature                     N
-  'fRAc'   FractalParameters                    N
-  'gAMA'   Gamma                                N
-  'gIFg'   GIFGraphicControlExtension           N
-  'gIFt'   GIFPlainTextExtension                N
-  'gIFx'   GIFApplicationExtension              N
-  'hIST'   PaletteHistogram                     N
-  'iCCP'   ICC_Profile                          ICC_Profile
-  'iTXt'   InternationalText                    PNG TextualData
-  'oFFs'   ImageOffset                          N
-  'pCAL'   PixelCalibration                     N
-  'pHYs'   PhysicalPixel                        PNG PhysicalPixel
-  'sBIT'   SignificantBits                      N
-  'sCAL'   SubjectScale                         PNG SubjectScale
-  'sPLT'   SuggestedPalette                     N
-  'sRGB'   SRGBRendering                        N
-  'sTER'   StereoImage                          PNG StereoImage
-  'tEXt'   TextualData                          PNG TextualData
-  'tIME'   ModifyDate                           Y
-  'tRNS'   Transparency                         N
-  'tXMP'   XMP                                  XMP
-  'vpAg'   VirtualPage                          PNG VirtualPage
-  'zTXt'   CompressedText                       PNG TextualData
+  Tag ID             Tag Name                   Writable
+  ------             --------                   --------
+  'IHDR'             ImageHeader                PNG ImageHeader
+  'PLTE'             Palette                    N
+  'bKGD'             BackgroundColor            N
+  'cHRM'             PrimaryChromaticities      PNG PrimaryChromaticities
+  'dSIG'             DigitalSignature           N
+  'fRAc'             FractalParameters          N
+  'gAMA'             Gamma                      N
+  'gIFg'             GIFGraphicControlExtension N
+  'gIFt'             GIFPlainTextExtension      N
+  'gIFx'             GIFApplicationExtension    N
+  'hIST'             PaletteHistogram           N
+  'iCCP'             ICC_Profile                ICC_Profile
+  'iCCP-name'        ProfileName                N
+  'iTXt'             InternationalText          PNG TextualData
+  'oFFs'             ImageOffset                N
+  'pCAL'             PixelCalibration           N
+  'pHYs'             PhysicalPixel              PNG PhysicalPixel
+  'sBIT'             SignificantBits            N
+  'sCAL'             SubjectScale               PNG SubjectScale
+  'sPLT'             SuggestedPalette           N
+  'sRGB'             SRGBRendering              N
+  'sTER'             StereoImage                PNG StereoImage
+  'tEXt'             TextualData                PNG TextualData
+  'tIME'             ModifyDate                 Y
+  'tRNS'             Transparency               N
+  'tXMP'             XMP                        XMP
+  'vpAg'             VirtualPage                PNG VirtualPage
+  'zTXt'             CompressedText             PNG TextualData
 
 =head3 PNG ImageHeader Tags
 
@@ -15807,6 +16921,7 @@ ImageMagick.
   'Label'                 Label                 string
   'Make'                  Make                  string
   'Model'                 Model                 string
+  'Raw profile type 8bim' Photoshop_Profile     Photoshop
   'Raw profile type APP1' APP1_Profile          EXIF
                                                 XMP
   'Raw profile type exif' EXIF_Profile          EXIF
@@ -16075,7 +17190,8 @@ JNG images.
 
 =head2 DjVu Tags
 
-Information is extracted from the following chunks in DjVu images.
+Information is extracted from the following chunks in DjVu images. See
+L<http://www.djvu.org/> for the DjVu specification.
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
@@ -16156,6 +17272,44 @@ PDF DocInfo tags (capitalized Tag ID's).
       8    Gamma                                N
       9    Orientation                          N
 
+=head2 DPX Tags
+
+Tags extracted from DPX (Digital Picture Exchange) images.
+
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    ByteOrder                            N
+      8    HeaderVersion                        N
+     16    DPXFileSize                          N
+     20    DittoKey                             N
+     36    ImageFileName                        N
+    136    CreateDate                           N
+    160    Creator                              N
+    260    Project                              N
+    460    Copyright                            N
+    660    EncryptionKey                        N
+    768    Orientation                          N
+    770    ImageElements                        N
+    772    ImageWidth                           N
+    776    ImageHeight                          N
+    780    DataSign                             N
+    803    BitDepth                             N
+    820    ImageDescription                     N
+    892    Image2Description                    N
+    964    Image3Description                    N
+   1036    Image4Description                    N
+   1108    Image5Description                    N
+   1180    Image6Description                    N
+   1252    Image7Description                    N
+   1324    Image8Description                    N
+   1432    SourceFileName                       N
+   1532    SourceCreateDate                     N
+   1556    InputDeviceName                      N
+   1588    InputDeviceSerialNumber              N
+   1732    FrameID                              N
+   1764    SlateInformation                     N
+   2048    UserID                               N
+
 =head2 OpenEXR Tags
 
 Information extracted from EXR images.  See L<http://www.openexr.com/> for
@@ -16377,11 +17531,11 @@ extension level 3, including support for RC4, AES-128 and AES-256
 encryption.  A Password option is provided to allow processing of
 password-protected PDF files.
 
-When writing PDF files, ExifTool uses an incremental update.  This has the
-advantages of being fast and reversible.  The original PDF can be easily
-recovered by deleting the C<PDF-update> pseudo-group (with
-C<-PDF-update:all=> on the command line).  But there are two main
-disadvantages to this technique:
+ExifTool may be used to write native PDF and XMP metadata to PDF files. It
+uses an incremental update technique that has the advantages of being both
+fast and reversible.  The original PDF can be easily recovered by deleting
+the C<PDF-update> pseudo-group (with C<-PDF-update:all=> on the command
+line).  However, there are two main disadvantages to this technique:
 
 1) A linearized PDF file is no longer linearized after the update, so it
 must be subsequently re-linearized if this is required.
@@ -17133,7 +18287,7 @@ Tags extracted from the Theora identification header.
 Tags found in Monkey's Audio (APE) information.  Only a few common tags are
 listed below, but ExifTool will extract any tag found.  ExifTool supports
 APEv1 and APEv2 tags, as well as ID3 information in APE files, and will also
-read APE metadata from MP3 files.
+read APE metadata from MP3 and MPC files.
 
   Tag ID               Tag Name                 Writable
   ------               --------                 --------
@@ -17298,6 +18452,7 @@ which case subsequent occurrences are extracted as sub-documents).
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
+  0x0013   TimeCode                             N
   0x0018   DateTimeOriginal                     N
   0x0070   Camera1                              H264 Camera1
   0x0071   Camera2                              H264 Camera2
@@ -17389,6 +18544,9 @@ meta information a variety of audio, video and image parameters, as well as
 proprietary information written by many camera models.  Tags with a question
 mark after their name are not extracted unless the Unknown option is set.
 
+ExifTool has the ability to write/create XMP, and edit some date/time tags
+in QuickTime-format files.
+
 According to the specification, many QuickTime date/time tags should be
 stored as UTC.  Unfortunately, digital cameras often store local time values
 instead (presumably because they don't know the time zone).  For this
@@ -17397,26 +18555,42 @@ However, if the QuickTimeUTC option is set via the API or the ExifTool
 configuration file, then ExifTool will assume these values are properly
 stored as UTC, and will convert them to local time when extracting.
 
+See
+L<http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html>
+for the official specification.
+
   Tag ID               Tag Name                 Writable
   ------               --------                 --------
   'PICT'               PreviewPICT              N
+  '_htc'               HTCInfo                  QuickTime HTC
   'free'               KodakFree                Kodak Free
                        Free?                    N
   'ftyp'               FileType                 QuickTime FileType
   'junk'               Junk?                    N
   'mdat'               MovieData?               N
+  'mdat-offset'        MovieDataOffset          N
   'mdat-size'          MovieDataSize            N
   'moov'               Movie                    QuickTime Movie
   'pict'               PreviewPICT              N
   'pnot'               Preview                  QuickTime Preview
   'skip'               CanonSkip                Canon Skip
                        Skip?                    N
+  'thum'               ThumbnailImage           N
+  'udta'               UserData                 FLIR UserData
   'uuid'               UUID-XMP                 XMP
                        UUID-PROF                QuickTime Profile
                        UUID-Flip                QuickTime Flip
                        UUID-Unknown?            N
   'wide'               Wide?                    N
 
+=head3 QuickTime HTC Tags
+
+Tags written by some HTC camera phones.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'slmt'   Unknown_slmt?                        N
+
 =head3 QuickTime FileType Tags
 
   Index4   Tag Name                             Writable
@@ -17436,6 +18610,7 @@ stored as UTC, and will convert them to local time when extracting.
   'trak'   Track                                QuickTime Track
   'udta'   UserData                             QuickTime UserData
   'uuid'   UUID-USMT                            QuickTime UserMedia
+           UUID-Canon                           Canon uuid
            UUID-Unknown?                        N
 
 =head3 QuickTime CMovie Tags
@@ -17496,6 +18671,12 @@ added dynamically to this table after processing the Meta Keys information.
   'geID'       GenreID                          N
   'gnre'       Genre                            N
   'grup'       Grouping                         N
+  'gshh'       GoogleHostHeader                 N
+  'gspm'       GooglePingMessage                N
+  'gspu'       GooglePingURL                    N
+  'gssd'       GoogleSourceData                 N
+  'gsst'       GoogleStartTime                  N
+  'gstd'       GoogleTrackDuration              N
   'hdvd'       HDVideo                          N
   'itnu'       iTunesU                          N
   'keyw'       Keyword                          N
@@ -17640,8 +18821,8 @@ ItemList tags written by the "mdta" handler.  The prefix of
   Index4   Tag Name                             Writable
   ------   --------                             --------
       0    MovieHeaderVersion                   N
-      1    CreateDate                           N
-      2    ModifyDate                           N
+      1    CreateDate                           int32u
+      2    ModifyDate                           int32u
       3    TimeScale                            N
       4    Duration                             N
       5    PreferredRate                        N
@@ -17683,8 +18864,8 @@ MP4 media box.
   Index4   Tag Name                             Writable
   ------   --------                             --------
       0    MediaHeaderVersion                   N
-      1    MediaCreateDate                      N
-      2    MediaModifyDate                      N
+      1    MediaCreateDate                      int32u
+      2    MediaModifyDate                      int32u
       3    MediaTimeScale                       N
       4    MediaDuration                        N
       5    MediaLanguageCode                    N
@@ -17752,9 +18933,9 @@ MP4 data reference box.
       4    TextFont                             N
       6    TextFace                             N
       8    TextSize                             N
-     10    TextColor                            N
-     16    BackgroundColor                      N
-     22    FontName                             N
+     12    TextColor                            N
+     18    BackgroundColor                      N
+     24    FontName                             N
 
 =head3 QuickTime HintHeader Tags
 
@@ -17805,21 +18986,80 @@ MP4 sample table box.
 
 =head3 QuickTime AudioSampleDesc Tags
 
-MP4 audio sample description.
+MP4 audio sample description.  This hybrid atom contains both data and child
+atoms.
 
-  Index2   Tag Name                             Writable
+  ID/Index Tag Name                             Writable
+  -------- --------                             --------
+      4    AudioFormat                          N
+     20    AudioVendorID                        N
+     24    AudioChannels                        N
+     26    AudioBitsPerSample                   N
+     32    AudioSampleRate                      N
+  'damr'   DecodeConfig                         QuickTime DecodeConfig
+  'pinf'   PurchaseInfo                         QuickTime ProtectionInfo
+  'sinf'   ProtectionInfo                       QuickTime ProtectionInfo
+  'wave'   Wave                                 QuickTime Wave
+
+=head3 QuickTime DecodeConfig Tags
+
+  Index1   Tag Name                             Writable
   ------   --------                             --------
-      2    AudioFormat                          N
-     10    AudioVendorID                        N
-     12    AudioChannels                        N
-     13    AudioBitsPerSample                   N
-     16    AudioSampleRate                      N
-     28    AudioFormat                          N
+      0    EncoderVendor                        N
+      4    EncoderVersion                       N
 
-=head3 QuickTime ImageDesc Tags
+=head3 QuickTime ProtectionInfo Tags
 
-  Index2   Tag Name                             Writable
+Child atoms found in "sinf" and/or "pinf" atoms.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'frma'   OriginalFormat                       N
+  'schi'   SchemeInfo                           QuickTime SchemeInfo
+  'schm'   SchemeType                           QuickTime SchemeType
+
+=head3 QuickTime SchemeInfo Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'cert'   Certificate                          N
+  'iviv'   InitializationVector                 N
+  'key '   KeyID                                N
+  'name'   UserName                             N
+  'righ'   Rights                               QuickTime Rights
+  'user'   UserID                               N
+
+=head3 QuickTime Rights Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'aver'   VersionRestrictions                  N
+  'medi'   MediaFlags                           N
+  'mode'   ModeFlags                            N
+  'plat'   Platform                             N
+  'song'   ItemID                               N
+  'tool'   ItemTool                             N
+  'tran'   TransactionID                        N
+  'veID'   ItemVendorID                         N
+
+=head3 QuickTime SchemeType Tags
+
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      4    SchemeType                           N
+      8    SchemeVersion                        N
+     10    SchemeURL                            N
+
+=head3 QuickTime Wave Tags
+
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
+  'frma'   PurchaseFileFormat                   N
+
+=head3 QuickTime ImageDesc Tags
+
+  ID/Index Tag Name                             Writable
+  -------- --------                             --------
       2    CompressorID                         N
      10    VendorID                             N
      16    SourceImageWidth                     N
@@ -17828,20 +19068,48 @@ MP4 audio sample description.
      20    YResolution                          N
      25    CompressorName                       N
      41    BitDepth                             N
+  'btrt'   BitrateInfo                          QuickTime Bitrate
+  'clap'   CleanAperture                        QuickTime CleanAperture
+  'colr'   ColorRepresentation                  N
+  'fiel'   VideoFieldOrder                      N
+  'gama'   Gamma                                N
+  'pasp'   PixelAspectRatio                     N
+
+=head3 QuickTime Bitrate Tags
+
+  Index4   Tag Name                             Writable
+  ------   --------                             --------
+      0    BufferSize                           N
+      1    MaxBitrate                           N
+      2    AverageBitrate                       N
+
+=head3 QuickTime CleanAperture Tags
+
+  Index8   Tag Name                             Writable
+  ------   --------                             --------
+      0    CleanApertureWidth                   N
+      1    CleanApertureHeight                  N
+      2    CleanApertureOffsetX                 N
+      3    CleanApertureOffsetY                 N
 
 =head3 QuickTime HintSampleDesc Tags
 
 MP4 hint sample description.
 
-  Index2   Tag Name                             Writable
-  ------   --------                             --------
-      2    HintFormat                           N
+  ID/Index Tag Name                             Writable
+  -------- --------                             --------
+      4    HintFormat                           N
+     16    HintTrackVersion                     N
+     20    MaxPacketSize                        N
+  'snro'   SequenceNumberRandomOffset           N
+  'tims'   RTPTimeScale                         N
+  'tsro'   TimestampRandomOffset                N
 
 =head3 QuickTime OtherSampleDesc Tags
 
-  Index2   Tag Name                             Writable
+  Tag ID   Tag Name                             Writable
   ------   --------                             --------
-      2    OtherFormat                          N
+  0x0004   OtherFormat                          N
 
 =head3 QuickTime VideoHeader Tags
 
@@ -17865,8 +19133,8 @@ MP4 video media header.
   Index4   Tag Name                             Writable
   ------   --------                             --------
       0    TrackHeaderVersion                   N
-      1    TrackCreateDate                      N
-      2    TrackModifyDate                      N
+      1    TrackCreateDate                      int32u
+      2    TrackModifyDate                      int32u
       3    TrackID                              N
       5    TrackDuration                        N
       8    TrackLayer                           N
@@ -17879,7 +19147,8 @@ MP4 video media header.
 
   Tag ID   Tag Name                             Writable
   ------   --------                             --------
-  'chap'   ChapterList                          N
+  'chap'   ChapterListTrackID                   N
+  'mpod'   ElementaryStreamTrack                N
   'tmcd'   TimeCode                             N
 
 =head3 QuickTime UserData Tags
@@ -17891,6 +19160,7 @@ multi-language user data tags found, even if they don't exist in this table.
 
   Tag ID       Tag Name                         Writable
   ------       --------                         --------
+  '@sec'       SamsungSec                       Samsung sec
   'AllF'       PlayAllFrames                    N
   'CNCV'       CompressorVersion                N
   'CNFV'       FirmwareVersion                  N
@@ -17911,6 +19181,8 @@ multi-language user data tags found, even if they don't exist in this table.
   'PXMN'       MakerNotePentax5b                Pentax
   'PXTH'       PentaxPreview                    Pentax PXTH
   'QVMI'       CasioQVMI                        EXIF
+  'RMKN'       RicohRMKN                        EXIF
+  'RTHU'       PreviewImage                     N
   'SDLN'       PlayMode                         N
   'SelO'       PlaySelection                    N
   'TAGS'       FujiFilmTags                     FujiFilm MOV
@@ -17932,12 +19204,21 @@ multi-language user data tags found, even if they don't exist in this table.
   'Xtra'       MicrosoftXtra                    Microsoft Xtra
   'albm'       Album                            N
   'albr'       AlbumArtist                      N
+  'angl'       CameraAngle                      N
+  'apmd'       ApertureMode                     N
   'auth'       Author                           N
   'ccid'       ContentID                        N
   'cdis'       ContentDistributorID             N
+  'chpl'       ChapterList                      N
+  'clfn'       ClipFileName                     N
+  'clid'       ClipID                           N
   'clsf'       Classification                   N
+  'cmid'       CameraID                         N
+  'cmnm'       Model                            N
+  'coll'       CollectionName                   N
   'cprt'       Copyright                        N
   'cvru'       CoverURI                         N
+  'date'       DateTimeOriginal                 N
   'dscp'       Description                      N
   'gnre'       Genre                            N
   'hinf'       HintTrackInfo                    QuickTime HintTrackInfo
@@ -17945,19 +19226,30 @@ multi-language user data tags found, even if they don't exist in this table.
   'hnti'       HintInfo                         QuickTime HintInfo
   'icnu'       IconURI                          N
   'infu'       InfoURL                          N
+  'kgtt'       TrackType                        N
   'kywd'       Keywords                         N
   'loci'       LocationInformation              N
   'lrcu'       LyricsURI                        N
+  'manu'       Make                             N
   'meta'       Meta                             QuickTime Meta
   'modl'       Model                            N
   'name'       Name                             N
   'perf'       Performer                        N
   'ptv '       PrintToVideo                     QuickTime Video
+  'reel'       ReelName                         N
   'rtng'       Rating                           N
+  'scen'       Scene                            N
   'scrn'       OlympusPreview                   Olympus scrn
+  'shot'       ShotName                         N
+  'slno'       SerialNumber                     N
+  'smta'       SamsungSmta                      Samsung smta
   'thmb'       MakerNotePentax5a                Pentax
                OlympusThumbnail                 Olympus thmb
+               ThumbnailImage                   N
+               ThumbnailPNG                     N
+               UnknownThumbnail                 N
   'titl'       Title                            N
+  'urat'       UserRating                       N
   'vndr'       Vendor                           N
   'yrrc'       Year                             N
   "\xa9ART"    Artist                           N
@@ -18067,7 +19359,7 @@ multi-language user data tags found, even if they don't exist in this table.
 
   Index2   Tag Name                             Writable
   ------   --------                             --------
-      0    PreviewDate                          N
+      0    PreviewDate                          int32u
       2    PreviewVersion                       N
       3    PreviewAtomType                      N
       5    PreviewAtomIndex                     N
@@ -19195,7 +20487,7 @@ because they are bulky 16-byte binary values.
   BroadcastRegion                               N
   NatureOfPersonality                           N
   ContributionStatus                            N
-  SupportorAdministrationStatus                 N
+  SupportOrAdministrationStatus                 N
   OrganizationKind                              N
   ProductionOrganizationRole                    N
   SupportOrganizationRole                       N
@@ -20412,6 +21704,7 @@ video.
 
   Tag ID               Tag Name                 Writable
   ------               --------                 --------
+  'EXIF'               EXIF                     EXIF
   'JUNK'               OlympusJunk              Olympus AVI
                        CasioJunk                EXIF
                        RicohJunk                Ricoh AVI
@@ -20746,77 +22039,18 @@ formatting of this table.
   --------                                      --------
   ExtendedStreamProps                           N
   AdvancedContentEncryption                     N
-  MetadataLibrary                               ASF Metadata
+  MetadataLibrary                               ASF ExtendedDescr
   TimecodeIndexParms                            N
   Compatibility                                 N
   LanguageList                                  N
   AdvancedMutualExcl                            N
   BandwidthSharing                              N
   Reserved1                                     N
-  Metadata                                      ASF Metadata
+  Metadata                                      ASF ExtendedDescr
   GroupMutualExclusion                          N
   StreamPrioritization                          N
   IndexParameters                               N
 
-=head3 ASF Metadata Tags
-
-  Tag Name                                      Writable
-  --------                                      --------
-  [no tags known]
-
-=head3 ASF ContentDescr Tags
-
-  Tag Name                                      Writable
-  --------                                      --------
-  Title                                         N
-  Author                                        N
-  Copyright                                     N
-  Description                                   N
-  Rating                                        N
-
-=head3 ASF CodecList Tags
-
-  Tag Name                                      Writable
-  --------                                      --------
-  AudioCodecDescription                         N
-  AudioCodecName                                N
-  OtherCodecDescription                         N
-  OtherCodecName                                N
-  VideoCodecDescription                         N
-  VideoCodecName                                N
-
-=head3 ASF FileProperties Tags
-
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-      0    FileID                               N
-     16    FileLength                           N
-     24    CreationDate                         N
-     32    DataPackets                          N
-     40    PlayDuration                         N
-     48    SendDuration                         N
-     56    Preroll                              N
-     64    Flags                                N
-     68    MinPacketSize                        N
-     72    MaxPacketSize                        N
-     76    MaxBitrate                           N
-
-=head3 ASF StreamProperties Tags
-
-Tags with index 54 and greater are conditional based on the StreamType.
-
-  Index1   Tag Name                             Writable
-  ------   --------                             --------
-      0    StreamType                           N
-     16    ErrorCorrectionType                  N
-     32    TimeOffset                           N
-     48    StreamNumber                         N
-     54    AudioCodecID                         N
-           ImageWidth                           N
-     56    AudioChannels                        N
-     58    AudioSampleRate                      N
-           ImageHeight                          N
-
 =head3 ASF ExtendedDescr Tags
 
   Tag Name                                      Writable
@@ -20987,6 +22221,59 @@ Tags with index 54 and greater are conditional based on the StreamType.
   PictureDescription                            N
   Picture                                       N
 
+=head3 ASF ContentDescr Tags
+
+  Tag Name                                      Writable
+  --------                                      --------
+  Title                                         N
+  Author                                        N
+  Copyright                                     N
+  Description                                   N
+  Rating                                        N
+
+=head3 ASF CodecList Tags
+
+  Tag Name                                      Writable
+  --------                                      --------
+  AudioCodecDescription                         N
+  AudioCodecName                                N
+  OtherCodecDescription                         N
+  OtherCodecName                                N
+  VideoCodecDescription                         N
+  VideoCodecName                                N
+
+=head3 ASF FileProperties Tags
+
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    FileID                               N
+     16    FileLength                           N
+     24    CreationDate                         N
+     32    DataPackets                          N
+     40    PlayDuration                         N
+     48    SendDuration                         N
+     56    Preroll                              N
+     64    Flags                                N
+     68    MinPacketSize                        N
+     72    MaxPacketSize                        N
+     76    MaxBitrate                           N
+
+=head3 ASF StreamProperties Tags
+
+Tags with index 54 and greater are conditional based on the StreamType.
+
+  Index1   Tag Name                             Writable
+  ------   --------                             --------
+      0    StreamType                           N
+     16    ErrorCorrectionType                  N
+     32    TimeOffset                           N
+     48    StreamNumber                         N
+     54    AudioCodecID                         N
+           ImageWidth                           N
+     56    AudioChannels                        N
+     58    AudioSampleRate                      N
+           ImageHeight                          N
+
 =head2 DICOM Tags
 
 The DICOM format is based on the ACR-NEMA specification, but adds a file
@@ -24311,6 +25598,60 @@ Tags written by Microsoft Office applications.
   ------               --------                 --------
   'objecttype'         ObjectType               N
 
+=head2 Torrent Tags
+
+Below are tags commonly found in BitTorrent files.  As well as these tags,
+any other existing tags will be extracted.  For convenience, list items are
+expanded into individual tags with an index in the tag name, but only the
+tags with index "1" are listed in the tables below.  See
+L<https://wiki.theory.org/BitTorrentSpecification> for the BitTorrent
+specification.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'announce'           Announce                 N
+  'announce-list'      AnnounceList1            N
+  'comment'            Comment                  N
+  'created by'         Creator                  N
+  'creation date'      CreateDate               N
+  'encoding'           Encoding                 N
+  'info'               Info                     Torrent Info
+  'url-list'           URLList1                 N
+
+=head3 Torrent Info Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'file-duration'      File1Duration            N
+  'file-media'         File1Media               N
+  'files'              Files                    Torrent Files
+  'length'             Length                   N
+  'md5sum'             MD5Sum                   N
+  'name'               Name                     N
+  'name.utf-8'         NameUTF-8                N
+  'piece length'       PieceLength              N
+  'pieces'             Pieces                   N
+  'private'            Private                  N
+  'profiles'           Profiles                 Torrent Profiles
+
+=head3 Torrent Files Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'length'             File1Length              N
+  'md5sum'             File1MD5Sum              N
+  'path'               File1Path                N
+  'path.utf-8'         File1PathUTF-8           N
+
+=head3 Torrent Profiles Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'acodec' Profile1AudioCodec                   N
+  'height' Profile1Height                       N
+  'vcodec' Profile1VideoCodec                   N
+  'width'  Profile1Width                        N
+
 =head2 EXE Tags
 
 This module extracts information from various types of Windows, MacOS and
@@ -24910,6 +26251,7 @@ be written without modifying the file itself.
   PreviewImage               File               Y
   PreviewPNG                 File               N
   PreviewWMF                 File               N
+  ProcessingTime             ExifTool           N
   RAFVersion                 File               N
   ResourceForkSize           System             N
   Warning                    ExifTool           N
@@ -24921,13 +26263,15 @@ be written without modifying the file itself.
 
 The values of the composite tags are B<Derived From> the values of other
 tags.  These are convenience tags which are calculated after all other
-information is extracted.  User-defined Composite tags, useful for
-custom-formatting of tag values, may created in the ExifTool configuration
-file.
+information is extracted.  Only a few of these tags are writable directly,
+the others are changed by writing the corresponding B<Derived From> tags.
+User-defined Composite tags, useful for custom-formatting of tag values, may
+created in the ExifTool configuration file.
 
   Tag Name             Derived From             Writable
   --------             ------------             --------
-  AdvancedSceneMode    SceneMode                N
+  AdvancedSceneMode    Model                    N
+                       SceneMode
                        AdvancedSceneType
   Aperture             FNumber                  N
                        ApertureValue
@@ -25078,6 +26422,7 @@ file.
                        LensModel
                        LensFocalRange
                        LensSpec
+                       LensType2
   LensID               XMP-aux:LensID           N
                        Make
                        LensInfo
@@ -25103,6 +26448,7 @@ file.
   OriginalDecisionData OriginalDecisionDataOffset Y!
   OtherImage           OtherImageStart          Y
                        OtherImageLength
+  PeakSpectralSensitivity FLIR:PlanckB          N
   PreviewImage         PreviewImageStart        Y
                        PreviewImageLength
                        PreviewImageValid
@@ -25126,6 +26472,8 @@ file.
                        FlashBits
   Rotation             QuickTime:MatrixStructure N
                        QuickTime:HandlerType
+  RunTimeSincePowerUp  Apple:RunTimeValue       N
+                       Apple:RunTimeScale
   ScaleFactor35efl     FocalLength              N
                        FocalLengthIn35mmFormat
                        Composite:DigitalZoom
@@ -25240,6 +26588,10 @@ for more details.
                        DriveMode
                        OwnerName
                        SerialNumber
+  ColorSpaceTags       ExifIFD:ColorSpace       Y
+                       ExifIFD:Gamma
+                       InteropIFD:InteropIndex
+                       ICC_Profile
   Common               FileName                 Y
                        FileSize
                        Model
@@ -25270,6 +26622,7 @@ for more details.
                        IFD0:XPKeywords
                        IFD0:XPSubject
   MakerNotes           MakerNotes               Y
+                       MakerNoteApple
                        MakerNoteCanon
                        MakerNoteCasio
                        MakerNoteCasio2
@@ -25296,6 +26649,7 @@ for more details.
                        MakerNoteKodak7
                        MakerNoteKodak8a
                        MakerNoteKodak8b
+                       MakerNoteKodak8c
                        MakerNoteKodak9
                        MakerNoteKodak10
                        MakerNoteKodakUnknown
@@ -25337,6 +26691,7 @@ for more details.
                        MakerNoteSony2
                        MakerNoteSony3
                        MakerNoteSony4
+                       MakerNoteSony5
                        MakerNoteSonyEricsson
                        MakerNoteSonySRF
                        MakerNoteUnknownText
@@ -25433,6 +26788,7 @@ implements this policy and changes EXIF:Artist to a list-type tag.
   --------             ------------             --------
   City                 IPTC:City                Y
                        XMP-photoshop:City
+                       XMP-iptcExt:LocationShownCity
                        CurrentIPTCDigest
                        IPTCDigest
   Copyright            EXIF:Copyright           Y
@@ -25442,6 +26798,7 @@ implements this policy and changes EXIF:Artist to a list-type tag.
                        IPTCDigest
   Country              IPTC:Country-PrimaryLocationName Y
                        XMP-photoshop:Country
+                       XMP-iptcExt:LocationShownCountryName
                        CurrentIPTCDigest
                        IPTCDigest
   CreateDate           EXIF:CreateDate          Y
@@ -25474,6 +26831,7 @@ implements this policy and changes EXIF:Artist to a list-type tag.
                        IPTCDigest
   Location             IPTC:Sub-location        Y
                        XMP-iptcCore:Location
+                       XMP-iptcExt:LocationShownSublocation
                        CurrentIPTCDigest
                        IPTCDigest
   ModifyDate           EXIF:ModifyDate          Y
@@ -25485,6 +26843,7 @@ implements this policy and changes EXIF:Artist to a list-type tag.
   Rating               XMP-xmp:Rating           Y
   State                IPTC:Province-State      Y
                        XMP-photoshop:State
+                       XMP-iptcExt:LocationShownProvinceState
                        CurrentIPTCDigest
                        IPTCDigest
 
@@ -25497,7 +26856,7 @@ L<http://www.metadataworkinggroup.org/> for the official specification.
 
   Tag Name                                      Writable
   --------                                      --------
-  RegionInfo                                    RegionInfo Struct
+  RegionInfo                                    MWG RegionInfo Struct
   RegionAppliedToDimensions                     Dimensions Struct_
   RegionAppliedToDimensionsH                    real_
   RegionAppliedToDimensionsUnit                 string_
@@ -25518,7 +26877,7 @@ L<http://www.metadataworkinggroup.org/> for the official specification.
   RegionSeeAlso                                 string_+
   RegionType                                    string_+
 
-=head3 XMP RegionInfo Struct
+=head3 MWG RegionInfo Struct
 
   Field Name                                    Writable
   ----------                                    --------
@@ -25573,7 +26932,7 @@ L<http://www.metadataworkinggroup.org/> for the official specification.
 
   Tag Name                                      Writable
   --------                                      --------
-  KeywordInfo                                   KeywordInfo Struct
+  KeywordInfo                                   MWG KeywordInfo Struct
   HierarchicalKeywords                          MWG KeywordStruct Struct_+
   HierarchicalKeywords1Applied                  boolean_+
   HierarchicalKeywords1Children                 MWG KeywordStruct Struct_+
@@ -25593,7 +26952,7 @@ L<http://www.metadataworkinggroup.org/> for the official specification.
   HierarchicalKeywords2                         string_+
   HierarchicalKeywords1                         string_+
 
-=head3 XMP KeywordInfo Struct
+=head3 MWG KeywordInfo Struct
 
   Field Name                                    Writable
   ----------                                    --------
@@ -25615,11 +26974,11 @@ L<http://www.metadataworkinggroup.org/> for the official specification.
 
   Tag Name                                      Writable
   --------                                      --------
-  Collections                                   CollectionInfo Struct+
+  Collections                                   MWG CollectionInfo Struct+
   CollectionName                                string_+
   CollectionURI                                 string_+
 
-=head3 XMP CollectionInfo Struct
+=head3 MWG CollectionInfo Struct
 
   Field Name                                    Writable
   ----------                                    --------
@@ -25633,7 +26992,7 @@ L<Image::ExifTool::BuildTagLookup|Image::ExifTool::BuildTagLookup>.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -122,7 +122,7 @@ information from Theora video streams.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -0,0 +1,317 @@
+#------------------------------------------------------------------------------
+# File:         Torrent.pm
+#
+# Description:  Read information from BitTorrent file
+#
+# Revisions:    2013/08/27 - P. Harvey Created
+#
+# References:   1) https://wiki.theory.org/BitTorrentSpecification
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Torrent;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.02';
+
+sub ReadBencode($$);
+sub ExtractTags($$$;$$@);
+
+# tags extracted from BitTorrent files
+%Image::ExifTool::Torrent::Main = (
+    GROUPS => { 2 => 'Document' },
+    NOTES => q{
+        Below are tags commonly found in BitTorrent files.  As well as these tags,
+        any other existing tags will be extracted.  For convenience, list items are
+        expanded into individual tags with an index in the tag name, but only the
+        tags with index "1" are listed in the tables below.  See
+        L<https://wiki.theory.org/BitTorrentSpecification> for the BitTorrent
+        specification.
+    },
+    'announce'      => { },
+    'announce-list' => { Name => 'AnnounceList1' },
+    'comment'       => { },
+    'created by'    => { Name => 'Creator' }, # software used to create the torrent
+    'creation date' => {
+        Name => 'CreateDate',
+        Groups => { 2 => 'Time' },
+        ValueConv => 'ConvertUnixTime($val,1)',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    'encoding'      => { },
+    'info'          => { SubDirectory => { TagTable => 'Image::ExifTool::Torrent::Info' } },
+    'url-list'      => { Name => 'URLList1' },
+);
+
+%Image::ExifTool::Torrent::Info = (
+    GROUPS => { 2 => 'Document' },
+    'file-duration' => { Name => 'File1Duration' },
+    'file-media'    => { Name => 'File1Media' },
+    'files'         => { SubDirectory => { TagTable => 'Image::ExifTool::Torrent::Files' } },
+    'length'        => { },
+    'md5sum'        => { Name => 'MD5Sum' },
+    'name'          => { },
+    'name.utf-8'    => { Name => 'NameUTF-8' },
+    'piece length'  => { Name => 'PieceLength' },
+    'pieces'        => {
+        Name => 'Pieces',
+        Notes => 'concatenation of 20-byte SHA-1 digests for each piece',
+    },
+    'private'       => { },
+    'profiles'      => { SubDirectory => { TagTable => 'Image::ExifTool::Torrent::Profiles' } },
+);
+
+%Image::ExifTool::Torrent::Profiles = (
+    GROUPS => { 2 => 'Document' },
+    'width'         => { Name => 'Profile1Width' },
+    'height'        => { Name => 'Profile1Height' },
+    'acodec'        => { Name => 'Profile1AudioCodec' },
+    'vcodec'        => { Name => 'Profile1VideoCodec' },
+);
+
+%Image::ExifTool::Torrent::Files = (
+    GROUPS => { 2 => 'Document' },
+    'length'        => { Name => 'File1Length', PrintConv => 'ConvertFileSize($val)' },
+    'md5sum'        => { Name => 'File1MD5Sum'  },
+    'path'          => { Name => 'File1Path', JoinPath => 1 },
+    'path.utf-8'    => { Name => 'File1PathUTF-8', JoinPath => 1 },
+);
+
+#------------------------------------------------------------------------------
+# Read 64kB more data into buffer
+# Inputs: 0) RAF ref, 1) buffer ref
+# Returns: number of bytes read
+# Notes: Sets BencodeEOF element of RAF on end of file
+sub ReadMore($$)
+{
+    my ($raf, $dataPt) = @_;
+    my $buf2;
+    my $n = $raf->Read($buf2, 65536);
+    $$raf{BencodeEOF} = 1 if $n != 65536;
+    $$dataPt = substr($$dataPt, pos($$dataPt)) . $buf2 if $n;
+    return $n;
+}
+
+#------------------------------------------------------------------------------
+# Read bencoded value
+# Inputs: 0) input file, 1) buffer (pos must be set to current position)
+# Returns: HASH ref, ARRAY ref, SCALAR ref, SCALAR, or undef on error or end of data
+# Notes: Sets BencodeError element of RAF on any error
+sub ReadBencode($$)
+{
+    my ($raf, $dataPt) = @_;
+
+    # read more if necessary (keep a minimum of 64 bytes in the buffer)
+    my $pos = pos($$dataPt);
+    return undef unless defined $pos;
+    my $remaining = length($$dataPt) - $pos;
+    ReadMore($raf, $dataPt) if $remaining < 64 and not $$raf{BencodeEOF};
+
+    # read next token
+    $$dataPt =~ /(.)/sg or return undef;
+    
+    my $val;
+    my $tok = $1;
+    if ($tok eq 'i') {      # integer
+        $$dataPt =~ /\G(-?\d+)e/g or return $val;
+        $val = $1;
+    } elsif ($tok eq 'd') { # dictionary
+        $val = { };
+        for (;;) {
+            my $k = ReadBencode($raf, $dataPt);
+            last unless defined $k;
+            # the key must be a byte string
+            if (ref $k) {
+                ref $k ne 'SCALAR' and $$raf{BencodeError} = 'Bad dictionary key', last;
+                $k = $$k;
+            }
+            my $v = ReadBencode($raf, $dataPt);
+            last unless defined $v;
+            $$val{$k} = $v;
+        }
+    } elsif ($tok eq 'l') { # list
+        $val = [ ];
+        for (;;) {
+            my $v = ReadBencode($raf, $dataPt);
+            last unless defined $v;
+            push @$val, $v;
+        }
+    } elsif ($tok eq 'e') { # end of dictionary or list
+        # return undef (no error)
+    } elsif ($tok =~ /^\d$/ and $$dataPt =~ /\G(\d*):/g) { # byte string
+        my $len = $tok . $1;
+        my $more = $len - (length($$dataPt) - pos($$dataPt));
+        my $value;
+        if ($more <= 0) {
+            $value = substr($$dataPt,pos($$dataPt),$len);
+            pos($$dataPt) = pos($$dataPt) + $len;
+        } elsif ($more > 10000000) {
+            # just skip over really long values
+            $val = \ "(Binary data $len bytes)" if $raf->Seek($more, 1);
+        } else {
+            # need to read more from file
+            my $buff;
+            my $n = $raf->Read($buff, $more);
+            if ($n == $more) {
+                $value = substr($$dataPt,pos($$dataPt)) . $buff;
+                $$dataPt = '';
+                pos($$dataPt) = 0;
+            }
+        }
+        if (defined $value) {
+            # return as binary data unless it is a reasonable-length ASCII string
+            if (length($value) > 256 or $value =~ /[^\t\x20-\x7e]/) {
+                $val = \$value;
+            } else {
+                $val = $value;
+            }
+        } elsif (not defined $val) {
+            $$raf{BencodeError} = 'Truncated byte string';
+        }
+    } else {
+        $$raf{BencodeError} = 'Bad format';
+    }
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Extract tags from dictionary hash
+# Inputs: 0) ExifTool ref, 1) dictionary hash reference, 2) tag table ref,
+#         3) parent hash ID, 4) parent hash name, 5-N) list indices
+# Returns: number of tags extracted
+sub ExtractTags($$$;$$@)
+{
+    my ($et, $hashPtr, $tagTablePtr, $baseID, $baseName, @index) = @_;
+    my $count = 0;
+    my $tag;
+    foreach $tag (sort keys %$hashPtr) {
+        my $val = $$hashPtr{$tag};
+        my ($i, $j, @more);
+        for (; defined $val; $val = shift @more) {
+            my $id = defined $baseID ? "$baseID/$tag" : $tag;
+            unless ($$tagTablePtr{$id}) {
+                my $name = ucfirst $tag;
+                # capitalize all words in tag name and remove illegal characters
+                $name =~ s/[^-_a-zA-Z0-9]+(.?)/\U$1/g;
+                $name = "Tag$name" if length($name) < 2 or $name !~ /^[A-Z]/;
+                $name = $baseName . $name if defined $baseName; # add base name if necessary
+                AddTagToTable($tagTablePtr, $id, { Name => $name });
+                $et->VPrint(0, "  [adding $id '$name']\n");
+            }
+            my $tagInfo = $et->GetTagInfo($tagTablePtr, $id) or next;
+            if (ref $val eq 'ARRAY') {
+                if ($$tagInfo{JoinPath}) {
+                    $val = join '/', @$val;
+                } else {
+                    push @more, @$val;
+                    next if ref $more[0] eq 'ARRAY'; # continue expanding nested lists
+                    $val = shift @more;
+                    $i or $i = 0, push(@index, $i);
+                }
+            }
+            $index[-1] = ++$i if defined $i;
+            if (@index) {
+                $id .= join '_', @index;  # add instance number(s) to tag ID
+                unless ($$tagTablePtr{$id}) {
+                    my $name = $$tagInfo{Name};
+                    # embed indices at position of '1' in tag name
+                    my $n = ($name =~ tr/1/#/);
+                    for ($j=0; $j<$n; ++$j) {
+                        my $idx = $index[$j] || '';
+                        $name =~ s/#/$idx/;
+                    }
+                    # put remaining indices at end of tag name
+                    for (; $j<@index; ++$j) {
+                        $name .= '_' if $name =~ /\d$/;
+                        $name .= $index[$j];
+                    }
+                    AddTagToTable($tagTablePtr, $id, { %$tagInfo, Name => $name });
+                }
+                $tagInfo = $et->GetTagInfo($tagTablePtr, $id) or next;
+            }
+            if (ref $val eq 'HASH') {
+                # extract tags from this dictionary
+                my ($table, $rootID, $rootName);
+                if ($$tagInfo{SubDirectory}) {
+                    $table = GetTagTable($$tagInfo{SubDirectory}{TagTable});
+                } else {
+                    $table = $tagTablePtr;
+                    # use hash ID and Name as base for contained tags to avoid conflicts
+                    $rootID = $id;
+                    $rootName = $$tagInfo{Name};
+                }
+                $count += ExtractTags($et, $val, $table, $rootID, $rootName, @index);
+            } else {
+                # handle this simple tag value
+                $et->HandleTag($tagTablePtr, $id, $val);
+                ++$count;
+            }
+        }
+        pop @index if defined $i;
+    }
+    return $count;
+}
+
+#------------------------------------------------------------------------------
+# Process BitTorrent file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference (with RAF set)
+# Returns: 1 on success, 0 if this wasn't a valid BitTorrent file
+sub ProcessTorrent($$)
+{
+    my ($et, $dirInfo) = @_;
+    my $success = 0;
+    my $raf = $$dirInfo{RAF};
+    my $buff = '';
+    pos($buff) = 0;
+    my $dict = ReadBencode($raf, \$buff);
+    my $err = $$raf{BencodeError};
+    $et->Warn("Bencode error: $err") if $err;
+    if (ref $dict eq 'HASH' and $$dict{announce}) {
+        $et->SetFileType('TORRENT');
+        my $tagTablePtr = GetTagTable('Image::ExifTool::Torrent::Main');
+        ExtractTags($et, $dict, $tagTablePtr) and $success = 1;
+    }
+    return $success;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Torrent - Read information from BitTorrent file
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to read
+bencoded information from BitTorrent files.
+
+=head1 AUTHOR
+
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<https://wiki.theory.org/BitTorrentSpecification>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Torrent Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
@@ -53,7 +53,7 @@ unknown manufacturers.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -17,7 +17,7 @@ use strict;
 use vars qw($VERSION);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.06';
+$VERSION = '1.07';
 
 sub ProcessComments($$$);
 
@@ -139,7 +139,7 @@ Image::ExifTool::AddCompositeTags('Image::ExifTool::Vorbis');
 # Returns: 1 on success, otherwise returns 0 and sets a Warning
 sub ProcessComments($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my $dataPos = $$dirInfo{DataPos};
     my $pos = $$dirInfo{DirStart} || 0;
@@ -165,7 +165,7 @@ sub ProcessComments($$$)
             $tag = 'vendor';
             $val = $buff;
             $num = ($pos + 4 < $end) ? Get32u($dataPt, $pos) : 0;
-            $exifTool->VPrint(0, "  + [Vorbis comments with $num entries]\n");
+            $et->VPrint(0, "  + [Vorbis comments with $num entries]\n");
             $pos += 4;
         }
         # add tag to table unless it exists already
@@ -176,7 +176,7 @@ sub ProcessComments($$$)
             $name =~ s/([a-z0-9])_([a-z])/$1\U$2/g;
             AddTagToTable($tagTablePtr, $tag, { Name => $name });
         }
-        $exifTool->HandleTag($tagTablePtr, $tag, $exifTool->Decode($val, 'UTF8'),
+        $et->HandleTag($tagTablePtr, $tag, $et->Decode($val, 'UTF8'),
             Index   => $index,
             DataPt  => $dataPt,
             DataPos => $dataPos,
@@ -187,7 +187,7 @@ sub ProcessComments($$$)
         $num-- or return 1;
         $index = (defined $index) ? $index + 1 : 0;
     }
-    $exifTool->Warn('Format error in Vorbis comments');
+    $et->Warn('Format error in Vorbis comments');
     return 0;
 }
 
@@ -210,7 +210,7 @@ information from Ogg Vorbis audio headers.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -60,8 +60,8 @@ my %mapRotation = (
 # Inputs: 0) ExifTool object reference
 sub InitMakerNotes($)
 {
-    my $exifTool = shift;
-    $exifTool->{MAKER_NOTE_INFO} = {
+    my $et = shift;
+    $$et{MAKER_NOTE_INFO} = {
         Entries => { },     # directory entries keyed by tagID
         ValBuff => "\0\0\0\0", # value data buffer (start with zero nextIFD pointer)
         FixupTags => { },   # flags for tags with data in value buffer
@@ -76,7 +76,7 @@ sub InitMakerNotes($)
 # file, which isn't sequential (but Canon's version isn't sequential either...)
 sub BuildMakerNotes($$$$$$)
 {
-    my ($exifTool, $rawTag, $tagInfo, $valuePt, $formName, $count) = @_;
+    my ($et, $rawTag, $tagInfo, $valuePt, $formName, $count) = @_;
 
     my $tagID = $mapRawTag{$rawTag} || return;
     $formName or warn(sprintf "No format for tag 0x%x!\n",$rawTag), return;
@@ -100,7 +100,7 @@ sub BuildMakerNotes($$$$$$)
         $value = $$valuePt;
     }
     my $offsetVal;
-    my $makerInfo = $exifTool->{MAKER_NOTE_INFO};
+    my $makerInfo = $$et{MAKER_NOTE_INFO};
     if ($size > 4) {
         my $len = length $makerInfo->{ValBuff};
         $offsetVal = Set32u($len);
@@ -122,10 +122,10 @@ sub BuildMakerNotes($$$$$$)
 # Inputs: 0) ExifTool object reference
 sub SaveMakerNotes($)
 {
-    my $exifTool = shift;
+    my $et = shift;
     # save maker notes
-    my $makerInfo = $exifTool->{MAKER_NOTE_INFO};
-    delete $exifTool->{MAKER_NOTE_INFO};
+    my $makerInfo = $$et{MAKER_NOTE_INFO};
+    delete $$et{MAKER_NOTE_INFO};
     my $dirEntries = $makerInfo->{Entries};
     my $numEntries = scalar(keys %$dirEntries);
     my $fixup = new Image::ExifTool::Fixup;
@@ -142,24 +142,24 @@ sub SaveMakerNotes($)
     }
     # save position of maker notes for pointer fixups
     $fixup->{Shift} += length($makerNotes);
-    $exifTool->{MAKER_NOTE_FIXUP} = $fixup;
-    $exifTool->{MAKER_NOTE_BYTE_ORDER} = GetByteOrder();
+    $$et{MAKER_NOTE_FIXUP} = $fixup;
+    $$et{MAKER_NOTE_BYTE_ORDER} = GetByteOrder();
     # add value data
     $makerNotes .= $makerInfo->{ValBuff};
     # get MakerNotes tag info
     my $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::Exif::Main');
-    my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, 0x927c, \$makerNotes);
+    my $tagInfo = $et->GetTagInfo($tagTablePtr, 0x927c, \$makerNotes);
     # save the MakerNotes
-    $exifTool->FoundTag($tagInfo, $makerNotes);
+    $et->FoundTag($tagInfo, $makerNotes);
     # save the garbage collection some work later
     delete $makerInfo->{Entries};
     delete $makerInfo->{ValBuff};
     delete $makerInfo->{FixupTags};
     # also generate Orientation tag since Rotation isn't transferred from RAW info
-    my $rotation = $exifTool->GetValue('Rotation', 'ValueConv');
+    my $rotation = $et->GetValue('Rotation', 'ValueConv');
     if (defined $rotation and defined $mapRotation{$rotation}) {
-        $tagInfo = $exifTool->GetTagInfo($tagTablePtr, 0x112);
-        $exifTool->FoundTag($tagInfo, $mapRotation{$rotation});
+        $tagInfo = $et->GetTagInfo($tagTablePtr, 0x112);
+        $et->FoundTag($tagInfo, $mapRotation{$rotation});
     }
 }
 
@@ -170,10 +170,10 @@ sub SaveMakerNotes($)
 # Returns: error string or undef (and may change value) on success
 sub CheckCanonRaw($$$)
 {
-    my ($exifTool, $tagInfo, $valPtr) = @_;
+    my ($et, $tagInfo, $valPtr) = @_;
     my $tagName = $$tagInfo{Name};
     if ($tagName eq 'JpgFromRaw' or $tagName eq 'ThumbnailImage') {
-        unless ($$valPtr =~ /^\xff\xd8/ or $exifTool->Options('IgnoreMinorErrors')) {
+        unless ($$valPtr =~ /^\xff\xd8/ or $et->Options('IgnoreMinorErrors')) {
             return '[minor] Not a valid image';
         }
     } else {
@@ -195,7 +195,7 @@ sub CheckCanonRaw($$$)
 # Returns: true on success
 sub WriteCR2($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt} or return 0;
     my $outfile = $$dirInfo{OutFile} or return 0;
     $$dirInfo{RAF} or return 0;
@@ -211,15 +211,15 @@ sub WriteCR2($$$)
         } else {
             $msg = 'Unrecognized Canon RAW file';
         }
-        return 0 if $exifTool->Error($msg, $minor);
+        return 0 if $et->Error($msg, $minor);
     }
 
     # CR2 has a 16-byte header
     $$dirInfo{NewDataPos} = 16;
-    my $newData = $exifTool->WriteDirectory($dirInfo, $tagTablePtr);
+    my $newData = $et->WriteDirectory($dirInfo, $tagTablePtr);
     return 0 unless defined $newData;
     unless ($$dirInfo{LastIFD}) {
-        $exifTool->Error("CR2 image IFD may not be deleted");
+        $et->Error("CR2 image IFD may not be deleted");
         return 0;
     }
 
@@ -235,7 +235,7 @@ sub WriteCR2($$$)
 
         # copy over image data now if necessary
         if (ref $$dirInfo{ImageData}) {
-            $exifTool->CopyImageData($$dirInfo{ImageData}, $outfile) or return 0;
+            $et->CopyImageData($$dirInfo{ImageData}, $outfile) or return 0;
             delete $$dirInfo{ImageData};
         }
     }
@@ -255,16 +255,16 @@ sub WriteCR2($$$)
 # OutFile on the fly --> much faster, efficient, and less demanding on memory!
 sub WriteCanonRaw($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    $exifTool or return 1;    # allow dummy access to autoload this package
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    $et or return 1;    # allow dummy access to autoload this package
     my $blockStart = $$dirInfo{DirStart};
     my $blockSize = $$dirInfo{DirLen};
     my $raf = $$dirInfo{RAF} or return 0;
     my $outfile = $$dirInfo{OutFile} or return 0;
     my $outPos = $$dirInfo{OutPos} or return 0;
     my $outBase = $outPos;
-    my $verbose = $exifTool->Options('Verbose');
-    my $out = $exifTool->Options('TextOut');
+    my $verbose = $et->Options('Verbose');
+    my $out = $et->Options('TextOut');
     my ($buff, $tagInfo);
 
     # 4 bytes at end of block give directory position within block
@@ -279,7 +279,7 @@ sub WriteCanonRaw($$$)
     my $newDir = '';
 
     # get hash of new information keyed by tagID
-    my $newTags = $exifTool->GetNewTagInfoHash($tagTablePtr);
+    my $newTags = $et->GetNewTagInfoHash($tagTablePtr);
 
     # generate list of tags to add or delete (currently, we only allow JpgFromRaw
     # and ThumbnailImage, to be added or deleted from the root CanonRaw directory)
@@ -307,7 +307,7 @@ sub WriteCanonRaw($$$)
         if (@addTags and (not defined($tag) or $tag >= $addTags[0])) {
             my $addTag = shift @addTags;
             $tagInfo = $$newTags{$addTag};
-            my $newVal = $exifTool->GetNewValues($tagInfo);
+            my $newVal = $et->GetNewValues($tagInfo);
             if (defined $newVal) {
                 # pad value to an even length (Canon ImageBrowser and ZoomBrowser
                 # version 6.1.1 have problems with odd-sized embedded JPEG images
@@ -321,7 +321,7 @@ sub WriteCanonRaw($$$)
                 Write($outfile, $newVal) or return 0;
                 $outPos += length($newVal);     # update current position
                 $verbose > 1 and print $out "    + CanonRaw:$$tagInfo{Name}\n";
-                ++$exifTool->{CHANGED};
+                ++$$et{CHANGED};
             }
             # set flag to delete this tag if found later
             $delTag{$addTag} = 1;
@@ -332,7 +332,7 @@ sub WriteCanonRaw($$$)
         my $tagType = ($tag >> 8) & 0x38;   # get tag type
         my $valueInDir = ($tag & 0x4000);   # flag for value in directory
 
-        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr,$tagID);
+        my $tagInfo = $et->GetTagInfo($tagTablePtr,$tagID);
         my $format = $crwTagFormat{$tagType};
         my ($count, $subdir);
         if ($tagInfo) {
@@ -363,7 +363,7 @@ sub WriteCanonRaw($$$)
                     OutFile  => $outfile,
                     OutPos   => $outPos,
                 );
-                my $result = $exifTool->WriteDirectory(\%subdirInfo, $tagTablePtr);
+                my $result = $et->WriteDirectory(\%subdirInfo, $tagTablePtr);
                 return 0 unless $result;
                 # set size and pointer for this new directory
                 $size = $subdirInfo{OutPos} - $outPos;
@@ -406,9 +406,9 @@ sub WriteCanonRaw($$$)
                 );
                 #### eval Validate ($dirData, $subdirStart, $size)
                 if (defined $$subdir{Validate} and not eval $$subdir{Validate}) {
-                    $exifTool->Warn("Invalid $name data");
+                    $et->Warn("Invalid $name data");
                 } else {
-                    $subdir = $exifTool->WriteDirectory(\%subdirInfo, $newTagTable);
+                    $subdir = $et->WriteDirectory(\%subdirInfo, $newTagTable);
                     if (defined $subdir and length $subdir) {
                         if ($subdirStart) {
                             # add header before data directory
@@ -421,7 +421,7 @@ sub WriteCanonRaw($$$)
             } elsif ($$newTags{$tagID}) {
                 if ($delTag{$tagID}) {
                     $verbose > 1 and print $out "    - CanonRaw:$$tagInfo{Name}\n";
-                    ++$exifTool->{CHANGED};
+                    ++$$et{CHANGED};
                     next;   # next since we already added this tag
                 }
                 my $oldVal;
@@ -430,9 +430,9 @@ sub WriteCanonRaw($$$)
                 } else {
                     $oldVal = $value;
                 }
-                my $nvHash = $exifTool->GetNewValueHash($tagInfo);
-                if ($exifTool->IsOverwriting($nvHash, $oldVal)) {
-                    my $newVal = $exifTool->GetNewValues($nvHash);
+                my $nvHash = $et->GetNewValueHash($tagInfo);
+                if ($et->IsOverwriting($nvHash, $oldVal)) {
+                    my $newVal = $et->GetNewValues($nvHash);
                     my $verboseVal;
                     $verboseVal = $newVal if $verbose > 1;
                     # convert to specified format if necessary
@@ -441,9 +441,9 @@ sub WriteCanonRaw($$$)
                     }
                     if (defined $newVal) {
                         $value = $newVal;
-                        ++$exifTool->{CHANGED};
-                        $exifTool->VerboseValue("- CanonRaw:$$tagInfo{Name}", $oldVal);
-                        $exifTool->VerboseValue("+ CanonRaw:$$tagInfo{Name}", $verboseVal);
+                        ++$$et{CHANGED};
+                        $et->VerboseValue("- CanonRaw:$$tagInfo{Name}", $oldVal);
+                        $et->VerboseValue("+ CanonRaw:$$tagInfo{Name}", $verboseVal);
                     }
                 }
             }
@@ -505,7 +505,7 @@ sub WriteCanonRaw($$$)
 #          or -1 if a write error occurred
 sub WriteCRW($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $outfile = $$dirInfo{OutFile};
     my $raf = $$dirInfo{RAF};
     my $rtnVal = 0;
@@ -519,18 +519,18 @@ sub WriteCRW($$)
     my $type = $1;
     my $hlen = Get32u(\$buff, 0);   # get header length
 
-    if ($exifTool->{DEL_GROUP}->{MakerNotes}) {
+    if ($$et{DEL_GROUP}{MakerNotes}) {
         if ($type eq 'CCDR') {
-            $exifTool->Error("Can't delete MakerNotes group in CRW file");
+            $et->Error("Can't delete MakerNotes group in CRW file");
             return 0;
         } else {
-            ++$exifTool->{CHANGED};
+            ++$$et{CHANGED};
             return 1;
         }
     }
     # make XMP the preferred group for CRW files
-    if ($$exifTool{FILE_TYPE} eq 'CRW') {
-        $exifTool->InitWriteDirs(\%crwMap, 'XMP');
+    if ($$et{FILE_TYPE} eq 'CRW') {
+        $et->InitWriteDirs(\%crwMap, 'XMP');
     }
 
     # write header
@@ -554,7 +554,7 @@ sub WriteCRW($$)
     );
     # process the raw directory
     my $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::CanonRaw::Main');
-    my $success = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr);
+    my $success = $et->WriteDirectory(\%dirInfo, $tagTablePtr);
 
     my $trailPt;
     while ($success) {
@@ -563,7 +563,7 @@ sub WriteCRW($$)
         # rewrite the trailer(s)
         $buff = '';
         $$trailInfo{OutFile} = \$buff;
-        $success = $exifTool->ProcessTrailers($trailInfo) or last;
+        $success = $et->ProcessTrailers($trailInfo) or last;
         $trailPt = $$trailInfo{OutFile};
         # nothing to write if trailers were deleted
         undef $trailPt if length($$trailPt) < 4;
@@ -571,13 +571,13 @@ sub WriteCRW($$)
     }
     if ($success) {
         # add CanonVRD trailer if writing as a block
-        $trailPt = $exifTool->AddNewTrailers($trailPt,'CanonVRD');
-        if (not $trailPt and $$exifTool{ADD_DIRS}{CanonVRD}) {
+        $trailPt = $et->AddNewTrailers($trailPt,'CanonVRD');
+        if (not $trailPt and $$et{ADD_DIRS}{CanonVRD}) {
             # create CanonVRD from scratch if necessary
             my $outbuff = '';
             my $saveOrder = GetByteOrder();
             require Image::ExifTool::CanonVRD;
-            if (Image::ExifTool::CanonVRD::ProcessCanonVRD($exifTool, { OutFile => \$outbuff }) > 0) {
+            if (Image::ExifTool::CanonVRD::ProcessCanonVRD($et, { OutFile => \$outbuff }) > 0) {
                 $trailPt = \$outbuff;
             }
             SetByteOrder($saveOrder);
@@ -592,7 +592,7 @@ sub WriteCRW($$)
         }
         $rtnVal = $err ? -1 : 1;
     } else {
-        $exifTool->Error('Error rewriting CRW file');
+        $et->Error('Error rewriting CRW file');
     }
     return $rtnVal;
 }
@@ -623,7 +623,7 @@ files, and would lead to far fewer problems with corrupted metadata.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -371,6 +371,37 @@ my %writeTable = (
         Writable => 'string',
         WriteGroup => 'IFD0',
     },
+    0x87af => {             # GeoTiffDirectory
+        Writable => 'undef',
+        WriteGroup => 'IFD0',
+        # swap byte order if necessary
+        RawConvInv => q{
+            return $val if length $val < 2;
+            my $order = substr($val, -2);
+            return $val unless $order eq 'II' or $order eq 'MM';
+            $val = substr($val, 0, -2);
+            return $val if $order eq GetByteOrder();
+            return pack('v*',unpack('n*',$val));
+        },
+    },
+    0x87b0 => {             # GeoTiffDoubleParams
+        Writable => 'undef',
+        WriteGroup => 'IFD0',
+        # swap byte order if necessary
+        RawConvInv => q{
+            return $val if length $val < 2;
+            my $order = substr($val, -2);
+            return $val unless $order eq 'II' or $order eq 'MM';
+            $val = substr($val, 0, -2);
+            return $val if $order eq GetByteOrder();
+            $val =~ s/(.{4})(.{4})/$2$1/sg; # swap words
+            return pack('V*',unpack('N*',$val));
+        },
+    },
+    0x87b1 => {             # GeoTiffAsciiParams
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+    },
     0x8822 => 'int16u',     # ExposureProgram
     0x8824 => 'string',     # SpectralSensitivity
     0x8827 => {             # ISO
@@ -1154,7 +1185,7 @@ my %writeTable = (
         Avoid => 1,
         PSRaw => 1,
         Writable => 'string',
-        ValueConv => '$val=~s/.*: //;$val',
+        ValueConv => '$val=~s/^.*: //;$val',
         ValueConvInv => q{"Owner's Name: $val"},
         Notes => q{
             tags 0xfde8-0xfdea and 0xfe4c-0xfe58 are generated by Photoshop Camera RAW.
@@ -1168,7 +1199,7 @@ my %writeTable = (
         Avoid => 1,
         PSRaw => 1,
         Writable => 'string',
-        ValueConv => '$val=~s/.*: //;$val',
+        ValueConv => '$val=~s/^.*: //;$val',
         ValueConvInv => q{"Serial Number: $val"},
     },
     0xfdea => {
@@ -1177,7 +1208,7 @@ my %writeTable = (
         Avoid => 1,
         PSRaw => 1,
         Writable => 'string',
-        ValueConv => '$val=~s/.*: //;$val',
+        ValueConv => '$val=~s/^.*: //;$val',
         ValueConvInv => q{"Lens: $val"},
     },
     0xfe4c => {
@@ -1185,7 +1216,7 @@ my %writeTable = (
         Avoid => 1,
         PSRaw => 1,
         Writable => 'string',
-        ValueConv => '$val=~s/.*: //;$val',
+        ValueConv => '$val=~s/^.*: //;$val',
         ValueConvInv => q{"Raw File: $val"},
     },
     0xfe4d => {
@@ -1193,7 +1224,7 @@ my %writeTable = (
         Avoid => 1,
         PSRaw => 1,
         Writable => 'string',
-        ValueConv => '$val=~s/.*: //;$val',
+        ValueConv => '$val=~s/^.*: //;$val',
         ValueConvInv => q{"Converter: $val"},
     },
     0xfe4e => {
@@ -1201,7 +1232,7 @@ my %writeTable = (
         Avoid => 1,
         PSRaw => 1,
         Writable => 'string',
-        ValueConv => '$val=~s/.*: //;$val',
+        ValueConv => '$val=~s/^.*: //;$val',
         ValueConvInv => q{"White Balance: $val"},
     },
     0xfe51 => {
@@ -1209,7 +1240,7 @@ my %writeTable = (
         Avoid => 1,
         PSRaw => 1,
         Writable => 'string',
-        ValueConv => '$val=~s/.*: //;$val',
+        ValueConv => '$val=~s/^.*: //;$val',
         ValueConvInv => q{"Exposure: $val"},
     },
     0xfe52 => {
@@ -1217,7 +1248,7 @@ my %writeTable = (
         Avoid => 1,
         PSRaw => 1,
         Writable => 'string',
-        ValueConv => '$val=~s/.*: //;$val',
+        ValueConv => '$val=~s/^.*: //;$val',
         ValueConvInv => q{"Shadows: $val"},
     },
     0xfe53 => {
@@ -1225,7 +1256,7 @@ my %writeTable = (
         Avoid => 1,
         PSRaw => 1,
         Writable => 'string',
-        ValueConv => '$val=~s/.*: //;$val',
+        ValueConv => '$val=~s/^.*: //;$val',
         ValueConvInv => q{"Brightness: $val"},
     },
     0xfe54 => {
@@ -1233,7 +1264,7 @@ my %writeTable = (
         Avoid => 1,
         PSRaw => 1,
         Writable => 'string',
-        ValueConv => '$val=~s/.*: //;$val',
+        ValueConv => '$val=~s/^.*: //;$val',
         ValueConvInv => q{"Contrast: $val"},
     },
     0xfe55 => {
@@ -1241,7 +1272,7 @@ my %writeTable = (
         Avoid => 1,
         PSRaw => 1,
         Writable => 'string',
-        ValueConv => '$val=~s/.*: //;$val',
+        ValueConv => '$val=~s/^.*: //;$val',
         ValueConvInv => q{"Saturation: $val"},
     },
     0xfe56 => {
@@ -1249,7 +1280,7 @@ my %writeTable = (
         Avoid => 1,
         PSRaw => 1,
         Writable => 'string',
-        ValueConv => '$val=~s/.*: //;$val',
+        ValueConv => '$val=~s/^.*: //;$val',
         ValueConvInv => q{"Sharpness: $val"},
     },
     0xfe57 => {
@@ -1257,7 +1288,7 @@ my %writeTable = (
         Avoid => 1,
         PSRaw => 1,
         Writable => 'string',
-        ValueConv => '$val=~s/.*: //;$val',
+        ValueConv => '$val=~s/^.*: //;$val',
         ValueConvInv => q{"Smoothness: $val"},
     },
     0xfe58 => {
@@ -1265,7 +1296,7 @@ my %writeTable = (
         Avoid => 1,
         PSRaw => 1,
         Writable => 'string',
-        ValueConv => '$val=~s/.*: //;$val',
+        ValueConv => '$val=~s/^.*: //;$val',
         ValueConvInv => q{"Moire Filter: $val"},
     },
 );
@@ -1318,10 +1349,10 @@ sub GetCFAPattern($)
 # Returns: error string or undef (and possibly changes value) on success
 sub CheckExif($$$)
 {
-    my ($exifTool, $tagInfo, $valPtr) = @_;
-    my $format = $$tagInfo{Format} || $$tagInfo{Writable} || $tagInfo->{Table}{WRITABLE};
+    my ($et, $tagInfo, $valPtr) = @_;
+    my $format = $$tagInfo{Format} || $$tagInfo{Writable} || $$tagInfo{Table}{WRITABLE};
     if (not $format or $format eq '1') {
-        if ($tagInfo->{Groups}{0} eq 'MakerNotes') {
+        if ($$tagInfo{Groups}{0} eq 'MakerNotes') {
             return undef;   # OK to have no format for makernotes
         } else {
             return 'No writable format';
@@ -1337,11 +1368,11 @@ sub CheckExif($$$)
 # Note: MUST be called Raw conversion time so the EXIF byte order is known!
 sub EncodeExifText($$)
 {
-    my ($exifTool, $val) = @_;
+    my ($et, $val) = @_;
     # does the string contain special characters?
     if ($val =~ /[\x80-\xff]/) {
-        my $order = $exifTool->GetNewValues('ExifUnicodeByteOrder');
-        return "UNICODE\0" . $exifTool->Encode($val,'UCS2',$order);
+        my $order = $et->GetNewValues('ExifUnicodeByteOrder');
+        return "UNICODE\0" . $et->Encode($val,'UTF16',$order);
     } else {
         return "ASCII\0\0\0$val";
     }
@@ -1355,7 +1386,7 @@ sub InsertWritableProperties($$;$)
 {
     my ($tagTablePtr, $writeTablePtr, $checkProc) = @_;
     my $tag;
-    $checkProc and $tagTablePtr->{CHECK_PROC} = $checkProc;
+    $checkProc and $$tagTablePtr{CHECK_PROC} = $checkProc;
     foreach $tag (keys %$writeTablePtr) {
         my $writeInfo = $$writeTablePtr{$tag};
         my @infoList = GetTagInfoList($tagTablePtr, $tag);
@@ -1384,7 +1415,7 @@ sub InsertWritableProperties($$;$)
 # Returns: new maker note data (and creates MAKER_NOTE_FIXUP), or undef on error
 sub RebuildMakerNotes($$$)
 {
-    my ($exifTool, $tagTablePtr, $dirInfo) = @_;
+    my ($et, $tagTablePtr, $dirInfo) = @_;
     my $dirStart = $$dirInfo{DirStart};
     my $dirLen = $$dirInfo{DirLen};
     my $dataPt = $$dirInfo{DataPt};
@@ -1392,7 +1423,7 @@ sub RebuildMakerNotes($$$)
     my $rtnValue;
     my %subdirInfo = %$dirInfo;
 
-    delete $exifTool->{MAKER_NOTE_FIXUP};
+    delete $$et{MAKER_NOTE_FIXUP};
 
     # don't need to rebuild text, BinaryData or PreviewImage maker notes
     my $tagInfo = $$dirInfo{TagInfo};
@@ -1406,67 +1437,74 @@ sub RebuildMakerNotes($$$)
         return substr($$dataPt, $dirStart, $dirLen);
     }
     my $saveOrder = GetByteOrder();
-    my $loc = Image::ExifTool::MakerNotes::LocateIFD($exifTool,\%subdirInfo);
+    my $loc = Image::ExifTool::MakerNotes::LocateIFD($et,\%subdirInfo);
     if (defined $loc) {
         my $makerFixup = $subdirInfo{Fixup} = new Image::ExifTool::Fixup;
         # create new exiftool object to rewrite the directory without changing it
         my $newTool = new Image::ExifTool;
         $newTool->Options(
-            IgnoreMinorErrors => $$exifTool{OPTIONS}{IgnoreMinorErrors},
-            FixBase           => $$exifTool{OPTIONS}{FixBase},
+            IgnoreMinorErrors => $$et{OPTIONS}{IgnoreMinorErrors},
+            FixBase           => $$et{OPTIONS}{FixBase},
         );
         $newTool->Init();   # must do this before calling WriteDirectory()!
         # don't copy over preview image
         $newTool->SetNewValue(PreviewImage => '');
         # copy all transient members over in case they are used for writing
         # (Make, Model, etc)
-        foreach (grep /[a-z]/, keys %$exifTool) {
-            $$newTool{$_} = $$exifTool{$_};
+        foreach (grep /[a-z]/, keys %$et) {
+            $$newTool{$_} = $$et{$_};
         }
         # fix base offsets if specified
-        $newTool->Options(FixBase => $exifTool->Options('FixBase'));
+        $newTool->Options(FixBase => $et->Options('FixBase'));
         # set GENERATE_PREVIEW_INFO flag so PREVIEW_INFO will be generated
-        $newTool->{GENERATE_PREVIEW_INFO} = 1;
+        $$newTool{GENERATE_PREVIEW_INFO} = 1;
         # drop any large tags
-        $newTool->{DROP_TAGS} = 1;
+        $$newTool{DROP_TAGS} = 1;
         # initialize other necessary data members
-        $newTool->{FILE_TYPE} = $exifTool->{FILE_TYPE};
-        $newTool->{TIFF_TYPE} = $exifTool->{TIFF_TYPE};
+        $$newTool{FILE_TYPE} = $$et{FILE_TYPE};
+        $$newTool{TIFF_TYPE} = $$et{TIFF_TYPE};
         # rewrite maker notes
         $rtnValue = $newTool->WriteDirectory(\%subdirInfo, $tagTablePtr);
         if (defined $rtnValue and length $rtnValue) {
             # add the dummy/empty preview image if necessary
-            if ($newTool->{PREVIEW_INFO}) {
+            if ($$newTool{PREVIEW_INFO}) {
                 $makerFixup->SetMarkerPointers(\$rtnValue, 'PreviewImage', length($rtnValue));
-                $rtnValue .= $newTool->{PREVIEW_INFO}{Data};
-                delete $newTool->{PREVIEW_INFO};
+                $rtnValue .= $$newTool{PREVIEW_INFO}{Data};
+                delete $$newTool{PREVIEW_INFO};
             }
             # add makernote header
             if ($loc) {
                 my $hdr = substr($$dataPt, $dirStart, $loc);
                 # special case: convert Pentax/Samsung DNG maker notes to JPEG style
-                # (in JPEG, Pentax makernotes are absolute and start with "AOC\0")
-                if ($hdr =~ s/^(PENTAX |SAMSUNG)\0/AOC\0/) {
-                    # save fixup so we will adjust to absolute offsets when writing
-                    $exifTool->{MAKER_NOTE_FIXUP} = $makerFixup;
+                # (in JPEG, Pentax makernotes are absolute and start with "AOC\0" for some
+                # models, but in DNG images they are stored in tag 0xc634 of IFD0 and
+                # start with either "PENTAX \0" or "SAMSUNG\0")
+                if ($$dirInfo{Parent} eq 'IFD0' and $hdr =~ /^(PENTAX |SAMSUNG)\0/) {
+                    # convert to JPEG-style AOC maker notes if used by this model
+                    # (Note: this expression also appears in Exif.pm)
+                    if ($$et{Model} =~ /\b(K(-[57mrx]|(10|20|100|110|200)D|2000)|GX(10|20))\b/) {
+                        $hdr =~ s/^(PENTAX |SAMSUNG)\0/AOC\0/;
+                        # save fixup because AOC maker notes have absolute offsets
+                        $$et{MAKER_NOTE_FIXUP} = $makerFixup;
+                    }
                 }
                 $rtnValue = $hdr . $rtnValue;
                 # adjust fixup for shift in start position
-                $makerFixup->{Start} += length $hdr;
+                $$makerFixup{Start} += length $hdr;
             }
             # shift offsets according to original position of maker notes,
             # and relative to the makernotes Base
-            $makerFixup->{Shift} += $dataPos + $dirStart +
-                                    $$dirInfo{Base} - $subdirInfo{Base};
+            $$makerFixup{Shift} += $dataPos + $dirStart +
+                                   $$dirInfo{Base} - $subdirInfo{Base};
             # repair incorrect offsets if offsets were fixed
-            $makerFixup->{Shift} += $subdirInfo{FixedBy} || 0;
+            $$makerFixup{Shift} += $subdirInfo{FixedBy} || 0;
             # fix up pointers to the specified offset
             $makerFixup->ApplyFixup(\$rtnValue);
             # save fixup information unless offsets were relative
             unless ($subdirInfo{Relative}) {
                 # set shift so offsets are all relative to start of maker notes
-                $makerFixup->{Shift} -= $dataPos + $dirStart;
-                $exifTool->{MAKER_NOTE_FIXUP} = $makerFixup;    # save fixup for later
+                $$makerFixup{Shift} -= $dataPos + $dirStart;
+                $$et{MAKER_NOTE_FIXUP} = $makerFixup;    # save fixup for later
             }
         }
     }
@@ -1575,11 +1613,11 @@ sub GetOffList($$$$$)
 # Inputs: 0) ExifTool ref, 1) end of valid TIFF data
 sub UpdateTiffEnd($$)
 {
-    my ($exifTool, $end) = @_;
-    if (defined $exifTool->{TIFF_END} and
-        $exifTool->{TIFF_END} < $end)
+    my ($et, $end) = @_;
+    if (defined $$et{TIFF_END} and
+        $$et{TIFF_END} < $end)
     {
-        $exifTool->{TIFF_END} = $end;
+        $$et{TIFF_END} = $end;
     }
 }
 
@@ -1589,14 +1627,14 @@ sub UpdateTiffEnd($$)
 # Returns: undef on fatal error, or '' if minor error is ignored
 sub ExifErr($$$)
 {
-    my ($exifTool, $errStr, $tagTablePtr) = @_;
+    my ($et, $errStr, $tagTablePtr) = @_;
     # MakerNote errors are minor by default
-    my $minor = ($tagTablePtr->{GROUPS}{0} eq 'MakerNotes');
-    if ($tagTablePtr->{VARS} and $tagTablePtr->{VARS}{MINOR_ERRORS}) {
-        $exifTool->Warn("$errStr. IFD dropped.") and return '' if $minor;
+    my $minor = ($$tagTablePtr{GROUPS}{0} eq 'MakerNotes');
+    if ($$tagTablePtr{VARS} and $$tagTablePtr{VARS}{MINOR_ERRORS}) {
+        $et->Warn("$errStr. IFD dropped.") and return '' if $minor;
         $minor = 1;
     }
-    return undef if $exifTool->Error($errStr, $minor);
+    return undef if $et->Error($errStr, $minor);
     return '';
 }
 
@@ -1607,12 +1645,12 @@ sub ExifErr($$$)
 #          Writing: new data block or undef on error
 sub ProcessTiffIFD($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    $exifTool or return 1;    # allow dummy access
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    $et or return 1;    # allow dummy access
     my $raf = $$dirInfo{RAF};
     my $base = $$dirInfo{Base} || 0;
     my $dirName = $$dirInfo{DirName};
-    my $magic = $dirInfo->{Subdir}{Magic} || 0x002a;
+    my $magic = $$dirInfo{Subdir}{Magic} || 0x002a;
     my $buff;
 
     # structured with a TIFF-like header and relative offsets
@@ -1620,10 +1658,10 @@ sub ProcessTiffIFD($$$)
     unless (SetByteOrder(substr($buff,0,2)) and Get16u(\$buff, 2) == $magic) {
         my $msg = "Invalid $dirName header";
         if ($$dirInfo{IsWriting}) {
-            $exifTool->Error($msg);
+            $et->Error($msg);
             return undef;
         } else {
-            $exifTool->Warn($msg);
+            $et->Warn($msg);
             return 0;
         }
     }
@@ -1642,19 +1680,19 @@ sub ProcessTiffIFD($$$)
     );
     if ($$dirInfo{IsWriting}) {
         # rewrite the Camera Profile IFD
-        my $newDir = WriteExif($exifTool, \%dirInfo, $tagTablePtr);
+        my $newDir = WriteExif($et, \%dirInfo, $tagTablePtr);
         # don't add header if error writing directory ($newDir is undef)
         # or if directory is being deleted ($newDir is empty)
         return $newDir unless $newDir;
         # return directory with TIFF-like header
         return GetByteOrder() . Set16u($magic) . Set32u(8) . $newDir;
     }
-    if ($exifTool->{HTML_DUMP}) {
+    if ($$et{HTML_DUMP}) {
         my $tip = sprintf("Byte order: %s endian\nIdentifier: 0x%.4x\n%s offset: 0x%.4x",
                           (GetByteOrder() eq 'II') ? 'Little' : 'Big', $magic, $dirName, $offset);
-        $exifTool->HDump($base, 8, "$dirName header", $tip, 0);
+        $et->HDump($base, 8, "$dirName header", $tip, 0);
     }
-    return ProcessExif($exifTool, \%dirInfo, $tagTablePtr);
+    return ProcessExif($et, \%dirInfo, $tagTablePtr);
 }
 
 #------------------------------------------------------------------------------
@@ -1671,8 +1709,8 @@ sub ProcessTiffIFD($$$)
 #   5. Thumbnail and/or image data for each IFD, with IFD0 image last
 sub WriteExif($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    $exifTool or return 1;      # allow dummy access to autoload this package
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    $et or return 1;      # allow dummy access to autoload this package
     my $origDirInfo = $dirInfo; # save original dirInfo
     my $dataPt = $$dirInfo{DataPt};
     unless ($dataPt) {
@@ -1689,8 +1727,8 @@ sub WriteExif($$$)
     my $dirName = $$dirInfo{DirName} || 'unknown';
     my $fixup = $$dirInfo{Fixup} || new Image::ExifTool::Fixup;
     my $imageDataFlag = $$dirInfo{ImageData} || '';
-    my $verbose = $exifTool->Options('Verbose');
-    my $out = $exifTool->Options('TextOut');
+    my $verbose = $et->Options('Verbose');
+    my $out = $et->Options('TextOut');
     my ($nextIfdPos, %offsetData, $inMakerNotes);
     my (@offsetInfo, %xDelete, $strEnc);
     my $deleteAll = 0;
@@ -1700,11 +1738,11 @@ sub WriteExif($$$)
     $name = $dirName unless $name and $dirName eq 'MakerNotes' and $name !~ /^MakerNote/;
 
     # set encoding for strings
-    $strEnc = $exifTool->Options('CharsetEXIF') if $$tagTablePtr{GROUPS}{0} eq 'EXIF';
+    $strEnc = $et->Options('CharsetEXIF') if $$tagTablePtr{GROUPS}{0} eq 'EXIF';
 
     # allow multiple IFD's in IFD0-IFD1-IFD2... chain
     $$dirInfo{Multi} = 1 if $dirName =~ /^(IFD0|SubIFD)$/ and not defined $$dirInfo{Multi};
-    $inMakerNotes = 1 if $tagTablePtr->{GROUPS}{0} eq 'MakerNotes';
+    $inMakerNotes = 1 if $$tagTablePtr{GROUPS}{0} eq 'MakerNotes';
     my $ifd;
 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # loop through each IFD
@@ -1729,12 +1767,12 @@ sub WriteExif($$$)
                 my $offset = $dirStart + $dataPos;
                 my ($buff, $buf2);
                 unless ($raf->Seek($offset + $base, 0) and $raf->Read($buff,2) == 2) {
-                    return ExifErr($exifTool, "Bad IFD or truncated file in $name", $tagTablePtr);
+                    return ExifErr($et, "Bad IFD or truncated file in $name", $tagTablePtr);
                 }
                 my $len = 12 * Get16u(\$buff,0);
                 # (also read next IFD pointer if available)
                 unless ($raf->Read($buf2, $len+4) >= $len) {
-                    return ExifErr($exifTool, "Error reading $name", $tagTablePtr);
+                    return ExifErr($et, "Error reading $name", $tagTablePtr);
                 }
                 $buff .= $buf2;
                 # make copy of dirInfo since we're going to modify it
@@ -1748,12 +1786,12 @@ sub WriteExif($$$)
                 $dirLen = $$dirInfo{DirLen} = $dataLen;
                 # only account for nextIFD pointer if we are going to use it
                 $len += 4 if $dataLen==$len+6 and ($$dirInfo{Multi} or $buff =~ /\0{4}$/);
-                UpdateTiffEnd($exifTool, $offset+$base+2+$len);
+                UpdateTiffEnd($et, $offset+$base+2+$len);
             } elsif ($dirLen) {
                 # error if we can't load IFD (unless we are creating
                 # from scratch, in which case dirLen will be zero)
-                my $str = $exifTool->Options('IgnoreMinorErrors') ? 'Deleted bad' : 'Bad';
-                $exifTool->Error("$str $name directory", 1);
+                my $str = $et->Options('IgnoreMinorErrors') ? 'Deleted bad' : 'Bad';
+                $et->Error("$str $name directory", 1);
             }
         }
         my ($index, $dirEnd, $numEntries);
@@ -1761,7 +1799,7 @@ sub WriteExif($$$)
             $numEntries = Get16u($dataPt, $dirStart);
             $dirEnd = $dirStart + 2 + 12 * $numEntries;
             if ($dirEnd > $dataLen) {
-                return ExifErr($exifTool, "Truncated $name directory", $tagTablePtr);
+                return ExifErr($et, "Truncated $name directory", $tagTablePtr);
             }
             # sort entries if necessary (but not in maker notes IFDs)
             unless ($inMakerNotes) {
@@ -1771,7 +1809,7 @@ sub WriteExif($$$)
                     # check for proper sequence (but ignore null entries at end)
                     if ($tagID < $lastID and $tagID) {
                         SortIFD($dataPt, $dirStart, $numEntries);
-                        $exifTool->Warn("Entries in $name were out of sequence. Fixed.",1);
+                        $et->Warn("Entries in $name were out of sequence. Fixed.",1);
                         last;
                     }
                     $lastID = $tagID;
@@ -1785,14 +1823,14 @@ sub WriteExif($$$)
         # loop through new values and accumulate all information for this IFD
         my (%set, %mayDelete, $tagInfo);
         my $wrongDir = $crossDelete{$dirName};
-        foreach $tagInfo ($exifTool->GetNewTagInfoList($tagTablePtr)) {
+        foreach $tagInfo ($et->GetNewTagInfoList($tagTablePtr)) {
             my $tagID = $$tagInfo{TagID};
             # evaluate conditional lists now if necessary
-            if (ref $tagTablePtr->{$tagID} eq 'ARRAY' or $$tagInfo{Condition}) {
-                my $curInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID);
+            if (ref $$tagTablePtr{$tagID} eq 'ARRAY' or $$tagInfo{Condition}) {
+                my $curInfo = $et->GetTagInfo($tagTablePtr, $tagID);
                 if (defined $curInfo and not $curInfo) {
                     # need value to evaluate the condition
-                    my ($val) = $exifTool->GetNewValues($tagInfo);
+                    my ($val) = $et->GetNewValues($tagInfo);
                     # must convert to binary for evaluating in Condition
                     if ($$tagInfo{Format} and defined $val) {
                         $val = WriteValue($val, $$tagInfo{Format}, $$tagInfo{Count});
@@ -1815,7 +1853,7 @@ sub WriteExif($$$)
                                 }
                             }
                         }
-                        $curInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID, \$val, $fmt, $cnt);
+                        $curInfo = $et->GetTagInfo($tagTablePtr, $tagID, \$val, $fmt, $cnt);
                     } else {
                         # may want to delete this, but we need to see the value first
                         $mayDelete{$tagID} = 1;
@@ -1825,25 +1863,25 @@ sub WriteExif($$$)
                 next unless defined $curInfo and $curInfo eq $tagInfo;
             }
             if ($$tagInfo{WriteCondition}) {
-                my $self = $exifTool;   # set $self to be used in eval
+                my $self = $et;   # set $self to be used in eval
                 #### eval WriteCondition ($self)
                 unless (eval $$tagInfo{WriteCondition}) {
                     $@ and warn $@;
                     next;
                 }
             }
-            my $nvHash = $exifTool->GetNewValueHash($tagInfo, $dirName);
+            my $nvHash = $et->GetNewValueHash($tagInfo, $dirName);
             unless ($nvHash) {
                 next unless $wrongDir;
                 # delete stuff from the wrong directory if setting somewhere else
-                $nvHash = $exifTool->GetNewValueHash($tagInfo, $wrongDir);
+                $nvHash = $et->GetNewValueHash($tagInfo, $wrongDir);
                 # don't cross delete if not overwriting
-                next unless $exifTool->IsOverwriting($nvHash);
+                next unless $et->IsOverwriting($nvHash);
                 # don't cross delete if specifically deleting from the other directory
                 # (Note: don't call GetValue() here because it shouldn't be called
                 #  if IsOverwriting returns < 0 -- ie. when shifting)
-                next if not defined $$nvHash{Value} and $nvHash->{WantGroup} and
-                        lc($nvHash->{WantGroup}) eq lc($wrongDir);
+                next if not defined $$nvHash{Value} and $$nvHash{WantGroup} and
+                        lc($$nvHash{WantGroup}) eq lc($wrongDir);
                 # remove this tag if found in this IFD
                 $xDelete{$tagID} = 1;
             }
@@ -1856,7 +1894,7 @@ sub WriteExif($$$)
                 if ($tagID == 0x927c and $dirName =~ /^(ExifIFD|IFD0)$/) {
                     next if $$tagInfo{Name} eq 'PreviewImage';
                 } else {
-                    $exifTool->Warn(sprintf("Multiple new values for $name tag 0x%.4x",$tagID));
+                    $et->Warn(sprintf("Multiple new values for $name tag 0x%.4x",$tagID));
                 }
             }
             $set{$tagID} = $tagInfo;
@@ -1864,8 +1902,8 @@ sub WriteExif($$$)
         
         # fix base offsets (some cameras incorrectly write maker notes in IFD0)
         if ($dirName eq 'MakerNotes' and $$dirInfo{Parent} =~ /^(ExifIFD|IFD0)$/ and
-            $$exifTool{TIFF_TYPE} !~ /^(ARW|SR2)$/ and not $$exifTool{LeicaTrailerPos} and
-            Image::ExifTool::MakerNotes::FixBase($exifTool, $dirInfo))
+            $$et{TIFF_TYPE} !~ /^(ARW|SR2)$/ and not $$et{LeicaTrailerPos} and
+            Image::ExifTool::MakerNotes::FixBase($et, $dirInfo))
         {
             # update local variables from fixed values
             $base = $$dirInfo{Base};
@@ -1877,11 +1915,11 @@ sub WriteExif($$$)
         my ($allMandatory, $addMandatory);
         if ($mandatory) {
             # use X/Y resolution values from JFIF if available
-            if ($dirName eq 'IFD0' and defined $$exifTool{JFIFYResolution}) {
+            if ($dirName eq 'IFD0' and defined $$et{JFIFYResolution}) {
                 my %ifd0Vals = %$mandatory;
-                $ifd0Vals{0x011a} = $$exifTool{JFIFXResolution};
-                $ifd0Vals{0x011b} = $$exifTool{JFIFYResolution};
-                $ifd0Vals{0x0128} = $$exifTool{JFIFResolutionUnit} + 1;
+                $ifd0Vals{0x011a} = $$et{JFIFXResolution};
+                $ifd0Vals{0x011b} = $$et{JFIFYResolution};
+                $ifd0Vals{0x0128} = $$et{JFIFResolutionUnit} + 1;
                 $mandatory = \%ifd0Vals;
             }
             $allMandatory = $addMandatory = 0; # initialize to zero
@@ -1908,7 +1946,7 @@ sub WriteExif($$$)
             @newTags = sort { $a <=> $b } @newTags if @newTags > 1;
         } else {
             # get a hash of directories we will be writing in this one
-            $addDirs = $exifTool->GetAddDirHash($tagTablePtr, $dirName);
+            $addDirs = $et->GetAddDirHash($tagTablePtr, $dirName);
             # make a union of tags & dirs (can set whole dirs, like MakerNotes)
             my %allTags = ( %set, %$addDirs );
             # make sorted list of new tags to be added
@@ -1929,7 +1967,7 @@ sub WriteExif($$$)
         my $newID = -1;
 
         # patch for Canon EOS 40D firmware 1.0.4 bug (incorrect directory counts)
-        if ($inMakerNotes and $$exifTool{Model} eq 'Canon EOS 40D') {
+        if ($inMakerNotes and $$et{Model} eq 'Canon EOS 40D') {
             my $fmt = Get16u($dataPt, $dirStart + 2 + 12 * ($numEntries - 1) + 2);
             if ($fmt < 1 or $fmt > 13) {
                 # adjust the number of directory entries
@@ -1959,14 +1997,14 @@ Entry:  for (;;) {
                         # patch to preserve invalid directory entries in SubIFD3 of
                         # various Kodak Z-series cameras (Z812, Z1085IS, Z1275)
                         # and some Sony cameras such as the DSC-P10
-                        if ($dirName eq 'MakerNotes' and (($$exifTool{Make}=~/KODAK/i and
+                        if ($dirName eq 'MakerNotes' and (($$et{Make}=~/KODAK/i and
                             $$dirInfo{Name} and $$dirInfo{Name} eq 'SubIFD3') or
-                            ($numEntries == 12 and $$exifTool{Make} eq 'SONY' and $index >= 8)))
+                            ($numEntries == 12 and $$et{Make} eq 'SONY' and $index >= 8)))
                         {
                             $dirBuff .= substr($$dataPt, $entry, 12);
                             ++$index;
                             $newID = $oldID;    # we wrote this
-                            $exifTool->Warn($msg, 1);
+                            $et->Warn($msg, 1);
                             next;
                         }
                         # don't write out null directory entry
@@ -1978,7 +2016,7 @@ Entry:  for (;;) {
                             $newID = $oldID;    # pretend we wrote this
                             next;
                         }
-                        return ExifErr($exifTool, $msg, $tagTablePtr);
+                        return ExifErr($et, $msg, $tagTablePtr);
                     }
                     $readFormName = $oldFormName = $formatName[$oldFormat];
                     $valueDataPt = $dataPt;
@@ -1990,9 +2028,9 @@ Entry:  for (;;) {
                     if (ref $oldInfo ne 'HASH' or $$oldInfo{Condition}) {
                         # must get unknown tags too
                         # (necessary so we don't miss a tag we want to Drop)
-                        my $unk = $exifTool->Options(Unknown => 1);
-                        $oldInfo = $exifTool->GetTagInfo($tagTablePtr, $oldID);
-                        $exifTool->Options(Unknown => $unk);
+                        my $unk = $et->Options(Unknown => 1);
+                        $oldInfo = $et->GetTagInfo($tagTablePtr, $oldID);
+                        $et->Options(Unknown => $unk);
                     }
                     # patch incorrect count in Kodak SubIFD3 tags
                     if ($oldCount < 2 and $oldInfo and $$oldInfo{FixCount}) {
@@ -2015,9 +2053,9 @@ Entry:  for (;;) {
                             #### eval FixOffsets ($valuePtr, $valEnd, $size, $tagID, $wFlag)
                             eval $$dirInfo{FixOffsets};
                             unless (defined $valuePtr) {
-                                unless ($$exifTool{DROP_TAGS}) {
+                                unless ($$et{DROP_TAGS}) {
                                     my $tagStr = $oldInfo ? $$oldInfo{Name} : sprintf("tag 0x%.4x",$oldID);
-                                    return undef if $exifTool->Error("Bad $name offset for $tagStr", $inMakerNotes);
+                                    return undef if $et->Error("Bad $name offset for $tagStr", $inMakerNotes);
                                 }
                                 ++$index;  $oldID = $newID;  next;  # drop this tag
                             }
@@ -2026,7 +2064,7 @@ Entry:  for (;;) {
                         my $suspect = ($valuePtr < 8);
                         # convert offset to pointer in $$dataPt
                         if ($$dirInfo{EntryBased} or (ref $$tagTablePtr{$oldID} eq 'HASH' and
-                            $tagTablePtr->{$oldID}{EntryBased}))
+                            $$tagTablePtr{$oldID}{EntryBased}))
                         {
                             $valuePtr += $entry;
                         } else {
@@ -2036,18 +2074,22 @@ Entry:  for (;;) {
                         $suspect = 1 if $valuePtr < $dirEnd and $valuePtr+$oldSize > $dirStart;
                         # get value by seeking in file if we are allowed
                         if ($valuePtr < 0 or $valuePtr+$oldSize > $dataLen) {
-                            my ($pos, $tagStr, $invalidPreview, $tmpInfo);
+                            my ($pos, $tagStr, $invalidPreview, $tmpInfo, $leicaTrailer);
                             if ($oldInfo) {
                                 $tagStr = $$oldInfo{Name};
+                                $leicaTrailer = $$oldInfo{LeicaTrailer};
                             } elsif (defined $oldInfo) {
-                                $tmpInfo = $exifTool->GetTagInfo($tagTablePtr, $oldID, \ '', $oldFormName, $oldCount);
-                                $tagStr = $$tmpInfo{Name} if $tmpInfo;
+                                $tmpInfo = $et->GetTagInfo($tagTablePtr, $oldID, \ '', $oldFormName, $oldCount);
+                                if ($tmpInfo) {
+                                    $tagStr = $$tmpInfo{Name};
+                                    $leicaTrailer = $$tmpInfo{LeicaTrailer};
+                                }
                             }
                             $tagStr or $tagStr = sprintf("tag 0x%.4x",$oldID);
                             # allow PreviewImage to run outside EXIF segment in JPEG images
                             if (not $raf) {
                                 if ($tagStr eq 'PreviewImage') {
-                                    $raf = $exifTool->{RAF};
+                                    $raf = $$et{RAF};
                                     if ($raf) {
                                         $pos = $raf->Tell();
                                         if ($oldInfo and $$oldInfo{ChangeBase}) {
@@ -2059,9 +2101,9 @@ Entry:  for (;;) {
                                     } else {
                                         $invalidPreview = 1;
                                     }
-                                } elsif ($tagStr eq 'MakerNoteLeica6') {
+                                } elsif ($leicaTrailer) {
                                     # save information about Leica makernote trailer
-                                    $$exifTool{LeicaTrailer} = {
+                                    $$et{LeicaTrailer} = {
                                         TagInfo => $oldInfo || $tmpInfo,
                                         Offset  => $base + $valuePtr + $dataPos,
                                         Size    => $oldSize,
@@ -2099,16 +2141,16 @@ Entry:  for (;;) {
                                     }
                                 }
                                 unless ($success) {
-                                    return undef if $exifTool->Error("Error reading value for $name entry $index", $inMakerNotes);
+                                    return undef if $et->Error("Error reading value for $name entry $index", $inMakerNotes);
                                     ++$index;  $oldID = $newID;  next;  # drop this tag
                                 }
                             } elsif (not $invalidPreview) {
-                                return undef if $exifTool->Error("Bad $name offset for $tagStr", $inMakerNotes);
+                                return undef if $et->Error("Bad $name offset for $tagStr", $inMakerNotes);
                                 ++$index;  $oldID = $newID;  next;  # drop this tag
                             }
                             if ($invalidPreview) {
                                 # set value for invalid preview
-                                if ($exifTool->{FILE_TYPE} eq 'JPEG') {
+                                if ($$et{FILE_TYPE} eq 'JPEG') {
                                     # define dummy value for preview (or Leica MakerNote) to write later
                                     # (value must be larger than 4 bytes to generate PREVIEW_INFO,
                                     # and an even number of bytes so it won't be padded)
@@ -2119,7 +2161,7 @@ Entry:  for (;;) {
                                 }
                                 $valuePtr = 0;
                             } else {
-                                UpdateTiffEnd($exifTool, $base+$valuePtr+$dataPos+$oldSize);
+                                UpdateTiffEnd($et, $base+$valuePtr+$dataPos+$oldSize);
                             }
                             # update pointers for value just read from file
                             $valueDataPt = \$oldValue;
@@ -2132,9 +2174,9 @@ Entry:  for (;;) {
                             my $tagStr = $oldInfo ? $$oldInfo{Name} : sprintf('tag 0x%.4x', $oldID);
                             my $str = "Suspicious $name offset for $tagStr";
                             if ($inMakerNotes) {
-                                $exifTool->Warn($str, 1);
+                                $et->Warn($str, 1);
                             } else {
-                                return undef if $exifTool->Error($str, 1);
+                                return undef if $et->Error($str, 1);
                             }
                         }
                     }
@@ -2142,16 +2184,16 @@ Entry:  for (;;) {
                     $oldValue = substr($$valueDataPt, $valuePtr, $oldSize) unless $readFromFile;
                     # get tagInfo using value if necessary
                     if (defined $oldInfo and not $oldInfo) {
-                        my $unk = $exifTool->Options(Unknown => 1);
-                        $oldInfo = $exifTool->GetTagInfo($tagTablePtr, $oldID, \$oldValue, $oldFormName, $oldCount);
-                        $exifTool->Options(Unknown => $unk);
+                        my $unk = $et->Options(Unknown => 1);
+                        $oldInfo = $et->GetTagInfo($tagTablePtr, $oldID, \$oldValue, $oldFormName, $oldCount);
+                        $et->Options(Unknown => $unk);
                         # now that we have the value, we can resolve the Condition to finally
                         # determine whether we want to delete this tag or not
                         if ($mayDelete{$oldID} and $oldInfo and (not @newTags or $newTags[0] != $oldID)) {
-                            my $nvHash = $exifTool->GetNewValueHash($oldInfo, $dirName);
+                            my $nvHash = $et->GetNewValueHash($oldInfo, $dirName);
                             if (not $nvHash and $wrongDir) {
                                 # delete from wrong directory if necessary
-                                $nvHash = $exifTool->GetNewValueHash($oldInfo, $wrongDir);
+                                $nvHash = $et->GetNewValueHash($oldInfo, $wrongDir);
                                 $nvHash and $xDelete{$oldID} = 1;
                             }
                             if ($nvHash) {
@@ -2166,7 +2208,7 @@ Entry:  for (;;) {
                         (not $oldInfo or not $$oldInfo{SubIFD}))
                     {
                         my $str = sprintf('%s tag 0x%.4x IFD format not handled', $name, $oldID);
-                        $exifTool->Error($str, $inMakerNotes);
+                        $et->Error($str, $inMakerNotes);
                     }
                     # override format we use to read the value if specified
                     if ($oldInfo) {
@@ -2174,10 +2216,10 @@ Entry:  for (;;) {
                         if (($$oldInfo{IsOffset} or $$oldInfo{SubIFD}) and
                             not $intFormat{$oldFormName})
                         {
-                            $exifTool->Error("Invalid format ($oldFormName) for $name $$oldInfo{Name}", $inMakerNotes);
+                            $et->Error("Invalid format ($oldFormName) for $name $$oldInfo{Name}", $inMakerNotes);
                             ++$index;  $oldID = $newID;  next;  # drop this tag
                         }
-                        if ($$oldInfo{Drop} and $$exifTool{DROP_TAGS} and
+                        if ($$oldInfo{Drop} and $$et{DROP_TAGS} and
                             ($$oldInfo{Drop} == 1 or $$oldInfo{Drop} < $oldSize))
                         {
                             ++$index;  $oldID = $newID;  next;  # drop this tag
@@ -2197,9 +2239,9 @@ Entry:  for (;;) {
                     if ($oldID <= $lastTagID and not $inMakerNotes) {
                         my $str = $oldInfo ? "$$oldInfo{Name} tag" : sprintf('tag 0x%x',$oldID);
                         if ($oldID == $lastTagID) {
-                            $exifTool->Warn("Duplicate $str in $name");;
+                            $et->Warn("Duplicate $str in $name");;
                         } else {
-                            $exifTool->Warn("\u$str out of sequence in $name");
+                            $et->Warn("\u$str out of sequence in $name");
                         }
                     }
                     $lastTagID = $oldID;
@@ -2246,16 +2288,16 @@ Entry:  for (;;) {
                     $newInfo = $set{$newID};
                     $newCount = $$newInfo{Count};
                     my ($val, $newVal, $n);
-                    my $nvHash = $exifTool->GetNewValueHash($newInfo, $dirName);
+                    my $nvHash = $et->GetNewValueHash($newInfo, $dirName);
                     if ($isNew > 0) {
                         # don't create new entry unless requested
                         if ($nvHash) {
                             next unless $$nvHash{IsCreating};
                             if ($$newInfo{IsOverwriting}) {
                                 my $proc = $$newInfo{IsOverwriting};
-                                $isOverwriting = &$proc($exifTool, $nvHash, $val, \$newVal);
+                                $isOverwriting = &$proc($et, $nvHash, $val, \$newVal);
                             } else {
-                                $isOverwriting = $exifTool->IsOverwriting($nvHash);
+                                $isOverwriting = $et->IsOverwriting($nvHash);
                             }
                         } else {
                             next if $xDelete{$newID};       # don't create if cross deleting
@@ -2277,7 +2319,7 @@ Entry:  for (;;) {
                         $newFormat = $formatNumber{$newFormName};
                     } elsif ($nvHash or $xDelete{$newID}) {
                         unless ($nvHash) {
-                            $nvHash = $exifTool->GetNewValueHash($newInfo, $wrongDir);
+                            $nvHash = $et->GetNewValueHash($newInfo, $wrongDir);
                         }
                         # read value
                         if (length $oldValue >= $oldSize) {
@@ -2310,13 +2352,13 @@ Entry:  for (;;) {
                         }
                         if ($$newInfo{IsOverwriting}) {
                             my $proc = $$newInfo{IsOverwriting};
-                            $isOverwriting = &$proc($exifTool, $nvHash, $val, \$newVal);
+                            $isOverwriting = &$proc($et, $nvHash, $val, \$newVal);
                         } else {
-                            $isOverwriting = $exifTool->IsOverwriting($nvHash, $val);
+                            $isOverwriting = $et->IsOverwriting($nvHash, $val);
                         }
                     }
                     if ($isOverwriting) {
-                        $newVal = $exifTool->GetNewValues($nvHash) unless defined $newVal;
+                        $newVal = $et->GetNewValues($nvHash) unless defined $newVal;
                         # value undefined if deleting this tag
                         # (also delete tag if cross-deleting and this isn't a date/time shift)
                         if (not defined $newVal or ($xDelete{$newID} and not defined $$nvHash{Shift})) {
@@ -2325,8 +2367,8 @@ Entry:  for (;;) {
                                 goto NoOverwrite; # GOTO!
                             }
                             unless ($isNew) {
-                                ++$exifTool->{CHANGED};
-                                $exifTool->VerboseValue("- $dirName:$$newInfo{Name}", $val);
+                                ++$$et{CHANGED};
+                                $et->VerboseValue("- $dirName:$$newInfo{Name}", $val);
                             }
                             next;
                         }
@@ -2338,30 +2380,30 @@ Entry:  for (;;) {
                         # convert to binary format
                         $newValue = WriteValue($newVal, $newFormName, $newCount);
                         unless (defined $newValue) {
-                            $exifTool->Warn("Invalid value for $dirName:$$newInfo{Name}");
+                            $et->Warn("Invalid value for $dirName:$$newInfo{Name}");
                             goto NoOverwrite; # GOTO!
                         }
                         if (length $newValue) {
                             # limit maximum value length in JPEG images
                             # (max segment size is 65533 bytes and the min EXIF size is 96 incl an additional IFD entry)
-                            if ($$exifTool{FILE_TYPE} eq 'JPEG' and length($newValue) > 65436 and
+                            if ($$et{FILE_TYPE} eq 'JPEG' and length($newValue) > 65436 and
                                 $$newInfo{Name} ne 'PreviewImage')
                             {
                                 my $name = $$newInfo{MakerNotes} ? 'MakerNotes' : $$newInfo{Name};
-                                $exifTool->Warn("$name too large to write in JPEG segment");
+                                $et->Warn("$name too large to write in JPEG segment");
                                 goto NoOverwrite; # GOTO!
                             }
                             # re-code if necessary
                             if ($strEnc and $newFormName eq 'string') {
-                                $newValue = $exifTool->Encode($newValue, $strEnc);
+                                $newValue = $et->Encode($newValue, $strEnc);
                             }
                         } else {
-                            $exifTool->Warn("Can't write zero length $$newInfo{Name} in $tagTablePtr->{GROUPS}{1}");
+                            $et->Warn("Can't write zero length $$newInfo{Name} in $$tagTablePtr{GROUPS}{1}");
                             goto NoOverwrite; # GOTO!
                         }
                         if ($isNew >= 0) {
                             $newCount = length($newValue) / $formatSize[$newFormat];
-                            ++$exifTool->{CHANGED};
+                            ++$$et{CHANGED};
                             if (defined $allMandatory) {
                                 # not all mandatory if we are writing any tag specifically
                                 if ($nvHash) {
@@ -2372,9 +2414,9 @@ Entry:  for (;;) {
                                 }
                             }
                             if ($verbose > 1) {
-                                $exifTool->VerboseValue("- $dirName:$$newInfo{Name}", $val) unless $isNew;
+                                $et->VerboseValue("- $dirName:$$newInfo{Name}", $val) unless $isNew;
                                 my $str = $nvHash ? '' : ' (mandatory)';
-                                $exifTool->VerboseValue("+ $dirName:$$newInfo{Name}", $newVal, $str);
+                                $et->VerboseValue("+ $dirName:$$newInfo{Name}", $newVal, $str);
                             }
                         }
                     } else {
@@ -2398,8 +2440,8 @@ NoOverwrite:            next if $isNew > 0;
                     # or a SubIFD
                     next if $$newInfo{MakerNotes} or $$newInfo{Name} eq 'SubIFD';
                     my $subTable;
-                    if ($newInfo->{SubDirectory}{TagTable}) {
-                        $subTable = Image::ExifTool::GetTagTable($newInfo->{SubDirectory}{TagTable});
+                    if ($$newInfo{SubDirectory}{TagTable}) {
+                        $subTable = Image::ExifTool::GetTagTable($$newInfo{SubDirectory}{TagTable});
                     } else {
                         $subTable = $tagTablePtr;
                     }
@@ -2408,8 +2450,8 @@ NoOverwrite:            next if $isNew > 0;
                         Parent => $dirName,
                         Fixup => new Image::ExifTool::Fixup,
                     );
-                    $sourceDir{DirName} = $newInfo->{Groups}{1} if $$newInfo{SubIFD};
-                    $newValue = $exifTool->WriteDirectory(\%sourceDir, $subTable);
+                    $sourceDir{DirName} = $$newInfo{Groups}{1} if $$newInfo{SubIFD};
+                    $newValue = $et->WriteDirectory(\%sourceDir, $subTable);
                     # only add new directory if it isn't empty
                     next unless defined $newValue and length($newValue);
                     # set the fixup start location
@@ -2472,14 +2514,14 @@ NoOverwrite:            next if $isNew > 0;
                         # prefer tag from Composite table if it exists (otherwise
                         # PreviewImage data would be taken from Extra tag)
                         my $compInfo = $Image::ExifTool::Composite{$dataTag};
-                        $offsetData{$dataTag} = $exifTool->GetNewValues($compInfo || $dataTag);
+                        $offsetData{$dataTag} = $et->GetNewValues($compInfo || $dataTag);
                         my $err;
                         if (defined $offsetData{$dataTag}) {
                             my $len = length $offsetData{$dataTag};
                             if ($dataTag eq 'PreviewImage') {
                                 # must set DEL_PREVIEW flag now if preview fit into IFD
-                                $$exifTool{DEL_PREVIEW} = 1 if $len <= 4;
-                            } elsif ($exifTool->{FILE_TYPE} eq 'JPEG' and $len > 60000) {
+                                $$et{DEL_PREVIEW} = 1 if $len <= 4;
+                            } elsif ($$et{FILE_TYPE} eq 'JPEG' and $len > 60000) {
                                 delete $offsetData{$dataTag};
                                 $err = "$dataTag not written (too large for JPEG segment)";
                             }
@@ -2487,7 +2529,7 @@ NoOverwrite:            next if $isNew > 0;
                             $err = "$dataTag not found";
                         }
                         if ($err) {
-                            $exifTool->Warn($err) if $$newInfo{IsOffset};
+                            $et->Warn($err) if $$newInfo{IsOffset};
                             delete $set{$newID};    # remove from list of tags we are setting
                             next;
                         }
@@ -2498,11 +2540,11 @@ NoOverwrite:            next if $isNew > 0;
 #
                 if ($$newInfo{MakerNotes}) {
                     # don't write new makernotes if we are deleting this group
-                    if ($exifTool->{DEL_GROUP}{MakerNotes} and
-                       ($exifTool->{DEL_GROUP}{MakerNotes} != 2 or $isNew <= 0))
+                    if ($$et{DEL_GROUP}{MakerNotes} and
+                       ($$et{DEL_GROUP}{MakerNotes} != 2 or $isNew <= 0))
                     {
                         if ($isNew <= 0) {
-                            ++$exifTool->{CHANGED};
+                            ++$$et{CHANGED};
                             $verbose and print $out "  Deleting MakerNotes\n";
                         }
                         next;
@@ -2511,12 +2553,12 @@ NoOverwrite:            next if $isNew > 0;
                     if ($isNew >= 0 and $set{$newID}) {
                         # we are writing a whole new maker note block
                         # --> add fixup information if necessary
-                        my $nvHash = $exifTool->GetNewValueHash($newInfo, $dirName);
-                        if ($nvHash and $nvHash->{MAKER_NOTE_FIXUP}) {
+                        my $nvHash = $et->GetNewValueHash($newInfo, $dirName);
+                        if ($nvHash and $$nvHash{MAKER_NOTE_FIXUP}) {
                             # must clone fixup because we will be shifting it
-                            my $makerFixup = $nvHash->{MAKER_NOTE_FIXUP}->Clone();
+                            my $makerFixup = $$nvHash{MAKER_NOTE_FIXUP}->Clone();
                             my $valLen = length($valBuff);
-                            $makerFixup->{Start} += $valLen;
+                            $$makerFixup{Start} += $valLen;
                             push @valFixups, $makerFixup;
                         }
                     } else {
@@ -2550,7 +2592,7 @@ NoOverwrite:            next if $isNew > 0;
                             $writeProc = $$oldInfo{SubDirectory}{WriteProc};
                             $notIFD = $$oldInfo{NotIFD};
                         } else {
-                            $exifTool->Warn('Internal problem getting maker notes tag table');
+                            $et->Warn('Internal problem getting maker notes tag table');
                         }
                         $subTable or $subTable = $tagTablePtr;
                         if ($writeProc and
@@ -2560,15 +2602,15 @@ NoOverwrite:            next if $isNew > 0;
                             $loc = 0;
                         } elsif (not $notIFD) {
                             # look for IFD-style maker notes
-                            $loc = Image::ExifTool::MakerNotes::LocateIFD($exifTool,\%subdirInfo);
+                            $loc = Image::ExifTool::MakerNotes::LocateIFD($et,\%subdirInfo);
                         }
                         if (defined $loc) {
                             # we need fixup data for this subdirectory
                             $subdirInfo{Fixup} = new Image::ExifTool::Fixup;
                             # rewrite maker notes
-                            my $changed = $$exifTool{CHANGED};
-                            $subdir = $exifTool->WriteDirectory(\%subdirInfo, $subTable, $writeProc);
-                            if ($changed == $$exifTool{CHANGED} and $subdirInfo{Fixup}->IsEmpty()) {
+                            my $changed = $$et{CHANGED};
+                            $subdir = $et->WriteDirectory(\%subdirInfo, $subTable, $writeProc);
+                            if ($changed == $$et{CHANGED} and $subdirInfo{Fixup}->IsEmpty()) {
                                 # return original data if nothing changed and no fixups
                                 undef $subdir;
                             }
@@ -2586,13 +2628,13 @@ NoOverwrite:            next if $isNew > 0;
                                 $loc = 0;
                             }
                             # rewrite maker notes
-                            $subdir = $exifTool->WriteDirectory(\%subdirInfo, $subTable);
+                            $subdir = $et->WriteDirectory(\%subdirInfo, $subTable);
                         } elsif (not $notIFD) {
                             my $msg = 'Maker notes could not be parsed';
-                            if ($$exifTool{FILE_TYPE} eq 'JPEG') {
-                                $exifTool->Warn($msg, 1);
+                            if ($$et{FILE_TYPE} eq 'JPEG') {
+                                $et->Warn($msg, 1);
                             } else {
-                                $exifTool->Error($msg, 1);
+                                $et->Error($msg, 1);
                             }
                         }
                         if (defined $subdir) {
@@ -2602,27 +2644,27 @@ NoOverwrite:            next if $isNew > 0;
                             # maker notes for the old value
                             $newValue = substr($oldValue, 0, $loc) . $subdir;
                             my $makerFixup = $subdirInfo{Fixup};
-                            my $previewInfo = $exifTool->{PREVIEW_INFO};
+                            my $previewInfo = $$et{PREVIEW_INFO};
                             if ($subdirInfo{Relative}) {
                                 # apply a one-time fixup to $loc since offsets are relative
-                                $makerFixup->{Start} += $loc;
+                                $$makerFixup{Start} += $loc;
                                 # shift all offsets to be relative to new base
                                 my $baseShift = $valueDataPos + $valuePtr + $base - $subdirInfo{Base};
-                                $makerFixup->{Shift} += $baseShift;
+                                $$makerFixup{Shift} += $baseShift;
                                 $makerFixup->ApplyFixup(\$newValue);
                                 if ($previewInfo) {
                                     # remove all but PreviewImage fixup (since others shouldn't change)
-                                    foreach (keys %{$makerFixup->{Pointers}}) {
-                                        /_PreviewImage$/ or delete $makerFixup->{Pointers}{$_};
+                                    foreach (keys %{$$makerFixup{Pointers}}) {
+                                        /_PreviewImage$/ or delete $$makerFixup{Pointers}{$_};
                                     }
                                     # zero pointer so we can see how it gets shifted later
                                     $makerFixup->SetMarkerPointers(\$newValue, 'PreviewImage', 0);
                                     # set the pointer to the start of the EXIF information
                                     # add preview image fixup to list of value fixups
-                                    $makerFixup->{Start} += $valLen;
+                                    $$makerFixup{Start} += $valLen;
                                     push @valFixups, $makerFixup;
-                                    $previewInfo->{BaseShift} = $baseShift;
-                                    $previewInfo->{Relative} = 1;
+                                    $$previewInfo{BaseShift} = $baseShift;
+                                    $$previewInfo{Relative} = 1;
                                 }
                             # don't shift anything if relative flag set to zero (Pentax patch)
                             } elsif (not defined $subdirInfo{Relative}) {
@@ -2636,22 +2678,22 @@ NoOverwrite:            next if $isNew > 0;
                                     # allow negative base shift if offsets are bigger (PentaxOptioWP.jpg)
                                     (not $subdirInfo{MinOffset} or $subdirInfo{MinOffset} + $baseShift < 0))
                                 {
-                                    my $fixBase = $exifTool->Options('FixBase');
+                                    my $fixBase = $et->Options('FixBase');
                                     if (not defined $fixBase) {
-                                        my $str = $exifTool->Options('IgnoreMinorErrors') ? 'ignored' : 'fix or ignore?';
-                                        $exifTool->Error("MakerNotes offsets may be incorrect ($str)", 1);
+                                        my $str = $et->Options('IgnoreMinorErrors') ? 'ignored' : 'fix or ignore?';
+                                        $et->Error("MakerNotes offsets may be incorrect ($str)", 1);
                                     } elsif ($fixBase eq '') {
-                                        $exifTool->Warn('Fixed incorrect MakerNotes offsets');
+                                        $et->Warn('Fixed incorrect MakerNotes offsets');
                                         $baseShift = 0;
                                     }
                                 }
-                                $makerFixup->{Start} += $valLen + $loc;
-                                $makerFixup->{Shift} += $baseShift;
+                                $$makerFixup{Start} += $valLen + $loc;
+                                $$makerFixup{Shift} += $baseShift;
                                 # permanently fix makernote offset errors
-                                $makerFixup->{Shift} += $subdirInfo{FixedBy} || 0;
+                                $$makerFixup{Shift} += $subdirInfo{FixedBy} || 0;
                                 push @valFixups, $makerFixup;
-                                if ($previewInfo and not $previewInfo->{NoBaseShift}) {
-                                    $previewInfo->{BaseShift} = $baseShift;
+                                if ($previewInfo and not $$previewInfo{NoBaseShift}) {
+                                    $$previewInfo{BaseShift} = $baseShift;
                                 }
                             }
                             $newValuePt = \$newValue;   # write new value
@@ -2675,13 +2717,13 @@ NoOverwrite:            next if $isNew > 0;
                             $subTable = Image::ExifTool::GetTagTable($$subdir{TagTable});
                         }
                         # determine directory name for this IFD
-                        my $subdirName = $newInfo->{Groups}{1} || $$newInfo{Name};
+                        my $subdirName = $$newInfo{Groups}{1} || $$newInfo{Name};
                         # all makernotes directory names must be 'MakerNotes'
-                        $subdirName = 'MakerNotes' if $subTable->{GROUPS}{0} eq 'MakerNotes';
+                        $subdirName = 'MakerNotes' if $$subTable{GROUPS}{0} eq 'MakerNotes';
                         # must handle sub-IFD's specially since the values
                         # are actually offsets to subdirectories
                         unless ($readCount) {   # can't have zero count
-                            return undef if $exifTool->Error("$name entry $index has zero count", 2);
+                            return undef if $et->Error("$name entry $index has zero count", 2);
                             next;
                         }
                         my $writeCount = 0;
@@ -2689,10 +2731,22 @@ NoOverwrite:            next if $isNew > 0;
                         $newValue = '';    # reset value because we regenerate it below
                         for ($i=0; $i<$readCount; ++$i) {
                             my $off = $i * $formatSize[$readFormat];
-                            my $pt = ReadValue($valueDataPt, $valuePtr + $off,
-                                               $readFormName, 1, $oldSize - $off);
-                            my $subdirStart = $pt - $dataPos;
+                            my $val = ReadValue($valueDataPt, $valuePtr + $off,
+                                                $readFormName, 1, $oldSize - $off);
+                            my $subdirStart = $val - $dataPos;
                             my $subdirBase = $base;
+                            my $hdrLen;
+                            if (defined $$subdir{Start}) {
+                                #### eval Start ($val)
+                                my $newStart = eval $$subdir{Start};
+                                unless (Image::ExifTool::IsInt($newStart)) {
+                                    $et->Error("Bad subdirectory start for $$newInfo{Name}");
+                                    next;
+                                }
+                                $newStart -= $dataPos;
+                                $hdrLen = $newStart - $subdirStart;
+                                $subdirStart = $newStart;
+                            }
                             if ($$subdir{Base}) {
                                 my $start = $subdirStart + $dataPos;
                                 #### eval Base ($start,$base)
@@ -2732,20 +2786,25 @@ NoOverwrite:            next if $isNew > 0;
                                     $subdirInfo{DataLen} = 0;
                                 } else {
                                     my @err = ("Can't read $subdirName data", $inMakerNotes);
-                                    if ($$subTable{VARS} and $subTable->{VARS}{MINOR_ERRORS}) {
-                                        $exifTool->Warn($err[0] . '. Ignored.');
-                                    } elsif ($exifTool->Error(@err)) {
+                                    if ($$subTable{VARS} and $$subTable{VARS}{MINOR_ERRORS}) {
+                                        $et->Warn($err[0] . '. Ignored.');
+                                    } elsif ($et->Error(@err)) {
                                         return undef;
                                     }
                                     next Entry; # don't write this directory
                                 }
                             }
-                            my $subdirData = $exifTool->WriteDirectory(\%subdirInfo, $subTable, $$subdir{WriteProc});
+                            my $subdirData = $et->WriteDirectory(\%subdirInfo, $subTable, $$subdir{WriteProc});
                             unless (defined $subdirData) {
                                 # WriteDirectory should have issued an error, but check just in case
-                                $exifTool->Error("Error writing $subdirName") unless $$exifTool{VALUE}{Error};
+                                $et->Error("Error writing $subdirName") unless $$et{VALUE}{Error};
                                 return undef;
                             }
+                            # add back original header if necessary (ie. Ricoh GR)
+                            if ($hdrLen and $hdrLen > 0 and $subdirStart <= $dataLen) {
+                                $subdirData = substr($$dataPt, $subdirStart - $hdrLen, $hdrLen) . $subdirData;
+                                $subdirInfo{Fixup}{Start} += $hdrLen;
+                            }
                             unless (length $subdirData) {
                                 next unless $inMakerNotes;
                                 # don't delete MakerNote Sub-IFD's, write empty IFD instead
@@ -2840,13 +2899,13 @@ NoOverwrite:            next if $isNew > 0;
                         my $subTable = Image::ExifTool::GetTagTable($$subdir{TagTable});
                         my $oldOrder = GetByteOrder();
                         SetByteOrder($$subdir{ByteOrder}) if $$subdir{ByteOrder};
-                        $newValue = $exifTool->WriteDirectory(\%subdirInfo, $subTable, $$subdir{WriteProc});
+                        $newValue = $et->WriteDirectory(\%subdirInfo, $subTable, $$subdir{WriteProc});
                         SetByteOrder($oldOrder);
                         if (defined $newValue) {
                             my $hdrLen = $subdirStart - $valuePtr;
                             if ($hdrLen) {
                                 $newValue = substr($$valueDataPt, $valuePtr, $hdrLen) . $newValue;
-                                $subFixup->{Start} += $hdrLen;
+                                $$subFixup{Start} += $hdrLen;
                             }
                             $newValuePt = \$newValue;
                         } else {
@@ -2856,8 +2915,8 @@ NoOverwrite:            next if $isNew > 0;
                             # don't delete a previously empty makernote directory
                             next if $oldSize or not $inMakerNotes;
                         }
-                        if ($subFixup->{Pointers} and $subdirInfo{Base} == $base) {
-                            $subFixup->{Start} += length $valBuff;
+                        if ($$subFixup{Pointers} and $subdirInfo{Base} == $base) {
+                            $$subFixup{Start} += length $valBuff;
                             push @valFixups, $subFixup;
                         } else {
                             # apply fixup in case we added a header ($hdrLen above)
@@ -2873,11 +2932,11 @@ NoOverwrite:            next if $isNew > 0;
                     if ($dataTag eq 'CanonVRD') {
                         # must decide now if we will write CanonVRD information
                         my $hasVRD;
-                        if ($exifTool->{NEW_VALUE}{$Image::ExifTool::Extra{CanonVRD}}) {
+                        if ($$et{NEW_VALUE}{$Image::ExifTool::Extra{CanonVRD}}) {
                             # adding or deleting as a block
-                            $hasVRD = $exifTool->GetNewValues('CanonVRD') ? 1 : 0;
-                        } elsif ($exifTool->{DEL_GROUP}{CanonVRD} or
-                                 $exifTool->{DEL_GROUP}{Trailer})
+                            $hasVRD = $et->GetNewValues('CanonVRD') ? 1 : 0;
+                        } elsif ($$et{DEL_GROUP}{CanonVRD} or
+                                 $$et{DEL_GROUP}{Trailer})
                         {
                             $hasVRD = 0;    # deleting as a group
                         } else {
@@ -2897,29 +2956,29 @@ NoOverwrite:            next if $isNew > 0;
                         #   invalidated anyway by our edits
                         my $odd;
                         my $oddInfo = $Image::ExifTool::Composite{OriginalDecisionData};
-                        if ($oddInfo and $exifTool->{NEW_VALUE}{$oddInfo}) {
-                            $odd = $exifTool->GetNewValues($dataTag);
+                        if ($oddInfo and $$et{NEW_VALUE}{$oddInfo}) {
+                            $odd = $et->GetNewValues($dataTag);
                             if ($verbose > 1) {
                                 print $out "    - $dirName:$dataTag\n" if $$newValuePt ne "\0\0\0\0";
                                 print $out "    + $dirName:$dataTag\n" if $odd;
                             }
-                            ++$exifTool->{CHANGED};
+                            ++$$et{CHANGED};
                         } elsif ($$newValuePt ne "\0\0\0\0") {
                             if (length($$newValuePt) == 4) {
                                 require Image::ExifTool::Canon;
                                 my $offset = Get32u($newValuePt,0);
                                 # absolute offset in JPEG images only
-                                $offset += $base unless $$exifTool{FILE_TYPE} eq 'JPEG';
-                                $odd = Image::ExifTool::Canon::ReadODD($exifTool, $offset);
+                                $offset += $base unless $$et{FILE_TYPE} eq 'JPEG';
+                                $odd = Image::ExifTool::Canon::ReadODD($et, $offset);
                                 $odd = $$odd if ref $odd;
                             } else {
-                                $exifTool->Error("Invalid $$newInfo{Name}",1);
+                                $et->Error("Invalid $$newInfo{Name}",1);
                             }
                         }
                         if ($odd) {
                             my $newOffset = length($valBuff);
                             # (ODD offset is absolute in JPEG, so add base offset!)
-                            $newOffset += $base if $$exifTool{FILE_TYPE} eq 'JPEG';
+                            $newOffset += $base if $$et{FILE_TYPE} eq 'JPEG';
                             $newValue = Set32u($newOffset);
                             $dirFixup->AddFixup(length($dirBuff) + 8, $dataTag);
                             $valBuff .= $odd;   # add original decision data
@@ -2958,7 +3017,7 @@ NoOverwrite:            next if $isNew > 0;
                         my $ptr = $newStart + length($dirBuff) + 10;
                         $newCount or $newCount = 1; # make sure count is set for offsetInfo
                         # save value pointer and value count for each tag
-                        $offsetInfo->{$newID} = [$newInfo, $ptr, $newCount, \@vals, $newFormat];
+                        $$offsetInfo{$newID} = [$newInfo, $ptr, $newCount, \@vals, $newFormat];
                     }
 
                 } elsif ($$newInfo{DataMember}) {
@@ -2978,14 +3037,14 @@ NoOverwrite:            next if $isNew > 0;
                     if ($conv) {
                         # let the RawConv store the (possibly converted) data member
                         if (ref $conv eq 'CODE') {
-                            &$conv($val, $exifTool);
+                            &$conv($val, $et);
                         } else {
-                            my ($self, $tag, $taginfo) = ($exifTool, $$newInfo{Name}, $newInfo);
+                            my ($self, $tag, $taginfo) = ($et, $$newInfo{Name}, $newInfo);
                             #### eval RawConv ($self, $val, $tag, $tagInfo)
                             eval $conv;
                         }
                     } else {
-                        $$exifTool{$$newInfo{DataMember}} = $val;
+                        $$et{$$newInfo{DataMember}} = $val;
                     }
                 }
             }
@@ -3013,22 +3072,22 @@ NoOverwrite:            next if $isNew > 0;
                 my ($dataTag, $putFirst);
                 ($dataTag, $putFirst) = @$newInfo{'DataTag','PutFirst'} if $newInfo;
                 if ($dataTag) {
-                    if ($dataTag eq 'PreviewImage' and ($exifTool->{FILE_TYPE} eq 'JPEG' or
-                        $$exifTool{GENERATE_PREVIEW_INFO}))
+                    if ($dataTag eq 'PreviewImage' and ($$et{FILE_TYPE} eq 'JPEG' or
+                        $$et{GENERATE_PREVIEW_INFO}))
                     {
                         # hold onto the PreviewImage until we can determine if it fits
-                        $exifTool->{PREVIEW_INFO} or $exifTool->{PREVIEW_INFO} = {
+                        $$et{PREVIEW_INFO} or $$et{PREVIEW_INFO} = {
                             Data => $$newValuePt,
                             Fixup => new Image::ExifTool::Fixup,
                         };
-                        $exifTool->{PREVIEW_INFO}{ChangeBase} = 1 if $$newInfo{ChangeBase};
+                        $$et{PREVIEW_INFO}{ChangeBase} = 1 if $$newInfo{ChangeBase};
                         if ($$newInfo{IsOffset} and $$newInfo{IsOffset} eq '2') {
-                            $exifTool->{PREVIEW_INFO}{NoBaseShift} = 1;
+                            $$et{PREVIEW_INFO}{NoBaseShift} = 1;
                         }
                         # use original preview size if we will attempt to load it later
                         $newCount = $oldCount if $$newValuePt eq 'LOAD_PREVIEW';
                         $$newValuePt = '';
-                    } elsif ($dataTag eq 'LeicaTrailer' and $$exifTool{LeicaTrailer}) {
+                    } elsif ($dataTag eq 'LeicaTrailer' and $$et{LeicaTrailer}) {
                         $$newValuePt = '';
                     }
                 }
@@ -3073,11 +3132,11 @@ NoOverwrite:            next if $isNew > 0;
         if ($ignoreCount) {
             my $y = $ignoreCount > 1 ? 'ies' : 'y';
             my $verb = $$dirInfo{FixBase} ? 'Ignored' : 'Removed';
-            $exifTool->Warn("$verb $ignoreCount invalid entr$y from $name", 1);
+            $et->Warn("$verb $ignoreCount invalid entr$y from $name", 1);
         }
         if ($fixCount) {
             my $s = $fixCount > 1 ? 's' : '';
-            $exifTool->Warn("Fixed invalid count$s for $fixCount $name tag$s", 1);
+            $et->Warn("Fixed invalid count$s for $fixCount $name tag$s", 1);
         }
 #..............................................................................
 # write directory counts and nextIFD pointer and add value data to end of IFD
@@ -3092,8 +3151,8 @@ NoOverwrite:            next if $isNew > 0;
         my $isNextIFD = ($$dirInfo{Multi} and ($nextIfdOffset or
                         # account for the case where we will create the next IFD
                         # (IFD1 only, but not in TIFF-format images)
-                        ($dirName eq 'IFD0' and $$exifTool{ADD_DIRS}{'IFD1'} and
-                         $$exifTool{FILE_TYPE} ne 'TIFF')));
+                        ($dirName eq 'IFD0' and $$et{ADD_DIRS}{'IFD1'} and
+                         $$et{FILE_TYPE} ne 'TIFF')));
         # calculate number of entries in new directory
         my $newEntries = length($dirBuff) / 12;
         # delete entire directory if we deleted a tag and only mandatory tags remain or we
@@ -3105,7 +3164,7 @@ NoOverwrite:            next if $isNew > 0;
             undef $dirFixup;    # no fixups in this directory
             ++$deleteAll if defined $deleteAll;
             $verbose > 1 and print $out "    - $allMandatory mandatory tag(s)\n";
-            $exifTool->{CHANGED} -= $addMandatory;    # didn't change these after all
+            $$et{CHANGED} -= $addMandatory;    # didn't change these after all
         }
         if ($ifd and not $newEntries) {
             $verbose and print $out "  Deleting IFD1\n";
@@ -3113,7 +3172,7 @@ NoOverwrite:            next if $isNew > 0;
         }
         # apply one-time fixup for entry-based offsets
         if ($entryBasedFixup) {
-            $entryBasedFixup->{Shift} = length($dirBuff) + 4;
+            $$entryBasedFixup{Shift} = length($dirBuff) + 4;
             $entryBasedFixup->ApplyFixup(\$dirBuff);
             undef $entryBasedFixup;
         }
@@ -3169,7 +3228,7 @@ NoOverwrite:            next if $isNew > 0;
                 $offset += $newStart + 2;           # get offset in newData
                 # check to be sure we got the right offset
                 unless (Get32u(\$newData, $offset) == 0xfeedf00d) {
-                    $exifTool->Error("Internal error while rewriting $name");
+                    $et->Error("Internal error while rewriting $name");
                     return undef;
                 }
                 # set the offset to the subdirectory data
@@ -3180,14 +3239,14 @@ NoOverwrite:            next if $isNew > 0;
         # add fixup for all offsets in directory according to value data position
         # (which is at the end of this directory)
         if ($dirFixup) {
-            $dirFixup->{Start} = $newStart + 2;
-            $dirFixup->{Shift} = $valPos - $dirFixup->{Start};
+            $$dirFixup{Start} = $newStart + 2;
+            $$dirFixup{Shift} = $valPos - $$dirFixup{Start};
             $fixup->AddFixup($dirFixup);
         }
         # add valueData fixups, adjusting for position of value data
         my $valFixup;
         foreach $valFixup (@valFixups) {
-            $valFixup->{Start} += $valPos;
+            $$valFixup{Start} += $valPos;
             $fixup->AddFixup($valFixup);
         }
         # stop if no next IFD pointer
@@ -3208,32 +3267,32 @@ NoOverwrite:            next if $isNew > 0;
         $dirName .= $ifdNum + 1;
         $name =~ s/\d+$//;
         $name .= $ifdNum + 1;
-        $$exifTool{DIR_NAME} = $$exifTool{PATH}[-1] = $dirName;
+        $$et{DIR_NAME} = $$et{PATH}[-1] = $dirName;
         next unless $nextIfdOffset;
 
         # guard against writing the same directory twice
         my $addr = $nextIfdOffset + $base;
-        if ($exifTool->{PROCESSED}{$addr}) {
-            $exifTool->Error("$name pointer references previous $exifTool->{PROCESSED}{$addr} directory", 1);
+        if ($$et{PROCESSED}{$addr}) {
+            $et->Error("$name pointer references previous $$et{PROCESSED}{$addr} directory", 1);
             last;
         }
-        $exifTool->{PROCESSED}{$addr} = $name;
+        $$et{PROCESSED}{$addr} = $name;
 
         if ($dirName eq 'SubIFD1' and not ValidateIFD($dirInfo, $dirStart)) {
-            if ($exifTool->{TIFF_TYPE} eq 'TIFF') {
-                $exifTool->Error('Ignored bad IFD linked from SubIFD', 1);
+            if ($$et{TIFF_TYPE} eq 'TIFF') {
+                $et->Error('Ignored bad IFD linked from SubIFD', 1);
             } elsif ($verbose) {
-                $exifTool->Warn('Ignored bad IFD linked from SubIFD');
+                $et->Warn('Ignored bad IFD linked from SubIFD');
             }
             last;   # don't write bad IFD
         }
-        if ($exifTool->{DEL_GROUP}{$dirName}) {
+        if ($$et{DEL_GROUP}{$dirName}) {
             $verbose and print $out "  Deleting $dirName\n";
-            $raf and $exifTool->Error("Deleting $dirName also deletes subsequent" .
+            $raf and $et->Error("Deleting $dirName also deletes subsequent" .
                                       " IFD's and possibly image data", 1);
-            ++$exifTool->{CHANGED};
-            if ($exifTool->{DEL_GROUP}{$dirName} == 2 and
-                $exifTool->{ADD_DIRS}{$dirName})
+            ++$$et{CHANGED};
+            if ($$et{DEL_GROUP}{$dirName} == 2 and
+                $$et{ADD_DIRS}{$dirName})
             {
                 my $emptyIFD = "\0" x 2;    # start with empty IFD
                 $dataPt = \$emptyIFD;
@@ -3276,16 +3335,16 @@ NoOverwrite:            next if $isNew > 0;
                 if ($stripOffsets and $$stripOffsets[0]{PanasonicHack}) {
                     require Image::ExifTool::PanasonicRaw;
                     my $err = Image::ExifTool::PanasonicRaw::PatchRawDataOffset($offsetInfo, $raf, $ifd);
-                    $err and $exifTool->Error($err);
+                    $err and $et->Error($err);
                 }
                 my $tagID;
                 # loop through all tags in reverse order so we save thumbnail
                 # data before main image data if both exist in the same IFD
                 foreach $tagID (reverse sort keys %$offsetInfo) {
-                    my $tagInfo = $offsetInfo->{$tagID}[0];
+                    my $tagInfo = $$offsetInfo{$tagID}[0];
                     next unless $$tagInfo{IsOffset}; # handle byte counts with offsets
-                    my $sizeInfo = $offsetInfo->{$$tagInfo{OffsetPair}};
-                    $sizeInfo or $exifTool->Error("No size tag for $dirName:$$tagInfo{Name}"), next;
+                    my $sizeInfo = $$offsetInfo{$$tagInfo{OffsetPair}};
+                    $sizeInfo or $et->Error("No size tag for $dirName:$$tagInfo{Name}"), next;
                     my $dataTag = $$tagInfo{DataTag};
                     # write TIFF image data (strips or tiles) later if requested
                     if ($raf and defined $$origDirInfo{ImageData} and
@@ -3297,9 +3356,9 @@ NoOverwrite:            next if $isNew > 0;
                         # but don't defer writing if replacing with new value
                         (not defined $dataTag or not defined $offsetData{$dataTag}))
                     {
-                        push @writeLater, [ $offsetInfo->{$tagID}, $sizeInfo ];
+                        push @writeLater, [ $$offsetInfo{$tagID}, $sizeInfo ];
                     } else {
-                        push @offsetList, [ $offsetInfo->{$tagID}, $sizeInfo ];
+                        push @offsetList, [ $$offsetInfo{$tagID}, $sizeInfo ];
                     }
                 }
             } else {
@@ -3312,7 +3371,7 @@ NoOverwrite:            next if $isNew > 0;
                 my ($cntInfo, $byteCounts, $count2, $oldSize, $format) = @{$$offsetPair[1]};
                 # must be the same number of offset and byte count values
                 unless ($count == $count2) {
-                    $exifTool->Error("Offsets/ByteCounts disagree on count for $$tagInfo{Name}");
+                    $et->Error("Offsets/ByteCounts disagree on count for $$tagInfo{Name}");
                     return undef;
                 }
                 my $formatStr = $formatName[$format];
@@ -3321,7 +3380,7 @@ NoOverwrite:            next if $isNew > 0;
                 my $n = $count * $formatSize[$format];
                 $n > 4 and $byteCounts = Get32u(\$newData, $byteCounts);
                 if ($byteCounts < 0 or $byteCounts + $n > length($newData)) {
-                    $exifTool->Error("Error reading $$tagInfo{Name} byte counts");
+                    $et->Error("Error reading $$tagInfo{Name} byte counts");
                     return undef;
                 }
                 # get offset base and data pos (abnormal for some preview images)
@@ -3335,7 +3394,7 @@ NoOverwrite:            next if $isNew > 0;
                 }
                 # use different base if necessary for some offsets (Minolta A200)
                 if ($$tagInfo{WrongBase}) {
-                    my $self = $exifTool;
+                    my $self = $et;
                     #### eval WrongBase ($self)
                     $wrongBase = eval $$tagInfo{WrongBase} || 0;
                     $dbase += $wrongBase;
@@ -3354,7 +3413,7 @@ NoOverwrite:            next if $isNew > 0;
                         # calculate end offset of this block
                         $oldEnd = $$oldOffset[$n] + $$oldSize[$n];
                         # update TIFF_END as if we read this data from file
-                        UpdateTiffEnd($exifTool, $oldEnd + $dbase);
+                        UpdateTiffEnd($et, $oldEnd + $dbase);
                     }
                     my $offsetPos = $offsets + $n * 4;
                     my $byteCountPos = $byteCounts + $n * $formatSize[$format];
@@ -3369,7 +3428,7 @@ NoOverwrite:            next if $isNew > 0;
                     if (defined $offset) {
                         $offset -= $dpos;
                     } elsif ($size != 0xfeedfeed) {
-                        $exifTool->Error('Internal error (no offset)');
+                        $et->Error('Internal error (no offset)');
                         return undef;
                     }
                     my $newOffset = length($newData) - $wrongBase;
@@ -3377,20 +3436,20 @@ NoOverwrite:            next if $isNew > 0;
                     # look for 'feed' code to use our new data
                     if ($size == 0xfeedfeed) {
                         unless (defined $dataTag) {
-                            $exifTool->Error("No DataTag defined for $$tagInfo{Name}");
+                            $et->Error("No DataTag defined for $$tagInfo{Name}");
                             return undef;
                         }
                         unless (defined $offsetData{$dataTag}) {
-                            $exifTool->Error("Internal error (no $dataTag)");
+                            $et->Error("Internal error (no $dataTag)");
                             return undef;
                         }
                         if ($count > 1) {
-                            $exifTool->Error("Can't modify $$tagInfo{Name} with count $count");
+                            $et->Error("Can't modify $$tagInfo{Name} with count $count");
                             return undef;
                         }
                         $buff = $offsetData{$dataTag};
                         if ($formatSize[$format] != 4) {
-                            $exifTool->Error("$$cntInfo{Name} is not int32");
+                            $et->Error("$$cntInfo{Name} is not int32");
                             return undef;
                         }
                         # set the data size
@@ -3421,7 +3480,7 @@ NoOverwrite:            next if $isNew > 0;
                     } elsif ($offset >= 0 and $offset+$size <= $dataLen) {
                         # take data from old dir data buffer
                         $buff = substr($$dataPt, $offset, $size);
-                    } elsif ($$exifTool{TIFF_TYPE} eq 'MRW') {
+                    } elsif ($$et{TIFF_TYPE} eq 'MRW') {
                         # TTW segment must be an even 4 bytes long, so pad now if necessary
                         my $n = length $newData;
                         $buff = ($n & 0x03) ? "\0" x (4 - ($n & 0x03)) : '';
@@ -3434,8 +3493,8 @@ NoOverwrite:            next if $isNew > 0;
                     {
                         # (data was read OK)
                         # patch incorrect ThumbnailOffset in Sony A100 1.00 ARW images
-                        if ($$exifTool{TIFF_TYPE} eq 'ARW' and $$tagInfo{Name} eq 'ThumbnailOffset' and
-                            $$exifTool{Model} eq 'DSLR-A100' and $buff !~ /^\xff\xd8\xff/)
+                        if ($$et{TIFF_TYPE} eq 'ARW' and $$tagInfo{Name} eq 'ThumbnailOffset' and
+                            $$et{Model} eq 'DSLR-A100' and $buff !~ /^\xff\xd8\xff/)
                         {
                             my $pos = $offset + $dbase + $dpos;
                             my $try;
@@ -3443,15 +3502,15 @@ NoOverwrite:            next if $isNew > 0;
                                 $raf->Read($try,$size) == $size and $try =~ /^\xff\xd8\xff/)
                             {
                                 $buff = $try;
-                                $exifTool->Warn('Adjusted incorrect A100 ThumbnailOffset', 1);
+                                $et->Warn('Adjusted incorrect A100 ThumbnailOffset', 1);
                             } else {
-                                $exifTool->Error('Invalid ThumbnailImage');
+                                $et->Error('Invalid ThumbnailImage');
                             }
                         }
                     } elsif ($$tagInfo{Name} eq 'ThumbnailOffset' and $offset>=0 and $offset<$dataLen) {
                         # Grrr.  The Canon 350D writes the thumbnail with an incorrect byte count
                         my $diff = $offset + $size - $dataLen;
-                        $exifTool->Warn("ThumbnailImage runs outside EXIF data by $diff bytes (truncated)",1);
+                        $et->Warn("ThumbnailImage runs outside EXIF data by $diff bytes (truncated)",1);
                         # set the size to the available data
                         $size -= $diff;
                         unless (WriteValue($size, $formatStr, 1, \$newData, $byteCountPos)) {
@@ -3459,45 +3518,45 @@ NoOverwrite:            next if $isNew > 0;
                         }
                         # get the truncated image
                         $buff = substr($$dataPt, $offset, $size);
-                    } elsif ($$tagInfo{Name} eq 'PreviewImageStart' and $exifTool->{FILE_TYPE} eq 'JPEG') {
+                    } elsif ($$tagInfo{Name} eq 'PreviewImageStart' and $$et{FILE_TYPE} eq 'JPEG') {
                         # try to load the preview image using the specified offset
                         undef $buff;
-                        my $r = $exifTool->{RAF};
+                        my $r = $$et{RAF};
                         if ($r and not $raf) {
                             my $tell = $r->Tell();
                             # read and validate
                             undef $buff unless $r->Seek($offset+$base+$dataPos,0) and
                                                $r->Read($buff,$size) == $size and
                                                $buff =~ /^.\xd8\xff[\xc4\xdb\xe0-\xef]/s;
-                            $r->Seek($tell, 0) or $exifTool->Error('Seek error'), return undef;
+                            $r->Seek($tell, 0) or $et->Error('Seek error'), return undef;
                         }
                         # set flag if we must load PreviewImage
                         $buff = 'LOAD_PREVIEW' unless defined $buff;
                     } else {
                         my $dataName = $dataTag || $$tagInfo{Name};
-                        return undef if $exifTool->Error("Error reading $dataName data in $name", $inMakerNotes);
+                        return undef if $et->Error("Error reading $dataName data in $name", $inMakerNotes);
                         $buff = '';
                     }
                     if ($$tagInfo{Name} eq 'PreviewImageStart') {
-                        if ($$exifTool{FILE_TYPE} eq 'JPEG' and not $$tagInfo{MakerPreview}) {
+                        if ($$et{FILE_TYPE} eq 'JPEG' and not $$tagInfo{MakerPreview}) {
                             # hold onto the PreviewImage until we can determine if it fits
-                            $exifTool->{PREVIEW_INFO} or $exifTool->{PREVIEW_INFO} = {
+                            $$et{PREVIEW_INFO} or $$et{PREVIEW_INFO} = {
                                 Data => $buff,
                                 Fixup => new Image::ExifTool::Fixup,
                             };
                             if ($$tagInfo{IsOffset} and $$tagInfo{IsOffset} eq '2') {
-                                $exifTool->{PREVIEW_INFO}{NoBaseShift} = 1;
+                                $$et{PREVIEW_INFO}{NoBaseShift} = 1;
                             }
                             if ($offset >= 0 and $offset+$size <= $dataLen) {
                                 # set flag indicating this preview wasn't in a trailer
-                                $exifTool->{PREVIEW_INFO}{WasContained} = 1;
+                                $$et{PREVIEW_INFO}{WasContained} = 1;
                             }
                             $buff = '';
-                        } elsif ($$exifTool{TIFF_TYPE} eq 'ARW' and $$exifTool{Model}  eq 'DSLR-A100') {
+                        } elsif ($$et{TIFF_TYPE} eq 'ARW' and $$et{Model}  eq 'DSLR-A100') {
                             # the A100 double-references the same preview, so ignore the
                             # second one (the offset and size will be patched later)
-                            next if $$exifTool{A100PreviewLength};
-                            $$exifTool{A100PreviewLength} = length $buff if defined $buff;
+                            next if $$et{A100PreviewLength};
+                            $$et{A100PreviewLength} = length $buff if defined $buff;
                         }
                     }
                     # update offset accordingly and add to end of new data
@@ -3525,7 +3584,7 @@ NoOverwrite:            next if $isNew > 0;
         }
         # verify that nothing else got written after determining TTW length
         if (defined $ttwLen and $ttwLen != length($newData)) {
-            $exifTool->Error('Internal error writing MRW TTW');
+            $et->Error('Internal error writing MRW TTW');
         }
     }
 #
@@ -3537,7 +3596,7 @@ NoOverwrite:            next if $isNew > 0;
         if (defined $entry) {
             my $format = Get16u(\$newData, $entry + 2);
             if ($format < 1 or $format > 13) {
-                $exifTool->Error('Internal error copying huge value');
+                $et->Error('Internal error copying huge value');
                 last;
             } else {
                 # set count and offset in directory entry
@@ -3560,7 +3619,7 @@ NoOverwrite:            next if $isNew > 0;
             # our offset expects the data at the end of the SubIFD block (BlockLen + Start),
             # but it will actually be at length($newData) + $blockSize.  So adjust
             # accordingly (and subtract an extra Start because this shift is applied later)
-            $subFix->{Shift} += length($newData) - $$subFix{BlockLen} - 2 * $$subFix{Start} + $blockSize;
+            $$subFix{Shift} += length($newData) - $$subFix{BlockLen} - 2 * $$subFix{Start} + $blockSize;
             $subFix->ApplyFixup(\$newData);
         }
         $blockSize += $size + $pad;
@@ -3579,45 +3638,45 @@ NoOverwrite:            next if $isNew > 0;
         #  this when editing JPEG images anyway))
         $fixup->SetMarkerPointers(\$newData, 'CanonVRD', length($newData) + $blockSize);
         if ($newDataPos) {
-            $fixup->{Shift} += $newDataPos;
+            $$fixup{Shift} += $newDataPos;
             $fixup->ApplyFixup(\$newData);
         }
         # save fixup for adjusting Leica trailer offset if necessary
-        $$exifTool{LeicaTrailer}{Fixup}->AddFixup($fixup) if $$exifTool{LeicaTrailer};
+        $$et{LeicaTrailer}{Fixup}->AddFixup($fixup) if $$et{LeicaTrailer};
         # save fixup for PreviewImage in JPEG file if necessary
-        my $previewInfo = $exifTool->{PREVIEW_INFO};
+        my $previewInfo = $$et{PREVIEW_INFO};
         if ($previewInfo) {
-            my $pt = \$previewInfo->{Data}; # image data or 'LOAD_PREVIEW' flag
+            my $pt = \$$previewInfo{Data}; # image data or 'LOAD_PREVIEW' flag
             # now that we know the size of the EXIF data, first test to see if our new image fits
             # inside the EXIF segment (remember about the TIFF and EXIF headers: 8+6 bytes)
             if (($$pt ne 'LOAD_PREVIEW' and length($$pt) + length($newData) + 14 <= 0xfffd and
-                not $previewInfo->{IsTrailer}) or
-                $previewInfo->{IsShort}) # must fit in this segment if using short pointers
+                not $$previewInfo{IsTrailer}) or
+                $$previewInfo{IsShort}) # must fit in this segment if using short pointers
             {
                 # It fits! (or must exist in EXIF segment), so fixup the
                 # PreviewImage pointers and stuff the preview image in here
                 my $newPos = length($newData) + $newDataPos;
-                $newPos += ($previewInfo->{BaseShift} || 0);
-                if ($previewInfo->{Relative}) {
+                $newPos += ($$previewInfo{BaseShift} || 0);
+                if ($$previewInfo{Relative}) {
                     # calculate our base by looking at how far the pointer got shifted
                     $newPos -= ($fixup->GetMarkerPointers(\$newData, 'PreviewImage') || 0);
                 }
                 $fixup->SetMarkerPointers(\$newData, 'PreviewImage', $newPos);
                 $newData .= $$pt;
                 # set flag to delete old preview unless it was contained in the EXIF
-                $exifTool->{DEL_PREVIEW} = 1 unless $exifTool->{PREVIEW_INFO}{WasContained};       
-                delete $exifTool->{PREVIEW_INFO};   # done with our preview data
+                $$et{DEL_PREVIEW} = 1 unless $$et{PREVIEW_INFO}{WasContained};       
+                delete $$et{PREVIEW_INFO};   # done with our preview data
             } else {
                 # Doesn't fit, or we still don't know, so save fixup information
                 # and put the preview at the end of the file
-                $previewInfo->{Fixup} or $previewInfo->{Fixup} = new Image::ExifTool::Fixup;
-                $previewInfo->{Fixup}->AddFixup($fixup);
+                $$previewInfo{Fixup} or $$previewInfo{Fixup} = new Image::ExifTool::Fixup;
+                $$previewInfo{Fixup}->AddFixup($fixup);
             }
         } elsif (defined $newData and $deleteAll) {
             $newData = '';  # delete both IFD0 and IFD1 since only mandatory tags remain
-        } elsif ($$exifTool{A100PreviewLength}) {
+        } elsif ($$et{A100PreviewLength}) {
             # save preview image start for patching A100 quirks later
-            $$exifTool{A100PreviewStart} = $fixup->GetMarkerPointers(\$newData, 'PreviewImage');
+            $$et{A100PreviewStart} = $fixup->GetMarkerPointers(\$newData, 'PreviewImage');
         }
         # save location of last IFD for use in Canon RAW header
         if ($newDataPos == 16) {
@@ -3625,10 +3684,10 @@ NoOverwrite:            next if $isNew > 0;
             $$origDirInfo{LastIFD} = pop @ifdPos;
         }
         # recrypt SR2 SubIFD data if necessary
-        my $key = $$exifTool{SR2SubIFDKey};
+        my $key = $$et{SR2SubIFDKey};
         if ($key) {
             my $start = $fixup->GetMarkerPointers(\$newData, 'SR2SubIFDOffset');
-            my $len = $$exifTool{SR2SubIFDLength};
+            my $len = $$et{SR2SubIFDLength};
             # (must subtract 8 for size of TIFF header)
             if ($start and $start - 8 + $len <= length $newData) {
                 require Image::ExifTool::Sony;
@@ -3661,7 +3720,7 @@ This file contains routines to write EXIF metadata.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -85,7 +85,7 @@ sub PrintInvCodedCharset($)
     my $val = shift;
     my $code = $iptcCharsetInv{uc($val)};
     unless ($code) {
-        if (($code = $val) =~ s/ESC /\x1b/g) {  # translate ESC chars
+        if (($code = $val) =~ s/ESC */\x1b/ig) {  # translate ESC chars
             $code =~ s/, \x1b/\x1b/g;   # remove comma separators
             $code =~ tr/ //d;           # remove spaces
         } else {
@@ -101,7 +101,7 @@ sub PrintInvCodedCharset($)
 # Returns: error string or undef (and possibly changes value) on success
 sub CheckIPTC($$$)
 {
-    my ($exifTool, $tagInfo, $valPtr) = @_;
+    my ($et, $tagInfo, $valPtr) = @_;
     my $format = $$tagInfo{Format} || $tagInfo->{Table}->{FORMAT} || '';
     if ($format =~ /^int(\d+)/) {
         my $bytes = int(($1 || 0) / 8);
@@ -130,8 +130,8 @@ sub CheckIPTC($$$)
         if (defined $minlen) {
             $maxlen or $maxlen = $minlen;
             return "String too short (minlen is $minlen)" if $len < $minlen;
-            if ($len > $maxlen and not $exifTool->Options('IgnoreMinorErrors')) {
-                $$exifTool{CHECK_WARN} = "[minor] IPTC:$$tagInfo{Name} exceeds length limit (truncated)";
+            if ($len > $maxlen and not $et->Options('IgnoreMinorErrors')) {
+                $$et{CHECK_WARN} = "[minor] IPTC:$$tagInfo{Name} exceeds length limit (truncated)";
                 $$valPtr = substr($$valPtr, 0, $maxlen);
             }
         }
@@ -149,7 +149,7 @@ sub CheckIPTC($$$)
 #         4) record number, 5) flag set to read value (instead of write)
 sub FormatIPTC($$$$$;$)
 {
-    my ($exifTool, $tagInfo, $valPtr, $xlatPtr, $rec, $read) = @_;
+    my ($et, $tagInfo, $valPtr, $xlatPtr, $rec, $read) = @_;
     my $format = $$tagInfo{Format} || $$tagInfo{Table}{FORMAT};
     return unless $format;
     if ($format =~ /^int(\d+)/) {
@@ -176,10 +176,10 @@ sub FormatIPTC($$$$$;$)
     } elsif ($format =~ /^string/) {
         if ($rec == 1) {
             if ($$tagInfo{Name} eq 'CodedCharacterSet') {
-                $$xlatPtr = HandleCodedCharset($exifTool, $$valPtr);
+                $$xlatPtr = HandleCodedCharset($et, $$valPtr);
             }
         } elsif ($$xlatPtr and $rec < 7 and $$valPtr =~ /[\x80-\xff]/) {
-            TranslateCodedString($exifTool, $valPtr, $xlatPtr, $read);
+            TranslateCodedString($et, $valPtr, $xlatPtr, $read);
         }
     }
 }
@@ -191,7 +191,7 @@ sub FormatIPTC($$$$$;$)
 sub IptcDate($)
 {
     my $val = shift;
-    unless ($val =~ s/.*(\d{4}):?(\d{2}):?(\d{2}).*/$1$2$3/s) {
+    unless ($val =~ s/^.*(\d{4}):?(\d{2}):?(\d{2}).*/$1$2$3/s) {
         warn "Invalid date format (use YYYY:mm:dd)\n";
         undef $val;
     }
@@ -215,7 +215,7 @@ sub IptcTime($)
         } else {
             # use local system timezone by default 
             my (@tm, $time);
-            if ($date and $date =~ /^(\d{4}):(\d{2}):(\d{2})\s*$/ and eval 'require Time::Local') {
+            if ($date and $date =~ /^(\d{4}):(\d{2}):(\d{2})\s*$/ and eval { require Time::Local }) {
                 # we were given a date too, so determine the local timezone
                 # offset at the specified date/time
                 my @d = ($3,$2-1,$1-1900);
@@ -302,19 +302,19 @@ sub InvConvertPictureNumber($)
 # Notes: Increments ExifTool CHANGED flag for each tag changed
 sub DoWriteIPTC($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    my $verbose = $exifTool->Options('Verbose');
-    my $out = $exifTool->Options('TextOut');
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    my $verbose = $et->Options('Verbose');
+    my $out = $et->Options('TextOut');
 
     # avoid editing IPTC directory unless necessary:
     # - improves speed
     # - avoids changing current MD5 digest unnecessarily
     # - avoids adding mandatory tags unless some other IPTC is changed
-    unless (exists $$exifTool{EDIT_DIRS}{$$dirInfo{DirName}} or
+    unless (exists $$et{EDIT_DIRS}{$$dirInfo{DirName}} or
         # standard IPTC tags in other locations should be edited too (ie. AFCP_IPTC)
-        ($tagTablePtr = \%Image::ExifTool::IPTC::Main and exists $$exifTool{EDIT_DIRS}{IPTC}))
+        ($tagTablePtr = \%Image::ExifTool::IPTC::Main and exists $$et{EDIT_DIRS}{IPTC}))
     {
-        print $out "$$exifTool{INDENT}  [nothing changed]\n" if $verbose;
+        print $out "$$et{INDENT}  [nothing changed]\n" if $verbose;
         return undef;
     }
     my $dataPt = $$dirInfo{DataPt};
@@ -327,8 +327,8 @@ sub DoWriteIPTC($$$)
     my ($tagInfo, %iptcInfo, $tag);
 
     # start by assuming default IPTC encoding
-    my $xlat = $exifTool->Options('CharsetIPTC');
-    undef $xlat if $xlat eq $exifTool->Options('Charset');
+    my $xlat = $et->Options('CharsetIPTC');
+    undef $xlat if $xlat eq $et->Options('Charset');
 
     # make sure our dataLen is defined (note: allow zero length directory)
     unless (defined $dirLen) {
@@ -340,7 +340,7 @@ sub DoWriteIPTC($$$)
     if ($dirLen >= 4 and substr($$dataPt, $start, 1) ne "\x1c" and
                          substr($$dataPt, $start + 3, 1) eq "\x1c")
     {
-        $exifTool->Warn('IPTC data was improperly byte-swapped');
+        $et->Warn('IPTC data was improperly byte-swapped');
         my $newData = pack('N*', unpack('V*', substr($$dataPt, $start, $dirLen) . "\0\0\0"));
         $dataPt = \$newData;
         $start = 0;
@@ -358,7 +358,7 @@ sub DoWriteIPTC($$$)
 
     # loop through new values and accumulate all IPTC information
     # into lists based on their IPTC record type
-    foreach $tagInfo ($exifTool->GetNewTagInfoList()) {
+    foreach $tagInfo ($et->GetNewTagInfoList()) {
         my $table = $$tagInfo{Table};
         my $record = $recordNum{$table};
         # ignore tags we aren't writing to this directory
@@ -402,12 +402,12 @@ sub DoWriteIPTC($$$)
             if ($id == 0x1c) {
                 if ($rec < $lastRec) {
                     if ($rec == 0) {
-                        return undef if $exifTool->Warn("IPTC record 0 encountered, subsequent records ignored", 2);
+                        return undef if $et->Warn("IPTC record 0 encountered, subsequent records ignored", 2);
                         undef $rec;
                         $pos = $dirEnd;
                         $len = 0;
                     } else {
-                        return undef if $exifTool->Warn("IPTC doesn't conform to spec: Records out of sequence", 2);
+                        return undef if $et->Warn("IPTC doesn't conform to spec: Records out of sequence", 2);
                     }
                 }
                 # handle extended IPTC entry if necessary
@@ -472,15 +472,15 @@ sub DoWriteIPTC($$$)
                                 }
                                 $tagInfo = $subTablePtr->{$mandTag} or warn("WriteIPTC: Internal error 2\n"), next;
                                 my $value = $mandatory->{$mandTag};
-                                $exifTool->VerboseValue("+ IPTC:$$tagInfo{Name}", $value, ' (mandatory)');
+                                $et->VerboseValue("+ IPTC:$$tagInfo{Name}", $value, ' (mandatory)');
                                 # apply necessary format conversions
-                                FormatIPTC($exifTool, $tagInfo, \$value, \$xlat, $lastRec);
+                                FormatIPTC($et, $tagInfo, \$value, \$xlat, $lastRec);
                                 $len = length $value;
                                 # generate our new entry
                                 my $entry = pack("CCCn", 0x1c, $lastRec, $mandTag, length($value));
                                 $newData .= $entry . $value;    # add entry to new IPTC data
                                 # (don't mark as changed if just mandatory tags changed)
-                                # ++$exifTool->{CHANGED};
+                                # ++$$et{CHANGED};
                             }
                         }
                     }
@@ -497,7 +497,7 @@ sub DoWriteIPTC($$$)
                     $tagInfo = ${$iptcInfo{$newRec}}[0];
                 }
                 my $newTag = $$tagInfo{TagID};
-                my $nvHash = $exifTool->GetNewValueHash($tagInfo);
+                my $nvHash = $et->GetNewValueHash($tagInfo);
                 # only add new values if...
                 my ($doSet, @values);
                 my $found = $foundRec{$newRec}->{$newTag} || 0;
@@ -512,19 +512,19 @@ sub DoWriteIPTC($$$)
                     $doSet = 1 if not $found and $$nvHash{IsCreating};
                 }
                 if ($doSet) {
-                    @values = $exifTool->GetNewValues($nvHash);
+                    @values = $et->GetNewValues($nvHash);
                     @values and $foundRec{$newRec}->{$newTag} = $found | 0x04;
                     # write tags for each value in list
                     my $value;
                     foreach $value (@values) {
-                        $exifTool->VerboseValue("+ IPTC:$$tagInfo{Name}", $value);
+                        $et->VerboseValue("+ IPTC:$$tagInfo{Name}", $value);
                         # reset allMandatory flag if a non-mandatory tag is written
                         if ($allMandatory) {
                             my $mandatory = $mandatory{$newRec};
                             $allMandatory = 0 unless $mandatory and $mandatory->{$newTag};
                         }
                         # apply necessary format conversions
-                        FormatIPTC($exifTool, $tagInfo, \$value, \$xlat, $newRec);
+                        FormatIPTC($et, $tagInfo, \$value, \$xlat, $newRec);
                         # (note: IPTC string values are NOT null terminated)
                         $len = length $value;
                         # generate our new entry
@@ -536,7 +536,7 @@ sub DoWriteIPTC($$$)
                             $entry .= pack("nN", 0x8004, $len);
                         }
                         $newData .= $entry . $value;    # add entry to new IPTC data
-                        ++$exifTool->{CHANGED};
+                        ++$$et{CHANGED};
                     }
                 }
                 # continue on with regular programming if done adding tag now
@@ -563,17 +563,17 @@ sub DoWriteIPTC($$$)
         # write out this record unless we are setting it with a new value
         $tagInfo = $set{$rec}->{$tag};
         if ($tagInfo) {
-            my $nvHash = $exifTool->GetNewValueHash($tagInfo);
+            my $nvHash = $et->GetNewValueHash($tagInfo);
             $len = $pos - $valuePtr;
             my $val = substr($$dataPt, $valuePtr, $len);
             # remove null terminator if it exists (written by braindead software like Picasa 2.0)
             $val =~ s/\0+$// if $$tagInfo{Format} and $$tagInfo{Format} =~ /^string/;
             my $oldXlat = $xlat;
-            FormatIPTC($exifTool, $tagInfo, \$val, \$xlat, $rec, 1);
-            if ($exifTool->IsOverwriting($nvHash, $val)) {
+            FormatIPTC($et, $tagInfo, \$val, \$xlat, $rec, 1);
+            if ($et->IsOverwriting($nvHash, $val)) {
                 $xlat = $oldXlat;   # don't change translation (not writing this value)
-                $exifTool->VerboseValue("- IPTC:$$tagInfo{Name}", $val);
-                ++$exifTool->{CHANGED};
+                $et->VerboseValue("- IPTC:$$tagInfo{Name}", $val);
+                ++$$et{CHANGED};
                 # set deleted flag to indicate we found and deleted this tag
                 $foundRec{$rec}->{$tag} |= 0x02;
                 # increment allMandatory flag to indicate a tag was removed
@@ -589,7 +589,7 @@ sub DoWriteIPTC($$$)
         } elsif ($rec == 1 and $tag == 90) {
             # handle CodedCharacterSet tag
             my $val = substr($$dataPt, $valuePtr, $pos - $valuePtr);
-            $xlat = HandleCodedCharset($exifTool, $val);
+            $xlat = HandleCodedCharset($et, $val);
         }
         # reset allMandatory flag if a non-mandatory tag is written
         if ($allMandatory) {
@@ -603,9 +603,9 @@ sub DoWriteIPTC($$$)
     }
     # make sure the rest of the data is zero
     if ($tail < $dirEnd) {
-        my $trailer = substr($$dataPt, $tail, $dirEnd-$tail);
-        if ($trailer =~ /[^\0]/) {
-            return undef if $exifTool->Warn('Unrecognized data in IPTC trailer', 2);
+        my $pad = substr($$dataPt, $tail, $dirEnd-$tail);
+        if ($pad =~ /[^\0]/) {
+            return undef if $et->Warn('Unrecognized data in IPTC padding', 2);
         }
     }
     return $newData;
@@ -618,24 +618,24 @@ sub DoWriteIPTC($$$)
 # Notes: Increments ExifTool CHANGED flag for each tag changed
 sub WriteIPTC($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    $exifTool or return 1;    # allow dummy access to autoload this package
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    $et or return 1;    # allow dummy access to autoload this package
 
-    my $newData = DoWriteIPTC($exifTool, $dirInfo, $tagTablePtr);
+    my $newData = DoWriteIPTC($et, $dirInfo, $tagTablePtr);
 
     # calculate standard IPTC digests only if we are writing or deleting
     # Photoshop:IPTCDigest with a value of 'new' or 'old'
     while ($Image::ExifTool::Photoshop::iptcDigestInfo) {
-        my $nvHash = $exifTool->{NEW_VALUE}{$Image::ExifTool::Photoshop::iptcDigestInfo};
+        my $nvHash = $$et{NEW_VALUE}{$Image::ExifTool::Photoshop::iptcDigestInfo};
         last unless defined $nvHash;
-        last unless IsStandardIPTC($exifTool->MetadataPath());
-        my @values = $exifTool->GetNewValues($nvHash);
+        last unless IsStandardIPTC($et->MetadataPath());
+        my @values = $et->GetNewValues($nvHash);
         push @values, @{$$nvHash{DelValue}} if $$nvHash{DelValue};
         my $new = grep /^new$/, @values;
         my $old = grep /^old$/, @values;
         last unless $new or $old;
-        unless (eval 'require Digest::MD5') {
-            $exifTool->Warn('Digest::MD5 must be installed to calculate IPTC digest');
+        unless (eval { require Digest::MD5 }) {
+            $et->Warn('Digest::MD5 must be installed to calculate IPTC digest');
             last;
         }
         my $dataPt;
@@ -650,18 +650,18 @@ sub WriteIPTC($$$)
                 }
             }
             # set NewIPTCDigest data member unless IPTC is being deleted
-            $$exifTool{NewIPTCDigest} = Digest::MD5::md5($$dataPt) if length $$dataPt;
+            $$et{NewIPTCDigest} = Digest::MD5::md5($$dataPt) if length $$dataPt;
         }
         if ($old) {
             if ($new and not defined $newData) {
-                $$exifTool{OldIPTCDigest} = $$exifTool{NewIPTCDigest};
+                $$et{OldIPTCDigest} = $$et{NewIPTCDigest};
             } elsif ($$dirInfo{DataPt}) { #(may be undef if creating new IPTC)
                 $dataPt = $$dirInfo{DataPt};
                 if ($$dirInfo{DirStart} or length($$dataPt) != $$dirInfo{DirLen}) {
                     my $buff = substr($$dataPt, $$dirInfo{DirStart}, $$dirInfo{DirLen});
                     $dataPt = \$buff;
                 }
-                $$exifTool{OldIPTCDigest} = Digest::MD5::md5($$dataPt) if length $$dataPt;
+                $$et{OldIPTCDigest} = Digest::MD5::md5($$dataPt) if length $$dataPt;
             }
         }
         last;
@@ -689,7 +689,7 @@ seldom-used routines.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -31,13 +31,18 @@ my %myDictTags = (
     _filtered => 1, _entry_size => 1, _table => 1,
 );
 
+# map for directories that we can add
+my %pdfMap = (
+    XMP => 'PDF',
+);
+
 #------------------------------------------------------------------------------
 # Validate raw PDF values for writing (string date integer real boolean name)
 # Inputs: 0) ExifTool object ref, 1) tagInfo hash ref, 2) raw value ref
 # Returns: error string or undef (and possibly changes value) on success
 sub CheckPDF($$$)
 {
-    my ($exifTool, $tagInfo, $valPtr) = @_;
+    my ($et, $tagInfo, $valPtr) = @_;
     my $format = $$tagInfo{Writable} || $tagInfo->{Table}->{WRITABLE};
     if (not $format) {
         return 'No writable format';
@@ -67,12 +72,12 @@ sub CheckPDF($$$)
 # Notes: Called at write time, so $pdfVer may be checked
 sub WritePDFValue($$$)
 {
-    my ($exifTool, $val, $format) = @_;
+    my ($et, $val, $format) = @_;
     if (not $format) {
         return undef;
     } elsif ($format eq 'string') {
         # encode as UCS2 if it contains any special characters
-        $val = "\xfe\xff" . $exifTool->Encode($val,'UCS2','MM') if $val =~ /[\x80-\xff]/;
+        $val = "\xfe\xff" . $et->Encode($val,'UCS2','MM') if $val =~ /[\x80-\xff]/;
         EncodeString(\$val);
     } elsif ($format eq 'date') {
         # convert date to "D:YYYYmmddHHMMSS+-HH'MM'" format
@@ -271,7 +276,7 @@ sub WriteObject($$)
 #                                      +--> Root --> Metadata
 sub WritePDF($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my $outfile = $$dirInfo{OutFile};
     my ($buff, %capture, %newXRef, %newObj, $objRef);
@@ -286,35 +291,36 @@ sub WritePDF($$)
     # create a new ExifTool object and use it to read PDF and XMP information
     my $newTool = new Image::ExifTool;
     $newTool->Options(List => 1);
-    $newTool->Options(Password => $exifTool->Options('Password'));
+    $newTool->Options(Password => $et->Options('Password'));
     $$newTool{PDF_CAPTURE} = \%capture;
     my $info = $newTool->ImageInfo($raf, 'XMP', 'PDF:*', 'Error', 'Warning');
     # not a valid PDF file unless we got a version number
     # (note: can't just check $$info{PDFVersion} due to possibility of XMP-pdf:PDFVersion)
     my $vers = $newTool->GetInfo('PDF:PDFVersion');
     ($pdfVer) = values %$vers;
-    $pdfVer or $exifTool->Error('Missing PDF:PDFVersion'), return 0;
+    $pdfVer or $et->Error('Missing PDF:PDFVersion'), return 0;
     # check version number
     if ($pdfVer > 1.7) {
         if ($pdfVer >= 2.0) {
-            $exifTool->Error("Can't yet write PDF version $pdfVer"); # (future major version changes)
+            $et->Error("Can't yet write PDF version $pdfVer"); # (future major version changes)
             return 1;
         }
-        $exifTool->Warn("ExifTool is untested with PDF version $pdfVer files", 1);
+        $et->Warn("ExifTool is untested with PDF version $pdfVer files", 1);
     }
     # fail if we had any serious errors while extracting information
     if ($capture{Error} or $$info{Error}) {
-        $exifTool->Error($capture{Error} || $$info{Error});
+        $et->Error($capture{Error} || $$info{Error});
         return 1;
     }
     # make sure we have everything we need to rewrite this file
     foreach $obj (qw(Main Root xref)) {
         next if $capture{$obj};
         # any warning we received may give a clue about why this object is missing
-        $exifTool->Error($$info{Warning}) if $$info{Warning};
-        $exifTool->Error("Can't find $obj object");
+        $et->Error($$info{Warning}) if $$info{Warning};
+        $et->Error("Can't find $obj object");
         return 1;
     }
+    $et->InitWriteDirs(\%pdfMap, 'XMP');
 
     # copy file up to start of previous exiftool update or end of file
     # (comment, startxref & EOF with 11-digit offsets and 2-byte newlines is 63 bytes)
@@ -328,17 +334,17 @@ sub WritePDF($$)
         Image::ExifTool::CopyBlock($raf, $outfile, $prevUpdate) or $rtn = -1;
         # verify that we are now at the start of an ExifTool update
         unless ($raf->Read($buff, length $beginComment) and $buff eq $beginComment) {
-            $exifTool->Error('Previous ExifTool update is corrupted');
+            $et->Error('Previous ExifTool update is corrupted');
             return $rtn;
         }
         $raf->Seek($prevUpdate, 0) or $rtn = -1;
-        if ($exifTool->{DEL_GROUP}->{'PDF-update'}) {
-            $exifTool->VPrint(0, "  Reverted previous ExifTool updates\n");
-            ++$$exifTool{CHANGED};
+        if ($$et{DEL_GROUP}{'PDF-update'}) {
+            $et->VPrint(0, "  Reverted previous ExifTool updates\n");
+            ++$$et{CHANGED};
             return $rtn;
         }
-    } elsif ($exifTool->{DEL_GROUP}->{'PDF-update'}) {
-        $exifTool->Error('File contains no previous ExifTool update');
+    } elsif ($$et{DEL_GROUP}{'PDF-update'}) {
+        $et->Error('File contains no previous ExifTool update');
         return $rtn;
     } else {
         # rewrite the whole file
@@ -346,7 +352,7 @@ sub WritePDF($$)
             Write($outfile, $buff) or $rtn = -1;
         }
     }
-    $out = $exifTool->Options('TextOut') if $exifTool->Options('Verbose');
+    $out = $et->Options('TextOut') if $et->Options('Verbose');
 #
 # create our new PDF objects to write
 #
@@ -360,7 +366,7 @@ sub WritePDF($$)
     my $prevInfoRef;
     if ($prevUpdate) {
         unless ($capture{Prev}) {
-            $exifTool->Error("Can't locate trailer dictionary prior to last edit");
+            $et->Error("Can't locate trailer dictionary prior to last edit");
             return $rtn;
         }
         $prevInfoRef = $capture{Prev}->{Info};
@@ -376,7 +382,7 @@ sub WritePDF($$)
 
     # delete entire PDF group if specified
     my $infoChanged = 0;
-    if ($exifTool->{DEL_GROUP}->{PDF} and $capture{Info}) {
+    if ($$et{DEL_GROUP}{PDF} and $capture{Info}) {
         delete $capture{Info};
         $info = { XMP => $$info{XMP} }; # remove extracted PDF tags
         print $out "  Deleting PDF Info dictionary\n" if $out;
@@ -398,11 +404,11 @@ sub WritePDF($$)
     local $/ = $capture{newline};
 
     # rewrite PDF Info tags
-    my $newTags = $exifTool->GetNewTagInfoHash(\%Image::ExifTool::PDF::Info);
+    my $newTags = $et->GetNewTagInfoHash(\%Image::ExifTool::PDF::Info);
     my $tagID;
     foreach $tagID (sort keys %$newTags) {
         my $tagInfo = $$newTags{$tagID};
-        my $nvHash = $exifTool->GetNewValueHash($tagInfo);
+        my $nvHash = $et->GetNewValueHash($tagInfo);
         my (@vals, $deleted);
         my $tag = $$tagInfo{Name};
         my $val = $$info{$tag};
@@ -419,9 +425,9 @@ sub WritePDF($$)
                 $val = shift @oldVals;
             }
             for (;;) {
-                if ($exifTool->IsOverwriting($nvHash, $val) > 0) {
+                if ($et->IsOverwriting($nvHash, $val) > 0) {
                     $deleted = 1;
-                    $exifTool->VerboseValue("- PDF:$tag", $val);
+                    $et->VerboseValue("- PDF:$tag", $val);
                     ++$infoChanged;
                 } else {
                     push @vals, $val;
@@ -439,13 +445,13 @@ sub WritePDF($$)
         next unless $deleted or $$tagInfo{List} or not exists $$infoDict{$tagID};
         
         # add new values to existing ones
-        my @newVals = $exifTool->GetNewValues($nvHash);
+        my @newVals = $et->GetNewValues($nvHash);
         if (@newVals) {
             push @vals, @newVals;
             ++$infoChanged;
             if ($out) {
                 foreach $val (@newVals) {
-                    $exifTool->VerboseValue("+ PDF:$tag", $val);
+                    $et->VerboseValue("+ PDF:$tag", $val);
                 }
             }
         }
@@ -457,25 +463,25 @@ sub WritePDF($$)
         # format value(s) for writing to PDF file
         my $writable = $$tagInfo{Writable} || $Image::ExifTool::PDF::Info{WRITABLE};
         if (not $$tagInfo{List}) {
-            $val = WritePDFValue($exifTool, shift(@vals), $writable);
+            $val = WritePDFValue($et, shift(@vals), $writable);
         } elsif ($$tagInfo{List} eq 'array') {
             foreach $val (@vals) {
-                $val = WritePDFValue($exifTool, $val, $writable);
+                $val = WritePDFValue($et, $val, $writable);
                 defined $val or undef(@vals), last;
             }
             $val = @vals ? \@vals : undef;
         } else {
-            $val = WritePDFValue($exifTool, join($exifTool->Options('ListSep'), @vals), $writable);
+            $val = WritePDFValue($et, join($et->Options('ListSep'), @vals), $writable);
         }
         if (defined $val) {
             $$infoDict{$tagID} = $val;
             ++$infoChanged;
         } else {
-            $exifTool->Warn("Error converting $$tagInfo{Name} value");
+            $et->Warn("Error converting $$tagInfo{Name} value");
         }
     }
     if ($infoChanged) {
-        $$exifTool{CHANGED} += $infoChanged;
+        $$et{CHANGED} += $infoChanged;
     } elsif ($prevUpdate) {
         # must still write Info dictionary if it was previously updated
         my $oldPos = LocateObject($xref, $$infoRef);
@@ -503,19 +509,19 @@ sub WritePDF($$)
         Parent => 'PDF',
     );
     my $xmpTable = Image::ExifTool::GetTagTable('Image::ExifTool::XMP::Main');
-    my $oldChanged = $$exifTool{CHANGED};
-    my $newXMP = $exifTool->WriteDirectory(\%xmpInfo, $xmpTable);
+    my $oldChanged = $$et{CHANGED};
+    my $newXMP = $et->WriteDirectory(\%xmpInfo, $xmpTable);
     $newXMP = $$info{XMP} ? ${$$info{XMP}} : '' unless defined $newXMP;
 
     # WriteDirectory() will increment CHANGED erroneously if non-existent
     # XMP is deleted as a block -- so check for this
     unless ($newXMP or $$info{XMP}) {
-        $$exifTool{CHANGED} = $oldChanged;
-        $exifTool->VPrint(0, "  (XMP not changed -- still empty)\n");
+        $$et{CHANGED} = $oldChanged;
+        $et->VPrint(0, "  (XMP not changed -- still empty)\n");
     }
     my ($metaChanged, $rootChanged);
 
-    if ($$exifTool{CHANGED} != $oldChanged and defined $newXMP) {
+    if ($$et{CHANGED} != $oldChanged and defined $newXMP) {
         $metaChanged = 1;
     } elsif ($prevUpdate and $capture{Root}->{Metadata}) {
         # must still write Metadata dictionary if it was previously updated
@@ -550,7 +556,7 @@ sub WritePDF($$)
     # add new Root dictionary if necessary
     my $rootRef = $$mainDict{Root};
     unless ($rootRef) {
-        $exifTool->Error("Can't find Root dictionary");
+        $et->Error("Can't find Root dictionary");
         return $rtn;
     }
     if (not $rootChanged and $prevUpdate) {
@@ -562,7 +568,7 @@ sub WritePDF($$)
 #
 # write incremental update if anything was changed
 #
-    if ($$exifTool{CHANGED}) {
+    if ($$et{CHANGED}) {
         # remember position of original EOF
         my $oldEOF = Tell($outfile);
         Write($outfile, $beginComment) or $rtn = -1;
@@ -655,7 +661,7 @@ sub WritePDF($$)
                     $id = shift @ids;
                     my ($pos, $gen, $type) = @{$newXRef{$id}};
                     if ($pos > 0xffffffff) {
-                        $exifTool->Error('Huge files not yet supported');
+                        $et->Error('Huge files not yet supported');
                         last;
                     }
                     $$mainDict{_stream} .= pack('CNn', $type eq 'f' ? 0 : 1, $pos, $gen);
@@ -738,7 +744,7 @@ C<PDF-update> pseudo group).
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -68,7 +68,7 @@ sub WriteProfile($$$;$)
 {
     my ($outfile, $rawType, $dataPt, $profile) = @_;
     my ($buff, $prefix, $chunk, $deflate);
-    if (eval 'require Compress::Zlib') {
+    if (eval { require Compress::Zlib }) {
         $deflate = Compress::Zlib::deflateInit();
     }
     if (not defined $profile) {
@@ -111,28 +111,62 @@ sub WriteProfile($$$;$)
 # Returns: true on success
 sub Add_iCCP($$)
 {
-    my ($exifTool, $outfile) = @_;
-    if ($exifTool->{ADD_DIRS}->{ICC_Profile}) {
+    my ($et, $outfile) = @_;
+    if ($$et{ADD_DIRS}{ICC_Profile}) {
         # write new ICC data
         my $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::ICC_Profile::Main');
         my %dirInfo = ( Parent => 'PNG', DirName => 'ICC_Profile' );
-        my $buff = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr);
+        my $buff = $et->WriteDirectory(\%dirInfo, $tagTablePtr);
         if (defined $buff and length $buff and WriteProfile($outfile, 'icm', \$buff)) {
-            $exifTool->VPrint(0, "Created ICC profile\n");
-            delete $exifTool->{ADD_DIRS}->{ICC_Profile}; # don't add it again
+            $et->VPrint(0, "Created ICC profile\n");
+            delete $$et{ADD_DIRS}{ICC_Profile}; # don't add it again
+            $$et{PNGDoneDir}{ICC_Profile} = 2;
         }
     }
     return 1;
 }
 
 #------------------------------------------------------------------------------
+# This routine is called after we edit an existing directory
+# Inputs: 0) ExifTool ref, 1) dir name, 2) output data ref
+#         3) flag set if location is non-standard (to update, but not create from scratch)
+# - on return, $$outBuff is set to '' if the directory is to be deleted
+sub DoneDir($$$;$)
+{
+    my ($et, $dir, $outBuff, $nonStandard) = @_;
+    # don't add this directory again unless this is in a non-standard location
+    delete $$et{ADD_DIRS}{$dir} unless $nonStandard;
+    # handle problem with duplicate XMP when using PNGEarlyXMP option
+    return unless $dir eq 'XMP' and defined $$outBuff and length $$outBuff;
+    if ($nonStandard and $$et{DEL_GROUP}{$dir}) {
+        $et->VPrint(0,"  Deleting non-standard $dir\n");
+        $$outBuff = '';
+    } elsif (not $$et{PNGDoneDir}{$dir}) {
+        $$et{PNGDoneDir}{$dir} = 1;   # set flag indicating the directory exists
+    } elsif ($$et{OPTIONS}{PNGEarlyXMP}) {
+        if ($$et{PNGDoneDir}{$dir} == 2) {
+            if ($$et{OPTIONS}{IgnoreMinorErrors}) {
+                $et->Warn("Deleted existing $dir");
+            } else {
+                $et->Error("Duplicate $dir created. Ignore to delete existing $dir", 1);
+                return;
+            }
+        } elsif ($et->Warn("Duplicate $dir. Ignore to delete", 2)) {
+            return; # warning not ignored: don't delete the duplicate
+        }
+        $et->VPrint(0,"  Deleting duplicate $dir\n");
+        $$outBuff = '';
+    }
+}
+
+#------------------------------------------------------------------------------
 # Generate tEXt, zTXt or iTXt data for writing
 # Inputs: 0) ExifTool ref, 1) tagID, 2) tagInfo ref, 3) value string, 4) language code
 # Returns: chunk data (not including 8-byte chunk header)
 # Notes: Sets ExifTool TextChunkType member to the type of chunk written
 sub BuildTextChunk($$$$$)
 {
-    my ($exifTool, $tag, $tagInfo, $val, $lang) = @_;
+    my ($et, $tag, $tagInfo, $val, $lang) = @_;
     my ($xtra, $compVal, $iTXt, $comp);
     if ($$tagInfo{SubDirectory}) {
         if ($$tagInfo{Name} eq 'XMP') {
@@ -143,17 +177,17 @@ sub BuildTextChunk($$$$$)
         }
     } else {
         # compress if specified
-        $comp = 1 if $exifTool->Options('Compress');
+        $comp = 1 if $et->Options('Compress');
         if ($lang) {
             $iTXt = 1;      # write as iTXt if it has a language code
             $tag =~ s/-$lang$//;    # remove language code from tagID
-        } elsif ($$exifTool{OPTIONS}{Charset} ne 'Latin' and $val =~  /[\x80-\xff]/) {
+        } elsif ($$et{OPTIONS}{Charset} ne 'Latin' and $val =~  /[\x80-\xff]/) {
             $iTXt = 1;      # write as iTXt if it contains non-Latin special characters
         }
     }
     if ($comp) {
         my $warn;
-        if (eval 'require Compress::Zlib') {
+        if (eval { require Compress::Zlib }) {
             my $deflate = Compress::Zlib::deflateInit();
             $compVal = $deflate->deflate($val) if $deflate;
             if (defined $compVal) {
@@ -171,20 +205,20 @@ sub BuildTextChunk($$$$$)
         }
         # warn if any user-specified compression fails
         if ($warn and $comp == 1) {
-            $exifTool->Warn("PNG:$$tagInfo{Name} not compressed ($warn)", 1);
+            $et->Warn("PNG:$$tagInfo{Name} not compressed ($warn)", 1);
         }
     }
     # decide whether to write as iTXt, zTXt or tEXt
     if ($iTXt) {
-        $$exifTool{TextChunkType} = 'iTXt';
+        $$et{TextChunkType} = 'iTXt';
         $xtra = (defined $compVal ? "\x01\0" : "\0\0") . ($lang || '') . "\0\0";
         # iTXt is encoded as UTF-8 (but note that XMP is already UTF-8)
-        $val = $exifTool->Encode($val, 'UTF8') if $iTXt == 1;
+        $val = $et->Encode($val, 'UTF8') if $iTXt == 1;
     } elsif (defined $compVal) {
-        $$exifTool{TextChunkType} = 'zTXt';
+        $$et{TextChunkType} = 'zTXt';
         $xtra = "\0";
     } else {
-        $$exifTool{TextChunkType} = 'tEXt';
+        $$et{TextChunkType} = 'tEXt';
         $xtra = '';
     }
     return $tag . "\0" . $xtra . (defined $compVal ? $compVal : $val);
@@ -193,60 +227,68 @@ sub BuildTextChunk($$$$$)
 #------------------------------------------------------------------------------
 # Add any outstanding new chunks to the PNG image
 # Inputs: 0) ExifTool object ref, 1) output file or scalar ref
+#         2-N) dirs to add (empty to add all, including PNG tags)
 # Returns: true on success
-sub AddChunks($$)
+sub AddChunks($$;@)
 {
-    my ($exifTool, $outfile) = @_;
-    # write any outstanding PNG tags
-    my $addTags = $exifTool->{ADD_PNG};
-    delete $exifTool->{ADD_PNG};
-    my ($tag, $dir, $err, $tagTablePtr);
+    my ($et, $outfile, @add) = @_;
+    my ($addTags, $tag, $dir, $err, $tagTablePtr);
 
+    if (@add) {
+        $addTags = { }; # don't add any PNG tags
+    } else {
+        $addTags = $$et{ADD_PNG};    # add all PNG tags...
+        delete $$et{ADD_PNG};        # ...once
+        # add all directories
+        @add = sort keys %{$$et{ADD_DIRS}};
+    }
+    # write any outstanding PNG tags
     foreach $tag (sort keys %$addTags) {
         my $tagInfo = $$addTags{$tag};
-        my $nvHash = $exifTool->GetNewValueHash($tagInfo);
+        my $nvHash = $et->GetNewValueHash($tagInfo);
         # (native PNG information is always preferred, so don't check IsCreating)
-        next unless $exifTool->IsOverwriting($nvHash);
-        my $val = $exifTool->GetNewValues($nvHash);
+        next unless $et->IsOverwriting($nvHash);
+        my $val = $et->GetNewValues($nvHash);
         if (defined $val) {
             next if $$nvHash{EditOnly};
             my $data;
             if ($$tagInfo{Table} eq \%Image::ExifTool::PNG::TextualData) {
-                $data = BuildTextChunk($exifTool, $tag, $tagInfo, $val, $$tagInfo{LangCode});
-                $data = $$exifTool{TextChunkType} . $data;
-                delete $$exifTool{TextChunkType};
+                $data = BuildTextChunk($et, $tag, $tagInfo, $val, $$tagInfo{LangCode});
+                $data = $$et{TextChunkType} . $data;
+                delete $$et{TextChunkType};
             } else {
                 $data = "$tag$val";
             }
             my $hdr = pack('N', length($data) - 4);
             my $cbuf = pack('N', CalculateCRC(\$data, undef));
             Write($outfile, $hdr, $data, $cbuf) or $err = 1;
-            $exifTool->VerboseValue("+ PNG:$$tagInfo{Name}", $val);
-            ++$exifTool->{CHANGED};
+            $et->VerboseValue("+ PNG:$$tagInfo{Name}", $val);
+            $$et{PNGDoneTag}{$tag} = 1;   # set flag indicating this tag was added
+            ++$$et{CHANGED};
         }
     }
-    $addTags = { };     # prevent from adding tags again
     # create any necessary directories
-    foreach $dir (sort keys %{$exifTool->{ADD_DIRS}}) {
+    foreach $dir (@add) {
+        next unless $$et{ADD_DIRS}{$dir}; # make sure we want to add it first
         my $buff;
         my %dirInfo = (
             Parent => 'PNG',
             DirName => $dir,
         );
         if ($dir eq 'IFD0') {
-            $exifTool->VPrint(0, "Creating EXIF profile:\n");
-            $exifTool->{TIFF_TYPE} = 'APP1';
+            $et->VPrint(0, "Creating EXIF profile:\n");
+            $$et{TIFF_TYPE} = 'APP1';
             $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::Exif::Main');
-            $buff = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr, \&Image::ExifTool::WriteTIFF);
+            $buff = $et->WriteDirectory(\%dirInfo, $tagTablePtr, \&Image::ExifTool::WriteTIFF);
             if (defined $buff and length $buff) {
                 $buff = $Image::ExifTool::exifAPP1hdr . $buff;
                 WriteProfile($outfile, 'APP1', \$buff, 'generic') or $err = 1;
             }
         } elsif ($dir eq 'XMP') {
-            $exifTool->VPrint(0, "Creating XMP iTXt chunk:\n");
+            $et->VPrint(0, "Creating XMP iTXt chunk:\n");
             $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::XMP::Main');
             $dirInfo{ReadOnly} = 1;
-            $buff = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr);
+            $buff = $et->WriteDirectory(\%dirInfo, $tagTablePtr);
             if (defined $buff and length $buff and
                 # the packet is read-only (because of CRC)
                 Image::ExifTool::XMP::ValidateXMP(\$buff, 'r'))
@@ -261,26 +303,30 @@ sub AddChunks($$)
                 Write($outfile, $hdr, $buff, $cbuf) or $err = 1;
             }
         } elsif ($dir eq 'IPTC') {
-            $exifTool->VPrint(0, "Creating IPTC profile:\n");
+            $et->VPrint(0, "Creating IPTC profile:\n");
             # write new IPTC data (stored in a Photoshop directory)
             $dirInfo{DirName} = 'Photoshop';
             $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::Photoshop::Main');
-            $buff = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr);
+            $buff = $et->WriteDirectory(\%dirInfo, $tagTablePtr);
             if (defined $buff and length $buff) {
                 WriteProfile($outfile, 'iptc', \$buff, 'IPTC') or $err = 1;
             }
         } elsif ($dir eq 'ICC_Profile') {
-            $exifTool->VPrint(0, "Creating ICC profile:\n");
+            $et->VPrint(0, "Creating ICC profile:\n");
             # write new ICC data (only done if we couldn't create iCCP chunk)
             $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::ICC_Profile::Main');
-            $buff = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr);
+            $buff = $et->WriteDirectory(\%dirInfo, $tagTablePtr);
             if (defined $buff and length $buff) {
                 WriteProfile($outfile, 'icm', \$buff, 'ICC') or $err = 1;
-                $exifTool->Warn('Wrote ICC as a raw profile (no Compress::Zlib)');
+                $et->Warn('Wrote ICC as a raw profile (no Compress::Zlib)');
             }
+        } else {
+            next;
         }
+        delete $$et{ADD_DIRS}{$dir};  # don't add again
+        # keep track of the directories that we added
+        $$et{PNGDoneDir}{$dir} = 2 if defined $buff and length $buff;
     }
-    $exifTool->{ADD_DIRS} = { };    # prevent from adding dirs again
     return not $err;
 }
 
@@ -317,7 +363,7 @@ strings).
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -44,8 +44,8 @@ sub SetResourceName($$$)
 # Notes: Increments ExifTool CHANGED flag for each tag changed
 sub WritePhotoshop($$$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    $exifTool or return 1;    # allow dummy access to autoload this package
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    $et or return 1;    # allow dummy access to autoload this package
     my $dataPt = $$dirInfo{DataPt};
     unless ($dataPt) {
         my $emptyData = '';
@@ -57,9 +57,9 @@ sub WritePhotoshop($$$)
     my $newData = '';
 
     # make a hash of new tag info, keyed on tagID
-    my $newTags = $exifTool->GetNewTagInfoHash($tagTablePtr);
+    my $newTags = $et->GetNewTagInfoHash($tagTablePtr);
 
-    my ($addDirs, $editDirs) = $exifTool->GetAddDirHash($tagTablePtr);
+    my ($addDirs, $editDirs) = $et->GetAddDirHash($tagTablePtr);
 
     SetByteOrder('MM');     # Photoshop is always big-endian
 #
@@ -77,7 +77,7 @@ sub WritePhotoshop($$$)
         ++$pos if ($pos ^ $start) & 0x01;
         my $type = substr($$dataPt, $pos, 4);
         if ($type !~ /^(8BIM|PHUT|DCSR|AgHg)$/) {
-            $exifTool->Error("Bad Photoshop IRB resource");
+            $et->Error("Bad Photoshop IRB resource");
             undef $newData;
             last;
         }
@@ -86,7 +86,7 @@ sub WritePhotoshop($$$)
         my $namelen = 1 + Get8u($dataPt, $pos + 6);
         ++$namelen if $namelen & 0x01;
         if ($pos + $namelen + 10 > $dirEnd) {
-            $exifTool->Error("Bad APP13 resource block");
+            $et->Error("Bad APP13 resource block");
             undef $newData;
             last;
         }
@@ -94,43 +94,43 @@ sub WritePhotoshop($$$)
         $size = Get32u($dataPt, $pos + 6 + $namelen);
         $pos += $namelen + 10;
         if ($size + $pos > $dirEnd) {
-            $exifTool->Error("Bad APP13 resource data size $size");
+            $et->Error("Bad APP13 resource data size $size");
             undef $newData;
             last;
         }
         if ($$newTags{$tagID} and $type eq '8BIM') {
             $tagInfo = $$newTags{$tagID};
             delete $$newTags{$tagID};
-            my $nvHash = $exifTool->GetNewValueHash($tagInfo);
+            my $nvHash = $et->GetNewValueHash($tagInfo);
             # check to see if we are overwriting this tag
             $value = substr($$dataPt, $pos, $size);
-            my $isOverwriting = $exifTool->IsOverwriting($nvHash, $value);
+            my $isOverwriting = $et->IsOverwriting($nvHash, $value);
             # handle special 'new' and 'old' values for IPTCDigest
             if (not $isOverwriting and $tagInfo eq $iptcDigestInfo) {
                 if (grep /^new$/, @{$$nvHash{DelValue}}) {
-                    $isOverwriting = 1 if $$exifTool{NewIPTCDigest} and
-                                          $$exifTool{NewIPTCDigest} eq $value;
+                    $isOverwriting = 1 if $$et{NewIPTCDigest} and
+                                          $$et{NewIPTCDigest} eq $value;
                 }
                 if (grep /^old$/, @{$$nvHash{DelValue}}) {
-                    $isOverwriting = 1 if $$exifTool{OldIPTCDigest} and
-                                          $$exifTool{OldIPTCDigest} eq $value;
+                    $isOverwriting = 1 if $$et{OldIPTCDigest} and
+                                          $$et{OldIPTCDigest} eq $value;
                 }
             }
             if ($isOverwriting) {
-                $exifTool->VerboseValue("- Photoshop:$$tagInfo{Name}", $value);
+                $et->VerboseValue("- Photoshop:$$tagInfo{Name}", $value);
                 # handle IPTCDigest specially because we want to write it last
                 # so the new IPTC digest will be known
                 if ($tagInfo eq $iptcDigestInfo) {
                     $$newTags{$tagID} = $tagInfo;   # add later
                     $value = undef;
                 } else {
-                    $value = $exifTool->GetNewValues($nvHash);
+                    $value = $et->GetNewValues($nvHash);
                 }
-                ++$exifTool->{CHANGED};
+                ++$$et{CHANGED};
                 next unless defined $value;     # next if tag is being deleted
                 # set resource name if necessary
                 SetResourceName($tagInfo, $name, \$value);
-                $exifTool->VerboseValue("+ Photoshop:$$tagInfo{Name}", $value);
+                $et->VerboseValue("+ Photoshop:$$tagInfo{Name}", $value);
             }
         } else {
             if ($type eq '8BIM') {
@@ -138,7 +138,7 @@ sub WritePhotoshop($$$)
                 unless ($tagInfo) {
                     # process subdirectory anyway if writable (except EXIF to avoid recursion)
                     # --> this allows IPTC to be processed if found here in TIFF images
-                    my $tmpInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID);
+                    my $tmpInfo = $et->GetTagInfo($tagTablePtr, $tagID);
                     if ($tmpInfo and $$tmpInfo{SubDirectory} and
                         $tmpInfo->{SubDirectory}->{TagTable} ne 'Image::ExifTool::Exif::Main')
                     {
@@ -158,7 +158,7 @@ sub WritePhotoshop($$$)
                 );
                 my $subTable = Image::ExifTool::GetTagTable($tagInfo->{SubDirectory}->{TagTable});
                 my $writeProc = $tagInfo->{SubDirectory}->{WriteProc};
-                my $newValue = $exifTool->WriteDirectory(\%subdirInfo, $subTable, $writeProc);
+                my $newValue = $et->WriteDirectory(\%subdirInfo, $subTable, $writeProc);
                 if (defined $newValue) {
                     next unless length $newValue;   # remove subdirectory entry
                     $value = $newValue;
@@ -184,14 +184,14 @@ sub WritePhotoshop($$$)
         my $name = "\0\0";
         if ($$newTags{$tagID}) {
             $tagInfo = $$newTags{$tagID};
-            my $nvHash = $exifTool->GetNewValueHash($tagInfo);
-            $value = $exifTool->GetNewValues($nvHash);
+            my $nvHash = $et->GetNewValueHash($tagInfo);
+            $value = $et->GetNewValues($nvHash);
             # handle new IPTCDigest value specially
             if ($tagInfo eq $iptcDigestInfo and defined $value) {
                 if ($value eq 'new') {
-                    $value = $$exifTool{NewIPTCDigest};
+                    $value = $$et{NewIPTCDigest};
                 } elsif ($value eq 'old') {
-                    $value = $$exifTool{OldIPTCDigest};
+                    $value = $$et{OldIPTCDigest};
                 }
                 # (we already know we want to create this tag)
             } else {
@@ -199,8 +199,8 @@ sub WritePhotoshop($$$)
                 next unless $$nvHash{IsCreating};
             }
             next unless defined $value;     # next if tag is being deleted
-            $exifTool->VerboseValue("+ Photoshop:$$tagInfo{Name}", $value);
-            ++$exifTool->{CHANGED};
+            $et->VerboseValue("+ Photoshop:$$tagInfo{Name}", $value);
+            ++$$et{CHANGED};
         } else {
             $tagInfo = $$addDirs{$tagID};
             # create new directory
@@ -209,7 +209,7 @@ sub WritePhotoshop($$$)
             );
             my $subTable = Image::ExifTool::GetTagTable($tagInfo->{SubDirectory}->{TagTable});
             my $writeProc = $tagInfo->{SubDirectory}->{WriteProc};
-            $value = $exifTool->WriteDirectory(\%subdirInfo, $subTable, $writeProc);
+            $value = $et->WriteDirectory(\%subdirInfo, $subTable, $writeProc);
             next unless $value;
         }
         # set resource name if necessary
@@ -218,7 +218,7 @@ sub WritePhotoshop($$$)
         # write the new directory entry
         $newData .= '8BIM' . Set16u($tagID) . $name . Set32u($size) . $value;
         $newData .= "\0" if $size & 0x01;   # must null pad to even numbered byte
-        ++$exifTool->{CHANGED};
+        ++$$et{CHANGED};
     }
     return $newData;
 }
@@ -253,7 +253,7 @@ default resource name, and applied if no appended name is provided.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -94,7 +94,7 @@ sub WriteXMPDir($$@)
 # Returns: 0=error, 1=nothing written, 2=dir written ok
 sub WritePSDirectory($$$$$)
 {
-    my ($exifTool, $outfile, $dirName, $dataPt, $flags) = @_;
+    my ($et, $outfile, $dirName, $dataPt, $flags) = @_;
     my $success = 2;
     my $len = $dataPt ? length($$dataPt) : 0;
     my $create = $len ? 0 : 1;
@@ -116,14 +116,14 @@ sub WritePSDirectory($$$$$)
         # isolate the XMP
         pos($$dataPt) = 0;
         unless ($$dataPt =~ /(.*)(<\?xpacket begin=.{7,13}W5M0MpCehiHzreSzNTczkc9d)/sg) {
-            $exifTool->Warn('No XMP packet start');
+            $et->Warn('No XMP packet start');
             return WriteXMPDir($outfile, $flags, $$dataPt);
         }
         $beforeXMP = $1;
         my $xmp = $2;
         my $p1 = pos($$dataPt);
         unless ($$dataPt =~ m{<\?xpacket end=.(w|r).\?>}sg) {
-            $exifTool->Warn('No XMP packet end');
+            $et->Warn('No XMP packet end');
             return WriteXMPDir($outfile, $flags, $$dataPt);
         }
         my $p2 = pos($$dataPt);
@@ -142,7 +142,7 @@ sub WritePSDirectory($$$$$)
         $dirInfo{DataPt} = \$xmp;
     }
     my $tagTablePtr = Image::ExifTool::GetTagTable("Image::ExifTool::${dirName}::Main");
-    my $val = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr);
+    my $val = $et->WriteDirectory(\%dirInfo, $tagTablePtr);
     if (defined $val) {
         $dataPt = \$val;    # use modified directory
         $len = length $val;
@@ -160,7 +160,7 @@ sub WritePSDirectory($$$$$)
 <x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool $Image::ExifTool::VERSION'>
 </x:xmpmeta>
 EMPTY_XMP
-        $val .= ((' ' x 100) . "\n") x 24 unless $exifTool->Options('Compact');
+        $val .= ((' ' x 100) . "\n") x 24 unless $et->Options('Compact');
         $val .= q{<?xpacket end='w'?>};
         $dataPt = \$val;
         $len = length $val;
@@ -238,7 +238,7 @@ PS_AFTER
         }
         Write($outfile, $endToken, $/) or $success = 0;
     } else {
-        $exifTool->Warn("Can't write PS directory $dirName");
+        $et->Warn("Can't write PS directory $dirName");
     }
     undef $val;
     return $success;
@@ -278,7 +278,7 @@ sub EncodeTag($$)
 # Returns: true on success
 sub WriteNewTags($$$)
 {
-    my ($exifTool, $outfile, $newTags) = @_;
+    my ($et, $outfile, $newTags) = @_;
     my $success = 1;
     my $tag;
 
@@ -288,12 +288,12 @@ sub WriteNewTags($$$)
 
     foreach $tag (sort keys %$newTags) {
         my $tagInfo = $$newTags{$tag};
-        my $nvHash = $exifTool->GetNewValueHash($tagInfo);
+        my $nvHash = $et->GetNewValueHash($tagInfo);
         next unless $$nvHash{IsCreating};
-        my $val = $exifTool->GetNewValues($nvHash);
-        $exifTool->VerboseValue("+ PostScript:$$tagInfo{Name}", $val);
+        my $val = $et->GetNewValues($nvHash);
+        $et->VerboseValue("+ PostScript:$$tagInfo{Name}", $val);
         Write($outfile, EncodeTag($tag, $val)) or $success = 0;
-        ++$exifTool->{CHANGED};
+        ++$$et{CHANGED};
     }
     # write XMP hint if necessary
     Write($outfile, "%ADO_ContainsXMP: MainFirst$/") or $success = 0 if $xmpHint;
@@ -357,13 +357,13 @@ sub SplitLine($$)
 #          or -1 if a write error occurred
 sub WritePS($$)
 {
-    my ($exifTool, $dirInfo) = @_;
-    $exifTool or return 1;    # allow dummy access to autoload this package
+    my ($et, $dirInfo) = @_;
+    $et or return 1;    # allow dummy access to autoload this package
     my $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::PostScript::Main');
     my $raf = $$dirInfo{RAF};
     my $outfile = $$dirInfo{OutFile};
-    my $verbose = $exifTool->Options('Verbose');
-    my $out = $exifTool->Options('TextOut');
+    my $verbose = $et->Options('Verbose');
+    my $out = $et->Options('TextOut');
     my ($data, $buff, %flags, $err, $mode, $endToken);
     my ($dos, $psStart, $psEnd, $psNewStart, $xmpHint);
 
@@ -387,7 +387,7 @@ sub WritePS($$)
         unless ($raf->Seek($psStart, 0) and
                 $raf->Read($data, 4) == 4 and $data eq '%!PS')
         {
-            $exifTool->Error('Invalid PS header');
+            $et->Error('Invalid PS header');
             return 1;
         }
         $psEnd = $psStart + Get32u(\$dos, 8);
@@ -400,7 +400,7 @@ sub WritePS($$)
                 Base => $base,
                 NoTiffEnd => 1, # no end-of-TIFF check
             );
-            $buff = $exifTool->WriteTIFF(\%dirInfo);
+            $buff = $et->WriteTIFF(\%dirInfo);
             SetByteOrder('II'); # (WriteTIFF may change this)
             if ($buff) {
                 $buff = substr($buff, $base);   # remove header written by WriteTIFF()
@@ -408,10 +408,10 @@ sub WritePS($$)
                 # error rewriting TIFF, so just copy over original data
                 my $len = Get32u(\$dos, 24);
                 unless ($raf->Seek($base, 0) and $raf->Read($buff, $len) == $len) {
-                    $exifTool->Error('Error reading embedded TIFF');
+                    $et->Error('Error reading embedded TIFF');
                     return 1;
                 }
-                $exifTool->Warn('Bad embedded TIFF');
+                $et->Warn('Bad embedded TIFF');
             }
             Set32u(0, \$dos, 12);                   # zero metafile pointer
             Set32u(0, \$dos, 16);                   # zero metafile length
@@ -421,7 +421,7 @@ sub WritePS($$)
             # copy over metafile section
             my $len = Get32u(\$dos, 16);
             unless ($raf->Seek($base, 0) and $raf->Read($buff, $len) == $len) {
-                $exifTool->Error('Error reading metafile section');
+                $et->Error('Error reading metafile section');
                 return 1;
             }
             Set32u(length($dos), \$dos, 12);        # set metafile pointer
@@ -438,12 +438,12 @@ sub WritePS($$)
 #
     local $/ = GetInputRecordSeparator($raf);
     unless ($/ and $raf->ReadLine($buff)) {
-        $exifTool->Error('Invalid PostScript data');
+        $et->Error('Invalid PostScript data');
         return 1;
     }
     $data .= $buff;
     unless ($data =~ /^%!PS-Adobe-3\.(\d+)\b/ and $1 < 2) {
-        if ($exifTool->Error("Document does not conform to DSC spec. Metadata may be unreadable by other apps", 2)) {
+        if ($et->Error("Document does not conform to DSC spec. Metadata may be unreadable by other apps", 2)) {
             return 1;
         }
     }
@@ -452,17 +452,17 @@ sub WritePS($$)
     $flags{EPS} = 1 if $data =~ /EPSF/;
 
     # get hash of new information keyed by tagID and directories to add/edit
-    my $newTags = $exifTool->GetNewTagInfoHash($tagTablePtr);
+    my $newTags = $et->GetNewTagInfoHash($tagTablePtr);
 
     # figure out which directories we need to write (PostScript takes priority)
-    $exifTool->InitWriteDirs(\%psMap, 'PostScript');
-    my $addDirs = $exifTool->{ADD_DIRS};
-    my $editDirs = $exifTool->{EDIT_DIRS};
+    $et->InitWriteDirs(\%psMap, 'PostScript');
+    my $addDirs = $$et{ADD_DIRS};
+    my $editDirs = $$et{EDIT_DIRS};
     my %doneDir;
 
     # set XMP hint flag (1 for adding, 0 for deleting, undef for no change)
     $xmpHint = 1 if $$addDirs{XMP};
-    $xmpHint = 0 if $$exifTool{DEL_GROUP}{XMP};
+    $xmpHint = 0 if $$et{DEL_GROUP}{XMP};
     $$newTags{XMP_HINT} = $xmpHint if $xmpHint;  # add special tag to newTags list
 
     my (@lines, $changedNL);
@@ -499,9 +499,9 @@ sub WritePS($$)
                 undef $endToken;
                 # found end: process this information
                 if ($mode) {
-                    $doneDir{$mode} and $exifTool->Error("Multiple $mode directories", 1);
+                    $doneDir{$mode} and $et->Error("Multiple $mode directories", 1);
                     $doneDir{$mode} = 1;
-                    WritePSDirectory($exifTool, $outfile, $mode, \$buff, \%flags) or $err = 1;
+                    WritePSDirectory($et, $outfile, $mode, \$buff, \%flags) or $err = 1;
                     # write end token if we wrote the begin token
                     Write($outfile, $data) or $err = 1 if $flags{WROTE_BEGIN};
                     undef $buff;
@@ -531,7 +531,7 @@ sub WritePS($$)
             next;
         } elsif ($data =~ m{^(%{1,2})(Begin)(?!Object:)(.*?)[:\x0d\x0a]}i) {
             # comments section is over... write any new tags now
-            WriteNewTags($exifTool, $outfile, $newTags) or $err = 1 if %$newTags;
+            WriteNewTags($et, $outfile, $newTags) or $err = 1 if %$newTags;
             undef $xmpHint;
             # the beginning of a data block (can only write XMP and Photoshop)
             my %modeLookup = (
@@ -563,9 +563,9 @@ sub WritePS($$)
                 # (Illustrator 8 and older write PS-Adobe-3.0, newer write PS-Adobe-3.1)
                 if ($$editDirs{XMP} and $psRev == 0) {
                     if ($flags{EPS}) {
-                        $exifTool->Warn("Can't write XMP to Illustrator 8 or older EPS files");
+                        $et->Warn("Can't write XMP to Illustrator 8 or older EPS files");
                     } else {
-                        $exifTool->Warn("Can't write XMP to PS-format AI files");
+                        $et->Warn("Can't write XMP to PS-format AI files");
                     }
                     # pretend like we wrote it already so we won't try to add it later
                     $doneDir{XMP} = 1;
@@ -574,7 +574,7 @@ sub WritePS($$)
                 # (we need it to be able to recognize these files)
                 # --> find a better way to do this!
                 if ($$newTags{$tag}) {
-                    $exifTool->Warn("Can't change Postscript:Creator of Illustrator files");
+                    $et->Warn("Can't change Postscript:Creator of Illustrator files");
                     delete $$newTags{$tag};
                 }
             }
@@ -584,14 +584,14 @@ sub WritePS($$)
                 next unless ref $tagInfo;
                 # decode comment string (reading continuation lines if necessary)
                 $val = DecodeComment($val, $raf, \@lines, \$data);
-                $val = join $exifTool->Options('ListSep'), @$val if ref $val eq 'ARRAY';
-                my $nvHash = $exifTool->GetNewValueHash($tagInfo);
-                if ($exifTool->IsOverwriting($nvHash, $val)) {
-                    $exifTool->VerboseValue("- PostScript:$$tagInfo{Name}", $val);
-                    $val = $exifTool->GetNewValues($nvHash);
-                    ++$exifTool->{CHANGED};
+                $val = join $et->Options('ListSep'), @$val if ref $val eq 'ARRAY';
+                my $nvHash = $et->GetNewValueHash($tagInfo);
+                if ($et->IsOverwriting($nvHash, $val)) {
+                    $et->VerboseValue("- PostScript:$$tagInfo{Name}", $val);
+                    $val = $et->GetNewValues($nvHash);
+                    ++$$et{CHANGED};
                     next unless defined $val;   # next if tag is being deleted
-                    $exifTool->VerboseValue("+ PostScript:$$tagInfo{Name}", $val);
+                    $et->VerboseValue("+ PostScript:$$tagInfo{Name}", $val);
                     $data = EncodeTag($tag, $val);
                 }
             }
@@ -612,7 +612,7 @@ sub WritePS($$)
                 $data =~ /^%(%EndComments|%Page:|%PlateFile:|%BeginObject:|.*BeginLayer)/))
             {
                 # write new tags at end of comments section
-                WriteNewTags($exifTool, $outfile, $newTags) or $err = 1;
+                WriteNewTags($et, $outfile, $newTags) or $err = 1;
                 undef $xmpHint;
             }
             # look for start of drawing commands (AI uses "%AI5_BeginLayer",
@@ -629,12 +629,12 @@ sub WritePS($$)
                     next unless $$editDirs{$dir} and not $doneDir{$dir};
                     if ($plateFile) {
                         # PlateFile comments may contain offsets so we can't edit these files!
-                        $exifTool->Warn("Can only edit PostScript information DCS Plate files");
+                        $et->Warn("Can only edit PostScript information DCS Plate files");
                         last;
                     }
                     next unless $$addDirs{$dir} or $dir eq 'XMP';
                     $flags{WROTE_BEGIN} = 0;
-                    WritePSDirectory($exifTool, $outfile, $dir, undef, \%flags) or $err = 1;
+                    WritePSDirectory($et, $outfile, $dir, undef, \%flags) or $err = 1;
                     $doneDir{$dir} = 1;
                 }
                 # copy rest of file
@@ -684,7 +684,7 @@ sub WritePS($$)
                     print $outfile Set32u($pos - $psNewStart) and
                     seek($outfile, $pos, 0))
             {
-                $exifTool->Error("Can't write DOS-style PS files in non-seekable stream");
+                $et->Error("Can't write DOS-style PS files in non-seekable stream");
                 $err = 1;
             }
         }
@@ -696,11 +696,11 @@ sub WritePS($$)
         push @notDone, 'PostScript' if %$newTags;
         foreach $dir (qw{Photoshop ICC_Profile XMP}) {
             push @notDone, $dir if $$editDirs{$dir} and not $doneDir{$dir} and
-                                   not $$exifTool{DEL_GROUP}{$dir};
+                                   not $$et{DEL_GROUP}{$dir};
         }
-        @notDone and $exifTool->Warn("Couldn't write ".join('/',@notDone).' information');
+        @notDone and $et->Warn("Couldn't write ".join('/',@notDone).' information');
     }
-    $endToken and $exifTool->Error("File missing $endToken");
+    $endToken and $et->Error("File missing $endToken");
     return $err ? -1 : 1;
 }
 
@@ -764,7 +764,7 @@ Thanks to Tim Kordick for his help testing the EPS writer.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -0,0 +1,344 @@
+#------------------------------------------------------------------------------
+# File:         WriteQuickTime.pl
+#
+# Description:  Write XMP to QuickTime (MOV and MP4) files
+#
+# Revisions:    2013-10-29 - P. Harvey Created
+#------------------------------------------------------------------------------
+package Image::ExifTool::QuickTime;
+
+use strict;
+
+# map for adding directories to QuickTime-format files
+my %movMap = (
+    # MOV (no 'ftyp', or 'ftyp'='qt  ') -> 'moov'-'udta'-'XMP_'
+    XMP      => 'UserData',
+    UserData => 'Movie',
+    Movie    => 'MOV',
+);
+my %mp4Map = (
+    # MP4 ('ftyp' compatible brand 'mp41', 'mp42' or 'f4v ') -> top level 'uuid'
+   'UUID-XMP' => 'MOV',
+    XMP       => 'UUID-XMP',
+);
+my %dirMap = (
+    MOV => \%movMap,
+    MP4 => \%mp4Map,
+);
+
+#------------------------------------------------------------------------------
+# Check to see if path is current
+# Inputs: 0) ExifTool object ref, 1) directory name
+# Returns: true if current path is the root of the specified directory
+sub IsCurPath($$)
+{
+    local $_;
+    my ($et, $dir) = @_;
+    $dir = $$et{DirMap}{$dir} and $dir eq $_ or last foreach reverse @{$$et{PATH}}; 
+    return($dir and $dir eq 'MOV');    
+}
+
+#------------------------------------------------------------------------------
+# Write a series of QuickTime atoms from file or in memory
+# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
+# Returns: A) if dirInfo contains DataPt: new director data
+#          B) otherwise: true on success, 0 if a write error occurred
+#             (true but sets an Error on a file format error)
+sub WriteQuickTime($$$)
+{
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    my ($foundMDAT, @hold, $track);
+    my $outfile = $$dirInfo{OutFile} or return 0;
+    my $raf = $$dirInfo{RAF};
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirName = $$dirInfo{DirName};
+    my $parent = $$dirInfo{Parent};
+    my $addDirs = $$et{ADD_DIRS};
+    my $rtnVal = 1;
+
+    if ($dataPt) {
+        $raf = new File::RandomAccess($dataPt);
+        my $outBuff = '';
+        $outfile = \$outBuff;
+    } else {
+        return 0 unless $raf;
+    }
+    for (;;) {
+        my ($hdr, $buff);
+        my $n = $raf->Read($hdr, 8);
+        unless ($n == 8) {
+            if ($n == 4 and $hdr eq "\0\0\0\0") {
+                # "for historical reasons" the udta is optionally terminated by 4 zeros (ref 1)
+                # --> hold this terminator to the end
+                push @hold, $hdr;
+            } elsif ($n != 0) {
+                $et->Error('File format error');
+            }
+            last;
+        }
+        my ($size, $tag) = unpack('Na4', $hdr);
+        if ($size >= 8) {
+            $size -= 8;
+        } elsif ($size == 1) {
+            # read the extended size
+            $raf->Read($buff, 8) == 8 or $et->Error('Truncated extended atom'), last;
+            $hdr .= $buff;
+            my ($hi, $lo) = unpack('NN', $buff);
+            $size = $hi * 4294967296 + $lo - 16;
+            $size < 0 and $et->Error('Invalid extended atom size'), last;
+        } elsif (not $size and not $dataPt) {
+            # size of zero is only valid for top-level atom, and
+            # indicates the atom extends to the end of file
+            if (not $raf->{FILE_PT}) {
+                # get file size from image in memory
+                $size = length ${$$raf{BUFF_PT}};
+            } else {
+                $size = -s $$raf{FILE_PT};
+            }
+            if ($size and ($size -= $raf->Tell()) >= 0 and $size <= 0x7fffffff) {
+                Set32u($size + 8, \$hdr, 0);
+            } elsif (@hold) {
+                $et->Error("Sorry, can't yet add tags to this type of QuickTime file");
+                return $rtnVal;
+            } else {
+                # blindly copy the rest of the file
+                Write($outfile, $hdr) or $rtnVal = 0;
+                while ($raf->Read($buff, 65536)) {
+                    Write($outfile, $buff) or $rtnVal = 0, last;
+                }
+                return $rtnVal;
+            }
+        } else {
+            $et->Error('Invalid atom size');
+            last;
+        }
+
+        # set flag if we have passed the 'mdat' atom
+        $foundMDAT = 1 if $tag eq 'mdat';
+
+        # rewrite this atom
+        my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
+        if (defined $tagInfo and not $tagInfo) {
+            my $n = $size < 256 ? $size : 256;
+            unless ($raf->Read($buff, $n) == $n and $raf->Seek(-$n, 1)) {
+                $et->Error("Read/seek error in $tag atom");
+                last;
+            }
+            $tagInfo = $et->GetTagInfo($tagTablePtr, $tag, \$buff);
+        }
+        if ($tagInfo) {
+            if ($$tagInfo{Unknown}) {
+                undef $tagInfo;
+            } elsif ($size > 100000000) {
+                # limit maximum size of atom that we load into memory
+                my $mb = $size / 0x100000;
+                $et->Warn("Not editing metadata in $tag atom. $mb MB is too big");
+                undef $tagInfo;
+            }
+        }
+        if ($tagInfo) {
+            # read the atom data
+            $raf->Read($buff, $size) == $size or $et->Error("Error reading $tag data"), last;
+            my $subdir = $$tagInfo{SubDirectory};
+            my $newData;
+            if ($subdir) {
+                my $subName = $$subdir{DirName} || $$tagInfo{Name};
+                my $start = $$subdir{Start} || 0;
+                my $base = ($$dirInfo{Base} || 0) + $raf->Tell() - $size;
+                my $dPos = 0;
+                if ($$subdir{Base}) {
+                    $dPos -= eval $$subdir{Base};
+                    $base -= $dPos;
+                }
+                my %subdirInfo = (
+                    Parent   => $dirName,
+                    DirName  => $subName,
+                    DataPt   => \$buff,
+                    DataLen  => $size,
+                    DataPos  => $dPos,
+                    DirStart => $start,
+                    DirLen   => $size - $start,
+                    Base     => $base,
+                    HasData  => $$subdir{HasData},  # necessary?
+                    Multi    => $$subdir{Multi},    # necessary?
+                    OutFile  => $outfile,
+                );
+                SetByteOrder('II') if $$subdir{ByteOrder} and $$subdir{ByteOrder} =~ /^Little/;
+                my $oldWriteGroup = $$et{CUR_WRITE_GROUP};
+                if ($subName eq 'Track') {
+                    $track or $track = 0;
+                    $$et{CUR_WRITE_GROUP} = 'Track' . (++$track);
+                }
+                my $subTable = GetTagTable($$subdir{TagTable});
+                # demote non-QuickTime errors to warnings
+                $$et{DemoteErrors} = 1 unless $$subTable{GROUPS}{0} eq 'QuickTime';
+                $newData = $et->WriteDirectory(\%subdirInfo, $subTable);
+                if ($$et{DemoteErrors}) {
+                    # just copy existing subdirectory a non-quicktime error occurred
+                    undef $newData if $$et{DemoteErrors} > 1;
+                    delete $$et{DemoteErrors};
+                }
+                $$et{CUR_WRITE_GROUP} = $oldWriteGroup;
+                SetByteOrder('MM');
+                # add back header if necessary
+                if ($$subdir{Start} and defined $newData and length $newData) {
+                    $newData = substr($buff,0,$$subdir{Start}) . $newData;
+                }
+                # the directory exists, so we don't need to add it
+                delete $$addDirs{$subName} if IsCurPath($et, $subName);
+            } else {
+                # --> this is where individual QuickTime tags would be edited,
+                # (this is such a can of worms, so don't implement this for now)
+            }
+            if (defined $newData) {
+                my $len = length $newData or next;
+                $len > 0x7ffffff7 and $et->Error("$tag to large to write"), last;
+                if ($len == $size or $dataPt or $foundMDAT) {
+                    # write the updated directory now
+                    Write($outfile, Set32u($len+8), $tag, $newData) or $rtnVal = 0, last;
+                    next;
+                } else {
+                    # bad things happen if 'mdat' atom is moved (ie. Adobe Bridge crashes --
+                    # there must be some absolute offsets somewhere that point into mdat),
+                    # so hold this atom and write it out later
+                    push @hold, Set32u($len+8), $tag, $newData;
+                    $et->VPrint(0,"  Moving '$tag' atom to after 'mdat'");
+                    # write a 'free' atom here to keep 'mdat' at the same offset
+                    substr($hdr, 4, 4) = 'free';
+                    # could zero out old data if we wanted...
+                    # $buff = "\0" x length($buff);
+                }
+            }
+            # write out the existing atom (or 'free' padding)
+            Write($outfile, $hdr, $buff) or $rtnVal = 0, last;
+        } else {
+            # write the unknown/large atom header
+            Write($outfile, $hdr) or $rtnVal = 0, last;
+            next unless $size;
+            # copy the atom data
+            my $result = Image::ExifTool::CopyBlock($raf, $outfile, $size);
+            defined $result or $rtnVal = 0, last;
+            $result or $et->Error("Truncated $tag atom"), last;
+        }
+    }
+    # add new directories at this level if necessary
+    if (exists $$et{EDIT_DIRS}{$dirName}) {
+        # get a hash of tagInfo references to add to this directory
+        my $dirs = $et->GetAddDirHash($tagTablePtr, $dirName);
+        # make sorted list of new tags to be added
+        my @addTags = sort keys(%$dirs);
+        my $tag;
+        foreach $tag (@addTags) {
+            my $tagInfo = $$dirs{$tag};
+            my $subdir = $$tagInfo{SubDirectory} or next;
+            my $subName = $$subdir{DirName} || $$tagInfo{Name};
+            # QuickTime hierarchy is complex, so check full directory path before adding
+            next unless IsCurPath($et, $subName);
+            delete $$addDirs{$subName}; # add only once
+            my $buff = '';  # write from scratch
+            my %subdirInfo = (
+                Parent   => $dirName,
+                DirName  => $subName,
+                DataPt   => \$buff,
+                DirStart => 0,
+                OutFile  => $outfile,
+            );
+            my $subTable = GetTagTable($$subdir{TagTable});
+            my $newData = $et->WriteDirectory(\%subdirInfo, $subTable);
+            if ($newData and length($newData) <= 0x7ffffff7) {
+                my $uuid = '';
+                # add atom ID if necessary (obtain from Condition expression)
+                if ($$subdir{Start}) {
+                    my $cond = $$tagInfo{Condition};
+                    $uuid = eval qq("$1") if $cond and $cond =~ m{=~\s*\/\^(.*)/};
+                    length($uuid) == $$subdir{Start} or $et->Error('Internal UUID error');
+                }
+                my $newHdr = Set32u(8+length($newData)+length($uuid)) . $tag . $uuid;
+                Write($outfile, $newHdr, $newData) or $rtnVal = 0;
+            }
+        }
+    }
+    # write out any atoms that we are holding until the end
+    Write($outfile, @hold) or $rtnVal = 0 if @hold;
+
+    # issue minor error if we didn't find an 'mdat' atom
+    # (we could duplicate atoms indefinitely through repeated editing if we
+    #  held back some atoms here, so in this case it isn't a minor error)
+    $dataPt or $foundMDAT or $et->Error('No mdat atom found', @hold ? 0 : 1);
+
+    return $dataPt ? ($rtnVal ? $$outfile : undef) : $rtnVal;
+}
+
+#------------------------------------------------------------------------------
+# Write QuickTime-format MOV/MP4 file
+# Inputs: 0) ExifTool ref, 1) dirInfo ref
+# Returns: 1 on success, 0 if this wasn't a valid QuickTime file,
+#          or -1 if a write error occurred
+sub WriteMOV($$)
+{
+    my ($et, $dirInfo) = @_;
+    $et or return 1;
+    my $raf = $$dirInfo{RAF} or return 0;
+    my ($buff, $ftype);
+
+    # read the first atom header
+    return 0 unless $raf->Read($buff, 8) == 8;
+    my ($size, $tag) = unpack('Na4', $buff);
+    return 0 if $size < 8 and $size != 1;
+
+    # validate the file format
+    my $tagTablePtr = GetTagTable('Image::ExifTool::QuickTime::Main');
+    return 0 unless $$tagTablePtr{$tag};
+
+    # determine the file type
+    if ($tag eq 'ftyp' and $size >= 12 and $size < 100000 and
+        $raf->Read($buff, $size-8) == $size-8 and
+        $buff !~ /^(....)+(qt  )/s)
+    {
+        # file is MP4 format if 'ftyp' exists without 'qt  ' as a compatible brand
+        $ftype = 'MP4';
+    } else {
+        $ftype = 'MOV';
+    }
+    $et->SetFileType($ftype); # need to set "FileType" tag for a Condition
+    $et->InitWriteDirs($dirMap{$ftype}, 'XMP');
+    $$et{DirMap} = $dirMap{$ftype};     # need access to directory map when writing
+    SetByteOrder('MM');
+    $raf->Seek(0,0);
+
+    # write the file
+    $$dirInfo{Parent} = '';
+    $$dirInfo{DirName} = 'MOV';
+    return WriteQuickTime($et, $dirInfo, $tagTablePtr) ? 1 : -1;
+}
+
+1; # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::WriteQuickTime.pl - Write XMP to QuickTime (MOV and MP4) files
+
+=head1 SYNOPSIS
+
+These routines are autoloaded by Image::ExifTool::QuickTime.
+
+=head1 DESCRIPTION
+
+This file contains routines used by ExifTool to write XMP metadata to
+QuickTime-based file formats like MOV and MP4.
+
+=head1 AUTHOR
+
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::QuickTime(3pm)|Image::ExifTool::QuickTime>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
@@ -52,13 +52,13 @@ my $pktCloseR =  "<?xpacket end='r'?>";
 # Returns: x:xmpmeta opening tag
 sub XMPOpen($)
 {
-    my $exifTool = shift;
-    my $nv = $exifTool->{NEW_VALUE}->{$Image::ExifTool::XMP::x{xmptk}};
+    my $et = shift;
+    my $nv = $$et{NEW_VALUE}{$Image::ExifTool::XMP::x{xmptk}};
     my $tk;
     if (defined $nv) {
-        $tk = $exifTool->GetNewValues($nv);
-        $exifTool->VerboseValue(($tk ? '+' : '-') . ' XMP-x:XMPToolkit', $tk);
-        ++$exifTool->{CHANGED};
+        $tk = $et->GetNewValues($nv);
+        $et->VerboseValue(($tk ? '+' : '-') . ' XMP-x:XMPToolkit', $tk);
+        ++$$et{CHANGED};
     } else {
         $tk = "Image::ExifTool $Image::ExifTool::VERSION";
     }
@@ -121,7 +121,7 @@ sub FormatXMPDate($)
 # Note: copies structured information to avoid conflicts with calling code
 sub CheckXMP($$$)
 {
-    my ($exifTool, $tagInfo, $valPtr) = @_;
+    my ($et, $tagInfo, $valPtr) = @_;
 
     if ($$tagInfo{Struct}) {
         require 'Image/ExifTool/XMPStruct.pl';
@@ -143,31 +143,31 @@ sub CheckXMP($$$)
                     $err = 'Improperly formed structure';
                     last;
                 }
-                ($item, $err) = CheckStruct($exifTool, $item, $$tagInfo{Struct});
+                ($item, $err) = CheckStruct($et, $item, $$tagInfo{Struct});
                 last if $err;
             }
         } else {
-            ($$valPtr, $err) = CheckStruct($exifTool, $$valPtr, $$tagInfo{Struct});
+            ($$valPtr, $err) = CheckStruct($et, $$valPtr, $$tagInfo{Struct});
         }
-        $warn and $$exifTool{CHECK_WARN} = $warn;
+        $warn and $$et{CHECK_WARN} = $warn;
         return $err;
     }
-    my $format = $tagInfo->{Writable};
+    my $format = $$tagInfo{Writable};
     # (if no format specified, value is a simple string)
     if (not $format or $format eq 'string' or $format eq 'lang-alt') {
         # convert value to UTF8 if necessary
-        if ($exifTool->{OPTIONS}->{Charset} ne 'UTF8') {
+        if ($$et{OPTIONS}{Charset} ne 'UTF8') {
             if ($$valPtr =~ /[\x80-\xff]/) {
                 # convert from Charset to UTF-8
-                $$valPtr = $exifTool->Encode($$valPtr,'UTF8');
+                $$valPtr = $et->Encode($$valPtr,'UTF8');
             }
         } else {
             # translate invalid XML characters to "."
             $$valPtr =~ tr/\0-\x08\x0b\x0c\x0e-\x1f/./;
             # fix any malformed UTF-8 characters
-            if (FixUTF8($valPtr) and not $$exifTool{WarnBadUTF8}) {
-                $exifTool->Warn('Malformed UTF-8 character(s)');
-                $$exifTool{WarnBadUTF8} = 1;
+            if (FixUTF8($valPtr) and not $$et{WarnBadUTF8}) {
+                $et->Warn('Malformed UTF-8 character(s)');
+                $$et{WarnBadUTF8} = 1;
             }
         }
         return undef;   # success
@@ -315,7 +315,7 @@ sub SetPropertyPath($$;$$$$)
 #         2) property value, 3) optional reference to hash of property attributes
 sub CaptureXMP($$$;$)
 {
-    my ($exifTool, $propList, $val, $attrs) = @_;
+    my ($et, $propList, $val, $attrs) = @_;
     return unless defined $val and @$propList > 2;
     if ($$propList[0] =~ /^x:x[ma]pmeta$/ and
         $$propList[1] eq 'rdf:RDF' and
@@ -325,14 +325,14 @@ sub CaptureXMP($$$;$)
         return unless @$propList > 3;
         # ignore empty list properties
         if ($$propList[-1] =~ /^rdf:(Bag|Seq|Alt)$/) {
-            $exifTool->Warn("Ignored empty $$propList[-1] list for $$propList[-2]", 1);
+            $et->Warn("Ignored empty $$propList[-1] list for $$propList[-2]", 1);
             return;
         }
         # save information about this property
-        my $capture = $exifTool->{XMP_CAPTURE};
+        my $capture = $$et{XMP_CAPTURE};
         my $path = join('/', @$propList[3..$#$propList]);
         if (defined $$capture{$path}) {
-            $exifTool->{XMP_ERROR} = "Duplicate XMP property: $path";
+            $$et{XMP_ERROR} = "Duplicate XMP property: $path";
         } else {
             $$capture{$path} = [$val, $attrs || { }];
         }
@@ -340,12 +340,12 @@ sub CaptureXMP($$$;$)
              $$propList[1] =~ /$rdfDesc( |$)/)
     {
         # set flag so we don't write x:xmpmeta element
-        $exifTool->{XMP_NO_XMPMETA} = 1;
+        $$et{XMP_NO_XMPMETA} = 1;
         # add missing x:xmpmeta element and try again
         unshift @$propList, 'x:xmpmeta';
-        CaptureXMP($exifTool, $propList, $val, $attrs);
+        CaptureXMP($et, $propList, $val, $attrs);
     } else {
-        $exifTool->{XMP_ERROR} = 'Improperly enclosed XMP property: ' . join('/',@$propList);
+        $$et{XMP_ERROR} = 'Improperly enclosed XMP property: ' . join('/',@$propList);
     }
 }
 
@@ -377,10 +377,10 @@ sub SaveBlankInfo($$$;$)
                 $pre = "$pre/$prop";
             }
         }
-        $blankInfo->{Prop}->{$id}->{Pre}->{$pre} = 1;
+        $$blankInfo{Prop}{$id}{Pre}{$pre} = 1;
         if ((defined $post and length $post) or (defined $val and length $val)) {
             # save the property value and attributes for each unique path suffix
-            $blankInfo->{Prop}->{$id}->{Post}->{$post} = [ $val, $attrs, $propPath ];
+            $$blankInfo{Prop}{$id}{Post}{$post} = [ $val, $attrs, $propPath ];
         }
     }
 }
@@ -391,42 +391,42 @@ sub SaveBlankInfo($$$;$)
 #         2) blank node information hash ref, 3) flag set for writing
 sub ProcessBlankInfo($$$;$)
 {
-    my ($exifTool, $tagTablePtr, $blankInfo, $isWriting) = @_;
-    $exifTool->VPrint(1, "  [Elements with nodeID set:]\n") unless $isWriting;
+    my ($et, $tagTablePtr, $blankInfo, $isWriting) = @_;
+    $et->VPrint(1, "  [Elements with nodeID set:]\n") unless $isWriting;
     my ($id, $pre, $post);
     # handle each nodeID separately
     foreach $id (sort keys %{$$blankInfo{Prop}}) {
-        my $path = $blankInfo->{Prop}->{$id};
+        my $path = $$blankInfo{Prop}{$id};
         # flag all resource names so we can warn later if some are unused
         my %unused;
-        foreach $post (keys %{$path->{Post}}) {
+        foreach $post (keys %{$$path{Post}}) {
             $unused{$post} = 1;
         }
         # combine property paths for all possible paths through this node
-        foreach $pre (sort keys %{$path->{Pre}}) {
+        foreach $pre (sort keys %{$$path{Pre}}) {
             # there will be no description for the object of a blank node
             next unless $pre =~ m{/$rdfDesc/};
-            foreach $post (sort keys %{$path->{Post}}) {
+            foreach $post (sort keys %{$$path{Post}}) {
                 my @propList = split m{/}, "$pre$post";
-                my ($val, $attrs) = @{$path->{Post}->{$post}};
+                my ($val, $attrs) = @{$$path{Post}{$post}};
                 if ($isWriting) {
-                    CaptureXMP($exifTool, \@propList, $val, $attrs);
+                    CaptureXMP($et, \@propList, $val, $attrs);
                 } else {
-                    FoundXMP($exifTool, $tagTablePtr, \@propList, $val);
+                    FoundXMP($et, $tagTablePtr, \@propList, $val);
                 }
                 delete $unused{$post};
             }
         }
         # save information from unused properties (if RDF is malformed like f-spot output)
         if (%unused) {
-            $exifTool->Options('Verbose') and $exifTool->Warn('An XMP resource is about nothing');
+            $et->Options('Verbose') and $et->Warn('An XMP resource is about nothing');
             foreach $post (sort keys %unused) {
-                my ($val, $attrs, $propPath) = @{$path->{Post}->{$post}};
+                my ($val, $attrs, $propPath) = @{$$path{Post}{$post}};
                 my @propList = split m{/}, $propPath;
                 if ($isWriting) {
-                    CaptureXMP($exifTool, \@propList, $val, $attrs);
+                    CaptureXMP($et, \@propList, $val, $attrs);
                 } else {
-                    FoundXMP($exifTool, $tagTablePtr, \@propList, $val);
+                    FoundXMP($et, $tagTablePtr, \@propList, $val);
                 }
             }
         }
@@ -440,9 +440,9 @@ sub ProcessBlankInfo($$$;$)
 # Returns: conforming property path
 sub ConformPathToNamespace($$)
 {
-    my ($exifTool, $path) = @_;
+    my ($et, $path) = @_;
     my @propList = split('/',$path);
-    my $nsUsed = $exifTool->{XMP_NS};
+    my $nsUsed = $$et{XMP_NS};
     my $prop;
     foreach $prop (@propList) {
         my ($ns, $tag) = $prop =~ /(.+?):(.*)/;
@@ -470,7 +470,7 @@ sub ConformPathToNamespace($$)
 #            variable-namespace structures
 sub AddStructType($$$$;$)
 {
-    my ($exifTool, $tagTablePtr, $capture, $path, $basePath) = @_;
+    my ($et, $tagTablePtr, $capture, $path, $basePath) = @_;
     my @props = split '/', $path;
     my %doneID;
     for (;;) {
@@ -486,7 +486,7 @@ sub AddStructType($$$$;$)
             if ($type) {
                 my $pat = $$tagInfo{PropertyPath};
                 $pat or warn("Missing PropertyPath in AddStructType\n"), last;
-                $pat = ConformPathToNamespace($exifTool, $pat);
+                $pat = ConformPathToNamespace($et, $pat);
                 $pat =~  s/ \d+/ \\d\+/g;
                 $path =~ /^($pat)/ or warn("Wrong path in AddStructType\n"), last;
                 my $p = $1 . '/rdf:type';
@@ -500,9 +500,9 @@ sub AddStructType($$$$;$)
 
 #------------------------------------------------------------------------------
 # Utility routine to encode data in base64
-# Inputs: 0) binary data string
+# Inputs: 0) binary data string, 1) flag to avoid inserting newlines
 # Returns:   base64-encoded string
-sub EncodeBase64($)
+sub EncodeBase64($;$)
 {
     # encode the data in 45-byte chunks
     my $chunkSize = 45;
@@ -520,6 +520,7 @@ sub EncodeBase64($)
     # convert pad characters at the end (remember to account for trailing newline)
     my $pad = 3 - ($len % 3);
     substr($str, -$pad-1, $pad) = ('=' x $pad) if $pad < 3;
+    $str =~ tr/\n//d if $_[1];  # remove newlines if specified
     return $str;
 }
 
@@ -550,7 +551,7 @@ sub TypeFirst
 # Returns: 0) extended XMP ref, 1) GUID and updates $$dataPt (or undef if no extended XMP)
 sub LimitXMPSize($$$$$$)
 {
-    my ($exifTool, $dataPt, $maxLen, $about, $startPt, $extStart) = @_;
+    my ($et, $dataPt, $maxLen, $about, $startPt, $extStart) = @_;
 
     # return straight away if it isn't too big
     return undef if length($$dataPt) < $maxLen;
@@ -571,7 +572,7 @@ sub LimitXMPSize($$$$$$)
     pop @$startPt;    # remove end offset
     # write the descriptions from smallest to largest, as many in main XMP as possible
     my @descStart = sort { $descSize{$a} <=> $descSize{$b} } @$startPt;
-    my $extData = XMPOpen($exifTool) . $rdfOpen;
+    my $extData = XMPOpen($et) . $rdfOpen;
     for ($i=0; $i<2; ++$i) {
       foreach $start (@descStart) {
         # write main XMP first (in order of size), then extended XMP afterwards (in order)
@@ -582,11 +583,11 @@ sub LimitXMPSize($$$$$$)
     }
     $extData .= $rdfClose . $xmpClose;  # close rdf:RDF and x:xmpmeta
     # calculate GUID from MD5 of extended XMP data
-    if (eval 'require Digest::MD5') {
+    if (eval { require Digest::MD5 }) {
         $guid = uc unpack('H*', Digest::MD5::md5($extData));
         $newData =~ s/0{32}/$guid/;     # update GUID in main XMP segment
     }
-    $exifTool->VerboseValue('+ XMP-xmpNote:HasExtendedXMP', $guid);
+    $et->VerboseValue('+ XMP-xmpNote:HasExtendedXMP', $guid);
     $$dataPt = $newData;        # return main XMP block
     return (\$extData, $guid);  # return extended XMP and its GUID
 }
@@ -604,15 +605,15 @@ sub LimitXMPSize($$$$$$)
 #          and ExtendedGUID to be returned in dirInfo if extended XMP was required
 sub WriteXMP($$;$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
-    $exifTool or return 1;    # allow dummy access to autoload this package
+    my ($et, $dirInfo, $tagTablePtr) = @_;
+    $et or return 1;    # allow dummy access to autoload this package
     my $dataPt = $$dirInfo{DataPt};
     my (%capture, %nsUsed, $xmpErr, $tagInfo, $about);
     my $changed = 0;
     my $xmpFile = (not $tagTablePtr);   # this is an XMP data file if no $tagTablePtr
     # prefer XMP over other metadata formats in some types of files
-    my $preferred = $xmpFile || ($$exifTool{PreferredGroup} and $$exifTool{PreferredGroup} eq 'XMP');
-    my $verbose = $exifTool->Options('Verbose');
+    my $preferred = $xmpFile || ($$et{PreferredGroup} and $$et{PreferredGroup} eq 'XMP');
+    my $verbose = $et->Options('Verbose');
     my $dirLen = $$dirInfo{DirLen};
     $dirLen = length($$dataPt) if not defined $dirLen and $dataPt;
 #
@@ -624,55 +625,55 @@ sub WriteXMP($$;$)
     # The %capture hash is keyed on the complete property path beginning after
     # rdf:RDF/rdf:Description/.  The values are array references with the
     # following entries: 0) value, 1) attribute hash reference.
-    $exifTool->{XMP_CAPTURE} = \%capture;
-    $exifTool->{XMP_NS} = \%nsUsed;
-    delete $exifTool->{XMP_NO_XMPMETA};
-    delete $exifTool->{XMP_NO_XPACKET};
-    delete $exifTool->{XMP_IS_XML};
-    delete $exifTool->{XMP_IS_SVG};
+    $$et{XMP_CAPTURE} = \%capture;
+    $$et{XMP_NS} = \%nsUsed;
+    delete $$et{XMP_NO_XMPMETA};
+    delete $$et{XMP_NO_XPACKET};
+    delete $$et{XMP_IS_XML};
+    delete $$et{XMP_IS_SVG};
 
     if ($xmpFile or $dirLen) {
-        delete $exifTool->{XMP_ERROR};
-        delete $exifTool->{XMP_ABOUT};
+        delete $$et{XMP_ERROR};
+        delete $$et{XMP_ABOUT};
         # extract all existing XMP information (to the XMP_CAPTURE hash)
-        my $success = ProcessXMP($exifTool, $dirInfo, $tagTablePtr);
+        my $success = ProcessXMP($et, $dirInfo, $tagTablePtr);
         # don't continue if there is nothing to parse or if we had a parsing error
-        unless ($success and not $exifTool->{XMP_ERROR}) {
-            my $err = $exifTool->{XMP_ERROR} || 'Error parsing XMP';
+        unless ($success and not $$et{XMP_ERROR}) {
+            my $err = $$et{XMP_ERROR} || 'Error parsing XMP';
             # may ignore this error only if we were successful
             if ($xmpFile) {
                 my $raf = $$dirInfo{RAF};
                 # allow empty XMP data so we can create something from nothing
                 if ($success or not $raf->Seek(0,2) or $raf->Tell()) {
                     # no error message if not an XMP file
-                    return 0 unless $exifTool->{XMP_ERROR};
-                    if ($exifTool->Error($err, $success)) {
-                        delete $exifTool->{XMP_CAPTURE};
+                    return 0 unless $$et{XMP_ERROR};
+                    if ($et->Error($err, $success)) {
+                        delete $$et{XMP_CAPTURE};
                         return 0;
                     }
                 }
             } else {
-                if ($exifTool->Warn($err, $success)) {
-                    delete $exifTool->{XMP_CAPTURE};
+                if ($et->Warn($err, $success)) {
+                    delete $$et{XMP_CAPTURE};
                     return undef;
                 }
             }
         }
         $tagInfo = $Image::ExifTool::XMP::rdf{about};
-        if (defined $exifTool->{NEW_VALUE}->{$tagInfo}) {
-            $about = $exifTool->GetNewValues($exifTool->{NEW_VALUE}->{$tagInfo}) || '';
+        if (defined $$et{NEW_VALUE}{$tagInfo}) {
+            $about = $et->GetNewValues($$et{NEW_VALUE}{$tagInfo}) || '';
             if ($verbose > 1) {
-                my $wasAbout = $exifTool->{XMP_ABOUT};
-                $exifTool->VerboseValue('- XMP-rdf:About', UnescapeXML($wasAbout)) if defined $wasAbout;
-                $exifTool->VerboseValue('+ XMP-rdf:About', $about);
+                my $wasAbout = $$et{XMP_ABOUT};
+                $et->VerboseValue('- XMP-rdf:About', UnescapeXML($wasAbout)) if defined $wasAbout;
+                $et->VerboseValue('+ XMP-rdf:About', $about);
             }
             $about = EscapeXML($about); # must escape for XML
             ++$changed;
         } else {
-            $about = $exifTool->{XMP_ABOUT} || '';
+            $about = $$et{XMP_ABOUT} || '';
         }
-        delete $exifTool->{XMP_ERROR};
-        delete $exifTool->{XMP_ABOUT};
+        delete $$et{XMP_ERROR};
+        delete $$et{XMP_ABOUT};
     } else {
         $about = '';
     }
@@ -681,26 +682,26 @@ sub WriteXMP($$;$)
 #
     if ($xmpFile) {
         $tagInfo = $Image::ExifTool::Extra{XMP};
-        if ($tagInfo and $exifTool->{NEW_VALUE}->{$tagInfo}) {
+        if ($tagInfo and $$et{NEW_VALUE}{$tagInfo}) {
             my $rtnVal = 1;
-            my $newVal = $exifTool->GetNewValues($exifTool->{NEW_VALUE}->{$tagInfo});
+            my $newVal = $et->GetNewValues($$et{NEW_VALUE}{$tagInfo});
             if (defined $newVal and length $newVal) {
-                $exifTool->VPrint(0, "  Writing XMP as a block\n");
-                ++$exifTool->{CHANGED};
+                $et->VPrint(0, "  Writing XMP as a block\n");
+                ++$$et{CHANGED};
                 Write($$dirInfo{OutFile}, $newVal) or $rtnVal = -1;
             }
-            delete $exifTool->{XMP_CAPTURE};
+            delete $$et{XMP_CAPTURE};
             return $rtnVal;
         }
     }
 #
 # delete groups in family 1 if requested
 #
-    if (%{$exifTool->{DEL_GROUP}} and (grep /^XMP-.+$/, keys %{$exifTool->{DEL_GROUP}} or
+    if (%{$$et{DEL_GROUP}} and (grep /^XMP-.+$/, keys %{$$et{DEL_GROUP}} or
         # (logic is a bit more complex for group names in exiftool XML files)
         grep m{^http://ns.exiftool.ca/}, values %nsUsed))
     {
-        my $del = $exifTool->{DEL_GROUP};
+        my $del = $$et{DEL_GROUP};
         my $path;
         foreach $path (keys %capture) {
             my @propList = split('/',$path); # get property list
@@ -724,7 +725,7 @@ sub WriteXMP($$;$)
                 my $ucg = uc $grp;
                 next unless $$del{$ucg} or ($$del{'XMP-*'} and not $$del{"-$ucg"});
             }
-            $exifTool->VerboseValue("- $grp:$tag", $capture{$path}->[0]);
+            $et->VerboseValue("- $grp:$tag", $capture{$path}->[0]);
             delete $capture{$path};
             ++$changed;
         }
@@ -732,24 +733,24 @@ sub WriteXMP($$;$)
     # delete HasExtendedXMP tag (we create it as needed)
     my $hasExtTag = 'xmpNote:HasExtendedXMP';
     if ($capture{$hasExtTag}) {
-        $exifTool->VerboseValue("- XMP-$hasExtTag", $capture{$hasExtTag}->[0]);
+        $et->VerboseValue("- XMP-$hasExtTag", $capture{$hasExtTag}->[0]);
         delete $capture{$hasExtTag};
     }
     # set $xmpOpen now to to handle xmptk tag first
-    my $xmpOpen = $exifTool->{XMP_NO_XMPMETA} ? '' : XMPOpen($exifTool);
+    my $xmpOpen = $$et{XMP_NO_XMPMETA} ? '' : XMPOpen($et);
 #
 # add, delete or change information as specified
 #
     # get hash of all information we want to change
     # (sorted by tag name so alternate languages come last)
-    my @tagInfoList = sort ByTagName $exifTool->GetNewTagInfoList();
+    my @tagInfoList = sort ByTagName $et->GetNewTagInfoList();
     foreach $tagInfo (@tagInfoList) {
-        next unless $exifTool->GetGroup($tagInfo, 0) eq 'XMP';
+        next unless $et->GetGroup($tagInfo, 0) eq 'XMP';
         next if $$tagInfo{Name} eq 'XMP'; # (ignore full XMP block if we didn't write it already)
         my $tag = $$tagInfo{TagID};
         my $path = GetPropertyPath($tagInfo);
         unless ($path) {
-            $exifTool->Warn("Can't write XMP:$tag (namespace unknown)");
+            $et->Warn("Can't write XMP:$tag (namespace unknown)");
             next;
         }
         # skip tags that were handled specially
@@ -760,7 +761,7 @@ sub WriteXMP($$;$)
         my $isStruct = $$tagInfo{Struct};
         # change our property path namespace prefixes to conform
         # to the ones used in this file
-        $path = ConformPathToNamespace($exifTool, $path);
+        $path = ConformPathToNamespace($et, $path);
         # find existing property
         my $cap = $capture{$path}; 
         # MicrosoftPhoto screws up the case of some tags, and some other software,
@@ -805,10 +806,10 @@ sub WriteXMP($$;$)
                         push @fixed, $fixed;
                         $fixed{$fixed} = 1;
                     }
-                    my $tg = $exifTool->GetGroup($tagInfo, 1) . ':' . $$tagInfo{Name};
+                    my $tg = $et->GetGroup($tagInfo, 1) . ':' . $$tagInfo{Name};
                     my $wrn = lc($path) eq lc($matches[0]) ? 'tag ID case' : 'list type';
                     if ($err) {
-                        $exifTool->Warn("Incorrect $wrn for existing $tg (not changed)");
+                        $et->Warn("Incorrect $wrn for existing $tg (not changed)");
                     } else {
                         # fix the incorrect property paths for all values of this tag
                         foreach $match (@matches) {
@@ -819,20 +820,20 @@ sub WriteXMP($$;$)
                             delete $capture{$fixed}[1]{'xml:lang'} if $ok2 and $match !~ /^$ok2$/;
                         }
                         $cap = $capture{$path} || $capture{$fixed[0]};
-                        $exifTool->Warn("Fixed incorrect $wrn for $tg", 1);
+                        $et->Warn("Fixed incorrect $wrn for $tg", 1);
                     }
                 }
             }
         }
-        my $nvHash = $exifTool->GetNewValueHash($tagInfo);
-        my $overwrite = $exifTool->IsOverwriting($nvHash);
+        my $nvHash = $et->GetNewValueHash($tagInfo);
+        my $overwrite = $et->IsOverwriting($nvHash);
         my $writable = $$tagInfo{Writable} || '';
         my (%attrs, $deleted, $added, $existed);
         # delete existing entry if necessary
         if ($isStruct) {
             require 'Image/ExifTool/XMPStruct.pl';
-            ($deleted, $added, $existed) = DeleteStruct($exifTool, \%capture, \$path, $nvHash, \$changed);
-            next unless $deleted or $added or $exifTool->IsOverwriting($nvHash);
+            ($deleted, $added, $existed) = DeleteStruct($et, \%capture, \$path, $nvHash, \$changed);
+            next unless $deleted or $added or $et->IsOverwriting($nvHash);
             next if $existed and $$nvHash{CreateOnly};
         } elsif ($cap) {
             next if $$nvHash{CreateOnly};   # (necessary for List-type tags)
@@ -862,7 +863,7 @@ sub WriteXMP($$;$)
                             next unless $oldLang eq $newLang;
                             # only add new tag if we are overwriting this one
                             # (note: this won't match if original XML contains CDATA!)
-                            $addLang = $exifTool->IsOverwriting($nvHash, UnescapeXML($val));
+                            $addLang = $et->IsOverwriting($nvHash, UnescapeXML($val));
                             next unless $addLang;
                         }
                         # delete all if deleting "x-default" and writing with no LangCode
@@ -887,14 +888,14 @@ sub WriteXMP($$;$)
                             }
                         }
                         # (note: this won't match if original XML contains CDATA!)
-                        next unless $exifTool->IsOverwriting($nvHash, UnescapeXML($val));
+                        next unless $et->IsOverwriting($nvHash, UnescapeXML($val));
                     }
                     if ($verbose > 1) {
-                        my $grp = $exifTool->GetGroup($tagInfo, 1);
+                        my $grp = $et->GetGroup($tagInfo, 1);
                         my $tagName = $$tagInfo{Name};
                         $tagName =~ s/-$$tagInfo{LangCode}$// if $$tagInfo{LangCode};
                         $tagName .= '-' . $$attrs{'xml:lang'} if $$attrs{'xml:lang'};
-                        $exifTool->VerboseValue("- $grp:$tagName", $val);
+                        $et->VerboseValue("- $grp:$tagName", $val);
                     }
                     # save attributes and path from first deleted property
                     # so we can replace it exactly
@@ -979,7 +980,7 @@ sub WriteXMP($$;$)
             (not $cap and $isCreating);
 
         # get list of new values (all done if no new values specified)
-        my @newValues = $exifTool->GetNewValues($nvHash) or next;
+        my @newValues = $et->GetNewValues($nvHash) or next;
 
         # set language attribute for lang-alt lists
         $attrs{'xml:lang'} = $$tagInfo{LangCode} || 'x-default' if $writable eq 'lang-alt';
@@ -989,7 +990,7 @@ sub WriteXMP($$;$)
         for (;;) {
             my $newValue = shift @newValues;
             if ($isStruct) {
-                ++$changed if AddNewStruct($exifTool, $tagInfo, \%capture,
+                ++$changed if AddNewStruct($et, $tagInfo, \%capture,
                                            $path, $newValue, $$tagInfo{Struct});
             } else {
                 $newValue = EscapeXML($newValue);
@@ -1000,8 +1001,8 @@ sub WriteXMP($$;$)
                             $capture{$path} = [ '', { %attrs, 'rdf:resource' => $newValue } ];
                             last;
                         }
-                        my $grp = $exifTool->GetGroup($tagInfo, 1);
-                        $exifTool->Warn("$grp:$$tagInfo{Name} written as a literal because value is not a valid URI", 1);
+                        my $grp = $et->GetGroup($tagInfo, 1);
+                        $et->Warn("$grp:$$tagInfo{Name} written as a literal because value is not a valid URI", 1);
                         # fall through to write as a string literal
                     }
                     delete $attrs{'rdf:resource'};  # (remove existing resource if necessary)
@@ -1009,13 +1010,13 @@ sub WriteXMP($$;$)
                     last;
                 }
                 if ($verbose > 1) {
-                    my $grp = $exifTool->GetGroup($tagInfo, 1);
-                    $exifTool->VerboseValue("+ $grp:$$tagInfo{Name}", $newValue);
+                    my $grp = $et->GetGroup($tagInfo, 1);
+                    $et->VerboseValue("+ $grp:$$tagInfo{Name}", $newValue);
                 }
                 ++$changed;
                 # add rdf:type if necessary
                 if ($$tagInfo{StructType}) {
-                    AddStructType($exifTool, $$tagInfo{Table}, \%capture, $path);
+                    AddStructType($et, $$tagInfo{Table}, \%capture, $path);
                 }
             }
             last unless @newValues;
@@ -1043,14 +1044,14 @@ sub WriteXMP($$;$)
             while ($p =~ s/\/[^\/]+$//) {
                 next unless $capture{$p};
                 # it is an error if this property has a value
-                $exifTool->Error("Improperly structured XMP ($p)",1) if $capture{$p}[0] =~ /\S/;
+                $et->Error("Improperly structured XMP ($p)",1) if $capture{$p}[0] =~ /\S/;
                 delete $capture{$p};    # delete the (hopefully) empty structure
             }
         }
     }
     # remove the ExifTool members we created
-    delete $exifTool->{XMP_CAPTURE};
-    delete $exifTool->{XMP_NS};
+    delete $$et{XMP_CAPTURE};
+    delete $$et{XMP_NS};
 
     my $maxDataLen = $$dirInfo{MaxDataLen};
     # get DataPt again because it may have been set by ProcessXMP
@@ -1068,13 +1069,13 @@ sub WriteXMP($$;$)
 #
     # start writing the XMP data
     my $newData = '';
-    if ($$exifTool{XMP_NO_XPACKET}) {
+    if ($$et{XMP_NO_XPACKET}) {
         # write BOM if flag is set
-        $newData .= "\xef\xbb\xbf" if $$exifTool{XMP_NO_XPACKET} == 2;
+        $newData .= "\xef\xbb\xbf" if $$et{XMP_NO_XPACKET} == 2;
     } else {
         $newData .= $pktOpen;
     }
-    $newData .= $xmlOpen if $$exifTool{XMP_IS_XML};
+    $newData .= $xmlOpen if $$et{XMP_IS_XML};
     $newData .= $xmpOpen . $rdfOpen;
 
     # initialize current property path list
@@ -1222,12 +1223,12 @@ sub WriteXMP($$;$)
         $newData .= (' ' x scalar(@curPropList)) . " </$prop>\n";
     }
     # limit XMP length and re-arrange if necessary to fit inside specified size
-    my $compact = $$dirInfo{Compact} || $exifTool->Options('Compact');
+    my $compact = $$dirInfo{Compact} || $et->Options('Compact');
     if ($maxDataLen) {
         # adjust maxDataLen to allow room for closing elements
         $maxDataLen -= length($rdfClose) + length($xmpClose) + length($pktCloseW);
         $extStart or $extStart = length $newData;
-        my @rtn = LimitXMPSize($exifTool, \$newData, $maxDataLen, $about, \@descStart, $extStart);
+        my @rtn = LimitXMPSize($et, \$newData, $maxDataLen, $about, \@descStart, $extStart);
         # return extended XMP information in $dirInfo
         $$dirInfo{ExtendedXMP} = $rtn[0];
         $$dirInfo{ExtendedGUID} = $rtn[1];
@@ -1238,22 +1239,22 @@ sub WriteXMP($$;$)
 # close out the XMP, clean up, and return our data
 #
     $newData .= $rdfClose;
-    $newData .= $xmpClose unless $exifTool->{XMP_NO_XMPMETA};
+    $newData .= $xmpClose unless $$et{XMP_NO_XMPMETA};
 
     # remove the ExifTool members we created
-    delete $exifTool->{XMP_CAPTURE};
-    delete $exifTool->{XMP_NS};
-    delete $exifTool->{XMP_NO_XMPMETA};
+    delete $$et{XMP_CAPTURE};
+    delete $$et{XMP_NS};
+    delete $$et{XMP_NO_XMPMETA};
 
     # (the XMP standard recommends writing 2k-4k of white space before the
     # packet trailer, with a newline every 100 characters)
-    unless ($$exifTool{XMP_NO_XPACKET}) {
+    unless ($$et{XMP_NO_XPACKET}) {
         my $pad = (' ' x 100) . "\n";
         if ($$dirInfo{InPlace}) {
             # pad to specified DirLen
             my $len = length($newData) + length($pktCloseW);
             if ($len > $dirLen) {
-                $exifTool->Warn('Not enough room to edit XMP in place');
+                $et->Warn('Not enough room to edit XMP in place');
                 return undef;
             }
             my $num = int(($dirLen - $len) / length($pad));
@@ -1273,13 +1274,13 @@ sub WriteXMP($$;$)
     }
     if ($xmpErr) {
         if ($xmpFile) {
-            $exifTool->Error($xmpErr);
+            $et->Error($xmpErr);
             return -1;
         }
-        $exifTool->Warn($xmpErr);
+        $et->Warn($xmpErr);
         return undef;
     }
-    $exifTool->{CHANGED} += $changed;
+    $$et{CHANGED} += $changed;
     $debug > 1 and $newData and print $newData,"\n";
     return $newData unless $xmpFile;
     Write($$dirInfo{OutFile}, $newData) or return -1;
@@ -1305,7 +1306,7 @@ This file contains routines to write XMP metadata.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -84,6 +84,7 @@ my %jpegMap = (
 );
 my %dirMap = (
     JPEG => \%jpegMap,
+    EXV  => \%jpegMap,
     TIFF => \%tiffMap,
     ORF  => \%tiffMap,
     RAW  => \%tiffMap,
@@ -95,11 +96,26 @@ my %dirMap = (
 # 1) these names must either exist in %dirMap, or be translated in InitWriteDirs())
 # 2) any dependencies must be added to %excludeGroups
 my @delGroups = qw(
-    Adobe AFCP CanonVRD CIFF Ducky EXIF ExifIFD File FlashPix FotoStation
-    GlobParamIFD GPS ICC_Profile IFD0 IFD1 InteropIFD IPTC JFIF Jpeg2000
-    MakerNotes Meta MetaIFD MIE MPF NikonCapture PDF PDF-update PhotoMechanic
-    Photoshop PNG PrintIM RMETA RSRC SubIFD Trailer XML XML-* XMP XMP-*
+    Adobe AFCP APP0 APP1 APP2 APP3 APP4 APP5 APP6 APP7 APP8 APP9 APP10 APP11 APP12
+    APP13 APP14 APP15 CanonVRD CIFF Ducky EXIF ExifIFD File FlashPix FotoStation
+    GlobParamIFD GPS ICC_Profile IFD0 IFD1 InteropIFD IPTC JFIF Jpeg2000 MakerNotes
+    Meta MetaIFD MIE MPF NikonCapture PDF PDF-update PhotoMechanic Photoshop PNG
+    PrintIM RMETA RSRC SubIFD Trailer XML XML-* XMP XMP-*
 );
+# family 2 group names that we can delete
+my @delGroup2 = qw(
+    Audio Author Camera Copyright Document ExifTool Image Location Other Printing
+    Time Video
+);
+
+# lookup for all valid family 2 groups (lower case)
+my %family2groups = (
+    audio     => 1,  document  => 1,  other     => 1,  video     => 1,
+    author    => 1,  exiftool  => 1,  printing  => 1,
+    camera    => 1,  image     => 1, 'time'     => 1,
+    copyright => 1,  location  => 1,  unknown   => 1,
+);
+
 # groups we don't delete when deleting all information
 my $protectedGroups = '(IFD1|SubIFD|InteropIFD|GlobParamIFD|PDF-update|Adobe)';
 # other group names of new tag values to remove when deleting an entire group
@@ -144,7 +160,7 @@ my %translateWriteGroup = (
     MIE   => 'MIE',
     APP14 => 'APP14',
 );
-# names of valid EXIF and Meta directories:
+# names of valid EXIF and Meta directories (lower case keys):
 my %exifDirs = (
     gps          => 'GPS',
     exififd      => 'ExifIFD',
@@ -202,7 +218,7 @@ my %ignorePrintConv = ( OTHER => 1, BITMASK => 1, Notes => 1 );
 # Returns: number of tags set (plus error string in list context)
 # Notes: For tag lists (like Keywords), call repeatedly with the same tag name for
 #        each value in the list.  Internally, the new information is stored in
-#        the following members of the $self->{NEW_VALUE}{$tagInfo} hash:
+#        the following members of the $$self{NEW_VALUE}{$tagInfo} hash:
 #           TagInfo - tag info ref
 #           DelValue - list ref for values to delete
 #           Value - list ref for values to add (not defined if deleting the tag)
@@ -225,9 +241,9 @@ sub SetNewValue($;$$%)
 {
     local $_;
     my ($self, $tag, $value, %options) = @_;
-    my ($err, $tagInfo);
-    my $verbose = $self->{OPTIONS}{Verbose};
-    my $out = $self->{OPTIONS}{TextOut};
+    my ($err, $tagInfo, $family);
+    my $verbose = $$self{OPTIONS}{Verbose};
+    my $out = $$self{OPTIONS}{TextOut};
     my $protected = $options{Protected} || 0;
     my $listOnly = $options{ListOnly};
     my $setTags = $options{SetTags};
@@ -235,9 +251,9 @@ sub SetNewValue($;$$%)
     my $numSet = 0;
 
     unless (defined $tag) {
-        delete $self->{NEW_VALUE};
-        $self->{SAVE_COUNT} = 0;
-        $self->{DEL_GROUP} = { };
+        delete $$self{NEW_VALUE};
+        $$self{SAVE_COUNT} = 0;
+        $$self{DEL_GROUP} = { };
         return 1;
     }
     # allow value to be scalar or list reference
@@ -255,7 +271,7 @@ sub SetNewValue($;$$%)
                     delete $options{Replace}; # don't replace earlier values in list
                 }
                 # and now set only non-list tags
-                $value = join $self->{OPTIONS}{ListSep}, @$value;
+                $value = join $$self{OPTIONS}{ListSep}, @$value;
                 $options{Replace} = $replace;
                 $listOnly = $options{ListOnly} = 0;
             } else {
@@ -270,26 +286,36 @@ sub SetNewValue($;$$%)
     $self->Sanitize(\$value) if defined $value and not ref $value;
 
     # set group name in options if specified
-    if ($tag =~ /(.*):(.+)/) {
-        $options{Group} = $1 if $1 ne '*' and lc($1) ne 'all';
-        $tag = $2;
-    }
+    ($options{Group}, $tag) = ($1, $2) if $tag =~ /(.*):(.+)/;
+
     # allow trailing '#' for ValueConv value
     $options{Type} = 'ValueConv' if $tag =~ s/#$//;
     my $convType = $options{Type} || ($$self{OPTIONS}{PrintConv} ? 'PrintConv' : 'ValueConv');
 
-    # ignore leading family number if 0 or 1 specified
-    if ($options{Group} and $options{Group} =~ /^(\d+)(.*)/ and $1 < 2) {
-        $options{Group} = $2;
+    my (@wantGroup, $family2);
+    my $wantGroup = $options{Group};
+    if ($wantGroup) {
+        foreach (split /:/, $wantGroup) {
+            /^(\d+)?(.+)/ or next;  # separate family number and group name
+            my ($f, $g) = ($1, lc $2);
+            # save group/family unless '*' or 'all'
+            push @wantGroup, [ $f, $g ] unless $g eq '*' or $g eq 'all';
+            if (defined $f) {
+                $f > 2 and return 0;      # only allow family 0, 1 or 2
+                $family2 = 1 if $f == 2;  # set flag indicating family 2 was used
+            } else {
+                $family2 = 1 if $family2groups{$g};
+            }
+        }
+        undef $wantGroup unless @wantGroup;
     }
 
-    my $wantGroup = $options{Group};
     $tag =~ s/ .*//;    # convert from tag key to tag name if necessary
     $tag = '*' if lc($tag) eq 'all';    # use '*' instead of 'all'
 #
 # handle group delete
 #
-    if ($tag eq '*' and not defined $value) {
+    while ($tag eq '*' and not defined $value and not $family2 and @wantGroup < 2) {
         # set groups to delete
         my (@del, $grp);
         my $remove = ($options{Replace} and $options{Replace} > 1);
@@ -322,7 +348,7 @@ sub SetNewValue($;$$%)
         if (@del) {
             ++$numSet;
             my @donegrps;
-            my $delGroup = $self->{DEL_GROUP};
+            my $delGroup = $$self{DEL_GROUP};
             foreach $grp (@del) {
                 if ($remove) {
                     my $didExcl;
@@ -331,8 +357,8 @@ sub SetNewValue($;$$%)
                         if ($grp eq $x) {
                             # exclude all related family 1 groups too
                             foreach (keys %$delGroup) {
-                                next unless /^-?$x-/;
-                                push @donegrps, $_ if /^$x/;
+                                next unless /^(-?)$x-/;
+                                push @donegrps, $_ unless $1;
                                 delete $$delGroup{$_};
                             }
                         } elsif ($$delGroup{"$x-*"} and not $$delGroup{"-$grp"}) {
@@ -368,6 +394,8 @@ sub SetNewValue($;$$%)
                 my $msg = $remove ? 'Excluding from deletion' : 'Deleting tags in';
                 print $out "  $msg: @donegrps\n";
             }
+        } elsif (grep /^$wantGroup$/i, @delGroup2) {
+            last;   # allow tags to be deleted by group2 name
         } else {
             $err = "Not a deletable group: $wantGroup";
         }
@@ -394,9 +422,9 @@ sub SetNewValue($;$$%)
 #
 # get list of tags we want to set
 #
+    my $origTag = $tag;
     my @matchingTags = FindTagInfo($tag);
     until (@matchingTags) {
-        my $origTag = $tag;
         my $langCode;
         # allow language suffix of form "-en_CA" or "-<rfc3066>" on tag name
         if ($tag =~ /^([?*\w]+)-([a-z]{2})(_[a-z]{2})$/i or # MIE
@@ -410,7 +438,7 @@ sub SetNewValue($;$$%)
             foreach $tagInfo (@newMatches) {
                 # only allow language codes in tables which support them
                 next unless $$tagInfo{Table};
-                my $langInfoProc = $tagInfo->{Table}{LANG_INFO} or next;
+                my $langInfoProc = $$tagInfo{Table}{LANG_INFO} or next;
                 my $langInfo = &$langInfoProc($tagInfo, $langCode);
                 push @matchingTags, $langInfo if $langInfo;
             }
@@ -459,23 +487,28 @@ sub SetNewValue($;$$%)
     }
     # get group name that we're looking for
     my $foundMatch = 0;
-    my ($ifdName, $mieGroup);
-    if ($wantGroup) {
+    my ($ifdName, $mieGroup, $movGroup, $fg);
+    # set family 1 group names
+    foreach $fg (@wantGroup) {
+        next if $$fg[0] and $$fg[0] != 1;
+        $_ = $$fg[1];
         # set $ifdName if this group is a valid IFD or SubIFD name
-        if ($wantGroup =~ /^IFD(\d+)$/i) {
+        if (/^IFD(\d+)$/i) {
             $ifdName = "IFD$1";
-        } elsif ($wantGroup =~ /^SubIFD(\d+)$/i) {
+        } elsif (/^SubIFD(\d+)$/i) {
             $ifdName = "SubIFD$1";
-        } elsif ($wantGroup =~ /^Version(\d+)$/i) {
+        } elsif (/^Version(\d+)$/i) {
             $ifdName = "Version$1"; # Sony IDC VersionIFD
-        } elsif ($wantGroup =~ /^MIE(\d*-?)(\w+)$/i) {
+        } elsif (/^Track(\d+)$/i) {
+            $movGroup = "Track$1";  # QuickTime track
+        } elsif (/^MIE(\d*-?)(\w+)$/i) {
             $mieGroup = "MIE$1" . ucfirst(lc($2));
         } else {
-            $ifdName = $exifDirs{lc($wantGroup)};
-            if (not $ifdName and $wantGroup =~ /^XMP\b/i) {
+            $ifdName = $exifDirs{$_} if $exifDirs{$_};
+            if (not $ifdName and /^XMP\b/i) {
                 # must load XMP table to set group1 names
                 my $table = GetTagTable('Image::ExifTool::XMP::Main');
-                my $writeProc = $table->{WRITE_PROC};
+                my $writeProc = $$table{WRITE_PROC};
                 $writeProc and &$writeProc();
             }
         }
@@ -486,48 +519,54 @@ sub SetNewValue($;$$%)
 #
     my (@tagInfoList, @writeAlsoList, %writeGroup, %preferred, %tagPriority);
     my (%avoid, $wasProtected, $noCreate, %highestPriority);
-    foreach $tagInfo (@matchingTags) {
-        $tag = $tagInfo->{Name};    # get tag name for warnings
+
+TAG: foreach $tagInfo (@matchingTags) {
+        $tag = $$tagInfo{Name};     # get tag name for warnings
         my $lcTag = lc $tag;        # get lower-case tag name for use in variables
         # initialize highest priority if we are starting a new tag
         $highestPriority{$lcTag} = -999 unless defined $highestPriority{$lcTag};
-        my ($writeGroup, $priority);
+        my ($priority, $writeGroup);
         if ($wantGroup) {
-            my $lcWant = lc($wantGroup);
-            $lcWant = $translateWantGroup{$lcWant} if $translateWantGroup{$lcWant};
-            # only set tag in specified group
-            $writeGroup = $self->GetGroup($tagInfo, 0);
-            unless (lc($writeGroup) eq $lcWant) {
-                if ($writeGroup eq 'EXIF' or $writeGroup eq 'SonyIDC') {
-                    next unless $ifdName;
+            my @grp = $self->GetGroup($tagInfo);
+            foreach $fg (@wantGroup) {
+                my ($fam, $lcWant) = @$fg;
+                $lcWant = $translateWantGroup{$lcWant} if $translateWantGroup{$lcWant};
+                # only set tag in specified group
+                if (not defined $fam) {
+                    next if $lcWant eq lc $grp[0] or $lcWant eq lc $grp[2];
+                } elsif ($fam != 1 and not $$tagInfo{AllowGroup}) {
+                    next if $lcWant eq lc $grp[$fam];
+                    next TAG;   # wrong group
+                }
+                # handle family 1 groups specially
+                if ($grp[0] eq 'EXIF' or $grp[0] eq 'SonyIDC') {
+                    next TAG unless $ifdName;
                     # can't yet write PreviewIFD tags
-                    $ifdName eq 'PreviewIFD' and ++$foundMatch, next;
+                    $ifdName eq 'PreviewIFD' and ++$foundMatch, next TAG;
                     $writeGroup = $ifdName;  # write to the specified IFD
-                } elsif ($writeGroup eq 'MIE') {
-                    next unless $mieGroup;
+                } elsif ($grp[0] eq 'QuickTime' and $grp[1] eq 'Track#') {
+                    $writeGroup = $movGroup or next TAG;
+                } elsif ($grp[0] eq 'MIE') {
+                    next TAG unless $mieGroup;
                     $writeGroup = $mieGroup; # write to specific MIE group
                     # set specific write group with document number if specified
-                    if ($writeGroup =~ /^MIE\d+$/ and $tagInfo->{Table}{WRITE_GROUP}) {
-                        $writeGroup = $tagInfo->{Table}{WRITE_GROUP};
+                    if ($writeGroup =~ /^MIE\d+$/ and $$tagInfo{Table}{WRITE_GROUP}) {
+                        $writeGroup = $$tagInfo{Table}{WRITE_GROUP};
                         $writeGroup =~ s/^MIE/$mieGroup/;
                     }
-                } elsif (not $$tagInfo{AllowGroup} or $wantGroup !~ /^$$tagInfo{AllowGroup}$/i) {
+                } elsif (not $$tagInfo{AllowGroup} or $lcWant !~ /^$$tagInfo{AllowGroup}$/i) {
                     # allow group1 name to be specified
-                    my $grp1 = $self->GetGroup($tagInfo, 1);
-                    unless ($grp1 and lc($grp1) eq $lcWant) {
-                        # must also check group1 name directly in case it is different
-                        $grp1 = $tagInfo->{Groups}{1};
-                        next unless $grp1 and lc($grp1) eq $lcWant;
-                    }
+                    next TAG unless $lcWant eq lc $grp[1];
                 }
             }
-            $priority = 1000;   # highest priority since group was specified
+            $writeGroup or $writeGroup = $grp[0];
+            $priority = 1000; # highest priority since group was specified
         }
         ++$foundMatch;
         # must do a dummy call to the write proc to autoload write package
         # before checking Writable flag
-        my $table = $tagInfo->{Table};
-        my $writeProc = $table->{WRITE_PROC};
+        my $table = $$tagInfo{Table};
+        my $writeProc = $$table{WRITE_PROC};
         # load source table if this was a user-defined table
         if ($$table{SRC_TABLE}) {
             my $src = GetTagTable($$table{SRC_TABLE});
@@ -535,21 +574,21 @@ sub SetNewValue($;$$%)
         }
         next unless $writeProc and &$writeProc();
         # must still check writable flags in case of UserDefined tags
-        my $writable = $tagInfo->{Writable};
-        next unless $writable or ($table->{WRITABLE} and
+        my $writable = $$tagInfo{Writable};
+        next unless $writable or ($$table{WRITABLE} and
             not defined $writable and not $$tagInfo{SubDirectory});
         # set specific write group (if we didn't already)
         if (not $writeGroup or $translateWriteGroup{$writeGroup}) {
             # use default write group
-            $writeGroup = $tagInfo->{WriteGroup} || $tagInfo->{Table}{WRITE_GROUP};
+            $writeGroup = $$tagInfo{WriteGroup} || $$tagInfo{Table}{WRITE_GROUP};
             # use group 0 name if no WriteGroup specified
             my $group0 = $self->GetGroup($tagInfo, 0);
             $writeGroup or $writeGroup = $group0;
             # get priority for this group
             unless ($priority) {
-                $priority = $self->{WRITE_PRIORITY}{lc($writeGroup)};
+                $priority = $$self{WRITE_PRIORITY}{lc($writeGroup)};
                 unless ($priority) {
-                    $priority = $self->{WRITE_PRIORITY}{lc($group0)} || 0;
+                    $priority = $$self{WRITE_PRIORITY}{lc($group0)} || 0;
                 }
             }
         }
@@ -598,7 +637,7 @@ sub SetNewValue($;$$%)
     foreach $lcTag (keys %preferred) {
         # don't create tags with priority 0 if group priorities are set
         if ($preferred{$lcTag} and $highestPriority{$lcTag} == 0 and
-            %{$self->{WRITE_PRIORITY}})
+            %{$$self{WRITE_PRIORITY}})
         {
             delete $preferred{$lcTag}
         }
@@ -654,13 +693,13 @@ sub SetNewValue($;$$%)
         my $permanent = $$tagInfo{Permanent};
         $writeGroup eq 'MakerNotes' and $permanent = 1 unless defined $permanent;
         my $wgrp1 = $self->GetWriteGroup1($tagInfo, $writeGroup);
-        $tag = $tagInfo->{Name};    # get tag name for warnings
+        $tag = $$tagInfo{Name};     # get tag name for warnings
         my $pref = $preferred{lc $tag} || { };
         my $shift = $options{Shift};
         my $addValue = $options{AddValue};
         if (defined $shift) {
             # (can't currently shift list-type tags)
-            if (not $tagInfo->{List}) {
+            if (not $$tagInfo{List}) {
                 unless ($shift) {
                     # set shift according to AddValue/DelValue
                     $shift = 1 if $addValue;
@@ -686,7 +725,7 @@ sub SetNewValue($;$$%)
         my $val = $value;
         if (defined $val) {
             # check to make sure this is a List or Shift tag if adding
-            if ($addValue and not ($shift or $tagInfo->{List})) {
+            if ($addValue and not ($shift or $$tagInfo{List})) {
                 if ($addValue eq '2') {
                     undef $addValue;    # quitely reset this option
                 } else {
@@ -701,7 +740,7 @@ sub SetNewValue($;$$%)
                     $val = ($shift > 0 ? '+' : '-') . $val;
                     # check the shift for validity
                     require 'Image/ExifTool/Shift.pl';
-                    my $err2 = CheckShift($tagInfo->{Shift}, $val);
+                    my $err2 = CheckShift($$tagInfo{Shift}, $val);
                     if ($err2) {
                         $err = "$err2 for $wgrp1:$tag";
                         $verbose > 2 and print $out "$err\n";
@@ -735,9 +774,9 @@ sub SetNewValue($;$$%)
             $verbose > 2 and print $out "$err\n";
             next;
         } else {
-            if ($tagInfo->{DelCheck}) {
+            if ($$tagInfo{DelCheck}) {
                 #### eval DelCheck ($self, $tagInfo, $wantGroup)
-                my $err2 = eval $tagInfo->{DelCheck};
+                my $err2 = eval $$tagInfo{DelCheck};
                 $@ and warn($@), $err2 = 'Error evaluating DelCheck';
                 if (defined $err2) {
                     # (allow other tags to be set using DelCheck as a hook)
@@ -769,7 +808,7 @@ sub SetNewValue($;$$%)
             next unless $options{DelValue};
             $val = 'xxx never delete xxx';
         }
-        $self->{NEW_VALUE} or $self->{NEW_VALUE} = { };
+        $$self{NEW_VALUE} or $$self{NEW_VALUE} = { };
         if ($options{Replace}) {
             # delete the previous new value
             $self->GetNewValueHash($tagInfo, $writeGroup, 'delete', $options{ProtectSaved});
@@ -789,30 +828,30 @@ sub SetNewValue($;$$%)
             my $nvHash = $self->GetNewValueHash($tagInfo, $writeGroup, 'create', $options{ProtectSaved});
             # ignore new values protected with ProtectSaved
             $nvHash or ++$numSet, next; # (increment $numSet to avoid warning)
-            $nvHash->{WantGroup} = $wantGroup;
-            $nvHash->{EditOnly} = 1 if $editOnly;
+            $$nvHash{WantGroup} = $wantGroup;
+            $$nvHash{EditOnly} = 1 if $editOnly;
             # save maker note information if writing maker notes
             if ($$tagInfo{MakerNotes}) {
-                $nvHash->{MAKER_NOTE_FIXUP} = $self->{MAKER_NOTE_FIXUP};
+                $$nvHash{MAKER_NOTE_FIXUP} = $$self{MAKER_NOTE_FIXUP};
             }
             if ($createOnly) {  # create only (never edit)
                 # empty item in DelValue list to never edit existing value
-                $nvHash->{DelValue} = [ '' ];
-                $nvHash->{CreateOnly} = 1;
+                $$nvHash{DelValue} = [ '' ];
+                $$nvHash{CreateOnly} = 1;
             } elsif ($options{DelValue} or $addValue or $shift) {
                 # flag any AddValue or DelValue by creating the DelValue list
-                $nvHash->{DelValue} or $nvHash->{DelValue} = [ ];
+                $$nvHash{DelValue} or $$nvHash{DelValue} = [ ];
                 if ($shift) {
                     # add shift value to list
-                    $nvHash->{Shift} = $val;
+                    $$nvHash{Shift} = $val;
                 } elsif ($options{DelValue}) {
                     # don't create if we are replacing a specific value
-                    $nvHash->{IsCreating} = 0 unless $val eq '' or $tagInfo->{List};
+                    $$nvHash{IsCreating} = 0 unless $val eq '' or $$tagInfo{List};
                     # add delete value to list
-                    push @{$nvHash->{DelValue}}, ref $val eq 'ARRAY' ? @$val : $val;
+                    push @{$$nvHash{DelValue}}, ref $val eq 'ARRAY' ? @$val : $val;
                     if ($verbose > 1) {
                         my $verb = $permanent ? 'Replacing' : 'Deleting';
-                        my $fromList = $tagInfo->{List} ? ' from list' : '';
+                        my $fromList = $$tagInfo{List} ? ' from list' : '';
                         my @vals = (ref $val eq 'ARRAY' ? @$val : $val);
                         foreach (@vals) {
                             if (ref $_ eq 'HASH') {
@@ -827,30 +866,30 @@ sub SetNewValue($;$$%)
             # set priority flag to add only the high priority info
             # (will only create the priority tag if it doesn't exist,
             #  others get changed only if they already exist)
-            if ($$pref{$tagInfo} or $tagInfo->{Table}{PREFERRED}) {
+            if ($$pref{$tagInfo} or $$tagInfo{Table}{PREFERRED}) {
                 if ($permanent or $shift) {
                     # don't create permanent or Shift-ed tag but define IsCreating
                     # so we know that it is the preferred tag
-                    $nvHash->{IsCreating} = 0;
-                } elsif (($tagInfo->{List} and not $options{DelValue}) or
-                         not ($nvHash->{DelValue} and @{$nvHash->{DelValue}}) or
+                    $$nvHash{IsCreating} = 0;
+                } elsif (($$tagInfo{List} and not $options{DelValue}) or
+                         not ($$nvHash{DelValue} and @{$$nvHash{DelValue}}) or
                          # also create tag if any DelValue value is empty ('')
-                         grep(/^$/,@{$nvHash->{DelValue}}))
+                         grep(/^$/,@{$$nvHash{DelValue}}))
                 {
-                    $nvHash->{IsCreating} = $editOnly ? 0 : ($editGroup ? 2 : 1);
+                    $$nvHash{IsCreating} = $editOnly ? 0 : ($editGroup ? 2 : 1);
                     # add to hash of groups where this tag is being created
                     $createGroups or $createGroups = $options{CreateGroups} || { };
                     $$createGroups{$self->GetGroup($tagInfo, 0)} = 1;
-                    $nvHash->{CreateGroups} = $createGroups;
+                    $$nvHash{CreateGroups} = $createGroups;
                 }
             }
-            if ($nvHash->{IsCreating}) {
-                if (%{$self->{DEL_GROUP}}) {
+            if ($$nvHash{IsCreating}) {
+                if (%{$$self{DEL_GROUP}}) {
                     my ($grp, @grps);
-                    foreach $grp (keys %{$self->{DEL_GROUP}}) {
-                        next if $self->{DEL_GROUP}{$grp} == 2;
+                    foreach $grp (keys %{$$self{DEL_GROUP}}) {
+                        next if $$self{DEL_GROUP}{$grp} == 2;
                         # set flag indicating tags were written after this group was deleted
-                        $self->{DEL_GROUP}{$grp} = 2;
+                        $$self{DEL_GROUP}{$grp} = 2;
                         push @grps, $grp;
                     }
                     if ($verbose > 1 and @grps) {
@@ -865,28 +904,28 @@ sub SetNewValue($;$$%)
                 next;   # nothing to do (not creating and not editing)
             }
             if ($shift or not $options{DelValue}) {
-                $nvHash->{Value} or $nvHash->{Value} = [ ];
-                if (not $tagInfo->{List}) {
+                $$nvHash{Value} or $$nvHash{Value} = [ ];
+                if (not $$tagInfo{List}) {
                     # not a List tag -- overwrite existing value
-                    $nvHash->{Value}[0] = $val;
+                    $$nvHash{Value}[0] = $val;
                 } else {
                     # add to existing list
-                    push @{$nvHash->{Value}}, ref $val eq 'ARRAY' ? @$val : $val;
+                    push @{$$nvHash{Value}}, ref $val eq 'ARRAY' ? @$val : $val;
                 }
                 if ($verbose > 1) {
-                    my $ifExists = $nvHash->{IsCreating} ? ( $createOnly ?
-                                  ($nvHash->{IsCreating} == 2 ?
+                    my $ifExists = $$nvHash{IsCreating} ? ( $createOnly ?
+                                  ($$nvHash{IsCreating} == 2 ?
                                     " if $writeGroup exists and tag doesn't" :
                                     " if tag doesn't exist") :
-                                  ($nvHash->{IsCreating} == 2 ? " if $writeGroup exists" : '')) :
-                                  (($nvHash->{DelValue} and @{$nvHash->{DelValue}}) ?
+                                  ($$nvHash{IsCreating} == 2 ? " if $writeGroup exists" : '')) :
+                                  (($$nvHash{DelValue} and @{$$nvHash{DelValue}}) ?
                                     ' if tag was deleted' : ' if tag exists');
                     my $verb = ($shift ? 'Shifting' : ($addValue ? 'Adding' : 'Writing'));
                     print $out "$verb $wgrp1:$tag$ifExists\n";
                 }
             }
         } elsif ($permanent) {
-            $err = "Can't delete $wgrp1:$tag";
+            $err = "Can't delete Permanent tag $wgrp1:$tag";
             $verbose > 1 and print $out "$err\n";
             next;
         } elsif ($addValue or $options{DelValue}) {
@@ -896,7 +935,7 @@ sub SetNewValue($;$$%)
             # create empty new value hash entry to delete this tag
             $self->GetNewValueHash($tagInfo, $writeGroup, 'delete');
             my $nvHash = $self->GetNewValueHash($tagInfo, $writeGroup, 'create');
-            $nvHash->{WantGroup} = $wantGroup;
+            $$nvHash{WantGroup} = $wantGroup;
             $verbose > 1 and print $out "Deleting $wgrp1:$tag\n";
         }
         $$setTags{$tagInfo} = 1 if $setTags;
@@ -920,7 +959,7 @@ WriteAlso:
                 );
                 undef $evalWarning;
                 #### eval WriteAlso ($val)
-                my $v = eval $writeAlso->{$wtag};
+                my $v = eval $$writeAlso{$wtag};
                 $@ and $evalWarning = $@;
                 unless ($evalWarning) {
                     ($n,$evalWarning) = $self->SetNewValue($wtag, $v, %opts);
@@ -949,7 +988,16 @@ WriteAlso:
             $err = "Sorry, $pre$tag is $wasProtected for writing";
             $verbose = 0;   # we already printed this verbose message
         } elsif (not $listOnly) {
-            if ($noCreate) {
+            if ($origTag =~ /[?*]/) {
+                if ($noCreate) {
+                    $err = "No tags matching 'pre$origTag' will be created";
+                    $verbose = 0;   # (already printed)
+                } elsif ($foundMatch) {
+                    $err = "Sorry, no writable tags matching '$pre$origTag'";
+                } else {
+                    $err = "No matching tags for '$pre$origTag'";
+                }
+            } elsif ($noCreate) {
                 $err = "Not creating $pre$tag";
                 $verbose = 0;   # (already printed)
             } elsif ($foundMatch) {
@@ -996,18 +1044,18 @@ sub SetNewValuesFromFile($$;@)
     while (ref $setTags[0] eq 'HASH') {
         $_ = shift @setTags;
         foreach $key (keys %$_) {
-            $opts{$key} = $_->{$key};
+            $opts{$key} = $$_{$key};
         }
     }
     # expand shortcuts
     @setTags and ExpandShortcuts(\@setTags);
     my $srcExifTool = new Image::ExifTool;
     # set flag to indicate we are being called from inside SetNewValuesFromFile()
-    $srcExifTool->{TAGS_FROM_FILE} = 1;
+    $$srcExifTool{TAGS_FROM_FILE} = 1;
     # synchronize and increment the file sequence number
-    $srcExifTool->{FILE_SEQUENCE} = $self->{FILE_SEQUENCE}++;
+    $$srcExifTool{FILE_SEQUENCE} = $$self{FILE_SEQUENCE}++;
     # set options for our extraction tool
-    my $options = $self->{OPTIONS};
+    my $options = $$self{OPTIONS};
     # copy both structured and flattened tags by default (but flattened tags are "unsafe")
     my $structOpt = defined $$options{Struct} ? $$options{Struct} : 2;
     # copy structures only if no tags specified (since flattened tags are "unsafe")
@@ -1062,7 +1110,7 @@ sub SetNewValuesFromFile($$;@)
     # get all tags from source file (including MakerNotes block)
     my $info = $srcExifTool->ImageInfo($srcFile);
     return $info if $$info{Error} and $$info{Error} eq 'Error opening file';
-    delete $srcExifTool->{VALUE}{Error};  # delete so we can check this later
+    delete $$srcExifTool{VALUE}{Error}; # delete so we can check this later
 
     # sort tags in reverse order so we get priority tag last
     my @tags = reverse sort keys %$info;
@@ -1072,8 +1120,8 @@ sub SetNewValuesFromFile($$;@)
 #
     unless (@setTags) {
         # transfer maker note information to this object
-        $self->{MAKER_NOTE_FIXUP} = $srcExifTool->{MAKER_NOTE_FIXUP};
-        $self->{MAKER_NOTE_BYTE_ORDER} = $srcExifTool->{MAKER_NOTE_BYTE_ORDER};
+        $$self{MAKER_NOTE_FIXUP} = $$srcExifTool{MAKER_NOTE_FIXUP};
+        $$self{MAKER_NOTE_BYTE_ORDER} = $$srcExifTool{MAKER_NOTE_BYTE_ORDER};
         foreach $tag (@tags) {
             # don't try to set errors or warnings
             next if $tag =~ /^(Error|Warning)\b/;
@@ -1092,20 +1140,20 @@ sub SetNewValuesFromFile($$;@)
 # transfer specified tags in the proper order
 #
     # 1) loop through input list of tags to set, and build @setList
-    my (@setList, $set, %setMatches);
-    foreach (@setTags) {
-        if (ref $_ eq 'HASH') {
+    my (@setList, $set, %setMatches, $t);
+    foreach $t (@setTags) {
+        if (ref $t eq 'HASH') {
             # update current options
-            foreach $key (keys %$_) {
-                $opts{$key} = $_->{$key};
+            foreach $key (keys %$t) {
+                $opts{$key} = $$t{$key};
             }
             next;
         }
         # make a copy of the current options for this setTag
         # (also use this hash to store expression and wildcard flags, EXPR and WILD)
         my $opts = { %opts };
-        $tag = lc($_);  # change tag/group names to all lower case
-        my ($fam, $grp, $dst, $dstGrp, $dstTag, $isExclude);
+        $tag = lc $t;   # change tag/group names to all lower case
+        my (@fg, $grp, $dst, $dstGrp, $dstTag, $isExclude);
         # handle redirection to another tag
         if ($tag =~ /(.+?)\s*(>|<)\s*(.+)/) {
             $dstGrp = '';
@@ -1119,11 +1167,10 @@ sub SetNewValuesFromFile($$;@)
                 $opt = $1 if $dstTag =~ s/\s*([-+])$//;
                 # handle expressions
                 if ($tag =~ /\$/) {
-                    $tag = $_;  # restore original case
+                    $tag = $t;  # restore original case
                     # recover leading whitespace (except for initial single space)
                     $tag =~ s/(.+?)\s*(>|<) ?//;
                     $$opts{EXPR} = 1; # flag this expression
-                    $grp = '';
                 } else {
                     $opt = $1 if $tag =~ s/^([-+])\s*//;
                 }
@@ -1136,20 +1183,18 @@ sub SetNewValuesFromFile($$;@)
             ($dstGrp, $dstTag) = ($1, $2) if $dstTag =~ /(.*):(.+)/;
             # ValueConv may be specified separately on the destination with '#'
             $$opts{Type} = 'ValueConv' if $dstTag =~ s/#$//;
-            # ignore leading family number
-            $dstGrp = $2 if $dstGrp =~ /^(\d+)(.*)/ and $1 < 2;
-            # replace 'all' with '*' in tag and group names
+            # replace tag name of 'all' with '*'
             $dstTag = '*' if $dstTag eq 'all';
-            $dstGrp = '*' if $dstGrp eq 'all';
         }
         unless ($$opts{EXPR}) {
             $isExclude = ($tag =~ s/^-//);
-            if ($tag =~ /^([-\w]*?|\*):(.+)/) {
+            if ($tag =~ /(.*):(.+)/) {
                 ($grp, $tag) = ($1, $2);
-                # separate leading family number
-                ($fam, $grp) = ($1, $2) if $grp =~ /^(\d+)(.*)/;
-            } else {
-                $grp = '';  # flag for don't care about group
+                foreach (split /:/, $grp) {
+                    # save family/groups in list (ignoring 'all' and '*')
+                    /^(\d+)?(.+)/ or next;
+                    push @fg, [ $1, $2 ] unless $2 eq '*' or $2 eq 'all';
+                }
             }
             # allow ValueConv to be specified by a '#' on the tag name
             if ($tag =~ s/#$//) {
@@ -1158,7 +1203,6 @@ sub SetNewValuesFromFile($$;@)
             }
             # replace 'all' with '*' in tag and group names
             $tag = '*' if $tag eq 'all';
-            $grp = '*' if $grp eq 'all';
             # allow wildcards in tag names (handle differently from all tags: '*')
             if ($tag =~ /[?*]/ and $tag ne '*') {
                 $$opts{WILD} = 1;   # set flag indicating wildcards were used in source tag
@@ -1166,7 +1210,7 @@ sub SetNewValuesFromFile($$;@)
                 $tag =~ s/\?/[-\\w]/g;
             }
         }
-        # redirect, exclude or set this tag (Note: $grp is '' if we don't care)
+        # redirect, exclude or set this tag (Note: @fg is empty if we don't care about the group)
         if ($dstTag) {
             # redirect this tag
             $isExclude and return { Error => "Can't redirect excluded tag" };
@@ -1177,18 +1221,17 @@ sub SetNewValuesFromFile($$;@)
             $dst = [ $dstGrp, $dstTag ];
         } elsif ($isExclude) {
             # implicitly assume '*' if first entry is an exclusion
-            unshift @setList, [ undef, '*', '*', [ '', '*' ], $opts ] unless @setList;
+            unshift @setList, [ [ ], '*', [ '', '*' ], $opts ] unless @setList;
             # exclude this tag by leaving $dst undefined
         } else {
-            $dst = [ $grp, $$opts{WILD} ? '*' : $tag ]; # copy to same group
+            $dst = [ $grp || '', $$opts{WILD} ? '*' : $tag ]; # use same group name for dest
         }
-        $grp or $grp = '*';     # use '*' for any group
         # save in reverse order so we don't set tags before an exclude
-        unshift @setList, [ $fam, $grp, $tag, $dst, $opts ];
+        unshift @setList, [ \@fg, $tag, $dst, $opts ];
     }
     # 2) initialize lists of matching tags for each setTag
     foreach $set (@setList) {
-        $$set[3] and $setMatches{$set} = [ ];
+        $$set[2] and $setMatches{$set} = [ ];
     }
     # 3) loop through all tags in source image and save tags matching each setTag
     my %rtnInfo;
@@ -1201,27 +1244,29 @@ sub SetNewValuesFromFile($$;@)
         # only set specified tags
         my $lcTag = lc(GetTagName($tag));
         my (@grp, %grp);
-        foreach $set (@setList) {
+SET:    foreach $set (@setList) {
             # check first for matching tag
-            unless ($$set[2] eq $lcTag or $$set[2] eq '*') {
+            unless ($$set[1] eq $lcTag or $$set[1] eq '*') {
                 # handle wildcards
-                next unless $$set[4]{WILD} and $lcTag =~ /^$$set[2]$/;
+                next unless $$set[3]{WILD} and $lcTag =~ /^$$set[1]$/;
             }
             # then check for matching group
-            unless ($$set[1] eq '*') {
+            if (@{$$set[0]}) {
                 # get lower case group names if not done already
                 unless (@grp) {
                     @grp = map(lc, $srcExifTool->GetGroup($tag));
                     $grp{$_} = 1 foreach @grp;
                 }
-                # handle leading family number
-                if (defined $$set[0]) {
-                    next unless $grp[$$set[0]] and $$set[1] eq $grp[$$set[0]];
-                } else {
-                    next unless $grp{$$set[1]};
+                foreach (@{$$set[0]}) {
+                    my ($f, $g) = @$_;
+                    if (defined $f) {
+                        next SET unless $grp[$f] and $g eq $grp[$f];
+                    } else {
+                        next SET unless $grp{$g};
+                    }
                 }
             }
-            last unless $$set[3];   # all done if we hit an exclude
+            last unless $$set[2];   # all done if we hit an exclude
             # add to the list of tags matching this setTag
             push @{$setMatches{$set}}, $tag;
         }
@@ -1229,10 +1274,10 @@ sub SetNewValuesFromFile($$;@)
     # 4) loop through each setTag in original order, setting new tag values
     foreach $set (reverse @setList) {
         # get options for SetNewValue
-        my $opts = $$set[4];
+        my $opts = $$set[3];
         # handle expressions
         if ($$opts{EXPR}) {
-            my $val = $srcExifTool->InsertTagValues(\@tags, $$set[2], 'Error');
+            my $val = $srcExifTool->InsertTagValues(\@tags, $$set[1], 'Error');
             if ($$srcExifTool{VALUE}{Error}) {
                 # pass on any error as a warning
                 $tag = NextFreeTagKey(\%rtnInfo, 'Warning');
@@ -1240,7 +1285,7 @@ sub SetNewValuesFromFile($$;@)
                 delete $$srcExifTool{VALUE}{Error};
                 next unless defined $val;
             }
-            my ($dstGrp, $dstTag) = @{$$set[3]};
+            my ($dstGrp, $dstTag) = @{$$set[2]};
             $$opts{Protected} = 1 unless $dstTag =~ /[?*]/ and $dstTag ne '*';
             $$opts{Group} = $dstGrp if $dstGrp;
             my @rtnVals = $self->SetNewValue($dstTag, $val, %$opts);
@@ -1254,29 +1299,33 @@ sub SetNewValuesFromFile($$;@)
             } else {
                 $val = $$info{$tag};
             }
-            my ($dstGrp, $dstTag) = @{$$set[3]};
+            my ($dstGrp, $dstTag) = @{$$set[2]};
             if ($dstGrp) {
-                if ($dstGrp eq '*') {
-                    $dstGrp = $srcExifTool->GetGroup($tag, 1);
+                my @dstGrp = split /:/, $dstGrp;
+                # destination group of '*' writes to same group as source tag
+                # (family 1 unless otherwise specified)
+                foreach (@dstGrp) {
+                    next unless /^(\d*)(all|\*)$/i;
+                    $_ = $1 . $srcExifTool->GetGroup($tag, length $1 ? $1 : 1);
                     $noWarn = 1;    # don't warn on wildcard destinations
                 }
-                $$opts{Group} = $dstGrp;
+                $$opts{Group} = join ':', @dstGrp;
             } else {
                 delete $$opts{Group};
             }
             # transfer maker note information if setting this tag
-            if ($srcExifTool->{TAG_INFO}{$tag}{MakerNotes}) {
-                $self->{MAKER_NOTE_FIXUP} = $srcExifTool->{MAKER_NOTE_FIXUP};
-                $self->{MAKER_NOTE_BYTE_ORDER} = $srcExifTool->{MAKER_NOTE_BYTE_ORDER};
+            if ($$srcExifTool{TAG_INFO}{$tag}{MakerNotes}) {
+                $$self{MAKER_NOTE_FIXUP} = $$srcExifTool{MAKER_NOTE_FIXUP};
+                $$self{MAKER_NOTE_BYTE_ORDER} = $$srcExifTool{MAKER_NOTE_BYTE_ORDER};
             }
             if ($dstTag eq '*') {
                 $dstTag = $tag;
                 $noWarn = 1;
             }
-            if ($$set[2] eq '*' or $$set[4]{WILD}) {
+            if ($$set[1] eq '*' or $$set[3]{WILD}) {
                 # don't copy from protected binary tags when using wildcards
-                next if $srcExifTool->{TAG_INFO}{$tag}{Protected} and
-                        $srcExifTool->{TAG_INFO}{$tag}{Binary};
+                next if $$srcExifTool{TAG_INFO}{$tag}{Protected} and
+                        $$srcExifTool{TAG_INFO}{$tag}{Binary};
                 # don't copy to protected tags when using wildcards
                 delete $$opts{Protected};
                 # don't copy flattened tags if copying structures too when copying all
@@ -1288,7 +1337,11 @@ sub SetNewValuesFromFile($$;@)
             }
             # set value(s) for this tag
             my ($rtn, $wrn) = $self->SetNewValue($dstTag, $val, %$opts);
-            $$opts{Replace} = 0;    # accumulate values from tags matching a single argument
+            # this was added in version 9.14, and allowed actions like "-subject<all" to
+            # write values of multiple tags into a list, but it had the side effect of
+            # duplicating items if there were multiple list tags with the same name
+            # (ie. -use mwg "-creator<creator"), so disable this as of ExifTool 9.36:
+            # $$opts{Replace} = 0;    # accumulate values from tags matching a single argument
             if ($wrn and not $noWarn) {
                 # return this warning
                 $rtnInfo{NextFreeTagKey(\%rtnInfo, 'Warning')} = $wrn;
@@ -1320,7 +1373,7 @@ sub GetNewValues($$;$)
         $nvHash = $tag;
     } else {
         my $newValueHashPt = shift;
-        if ($self->{NEW_VALUE}) {
+        if ($$self{NEW_VALUE}) {
             my ($group, $tagInfo);
             if (ref $tag) {
                 $nvHash = $self->GetNewValueHash($tag);
@@ -1350,18 +1403,18 @@ GNV_TagInfo:    foreach $tagInfo (@tagInfoList) {
                     }
                     $nvHash = $nvh;
                     # give priority to the one we are creating
-                    last if defined $nvHash->{IsCreating};
+                    last if defined $$nvHash{IsCreating};
                 }
             }
         }
         # return new value hash if requested
         $newValueHashPt and $$newValueHashPt = $nvHash;
     }
-    unless ($nvHash and $nvHash->{Value}) {
+    unless ($nvHash and $$nvHash{Value}) {
         return () if wantarray;  # return empty list
         return undef;
     }
-    my $vals = $nvHash->{Value};
+    my $vals = $$nvHash{Value};
     # do inverse raw conversion if necessary
     # - must also check after doing a Shift
     if ($$nvHash{TagInfo}{RawConvInv} or $$nvHash{Shift}) {
@@ -1421,7 +1474,7 @@ GNV_TagInfo:    foreach $tagInfo (@tagInfoList) {
 sub CountNewValues($)
 {
     my $self = shift;
-    my $newVal = $self->{NEW_VALUE};
+    my $newVal = $$self{NEW_VALUE};
     my $num = 0;
     my $tag;
     if ($newVal) {
@@ -1431,7 +1484,7 @@ sub CountNewValues($)
             --$num if defined $$newVal{$Image::ExifTool::Extra{$tag}};
         }
     }
-    $num += scalar keys %{$self->{DEL_GROUP}};
+    $num += scalar keys %{$$self{DEL_GROUP}};
     return $num unless wantarray;
     my $pseudo = 0;
     if ($newVal) {
@@ -1451,22 +1504,22 @@ sub CountNewValues($)
 sub SaveNewValues($)
 {
     my $self = shift;
-    my $newValues = $self->{NEW_VALUE};
+    my $newValues = $$self{NEW_VALUE};
     my $saveCount = ++$$self{SAVE_COUNT};
     my $key;
     foreach $key (keys %$newValues) {
         my $nvHash = $$newValues{$key};
         while ($nvHash) {
             # set Save count if not done already
-            $nvHash->{Save} or $nvHash->{Save} = $saveCount;
-            $nvHash = $nvHash->{Next};
+            $$nvHash{Save} or $$nvHash{Save} = $saveCount;
+            $nvHash = $$nvHash{Next};
         }
     }
     # initialize hash for saving overwritten new values
-    $self->{SAVE_NEW_VALUE} = { };
+    $$self{SAVE_NEW_VALUE} = { };
     # make a copy of the delete group hash
-    my %delGrp = %{$self->{DEL_GROUP}};
-    $self->{SAVE_DEL_GROUP} = \%delGrp;
+    my %delGrp = %{$$self{DEL_GROUP}};
+    $$self{SAVE_DEL_GROUP} = \%delGrp;
     return $saveCount;
 }
 
@@ -1479,8 +1532,8 @@ sub SaveNewValues($)
 sub RestoreNewValues($)
 {
     my $self = shift;
-    my $newValues = $self->{NEW_VALUE};
-    my $savedValues = $self->{SAVE_NEW_VALUE};
+    my $newValues = $$self{NEW_VALUE};
+    my $savedValues = $$self{SAVE_NEW_VALUE};
     my $key;
     # 1) remove any new values which don't have the Save flag set
     if ($newValues) {
@@ -1489,39 +1542,39 @@ sub RestoreNewValues($)
             my $lastHash;
             my $nvHash = $$newValues{$key};
             while ($nvHash) {
-                if ($nvHash->{Save}) {
+                if ($$nvHash{Save}) {
                     $lastHash = $nvHash;
                 } else {
                     # remove this entry from the list
                     if ($lastHash) {
-                        $lastHash->{Next} = $nvHash->{Next};
-                    } elsif ($nvHash->{Next}) {
-                        $$newValues{$key} = $nvHash->{Next};
+                        $$lastHash{Next} = $$nvHash{Next};
+                    } elsif ($$nvHash{Next}) {
+                        $$newValues{$key} = $$nvHash{Next};
                     } else {
                         delete $$newValues{$key};
                     }
                 }
-                $nvHash = $nvHash->{Next};
+                $nvHash = $$nvHash{Next};
             }
         }
     }
     # 2) restore saved new values
     if ($savedValues) {
-        $newValues or $newValues = $self->{NEW_VALUE} = { };
+        $newValues or $newValues = $$self{NEW_VALUE} = { };
         foreach $key (keys %$savedValues) {
             if ($$newValues{$key}) {
                 # add saved values to end of list
                 my $nvHash = LastInList($$newValues{$key});
-                $nvHash->{Next} = $$savedValues{$key};
+                $$nvHash{Next} = $$savedValues{$key};
             } else {
                 $$newValues{$key} = $$savedValues{$key};
             }
         }
-        $self->{SAVE_NEW_VALUE} = { };  # reset saved new values
+        $$self{SAVE_NEW_VALUE} = { };  # reset saved new values
     }
     # 3) restore delete groups
-    my %delGrp = %{$self->{SAVE_DEL_GROUP}};
-    $self->{DEL_GROUP} = \%delGrp;
+    my %delGrp = %{$$self{SAVE_DEL_GROUP}};
+    $$self{DEL_GROUP} = \%delGrp;
 }
 
 #------------------------------------------------------------------------------
@@ -1548,11 +1601,11 @@ sub SetFileModifyDate($$;$$)
             $originalTime = ($tag eq 'FileCreateDate') ? -C $file : -M $file;
         }
         return 0 unless defined $originalTime;
-        return 0 unless $self->IsOverwriting($nvHash, $^T - $originalTime*(24*3600));
-        $val = $nvHash->{Value}[0]; # get shifted value
+        return 0 unless $self->IsOverwriting($nvHash, int($^T - $originalTime*(24*3600) + 0.5));
+        $val = $$nvHash{Value}[0]; # get shifted value
     }
     if ($tag eq 'FileCreateDate') {
-        unless (eval 'require Win32API::File::Time') {
+        unless (eval { require Win32API::File::Time }) {
             $self->Warn("Install Win32API::File::Time to set $tag");
             return -1;
         }
@@ -1564,7 +1617,7 @@ sub SetFileModifyDate($$;$$)
         $self->Warn("Error setting $tag");
         return -1;
     } else {
-        ++$self->{CHANGED};
+        ++$$self{CHANGED};
         $self->VerboseValue("+ $tag", $val);
         return 1;
     }
@@ -1595,6 +1648,7 @@ sub SetFileName($$;$)
             $newName = GetNewFileName($file, $dir);
         }
     }
+    $newName =~ tr/\0//d;   # make sure name doesn't contain nulls
     if (-e $newName) {
         # don't replace existing file
         $self->Warn("File '$newName' already exists");
@@ -1636,13 +1690,13 @@ sub SetFileName($$;$)
             return -1;
         }
         # preserve modification time
-        my $modTime = $^T - (-M $file) * (24 * 3600);
-        my $accTime = $^T - (-A $file) * (24 * 3600);
+        my $modTime = int($^T - (-M $file) * (24 * 3600) + 0.5);
+        my $accTime = int($^T - (-A $file) * (24 * 3600) + 0.5);
         utime($accTime, $modTime, $newName);
         # remove the original file
         unlink $file or $self->Warn('Error removing old file');
     }
-    ++$self->{CHANGED};
+    ++$$self{CHANGED};
     $self->VerboseValue('+ FileName', $newName);
     return 1;
 }
@@ -1650,7 +1704,7 @@ sub SetFileName($$;$)
 #------------------------------------------------------------------------------
 # Write information back to file
 # Inputs: 0) ExifTool object reference,
-#         1) input filename, file ref, or scalar ref (or '' or undef to create from scratch)
+#         1) input filename, file ref, RAF ref, or scalar ref (or '' or undef to create from scratch)
 #         2) output filename, file ref, or scalar ref (or undef to overwrite)
 #         3) optional output file type (required only if input file is not specified
 #            and output file is a reference)
@@ -1660,8 +1714,8 @@ sub WriteInfo($$;$$)
     local ($_, *EXIFTOOL_FILE2, *EXIFTOOL_OUTFILE);
     my ($self, $infile, $outfile, $outType) = @_;
     my (@fileTypeList, $fileType, $tiffType, $hdr, $seekErr, $type, $tmpfile);
-    my ($inRef, $outRef, $closeIn, $closeOut, $outPos, $outBuff, $eraseIn);
-    my $oldRaf = $self->{RAF};
+    my ($inRef, $outRef, $closeIn, $closeOut, $outPos, $outBuff, $eraseIn, $raf);
+    my $oldRaf = $$self{RAF};
     my $rtnVal = 0;
 
     # initialize member variables
@@ -1719,7 +1773,10 @@ sub WriteInfo($$;$$)
         $inRef = $infile;
         if (UNIVERSAL::isa($inRef,'GLOB')) {
             seek($inRef, 0, 0); # make sure we are at the start of the file
-        } elsif ($] >= 5.006 and (eval 'require Encode; Encode::is_utf8($$inRef)' or $@)) {
+        } elsif (UNIVERSAL::isa($inRef,'File::RandomAccess')) {
+            $inRef->Seek(0);
+            $raf = $inRef;
+        } elsif ($] >= 5.006 and (eval { require Encode; Encode::is_utf8($$inRef) } or $@)) {
             # convert image data from UTF-8 to character stream if necessary
             my $buff = $@ ? pack('C*',unpack('U0C*',$$inRef)) : Encode::encode('utf8',$$inRef);
             if (defined $outfile) {
@@ -1785,6 +1842,10 @@ sub WriteInfo($$;$$)
     } elsif (not defined $outfile) {
         # editing in place, so write to memory first
         # (only when infile is a file ref or scalar ref)
+        if ($raf) {
+            $self->Error("Can't edit File::RandomAccess object in place");
+            return 0;
+        }
         $outBuff = '';
         $outRef = \$outBuff;
         $outPos = 0;
@@ -1802,9 +1863,9 @@ sub WriteInfo($$;$$)
 #
 # write the file
 #
-    until ($self->{VALUE}{Error}) {
+    until ($$self{VALUE}{Error}) {
         # create random access file object (disable seek test in case of straight copy)
-        my $raf = new File::RandomAccess($inRef, 1);
+        $raf or $raf = new File::RandomAccess($inRef, 1);
         $raf->BinMode();
         if ($numNew == $numPseudo) {
             $rtnVal = 1;
@@ -1816,13 +1877,13 @@ sub WriteInfo($$;$$)
             last;
         } elsif (not ref $infile and ($infile eq '-' or $infile =~ /\|$/)) {
             # patch for Windows command shell pipe
-            $raf->{TESTED} = -1;    # force buffering
+            $$raf{TESTED} = -1; # force buffering
         } else {
             $raf->SeekTest();
         }
        # $raf->Debug() and warn "  RAF debugging enabled!\n";
         my $inPos = $raf->Tell();
-        $self->{RAF} = $raf;
+        $$self{RAF} = $raf;
         my %dirInfo = (
             RAF => $raf,
             OutFile => $outRef,
@@ -1839,10 +1900,10 @@ sub WriteInfo($$;$$)
                 last;
             }
             # save file type in member variable
-            $dirInfo{Parent} = $self->{FILE_TYPE} = $self->{PATH}[0] = $type;
+            $dirInfo{Parent} = $$self{FILE_TYPE} = $$self{PATH}[0] = $type;
             # determine which directories we must write for this file type
             $self->InitWriteDirs($type);
-            if ($type eq 'JPEG') {
+            if ($type eq 'JPEG' or $type eq 'EXV') {
                 $rtnVal = $self->WriteJPEG(\%dirInfo);
             } elsif ($type eq 'TIFF') {
                 # disallow writing of some TIFF-based RAW images:
@@ -1903,6 +1964,9 @@ sub WriteInfo($$;$$)
             } elsif ($type eq 'IND') {
                 require Image::ExifTool::InDesign;
                 $rtnVal = Image::ExifTool::InDesign::ProcessIND($self, \%dirInfo);
+            } elsif ($type eq 'MOV') {
+                require Image::ExifTool::QuickTime;
+                $rtnVal = Image::ExifTool::QuickTime::WriteMOV($self, \%dirInfo);
             } elsif ($type eq 'EXIF') {
                 # go through WriteDirectory so block writes, etc are handled
                 my $tagTablePtr = GetTagTable('Image::ExifTool::Exif::Main');
@@ -1932,7 +1996,7 @@ sub WriteInfo($$;$$)
             if ($seekErr) {
                 $err = 'Error seeking in file';
             } elsif ($fileType and defined $rtnVal) {
-                if ($self->{VALUE}{Error}) {
+                if ($$self{VALUE}{Error}) {
                     # existing error message will do
                 } elsif ($fileType eq 'RAW') {
                     $err = 'Writing this type of RAW file is not supported';
@@ -1965,7 +2029,7 @@ sub WriteInfo($$;$$)
     }
     # don't return success code if any error occurred
     if ($rtnVal > 0) {
-        unless (Tell($outRef) or $self->{VALUE}{Error}) {
+        unless (Tell($outRef) or $$self{VALUE}{Error}) {
             # don't write a file with zero length
             if (defined $hdr and length $hdr) {
                 $self->Error("Can't delete all meta information from $type file");
@@ -1973,12 +2037,12 @@ sub WriteInfo($$;$$)
                 $self->Error('Nothing to write');
             }
         }
-        $rtnVal = 0 if $self->{VALUE}{Error};
+        $rtnVal = 0 if $$self{VALUE}{Error};
     }
 
     # rewrite original file in place if required
     if (defined $outBuff) {
-        if ($rtnVal <= 0 or not $self->{CHANGED}) {
+        if ($rtnVal <= 0 or not $$self{CHANGED}) {
             # nothing changed, so no need to write $outBuff
         } elsif (UNIVERSAL::isa($inRef,'GLOB')) {
             my $len = length($outBuff);
@@ -1989,7 +2053,7 @@ sub WriteInfo($$;$$)
                 seek($inRef, 0, 0) and          # seek back to the start
                 print $inRef $outBuff and       # write the new data
                 ($len >= $size or               # if necessary:
-                eval 'truncate($inRef, $len)'); #  shorten output file
+                eval { truncate($inRef, $len) }); #  shorten output file
         } else {
             $$inRef = $outBuff;                 # replace original data
         }
@@ -2060,24 +2124,24 @@ sub WriteInfo($$;$$)
         ($closeOut or ($closeIn and defined $outBuff)) and
         $self->SetFileModifyDate($closeOut ? $outfile : $infile, $originalTime) > 0)
     {
-        ++$self->{CHANGED}; # we changed something
+        ++$$self{CHANGED}; # we changed something
     }
     # set FileCreateDate if requested (and if possible!)
     if (defined $fileCreateDate and $rtnVal > 0 and
         ($closeOut or ($closeIn and defined $outBuff)) and
         $self->SetFileModifyDate($closeOut ? $outfile : $infile, $createTime, 'FileCreateDate') > 0)
     {
-        ++$self->{CHANGED}; # we changed something
+        ++$$self{CHANGED}; # we changed something
     }
     # check for write error and set appropriate error message and return value
     if ($rtnVal < 0) {
         $self->Error('Error writing output file') unless $$self{VALUE}{Error};
         $rtnVal = 0;    # return 0 on failure
     } elsif ($rtnVal > 0) {
-        ++$rtnVal unless $self->{CHANGED};
+        ++$rtnVal unless $$self{CHANGED};
     }
     # set things back to the way they were
-    $self->{RAF} = $oldRaf;
+    $$self{RAF} = $oldRaf;
 
     return $rtnVal;
 }
@@ -2094,7 +2158,7 @@ sub GetAllTags(;$)
     my (%allTags, @groups);
     @groups = split ':', $group if $group;
 
-    my $exifTool = new Image::ExifTool;
+    my $et = new Image::ExifTool;
     LoadAllTables();    # first load all our tables
     my @tableNames = keys %allTables;
 
@@ -2112,7 +2176,7 @@ GATInfo:    foreach $tagInfo (@infoArray) {
                 next if $$tagInfo{SubDirectory} and not $$tagInfo{Writable};
                 next if $$tagInfo{Hidden};  # ignore hidden tags
                 if (@groups) {
-                    my @tg = $exifTool->GetGroup($tagInfo);
+                    my @tg = $et->GetGroup($tagInfo);
                     foreach $group (@groups) {
                         next GATInfo unless grep /^$group$/i, @tg;
                     }
@@ -2127,7 +2191,7 @@ GATInfo:    foreach $tagInfo (@infoArray) {
 #------------------------------------------------------------------------------
 # Get list of all writable tags
 # Inputs: 0) optional group name (or names separated by colons)
-# Returns: tag list (sorted alphbetically)
+# Returns: tag list (sorted alphabetically)
 sub GetWritableTags(;$)
 {
     local $_;
@@ -2135,7 +2199,7 @@ sub GetWritableTags(;$)
     my (%writableTags, @groups);
     @groups = split ':', $group if $group;
 
-    my $exifTool = new Image::ExifTool;
+    my $et = new Image::ExifTool;
     LoadAllTables();
     my @tableNames = keys %allTables;
 
@@ -2158,11 +2222,11 @@ GWTInfo:    foreach $tagInfo (@infoArray) {
                 my $tag = $$tagInfo{Name};
                 $tag or warn("no name for tag!\n"), next;
                 my $writable = $$tagInfo{Writable};
-                next unless $writable or ($table->{WRITABLE} and
+                next unless $writable or ($$table{WRITABLE} and
                     not defined $writable and not $$tagInfo{SubDirectory});
                 next if $$tagInfo{Hidden};  # ignore hidden tags
                 if (@groups) {
-                    my @tg = $exifTool->GetGroup($tagInfo);
+                    my @tg = $et->GetGroup($tagInfo);
                     foreach $group (@groups) {
                         next GWTInfo unless grep /^$group$/i, @tg;
                     }
@@ -2214,7 +2278,7 @@ sub GetAllGroups($)
 sub GetNewGroups($)
 {
     my $self = shift;
-    return @{$self->{WRITE_GROUPS}};
+    return @{$$self{WRITE_GROUPS}};
 }
 
 #------------------------------------------------------------------------------
@@ -2222,7 +2286,7 @@ sub GetNewGroups($)
 # Returns: List of group names (sorted alphabetically)
 sub GetDeleteGroups()
 {
-    return sort @delGroups;
+    return sort @delGroups, @delGroup2;
 }
 
 #------------------------------------------------------------------------------
@@ -2262,7 +2326,7 @@ sub Sanitize($$)
     $$valPt = $$$valPt if ref $$valPt eq 'SCALAR';
     # make sure the Perl UTF-8 flag is OFF for the value if perl 5.6 or greater
     # (otherwise our byte manipulations get corrupted!!)
-    if ($] >= 5.006 and (eval 'require Encode; Encode::is_utf8($$valPt)' or $@)) {
+    if ($] >= 5.006 and (eval { require Encode; Encode::is_utf8($$valPt) } or $@)) {
         # repack by hand if Encode isn't available
         $$valPt = $@ ? pack('C*',unpack('U0C*',$$valPt)) : Encode::encode('utf8',$$valPt);
     }
@@ -2295,7 +2359,7 @@ Conv: for (;;) {
         if (not defined $type) {
             # split value into list if necessary
             if ($$tagInfo{List}) {
-                my $listSplit = $$tagInfo{AutoSplit} || $self->{OPTIONS}{ListSplit};
+                my $listSplit = $$tagInfo{AutoSplit} || $$self{OPTIONS}{ListSplit};
                 if (defined $listSplit) {
                     $listSplit = ',?\s+' if $listSplit eq '1' and $$tagInfo{AutoSplit};
                     my @splitVal = split /$listSplit/, $val;
@@ -2313,15 +2377,15 @@ Conv: for (;;) {
             }
             # finally, do our value check
             my ($err2, $v);
-            if ($tagInfo->{WriteCheck}) {
+            if ($$tagInfo{WriteCheck}) {
                 #### eval WriteCheck ($self, $tagInfo, $val)
-                $err2 = eval $tagInfo->{WriteCheck};
+                $err2 = eval $$tagInfo{WriteCheck};
                 $@ and warn($@), $err2 = 'Error evaluating WriteCheck';
             }
             unless ($err2) {
-                my $table = $tagInfo->{Table};
-                if ($table and $table->{CHECK_PROC} and not $$tagInfo{RawConvInv}) {
-                    my $checkProc = $table->{CHECK_PROC};
+                my $table = $$tagInfo{Table};
+                if ($table and $$table{CHECK_PROC} and not $$tagInfo{RawConvInv}) {
+                    my $checkProc = $$table{CHECK_PROC};
                     if (ref $val eq 'ARRAY') {
                         # loop through array values
                         foreach $v (@$val) {
@@ -2344,8 +2408,8 @@ Conv: for (;;) {
             }
             last;
         }
-        my $conv = $tagInfo->{$type};
-        my $convInv = $tagInfo->{"${type}Inv"};
+        my $conv = $$tagInfo{$type};
+        my $convInv = $$tagInfo{"${type}Inv"};
         # nothing to do at this level if no conversion defined
         next unless defined $conv or defined $convInv;
 
@@ -2400,7 +2464,7 @@ Conv: for (;;) {
                     my ($multi, $lc);
                     # insert alternate language print conversions if required
                     if ($$self{CUR_LANG} and $type eq 'PrintConv' and
-                        ref($lc = $self->{CUR_LANG}{$tag}) eq 'HASH' and
+                        ref($lc = $$self{CUR_LANG}{$tag}) eq 'HASH' and
                         ($lc = $$lc{PrintConv}))
                     {
                         my %newConv;
@@ -2486,6 +2550,7 @@ Conv: for (;;) {
 #   if option set to 'Error', or a warning otherwise
 sub InsertTagValues($$$;$)
 {
+    local $_;
     my ($self, $foundTags, $line, $opt) = @_;
     my $rtnStr = '';
     while ($line =~ /(.*?)\$(\{\s*)?([-\w]*\w|\$|\/)(.*)/s) {
@@ -2520,7 +2585,7 @@ sub InsertTagValues($$$;$)
                 $expr .= '}';  # this brace was part of the expression
             }
             # use default Windows filename filter if expression is empty
-            $expr = 'tr(/\\\\?*:|"<>)()d' unless length $expr;
+            $expr = 'tr(/\\\\?*:|"<>\\0)()d' unless length $expr;
         }
         push @tags, $var;
         ExpandShortcuts(\@tags);
@@ -2565,9 +2630,9 @@ sub InsertTagValues($$$;$)
                 }
             }
             if (ref $val eq 'ARRAY') {
-                $val = join($self->{OPTIONS}{ListSep}, @$val);
+                $val = join($$self{OPTIONS}{ListSep}, @$val);
             } elsif (ref $val eq 'SCALAR') {
-                if ($self->{OPTIONS}{Binary} or $$val =~ /^Binary data/) {
+                if ($$self{OPTIONS}{Binary} or $$val =~ /^Binary data/) {
                     $val = $$val;
                 } else {
                     $val = 'Binary data ' . length($$val) . ' bytes';
@@ -2579,7 +2644,7 @@ sub InsertTagValues($$$;$)
                 last unless @tags;
                 next;
             }
-            # evaluate translation expression if given (ie. "${TAG;EXPR}")
+            # evaluate advanced formatting expression if given (ie. "${TAG;EXPR}")
             if (defined $expr) {
                 local $SIG{'__WARN__'} = \&SetWarning;
                 undef $evalWarning;
@@ -2602,7 +2667,7 @@ sub InsertTagValues($$$;$)
             $val = join '', @vals;
         }
         unless (defined $val or ref $opt) {
-            $val = $self->{OPTIONS}{MissingTagValue};
+            $val = $$self{OPTIONS}{MissingTagValue};
             unless (defined $val) {
                 no strict 'refs';
                 return undef if $opt and &$opt($self, "Tag '$var' not defined", 2);
@@ -2686,8 +2751,9 @@ sub CopyFileAttrs($$)
 }
 
 #------------------------------------------------------------------------------
-# Get new file name
-# Inputs: 0) existing name, 1) new name
+# Get new file path name
+# Inputs: 0) existing name (may contain directory),
+#         1) new file name, new directory, or new path (dir+name)
 # Returns: new file path name
 sub GetNewFileName($$)
 {
@@ -2869,7 +2935,7 @@ sub GetWriteGroup1($$)
 sub GetNewValueHash($$;$$$)
 {
     my ($self, $tagInfo, $writeGroup, $opts) = @_;
-    my $nvHash = $self->{NEW_VALUE}{$tagInfo};
+    my $nvHash = $$self{NEW_VALUE}{$tagInfo};
 
     my %opts;   # quick lookup for options
     $opts and $opts{$opts} = 1;
@@ -2877,8 +2943,11 @@ sub GetNewValueHash($$;$$$)
 
     if ($writeGroup) {
         # find the new value in the list with the specified write group
-        while ($nvHash and $nvHash->{WriteGroup} ne $writeGroup) {
-            $nvHash = $nvHash->{Next};
+        # (QuickTime is a special case because all group1 tags may be updated at once)
+        while ($nvHash and $$nvHash{WriteGroup} ne $writeGroup and
+            $$nvHash{WriteGroup} ne 'QuickTime')
+        {
+            $nvHash = $$nvHash{Next};
         }
     }
     # remove this entry if deleting, or if creating a new entry and
@@ -2898,11 +2967,11 @@ sub GetNewValueHash($$;$$$)
                 next unless ref $copy{$key} eq 'ARRAY';
                 $copy{$key} = [ @{$copy{$key}} ];
             }
-            my $saveHash = $self->{SAVE_NEW_VALUE};
+            my $saveHash = $$self{SAVE_NEW_VALUE};
             # add to linked list of saved new value hashes
-            $copy{Next} = $saveHash->{$tagInfo};
-            $saveHash->{$tagInfo} = \%copy;
-            delete $nvHash->{Save}; # don't save it again
+            $copy{Next} = $$saveHash{$tagInfo};
+            $$saveHash{$tagInfo} = \%copy;
+            delete $$nvHash{Save}; # don't save it again
         }
     }
     if (not defined $nvHash and $opts{'create'}) {
@@ -2913,12 +2982,12 @@ sub GetNewValueHash($$;$$$)
             IsNVH => 1, # set flag so we can recognize a new value hash
         };
         # add entry to our NEW_VALUE hash
-        if ($self->{NEW_VALUE}{$tagInfo}) {
+        if ($$self{NEW_VALUE}{$tagInfo}) {
             # add to end of linked list
-            my $lastHash = LastInList($self->{NEW_VALUE}{$tagInfo});
-            $lastHash->{Next} = $nvHash;
+            my $lastHash = LastInList($$self{NEW_VALUE}{$tagInfo});
+            $$lastHash{Next} = $nvHash;
         } else {
-            $self->{NEW_VALUE}{$tagInfo} = $nvHash;
+            $$self{NEW_VALUE}{$tagInfo} = $nvHash;
         }
     }
     return $nvHash;
@@ -2946,7 +3015,7 @@ sub LoadAllTables()
     while (@tableNames) {
         $table = GetTagTable(shift @tableNames);
         # call write proc if it exists in case it adds tags to the table
-        my $writeProc = $table->{WRITE_PROC};
+        my $writeProc = $$table{WRITE_PROC};
         $writeProc and &$writeProc();
         # recursively scan through tables in subdirectories
         foreach (TagTableKeys($table)) {
@@ -2971,26 +3040,26 @@ sub LoadAllTables()
 sub RemoveNewValueHash($$$)
 {
     my ($self, $nvHash, $tagInfo) = @_;
-    my $firstHash = $self->{NEW_VALUE}{$tagInfo};
+    my $firstHash = $$self{NEW_VALUE}{$tagInfo};
     if ($nvHash eq $firstHash) {
         # remove first entry from linked list
-        if ($nvHash->{Next}) {
-            $self->{NEW_VALUE}{$tagInfo} = $nvHash->{Next};
+        if ($$nvHash{Next}) {
+            $$self{NEW_VALUE}{$tagInfo} = $$nvHash{Next};
         } else {
-            delete $self->{NEW_VALUE}{$tagInfo};
+            delete $$self{NEW_VALUE}{$tagInfo};
         }
     } else {
         # find the list element pointing to this hash
-        $firstHash = $firstHash->{Next} while $firstHash->{Next} ne $nvHash;
+        $firstHash = $$firstHash{Next} while $$firstHash{Next} ne $nvHash;
         # remove from linked list
-        $firstHash->{Next} = $nvHash->{Next};
+        $$firstHash{Next} = $$nvHash{Next};
     }
     # save the existing entry if necessary
-    if ($nvHash->{Save}) {
-        my $saveHash = $self->{SAVE_NEW_VALUE};
+    if ($$nvHash{Save}) {
+        my $saveHash = $$self{SAVE_NEW_VALUE};
         # add to linked list of saved new value hashes
-        $nvHash->{Next} = $saveHash->{$tagInfo};
-        $saveHash->{$tagInfo} = $nvHash;
+        $$nvHash{Next} = $$saveHash{$tagInfo};
+        $$saveHash{$tagInfo} = $nvHash;
     }
 }
 
@@ -3001,25 +3070,25 @@ sub RemoveNewValuesForGroup($$)
 {
     my ($self, $group) = @_;
 
-    return unless $self->{NEW_VALUE};
+    return unless $$self{NEW_VALUE};
 
     # make list of all groups we must remove
     my @groups = ( $group );
     push @groups, @{$removeGroups{$group}} if $removeGroups{$group};
 
     my ($out, @keys, $hashKey);
-    $out = $self->{OPTIONS}{TextOut} if $self->{OPTIONS}{Verbose} > 1;
+    $out = $$self{OPTIONS}{TextOut} if $$self{OPTIONS}{Verbose} > 1;
 
     # loop though all new values, and remove any in this group
-    @keys = keys %{$self->{NEW_VALUE}};
+    @keys = keys %{$$self{NEW_VALUE}};
     foreach $hashKey (@keys) {
-        my $nvHash = $self->{NEW_VALUE}{$hashKey};
+        my $nvHash = $$self{NEW_VALUE}{$hashKey};
         # loop through each entry in linked list
         for (;;) {
-            my $nextHash = $nvHash->{Next};
-            my $tagInfo = $nvHash->{TagInfo};
+            my $nextHash = $$nvHash{Next};
+            my $tagInfo = $$nvHash{TagInfo};
             my ($grp0,$grp1) = $self->GetGroup($tagInfo);
-            my $wgrp = $nvHash->{WriteGroup};
+            my $wgrp = $$nvHash{WriteGroup};
             # use group1 if write group is not specific
             $wgrp = $grp1 if $wgrp eq $grp0;
             if (grep /^($grp0|$wgrp)$/i, @groups) {
@@ -3040,12 +3109,12 @@ sub GetNewTagInfoList($;$)
 {
     my ($self, $tagTablePtr) = @_;
     my @tagInfoList;
-    my $nv = $self->{NEW_VALUE};
+    my $nv = $$self{NEW_VALUE};
     if ($nv) {
         my $hashKey;
         foreach $hashKey (keys %$nv) {
-            my $tagInfo = $nv->{$hashKey}{TagInfo};
-            next if $tagTablePtr and $tagTablePtr ne $tagInfo->{Table};
+            my $tagInfo = $$nv{$hashKey}{TagInfo};
+            next if $tagTablePtr and $tagTablePtr ne $$tagInfo{Table};
             push @tagInfoList, $tagInfo;
         }
     }
@@ -3060,12 +3129,12 @@ sub GetNewTagInfoHash($@)
 {
     my $self = shift;
     my (%tagInfoHash, $hashKey);
-    my $nv = $self->{NEW_VALUE};
+    my $nv = $$self{NEW_VALUE};
     while ($nv) {
         my $tagTablePtr = shift || last;
         foreach $hashKey (keys %$nv) {
-            my $tagInfo = $nv->{$hashKey}{TagInfo};
-            next if $tagTablePtr and $tagTablePtr ne $tagInfo->{Table};
+            my $tagInfo = $$nv{$hashKey}{TagInfo};
+            next if $tagTablePtr and $tagTablePtr ne $$tagInfo{Table};
             $tagInfoHash{$$tagInfo{TagID}} = $tagInfo;
         }
     }
@@ -3081,12 +3150,12 @@ sub GetNewTagInfoHash($@)
 sub GetAddDirHash($$;$)
 {
     my ($self, $tagTablePtr, $parent) = @_;
-    $parent or $parent = $tagTablePtr->{GROUPS}{0};
+    $parent or $parent = $$tagTablePtr{GROUPS}{0};
     my $tagID;
     my %addDirHash;
     my %editDirHash;
-    my $addDirs = $self->{ADD_DIRS};
-    my $editDirs = $self->{EDIT_DIRS};
+    my $addDirs = $$self{ADD_DIRS};
+    my $editDirs = $$self{EDIT_DIRS};
     foreach $tagID (TagTableKeys($tagTablePtr)) {
         my @infoArray = GetTagInfoList($tagTablePtr,$tagID);
         my $tagInfo;
@@ -3095,11 +3164,11 @@ sub GetAddDirHash($$;$)
             # get name for this sub directory
             # (take directory name from SubDirectory DirName if it exists,
             #  otherwise Group0 name of SubDirectory TagTable or tag Group1 name)
-            my $dirName = $tagInfo->{SubDirectory}{DirName};
+            my $dirName = $$tagInfo{SubDirectory}{DirName};
             unless ($dirName) {
                 # use tag name for directory name and save for next time
                 $dirName = $$tagInfo{Name};
-                $tagInfo->{SubDirectory}{DirName} = $dirName;
+                $$tagInfo{SubDirectory}{DirName} = $dirName;
             }
             # save this directory information if we are writing it
             if ($$editDirs{$dirName} and $$editDirs{$dirName} eq $parent) {
@@ -3148,8 +3217,8 @@ sub GetLangInfo($$)
 sub InitWriteDirs($$;$)
 {
     my ($self, $fileType, $preferredGroup) = @_;
-    my $editDirs = $self->{EDIT_DIRS} = { };
-    my $addDirs = $self->{ADD_DIRS} = { };
+    my $editDirs = $$self{EDIT_DIRS} = { };
+    my $addDirs = $$self{ADD_DIRS} = { };
     my $fileDirs = $dirMap{$fileType};
     unless ($fileDirs) {
         return unless ref $fileType eq 'HASH';
@@ -3165,14 +3234,14 @@ sub InitWriteDirs($$;$)
         # cycle through all hashes in linked list
         for ($nvHash=$self->GetNewValueHash($tagInfo); $nvHash; $nvHash=$$nvHash{Next}) {
             # are we creating this tag? (otherwise just deleting or editing it)
-            my $isCreating = $nvHash->{IsCreating};
+            my $isCreating = $$nvHash{IsCreating};
             if ($isCreating) {
                 # if another group is taking priority, only create
                 # directory if specifically adding tags to this group
                 # or if this tag isn't being added to the priority group
                 $isCreating = 0 if $preferredGroup and
                     $preferredGroup ne $self->GetGroup($tagInfo, 0) and
-                    $nvHash->{CreateGroups}{$preferredGroup};
+                    $$nvHash{CreateGroups}{$preferredGroup};
             } else {
                 # creating this directory if any tag is preferred and has a value
                 $isCreating = 1 if ($preferredGroup and $$nvHash{Value} and
@@ -3181,7 +3250,7 @@ sub InitWriteDirs($$;$)
             }
             # tag belongs to directory specified by WriteGroup, or by
             # the Group0 name if WriteGroup not defined
-            my $dirName = $nvHash->{WriteGroup};
+            my $dirName = $$nvHash{WriteGroup};
             # remove MIE copy number(s) if they exist
             if ($dirName =~ /^MIE\d*(-[a-z]+)?\d*$/i) {
                 $dirName = 'MIE' . ($1 || '');
@@ -3199,9 +3268,9 @@ sub InitWriteDirs($$;$)
             }
         }
     }
-    if (%{$self->{DEL_GROUP}}) {
+    if (%{$$self{DEL_GROUP}}) {
         # add delete groups to list of edited groups
-        foreach (keys %{$self->{DEL_GROUP}}) {
+        foreach (keys %{$$self{DEL_GROUP}}) {
             next if /^-/;   # ignore excluded groups
             my $dirName = $_;
             # translate necessary group 0 names
@@ -3226,12 +3295,12 @@ sub InitWriteDirs($$;$)
         $$editDirs{APP0} = undef;
     }
 
-    if ($self->{OPTIONS}{Verbose}) {
-        my $out = $self->{OPTIONS}{TextOut};
+    if ($$self{OPTIONS}{Verbose}) {
+        my $out = $$self{OPTIONS}{TextOut};
         print $out "  Editing tags in: ";
         foreach (sort keys %$editDirs) { print $out "$_ "; }
         print $out "\n";
-        return unless $self->{OPTIONS}{Verbose} > 1;
+        return unless $$self{OPTIONS}{Verbose} > 1;
         print $out "  Creating tags in: ";
         foreach (sort keys %$addDirs) { print $out "$_ "; }
         print $out "\n";
@@ -3249,14 +3318,14 @@ sub WriteDirectory($$$;$)
     my ($out, $nvHash);
 
     $tagTablePtr or return undef;
-    $out = $self->{OPTIONS}{TextOut} if $self->{OPTIONS}{Verbose};
+    $out = $$self{OPTIONS}{TextOut} if $$self{OPTIONS}{Verbose};
     # set directory name from default group0 name if not done already
     my $dirName = $$dirInfo{DirName};
     my $dataPt = $$dirInfo{DataPt};
-    my $grp0 = $tagTablePtr->{GROUPS}{0};
+    my $grp0 = $$tagTablePtr{GROUPS}{0};
     $dirName or $dirName = $$dirInfo{DirName} = $grp0;
-    if (%{$self->{DEL_GROUP}}) {
-        my $delGroup = $self->{DEL_GROUP};
+    if (%{$$self{DEL_GROUP}}) {
+        my $delGroup = $$self{DEL_GROUP};
         # delete entire directory if specified
         my $grp1 = $dirName;
         my $delFlag = ($$delGroup{$grp0} or $$delGroup{$grp1});
@@ -3270,7 +3339,7 @@ sub WriteDirectory($$$;$)
                 } elsif ($$self{FILE_TYPE} =~ /^(EPS|PS)$/) {
                     # allow anything to be deleted from PostScript files
                 } elsif ($grp1 eq 'IFD0') {
-                    my $type = $self->{TIFF_TYPE} || $self->{FILE_TYPE};
+                    my $type = $$self{TIFF_TYPE} || $$self{FILE_TYPE};
                     $$delGroup{IFD0} and $self->Warn("Can't delete IFD0 from $type",1);
                     undef $grp1;
                 } elsif ($grp0 eq 'EXIF' and $$delGroup{$grp0}) {
@@ -3279,10 +3348,10 @@ sub WriteDirectory($$$;$)
             }
             if ($grp1) {
                 if ($dataPt or $$dirInfo{RAF}) {
-                    ++$self->{CHANGED};
+                    ++$$self{CHANGED};
                     $out and print $out "  Deleting $grp1\n";
                     # can no longer validate TIFF_END if deleting an entire IFD
-                    delete $self->{TIFF_END} if $dirName =~ /IFD/;
+                    delete $$self{TIFF_END} if $dirName =~ /IFD/;
                 }
                 # don't add back into the wrong location
                 my $right = $$self{ADD_DIRS}{$grp1};
@@ -3335,7 +3404,7 @@ sub WriteDirectory($$$;$)
     my $blockName = $dirName;
     $blockName = 'EXIF' if $blockName eq 'IFD0';
     my $tagInfo = $Image::ExifTool::Extra{$blockName} || $$dirInfo{TagInfo};
-    while ($tagInfo and ($nvHash = $self->{NEW_VALUE}{$tagInfo}) and
+    while ($tagInfo and ($nvHash = $$self{NEW_VALUE}{$tagInfo}) and
         $self->IsOverwriting($nvHash) and not ($$nvHash{CreateOnly} and $isRewriting))
     {
         # protect against writing EXIF to wrong file types, etc
@@ -3344,14 +3413,13 @@ sub WriteDirectory($$$;$)
                 $self->Warn("Can't write EXIF as a block to $$self{FILE_TYPE} file");
                 last;
             }
-            unless ($writeProc eq \&Image::ExifTool::WriteTIFF) {
-                # this could happen if we called WriteDirectory for an EXIF directory
-                # without going through WriteTIFF as the WriteProc, which would be bad
-                # because the EXIF block could end up with two TIFF headers
-                $self->Warn('Internal error writing EXIF -- please report');
-                last;
-            }
+            # this can happen if we call WriteDirectory for an EXIF directory without  going
+            # through WriteTIFF as the WriteProc (which happens if conditionally replacing
+            # the EXIF block and the condition fails), but we never want to do a block write
+            # in this case because the EXIF block would end up with two TIFF headers
+            last unless $writeProc eq \&Image::ExifTool::WriteTIFF;
         }
+        last unless $self->IsOverwriting($nvHash, $dataPt ? $$dataPt : '');
         my $verb = 'Writing';
         my $newVal = $self->GetNewValues($nvHash);
         unless (defined $newVal and length $newVal) {
@@ -3360,18 +3428,18 @@ sub WriteDirectory($$$;$)
         }
         $$dirInfo{BlockWrite} = 1;  # set flag indicating we did a block write
         $out and print $out "  $verb $blockName as a block\n";
-        ++$self->{CHANGED};
+        ++$$self{CHANGED};
         return $newVal;
     }
     # guard against writing the same directory twice
     if (defined $dataPt and defined $$dirInfo{DirStart} and defined $$dirInfo{DataPos}) {
         my $addr = $$dirInfo{DirStart} + $$dirInfo{DataPos} + ($$dirInfo{Base}||0) + $$self{BASE};
         # (Phase One P25 IIQ files have ICC_Profile duplicated in IFD0 and IFD1)
-        if ($self->{PROCESSED}{$addr} and ($dirName ne 'ICC_Profile' or $$self{TIFF_TYPE} ne 'IIQ')) {
-            if (defined $$dirInfo{DirLen} and not $$dirInfo{DirLen} and $dirName ne $self->{PROCESSED}{$addr}) {
+        if ($$self{PROCESSED}{$addr} and ($dirName ne 'ICC_Profile' or $$self{TIFF_TYPE} ne 'IIQ')) {
+            if (defined $$dirInfo{DirLen} and not $$dirInfo{DirLen} and $dirName ne $$self{PROCESSED}{$addr}) {
                 # it is hypothetically possible to have 2 different directories
                 # with the same address if one has a length of zero
-            } elsif ($self->Error("$dirName pointer references previous $self->{PROCESSED}{$addr} directory", 2)) {
+            } elsif ($self->Error("$dirName pointer references previous $$self{PROCESSED}{$addr} directory", 2)) {
                 return undef;
             } else {
                 $self->Warn("Deleting duplicate $dirName directory");
@@ -3379,29 +3447,29 @@ sub WriteDirectory($$$;$)
                 return '';  # delete the duplicate directory
             }
         } else {
-            $self->{PROCESSED}{$addr} = $dirName;
+            $$self{PROCESSED}{$addr} = $dirName;
         }
     }
-    my $oldDir = $self->{DIR_NAME};
+    my $oldDir = $$self{DIR_NAME};
     my $name;
     if ($out) {
         $name = ($dirName eq 'MakerNotes' and $$dirInfo{TagInfo}) ?
-                 $dirInfo->{TagInfo}{Name} : $dirName;
+                 $$dirInfo{TagInfo}{Name} : $dirName;
         if (not defined $oldDir or $oldDir ne $name) {
             my $verb = $isRewriting ? 'Rewriting' : 'Creating';
             print $out "  $verb $name\n";
         }
     }
     my $saveOrder = GetByteOrder();
-    my $oldChanged = $self->{CHANGED};
-    $self->{DIR_NAME} = $dirName;
-    push @{$self->{PATH}}, $dirName;
+    my $oldChanged = $$self{CHANGED};
+    $$self{DIR_NAME} = $dirName;
+    push @{$$self{PATH}}, $dirName;
     $$dirInfo{IsWriting} = 1;
     my $newData = &$writeProc($self, $dirInfo, $tagTablePtr);
-    pop @{$self->{PATH}};
+    pop @{$$self{PATH}};
     # nothing changed if error occurred or nothing was created
-    $self->{CHANGED} = $oldChanged unless defined $newData and (length($newData) or $isRewriting);
-    $self->{DIR_NAME} = $oldDir;
+    $$self{CHANGED} = $oldChanged unless defined $newData and (length($newData) or $isRewriting);
+    $$self{DIR_NAME} = $oldDir;
     SetByteOrder($saveOrder);
     print $out "  Deleting $name\n" if $out and defined $newData and not length $newData;
     return $newData;
@@ -3511,8 +3579,8 @@ sub HexDump($;$%)
 sub VerboseInfo($$$%)
 {
     my ($self, $tagID, $tagInfo, %parms) = @_;
-    my $verbose = $self->{OPTIONS}{Verbose};
-    my $out = $self->{OPTIONS}{TextOut};
+    my $verbose = $$self{OPTIONS}{Verbose};
+    my $out = $$self{OPTIONS}{TextOut};
     my ($tag, $line, $hexID);
 
     # generate hex number if tagID is numerical
@@ -3537,7 +3605,7 @@ sub VerboseInfo($$$%)
     my $dataPt = $parms{DataPt};
     my $size = $parms{Size};
     $size = length $$dataPt unless defined $size or not $dataPt;
-    my $indent = $self->{INDENT};
+    my $indent = $$self{INDENT};
 
     # Level 1: print tag/value information
     $line = $indent;
@@ -3611,8 +3679,8 @@ sub DumpTrailer($$)
     my $curPos = $raf->Tell();
     my $trailer = $$dirInfo{DirName} || 'Unknown';
     my $pos = $$dirInfo{DataPos};
-    my $verbose = $self->{OPTIONS}{Verbose};
-    my $htmlDump = $self->{HTML_DUMP};
+    my $verbose = $$self{OPTIONS}{Verbose};
+    my $htmlDump = $$self{HTML_DUMP};
     my ($buff, $buf2);
     my $size = $$dirInfo{DirLen};
     $pos = $curPos unless defined $pos;
@@ -3632,7 +3700,7 @@ sub DumpTrailer($$)
             $self->HDump($pos, $num, $desc, undef, 0x08);
             last;
         }
-        my $out = $self->{OPTIONS}{TextOut};
+        my $out = $$self{OPTIONS}{TextOut};
         printf $out "$trailer trailer (%d bytes at offset 0x%.4x):\n", $size, $pos;
         last unless $verbose > 2;
         my $num = $size;    # number of bytes to read
@@ -3672,8 +3740,8 @@ sub DumpUnknownTrailer($$)
     my $pos = $$dirInfo{DataPos};
     my $endPos = $pos + $$dirInfo{DirLen};
     # account for preview/MPF image trailer
-    my $prePos = $self->{VALUE}{PreviewImageStart} || $$self{PreviewImageStart};
-    my $preLen = $self->{VALUE}{PreviewImageLength} || $$self{PreviewImageLength};
+    my $prePos = $$self{VALUE}{PreviewImageStart} || $$self{PreviewImageStart};
+    my $preLen = $$self{VALUE}{PreviewImageLength} || $$self{PreviewImageLength};
     my $tag = 'PreviewImage';
     my $mpImageNum = 0;
     my (%image, $lastOne);
@@ -3683,12 +3751,12 @@ sub DumpUnknownTrailer($$)
         last if $lastOne;   # checked all images
         # look for MPF images (in the the proper order)
         ++$mpImageNum;
-        $prePos = $self->{VALUE}{"MPImageStart ($mpImageNum)"};
+        $prePos = $$self{VALUE}{"MPImageStart ($mpImageNum)"};
         if (defined $prePos) {
-            $preLen = $self->{VALUE}{"MPImageLength ($mpImageNum)"};
+            $preLen = $$self{VALUE}{"MPImageLength ($mpImageNum)"};
         } else {
-            $prePos = $self->{VALUE}{'MPImageStart'};
-            $preLen = $self->{VALUE}{'MPImageLength'};
+            $prePos = $$self{VALUE}{'MPImageStart'};
+            $preLen = $$self{VALUE}{'MPImageLength'};
             $lastOne = 1;
         }
         $tag = "MPImage$mpImageNum";
@@ -3706,7 +3774,7 @@ sub DumpUnknownTrailer($$)
         ($tag, $preLen) = @{$image{$prePos}};
         last unless $preLen;
         # dump image if verbose (it is htmlDump'd by ExtractImage)
-        if ($self->{OPTIONS}{Verbose}) {
+        if ($$self{OPTIONS}{Verbose}) {
             $$dirInfo{DirName} = $tag;
             $$dirInfo{DataPos} = $prePos;
             $$dirInfo{DirLen}  = $preLen;
@@ -3723,8 +3791,8 @@ sub DumpUnknownTrailer($$)
 sub LastInList($)
 {
     my $element = shift;
-    while ($element->{Next}) {
-        $element = $element->{Next};
+    while ($$element{Next}) {
+        $element = $$element{Next};
     }
     return $element;
 }
@@ -3737,13 +3805,13 @@ sub LastInList($)
 sub VerboseDir($$;$$)
 {
     my ($self, $name, $entries, $size) = @_;
-    return unless $self->{OPTIONS}{Verbose};
+    return unless $$self{OPTIONS}{Verbose};
     if (ref $name eq 'HASH') {
         $size = $$name{DirLen} unless $size;
         $name = $$name{Name} || $$name{DirName};
     }
-    my $indent = substr($self->{INDENT}, 0, -2);
-    my $out = $self->{OPTIONS}{TextOut};
+    my $indent = substr($$self{INDENT}, 0, -2);
+    my $out = $$self{OPTIONS}{TextOut};
     my $str = $entries ? " with $entries entries" : '';
     $str .= ", $size bytes" if $size;
     print $out "$indent+ [$name directory$str]\n";
@@ -3757,7 +3825,7 @@ sub VerboseValue($$$;$)
 {
     return unless $_[0]{OPTIONS}{Verbose} > 1;
     my ($self, $str, $val, $xtra) = @_;
-    my $out = $self->{OPTIONS}{TextOut};
+    my $out = $$self{OPTIONS}{TextOut};
     $xtra or $xtra = '';
     my $maxLen = 81 - length($str) - length($xtra);
     $val = $self->Printable($val, $maxLen);
@@ -3906,7 +3974,7 @@ sub InverseDateTime($$;$$)
             # add/remove timezone if necessary
             if ($tzFlag) {
                 if (not $tz) {
-                    if (eval 'require Time::Local') {
+                    if (eval { require Time::Local }) {
                         # determine timezone offset for this time
                         my @args = ($a[4],$a[3],$a[2],$a[1],$a[0]-1,$yr-1900);
                         my $diff = Time::Local::timegm(@args) - TimeLocal(@args);
@@ -3949,10 +4017,10 @@ sub SetPreferredByteOrder($)
     my $self = shift;
     my $byteOrder = $self->Options('ByteOrder') ||
                     $self->GetNewValues('ExifByteOrder') ||
-                    $self->{MAKER_NOTE_BYTE_ORDER} || 'MM';
+                    $$self{MAKER_NOTE_BYTE_ORDER} || 'MM';
     unless (SetByteOrder($byteOrder)) {
         warn "Invalid byte order '$byteOrder'\n" if $self->Options('Verbose');
-        $byteOrder = $self->{MAKER_NOTE_BYTE_ORDER} || 'MM';
+        $byteOrder = $$self{MAKER_NOTE_BYTE_ORDER} || 'MM';
         SetByteOrder($byteOrder);
     }
     return GetByteOrder();
@@ -4025,6 +4093,16 @@ sub Set32s(@)
     $val < 0 and $val += 0xffffffff, ++$val;
     return Set32u($val, @_);
 }
+sub Set64u(@)
+{
+    my $val = shift;
+    my $hi = int($val / 4294967296);
+    my $lo = Set32u($val - $hi * 4294967296);
+    $hi = Set32u($hi);
+    $val = GetByteOrder() eq 'MM' ? $hi . $lo : $lo . $hi;
+    $_[1] and substr(${$_[1]}, $_[2], length($val)) = $val;
+    return $val;
+}
 sub SetRational64u(@) {
     my ($numer,$denom) = Rationalize($_[0],0xffffffff);
     my $val = Set32u($numer) . Set32u($denom);
@@ -4086,6 +4164,7 @@ my %writeValueProc = (
     int16uRev => \&Set16uRev,
     int32s => \&Set32s,
     int32u => \&Set32u,
+    int64u => \&Set64u,
     rational32s => \&SetRational32s,
     rational32u => \&SetRational32u,
     rational64s => \&SetRational64s,
@@ -4122,7 +4201,7 @@ my %writeValueProc = (
 #         2) number of values:
 #               undef = 1 for numerical types, or data length for string/undef types
 #                  -1 = number of space-delimited values in the input string
-#         3) optional data reference, 4) value offset
+#         3) optional data reference, 4) value offset (may be negative for bytes from end)
 # Returns: packed value (and sets value in data) or undef on error
 # Notes: May modify input value to round for integer formats
 sub WriteValue($$;$$$$)
@@ -4266,9 +4345,9 @@ sub Write($@)
 sub WriteTrailerBuffer($$$)
 {
     my ($self, $trailInfo, $outfile) = @_;
-    if ($self->{DEL_GROUP}{Trailer}) {
+    if ($$self{DEL_GROUP}{Trailer}) {
         $self->VPrint(0, "  Deleting trailer ($$trailInfo{Offset} bytes)\n");
-        ++$self->{CHANGED};
+        ++$$self{CHANGED};
         return 1;
     }
     my $pos = Tell($outfile);
@@ -4277,8 +4356,8 @@ sub WriteTrailerBuffer($$$)
     if ($$trailInfo{Fixup}) {
         if ($pos > 0) {
             # shift offsets to final AFCP location and write it out
-            $trailInfo->{Fixup}{Shift} += $pos;
-            $trailInfo->{Fixup}->ApplyFixup($trailPt);
+            $$trailInfo{Fixup}{Shift} += $pos;
+            $$trailInfo{Fixup}->ApplyFixup($trailPt);
         } else {
             $self->Error("Can't get file position for trailer offset fixup",1);
         }
@@ -4303,7 +4382,7 @@ sub AddNewTrailers($;@)
     # add trailers as a block
     my $type;
     foreach $type (@types) {
-        next unless $self->{NEW_VALUE}{$Image::ExifTool::Extra{$type}};
+        next unless $$self{NEW_VALUE}{$Image::ExifTool::Extra{$type}};
         my $val = $self->GetNewValues($type) or next;
         my $verb = $trailPt ? 'Writing' : 'Adding';
         $self->VPrint(0, "  $verb $type as a block\n");
@@ -4398,26 +4477,35 @@ sub WriteJPEG($$)
     my ($self, $dirInfo) = @_;
     my $outfile = $$dirInfo{OutFile};
     my $raf = $$dirInfo{RAF};
-    my ($ch,$s,$length);
-    my $verbose = $self->{OPTIONS}{Verbose};
-    my $out = $self->{OPTIONS}{TextOut};
+    my ($ch, $s, $length,$err, %doneDir, $isEXV, $creatingEXV);
+    my $verbose = $$self{OPTIONS}{Verbose};
+    my $out = $$self{OPTIONS}{TextOut};
     my $rtnVal = 0;
-    my ($err, %doneDir);
     my %dumpParms = ( Out => $out );
     my ($writeBuffer, $oldOutfile); # used to buffer writing until PreviewImage position is known
 
-    # check to be sure this is a valid JPG file
-    return 0 unless $raf->Read($s,2) == 2 and $s eq "\xff\xd8";
+    # check to be sure this is a valid JPG or EXV file
+    unless ($raf->Read($s,2) == 2 and $s eq "\xff\xd8") {
+        if (defined $s and length $s) {
+            return 0 unless $s eq "\xff\x01" and $raf->Read($s,5) == 5 and $s eq 'Exiv2';
+        } else {
+            return 0 unless $$self{FILE_TYPE} eq 'EXV';
+            $s = 'Exiv2';
+            $creatingEXV = 1;
+        }
+        Write($outfile,"\xff\x01") or $err = 1;
+        $isEXV = 1;
+    }
     $dumpParms{MaxLen} = 128 unless $verbose > 3;
 
-    delete $self->{PREVIEW_INFO};   # reset preview information
-    delete $self->{DEL_PREVIEW};    # reset flag to delete preview
+    delete $$self{PREVIEW_INFO};   # reset preview information
+    delete $$self{DEL_PREVIEW};    # reset flag to delete preview
 
     Write($outfile, $s) or $err = 1;
     # figure out what segments we need to write for the tags we have set
-    my $addDirs = $self->{ADD_DIRS};
-    my $editDirs = $self->{EDIT_DIRS};
-    my $delGroup = $self->{DEL_GROUP};
+    my $addDirs = $$self{ADD_DIRS};
+    my $editDirs = $$self{EDIT_DIRS};
+    my $delGroup = $$self{DEL_GROUP};
     my $path = $$self{PATH};
     my $pn = scalar @$path;
 
@@ -4459,16 +4547,24 @@ sub WriteJPEG($$)
                 my $n = $len < 64 ? $len : 64;
                 $raf->Read($s, $n) == $n or last;
                 $len -= $n;
-                # (Note: only necessary to recognize APP segments that we can create)
+                # Note: only necessary to recognize APP segments that we can create,
+                # or delete as a group (and the names below should match @delGroups)
                 if ($marker == 0xe0) {
                     $s =~ /^JFIF\0/         and $dirName = 'JFIF';
                     $s =~ /^JFXX\0\x10/     and $dirName = 'JFXX';
+                    $s =~ /^(II|MM).{4}HEAPJPGM/s and $dirName = 'CIFF';
                 } elsif ($marker == 0xe1) {
                     $s =~ /^(.{0,4})$exifAPP1hdr/s and $dirName = 'IFD0';
                     $s =~ /^$xmpAPP1hdr/    and $dirName = 'XMP';
                     $s =~ /^$xmpExtAPP1hdr/ and $dirName = 'XMP';
                 } elsif ($marker == 0xe2) {
                     $s =~ /^ICC_PROFILE\0/  and $dirName = 'ICC_Profile';
+                    $s =~ /^FPXR\0/         and $dirName = 'FlashPix';
+                    $s =~ /^MPF\0/          and $dirName = 'MPF';
+                } elsif ($marker == 0xe3) {
+                    $s =~ /^(Meta|META|Exif)\0\0/ and $dirName = 'Meta';
+                } elsif ($marker == 0xe5) {
+                    $s =~ /^RMETA\0/        and $dirName = 'RMETA';
                 } elsif ($marker == 0xec) {
                     $s =~ /^Ducky/          and $dirName = 'Ducky';
                 } elsif ($marker == 0xed) {
@@ -4487,8 +4583,10 @@ sub WriteJPEG($$)
         push @dirOrder, $dirName;
     }
     unless ($marker and $marker == 0xda) {
-        $self->Error('Corrupted JPEG image');
-        return 1;
+        $isEXV or $self->Error('Corrupted JPEG image'), return 1;
+        $marker and $marker ne 0xd9 and $self->Error('Corrupted EXV file'), return 1;
+        push @dirOrder, 'EOI';
+        $dirCount{EOI} = 1;
     }
     $raf->Seek($pos, 0) or $self->Error('Seek error'), return 1;
 #
@@ -4508,9 +4606,17 @@ sub WriteJPEG($$)
         Write($outfile, $segJunk) if length $segJunk;
         # JPEG markers can be padded with unlimited 0xff's
         for (;;) {
-            $raf->Read($ch, 1) or $self->Error('Format error'), return 1;
-            $marker = ord($ch);
-            last unless $marker == 0xff;
+            if ($raf->Read($ch, 1)) {
+                $marker = ord($ch);
+                last unless $marker == 0xff;
+            } elsif ($creatingEXV) {
+                # create EXV from scratch
+                $marker = 0xd9; # EOI
+                last;
+            } else {
+                $self->Error('Format error');
+                return 1;
+            }
         }
         # read the segment data
         my $segData;
@@ -4518,8 +4624,10 @@ sub WriteJPEG($$)
         if (($marker & 0xf0) == 0xc0 and ($marker == 0xc0 or $marker & 0x03)) {
             last unless $raf->Read($segData, 7) == 7;
         # read data for all markers except stand-alone
-        # markers 0x00, 0x01 and 0xd0-0xd7 (NULL, TEM, RST0-RST7)
-        } elsif ($marker!=0x00 and $marker!=0x01 and ($marker<0xd0 or $marker>0xd7)) {
+        # markers 0x00, 0x01 and 0xd0-0xd7 (NULL, TEM, EOI, RST0-RST7)
+        } elsif ($marker!=0x00 and $marker!=0x01 and $marker!=0xd9 and
+            ($marker<0xd0 or $marker>0xd7))
+        {
             # read record length word
             last unless $raf->Read($s, 2) == 2;
             my $len = unpack('n',$s);   # get data length
@@ -4571,7 +4679,7 @@ sub WriteJPEG($$)
                 $doneDir{IFD0} = 1;
                 $verbose and print $out "Creating APP1:\n";
                 # write new EXIF data
-                $self->{TIFF_TYPE} = 'APP1';
+                $$self{TIFF_TYPE} = 'APP1';
                 my $tagTablePtr = GetTagTable('Image::ExifTool::Exif::Main');
                 my %dirInfo = (
                     DirName => 'IFD0',
@@ -4595,7 +4703,7 @@ sub WriteJPEG($$)
                         my $app1hdr = "\xff\xe1" . pack('n', $size + 2);
                         Write($outfile,$app1hdr,$exifAPP1hdr,$buff) or $err = 1;
                     } else {
-                        delete $self->{PREVIEW_INFO};
+                        delete $$self{PREVIEW_INFO};
                         $self->Warn("EXIF APP1 segment too large! ($size bytes)");
                     }
                 }
@@ -4614,7 +4722,7 @@ sub WriteJPEG($$)
                 my $buff = $self->WriteDirectory(\%dirInfo, $tagTablePtr);
                 if (defined $buff and length $buff) {
                     WriteMultiSegment($outfile, 0xed, $psAPP13hdr, \$buff) or $err = 1;
-                    ++$self->{CHANGED};
+                    ++$$self{CHANGED};
                 }
             }
             # then APP1 XMP segment
@@ -4651,7 +4759,7 @@ sub WriteJPEG($$)
                 my $buff = $self->WriteDirectory(\%dirInfo, $tagTablePtr);
                 if (defined $buff and length $buff) {
                     WriteMultiSegment($outfile, 0xe2, "ICC_PROFILE\0", \$buff, 'ICC') or $err = 1;
-                    ++$self->{CHANGED};
+                    ++$$self{CHANGED};
                 }
             }
             # then APP12 Ducky segment
@@ -4689,7 +4797,7 @@ sub WriteJPEG($$)
                         # write the new segment with appropriate header
                         my $app14hdr = "\xff\xee" . pack('n', $size + 2);
                         Write($outfile, $app14hdr, $buff) or $err = 1;
-                        ++$self->{CHANGED};
+                        ++$$self{CHANGED};
                     } else {
                         $self->Warn("Adobe APP14 segment too large! ($size bytes)");
                     }
@@ -4707,7 +4815,7 @@ sub WriteJPEG($$)
                         $self->VerboseValue('+ Comment', $newComment);
                     }
                     WriteMultiSegment($outfile, 0xfe, '', \$newComment) or $err = 1;
-                    ++$self->{CHANGED};
+                    ++$$self{CHANGED};
                 }
             }
             last;   # didn't want to loop anyway
@@ -4730,7 +4838,7 @@ sub WriteJPEG($$)
             $s = pack('n', length($segData) + 2);
             Write($outfile, $hdr, $s, $segData) or $err = 1;
             my ($buff, $endPos, $trailInfo);
-            my $delPreview = $self->{DEL_PREVIEW};
+            my $delPreview = $$self{DEL_PREVIEW};
             $trailInfo = IdentifyTrailer($raf) unless $$delGroup{Trailer};
             unless ($oldOutfile or $delPreview or $trailInfo or $$delGroup{Trailer}) {
                 # blindly copy the rest of the file
@@ -4794,9 +4902,9 @@ sub WriteJPEG($$)
                 $fixup->SetMarkerPointers($outfile, 'LeicaTrailer', length($$outfile) - 10 + $junk);
                 # use this fixup to set the size too (sneaky)
                 my $trailSize = defined($dat) ? length($dat) - $junk : $$self{LeicaTrailer}{Size};
-                $fixup->{Start} -= 4;  $fixup->{Shift} += 4;
-                $fixup->SetMarkerPointers($outfile, 'LeicaTrailer', $trailSize);
-                $fixup->{Start} += 4;  $fixup->{Shift} -= 4;
+                $$fixup{Start} -= 4;  $$fixup{Shift} += 4;
+                $fixup->SetMarkerPointers($outfile, 'LeicaTrailer', $trailSize) if defined $trailSize;
+                $$fixup{Start} += 4;  $$fixup{Shift} -= 4;
                 # clean up and write the buffered data
                 $outfile = $oldOutfile;
                 undef $oldOutfile;
@@ -4841,8 +4949,8 @@ sub WriteJPEG($$)
                     $newPos += $junkLen;
                 }
                 # fix up the preview offsets to point to the start of the new image
-                my $previewInfo = $self->{PREVIEW_INFO};
-                delete $self->{PREVIEW_INFO};
+                my $previewInfo = $$self{PREVIEW_INFO};
+                delete $$self{PREVIEW_INFO};
                 my $fixup = $$previewInfo{Fixup};
                 $newPos += ($$previewInfo{BaseShift} || 0);
                 # adjust to absolute file offset if necessary (Samsung STMN)
@@ -4886,7 +4994,7 @@ sub WriteJPEG($$)
                 if ($extra > 0) {
                     if ($$delGroup{Trailer}) {
                         $verbose and print $out "  Deleting unknown trailer ($extra bytes)\n";
-                        ++$self->{CHANGED};
+                        ++$$self{CHANGED};
                     } else {
                         # copy over unknown trailer
                         $verbose and print $out "  Preserving unknown trailer ($extra bytes)\n";
@@ -4902,6 +5010,12 @@ sub WriteJPEG($$)
             }
             last;   # all done parsing file
 
+        } elsif ($marker==0xd9 and $isEXV) {
+            # write EXV EOI
+            Write($outfile, "\xff\xd9") or $err = 1;
+            $rtnVal = 1;
+            last;
+
         } elsif ($marker==0x00 or $marker==0x01 or ($marker>=0xd0 and $marker<=0xd7)) {
             $verbose and $marker and print $out "JPEG $markerName:\n";
             # handle stand-alone markers 0x00, 0x01 and 0xd0-0xd7 (NULL, TEM, RST0-RST7)
@@ -4911,7 +5025,7 @@ sub WriteJPEG($$)
         #
         # NOTE: A 'next' statement after this point will cause $$segDataPt
         #       not to be written if there is an output file, so in this case
-        #       the $self->{CHANGED} flags must be updated
+        #       the $$self{CHANGED} flags must be updated
         #
         my $segDataPt = \$segData;
         $length = length($segData);
@@ -4921,11 +5035,17 @@ sub WriteJPEG($$)
                 HexDump($segDataPt, undef, %dumpParms);
             }
         }
+        # group delete of APP segements
+        if ($$delGroup{$dirName}) {
+            $verbose and print $out "  Deleting $dirName segment\n";
+            ++$$self{CHANGED};
+            next Marker;
+        }
         my ($segType, $del);
         # rewrite this segment only if we are changing a tag which is contained in its
         # directory (or deleting '*', in which case we need to identify the segment type)
         while (exists $$editDirs{$markerName} or $$delGroup{'*'}) {
-            my $oldChanged = $self->{CHANGED};
+            my $oldChanged = $$self{CHANGED};
             if ($marker == 0xe0) {              # APP0 (JFIF, CIFF)
                 if ($$segDataPt =~ /^JFIF\0/) {
                     $segType = 'JFIF';
@@ -5004,7 +5124,7 @@ sub WriteJPEG($$)
                         $$segDataPt = $exifAPP1hdr . $buff;
                     } else {
                         last Marker unless $self->Options('IgnoreMinorErrors');
-                        $self->{CHANGED} = $oldChanged; # nothing changed
+                        $$self{CHANGED} = $oldChanged; # nothing changed
                     }
                     # switch to buffered output if required
                     if (($$self{PREVIEW_INFO} or $$self{LeicaTrailer}) and not $oldOutfile) {
@@ -5095,7 +5215,7 @@ sub WriteJPEG($$)
                             $$segDataPt = '';   # delete the XMP
                         }
                     } else {
-                        $self->{CHANGED} = $oldChanged;
+                        $$self{CHANGED} = $oldChanged;
                         $verbose and print $out "    [XMP rewritten with no changes]\n";
                         if ($doneDir{XMP} > 1) {
                             # re-write original multi-segment XMP
@@ -5140,7 +5260,7 @@ sub WriteJPEG($$)
                             $self->Error('Inconsistent ICC_Profile chunk count', 1);
                             undef $iccChunkCount; # abort ICC_Profile parsing
                             undef $chunkNum;      # avoid 2nd warning below
-                            ++$self->{CHANGED};   # we are deleting the bad chunks before this one
+                            ++$$self{CHANGED};    # we are deleting the bad chunks before this one
                         }
                     } else {
                         $iccChunkCount = 0;
@@ -5219,7 +5339,7 @@ sub WriteJPEG($$)
                         $$segDataPt = substr($$segDataPt,0,6) . $buff;
                     } else {
                         last Marker unless $self->Options('IgnoreMinorErrors');
-                        $self->{CHANGED} = $oldChanged; # nothing changed
+                        $$self{CHANGED} = $oldChanged; # nothing changed
                     }
                     # delete segment if IFD contains no entries
                     $del = 1 unless length($$segDataPt) > 6;
@@ -5252,7 +5372,7 @@ sub WriteJPEG($$)
                         $newData = 'Ducky' . $newData if length $newData;
                         $segDataPt = \$newData;
                     } else {
-                        $self->{CHANGED} = $oldChanged;
+                        $$self{CHANGED} = $oldChanged;
                     }
                     $del = 1 unless length $$segDataPt;
                 }
@@ -5293,7 +5413,7 @@ sub WriteJPEG($$)
                         undef $$segDataPt;  # free the old buffer
                         $segDataPt = \$newData;
                     } else {
-                        $self->{CHANGED} = $oldChanged;
+                        $$self{CHANGED} = $oldChanged;
                     }
                     length $$segDataPt or $del = 1, last;
                     # write as multi-segment
@@ -5336,7 +5456,7 @@ sub WriteJPEG($$)
                 } else {
                     $verbose and print $out "  Deleting COM segment\n";
                 }
-                ++$self->{CHANGED};     # increment the changed flag
+                ++$$self{CHANGED};      # increment the changed flag
                 undef $segDataPt;       # don't write existing comment
             }
             last;   # didn't want to loop anyway
@@ -5346,7 +5466,7 @@ sub WriteJPEG($$)
         if ($del or ($$delGroup{'*'} and not $segType and $marker>=0xe0 and $marker<=0xef)) {
             $segType = 'unknown' unless $segType;
             $verbose and print $out "  Deleting $markerName $segType segment\n";
-            ++$self->{CHANGED};
+            ++$$self{CHANGED};
             next Marker;
         }
         # write out this segment if $segDataPt is still defined
@@ -5377,6 +5497,10 @@ sub WriteJPEG($$)
     }
     # set return value to -1 if we only had a write error
     $rtnVal = -1 if $rtnVal and $err;
+    if ($creatingEXV and $rtnVal > 0 and not $$self{CHANGED}) {
+        $self->Error('Nothing written');
+        $rtnVal = -1;
+    }
     return $rtnVal;
 }
 
@@ -5522,7 +5646,7 @@ sub CopyBlock($$$)
 sub CopyImageData($$$)
 {
     my ($self, $imageDataBlocks, $outfile) = @_;
-    my $raf = $self->{RAF};
+    my $raf = $$self{RAF};
     my ($dataBlock, $err);
     my $num = @$imageDataBlocks;
     $self->VPrint(0, "  Copying $num image data blocks\n") if $num;
@@ -5577,16 +5701,17 @@ sub WriteBinaryData($$$)
     my $tagInfo;
     $dataPt = \$newData;
     foreach $tagInfo ($self->GetNewTagInfoList($tagTablePtr)) {
-        my $tagID = $tagInfo->{TagID};
+        my $tagID = $$tagInfo{TagID};
         # evaluate conditional tags now if necessary
         if (ref $$tagTablePtr{$tagID} eq 'ARRAY' or $$tagInfo{Condition}) {
             my $writeInfo = $self->GetTagInfo($tagTablePtr, $tagID);
             next unless $writeInfo and $writeInfo eq $tagInfo;
         }
         # add offsets for variable-sized tags if necessary
-        while (@varInfo and $varInfo[0] < $tagID) {
-            shift @varInfo;             # discard index
-            $varSize = shift @varInfo;  # get accumulated variable size
+        my $varFmt;
+        while (@varInfo and $varInfo[0][0] < $tagID) {
+            $varSize = $varInfo[0][1];  # get accumulated variable size
+            shift @varInfo;
         }
         my $count = 1;
         my $format = $$tagInfo{Format};
@@ -5607,9 +5732,11 @@ sub WriteBinaryData($$$)
         } else {
             $format = $defaultFormat;
         }
+        # read/write using variable format if changed in Hook
+        $format = $varInfo[0][2] if @varInfo and $varInfo[0][0] == $tagID;
         my $val = ReadValue($dataPt, $entry, $format, $count, $dirLen-$entry);
         next unless defined $val;
-        my $nvHash = $self->GetNewValueHash($tagInfo);
+        my $nvHash = $self->GetNewValueHash($tagInfo, $$self{CUR_WRITE_GROUP});
         next unless $self->IsOverwriting($nvHash, $val);
         my $newVal = $self->GetNewValues($nvHash);
         next unless defined $newVal;    # can't delete from a binary table
@@ -5630,7 +5757,7 @@ sub WriteBinaryData($$$)
         if (defined $rtnVal) {
             $self->VerboseValue("- $dirName:$$tagInfo{Name}", $val);
             $self->VerboseValue("+ $dirName:$$tagInfo{Name}", $newVal);
-            ++$self->{CHANGED};
+            ++$$self{CHANGED};
         }
     }
     # add necessary fixups for any offsets
@@ -5639,11 +5766,11 @@ sub WriteBinaryData($$$)
         @varInfo = @varOffsets;
         my $fixup = $$dirInfo{Fixup};
         my $tagID;
-        foreach $tagID (@{$tagTablePtr->{IS_OFFSET}}) {
+        foreach $tagID (@{$$tagTablePtr{IS_OFFSET}}) {
             $tagInfo = $self->GetTagInfo($tagTablePtr, $tagID) or next;
-            while (@varInfo and $varInfo[0] < $tagID) {
+            while (@varInfo and $varInfo[0][0] < $tagID) {
+                $varSize = $varInfo[0][1];
                 shift @varInfo;
-                $varSize = shift @varInfo;
             }
             my $entry = $tagID * $increment + $varSize; # (no offset to dirStart for new dir data)
             next unless $entry <= $dirLen - 4;
@@ -5654,15 +5781,15 @@ sub WriteBinaryData($$$)
             next unless $offset;
             $fixup->AddFixup($entry, $$tagInfo{DataTag}, $format);
             # handle the preview image now if this is a JPEG file
-            next unless $self->{FILE_TYPE} eq 'JPEG' and $$tagInfo{DataTag} and
+            next unless $$self{FILE_TYPE} eq 'JPEG' and $$tagInfo{DataTag} and
                 $$tagInfo{DataTag} eq 'PreviewImage' and defined $$tagInfo{OffsetPair};
             # NOTE: here we assume there are no var-sized tags between the
             # OffsetPair tags.  If this ever becomes possible we must recalculate
             # $varSize for the OffsetPair tag here!
             $entry = $$tagInfo{OffsetPair} * $increment + $varSize;
             my $size = ReadValue($dataPt, $entry, $format, 1, $dirLen-$entry);
-            my $previewInfo = $self->{PREVIEW_INFO};
-            $previewInfo or $previewInfo = $self->{PREVIEW_INFO} = {
+            my $previewInfo = $$self{PREVIEW_INFO};
+            $previewInfo or $previewInfo = $$self{PREVIEW_INFO} = {
                 Fixup => new Image::ExifTool::Fixup,
             };
             # set flag indicating we are using short pointers
@@ -5687,9 +5814,9 @@ sub WriteBinaryData($$$)
         foreach $tagID (@{$$tagTablePtr{IS_SUBDIR}}) {
             my $tagInfo = $self->GetTagInfo($tagTablePtr, $tagID);
             next unless defined $tagInfo;
-            while (@varInfo and $varInfo[0] < $tagID) {
+            while (@varInfo and $varInfo[0][0] < $tagID) {
+                $varSize = $varInfo[0][1];
                 shift @varInfo;
-                $varSize = shift @varInfo;
             }
             my $entry = int($tagID) * $increment + $varSize;
             last if $entry >= $dirLen;
@@ -5703,7 +5830,7 @@ sub WriteBinaryData($$$)
             }
             next unless $$tagInfo{SubDirectory}; # (just to be safe)
             my %subdirInfo = ( DataPt => \$newData, DirStart => $entry );
-            my $subTablePtr = GetTagTable($tagInfo->{SubDirectory}{TagTable});
+            my $subTablePtr = GetTagTable($$tagInfo{SubDirectory}{TagTable});
             my $dat = $self->WriteDirectory(\%subdirInfo, $subTablePtr);
             substr($newData, $entry) = $dat if defined $dat and length $dat;
         }
@@ -5743,7 +5870,7 @@ used routines.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -24,6 +24,7 @@
 #               9) http://www.w3.org/TR/SVG11/
 #               10) http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart2.pdf (Oct 2008)
 #               11) http://www.extensis.com/en/support/kb_article.jsp?articleNumber=6102211
+#               12) http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-010-2012_E.pdf
 #
 # Notes:      - Property qualifiers are handled as if they were separate
 #               properties (with no associated namespace).
@@ -46,7 +47,7 @@ use Image::ExifTool qw(:Utils);
 use Image::ExifTool::Exif;
 require Exporter;
 
-$VERSION = '2.64';
+$VERSION = '2.74';
 @ISA = qw(Exporter);
 @EXPORT_OK = qw(EscapeXML UnescapeXML);
 
@@ -55,6 +56,7 @@ sub WriteXMP($$;$);
 sub CheckXMP($$$);
 sub ParseXMPElement($$$;$$$$);
 sub DecodeBase64($);
+sub EncodeBase64($;$);
 sub SaveBlankInfo($$$;$);
 sub ProcessBlankInfo($$$;$);
 sub ValidateXMP($;$);
@@ -62,6 +64,7 @@ sub UnescapeChar($$);
 sub AddFlattenedTags($;$$);
 sub FormatXMPDate($);
 sub ConvertRational($);
+sub ConvertRationalList($);
 
 my %curNS;  # namespaces currently in effect while parsing the file
 
@@ -102,6 +105,7 @@ my %xmpNS = (
     crss      => 'http://ns.adobe.com/camera-raw-saved-settings/1.0/',
     dc        => 'http://purl.org/dc/elements/1.1/',
     exif      => 'http://ns.adobe.com/exif/1.0/',
+    exifEX    => 'http://cipa.jp/exif/1.0/',
     iX        => 'http://ns.adobe.com/iX/1.0/',
     pdf       => 'http://ns.adobe.com/pdf/1.3/',
     pdfx      => 'http://ns.adobe.com/pdfx/1.3/',
@@ -411,6 +415,25 @@ my %sCorrectionMask = (
     ZeroY        => { Writable => 'real', List => 0 },
     FullX        => { Writable => 'real', List => 0 },
     FullY        => { Writable => 'real', List => 0 },
+    # new elements used in CircularGradientBasedCorrections CorrectionMasks
+    # and RetouchAreas Masks
+    Top          => { Writable => 'real', List => 0 },
+    Left         => { Writable => 'real', List => 0 },
+    Bottom       => { Writable => 'real', List => 0 },
+    Right        => { Writable => 'real', List => 0 },
+    Angle        => { Writable => 'real', List => 0 },
+    Midpoint     => { Writable => 'real', List => 0 },
+    Roundness    => { Writable => 'real', List => 0 },
+    Feather      => { Writable => 'real', List => 0 },
+    Flipped      => { Writable => 'boolean', List => 0 },
+    Version      => { Writable => 'integer', List => 0 },
+    SizeX        => { Writable => 'real', List => 0 },
+    SizeY        => { Writable => 'real', List => 0 },
+    X            => { Writable => 'real', List => 0 },
+    Y            => { Writable => 'real', List => 0 },
+    Alpha        => { Writable => 'real', List => 0 },
+    CenterValue  => { Writable => 'real', List => 0 },
+    PerimeterValue=>{ Writable => 'real', List => 0 },
 );
 my %sCorrection = (
     STRUCT_NAME => 'Correction',
@@ -442,6 +465,23 @@ my %sCorrection = (
         List => 'Seq',
     },
 );
+my %sRetouchArea = (
+    STRUCT_NAME => 'RetouchArea',
+    NAMESPACE   => 'crs',
+    SpotType        => { List => 0 },
+    SourceState     => { List => 0 },
+    Method          => { List => 0 },
+    SourceX         => { Writable => 'real',    List => 0 },
+    OffsetY         => { Writable => 'real',    List => 0 },
+    Opacity         => { Writable => 'real',    List => 0 },
+    Feather         => { Writable => 'real',    List => 0 },
+    Seed            => { Writable => 'integer', List => 0 },
+    Masks => {
+        FlatName => 'Mask',
+        Struct => \%sCorrectionMask,
+        List => 'Seq',
+    },
+);
 
 # IPTC Extension 1.0 structures
 my %sLocationDetails = (
@@ -521,6 +561,10 @@ my %sLocationDetails = (
         Name => 'exif',
         SubDirectory => { TagTable => 'Image::ExifTool::XMP::exif' },
     },
+    exifEX => {
+        Name => 'exifEX',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::exifEX' },
+    },
     iptcCore => {
         Name => 'iptcCore',
         SubDirectory => { TagTable => 'Image::ExifTool::XMP::iptcCore' },
@@ -798,8 +842,8 @@ my %sLocationDetails = (
 
 # XMP xmpMM ManifestItem struct (ref PH, written by Adobe PDF library 8.0)
 my %sManifestItem = (
-    NAMESPACE => 'stMfs',
     STRUCT_NAME => 'ManifestItem',
+    NAMESPACE   => 'stMfs',
     linkForm            => { },
     placedXResolution   => { Namespace => 'xmpMM', Writable => 'real' },
     placedYResolution   => { Namespace => 'xmpMM', Writable => 'real' },
@@ -809,8 +853,8 @@ my %sManifestItem = (
 
 # the xmpMM Pantry
 my %sPantryItem = (
-    NAMESPACE => undef, # stores any top-level XMP tags
     STRUCT_NAME => 'PantryItem',
+    NAMESPACE   => undef, # stores any top-level XMP tags
     NOTES => q{
         This structure must have an InstanceID field, but may also contain any other
         XMP properties.
@@ -961,11 +1005,11 @@ my %sPantryItem = (
     DateCreated     => { Groups => { 2 => 'Time' }, %dateTimeInfo },
     DocumentAncestors => {
         FlatName => 'Document',
-        List => 'bag',
+        List => 'Bag',
         Struct => {
             STRUCT_NAME => 'Ancestor',
             NAMESPACE   => 'photoshop',
-            AncestorID => { },
+            AncestorID  => { },
         },
     },
     Headline        => { },
@@ -983,11 +1027,11 @@ my %sPantryItem = (
     SupplementalCategories  => { List => 'Bag' },
     TextLayers => {
         FlatName => 'Text',
-        List => 'seq',
+        List => 'Seq',
         Struct => {
             STRUCT_NAME => 'Layer',
             NAMESPACE   => 'photoshop',
-            LayerName => { },
+            LayerName   => { },
             LayerText => { },
         },
     },
@@ -1008,6 +1052,7 @@ my %sPantryItem = (
             9 => '9 (user-defined priority)', # (not standard XMP)
         },
     },
+    EmbeddedXMPDigest => { },   #PH (LR5)
 );
 
 # Photoshop Camera Raw namespace properties (crs) - (ref 8,PH)
@@ -1016,7 +1061,10 @@ my %sPantryItem = (
     GROUPS => { 1 => 'XMP-crs', 2 => 'Image' },
     NAMESPACE   => 'crs',
     TABLE_DESC => 'Photoshop Camera Raw namespace',
-    NOTES => 'Photoshop Camera Raw namespace tags.',
+    NOTES => q{
+        Photoshop Camera Raw namespace tags.  It is a shame that Adobe pollutes the
+        metadata space with these incredibly bulky image editing parameters.
+    },
     AlreadyApplied  => { Writable => 'boolean' }, #PH (written by LightRoom beta 4.1)
     AutoBrightness  => { Writable => 'boolean' },
     AutoContrast    => { Writable => 'boolean' },
@@ -1241,6 +1289,53 @@ my %sPantryItem = (
     DefringeGreenAmount                  => { Writable => 'integer' },
     DefringeGreenHueLo                   => { Writable => 'integer' },
     DefringeGreenHueHi                   => { Writable => 'integer' },
+    # new tags written by LR5
+    AutoWhiteVersion                     => { Writable => 'integer' },
+    CircularGradientBasedCorrections => {
+        FlatName => 'CircGradBasedCorr',
+        Struct => \%sCorrection,
+        List => 'Seq',
+    },
+    CircularGradientBasedCorrectionsCorrectionMasks => {
+        Name => 'CircGradBasedCorrMasks',
+        FlatName => 'CircGradBasedCorrMask',
+        Flat => 1
+    },
+    CircularGradientBasedCorrectionsCorrectionMasksDabs => {
+        Name => 'CircGradBasedCorrMaskDabs',
+        Flat => 1, List => 0,
+    },
+    ColorNoiseReductionSmoothness        => { Writable => 'integer' },
+    PerspectiveAspect                    => { Writable => 'integer' },
+    PerspectiveUpright                   => { Writable => 'integer' },
+    RetouchAreas => {
+        FlatName => 'RetouchArea',
+        Struct => \%sRetouchArea,
+        List => 'Seq',
+    },
+    RetouchAreasMasks => {
+        Name => 'RetouchAreaMasks',
+        FlatName => 'RetouchAreaMask',
+        Flat => 1
+    },
+    RetouchAreasMasksDabs => {
+        Name => 'RetouchAreaMaskDabs',
+        Flat => 1, List => 0,
+    },
+    UprightVersion                       => { Writable => 'integer' },
+    UprightCenterMode                    => { Writable => 'integer' },
+    UprightCenterNormX                   => { Writable => 'real' },
+    UprightCenterNormY                   => { Writable => 'real' },
+    UprightFocalMode                     => { Writable => 'integer' },
+    UprightFocalLength35mm               => { Writable => 'real' },
+    UprightPreview                       => { Writable => 'boolean' },
+    UprightTransformCount                => { Writable => 'integer' },
+    UprightDependentDigest               => { },
+    UprightTransform_0                   => { },
+    UprightTransform_1                   => { },
+    UprightTransform_2                   => { },
+    UprightTransform_3                   => { },
+    UprightTransform_4                   => { },
 );
 
 # Tiff namespace properties (tiff)
@@ -1250,7 +1345,11 @@ my %sPantryItem = (
     NAMESPACE   => 'tiff',
     PRIORITY => 0, # not as reliable as actual TIFF tags
     TABLE_DESC => 'XMP TIFF',
-    NOTES => 'EXIF namespace for TIFF tags.',
+    NOTES => q{
+        EXIF namespace for TIFF tags.  See
+        L<http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-010-2012_E.pdf> for the
+        specification.
+    },
     ImageWidth    => { Writable => 'integer' },
     ImageLength   => { Writable => 'integer', Name => 'ImageHeight' },
     BitsPerSample => { Writable => 'integer', List => 'Seq', AutoSplit => 1 },
@@ -1282,7 +1381,7 @@ my %sPantryItem = (
         # the combined string as it does for the corresponding EXIF tag
         RawJoin => 1,
         Notes => q{
-            while technically this is  a list-type tag, for compatibility with its EXIF
+            while technically this is a list-type tag, for compatibility with its EXIF
             counterpart it is written and read as a simple string
         },
         PrintConv => \%Image::ExifTool::JPEG::yCbCrSubSampling,
@@ -1337,7 +1436,11 @@ my %sPantryItem = (
     GROUPS => { 1 => 'XMP-exif', 2 => 'Image' },
     NAMESPACE   => 'exif',
     PRIORITY => 0, # not as reliable as actual EXIF tags
-    NOTES => 'EXIF namespace for EXIF tags.',
+    NOTES => q{
+        EXIF namespace for EXIF tags.  See
+        L<http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-010-2012_E.pdf> for the
+        specification.
+    },
     ExifVersion     => { },
     FlashpixVersion => { },
     ColorSpace => {
@@ -1771,30 +1874,115 @@ my %sPantryItem = (
             1 => 'Differential Corrected',
         },
     },
+    GPSHPositioningError => { #12
+        Description => 'GPS Horizontal Positioning Error',
+        Groups => { 2 => 'Location' },
+        Writable => 'rational',
+        PrintConv => '"$val m"',
+        PrintConvInv => '$val=~s/\s*m$//; $val',
+    },
     NativeDigest => { }, #PH
 );
 
+# Exif extended properties (exifEX, ref 12)
+%Image::ExifTool::XMP::exifEX = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-exifEX', 2 => 'Image' },
+    NAMESPACE   => 'exifEX',
+    PRIORITY => 0, # not as reliable as actual EXIF tags
+    NOTES => q{
+        EXIF tags added by the EXIF 2.3 for XMP specification (see
+        L<http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-010-2012_E.pdf>).
+    },
+    Gamma                       => { Writable => 'rational' },
+    PhotographicSensitivity     => { Writable => 'integer' },
+    SensitivityType => {
+        Writable => 'integer',
+        PrintConv => {
+            0 => 'Unknown',
+            1 => 'Standard Output Sensitivity',
+            2 => 'Recommended Exposure Index',
+            3 => 'ISO Speed',
+            4 => 'Standard Output Sensitivity and Recommended Exposure Index',
+            5 => 'Standard Output Sensitivity and ISO Speed',
+            6 => 'Recommended Exposure Index and ISO Speed',
+            7 => 'Standard Output Sensitivity, Recommended Exposure Index and ISO Speed',
+        },
+    },
+    StandardOutputSensitivity   => { Writable => 'integer' },
+    RecommendedExposureIndex    => { Writable => 'integer' },
+    ISOSpeed                    => { Writable => 'integer' },
+    ISOSpeedLatitudeyyy => {
+        Description => 'ISO Speed Latitude yyy',
+        Writable => 'integer',
+    },
+    ISOSpeedLatitudezzz => {
+        Description => 'ISO Speed Latitude zzz',
+        Writable => 'integer',
+    },
+    CameraOwnerName     => { Name => 'OwnerName' },
+    BodySerialNumber    => { Name => 'SerialNumber' },
+    LensSpecification => {
+        Name => 'LensInfo',
+        Writable => 'rational',
+        List => 'Seq',
+        RawJoin => 1, # join list into a string before ValueConv
+        ValueConv => \&ConvertRationalList,
+        ValueConvInv => sub {
+            my $val = shift;
+            my @vals = split ' ', $val;
+            return $val unless @vals == 4;
+            foreach (@vals) {
+                $_ eq 'inf' and $_ = '1/0', next;
+                $_ eq 'undef' and $_ = '0/0', next;
+                Image::ExifTool::IsFloat($_) or return $val;
+                my @a = Image::ExifTool::Rationalize($_);
+                $_ = join '/', @a;
+            }
+            return \@vals; # return list reference (List-type tag)
+        },
+        PrintConv => \&Image::ExifTool::Exif::PrintLensInfo,
+        PrintConvInv => \&Image::ExifTool::Exif::ConvertLensInfo,
+        Notes => q{
+            called LensSpecification by the spec.  Unfortunately the EXIF 2.3 for XMP
+            specification defined this new tag instead of using the existing
+            XMP-aux:LensInfo
+        },
+    },
+    LensMake            => { },
+    LensModel           => { },
+    LensSerialNumber    => { },
+    InteroperabilityIndex => {
+        Name => 'InteropIndex',
+        Description => 'Interoperability Index',
+        PrintConv => {
+            R98 => 'R98 - DCF basic file (sRGB)',
+            R03 => 'R03 - DCF option file (Adobe RGB)',
+            THM => 'THM - DCF thumbnail file',
+        },
+    },
+);
+
 # Auxiliary namespace properties (aux) - not fully documented (ref PH)
 %Image::ExifTool::XMP::aux = (
     %xmpTableDefaults,
     GROUPS => { 1 => 'XMP-aux', 2 => 'Camera' },
     NAMESPACE   => 'aux',
-    NOTES => 'Photoshop Auxiliary namespace tags.',
+    NOTES => q{
+        Adobe-defined auxiliary EXIF tags.  This namespace existed in the XMP
+        specification until it was dropped in 2012, presumably due to the
+        introduction of the EXIF 2.3 for XMP specification and the exifEX namespace
+        at this time.  For this reason, tags below with equivalents in the
+        L<exifEX namespace|/XMP exifEX Tags> are avoided when writing.
+    },
     Firmware        => { }, #7
     FlashCompensation => { Writable => 'rational' }, #7
     ImageNumber     => { }, #7
     LensInfo        => { #7
         Notes => '4 rational values giving focal and aperture ranges',
+        Avoid => 1,
         # convert to floating point values (or 'inf' or 'undef')
-        ValueConv => sub {
-            my $val = shift;
-            my @vals = split ' ', $val;
-            return $val unless @vals == 4;
-            foreach (@vals) {
-                ConvertRational($_) or return $val;
-            }
-            return join ' ', @vals;
-        },
+        ValueConv => \&ConvertRationalList,
         ValueConvInv => sub {
             my $val = shift;
             my @vals = split ' ', $val;
@@ -1806,15 +1994,16 @@ my %sPantryItem = (
                 my @a = Image::ExifTool::Rationalize($_);
                 $_ = join '/', @a;
             }
-            return join ' ', @vals;
+            return join ' ', @vals; # return string (string tag)
         },
         # convert to the form "12-20mm f/3.8-4.5" or "50mm f/1.4"
         PrintConv => \&Image::ExifTool::Exif::PrintLensInfo,
         PrintConvInv => \&Image::ExifTool::Exif::ConvertLensInfo,
     },
     Lens            => { },
-    OwnerName       => { }, #7
-    SerialNumber    => { },
+    OwnerName       => { Avoid => 1 }, #7
+    SerialNumber    => { Avoid => 1 },
+    LensSerialNumber=> { Avoid => 1 },
     LensID          => {
         Priority => 0,
         # prevent this from getting set from a LensID that has been converted
@@ -1979,7 +2168,7 @@ my %sPantryItem = (
         Require => 'XMP:GPSLatitude',
         ValueConv => q{
             IsFloat($val[0]) and return $val[0] < 0 ? "S" : "N";
-            $val[0] =~ /.*([NS])/;
+            $val[0] =~ /^.*([NS])/;
             return $1;
         },
         PrintConv => {
@@ -1991,7 +2180,7 @@ my %sPantryItem = (
         Require => 'XMP:GPSLongitude',
         ValueConv => q{
             IsFloat($val[0]) and return $val[0] < 0 ? "W" : "E";
-            $val[0] =~ /.*([EW])/;
+            $val[0] =~ /^.*([EW])/;
             return $1;
         },
         PrintConv => {
@@ -2148,6 +2337,7 @@ sub UnescapeChar($$)
 # Returns: 0=regular ASCII, -1=invalid UTF-8, 1=valid UTF-8 with maximum 16-bit
 #          wide characters, 2=valid UTF-8 requiring 32-bit wide characters
 # Notes: Changes current string position
+# (see http://www.fileformat.info/info/unicode/utf8.htm for help understanding this)
 sub IsUTF8($)
 {
     my $strPt = shift;
@@ -2269,10 +2459,10 @@ sub GetXMPTagID($;$$)
                 my $xlatNS = $$xlatNamespace{$ns} || $ns;
                 my $info = $Image::ExifTool::XMP::Main{$xlatNS};
                 my $table;
-                if (ref $info eq 'HASH' and $info->{SubDirectory}) {
-                    $table = GetTagTable($info->{SubDirectory}{TagTable});
+                if (ref $info eq 'HASH' and $$info{SubDirectory}) {
+                    $table = GetTagTable($$info{SubDirectory}{TagTable});
                 }
-                unless ($table and $table->{$nm}) {
+                unless ($table and $$table{$nm}) {
                     $nm = lc($nm);
                     $nm =~ s/_([a-z])/\u$1/g;
                 }
@@ -2475,11 +2665,11 @@ sub StandardLangCase($)
 # Notes: Currently only recognizes UTF8-encoded XMP
 sub ScanForXMP($$)
 {
-    my ($exifTool, $raf) = @_;
+    my ($et, $raf) = @_;
     my ($buff, $xmp);
     my $lastBuff = '';
 
-    $exifTool->VPrint(0,"Scanning for XMP\n");
+    $et->VPrint(0,"Scanning for XMP\n");
     for (;;) {
         defined $buff or $raf->Read($buff, 65536) or return 0;
         unless (defined $xmp) {
@@ -2507,16 +2697,16 @@ sub ScanForXMP($$)
             undef $buff;
         }
     }
-    unless ($exifTool->{VALUE}{FileType}) {
-        $exifTool->{FILE_TYPE} = $exifTool->{FILE_EXT};
-        $exifTool->SetFileType('<unknown file containing XMP>');
+    unless ($$et{VALUE}{FileType}) {
+        $$et{FILE_TYPE} = $$et{FILE_EXT};
+        $et->SetFileType('<unknown file containing XMP>');
     }
     my %dirInfo = (
         DataPt => \$xmp,
         DirLen => length $xmp,
         DataLen => length $xmp,
     );
-    ProcessXMP($exifTool, \%dirInfo);
+    ProcessXMP($et, \%dirInfo);
     return 1;
 }
 
@@ -2527,11 +2717,12 @@ sub ScanForXMP($$)
 sub PrintLensID(@)
 {
     local $_;
-    my ($exifTool, $id, $make, $info, $focalLength, $lensModel) = @_;
+    my ($et, $id, $make, $info, $focalLength, $lensModel) = @_;
     my ($mk, $printConv);
+    my %alt = ( Pentax => 'Ricoh' );    # Pentax changed its name to Ricoh
     # missing: Olympus (no XMP:LensID written by Adobe)
     foreach $mk (qw(Canon Nikon Pentax Sony Sigma Samsung Leica)) {
-        next unless $make =~ /$mk/i;
+        next unless $make =~ /$mk/i or ($alt{$mk} and $make =~ /$alt{$mk}/i);
         # get name of module containing the lens lookup (default "Make.pm")
         my $mod = { Sigma => 'SigmaRaw', Leica => 'Panasonic' }->{$mk} || $mk;
         require "Image/ExifTool/$mod.pm";
@@ -2565,9 +2756,8 @@ sub PrintLensID(@)
             }
             $printConv = \%newConv;
         }
-        return Image::ExifTool::Exif::PrintLensID($exifTool, $str, undef, $id,
-                    $focalLength, $maxa, undef, $minf, $maxf, $lensModel, undef,
-                    undef, $printConv);
+        return Image::ExifTool::Exif::PrintLensID($et, $str, $printConv,
+                    undef, $id, $focalLength, $maxa, undef, $minf, $maxf, $lensModel);
     }
     return "Unknown ($id)";
 }
@@ -2607,6 +2797,21 @@ sub ConvertRational($)
 }
 
 #------------------------------------------------------------------------------
+# Convert a string of floating point values to rationals
+# Inputs: 0) string of floating point numbers separated by spaces
+# Returns: string of rational numbers separated by spaces
+sub ConvertRationalList($)
+{
+    my $val = shift;
+    my @vals = split ' ', $val;
+    return $val unless @vals == 4;
+    foreach (@vals) {
+        ConvertRational($_) or return $val;
+    }
+    return join ' ', @vals;
+}
+
+#------------------------------------------------------------------------------
 # We found an XMP property name/value
 # Inputs: 0) ExifTool object ref, 1) Pointer to tag table
 #         2) reference to array of XMP property names (last is current property)
@@ -2615,17 +2820,17 @@ sub ConvertRational($)
 sub FoundXMP($$$$;$)
 {
     local $_;
-    my ($exifTool, $tagTablePtr, $props, $val, $attrs) = @_;
+    my ($et, $tagTablePtr, $props, $val, $attrs) = @_;
     my ($lang, @structProps, $rawVal, $rational);
-    my ($tag, $ns) = GetXMPTagID($props, $exifTool->{OPTIONS}{Struct} ? \@structProps : undef);
+    my ($tag, $ns) = GetXMPTagID($props, $$et{OPTIONS}{Struct} ? \@structProps : undef);
     return 0 unless $tag;   # ignore things that aren't valid tags
 
     # translate namespace if necessary
     $ns = $$xlatNamespace{$ns} if $$xlatNamespace{$ns};
-    my $info = $tagTablePtr->{$ns};
+    my $info = $$tagTablePtr{$ns};
     my ($table, $added, $xns, $tagID);
     if ($info) {
-        $table = $info->{SubDirectory}{TagTable} or warn "Missing TagTable for $tag!\n";
+        $table = $$info{SubDirectory}{TagTable} or warn "Missing TagTable for $tag!\n";
     } elsif ($$props[0] eq 'svg:svg') {
         if (not $ns) {
             # disambiguate MetadataID by adding back the 'metadata' we ignored
@@ -2638,19 +2843,24 @@ sub FoundXMP($$$$;$)
         }
     }
 
-    # look up this tag in the appropriate table
-    $table or $table = 'Image::ExifTool::XMP::other';
-    $tagTablePtr = GetTagTable($table);
-    if ($$tagTablePtr{NAMESPACE}) {
+    if (not $ns and $$tagTablePtr{GROUPS}{0} ne 'XMP') {
+        # this is a simple XML table (no namespaces)
         $tagID = $tag;
     } else {
-        # add XMP namespace prefix to avoid collisions in variable-namespace tables
-        $xns = $xmpNS{$ns} || $ns;
-        $tagID = "$xns:$tag";
-        # add namespace to top-level structure property
-        $structProps[0][0] = "$xns:" . $structProps[0][0] if @structProps;
+        # look up this tag in the appropriate table
+        $table or $table = 'Image::ExifTool::XMP::other';
+        $tagTablePtr = GetTagTable($table);
+        if ($$tagTablePtr{NAMESPACE}) {
+            $tagID = $tag;
+        } else {
+            # add XMP namespace prefix to avoid collisions in variable-namespace tables
+            $xns = $xmpNS{$ns} || $ns;
+            $tagID = "$xns:$tag";
+            # add namespace to top-level structure property
+            $structProps[0][0] = "$xns:" . $structProps[0][0] if @structProps;
+        }
     }
-    my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID);
+    my $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID);
 
     $lang = $$attrs{'xml:lang'} if $attrs;
 
@@ -2718,7 +2928,7 @@ NoLoop:
                 my $tg = $Image::ExifTool::XMP::Main{$n};
                 last unless ref $tg eq 'HASH' and $$tg{SubDirectory};
                 my $tbl = GetTagTable($$tg{SubDirectory}{TagTable}) or last;
-                my $sti = $exifTool->GetTagInfo($tbl, $t2);
+                my $sti = $et->GetTagInfo($tbl, $t2);
                 if (not $sti or $$sti{Flat}) {
                     # again, we must initialize flattened tags if necessary
                     # (but don't bother to recursively apply full logic to
@@ -2815,10 +3025,10 @@ NoLoop:
         $val = UnescapeXML($val);
     }
     # decode from UTF8
-    $val = $exifTool->Decode($val, 'UTF8');
+    $val = $et->Decode($val, 'UTF8');
     # convert rational and date values to a more sensible format
     my $fmt = $$tagInfo{Writable};
-    my $new = $$tagInfo{WasAdded} && $$exifTool{OPTIONS}{XMPAutoConv};
+    my $new = $$tagInfo{WasAdded} && $$et{OPTIONS}{XMPAutoConv};
     if ($fmt or $new) {
         $rawVal = $val; # save raw value for verbose output
         if (($new or $fmt eq 'rational') and ConvertRational($val)) {
@@ -2830,25 +3040,27 @@ NoLoop:
         $$tagInfo{Binary} = 1 if $new and length($val) > 65536;
     }
     # store the value for this tag
-    my $key = $exifTool->FoundTag($tagInfo, $val) or return 0;
+    my $key = $et->FoundTag($tagInfo, $val) or return 0;
     # save original components of rational numbers (used when copying)
-    $$exifTool{RATIONAL}{$key} = $rational if defined $rational;
+    $$et{RATIONAL}{$key} = $rational if defined $rational;
     # save structure/list information if necessary
-    if (@structProps and (@structProps > 1 or defined $structProps[0][1])) {
-        $exifTool->{TAG_EXTRA}{$key}{Struct} = \@structProps;
-        $exifTool->{IsStruct} = 1;
+    if (@structProps and (@structProps > 1 or defined $structProps[0][1]) and
+        not $$et{NO_STRUCT})
+    {
+        $$et{TAG_EXTRA}{$key}{Struct} = \@structProps;
+        $$et{IsStruct} = 1;
     }
     if ($ns and not $$tagInfo{StaticGroup1}) {
         # set group1 dynamically according to the namespace
-        $exifTool->SetGroup($key, "$tagTablePtr->{GROUPS}{0}-$ns");
+        $et->SetGroup($key, "$$tagTablePtr{GROUPS}{0}-$ns");
     }
-    if ($exifTool->{OPTIONS}{Verbose}) {
+    if ($$et{OPTIONS}{Verbose}) {
         if ($added) {
-            my $g1 = $exifTool->GetGroup($key, 1);
-            $exifTool->VPrint(0, $exifTool->{INDENT}, "[adding $g1:$tag]\n");
+            my $g1 = $et->GetGroup($key, 1);
+            $et->VPrint(0, $$et{INDENT}, "[adding $g1:$tag]\n");
         }
         my $tagID = join('/',@$props);
-        $exifTool->VerboseInfo($tagID, $tagInfo, Value => $rawVal || $val);
+        $et->VerboseInfo($tagID, $tagInfo, Value => $rawVal || $val);
     }
     return 1;
 }
@@ -2862,16 +3074,16 @@ NoLoop:
 # Returns: Number of contained XMP elements
 sub ParseXMPElement($$$;$$$$)
 {
-    my ($exifTool, $tagTablePtr, $dataPt, $start, $end, $propListPt, $blankInfo) = @_;
+    my ($et, $tagTablePtr, $dataPt, $start, $end, $propListPt, $blankInfo) = @_;
     my ($count, $nItems) = (0, 0);
-    my $isWriting = $exifTool->{XMP_CAPTURE};
-    my $isSVG = $$exifTool{XMP_IS_SVG};
+    my $isWriting = $$et{XMP_CAPTURE};
+    my $isSVG = $$et{XMP_IS_SVG};
 
     # get our parse procs
     my ($attrProc, $foundProc);
-    if ($$exifTool{XMPParseOpts}) {
-        $attrProc = $$exifTool{XMPParseOpts}{AttrProc};
-        $foundProc = $$exifTool{XMPParseOpts}{FoundProc} || \&FoundXMP;
+    if ($$et{XMPParseOpts}) {
+        $attrProc = $$et{XMPParseOpts}{AttrProc};
+        $foundProc = $$et{XMPParseOpts}{FoundProc} || \&FoundXMP;
     } else {
         $foundProc = \&FoundXMP;
     }
@@ -2915,7 +3127,7 @@ sub ParseXMPElement($$$;$$$$)
                 if ($$dataPt !~ m{<(/?)$prop([-\w:.\x80-\xff]*)(.*?(/?))>}sg or
                     pos($$dataPt) > $end)
                 {
-                    $exifTool->Warn("XMP format error (no closing tag for $prop)");
+                    $et->Warn("XMP format error (no closing tag for $prop)");
                     last Element;
                 }
                 next if $2; # ignore opening properties with different names
@@ -2933,6 +3145,16 @@ sub ParseXMPElement($$$;$$$$)
         $start = pos($$dataPt);         # start from here the next time around
         my $parseResource;
         if ($prop eq 'rdf:li') {
+            # impose a reasonable maximum on the number of items in a list
+            if ($nItems == 1000) {
+                my ($tg,$ns) = GetXMPTagID($propListPt);
+                if ($isWriting) {
+                    $et->Warn("Excessive number of items for $ns:$tg. Processing may be slow.", 1);
+                } elsif (not $$et{OPTIONS}{IgnoreMinorErrors}) {
+                    $et->Warn("Excessive number of items for $ns:$tg. Extracted only the first 1000.", 2);
+                    last;
+                }
+            }
             # add index to list items so we can keep them in order
             # (this also enables us to keep structure elements grouped properly
             # for lists of structures, like JobRef)
@@ -2945,7 +3167,7 @@ sub ParseXMPElement($$$;$$$$)
             # reset LIST_TAGS at the start of the outtermost list
             # (avoids accumulating incorrectly-written elements in a correctly-written list)
             if (not $nItems and not grep /^rdf:li /, @$propListPt) {
-                $$exifTool{LIST_TAGS} = { };
+                $$et{LIST_TAGS} = { };
             }
             ++$nItems;
         } elsif ($prop eq 'rdf:Description') {
@@ -2986,7 +3208,7 @@ sub ParseXMPElement($$$;$$$$)
 
         if ($isSVG) {
             # ignore everything but top level SVG tags and metadata unless Unknown set
-            unless ($exifTool->{OPTIONS}{Unknown} > 1 or $exifTool->{OPTIONS}{Verbose}) {
+            unless ($$et{OPTIONS}{Unknown} > 1 or $$et{OPTIONS}{Verbose}) {
                 if (@$propListPt > 1 and $$propListPt[1] !~ /\b(metadata|desc|title)$/) {
                     pop @$propListPt;
                     next;
@@ -3021,7 +3243,7 @@ sub ParseXMPElement($$$;$$$$)
             # keep track of the namespace prefixes used
             if ($ns eq 'xmlns') {
                 unless ($attrs{$shortName}) {
-                    $exifTool->WarnOnce("Duplicate namespace '$shortName'");
+                    $et->WarnOnce("Duplicate namespace '$shortName'");
                     next;
                 }
                 $curNS{$name} = $attrs{$shortName};
@@ -3039,7 +3261,7 @@ sub ParseXMPElement($$$;$$$$)
                 if ($ns eq 'xmlns') {
                     my $stdNS = $uri2ns{$attrs{$shortName}};
                     unless ($stdNS and ($stdNS eq 'x' or $stdNS eq 'iX')) {
-                        my $nsUsed = $exifTool->{XMP_NS};
+                        my $nsUsed = $$et{XMP_NS};
                         $$nsUsed{$name} = $attrs{$shortName} unless defined $$nsUsed{$name};
                     }
                     delete $attrs{$shortName};  # (handled by namespace logic)
@@ -3047,10 +3269,10 @@ sub ParseXMPElement($$$;$$$$)
                 } elsif ($recognizedAttrs{$propName}) {
                     # save UUID to use same ID when writing
                     if ($propName eq 'rdf:about') {
-                        if (not $exifTool->{XMP_ABOUT}) {
-                            $exifTool->{XMP_ABOUT} = $attrs{$shortName};
-                        } elsif ($exifTool->{XMP_ABOUT} ne $attrs{$shortName}) {
-                            $exifTool->Error("Different 'rdf:about' attributes not handled", 1);
+                        if (not $$et{XMP_ABOUT}) {
+                            $$et{XMP_ABOUT} = $attrs{$shortName};
+                        } elsif ($$et{XMP_ABOUT} ne $attrs{$shortName}) {
+                            $et->Error("Different 'rdf:about' attributes not handled", 1);
                         }
                     }
                     next;
@@ -3063,8 +3285,8 @@ sub ParseXMPElement($$$;$$$$)
                 if (ref $recognizedAttrs{$propName} and $shortVal) {
                     my ($tbl, $id, $name) = @{$recognizedAttrs{$propName}};
                     my $tval = UnescapeXML($shortVal);
-                    unless (defined $$exifTool{VALUE}{$name} and $$exifTool{VALUE}{$name} eq $tval) {
-                        $exifTool->HandleTag(GetTagTable($tbl), $id, $tval);
+                    unless (defined $$et{VALUE}{$name} and $$et{VALUE}{$name} eq $tval) {
+                        $et->HandleTag(GetTagTable($tbl), $id, $tval);
                     }
                 }
                 next;
@@ -3075,20 +3297,20 @@ sub ParseXMPElement($$$;$$$$)
             if (defined $nodeID) {
                 SaveBlankInfo($blankInfo, $propListPt, $shortVal);
             } elsif ($isWriting) {
-                CaptureXMP($exifTool, $propListPt, $shortVal);
+                CaptureXMP($et, $propListPt, $shortVal);
             } else {
-                &$foundProc($exifTool, $tagTablePtr, $propListPt, $shortVal);
+                &$foundProc($et, $tagTablePtr, $propListPt, $shortVal);
             }
             pop @$propListPt;
             $shorthand = 1;
         }
         if ($isWriting) {
-            if (ParseXMPElement($exifTool, $tagTablePtr, $dataPt, $valStart, $valEnd,
+            if (ParseXMPElement($et, $tagTablePtr, $dataPt, $valStart, $valEnd,
                                 $propListPt, $blankInfo))
             {
                 # (no value since we found more properties within this one)
                 # set an error on any ignored attributes here, because they will be lost
-                $exifTool->{XMP_ERROR} = "Can't handle XMP attribute '$ignored'" if $ignored;
+                $$et{XMP_ERROR} = "Can't handle XMP attribute '$ignored'" if $ignored;
             } elsif (not $shorthand or $valEnd != $valStart) {
                 $val = substr($$dataPt, $valStart, $valEnd - $valStart);
                 # remove comments and whitespace from rdf:Description only
@@ -3098,13 +3320,13 @@ sub ParseXMPElement($$$;$$$$)
                 if (defined $nodeID) {
                     SaveBlankInfo($blankInfo, $propListPt, $val, \%attrs);
                 } else {
-                    CaptureXMP($exifTool, $propListPt, $val, \%attrs);
+                    CaptureXMP($et, $propListPt, $val, \%attrs);
                 }
             }
         } else {
             # look for additional elements contained within this one
             if ($valStart == $valEnd or
-                !ParseXMPElement($exifTool, $tagTablePtr, $dataPt, $valStart, $valEnd,
+                !ParseXMPElement($et, $tagTablePtr, $dataPt, $valStart, $valEnd,
                                  $propListPt, $blankInfo))
             {
                 my $wasEmpty;
@@ -3135,7 +3357,7 @@ sub ParseXMPElement($$$;$$$$)
                         # ignore et:desc, and et:val if preceded by et:prt
                         --$count;
                     } else {
-                        &$foundProc($exifTool, $tagTablePtr, $propListPt, $val, \%attrs);
+                        &$foundProc($et, $tagTablePtr, $propListPt, $val, \%attrs);
                     }
                 }
             }
@@ -3150,7 +3372,7 @@ sub ParseXMPElement($$$;$$$$)
 # process resources referenced by blank nodeID's
 #
     if ($processBlankInfo and %{$$blankInfo{Prop}}) {
-        ProcessBlankInfo($exifTool, $tagTablePtr, $blankInfo, $isWriting);
+        ProcessBlankInfo($et, $tagTablePtr, $blankInfo, $isWriting);
         %$blankInfo = ();   # free some memory
     }
     return $count;  # return the number of elements found at this level
@@ -3172,7 +3394,7 @@ sub ParseXMPElement($$$;$$$$)
 # - otherwise valid files with leading XML comment
 sub ProcessXMP($$;$)
 {
-    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($et, $dirInfo, $tagTablePtr) = @_;
     my $dataPt = $$dirInfo{DataPt};
     my ($dirStart, $dirLen, $dataLen, $double);
     my ($buff, $fmt, $hasXMP, $isXML, $isRDF, $isSVG);
@@ -3181,12 +3403,12 @@ sub ProcessXMP($$;$)
     undef %curNS;
 
     # ignore non-standard XMP while in strict MWG compatibility mode
-    if ($Image::ExifTool::MWG::strict and not $$exifTool{XMP_CAPTURE} and
-        $$exifTool{FILE_TYPE} =~ /^(JPEG|TIFF|PSD)$/)
+    if ($Image::ExifTool::MWG::strict and not $$et{XMP_CAPTURE} and
+        $$et{FILE_TYPE} =~ /^(JPEG|TIFF|PSD)$/)
     {
-        my $path = $exifTool->MetadataPath();
+        my $path = $et->MetadataPath();
         unless ($path =~ /^(JPEG-APP1-XMP|TIFF-IFD0-XMP|PSD-XMP)$/) {
-            $exifTool->Warn("Ignored non-standard XMP at $path");
+            $et->Warn("Ignored non-standard XMP at $path");
             return 1;
         }
     }
@@ -3238,8 +3460,8 @@ sub ProcessXMP($$;$)
             $bom = 1 if $1;
             if ($2 eq '<?xml') {
                 if (defined $fmt and not $fmt and $buf2 =~ /^[^\n\r]*[\n\r]+<\?aid /s) {
-                    if ($exifTool->{XMP_CAPTURE}) {
-                        $exifTool->Error("ExifTool does not yet support writing of INX files");
+                    if ($$et{XMP_CAPTURE}) {
+                        $et->Error("ExifTool does not yet support writing of INX files");
                         return 0;
                     }
                     $type = 'INX';
@@ -3262,8 +3484,8 @@ sub ProcessXMP($$;$)
                     } elsif ($buf2 =~ /<plist[\s>]/) {
                         $type = 'PLIST';
                     }
-                    if ($isSVG and $exifTool->{XMP_CAPTURE}) {
-                        $exifTool->Error("ExifTool does not yet support writing of SVG images");
+                    if ($isSVG and $$et{XMP_CAPTURE}) {
+                        $et->Error("ExifTool does not yet support writing of SVG images");
                         return 0;
                     }
                 }
@@ -3286,7 +3508,7 @@ sub ProcessXMP($$;$)
         my $size;
         if ($type) {
             if ($type eq 'PLIST') {
-                my $ext = $$exifTool{FILE_EXT};
+                my $ext = $$et{FILE_EXT};
                 $type = $ext if $ext and $ext eq 'MODD';
                 $tagTablePtr = GetTagTable('Image::ExifTool::PLIST::Main');
                 $$dirInfo{XMPParseOpts}{FoundProc} = \&Image::ExifTool::PLIST::FoundTag;
@@ -3298,7 +3520,7 @@ sub ProcessXMP($$;$)
                 $type = 'XML';
             }
         }
-        $exifTool->SetFileType($type);
+        $et->SetFileType($type);
 
         if ($type and $type eq 'INX') {
             # brute force search for first XMP packet in INX file
@@ -3315,7 +3537,7 @@ sub ProcessXMP($$;$)
             for (;;) {
                 last if $buff =~ /<\?xpacket end="[rw]"\?>\]\]>/g;
                 my $n = length $buff;
-                $raf->Read($buf2, 65536) or $exifTool->Warn('Missing xpacket end'), return 1;
+                $raf->Read($buf2, 65536) or $et->Warn('Missing xpacket end'), return 1;
                 $buff .= $buf2;
                 pos($buff) = $n - 22;   # don't miss end pattern if it was split
             }
@@ -3354,10 +3576,10 @@ sub ProcessXMP($$;$)
             $buf2 = pack('C*', unpack("$fmt*",$buff));
         }
         if (Image::ExifTool::GetWarning()) {
-            $exifTool->Warn('Superfluous BOM at start of XMP');
+            $et->Warn('Superfluous BOM at start of XMP');
             $dataPt = \$buff;   # use XMP with the BOM removed
         } else {
-            $exifTool->Warn('XMP is double UTF-encoded');
+            $et->Warn('XMP is double UTF-encoded');
             $dataPt = \$buf2;   # use the decoded XMP
         }
         $dirStart = 0;
@@ -3365,16 +3587,17 @@ sub ProcessXMP($$;$)
     }
 
     # extract XMP as a block if specified
-    if (($exifTool->{REQ_TAG_LOOKUP}{xmp} or ($exifTool->{TAGS_FROM_FILE} and
-        not $exifTool->{EXCL_TAG_LOOKUP}{xmp})) and not $isSVG)
+    my $blockName = $$dirInfo{BlockInfo} ? $$dirInfo{BlockInfo}{Name} : 'XMP';
+    if (($$et{REQ_TAG_LOOKUP}{lc $blockName} or ($$et{TAGS_FROM_FILE} and
+        not $$et{EXCL_TAG_LOOKUP}{lc $blockName})) and not $isSVG)
     {
-        $exifTool->FoundTag('XMP', substr($$dataPt, $dirStart, $dirLen));
+        $et->FoundTag($$dirInfo{BlockInfo} || 'XMP', substr($$dataPt, $dirStart, $dirLen));
     }
 
     $tagTablePtr or $tagTablePtr = GetTagTable('Image::ExifTool::XMP::Main');
-    if ($exifTool->Options('Verbose') and not $exifTool->{XMP_CAPTURE}) {
+    if ($et->Options('Verbose') and not $$et{XMP_CAPTURE}) {
         my $dirType = $isSVG ? 'SVG' : $$tagTablePtr{GROUPS}{1};
-        $exifTool->VerboseDir($dirType, 0, $dirLen);
+        $et->VerboseDir($dirType, 0, $dirLen);
     }
 #
 # convert UTF-16 or UTF-32 encoded XMP to UTF-8 if necessary
@@ -3382,20 +3605,20 @@ sub ProcessXMP($$;$)
     my $begin = '<?xpacket begin=';
     my $dirEnd = $dirStart + $dirLen;
     pos($$dataPt) = $dirStart;
-    delete $$exifTool{XMP_IS_XML};
-    delete $$exifTool{XMP_IS_SVG};
+    delete $$et{XMP_IS_XML};
+    delete $$et{XMP_IS_SVG};
     if ($isXML or $isRDF) {
-        $$exifTool{XMP_IS_XML} = $isXML;
-        $$exifTool{XMP_IS_SVG} = $isSVG;
-        $$exifTool{XMP_NO_XPACKET} = 1 + $bom;
+        $$et{XMP_IS_XML} = $isXML;
+        $$et{XMP_IS_SVG} = $isSVG;
+        $$et{XMP_NO_XPACKET} = 1 + $bom;
     } elsif ($$dataPt =~ /\G\Q$begin\E/gc) {
-        delete $$exifTool{XMP_NO_XPACKET};
+        delete $$et{XMP_NO_XPACKET};
     } elsif ($$dataPt =~ /<x(mp)?:x[ma]pmeta/gc and
              pos($$dataPt) > $dirStart and pos($$dataPt) < $dirEnd)
     {
-        $$exifTool{XMP_NO_XPACKET} = 1 + $bom;
+        $$et{XMP_NO_XPACKET} = 1 + $bom;
     } else {
-        delete $$exifTool{XMP_NO_XPACKET};
+        delete $$et{XMP_NO_XPACKET};
         # check for UTF-16 encoding (insert one \0 between characters)
         $begin = join "\0", split //, $begin;
         # must reset pos because it was killed by previous unsuccessful //g match
@@ -3421,7 +3644,7 @@ sub ProcessXMP($$;$)
                 $fmt = 'V' if $$dataPt =~ /\G\0\0\0\xff\xfe\0\0/g;
             }
         }
-        defined $fmt or $exifTool->Warn('XMP character encoding error');
+        defined $fmt or $et->Warn('XMP character encoding error');
     }
     if ($fmt) {
         # trim if necessary to avoid converting non-UTF data
@@ -3444,45 +3667,49 @@ sub ProcessXMP($$;$)
     $xlatNamespace = \%stdXlatNS;
 
     # avoid scanning for XMP later in case ScanForXMP is set
-    $$exifTool{FoundXMP} = 1;
+    $$et{FoundXMP} = 1;
 
     # set XMP parsing options
-    $$exifTool{XMPParseOpts} = $$dirInfo{XMPParseOpts};
+    $$et{XMPParseOpts} = $$dirInfo{XMPParseOpts};
 
     # need to preserve list indices to be able to handle multi-dimensional lists
     my $keepFlat;
-    if ($exifTool->{OPTIONS}{Struct}) {
-        if ($exifTool->{OPTIONS}{Struct} eq '2') {
+    if ($$et{OPTIONS}{Struct}) {
+        if ($$et{OPTIONS}{Struct} eq '2') {
             $keepFlat = 1;      # preserve flattened tags
             # setting NO_LIST to 0 combines list items in a TAG_EXTRA "NoList" element
             # to allow them to be re-listed later if necessary.  A "NoListDel" element
             # is also created for tags that wouldn't have existed.
-            $$exifTool{NO_LIST} = 0;
+            $$et{NO_LIST} = 0;
         } else {
-            $$exifTool{NO_LIST} = 1;
+            $$et{NO_LIST} = 1;
         }
     }
 
+    # don't generate structures if this isn't real XMP
+    $$et{NO_STRUCT} = 1 if $$dirInfo{BlockInfo};
+
     # parse the XMP
-    if (ParseXMPElement($exifTool, $tagTablePtr, $dataPt, $dirStart, $dirEnd)) {
+    if (ParseXMPElement($et, $tagTablePtr, $dataPt, $dirStart, $dirEnd)) {
         $rtnVal = 1;
     } elsif ($$dirInfo{DirName} and $$dirInfo{DirName} eq 'XMP') {
         # if DirName was 'XMP' we expect well-formed XMP, so set Warning since it wasn't
-        $exifTool->Warn('Invalid XMP');
+        $et->Warn('Invalid XMP');
     }
+    delete $$et{NO_STRUCT};
 
     # return DataPt if successful in case we want it for writing
     $$dirInfo{DataPt} = $dataPt if $rtnVal and $$dirInfo{RAF};
 
     # restore structures if necessary
-    if ($$exifTool{IsStruct}) {
+    if ($$et{IsStruct}) {
         require 'Image/ExifTool/XMPStruct.pl';
-        RestoreStruct($exifTool, $keepFlat);
-        delete $$exifTool{IsStruct};
+        RestoreStruct($et, $keepFlat);
+        delete $$et{IsStruct};
     }
     # reset NO_LIST flag (must do this _after_ RestoreStruct() above)
-    delete $$exifTool{NO_LIST};
-    delete $$exifTool{XMPParseOpts};
+    delete $$et{NO_LIST};
+    delete $$et{XMPParseOpts};
 
     undef %curNS;
     return $rtnVal;
@@ -3510,7 +3737,7 @@ information.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -13,6 +13,7 @@
 #               6) http://www.optimasc.com/products/fileid/xmp-extensions.pdf
 #               9) http://www.w3.org/TR/SVG11/
 #               11) http://www.extensis.com/en/support/kb_article.jsp?articleNumber=6102211
+#               12) XMPSpecificationPart3_May2013, page 58
 #------------------------------------------------------------------------------
 
 package Image::ExifTool::XMP;
@@ -139,6 +140,7 @@ my %sTimecode = (
     copyright       => { Avoid => 1, Groups => { 2 => 'Author' } }, # (deprecated)
     director        => { },
     directorPhotography => { },
+    discNumber      => { }, #12
     duration        => { Struct => \%sTime },
     engineer        => { },
     fileDataRate    => { Writable => 'rational' },
@@ -156,10 +158,12 @@ my %sTimecode = (
     },
     logComment      => { },
     loop            => { Writable => 'boolean' },
+    lyrics          => { }, #12
     numberOfBeats   => { Writable => 'real' },
     markers         => { Struct => \%sMarker, List => 'Seq' },
     metadataModDate => { Groups => { 2 => 'Time' }, %dateTimeInfo },
     outCue          => { Struct => \%sTime },
+    partOfCompilation=>{ }, #12
     projectName     => { },
     projectRef => {
         Struct => {
@@ -901,7 +905,7 @@ my %sSubVersion = (
     author     => { Avoid => 1, Groups => { 2 => 'Author' } },
     caption    => { Avoid => 1 },
     categories => { Avoid => 1 },
-    datetime   => { Avoid => 1, Groups => { 2 => 'Time' }, %dateTimeInfo },
+    datetime   => { Name => 'DateTime', Avoid => 1, Groups => { 2 => 'Time' }, %dateTimeInfo },
     keywords   => { Avoid => 1, List => 'Bag' },
     notes      => { Avoid => 1 },
     rating     => { Avoid => 1, Writable => 'real' }, # integer?
@@ -1045,12 +1049,14 @@ my %sSubVersion = (
     %xmpTableDefaults,
     GROUPS => { 1 => 'XMP-expressionmedia', 2 => 'Image' },
     NAMESPACE => 'expressionmedia',
-    NOTES => 'Microsoft Expression Media namespace tags.',
-    CatalogSets => {
-        List => 'Bag',
-        Avoid => 1,
-        Notes => 'avoided due to conflict with XMP-mediapro:CatalogSets',
+    NOTES => q{
+        Microsoft Expression Media namespace tags.  These tags are avoided when
+        writing due to name conflicts with tags in other schemas.
     },
+    Event       => { Avoid => 1 },
+    Status      => { Avoid => 1 },
+    People      => { Avoid => 1, List => 'Bag' },
+    CatalogSets => { Avoid => 1, List => 'Bag' },
 );
 
 # DigiKam namespace tags (ref PH)
@@ -1154,6 +1160,7 @@ my %sSubVersion = (
     },
     FaceID          => { Writable => 'integer' },
     AngleInfoRoll   => { Writable => 'integer' },
+    AngleInfoYaw    => { Writable => 'integer' },
     ConfidenceLevel => { Writable => 'integer' },
 );
 
@@ -1267,7 +1274,7 @@ This file contains definitions for less common XMP namespaces.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -176,7 +176,7 @@ sub DumpStruct($;$)
 # - un-escapes for XML or HTML as per Escape option setting
 sub CheckStruct($$$)
 {
-    my ($exifTool, $struct, $strTable) = @_;
+    my ($et, $struct, $strTable) = @_;
 
     my $strName = $$strTable{STRUCT_NAME} || ('XMP ' . RegisterNamespace($strTable));
     ref $struct eq 'HASH' or return wantarray ? (undef, "Expecting $strName structure") : undef;
@@ -211,7 +211,7 @@ Key:
                 my ($tagInfo, $priority, $ti, $g1);
                 # find best matching tag
                 foreach $ti (@matches) {
-                    my @grps = $exifTool->GetGroup($ti);
+                    my @grps = $et->GetGroup($ti);
                     next unless $grps[0] eq 'XMP';
                     next if $grp and $grp ne lc $grps[1];
                     # must be lang-alt tag if we are writing an alternate language
@@ -270,7 +270,7 @@ Key:
         if (ref $$struct{$key} eq 'HASH') {
             $$fieldInfo{Struct} or $warn = "$tag is not a structure in $strName", next Key;
             # recursively check this structure
-            ($val, $err) = CheckStruct($exifTool, $$struct{$key}, $$fieldInfo{Struct});
+            ($val, $err) = CheckStruct($et, $$struct{$key}, $$fieldInfo{Struct});
             $err and $warn = $err, next Key;
             $copy{$tag} = $val;
         } elsif (ref $$struct{$key} eq 'ARRAY') {
@@ -282,14 +282,14 @@ Key:
                 if (not ref $item) {
                     $item = '' unless defined $item; # use empty string for missing items
                     $$fieldInfo{Struct} and $warn = "$tag items are not valid structures", next Key;
-                    $exifTool->Sanitize(\$item);
-                    ($copy[$i],$err) = $exifTool->ConvInv($item,$fieldInfo,$tag,$strName,$type);
+                    $et->Sanitize(\$item);
+                    ($copy[$i],$err) = $et->ConvInv($item,$fieldInfo,$tag,$strName,$type);
                     $err and $warn = $err, next Key;
-                    $err = CheckXMP($exifTool, $fieldInfo, \$copy[$i]);
+                    $err = CheckXMP($et, $fieldInfo, \$copy[$i]);
                     $err and $warn = "$err in $strName $tag", next Key;
                 } elsif (ref $item eq 'HASH') {
                     $$fieldInfo{Struct} or $warn = "$tag is not a structure in $strName", next Key;
-                    ($copy[$i], $err) = CheckStruct($exifTool, $item, $$fieldInfo{Struct});
+                    ($copy[$i], $err) = CheckStruct($et, $item, $$fieldInfo{Struct});
                     $err and $warn = $err, next Key;
                 } else {
                     $warn = "Invalid value for $tag in $strName";
@@ -301,10 +301,10 @@ Key:
         } elsif ($$fieldInfo{Struct}) {
             $warn = "Improperly formed structure in $strName $tag";
         } else {
-            $exifTool->Sanitize(\$$struct{$key});
-            ($val,$err) = $exifTool->ConvInv($$struct{$key},$fieldInfo,$tag,$strName,$type);
+            $et->Sanitize(\$$struct{$key});
+            ($val,$err) = $et->ConvInv($$struct{$key},$fieldInfo,$tag,$strName,$type);
             $err and $warn = $err, next Key;
-            $err = CheckXMP($exifTool, $fieldInfo, \$val);
+            $err = CheckXMP($et, $fieldInfo, \$val);
             $err and $warn = "$err in $strName $tag", next Key;
             # turn this into a list if necessary
             $copy{$tag} = $$fieldInfo{List} ? [ $val ] : $val;
@@ -313,7 +313,7 @@ Key:
     if (%copy) {
         $rtnVal = \%copy;
         undef $err;
-        $$exifTool{CHECK_WARN} = $warn if $warn;
+        $$et{CHECK_WARN} = $warn if $warn;
     } else {
         $err = $warn || 'Structure has no fields';
     }
@@ -329,7 +329,7 @@ Key:
 # Notes: updates path to new base path for structure to be added
 sub DeleteStruct($$$$$)
 {
-    my ($exifTool, $capture, $pathPt, $nvHash, $changed) = @_;
+    my ($et, $capture, $pathPt, $nvHash, $changed) = @_;
     my ($deleted, $added, $existed, $p, $pp, $val, $delPath);
     my (@structPaths, @matchingPaths, @delPaths);
 
@@ -387,10 +387,10 @@ sub DeleteStruct($$$$$)
         $delPath = $1;
     }
     if (@delPaths) {
-        my $verbose = $exifTool->Options('Verbose');
+        my $verbose = $et->Options('Verbose');
         @delPaths = sort @delPaths if $verbose > 1;
         foreach $p (@delPaths) {
-            $exifTool->VerboseValue("- XMP-$p", $$capture{$p}[0]) if $verbose > 1;
+            $et->VerboseValue("- XMP-$p", $$capture{$p}[0]) if $verbose > 1;
             delete $$capture{$p};
             $deleted = 1;
             ++$$changed;
@@ -406,7 +406,7 @@ sub DeleteStruct($$$$$)
             if ($$capture{$path}) {
                 my $cap = $$capture{$path};
                 # an error unless this was an empty structure
-                $exifTool->Error("Improperly structured XMP ($path)",1) if ref $cap ne 'ARRAY' or $$cap[0];
+                $et->Error("Improperly structured XMP ($path)",1) if ref $cap ne 'ARRAY' or $$cap[0];
                 delete $$capture{$path};
             }
             # (match last index to put in same lang-alt list for Bag of lang-alt items)
@@ -431,7 +431,7 @@ sub DeleteStruct($$$$$)
 #         3) resource path, 4) value ref, 5) hash ref for last used index numbers
 sub AddNewTag($$$$$$)
 {
-    my ($exifTool, $tagInfo, $capture, $path, $valPtr, $langIdx) = @_;
+    my ($et, $tagInfo, $capture, $path, $valPtr, $langIdx) = @_;
     my $val = EscapeXML($$valPtr);
     my %attrs;
     # support writing RDF "resource" values
@@ -453,8 +453,8 @@ sub AddNewTag($$$$$$)
     }
     $$capture{$path} = [ $val, \%attrs ];
     # print verbose message
-    if ($exifTool and $exifTool->Options('Verbose') > 1) {
-        $exifTool->VerboseValue("+ XMP-$path", $val);
+    if ($et and $et->Options('Verbose') > 1) {
+        $et->VerboseValue("+ XMP-$path", $val);
     }
 }
 
@@ -467,8 +467,8 @@ sub AddNewTag($$$$$$)
 # Notes: Escapes values for XML
 sub AddNewStruct($$$$$$)
 {
-    my ($exifTool, $tagInfo, $capture, $basePath, $struct, $strTable) = @_;
-    my $verbose = $exifTool ? $exifTool->Options('Verbose') : 0;
+    my ($et, $tagInfo, $capture, $basePath, $struct, $strTable) = @_;
+    my $verbose = $et ? $et->Options('Verbose') : 0;
     my ($tag, %langIdx);
 
     my $ns = $$strTable{NAMESPACE} || '';
@@ -488,11 +488,11 @@ sub AddNewStruct($$$$$$)
             }
             $$fieldInfo{PropertyPath} = $propPath;  # save for next time
         }
-        my $path = $basePath . '/' . ConformPathToNamespace($exifTool, $propPath);
+        my $path = $basePath . '/' . ConformPathToNamespace($et, $propPath);
         my $addedTag;
         if (ref $val eq 'HASH') {
             my $subStruct = $$fieldInfo{Struct} or next;
-            $changed += AddNewStruct($exifTool, $tagInfo, $capture, $path, $val, $subStruct);
+            $changed += AddNewStruct($et, $tagInfo, $capture, $path, $val, $subStruct);
         } elsif (ref $val eq 'ARRAY') {
             next unless $$fieldInfo{List};
             my $i = 0;
@@ -501,7 +501,7 @@ sub AddNewStruct($$$$$$)
             foreach $item (@{$val}) {
                 if ($i) {
                     # update first index in field property (may be list of lang-alt lists)
-                    $p = ConformPathToNamespace($exifTool, $propPath);
+                    $p = ConformPathToNamespace($et, $propPath);
                     my $idx = length($i) . $i;
                     $p =~ s/ \d+/ $idx/;
                     $p = "$basePath/$p";
@@ -510,16 +510,16 @@ sub AddNewStruct($$$$$$)
                 }
                 if (ref $item eq 'HASH') {
                     my $subStruct = $$fieldInfo{Struct} or next;
-                    AddNewStruct($exifTool, $tagInfo, $capture, $p, $item, $subStruct) or next;
+                    AddNewStruct($et, $tagInfo, $capture, $p, $item, $subStruct) or next;
                 } elsif (length $item) { # don't write empty items in list
-                    AddNewTag($exifTool, $fieldInfo, $capture, $p, \$item, \%langIdx);
+                    AddNewTag($et, $fieldInfo, $capture, $p, \$item, \%langIdx);
                     $addedTag = 1;
                 }
                 ++$changed;
                 ++$i;
             }
         } else {
-            AddNewTag($exifTool, $fieldInfo, $capture, $path, \$val, \%langIdx);
+            AddNewTag($et, $fieldInfo, $capture, $path, \$val, \%langIdx);
             $addedTag = 1;
             ++$changed;
         }
@@ -527,15 +527,15 @@ sub AddNewStruct($$$$$$)
         # in the case that a whole hierarchy was added at once by writing a
         # flattened tag inside a variable-namespace structure
         if ($addedTag and $$fieldInfo{StructType} and $$fieldInfo{Table}) {
-            AddStructType($exifTool, $$fieldInfo{Table}, $capture, $propPath, $basePath);
+            AddStructType($et, $$fieldInfo{Table}, $capture, $propPath, $basePath);
         }
     }
     # add 'rdf:type' property if necessary
     if ($$strTable{TYPE} and $changed) {
-        my $path = $basePath . '/' . ConformPathToNamespace($exifTool, "rdf:type");
+        my $path = $basePath . '/' . ConformPathToNamespace($et, "rdf:type");
         unless ($$capture{$path}) {
             $$capture{$path} = [ '', { 'rdf:resource' => $$strTable{TYPE} } ];
-            $exifTool->VerboseValue("+ XMP-$path", $$strTable{TYPE}) if $verbose > 1;
+            $et->VerboseValue("+ XMP-$path", $$strTable{TYPE}) if $verbose > 1;
         }
     }
     return $changed;
@@ -549,7 +549,7 @@ sub AddNewStruct($$$$$$)
 # Notes: Makes a copy of the hash so any applied escapes won't affect raw values
 sub ConvertStruct($$$$;$)
 {
-    my ($exifTool, $tagInfo, $value, $type, $parentID) = @_;
+    my ($et, $tagInfo, $value, $type, $parentID) = @_;
     if (ref $value eq 'HASH') {
         my (%struct, $key);
         my $table = $$tagInfo{Table};
@@ -567,9 +567,9 @@ sub ConvertStruct($$$$;$)
             }
             my $v = $$value{$key};
             if (ref $v) {
-                $v = ConvertStruct($exifTool, $flatInfo, $v, $type, $tagID);
+                $v = ConvertStruct($et, $flatInfo, $v, $type, $tagID);
             } else {
-                $v = $exifTool->GetValue($flatInfo, $type, $v);
+                $v = $et->GetValue($flatInfo, $type, $v);
             }
             $struct{$key} = $v if defined $v;  # save the converted value
         }
@@ -577,12 +577,12 @@ sub ConvertStruct($$$$;$)
     } elsif (ref $value eq 'ARRAY') {
         my (@list, $val);
         foreach $val (@$value) {    
-            my $v = ConvertStruct($exifTool, $tagInfo, $val, $type, $parentID);
+            my $v = ConvertStruct($et, $tagInfo, $val, $type, $parentID);
             push @list, $v if defined $v;
         }
         return \@list;
     } else {
-        return $exifTool->GetValue($tagInfo, $type, $value);
+        return $et->GetValue($tagInfo, $type, $value);
     }
 }
 
@@ -593,16 +593,16 @@ sub ConvertStruct($$$$;$)
 sub RestoreStruct($;$)
 {
     local $_;
-    my ($exifTool, $keepFlat) = @_;
+    my ($et, $keepFlat) = @_;
     my ($key, %structs, %var, %lists, $si, %listKeys);
-    my $ex = $$exifTool{TAG_EXTRA};
-    my $valueHash = $$exifTool{VALUE};
-    my $tagExtra = $$exifTool{TAG_EXTRA};
-    foreach $key (keys %{$$exifTool{TAG_INFO}}) {
+    my $ex = $$et{TAG_EXTRA};
+    my $valueHash = $$et{VALUE};
+    my $tagExtra = $$et{TAG_EXTRA};
+    foreach $key (keys %{$$et{TAG_INFO}}) {
         $$ex{$key} or next;
-        my ($err, $i);
         my $structProps = $$ex{$key}{Struct} or next;
-        my $tagInfo = $$exifTool{TAG_INFO}{$key};   # tagInfo for flattened tag
+        delete $$ex{$key}{Struct}; # (don't re-use)
+        my $tagInfo = $$et{TAG_INFO}{$key};   # tagInfo for flattened tag
         my $table = $$tagInfo{Table};
         my $prop = shift @$structProps;
         my $tag = $$prop[0];
@@ -614,7 +614,7 @@ sub RestoreStruct($;$)
                 # this could happen for invalid XMP containing mixed lists
                 # (or for something like this -- what should we do here?:
                 # <meta:user-defined meta:name="License">test</meta:user-defined>)
-                $exifTool->Warn("$$strInfo{Name} is not a structure!");
+                $et->Warn("$$strInfo{Name} is not a structure!");
                 next;
             }
         } else {
@@ -651,6 +651,7 @@ sub RestoreStruct($;$)
         my $writable = $$tagInfo{Writable} || '';
         # walk through the stored structure property information
         # to rebuild this structure
+        my ($err, $i);
         for (;;) {
             my $index = $$prop[1];
             if ($index and not @$structProps) {
@@ -724,7 +725,7 @@ sub RestoreStruct($;$)
         if ($err) {
             # this may happen if we have a structural error in the XMP
             # (like an improperly contained list for example)
-            $exifTool->Warn("Error $err placing $$tagInfo{Name} in structure", 1);
+            $et->Warn("Error $err placing $$tagInfo{Name} in structure or list", 1);
             delete $structs{$strInfo} unless $oldStruct;
         } elsif ($tagInfo eq $strInfo) {
             # just a regular list tag
@@ -733,8 +734,8 @@ sub RestoreStruct($;$)
                 # "Tag (10)" is lt "Tag (2)", but at least "Tag" is lt
                 # everything else, and this is really what we care about)
                 my $k = $listKeys{$oldStruct};
-                $k lt $key and $exifTool->DeleteTag($key), next;
-                $exifTool->DeleteTag($k);   # remove tag with greater copy number
+                $k lt $key and $et->DeleteTag($key), next;
+                $et->DeleteTag($k);   # remove tag with greater copy number
             }
             # replace existing value with new list
             $$valueHash{$key} = $structs{$strInfo};
@@ -743,11 +744,11 @@ sub RestoreStruct($;$)
             # save strInfo ref and file order
             if ($var{$strInfo}) {
                 # set file order to just before the first associated flattened tag
-                if ($var{$strInfo}[1] > $$exifTool{FILE_ORDER}{$key}) {
-                    $var{$strInfo}[1] = $$exifTool{FILE_ORDER}{$key} - 0.5;
+                if ($var{$strInfo}[1] > $$et{FILE_ORDER}{$key}) {
+                    $var{$strInfo}[1] = $$et{FILE_ORDER}{$key} - 0.5;
                 }
             } else {
-                $var{$strInfo} = [ $strInfo, $$exifTool{FILE_ORDER}{$key} - 0.5 ];
+                $var{$strInfo} = [ $strInfo, $$et{FILE_ORDER}{$key} - 0.5 ];
             }
             # preserve original flattened tags if requested
             if ($keepFlat) {
@@ -758,10 +759,10 @@ sub RestoreStruct($;$)
                     delete $$extra{NoList};
                 } elsif ($$extra{NoListDel}) {
                     # delete this tag since its value was included another list
-                    $exifTool->DeleteTag($key);
+                    $et->DeleteTag($key);
                 }
             } else {
-                $exifTool->DeleteTag($key); # delete the flattened tag
+                $et->DeleteTag($key); # delete the flattened tag
             }
         }
     }
@@ -774,9 +775,9 @@ sub RestoreStruct($;$)
     # save new structure tags
     foreach $si (keys %structs) {
         next unless $var{$si};  # already handled regular lists
-        $key = $exifTool->FoundTag($var{$si}[0], '');
+        $key = $et->FoundTag($var{$si}[0], '');
         $$valueHash{$key} = $structs{$si};
-        $$exifTool{FILE_ORDER}{$key} = $var{$si}[1];
+        $$et{FILE_ORDER}{$key} = $var{$si}[1];
     }
 }
 
@@ -800,7 +801,7 @@ information.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -19,7 +19,7 @@ use strict;
 use vars qw($VERSION $warnString);
 use Image::ExifTool qw(:DataAccess :Utils);
 
-$VERSION = '1.11';
+$VERSION = '1.13';
 
 sub WarnProc($) { $warnString = $_[0]; }
 
@@ -243,13 +243,13 @@ my %openDocType = (
 # Returns: 1 on success, 0 if this wasn't a valid RAR file
 sub ProcessRAR($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my ($flags, $buff);
 
     return 0 unless $raf->Read($buff, 7) and $buff eq "Rar!\x1a\x07\0";
 
-    $exifTool->SetFileType();
+    $et->SetFileType();
     SetByteOrder('II');
     my $tagTablePtr = GetTagTable('Image::ExifTool::ZIP::RAR');
     my $docNum = 0;
@@ -266,8 +266,8 @@ sub ProcessRAR($$)
         last if $size < 0;
         next unless $size;  # ignore blocks with no data
         # don't try to read very large blocks unless LargeFileSupport is enabled
-        if ($size > 0x80000000 and not $exifTool->Options('LargeFileSupport')) {
-            $exifTool->Warn('Large block encountered. Aborting.');
+        if ($size > 0x80000000 and not $et->Options('LargeFileSupport')) {
+            $et->Warn('Large block encountered. Aborting.');
             last;
         }
         # process the block
@@ -277,21 +277,21 @@ sub ProcessRAR($$)
             $raf->Read($buff, $n) == $n or last;
             # add compressed size to start of data so we can extract it with the other tags
             $buff = pack('V',$size) . $buff;
-            $$exifTool{DOC_NUM} = ++$docNum;
-            $exifTool->ProcessDirectory({ DataPt => \$buff }, $tagTablePtr);
+            $$et{DOC_NUM} = ++$docNum;
+            $et->ProcessDirectory({ DataPt => \$buff }, $tagTablePtr);
             $size -= $n;
         } elsif ($type == 0x75 and $size > 6) { # comment block
             $raf->Read($buff, $size) == $size or last;
             # save comment, only if "Stored" (this is untested)
             if (Get8u(\$buff, 3) == 0x30) {
-                $exifTool->FoundTag('Comment', substr($buff, 6));
+                $et->FoundTag('Comment', substr($buff, 6));
             }
             next;
         }
         # seek to the start of the next block
         $raf->Seek($size, 1) or last if $size;
     }
-    $$exifTool{DOC_NUM} = 0;
+    $$et{DOC_NUM} = 0;
 
     return 1;
 }
@@ -302,21 +302,21 @@ sub ProcessRAR($$)
 # Returns: 1 on success, 0 if this wasn't a valid GZIP file
 sub ProcessGZIP($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my ($flags, $buff);
 
     return 0 unless $raf->Read($buff, 10) and $buff =~ /^\x1f\x8b\x08/;
 
-    $exifTool->SetFileType();
+    $et->SetFileType();
     SetByteOrder('II');
 
     my $tagTablePtr = GetTagTable('Image::ExifTool::ZIP::GZIP');
-    $exifTool->HandleTag($tagTablePtr, 2, Get8u(\$buff, 2));
-    $exifTool->HandleTag($tagTablePtr, 3, $flags = Get8u(\$buff, 3));
-    $exifTool->HandleTag($tagTablePtr, 4, Get32u(\$buff, 4));
-    $exifTool->HandleTag($tagTablePtr, 8, Get8u(\$buff, 8));
-    $exifTool->HandleTag($tagTablePtr, 9, Get8u(\$buff, 9));
+    $et->HandleTag($tagTablePtr, 2, Get8u(\$buff, 2));
+    $et->HandleTag($tagTablePtr, 3, $flags = Get8u(\$buff, 3));
+    $et->HandleTag($tagTablePtr, 4, Get32u(\$buff, 4));
+    $et->HandleTag($tagTablePtr, 8, Get8u(\$buff, 8));
+    $et->HandleTag($tagTablePtr, 9, Get8u(\$buff, 9));
 
     # extract file name and comment if they exist
     if ($flags & 0x18) {
@@ -338,7 +338,7 @@ sub ProcessGZIP($$)
             # but in OS X it seems to be UTF-8, so don't translate
             # it because I could just as easily screw it up)
             my $str = substr($buff, $pos, $end - $pos);
-            $exifTool->HandleTag($tagTablePtr, $tagID, $str);
+            $et->HandleTag($tagTablePtr, $tagID, $str);
             last if $end >= length $buff;
             $pos = $end + 1;
         }
@@ -351,16 +351,16 @@ sub ProcessGZIP($$)
 # Inputs: 0) ExifTool object ref, 1) member ref, 2) optional tag table ref
 sub HandleMember($$;$)
 {
-    my ($exifTool, $member, $tagTablePtr) = @_;
+    my ($et, $member, $tagTablePtr) = @_;
     $tagTablePtr or  $tagTablePtr = GetTagTable('Image::ExifTool::ZIP::Main');
-    $exifTool->HandleTag($tagTablePtr, 2, $member->versionNeededToExtract());
-    $exifTool->HandleTag($tagTablePtr, 3, $member->bitFlag());
-    $exifTool->HandleTag($tagTablePtr, 4, $member->compressionMethod());
-    $exifTool->HandleTag($tagTablePtr, 5, $member->lastModFileDateTime());
-    $exifTool->HandleTag($tagTablePtr, 7, $member->crc32());
-    $exifTool->HandleTag($tagTablePtr, 9, $member->compressedSize());
-    $exifTool->HandleTag($tagTablePtr, 11, $member->uncompressedSize());
-    $exifTool->HandleTag($tagTablePtr, 15, $member->fileName());
+    $et->HandleTag($tagTablePtr, 2, $member->versionNeededToExtract());
+    $et->HandleTag($tagTablePtr, 3, $member->bitFlag());
+    $et->HandleTag($tagTablePtr, 4, $member->compressionMethod());
+    $et->HandleTag($tagTablePtr, 5, $member->lastModFileDateTime());
+    $et->HandleTag($tagTablePtr, 7, $member->crc32());
+    $et->HandleTag($tagTablePtr, 9, $member->compressedSize());
+    $et->HandleTag($tagTablePtr, 11, $member->uncompressedSize());
+    $et->HandleTag($tagTablePtr, 15, $member->fileName());
 }
 
 #------------------------------------------------------------------------------
@@ -369,7 +369,7 @@ sub HandleMember($$;$)
 # Returns: 1 on success, 0 if this wasn't a valid ZIP file
 sub ProcessZIP($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $raf = $$dirInfo{RAF};
     my ($buff, $buf2, $zip, $docNum);
 
@@ -379,38 +379,38 @@ sub ProcessZIP($$)
 
     # use Archive::Zip if avilable
     for (;;) {
-        unless (eval 'require Archive::Zip' and eval 'require IO::File') {
-            if ($$exifTool{FILE_EXT} and $$exifTool{FILE_EXT} ne 'ZIP') {
-                $exifTool->Warn("Install Archive::Zip to decode compressed ZIP information");
+        unless (eval { require Archive::Zip } and eval { require IO::File }) {
+            if ($$et{FILE_EXT} and $$et{FILE_EXT} ne 'ZIP') {
+                $et->Warn("Install Archive::Zip to decode compressed ZIP information");
             }
             last;
         }
         # Archive::Zip requires a seekable IO::File object
         my $fh;
         if ($raf->{TESTED} >= 0) {
-            unless (eval 'require IO::File') {
+            unless (eval { require IO::File }) {
                 # (this shouldn't happen because IO::File is a prerequisite of Archive::Zip)
-                $exifTool->Warn("Install IO::File to decode compressed ZIP information");
+                $et->Warn("Install IO::File to decode compressed ZIP information");
                 last;
             }
             $raf->Seek(0,0);
             $fh = $raf->{FILE_PT};
             bless $fh, 'IO::File';  # Archive::Zip expects an IO::File object
-        } elsif (eval 'require IO::String') {
+        } elsif (eval { require IO::String }) {
             # read the whole file into memory (what else can I do?)
             $raf->Slurp();
             $fh = new IO::String ${$raf->{BUFF_PT}};
         } else {
             my $type = $raf->{FILE_PT} ? 'pipe or socket' : 'scalar reference';
-            $exifTool->Warn("Install IO::String to decode compressed ZIP information from a $type");
+            $et->Warn("Install IO::String to decode compressed ZIP information from a $type");
             last;
         }
-        $exifTool->VPrint(1, "  --- using Archive::Zip ---\n");
+        $et->VPrint(1, "  --- using Archive::Zip ---\n");
         $zip = new Archive::Zip;
         # catch all warnings! (Archive::Zip is bad for this)
         local $SIG{'__WARN__'} = \&WarnProc;
         my $status = $zip->readFromFileHandle($fh);
-        if ($status eq '4' and $raf->{TESTED} >= 0 and eval 'require IO::String' and
+        if ($status eq '4' and $raf->{TESTED} >= 0 and eval { require IO::String } and
             $raf->Seek(0,2) and $raf->Tell() < 100000000)
         {
             # try again, reading it ourself this time in an attempt to avoid
@@ -425,7 +425,7 @@ sub ProcessZIP($$)
             undef $zip;
             my %err = ( 1=>'Stream end error', 3=>'Format error', 4=>'IO error' );
             my $err = $err{$status} || "Error $status";
-            $exifTool->Warn("$err reading ZIP file");
+            $et->Warn("$err reading ZIP file");
             last;
         }
         $$dirInfo{ZIP} = $zip;
@@ -445,7 +445,7 @@ sub ProcessZIP($$)
         if ($mime or @members) {
             $$dirInfo{MIME} = $mime;
             require Image::ExifTool::OOXML;
-            Image::ExifTool::OOXML::ProcessDOCX($exifTool, $dirInfo);
+            Image::ExifTool::OOXML::ProcessDOCX($et, $dirInfo);
             delete $$dirInfo{MIME};
             last;
         }
@@ -454,7 +454,7 @@ sub ProcessZIP($$)
         @members = $zip->membersMatching('^CaptureOne/.*\.(cos|COS)$');
         if (@members) {
             require Image::ExifTool::CaptureOne;
-            Image::ExifTool::CaptureOne::ProcessEIP($exifTool, $dirInfo);
+            Image::ExifTool::CaptureOne::ProcessEIP($et, $dirInfo);
             last;
         }
 
@@ -462,7 +462,7 @@ sub ProcessZIP($$)
         @members = $zip->membersMatching('^(index\.(xml|apxl)|QuickLook/Thumbnail\.jpg)$');
         if (@members) {
             require Image::ExifTool::iWork;
-            Image::ExifTool::iWork::Process_iWork($exifTool, $dirInfo);
+            Image::ExifTool::iWork::Process_iWork($et, $dirInfo);
             last;
         }
 
@@ -473,8 +473,8 @@ sub ProcessZIP($$)
             if (not $status and $mime =~ /([\x21-\xfe]+)/s) {
                 # clean up MIME type just in case (note that MIME is case insensitive)
                 $mime = lc $1;
-                $exifTool->SetFileType($openDocType{$mime} || 'ZIP', $mime);
-                $exifTool->Warn('Unrecognized MIMEType') unless $openDocType{$mime};
+                $et->SetFileType($openDocType{$mime} || 'ZIP', $mime);
+                $et->Warn('Unrecognized MIMEType') unless $openDocType{$mime};
                 # extract Open Document metadata from "meta.xml"
                 my $meta = $zip->memberNamed('meta.xml');
                 # IDML files have metadata in a different place (ref 6)
@@ -488,7 +488,7 @@ sub ProcessZIP($$)
                             DataLen => length $buff,
                         );
                         my $xmpTable = GetTagTable('Image::ExifTool::XMP::Main');
-                        $exifTool->ProcessDirectory(\%dirInfo, $xmpTable);
+                        $et->ProcessDirectory(\%dirInfo, $xmpTable);
                     }
                 }
                 if ($openDocType{$mime} or $meta) {
@@ -499,7 +499,7 @@ sub ProcessZIP($$)
                         my $thumb = $zip->memberNamed("Thumbnails/thumbnail.$type");
                         next unless $thumb;
                         ($buff, $status) = $zip->contents($thumb);
-                        $exifTool->FoundTag($tag{$type}, $buff) unless $status;
+                        $et->FoundTag($tag{$type}, $buff) unless $status;
                     }
                     last;   # all done since we recognized the MIME type or found metadata
                 }
@@ -508,29 +508,29 @@ sub ProcessZIP($$)
         }
 
         # otherwise just extract general ZIP information
-        $exifTool->SetFileType();
+        $et->SetFileType();
         @members = $zip->members();
         $docNum = 0;
         my $member;
         foreach $member (@members) {
-            $$exifTool{DOC_NUM} = ++$docNum;
-            HandleMember($exifTool, $member, $tagTablePtr);
+            $$et{DOC_NUM} = ++$docNum;
+            HandleMember($et, $member, $tagTablePtr);
         }
         last;
     }
     # all done if we processed this using Archive::Zip
     if ($zip) {
         delete $$dirInfo{ZIP};
-        delete $$exifTool{DOC_NUM};
+        delete $$et{DOC_NUM};
         return 1;
     }
 #
 # process the ZIP file by hand (funny, but this seems easier than using Archive::Zip)
 #
     $docNum = 0;
-    $exifTool->VPrint(1, "  -- processing as binary data --\n");
+    $et->VPrint(1, "  -- processing as binary data --\n");
     $raf->Seek(30, 0);
-    $exifTool->SetFileType();
+    $et->SetFileType();
     SetByteOrder('II');
 
     #  A.  Local file header:
@@ -549,7 +549,7 @@ sub ProcessZIP($$)
         my $len = Get16u(\$buff, 26) + Get16u(\$buff, 28);
         $raf->Read($buf2, $len) == $len or last;
 
-        $$exifTool{DOC_NUM} = ++$docNum;
+        $$et{DOC_NUM} = ++$docNum;
         $buff .= $buf2;
         my %dirInfo = (
             DataPt => \$buff,
@@ -558,21 +558,21 @@ sub ProcessZIP($$)
             DirStart => 0,
             DirLen => 30 + $len,
         );
-        $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
         my $flags = Get16u(\$buff, 6);
         if ($flags & 0x08) {
             # we don't yet support skipping stream mode data
             # (when this happens, the CRC, compressed size and uncompressed
             #  sizes are set to 0 in the header.  Instead, they are stored
             #  after the compressed data with an optional header of 0x08074b50)
-            $exifTool->Warn('Stream mode data encountered, file list may be incomplete');
+            $et->Warn('Stream mode data encountered, file list may be incomplete');
             last;
         }
         $len = Get32u(\$buff, 18);      # file data length
         $raf->Seek($len, 1) or last;    # skip file data
         $raf->Read($buff, 30) == 30 and $buff =~ /^PK\x03\x04/ or last;
     }
-    delete $$exifTool{DOC_NUM};
+    delete $$et{DOC_NUM};
     return 1;
 }
 
@@ -596,7 +596,7 @@ types like DOCX, PPTX, XLSX, ODB, ODC, ODF, ODG, ODI, ODP, ODS, ODT and EIP.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -14,7 +14,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
 use Image::ExifTool::XMP;
 use Image::ExifTool::ZIP;
 
-$VERSION = '1.02';
+$VERSION = '1.03';
 
 # test for recognized iWork document extensions and outer XML elements
 my %iWorkType = (
@@ -70,7 +70,7 @@ sub GetTagID($)
 {
     my $props = shift;
     return 0 if $$props[-1] =~ /^\w+:ID$/;  # ignore ID tags
-    return ($$props[0] =~ /.*?:(.*)/) ? $1 : $$props[0];
+    return ($$props[0] =~ /^.*?:(.*)/) ? $1 : $$props[0];
 }
 
 #------------------------------------------------------------------------------
@@ -81,25 +81,25 @@ sub GetTagID($)
 # Returns: 1 if valid tag was found
 sub FoundTag($$$$;$)
 {
-    my ($exifTool, $tagTablePtr, $props, $val, $attrs) = @_;
+    my ($et, $tagTablePtr, $props, $val, $attrs) = @_;
     return 0 unless @$props;
-    my $verbose = $exifTool->Options('Verbose');
+    my $verbose = $et->Options('Verbose');
 
-    $exifTool->VPrint(0, "  | - Tag '", join('/',@$props), "'\n") if $verbose > 1;
+    $et->VPrint(0, "  | - Tag '", join('/',@$props), "'\n") if $verbose > 1;
 
     # un-escape XML character entities
     $val = Image::ExifTool::XMP::UnescapeXML($val);
     # convert from UTF8 to ExifTool Charset
-    $val = $exifTool->Decode($val, 'UTF8');
+    $val = $et->Decode($val, 'UTF8');
     my $tag = GetTagID($props) or return 0;
 
     # add any unknown tags to table
     unless ($$tagTablePtr{$tag}) {
-        $exifTool->VPrint(0, "  [adding $tag]\n") if $verbose;
+        $et->VPrint(0, "  [adding $tag]\n") if $verbose;
         AddTagToTable($tagTablePtr, $tag, { Name => ucfirst $tag });
     }
     # save the tag
-    $exifTool->HandleTag($tagTablePtr, $tag, $val);
+    $et->HandleTag($tagTablePtr, $tag, $val);
 
     return 1;
 }
@@ -112,14 +112,14 @@ sub FoundTag($$$$;$)
 # as ZIP and the dirInfo hash contains a 'ZIP' Archive::Zip object reference
 sub Process_iWork($$)
 {
-    my ($exifTool, $dirInfo) = @_;
+    my ($et, $dirInfo) = @_;
     my $zip = $$dirInfo{ZIP};
     my ($type, $index, $indexFile, $status);
 
     # try to determine the file type
     local $SIG{'__WARN__'} = \&Image::ExifTool::ZIP::WarnProc;
     # trust type given by file extension if available
-    $type = $iWorkType{$$exifTool{FILE_EXT}} if $$exifTool{FILE_EXT};
+    $type = $iWorkType{$$et{FILE_EXT}} if $$et{FILE_EXT};
     unless ($type) {
         # read the index file
         my @members = $zip->membersMatching('^index\.(xml|apxl)$');
@@ -134,7 +134,7 @@ sub Process_iWork($$)
         }
         $type or $type = 'ZIP';     # assume ZIP by default
     }
-    $exifTool->SetFileType($type, $mimeType{$type});
+    $et->SetFileType($type, $mimeType{$type});
 
     my @members = $zip->members();
     my $docNum = 0;
@@ -143,10 +143,10 @@ sub Process_iWork($$)
         # get filename of this ZIP member
         my $file = $member->fileName();
         next unless defined $file;
-        $exifTool->VPrint(0, "File: $file\n");
+        $et->VPrint(0, "File: $file\n");
         # set the document number and extract ZIP tags
-        $$exifTool{DOC_NUM} = ++$docNum;
-        Image::ExifTool::ZIP::HandleMember($exifTool, $member);
+        $$et{DOC_NUM} = ++$docNum;
+        Image::ExifTool::ZIP::HandleMember($et, $member);
 
         # process only the index XML and JPEG thumbnail files
         next unless $file =~ m{^(index\.(xml|apxl)|QuickLook/Thumbnail\.jpg)$}i;
@@ -158,12 +158,12 @@ sub Process_iWork($$)
             $buffPt = \$index;
         } else {
             ($buff, $status) = $zip->contents($member);
-            $status and $exifTool->Warn("Error extracting $file"), next;
+            $status and $et->Warn("Error extracting $file"), next;
             $buffPt = \$buff;
         }
         # extract JPEG as PreviewImage (should only be QuickLook/Thumbnail.jpg)
         if ($file =~ /\.jpg$/) {
-            $exifTool->FoundTag('PreviewImage', $buffPt);
+            $et->FoundTag('PreviewImage', $buffPt);
             next;
         }
         # process "metadata" section of XML index file
@@ -182,10 +182,10 @@ sub Process_iWork($$)
             },
         );
         my $tagTablePtr = GetTagTable('Image::ExifTool::iWork::Main');
-        $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
         undef $$buffPt; # (free memory now)
     }
-    delete $$exifTool{DOC_NUM};
+    delete $$et{DOC_NUM};
     return 1;
 }
 
@@ -208,7 +208,7 @@ information from Apple iWork '09 XML+ZIP files.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -8,7 +8,7 @@
 # Revisions:    Nov. 12/2003 - P. Harvey Created
 #               (See html/history.html for revision history)
 #
-# Legal:        Copyright (c) 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+# Legal:        Copyright (c) 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 #               This library is free software; you can redistribute it and/or
 #               modify it under the same terms as Perl itself.
 #------------------------------------------------------------------------------
@@ -27,7 +27,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
             %mimeType $swapBytes $swapWords $currentByteOrder %unpackStd
             %jpegMarker %specialTags);
 
-$VERSION = '9.27';
+$VERSION = '9.53';
 $RELEASE = '';
 @ISA = qw(Exporter);
 %EXPORT_TAGS = (
@@ -123,12 +123,12 @@ sub ReadValue($$$$$;$);
 # unless tweaked in BuildTagLookup::GetTableOrder().
 @loadAllTables = qw(
     PhotoMechanic Exif GeoTiff CanonRaw KyoceraRaw MinoltaRaw PanasonicRaw
-    SigmaRaw JPEG GIMP Jpeg2000 GIF BMP BMP::OS2 PICT PNG MNG DjVu OpenEXR MIFF
-    PGF PSP PhotoCD Radiance PDF PostScript Photoshop::Header FujiFilm::RAF
+    SigmaRaw JPEG GIMP Jpeg2000 GIF BMP BMP::OS2 PICT PNG MNG DjVu DPX OpenEXR
+    MIFF PGF PSP PhotoCD Radiance PDF PostScript Photoshop::Header FujiFilm::RAF
     FujiFilm::IFD Sony::SRF2 Sony::SR2SubIFD Sony::PMP ITC ID3 Vorbis Ogg APE
     APE::NewHeader APE::OldHeader MPC MPEG::Audio MPEG::Video MPEG::Xing M2TS
     QuickTime QuickTime::ImageFile Matroska MXF DV Flash Flash::FLV Real::Media
-    Real::Audio Real::Metafile RIFF AIFF ASF DICOM MIE HTML XMP::SVG EXE
+    Real::Audio Real::Metafile RIFF AIFF ASF DICOM MIE HTML XMP::SVG Torrent EXE
     EXE::PEVersion EXE::PEString EXE::MachO EXE::PEF EXE::ELF EXE::CHM LNK Font
     RSRC Rawzor ZIP ZIP::GZIP ZIP::RAR RTF OOXML iWork FLIR::FPF
 );
@@ -167,23 +167,23 @@ $defaultLang = 'en';    # default language
                 BMP PPM RIFF AIFF ASF MOV MPEG Real SWF PSP FLV OGG FLAC APE MPC
                 MKV MXF DV PMP IND PGF ICC ITC FLIR FPF HTML VRD RTF XCF QTIF
                 FPX PICT ZIP GZIP PLIST RAR BZ2 TAR RWZ EXE EXR HDR CHM LNK WMF
-                DEX RAW Font RSRC M2TS PHP MP3 DICM PCD);
+                AVC DEX DPX RAW Font RSRC M2TS PHP Torrent MP3 DICM PCD);
 
 # file types that we can write (edit)
 my @writeTypes = qw(JPEG TIFF GIF CRW MRW ORF RAF RAW PNG MIE PSD XMP PPM
-                    EPS X3F PS PDF ICC VRD JP2 EXIF AI AIT IND);
+                    EPS X3F PS PDF ICC VRD JP2 EXIF AI AIT IND MOV EXV);
 my %writeTypes; # lookup for writable file types (hash filled if required)
 
 # file extensions that we can't write for various base types
 %noWriteFile = (
-    TIFF => [ qw(3FR DCR K25 KDC SRF) ],
+    TIFF => [ qw(3FR DCR K25 KDC ) ],
     XMP  => [ 'SVG' ],
     JP2  => [ 'J2C', 'JPC' ],
 );
 
 # file types that we can create from scratch
 # - must update CanCreate() documentation if this list is changed!
-my %createTypes = (XMP=>1, ICC=>1, MIE=>1, VRD=>1, EXIF=>1);
+my %createTypes = (XMP=>1, ICC=>1, MIE=>1, VRD=>1, EXIF=>1, EXV=>1);
 
 # file type lookup for all recognized file extensions
 # (if extension may be more than one type, the type is a list where
@@ -206,6 +206,7 @@ my %fileTypeLookup = (
     APE  => ['APE',  "Monkey's Audio format"],
     ARW  => ['TIFF', 'Sony Alpha RAW format'],
     ASF  => ['ASF',  'Microsoft Advanced Systems Format'],
+    AVC  => ['AVC',  'Advanced Video Connection'], # (extensions are actually _AU,_AD,_IM,_ID)
     AVI  => ['RIFF', 'Audio Video Interleaved'],
     BMP  => ['BMP',  'Windows Bitmap'],
     BTF  => ['BTF',  'Big Tagged Image File Format'], #(unofficial)
@@ -239,6 +240,7 @@ my %fileTypeLookup = (
     DOT  => ['FPX',  'Microsoft Word Template'],
     DOTM => [['ZIP','FPX'], 'Office Open XML Document Template Macro-enabled'],
     DOTX => [['ZIP','FPX'], 'Office Open XML Document Template'],
+    DPX  => ['DPX',  'Digital Picture Exchange' ],
     DV   => ['DV',   'Digital Video'],
     DVB  => ['MOV',  'Digital Video Broadcasting'],
     DYLIB=> ['EXE',  'Mach-O Dynamic Link Library'],
@@ -251,6 +253,7 @@ my %fileTypeLookup = (
     EXE  => ['EXE',  'Windows executable file'],
     EXR  => ['EXR', 'Open EXR'],
     EXIF => ['EXIF', 'Exchangable Image File Metadata'],
+    EXV  => ['EXV',  'Exiv2 metadata'],
     F4A  => ['MOV',  'Adobe Flash Player 9+ Audio'],
     F4B  => ['MOV',  'Adobe Flash Player 9+ audio Book'],
     F4P  => ['MOV',  'Adobe Flash Player 9+ Protected'],
@@ -289,6 +292,7 @@ my %fileTypeLookup = (
     JPG  => ['JPEG', 'Joint Photographic Experts Group'],
     JPM  => ['JP2',  'JPEG 2000 compound image'],
     JPX  => ['JP2',  'JPEG 2000 with extensions'],
+    JXR  => ['TIFF', 'JPEG XR'],
     K25  => ['TIFF', 'Kodak DC25 RAW'],
     KDC  => ['TIFF', 'Kodak Digital Camera RAW'],
     KEY  => ['ZIP',  'Apple Keynote presentation'],
@@ -415,6 +419,7 @@ my %fileTypeLookup = (
     THMX => [['ZIP','FPX'], 'Office Open XML Theme'],
     TIF  =>  'TIFF',
     TIFF => ['TIFF', 'Tagged Image File Format'],
+    TORRENT => ['Torrent', 'BitTorrent description file'],
     TS   =>  'M2TS',
     TTC  => ['Font', 'True Type Font Collection'],
     TTF  => ['Font', 'True Type Font'],
@@ -487,11 +492,13 @@ my %fileDescription = (
     DOT  => 'application/msword',
     DOTM => 'application/vnd.ms-word.template.macroEnabledTemplate',
     DOTX => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
+    DPX  => 'image/x-dpx',
     DV   => 'video/x-dv',
     EIP  => 'application/x-captureone', #(NC)
     EPS  => 'application/postscript',
     ERF  => 'image/x-epson-erf',
     EXE  => 'application/octet-stream',
+    EXV  => 'image/x-exv',
     FFF  => 'image/x-hasselblad-fff',
     FLA  => 'application/vnd.adobe.fla',
     FLAC => 'audio/flac',
@@ -597,6 +604,7 @@ my %fileDescription = (
     TAR  => 'application/x-tar',
     THMX => 'application/vnd.ms-officetheme',
     TIFF => 'image/tiff',
+    TORRENT => 'application/x-bittorrent',
     TTC  => 'application/x-font-ttf',
     TTF  => 'application/x-font-ttf',
     VSD  => 'application/x-visio',
@@ -626,6 +634,7 @@ my %fileDescription = (
 # - module name '' defaults to Image::ExifTool
 # - module name '0' indicates a recognized but unsupported file
 my %moduleName = (
+    AVC  => 0,
     BTF  => 'BigTIFF',
     BZ2  => 0,
     CRW  => 'CanonRaw',
@@ -637,6 +646,7 @@ my %moduleName = (
     EPS  => 'PostScript',
     EXIF => '',
     EXR  => 'OpenEXR',
+    EXV  => '',
     ICC  => 'ICC_Profile',
     IND  => 'InDesign',
     FLV  => 'Flash',
@@ -679,6 +689,8 @@ my %moduleName = (
     AIFF => '(FORM....AIF[FC]|AT&TFORM)',
     APE  => '(MAC |APETAGEX|ID3)',
     ASF  => '\x30\x26\xb2\x75\x8e\x66\xcf\x11\xa6\xd9\x00\xaa\x00\x62\xce\x6c',
+    AVC  => '\+A\+V\+C\+',
+    Torrent => 'd\d+:\w+',
     BMP  => 'BM',
     BTF  => '(II\x2b\0|MM\0\x2b)',
     BZ2  => 'BZh[1-9]\x31\x41\x59\x26\x53\x59',
@@ -687,11 +699,13 @@ my %moduleName = (
     DEX  => "dex\n035\0",
     DICM => '(.{128}DICM|\0[\x02\x04\x06\x08]\0[\0-\x20]|[\x02\x04\x06\x08]\0[\0-\x20]\0)',
     DOCX => 'PK\x03\x04',
+    DPX  => '(SDPX|XPDS)',
     DV   => '\x1f\x07\0[\x3f\xbf]', # (not tested if extension recognized)
     EPS  => '(%!PS|%!Ad|\xc5\xd0\xd3\xc6)',
     EXE  => '(MZ|\xca\xfe\xba\xbe|\xfe\xed\xfa[\xce\xcf]|[\xce\xcf]\xfa\xed\xfe|Joy!peff|\x7fELF|#!\s*/\S*bin/|!<arch>\x0a)',
     EXIF => '(II\x2a\0|MM\0\x2a)',
     EXR  => '\x76\x2f\x31\x01',
+    EXV  => '\xff\x01Exiv2',
     FLAC => '(fLaC|ID3)',
     FLIR => 'FFF\0',
     FLV  => 'FLV\x01',
@@ -702,18 +716,18 @@ my %moduleName = (
     GIF  => 'GIF8[79]a',
     GZIP => '\x1f\x8b\x08',
     HDR  => '#\?(RADIANCE|RGBE)\x0a',
-    HTML => '(?i)<(!DOCTYPE\s+HTML|HTML|\?xml)', # (case insensitive)
+    HTML => '\s*(?i)<(!DOCTYPE\s+HTML|HTML|\?xml)', # (case insensitive)
     ICC  => '.{12}(scnr|mntr|prtr|link|spac|abst|nmcl|nkpf)(XYZ |Lab |Luv |YCbr|Yxy |RGB |GRAY|HSV |HLS |CMYK|CMY |[2-9A-F]CLR){2}',
     IND  => '\x06\x06\xed\xf5\xd8\x1d\x46\xe5\xbd\x31\xef\xe7\xfe\x74\xb7\x1d',
     ITC  => '.{4}itch',
     JP2  => '(\0\0\0\x0cjP(  |\x1a\x1a)\x0d\x0a\x87\x0a|\xff\x4f\xff\x51\0)',
-    JPEG => '\xff\xd8\xff',
+    JPEG => '\xff(\xd8\xff|\x01Exiv2)', # (includes EXV so we don't have to add EXV to @fileTypes)
     LNK  => '.{4}\x01\x14\x02\0{5}\xc0\0{6}\x46',
     M2TS => '(....)?\x47',
     MIE  => '~[\x10\x18]\x04.0MIE',
     MIFF => 'id=ImageMagick',
     MKV  => '\x1a\x45\xdf\xa3',
-    MOV  => '.{4}(free|skip|wide|ftyp|pnot|PICT|pict|moov|mdat|junk|uuid)',
+    MOV  => '.{4}(free|skip|wide|ftyp|pnot|PICT|pict|moov|mdat|junk|uuid)', # (duplicated in WriteQuickTime.pl !!)
   # MP3  =>  difficult to rule out
     MPC  => '(MP\+|ID3)',
     MPEG => '\0\0\x01[\xb0-\xbf]',
@@ -756,6 +770,9 @@ my %moduleName = (
     ZIP  => 'PK\x03\x04',
 );
 
+# file types with weak magic number recognition
+my %weakMagic = ( MP3 => 1 );
+
 # lookup for valid character set names (keys are all lower case)
 %charsetName = (
     #   Charset setting                       alias(es)
@@ -837,8 +854,26 @@ sub DummyWriteProc { return 1; }
     GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' },
     VARS => { NO_ID => 1 }, # tag ID's aren't meaningful for these tags
     WRITE_PROC => \&DummyWriteProc,
-    Error   => { Priority => 0, Groups => \%allGroupsExifTool },
-    Warning => { Priority => 0, Groups => \%allGroupsExifTool },
+    Error   => {
+        Priority => 0,
+        Groups => \%allGroupsExifTool,
+        Notes => q{
+            returns errors that may have occurred while reading or writing a file.  Any
+            Error will prevent the file from being processed.  Minor errors may be
+            downgraded to warnings with the -m or IgnoreMinorErrors option
+        },
+    },
+    Warning => {
+        Priority => 0,
+        Groups => \%allGroupsExifTool,
+        Notes => q{
+            returns warnings that may have occurred while reading or writing a file. 
+            Use the -a or Duplicates option to see all warnings if more than one
+            occurred. Minor warnings may be ignored with the -m or IgnoreMinorErrors
+            option.  Minor warnings with a capital "M" in the "[Minor]" designation
+            indicate that the processing is affected by ignoring the warning
+        },
+    },
     Comment => {
         Notes => 'comment embedded in JPEG, GIF89a or PPM/PGM/PBM image',
         Writable => 1,
@@ -848,8 +883,9 @@ sub DummyWriteProc { return 1; }
     Directory => {
         Groups => { 1 => 'System' },
         Notes => q{
-            may be written to move the file to a specified directory. New directories
-            are created as necessary
+            the directory of the file as specified in the call to ExifTool, or "." if no
+            directory was specified.  May be written to move the file to another
+            directory that will be created if doesn't already exist
         },
         Writable => 1,
         Protected => 1,
@@ -870,9 +906,10 @@ sub DummyWriteProc { return 1; }
     FileSequence => {
         Groups => { 0 => 'ExifTool', 1 => 'ExifTool', 2 => 'Other' },
         Notes => q{
-            sequence number for each processed file when extracting or copying
-            information, beginning at 0 for the first file.  Not generated unless
-            specifically requested
+            sequence number for each source file when extracting or copying information,
+            including files that fail the -if condition of the command-line application,
+            beginning at 0 for the first file.  Not generated unless specifically
+            requested
         },
     },
     FileSize => {
@@ -894,7 +931,12 @@ sub DummyWriteProc { return 1; }
         },
         PrintConv => \&ConvertFileSize,
     },
-    FileType    => { },
+    FileType => {
+        Notes => q{
+            a short description of the file type.  As a general rule, this is the
+            extension commonly used for the file, but there are exceptions to this rule
+        },
+    },
     FileModifyDate => {
         Description => 'File Modification Date/Time',
         Notes => q{
@@ -979,7 +1021,7 @@ sub DummyWriteProc { return 1; }
             return $str;
         },
     },
-    MIMEType    => { },
+    MIMEType    => { Notes => 'the MIME type of the source file' },
     ImageWidth  => { },
     ImageHeight => { },
     XResolution => { },
@@ -1005,7 +1047,10 @@ sub DummyWriteProc { return 1; }
         },
     },
     XMP => {
-        Notes => 'the full XMP data block',
+        Notes => q{
+            the XMP data block, but note that extended XMP in JPEG images may be split
+            into multiple blocks
+        },
         Groups => { 0 => 'XMP', 1 => 'XMP' },
         Flags => ['Writable', 'Protected', 'Binary'],
         Priority => 0,  # so main xmp (which usually comes first) takes priority
@@ -1091,6 +1136,15 @@ sub DummyWriteProc { return 1; }
     ExifToolVersion => {
         Description => 'ExifTool Version Number',
         Groups => \%allGroupsExifTool,
+        Notes => 'the version of ExifTool currently running',
+    },
+    ProcessingTime => {
+        Groups => { 0 => 'ExifTool', 1 => 'ExifTool', 2 => 'Other' },
+        Notes => q{
+            the clock time in seconds taken by ExifTool to extract information from this
+            file.  Not generated unless specifically requested.  Requires Time::HiRes
+        },
+        PrintConv => 'sprintf("%.3f s", $val)',
     },
     RAFVersion => { },
     JPEGDigest => {
@@ -1250,6 +1304,7 @@ sub DummyWriteProc { return 1; }
         Name => 'JFIFVersion',
         Format => 'int8u[2]',
         PrintConv => 'sprintf("%d.%.2d", split(" ",$val))',
+        Mandatory => 1,
     },
     2 => {
         Name => 'ResolutionUnit',
@@ -1261,6 +1316,7 @@ sub DummyWriteProc { return 1; }
             2 => 'cm',
         },
         Priority => -1,
+        Mandatory => 1,
     },
     3 => {
         Name => 'XResolution',
@@ -1268,6 +1324,7 @@ sub DummyWriteProc { return 1; }
         Writable => 1,
         Priority => -1,
         RawConv => '$$self{JFIFXResolution} = $val',
+        Mandatory => 1,
     },
     5 => {
         Name => 'YResolution',
@@ -1275,6 +1332,7 @@ sub DummyWriteProc { return 1; }
         Writable => 1,
         Priority => -1,
         RawConv => '$$self{JFIFYResolution} = $val',
+        Mandatory => 1,
     },
 );
 %Image::ExifTool::JFIF::Extension = (
@@ -1339,10 +1397,10 @@ sub new
     GetTagTable("Image::ExifTool::Exif::Main");
 
     $self->ClearOptions();      # create default options hash
-    $self->{VALUE} = { };       # must initialize this for warning messages
-    $self->{DEL_GROUP} = { };   # lookup for groups to delete when writing
-    $self->{SAVE_COUNT} = 0;    # count calls to SaveNewValues()
-    $self->{FILE_SEQUENCE} = 0; # sequence number for files when reading
+    $$self{VALUE} = { };        # must initialize this for warning messages
+    $$self{DEL_GROUP} = { };    # lookup for groups to delete when writing
+    $$self{SAVE_COUNT} = 0;     # count calls to SaveNewValues()
+    $$self{FILE_SEQUENCE} = 0;  # sequence number for files when reading
 
     # initialize our new groups for writing
     $self->SetNewGroups(@defaultWriteGroups);
@@ -1368,8 +1426,8 @@ sub new
 #   use Image::ExifTool 'ImageInfo';
 #   my $info = ImageInfo($file, 'DateTimeOriginal', 'ImageSize');
 #    - or -
-#   my $exifTool = new Image::ExifTool;
-#   my $info = $exifTool->ImageInfo($file, \@tagList, {Sort=>'Group0'} );
+#   my $et = new Image::ExifTool;
+#   my $info = $et->ImageInfo($file, \@tagList, {Sort=>'Group0'} );
 sub ImageInfo($;@)
 {
     local $_;
@@ -1380,16 +1438,16 @@ sub ImageInfo($;@)
     } else {
         $self = new Image::ExifTool;
     }
-    my %saveOptions = %{$self->{OPTIONS}};  # save original options
+    my %saveOptions = %{$$self{OPTIONS}};   # save original options
 
     # initialize file information
-    $self->{FILENAME} = $self->{RAF} = undef;
+    $$self{FILENAME} = $$self{RAF} = undef;
 
     $self->ParseArguments(@_);              # parse our function arguments
     $self->ExtractInfo(undef);              # extract meta information from image
     my $info = $self->GetInfo(undef);       # get requested information
 
-    $self->{OPTIONS} = \%saveOptions;       # restore original options
+    $$self{OPTIONS} = \%saveOptions;        # restore original options
 
     return $info;   # return requested information
 }
@@ -1397,7 +1455,7 @@ sub ImageInfo($;@)
 #------------------------------------------------------------------------------
 # Get/set ExifTool options
 # Inputs: 0) ExifTool object reference,
-#         1) Parameter name, 2) Value to set the option
+#         1) Parameter name (case insensitive), 2) Value to set the option
 #         3-N) More parameter/value pairs
 # Returns: original value of last option specified
 sub Options($$;@)
@@ -1409,6 +1467,15 @@ sub Options($$;@)
 
     while (@_) {
         my $param = shift;
+        # fix parameter case if necessary
+        unless (exists $$options{$param}) {
+            my ($fixed) = grep /^$param$/i, keys %$options;
+            if ($fixed) {
+                $param = $fixed;
+            } else {
+                $param =~ s/^Group(\d*)$/Group$1/i;
+            }
+        }
         $oldVal = $$options{$param};
         last unless @_;
         my $newVal = shift;
@@ -1468,7 +1535,7 @@ sub Options($$;@)
                     delete $$self{ESCAPE_PROC};
                 }
                 # must forget saved values since they depend on Escape method
-                $self->{BOTH} = { };
+                $$self{BOTH} = { };
             }
             $$options{$param} = $newVal;
         }
@@ -1485,55 +1552,59 @@ sub ClearOptions($)
     my $self = shift;
 
     # create options hash with default values
-    # (commented out options don't need initializing)
     # +-----------------------------------------------------+
     # ! DON'T FORGET!!  When adding any new option, must    !
     # ! decide how it is handled in SetNewValuesFromFile()  !
     # +-----------------------------------------------------+
-    $self->{OPTIONS} = {
-    #   Binary      => undef,   # flag to extract binary values even if tag not specified
-    #   ByteOrder   => undef,   # default byte order when creating EXIF information
+    # (Note: All options must exist in this lookup, even if undefined,
+    # to facilitate case-insensitive options. 'Group#' is handled specially)
+    $$self{OPTIONS} = {
+        Binary      => undef,   # flag to extract binary values even if tag not specified
+        ByteOrder   => undef,   # default byte order when creating EXIF information
         Charset     => 'UTF8',  # character set for converting Unicode characters
-    #   CharsetEXIF => undef,   # internal EXIF "ASCII" string encoding
+        CharsetEXIF => undef,   # internal EXIF "ASCII" string encoding
         CharsetID3  => 'Latin', # internal ID3v1 character set
         CharsetIPTC => 'Latin', # fallback IPTC character set if no CodedCharacterSet
         CharsetQuickTime => 'MacRoman', # internal QuickTime string encoding
-    #   Compact     => undef,   # compact XMP and IPTC data
+        Compact     => undef,   # compact XMP and IPTC data
         Composite   => 1,       # flag to calculate Composite tags
-    #   Compress    => undef,   # flag to write new values as compressed if possible
-    #   CoordFormat => undef,   # GPS lat/long coordinate format
-    #   DateFormat  => undef,   # format for date/time
+        Compress    => undef,   # flag to write new values as compressed if possible
+        CoordFormat => undef,   # GPS lat/long coordinate format
+        DateFormat  => undef,   # format for date/time
         Duplicates  => 1,       # flag to save duplicate tag values
-    #   Escape      => undef,   # escape special characters
-    #   Exclude     => undef,   # tags to exclude
-    #   ExtractEmbedded =>undef,# flag to extract information from embedded documents
-    #   FastScan    => undef,   # flag to avoid scanning for trailer
-    #   FixBase     => undef,   # fix maker notes base offsets
-    #   GeoMaxIntSecs => undef, # geotag maximum interpolation time (secs)
-    #   GeoMaxExtSecs => undef, # geotag maximum extrapolation time (secs)
-    #   GeoMaxHDOP  => undef,   # geotag maximum HDOP
-    #   GeoMaxPDOP  => undef,   # geotag maximum PDOP
-    #   GeoMinSats  => undef,   # geotag minimum satellites
+        Escape      => undef,   # escape special characters
+        Exclude     => undef,   # tags to exclude
+        ExtractEmbedded =>undef,# flag to extract information from embedded documents
+        FastScan    => undef,   # flag to avoid scanning for trailer
+        FixBase     => undef,   # fix maker notes base offsets
+        GeoMaxIntSecs => undef, # geotag maximum interpolation time (secs)
+        GeoMaxExtSecs => undef, # geotag maximum extrapolation time (secs)
+        GeoMaxHDOP  => undef,   # geotag maximum HDOP
+        GeoMaxPDOP  => undef,   # geotag maximum PDOP
+        GeoMinSats  => undef,   # geotag minimum satellites
+        GlobalTimeShift => undef,   # apply time shift to all extracted date/time values
     #   Group#      => undef,   # return tags for specified groups in family #
         HtmlDump    => 0,       # HTML dump (0-3, higher # = bigger limit)
-    #   HtmlDumpBase => undef,  # base address for HTML dump
-    #   IgnoreMinorErrors => undef, # ignore minor errors when reading/writing
+        HtmlDumpBase => undef,  # base address for HTML dump
+        IgnoreMinorErrors => undef, # ignore minor errors when reading/writing
         Lang        => $defaultLang,# localized language for descriptions etc
-    #   LargeFileSupport => undef,  # flag indicating support of 64-bit file offsets
-    #   List        => undef,   # extract lists of PrintConv values into arrays
+        LargeFileSupport => undef,  # flag indicating support of 64-bit file offsets
+        List        => undef,   # extract lists of PrintConv values into arrays
         ListSep     => ', ',    # list item separator
-    #   ListSplit   => undef,   # regex for splitting list-type tag values when writing
-    #   MakerNotes  => undef,   # extract maker notes as a block
-    #   MissingTagValue =>undef,# value for missing tags when expanded in expressions
-    #   Password    => undef,   # password for password-protected PDF documents
+        ListSplit   => undef,   # regex for splitting list-type tag values when writing
+        MakerNotes  => undef,   # extract maker notes as a block
+        MissingTagValue =>undef,# value for missing tags when expanded in expressions
+        Password    => undef,   # password for password-protected PDF documents
+        PNGEarlyXMP => undef,   # write XMP in PNG images before IDAT chunk
         PrintConv   => 1,       # flag to enable print conversion
-    #   QuickTimeUTC=> undef,   # assume that QuickTime date/time tags are stored as UTC
-    #   SavePath    => undef,   # (undocumented) save family 5 location path
-    #   ScanForXMP  => undef,   # flag to scan for XMP information in all files
+        QuickTimeUTC=> undef,   # assume that QuickTime date/time tags are stored as UTC
+        RequestAll  => undef,   # extract all tags that must be specifically requested
+        SavePath    => undef,   # (undocumented) save family 5 location path
+        ScanForXMP  => undef,   # flag to scan for XMP information in all files
         Sort        => 'Input', # order to sort found tags (Input, File, Tag, Descr, Group#)
-    #   Sort2       => undef,   # secondary sort order for tags in a group (File, Tag, Descr)
-    #   StrictDate  => undef,   # flag to return undef for invalid date conversions
-    #   Struct      => undef,   # return structures as hash references
+        Sort2       => undef,   # secondary sort order for tags in a group (File, Tag, Descr)
+        StrictDate  => undef,   # flag to return undef for invalid date conversions
+        Struct      => undef,   # return structures as hash references
         TextOut     => \*STDOUT,# file for Verbose/HtmlDump output
         Unknown     => 0,       # flag to get values of unknown tags (0-2)
         Verbose     => 0,       # print verbose messages (0-5, higher # = more verbose)
@@ -1563,8 +1634,8 @@ sub ExtractInfo($;@)
 {
     local $_;
     my $self = shift;
-    my $options = $self->{OPTIONS};     # pointer to current options
-    my (%saveOptions, $reEntry, $rsize, $type);
+    my $options = $$self{OPTIONS};      # pointer to current options
+    my (%saveOptions, $reEntry, $rsize, $type, @startTime);
 
     # check for internal ReEntry option to allow recursive calls to ExtractInfo
     if (ref $_[1] eq 'HASH' and $_[1]{ReEntry} and
@@ -1578,21 +1649,21 @@ sub ExtractInfo($;@)
             EXIF_POS  => $$self{EXIF_POS},
             FILE_TYPE => $$self{FILE_TYPE},
         };
-        $self->{RAF} = new File::RandomAccess($_[0]);
+        $$self{RAF} = new File::RandomAccess($_[0]);
         $$self{PROCESSED} = { };
         delete $$self{EXIF_DATA};
         delete $$self{EXIF_POS};
     } else {
-        if (defined $_[0] or $options->{HtmlDump}) {
+        if (defined $_[0] or $$options{HtmlDump}) {
             %saveOptions = %$options;       # save original options
 
             # require duplicates for html dump
-            $self->Options(Duplicates => 1) if $options->{HtmlDump};
+            $self->Options(Duplicates => 1) if $$options{HtmlDump};
 
             if (defined $_[0]) {
                 # only initialize filename if called with arguments
-                $self->{FILENAME} = undef;  # name of file (or '' if we didn't open it)
-                $self->{RAF} = undef;       # RandomAccess object reference
+                $$self{FILENAME} = undef;   # name of file (or '' if we didn't open it)
+                $$self{RAF} = undef;        # RandomAccess object reference
 
                 $self->ParseArguments(@_);  # initialize from our arguments
             }
@@ -1600,22 +1671,28 @@ sub ExtractInfo($;@)
         # initialize ExifTool object members
         $self->Init();
 
-        delete $self->{MAKER_NOTE_FIXUP};   # fixup information for extracted maker notes
-        delete $self->{MAKER_NOTE_BYTE_ORDER};
+        delete $$self{MAKER_NOTE_FIXUP};    # fixup information for extracted maker notes
+        delete $$self{MAKER_NOTE_BYTE_ORDER};
 
         # return our version number
-        my $reqAll = $self->{OPTIONS}{RequestAll};
+        my $reqAll = $$self{OPTIONS}{RequestAll};
         $self->FoundTag('ExifToolVersion', "$VERSION$RELEASE");
-        $self->FoundTag('Now', TimeNow()) if $self->{REQ_TAG_LOOKUP}{now} or $reqAll;
-        $self->FoundTag('NewGUID', NewGUID()) if $self->{REQ_TAG_LOOKUP}{newguid} or $reqAll;
+        $self->FoundTag('Now', TimeNow()) if $$self{REQ_TAG_LOOKUP}{now} or $reqAll;
+        $self->FoundTag('NewGUID', NewGUID()) if $$self{REQ_TAG_LOOKUP}{newguid} or $reqAll;
         # generate sequence number if necessary
-        if ($self->{REQ_TAG_LOOKUP}{filesequence} or $reqAll) {
+        if ($$self{REQ_TAG_LOOKUP}{filesequence} or $reqAll) {
             $self->FoundTag('FileSequence', $$self{FILE_SEQUENCE});
         }
+        if ($$self{REQ_TAG_LOOKUP}{processingtime} or $reqAll) {
+            eval { require Time::HiRes; @startTime = Time::HiRes::gettimeofday() };
+            if (not @startTime and $$self{REQ_TAG_LOOKUP}{processingtime}) {
+                $self->WarnOnce('Install Time::HiRes to generate ProcessingTime');
+            }
+        }
         ++$$self{FILE_SEQUENCE};        # count files read
     }
-    my $filename = $self->{FILENAME};   # image file name ('' if already open)
-    my $raf = $self->{RAF};             # RandomAccess object
+    my $filename = $$self{FILENAME};    # image file name ('' if already open)
+    my $raf = $$self{RAF};              # RandomAccess object
 
     local *EXIFTOOL_FILE;   # avoid clashes with global namespace
 
@@ -1625,9 +1702,9 @@ sub ExtractInfo($;@)
         if (defined $filename and $filename ne '') {
             unless ($filename eq '-') {
                 # extract file name from pipe if necessary
-                $realname =~ /\|$/ and $realname =~ s/.*?"(.*?)".*/$1/;
+                $realname =~ /\|$/ and $realname =~ s/^.*?"(.*?)".*/$1/s;
                 my ($dir, $name);
-                if (eval 'require File::Basename') {
+                if (eval { require File::Basename }) {
                     $dir = File::Basename::dirname($realname);
                     $name = File::Basename::basename($realname);
                 } else {
@@ -1646,8 +1723,8 @@ sub ExtractInfo($;@)
                 $raf = new File::RandomAccess(\*EXIFTOOL_FILE);
                 # patch to force pipe to be buffered because seek returns success
                 # in Windows cmd shell pipe even though it really failed
-                $raf->{TESTED} = -1 if $filename eq '-' or $filename =~ /\|$/;
-                $self->{RAF} = $raf;
+                $$raf{TESTED} = -1 if $filename eq '-' or $filename =~ /\|$/;
+                $$self{RAF} = $raf;
             } else {
                 $self->Error('Error opening file');
             }
@@ -1659,10 +1736,10 @@ sub ExtractInfo($;@)
     if ($raf) {
         if ($reEntry) {
             # we already set these tags
-        } elsif (not $raf->{FILE_PT}) {
+        } elsif (not $$raf{FILE_PT}) {
             # get file size from image in memory
-            $self->FoundTag('FileSize', length ${$raf->{BUFF_PT}});
-        } elsif (-f $raf->{FILE_PT}) {
+            $self->FoundTag('FileSize', length ${$$raf{BUFF_PT}});
+        } elsif (-f $$raf{FILE_PT}) {
             # get file size and last modified time if this is a plain file
             my $fileSize = -s _;
             my $fileTime = -M _;
@@ -1671,16 +1748,19 @@ sub ExtractInfo($;@)
             my @stat = stat _;
             $self->FoundTag('FileSize', $fileSize) if defined $fileSize;
             $self->FoundTag('ResourceForkSize', $rsize) if $rsize;
-            $self->FoundTag('FileModifyDate', $^T - $fileTime*(24*3600)) if defined $fileTime;
-            $self->FoundTag('FileAccessDate', $^T - $accTime*(24*3600)) if defined $accTime;
+            $self->FoundTag('FileModifyDate', int($^T - $fileTime*(24*3600) + 0.5)) if defined $fileTime;
+            $self->FoundTag('FileAccessDate', int($^T - $accTime*(24*3600) + 0.5)) if defined $accTime;
             my $cTag = $^O eq 'MSWin32' ? 'FileCreateDate' : 'FileInodeChangeDate';
-            $self->FoundTag($cTag, $^T - $cTime*(24*3600));
+            $self->FoundTag($cTag, int($^T - $cTime*(24*3600) + 0.5));
             $self->FoundTag('FilePermissions', $stat[2]) if defined $stat[2];
         }
 
         # get list of file types to check
-        my ($tiffType, %noMagic);
-        $$self{FILE_EXT} = GetFileExtension($realname);
+        my ($tiffType, %noMagic, $recognizedExt);
+        my $ext = $$self{FILE_EXT} = GetFileExtension($realname);
+        # set $recognizedExt if this file type is recognized by extension only
+        $recognizedExt = $ext if defined $ext and not defined $magicNumber{$ext} and
+                                 defined $moduleName{$ext} and not $moduleName{$ext};
         my @fileTypeList = GetFileType($realname);
         if (@fileTypeList) {
             # add remaining types to end of list so we test them all
@@ -1710,8 +1790,12 @@ sub ExtractInfo($;@)
                 # do quick test for this file type to avoid loading module unnecessarily
                 next if $magicNumber{$type} and $buff !~ /^$magicNumber{$type}/s and
                         not $noMagic{$type};
+                next if $weakMagic{$type} and defined $recognizedExt;
+            } elsif (not defined $type) {
+                last;
+            } elsif ($recognizedExt) {
+                $type = $recognizedExt; # set type from recognized file extension only
             } else {
-                last unless defined $type;
                 # last ditch effort to scan past unknown header for JPEG/TIFF
                 next unless $buff =~ /(\xff\xd8\xff|MM\0\x2a|II\x2a\0)/g;
                 $type = ($1 eq "\xff\xd8\xff") ? 'JPEG' : 'TIFF';
@@ -1721,7 +1805,7 @@ sub ExtractInfo($;@)
                 $self->Warn("Skipped unknown $skip byte header");
             }
             # save file type in member variable
-            $self->{FILE_TYPE} = $type;
+            $$self{FILE_TYPE} = $type;
             $dirInfo{Parent} = ($type eq 'TIFF') ? $tiffType : $type;
             my $module = $moduleName{$type};
             $module = $type unless defined $module;
@@ -1776,35 +1860,35 @@ sub ExtractInfo($;@)
             $self->Error($err);
         }
         # extract binary EXIF data block only if requested
-        if (defined $self->{EXIF_DATA} and length $$self{EXIF_DATA} > 16 and
-            ($self->{REQ_TAG_LOOKUP}{exif} or
+        if (defined $$self{EXIF_DATA} and length $$self{EXIF_DATA} > 16 and
+            ($$self{REQ_TAG_LOOKUP}{exif} or
             # (not extracted normally, so check TAGS_FROM_FILE)
-            ($self->{TAGS_FROM_FILE} and not $self->{EXCL_TAG_LOOKUP}{exif})))
+            ($$self{TAGS_FROM_FILE} and not $$self{EXCL_TAG_LOOKUP}{exif})))
         {
-            $self->FoundTag('EXIF', $self->{EXIF_DATA});
+            $self->FoundTag('EXIF', $$self{EXIF_DATA});
         }
         unless ($reEntry) {
-            $self->{PATH} = [ ];    # reset PATH
+            $$self{PATH} = [ ];     # reset PATH
             # calculate Composite tags
-            $self->BuildCompositeTags() if $options->{Composite};
+            $self->BuildCompositeTags() if $$options{Composite};
             # do our HTML dump if requested
-            if ($self->{HTML_DUMP}) {
+            if ($$self{HTML_DUMP}) {
                 $raf->Seek(0, 2);   # seek to end of file
-                $self->{HTML_DUMP}->FinishTiffDump($self, $raf->Tell());
-                my $pos = $options->{HtmlDumpBase};
-                $pos = ($self->{FIRST_EXIF_POS} || 0) unless defined $pos;
-                my $dataPt = defined $self->{EXIF_DATA} ? \$self->{EXIF_DATA} : undef;
-                undef $dataPt if defined $self->{EXIF_POS} and $pos != $self->{EXIF_POS};
-                my $success = $self->{HTML_DUMP}->Print($raf, $dataPt, $pos,
-                    $options->{TextOut}, $options->{HtmlDump},
-                    $self->{FILENAME} ? "HTML Dump ($self->{FILENAME})" : 'HTML Dump');
-                $self->Warn("Error reading $self->{HTML_DUMP}{ERROR}") if $success < 0;
+                $$self{HTML_DUMP}->FinishTiffDump($self, $raf->Tell());
+                my $pos = $$options{HtmlDumpBase};
+                $pos = ($$self{FIRST_EXIF_POS} || 0) unless defined $pos;
+                my $dataPt = defined $$self{EXIF_DATA} ? \$$self{EXIF_DATA} : undef;
+                undef $dataPt if defined $$self{EXIF_POS} and $pos != $$self{EXIF_POS};
+                my $success = $$self{HTML_DUMP}->Print($raf, $dataPt, $pos,
+                    $$options{TextOut}, $$options{HtmlDump},
+                    $$self{FILENAME} ? "HTML Dump ($$self{FILENAME})" : 'HTML Dump');
+                $self->Warn("Error reading $$self{HTML_DUMP}{ERROR}") if $success < 0;
             }
         }
         if ($filename) {
             $raf->Close();  # close the file if we opened it
             # process the resource fork as an embedded file on Mac filesystems
-            if ($rsize and $options->{ExtractEmbedded}) {
+            if ($rsize and $$options{ExtractEmbedded}) {
                 local *RESOURCE_FILE;
                 if (Open(\*RESOURCE_FILE, "$filename/..namedfork/rsrc")) {
                     $$self{DOC_NUM} = $$self{DOC_COUNT} + 1;
@@ -1818,9 +1902,10 @@ sub ExtractInfo($;@)
             }
         }
     }
+    @startTime and $self->FoundTag('ProcessingTime', Time::HiRes::tv_interval(\@startTime));
 
     # restore original options
-    %saveOptions and $self->{OPTIONS} = \%saveOptions;
+    %saveOptions and $$self{OPTIONS} = \%saveOptions;
 
     if ($reEntry) {
         # restore necessary members when exiting re-entrant code
@@ -1828,7 +1913,7 @@ sub ExtractInfo($;@)
     }
 
     # ($type may be undef without an Error when processing sub-documents)
-    return 0 if not defined $type or exists $self->{VALUE}{Error};
+    return 0 if not defined $type or exists $$self{VALUE}{Error};
     return 1;
 }
 
@@ -1848,9 +1933,9 @@ sub GetInfo($;@)
     my %saveOptions;
 
     unless (@_ and not defined $_[0]) {
-        %saveOptions = %{$self->{OPTIONS}}; # save original options
+        %saveOptions = %{$$self{OPTIONS}}; # save original options
         # must set FILENAME so it isn't parsed from the arguments
-        $self->{FILENAME} = '' unless defined $self->{FILENAME};
+        $$self{FILENAME} = '' unless defined $$self{FILENAME};
         $self->ParseArguments(@_);
     }
 
@@ -1859,7 +1944,7 @@ sub GetInfo($;@)
 
     # build hash of tag information
     my (%info, %ignored);
-    my $conv = $self->{OPTIONS}{PrintConv} ? 'PrintConv' : 'ValueConv';
+    my $conv = $$self{OPTIONS}{PrintConv} ? 'PrintConv' : 'ValueConv';
     foreach (@$rtnTags) {
         my $val = $self->GetValue($_, $conv);
         defined $val or $ignored{$_} = 1, next;
@@ -1894,14 +1979,14 @@ sub GetInfo($;@)
     }
 
     # remove ignored tags from the list
-    my $reqTags = $self->{REQUESTED_TAGS} || [ ];
+    my $reqTags = $$self{REQUESTED_TAGS} || [ ];
     if (%ignored) {
         if (not @$reqTags) {
             my @goodTags;
             foreach (@$rtnTags) {
                 push @goodTags, $_ unless $ignored{$_};
             }
-            $rtnTags = $self->{FOUND_TAGS} = \@goodTags;
+            $rtnTags = $$self{FOUND_TAGS} = \@goodTags;
         } elsif (@$wildTags) {
             # only remove tags specified by wildcard
             my @goodTags;
@@ -1915,22 +2000,22 @@ sub GetInfo($;@)
                 }
                 ++$i;
             }
-            $rtnTags = $self->{FOUND_TAGS} = \@goodTags;
+            $rtnTags = $$self{FOUND_TAGS} = \@goodTags;
         }
     }
 
     # return sorted tag list if provided with a list reference
-    if ($self->{IO_TAG_LIST}) {
+    if ($$self{IO_TAG_LIST}) {
         # use file order by default if no tags specified
         # (no such thing as 'Input' order in this case)
-        my $sort = $self->{OPTIONS}{Sort};
+        my $sort = $$self{OPTIONS}{Sort};
         $sort = 'File' unless @$reqTags or ($sort and $sort ne 'Input');
         # return tags in specified sort order
-        @{$self->{IO_TAG_LIST}} = $self->GetTagList($rtnTags, $sort, $self->{OPTIONS}{Sort2});
+        @{$$self{IO_TAG_LIST}} = $self->GetTagList($rtnTags, $sort, $$self{OPTIONS}{Sort2});
     }
 
     # restore original options
-    %saveOptions and $self->{OPTIONS} = \%saveOptions;
+    %saveOptions and $$self{OPTIONS} = \%saveOptions;
 
     return \%info;
 }
@@ -1946,7 +2031,7 @@ sub CombineInfo($;@)
     my $self = shift;
     my (%combinedInfo, $info, $tag, %haveInfo);
 
-    if ($self->{OPTIONS}{Duplicates}) {
+    if ($$self{OPTIONS}{Duplicates}) {
         while ($info = shift) {
             foreach $tag (keys %$info) {
                 $combinedInfo{$tag} = $$info{$tag};
@@ -1983,7 +2068,7 @@ sub GetTagList($;$$$)
     } elsif (ref $info eq 'ARRAY') {
         $foundTags = $info;
     }
-    my $fileOrder = $self->{FILE_ORDER};
+    my $fileOrder = $$self{FILE_ORDER};
 
     if ($foundTags) {
         # make sure a FILE_ORDER entry exists for all tags
@@ -1994,9 +2079,9 @@ sub GetTagList($;$$$)
         }
     } else {
         $sort = $info if $info and not $sort;
-        $foundTags = $self->{FOUND_TAGS} || $self->SetFoundTags() or return undef;
+        $foundTags = $$self{FOUND_TAGS} || $self->SetFoundTags() or return undef;
     }
-    $sort or $sort = $self->{OPTIONS}{Sort};
+    $sort or $sort = $$self{OPTIONS}{Sort};
 
     # return original list if no sort order specified
     return @$foundTags unless $sort and $sort ne 'Input';
@@ -2016,7 +2101,7 @@ sub GetTagList($;$$$)
             $num or $num = $groupCount{$group} = ++$numGroups;
             $groupOrder{$tag} = $num;
         }
-        $sort2 or $sort2 = $self->{OPTIONS}{Sort2};
+        $sort2 or $sort2 = $$self{OPTIONS}{Sort2};
         if ($sort2) {
             if ($sort2 eq 'Tag' or $sort2 eq 'Alpha') {
                 return sort { $groupOrder{$a} <=> $groupOrder{$b} or $a cmp $b } @$foundTags;
@@ -2046,7 +2131,7 @@ sub GetFoundTags($;$$)
 {
     local $_;
     my ($self, $sort, $sort2) = @_;
-    my $foundTags = $self->{FOUND_TAGS} || $self->SetFoundTags() or return undef;
+    my $foundTags = $$self{FOUND_TAGS} || $self->SetFoundTags() or return undef;
     return $self->GetTagList($foundTags, $sort, $sort2);
 }
 
@@ -2077,13 +2162,13 @@ sub GetValue($$;$)
 
     # figure out what conversions to do
     if ($type) {
-        return $self->{RATIONAL}{$tag} if $type eq 'Rational';
+        return $$self{RATIONAL}{$tag} if $type eq 'Rational';
     } else {
-        $type = $self->{OPTIONS}{PrintConv} ? 'PrintConv' : 'ValueConv';
+        $type = $$self{OPTIONS}{PrintConv} ? 'PrintConv' : 'ValueConv';
     }
 
     # start with the raw value
-    my $value = $self->{VALUE}{$tag};
+    my $value = $$self{VALUE}{$tag};
     if (not defined $value) {
         return wantarray ? () : undef unless ref $tag;
         # get the value of a structure field
@@ -2096,7 +2181,7 @@ sub GetValue($$;$)
             push @convTypes, 'PrintConv' unless $type eq 'ValueConv';
         }
     } else {
-        $tagInfo = $self->{TAG_INFO}{$tag};
+        $tagInfo = $$self{TAG_INFO}{$tag};
         if ($$tagInfo{Struct} and ref $value) {
             # must load XMPStruct.pl just in case (should already be loaded if
             # a structure was extracted, but we could also arrive here if a simple
@@ -2114,7 +2199,7 @@ sub GetValue($$;$)
         }
         if ($type ne 'Raw') {
             # use values we calculated already if we stored them
-            $both = $self->{BOTH}{$tag};
+            $both = $$self{BOTH}{$tag};
             if ($both) {
                 if ($type eq 'PrintConv') {
                     $value = $$both[1];
@@ -2143,7 +2228,7 @@ sub GetValue($$;$)
                 $conv = '\$val';  # return scalar reference for binary values
             } else {
                 # use PRINT_CONV from tag table if PrintConv doesn't exist
-                next unless defined($conv = $tagInfo->{Table}{PRINT_CONV});
+                next unless defined($conv = $$tagInfo{Table}{PRINT_CONV});
                 next if exists $$tagInfo{$convType};
             }
         }
@@ -2199,9 +2284,9 @@ sub GetValue($$;$)
                     my $oldEscape = $$self{ESCAPE_PROC};
                     delete $$self{ESCAPE_PROC};
                     foreach (keys %$val) {
-                        $raw[$_] = $self->{VALUE}{$$val{$_}};
+                        $raw[$_] = $$self{VALUE}{$$val{$_}};
                         ($val[$_], $prt[$_]) = $self->GetValue($$val{$_}, 'Both');
-                        next if defined $val[$_] or not $tagInfo->{Require}{$_};
+                        next if defined $val[$_] or not $$tagInfo{Require}{$_};
                         $$self{ESCAPE_PROC} = $oldEscape;
                         return wantarray ? () : undef;
                     }
@@ -2216,7 +2301,7 @@ sub GetValue($$;$)
                         # override with our localized language PrintConv if available
                         if ($$self{CUR_LANG} and $convType eq 'PrintConv' and
                             # (no need to check for lang-alt tag names -- they won't have a PrintConv)
-                            ref($lc = $self->{CUR_LANG}{$$tagInfo{Name}}) eq 'HASH' and
+                            ref($lc = $$self{CUR_LANG}{$$tagInfo{Name}}) eq 'HASH' and
                             ($lc = $$lc{PrintConv}) and ($lc = $$lc{$value}))
                         {
                             $value = $self->Decode($lc, 'UTF8');
@@ -2226,7 +2311,7 @@ sub GetValue($$;$)
                             $value = DecodeBits($val, $$conv{BITMASK});
                             # override with localized language strings
                             if (defined $value and $$self{CUR_LANG} and $convType eq 'PrintConv' and
-                                ref($lc = $self->{CUR_LANG}{$$tagInfo{Name}}) eq 'HASH' and
+                                ref($lc = $$self{CUR_LANG}{$$tagInfo{Name}}) eq 'HASH' and
                                 ($lc = $$lc{PrintConv}))
                             {
                                 my @vals = split ', ', $value;
@@ -2289,7 +2374,7 @@ sub GetValue($$;$)
     if ($type eq 'Both') {
         # save both (unescaped) values because we often need them again
         # (Composite tags need "Both" and often Require one tag for various Composite tags)
-        $self->{BOTH}{$tag} = [ $valueConv, $value ] unless $both;
+        $$self{BOTH}{$tag} = [ $valueConv, $value ] unless $both;
         # escape values if necessary
         if ($$self{ESCAPE_PROC}) {
             DoEscape($value, $$self{ESCAPE_PROC});
@@ -2312,9 +2397,9 @@ sub GetValue($$;$)
         # return array if requested
         return @$value if wantarray;
         # return list reference for Raw, ValueConv or if List or not a list of scalars
-        return $value if $type ne 'PrintConv' or $self->{OPTIONS}{List} or ref $$value[0];
+        return $value if $type ne 'PrintConv' or $$self{OPTIONS}{List} or ref $$value[0];
         # otherwise join in comma-separated string
-        $value = join $self->{OPTIONS}{ListSep}, @$value;
+        $value = join $$self{OPTIONS}{ListSep}, @$value;
     }
     return $value;
 }
@@ -2327,7 +2412,7 @@ sub GetValue($$;$)
 sub GetTagID($$)
 {
     my ($self, $tag) = @_;
-    my $tagInfo = $self->{TAG_INFO}{$tag};
+    my $tagInfo = $$self{TAG_INFO}{$tag};
     return '' unless $tagInfo and defined $$tagInfo{TagID};
     return ($$tagInfo{TagID}, $$tagInfo{LangCode}) if wantarray;
     return $$tagInfo{TagID};
@@ -2340,8 +2425,8 @@ sub GetTagID($$)
 sub GetTableName($$)
 {
     my ($self, $tag) = @_;
-    my $tagInfo = $self->{TAG_INFO}{$tag} or return '';
-    return $tagInfo->{Table}{SHORT_NAME};
+    my $tagInfo = $$self{TAG_INFO}{$tag} or return '';
+    return $$tagInfo{Table}{SHORT_NAME};
 }
 
 #------------------------------------------------------------------------------
@@ -2351,7 +2436,7 @@ sub GetTableName($$)
 sub GetTagIndex($$)
 {
     my ($self, $tag) = @_;
-    my $tagInfo = $self->{TAG_INFO}{$tag} or return undef;
+    my $tagInfo = $$self{TAG_INFO}{$tag} or return undef;
     return $$tagInfo{Index};
 }
 
@@ -2365,12 +2450,12 @@ sub GetDescription($$)
     local $_;
     my ($self, $tag) = @_;
     my ($desc, $name);
-    my $tagInfo = $self->{TAG_INFO}{$tag};
+    my $tagInfo = $$self{TAG_INFO}{$tag};
     # ($tagInfo won't be defined for missing tags extracted with -f)
     if ($tagInfo) {
         # use alternate language description if available
         while ($$self{CUR_LANG}) {
-            $desc = $self->{CUR_LANG}{$$tagInfo{Name}};
+            $desc = $$self{CUR_LANG}{$$tagInfo{Name}};
             if ($desc) {
                 # must look up Description if this tag also has a PrintConv
                 $desc = $$desc{Description} or last if ref $desc;
@@ -2378,7 +2463,7 @@ sub GetDescription($$)
                 # look up default language of lang-alt tag
                 last unless $$tagInfo{LangCode} and
                     ($name = $$tagInfo{Name}) =~ s/-$$tagInfo{LangCode}$// and
-                    $desc = $self->{CUR_LANG}{$name};
+                    $desc = $$self{CUR_LANG}{$name};
                 $desc = $$desc{Description} or last if ref $desc;
                 $desc .= " ($$tagInfo{LangCode})";
             }
@@ -2402,7 +2487,8 @@ sub GetDescription($$)
 # Get group name for specified tag
 # Inputs: 0) ExifTool object reference
 #         1) tag key (or reference to tagInfo hash, not part of the public API)
-#         2) [optional] group family (-1 to get extended group list)
+#         2) [optional] group family (-1 to get extended group list, or multiple
+#            families separated by colons to return multiple groups as a string)
 # Returns: Scalar context: Group name (for family 0 if not otherwise specified)
 #          Array context: Group name if family specified, otherwise list of
 #          group names for each family.  Returns '' for undefined tag.
@@ -2411,27 +2497,26 @@ sub GetGroup($$;$)
 {
     local $_;
     my ($self, $tag, $family) = @_;
-    my ($tagInfo, @groups, @families, $simplify, $byTagInfo);
+    my ($tagInfo, @groups, @families, $simplify, $byTagInfo, $ex);
     if (ref $tag eq 'HASH') {
         $tagInfo = $tag;
         $tag = $$tagInfo{Name};
         # set flag so we don't get extra information for an extracted tag
         $byTagInfo = 1;
     } else {
-        $tagInfo = $self->{TAG_INFO}{$tag} or return '';
+        $tagInfo = $$self{TAG_INFO}{$tag} || { };
+        $ex = $$self{TAG_EXTRA}{$tag};
     }
     my $groups = $$tagInfo{Groups};
     # fill in default groups unless already done
     # (after this, Groups 0-2 in tagInfo are guaranteed to be defined)
     unless ($$tagInfo{GotGroups}) {
-        my $tagTablePtr = $$tagInfo{Table};
-        if ($tagTablePtr) {
-            # construct our group list
-            $groups or $groups = $$tagInfo{Groups} = { };
-            # fill in default groups
-            foreach (keys %{$$tagTablePtr{GROUPS}}) {
-                $$groups{$_} or $$groups{$_} = $tagTablePtr->{GROUPS}{$_};
-            }
+        my $tagTablePtr = $$tagInfo{Table} || { GROUPS => { } };
+        # construct our group list
+        $groups or $groups = $$tagInfo{Groups} = { };
+        # fill in default groups
+        foreach (0..2) {
+            $$groups{$_} = $$tagTablePtr{GROUPS}{$_} || '' unless $$groups{$_};
         }
         # set flag indicating group list was built
         $$tagInfo{GotGroups} = 1;
@@ -2439,22 +2524,21 @@ sub GetGroup($$;$)
     if (defined $family and $family ne '-1') {
         if ($family =~ /[^\d]/) {
             @families = ($family =~ /\d+/g);
-            return $$groups{0} unless @families;
+            return(($ex && $$ex{G0}) || $$groups{0}) unless @families;
             $simplify = 1 unless $family =~ /^:/;
             undef $family;
             foreach (0..2) { $groups[$_] = $$groups{$_}; }
         } else {
-            return $$groups{$family} if $family == 0 or $family == 2;
+            return(($ex && $$ex{"G$family"}) || $$groups{$family}) if $family == 0 or $family == 2;
             $groups[1] = $$groups{1};
         }
     } else {
-        return $$groups{0} unless wantarray;
+        return(($ex && $$ex{G0}) || $$groups{0}) unless wantarray;
         foreach (0..2) { $groups[$_] = $$groups{$_}; }
     }
     $groups[3] = 'Main';
     $groups[4] = ($tag =~ /\((\d+)\)$/) ? "Copy$1" : '';
     # handle dynamic group names if necessary
-    my $ex = $self->{TAG_EXTRA}{$tag};
     if ($ex and not $byTagInfo) {
         $groups[0] = $$ex{G0} if $$ex{G0};
         $groups[1] = $$ex{G1} =~ /^\+(.*)/ ? "$groups[1]$1" : $$ex{G1} if $$ex{G1};
@@ -2504,7 +2588,7 @@ sub GetGroups($;$$)
     # figure out our arguments
     if (ref $info ne 'HASH') {
         $family = $info;
-        $info = $self->{VALUE};
+        $info = $$self{VALUE};
     } else {
         $family = shift;
     }
@@ -2535,8 +2619,8 @@ sub SetNewGroups($;@)
     $priority{file} = 10;       # 'File' group is always written (Comment)
     $priority{composite} = 10;  # 'Composite' group is always written
     # set write priority (higher # is higher priority)
-    $self->{WRITE_PRIORITY} = \%priority;
-    $self->{WRITE_GROUPS} = \@groups;
+    $$self{WRITE_PRIORITY} = \%priority;
+    $$self{WRITE_GROUPS} = \@groups;
 }
 
 #------------------------------------------------------------------------------
@@ -2559,7 +2643,7 @@ sub BuildCompositeTags($)
     my @tagList = sort keys %Image::ExifTool::Composite;
     my %tagsUsed;
 
-    my $rawValue = $self->{VALUE};
+    my $rawValue = $$self{VALUE};
     for (;;) {
         my %notBuilt;
         $notBuilt{$_} = 1 foreach @tagList;
@@ -2627,11 +2711,11 @@ COMPOSITE_TAG:
                 }
                 if ($doc) {
                     if ($found) {
-                        $self->{DOC_NUM} = $doc;
+                        $$self{DOC_NUM} = $doc;
                         $self->FoundTag($tagInfo, \%tagKey);
-                        delete $self->{DOC_NUM};
+                        delete $$self{DOC_NUM};
                     }
-                    next if ++$doc <= $self->{DOC_COUNT};
+                    next if ++$doc <= $$self{DOC_COUNT};
                     last;
                 } elsif ($found) {
                     delete $notBuilt{$tag}; # this tag is OK to build now
@@ -2650,7 +2734,7 @@ COMPOSITE_TAG:
                     # check to see if we just replaced one of the tag keys we Require'd
                     if (defined $key and $tagsUsed{$key}) {
                         foreach (@{$tagsUsed{$key}}) {
-                            $$_ = $self->{MOVED_KEY};   # replace with new tag key
+                            $$_ = $$self{MOVED_KEY};    # replace with new tag key
                         }
                         delete $tagsUsed{$key};         # can't be replaced again
                     }
@@ -2791,46 +2875,46 @@ sub Init($)
     my $self = shift;
     # delete all DataMember variables (lower-case names)
     foreach (keys %$self) {
-        /[a-z]/ and delete $self->{$_};
-    }
-    delete $self->{FOUND_TAGS};     # list of found tags
-    delete $self->{EXIF_DATA};      # the EXIF data block
-    delete $self->{EXIF_POS};       # EXIF position in file
-    delete $self->{FIRST_EXIF_POS}; # position of first EXIF in file
-    delete $self->{HTML_DUMP};      # html dump information
-    delete $self->{SET_GROUP0};     # group0 name override
-    delete $self->{SET_GROUP1};     # group1 name override
-    delete $self->{DOC_NUM};        # current embedded document number
-    $self->{DOC_COUNT}  = 0;        # count of embedded documents processed
-    $self->{BASE}       = 0;        # base for offsets from start of file
-    $self->{FILE_ORDER} = { };      # * hash of tag order in file ('*' = based on tag key)
-    $self->{VALUE}      = { };      # * hash of raw tag values
-    $self->{BOTH}       = { };      # * hash for Value/PrintConv values of Require'd tags
-    $self->{RATIONAL}   = { };      # * hash of original rational components
-    $self->{TAG_INFO}   = { };      # * hash of tag information
-    $self->{TAG_EXTRA}  = { };      # * hash of extra tag information (dynamic group names)
-    $self->{PRIORITY}   = { };      # * priority of current tags
-    $self->{LIST_TAGS}  = { };      # hash of tagInfo refs for active List-type tags
-    $self->{PROCESSED}  = { };      # hash of processed directory start positions
-    $self->{DIR_COUNT}  = { };      # count various types of directories
-    $self->{DUPL_TAG}   = { };      # last-used index for duplicate-tag keys
-    $self->{WARNED_ONCE}= { };      # WarnOnce() warnings already issued
-    $self->{PATH}       = [ ];      # current subdirectory path in file when reading
-    $self->{NUM_FOUND}  = 0;        # total number of tags found (incl. duplicates)
-    $self->{CHANGED}    = 0;        # number of tags changed (writer only)
-    $self->{INDENT}     = '  ';     # initial indent for verbose messages
-    $self->{PRIORITY_DIR} = '';     # the priority directory name
-    $self->{LOW_PRIORITY_DIR} = { PreviewIFD => 1 }; # names of priority 0 directories
-    $self->{TIFF_TYPE}  = '';       # type of TIFF data (APP1, TIFF, NEF, etc...)
-    $self->{Make}       = '';       # camera make
-    $self->{Model}      = '';       # camera model
-    $self->{CameraType} = '';       # Olympus camera type
+        /[a-z]/ and delete $$self{$_};
+    }
+    delete $$self{FOUND_TAGS};      # list of found tags
+    delete $$self{EXIF_DATA};       # the EXIF data block
+    delete $$self{EXIF_POS};        # EXIF position in file
+    delete $$self{FIRST_EXIF_POS};  # position of first EXIF in file
+    delete $$self{HTML_DUMP};       # html dump information
+    delete $$self{SET_GROUP0};      # group0 name override
+    delete $$self{SET_GROUP1};      # group1 name override
+    delete $$self{DOC_NUM};         # current embedded document number
+    $$self{DOC_COUNT}  = 0;         # count of embedded documents processed
+    $$self{BASE}       = 0;         # base for offsets from start of file
+    $$self{FILE_ORDER} = { };       # * hash of tag order in file ('*' = based on tag key)
+    $$self{VALUE}      = { };       # * hash of raw tag values
+    $$self{BOTH}       = { };       # * hash for Value/PrintConv values of Require'd tags
+    $$self{RATIONAL}   = { };       # * hash of original rational components
+    $$self{TAG_INFO}   = { };       # * hash of tag information
+    $$self{TAG_EXTRA}  = { };       # * hash of extra tag information (dynamic group names)
+    $$self{PRIORITY}   = { };       # * priority of current tags
+    $$self{LIST_TAGS}  = { };       # hash of tagInfo refs for active List-type tags
+    $$self{PROCESSED}  = { };       # hash of processed directory start positions
+    $$self{DIR_COUNT}  = { };       # count various types of directories
+    $$self{DUPL_TAG}   = { };       # last-used index for duplicate-tag keys
+    $$self{WARNED_ONCE}= { };       # WarnOnce() warnings already issued
+    $$self{PATH}       = [ ];       # current subdirectory path in file when reading
+    $$self{NUM_FOUND}  = 0;         # total number of tags found (incl. duplicates)
+    $$self{CHANGED}    = 0;         # number of tags changed (writer only)
+    $$self{INDENT}     = '  ';      # initial indent for verbose messages
+    $$self{PRIORITY_DIR} = '';      # the priority directory name
+    $$self{LOW_PRIORITY_DIR} = { PreviewIFD => 1 }; # names of priority 0 directories
+    $$self{TIFF_TYPE}  = '';        # type of TIFF data (APP1, TIFF, NEF, etc...)
+    $$self{Make}       = '';        # camera make
+    $$self{Model}      = '';        # camera model
+    $$self{CameraType} = '';        # Olympus camera type
     if ($self->Options('HtmlDump')) {
         require Image::ExifTool::HtmlDump;
-        $self->{HTML_DUMP} = new Image::ExifTool::HtmlDump;
+        $$self{HTML_DUMP} = new Image::ExifTool::HtmlDump;
     }
     # make sure our TextOut is a file reference
-    $self->{OPTIONS}{TextOut} = \*STDOUT unless ref $self->{OPTIONS}{TextOut};
+    $$self{OPTIONS}{TextOut} = \*STDOUT unless ref $$self{OPTIONS}{TextOut};
 }
 
 #------------------------------------------------------------------------------
@@ -2878,27 +2962,27 @@ sub Open(*$;$)
 sub ParseArguments($;@)
 {
     my $self = shift;
-    my $options = $self->{OPTIONS};
+    my $options = $$self{OPTIONS};
     my @exclude;
-    my @oldGroupOpts = grep /^Group/, keys %{$self->{OPTIONS}};
+    my @oldGroupOpts = grep /^Group/, keys %{$$self{OPTIONS}};
     my $wasExcludeOpt;
 
-    $self->{REQUESTED_TAGS}  = [ ];
-    $self->{REQ_TAG_LOOKUP}  = { };
-    $self->{EXCL_TAG_LOOKUP} = { };
-    $self->{IO_TAG_LIST} = undef;
+    $$self{REQUESTED_TAGS}  = [ ];
+    $$self{REQ_TAG_LOOKUP}  = { };
+    $$self{EXCL_TAG_LOOKUP} = { };
+    $$self{IO_TAG_LIST} = undef;
 
     # handle our input arguments
     while (@_) {
         my $arg = shift;
         if (ref $arg) {
             if (ref $arg eq 'ARRAY') {
-                $self->{IO_TAG_LIST} = $arg;
+                $$self{IO_TAG_LIST} = $arg;
                 foreach (@$arg) {
                     if (/^-(.*)/) {
                         push @exclude, $1;
                     } else {
-                        push @{$self->{REQUESTED_TAGS}}, $_;
+                        push @{$$self{REQUESTED_TAGS}}, $_;
                     }
                 }
             } elsif (ref $arg eq 'HASH') {
@@ -2907,7 +2991,7 @@ sub ParseArguments($;@)
                     # a single new group option overrides all old group options
                     if (@oldGroupOpts and $opt =~ /^Group/) {
                         foreach (@oldGroupOpts) {
-                            delete $options->{$_};
+                            delete $$options{$_};
                         }
                         undef @oldGroupOpts;
                     }
@@ -2915,55 +2999,55 @@ sub ParseArguments($;@)
                     $opt eq 'Exclude' and $wasExcludeOpt = 1;
                 }
             } elsif (ref $arg eq 'SCALAR' or UNIVERSAL::isa($arg,'GLOB')) {
-                next if defined $self->{RAF};
+                next if defined $$self{RAF};
                 # convert image data from UTF-8 to character stream if necessary
                 # (patches RHEL 3 UTF8 LANG problem)
                 if (ref $arg eq 'SCALAR' and $] >= 5.006 and
-                    (eval 'require Encode; Encode::is_utf8($$arg)' or $@))
+                    (eval { require Encode; Encode::is_utf8($$arg) } or $@))
                 {
                     # repack by hand if Encode isn't available
                     my $buff = $@ ? pack('C*',unpack('U0C*',$$arg)) : Encode::encode('utf8',$$arg);
                     $arg = \$buff;
                 }
-                $self->{RAF} = new File::RandomAccess($arg);
+                $$self{RAF} = new File::RandomAccess($arg);
                 # set filename to empty string to indicate that
                 # we have a file but we didn't open it
-                $self->{FILENAME} = '';
+                $$self{FILENAME} = '';
             } elsif (UNIVERSAL::isa($arg, 'File::RandomAccess')) {
-                $self->{RAF} = $arg;
-                $self->{FILENAME} = '';
+                $$self{RAF} = $arg;
+                $$self{FILENAME} = '';
             } else {
                 warn "Don't understand ImageInfo argument $arg\n";
             }
-        } elsif (defined $self->{FILENAME}) {
+        } elsif (defined $$self{FILENAME}) {
             if ($arg =~ /^-(.*)/) {
                 push @exclude, $1;
             } else {
-                push @{$self->{REQUESTED_TAGS}}, $arg;
+                push @{$$self{REQUESTED_TAGS}}, $arg;
             }
         } else {
-            $self->{FILENAME} = $arg;
+            $$self{FILENAME} = $arg;
         }
     }
     # expand shortcuts in tag arguments if provided
-    if (@{$self->{REQUESTED_TAGS}}) {
-        ExpandShortcuts($self->{REQUESTED_TAGS});
+    if (@{$$self{REQUESTED_TAGS}}) {
+        ExpandShortcuts($$self{REQUESTED_TAGS});
         # initialize lookup for requested tags
-        foreach (@{$self->{REQUESTED_TAGS}}) {
-            /([-\w]+)#?$/ and $self->{REQ_TAG_LOOKUP}{lc($1)} = 1;
+        foreach (@{$$self{REQUESTED_TAGS}}) {
+            /([-\w]+)#?$/ and $$self{REQ_TAG_LOOKUP}{lc($1)} = 1;
         }
     }
     if (@exclude or $wasExcludeOpt) {
         # must add existing excluded tags
-        push @exclude, @{$options->{Exclude}} if $options->{Exclude};
-        $options->{Exclude} = \@exclude;
+        push @exclude, @{$$options{Exclude}} if $$options{Exclude};
+        $$options{Exclude} = \@exclude;
         # expand shortcuts in new exclude list
-        ExpandShortcuts($options->{Exclude}, 1); # (also remove '#' suffix)
+        ExpandShortcuts($$options{Exclude}, 1); # (also remove '#' suffix)
     }
     # generate lookup for excluded tags
-    if ($options->{Exclude}) {
-        foreach (@{$options->{Exclude}}) {
-            /([-\w]+)#?$/ and $self->{EXCL_TAG_LOOKUP}{lc($1)} = 1;
+    if ($$options{Exclude}) {
+        foreach (@{$$options{Exclude}}) {
+            /([-\w]+)#?$/ and $$self{EXCL_TAG_LOOKUP}{lc($1)} = 1;
         }
     }
 }
@@ -3026,11 +3110,11 @@ sub GroupMatches($$$)
 sub SetFoundTags($)
 {
     my $self = shift;
-    my $options = $self->{OPTIONS};
-    my $reqTags = $self->{REQUESTED_TAGS} || [ ];
-    my $duplicates = $options->{Duplicates};
-    my $exclude = $options->{Exclude};
-    my $fileOrder = $self->{FILE_ORDER};
+    my $options = $$self{OPTIONS};
+    my $reqTags = $$self{REQUESTED_TAGS} || [ ];
+    my $duplicates = $$options{Duplicates};
+    my $exclude = $$options{Exclude};
+    my $fileOrder = $$self{FILE_ORDER};
     my @groupOptions = sort grep /^Group/, keys %$options;
     my $doDups = $duplicates || $exclude || @groupOptions;
     my ($tag, $rtnTags, @byValue, @wildTags);
@@ -3055,7 +3139,7 @@ sub SetFoundTags($)
                 $tag = $reqTag;
             }
             $byValue = 1 if $tag =~ s/#$// and $$options{PrintConv};
-            if (defined $tagHash->{$reqTag} and not $doDups) {
+            if (defined $$tagHash{$reqTag} and not $doDups) {
                 $matches[0] = $tag;
             } elsif ($tag =~ /^(\*|all)$/i) {
                 # tag name of '*' or 'all' matches all tags
@@ -3097,9 +3181,9 @@ sub SetFoundTags($)
                 # return only the highest priority tag unless duplicates wanted
                 unless ($doDups or $allTag or $allGrp) {
                     $tag = shift @matches;
-                    my $oldPriority = $self->{PRIORITY}{$tag} || 1;
+                    my $oldPriority = $$self{PRIORITY}{$tag} || 1;
                     foreach (@matches) {
-                        my $priority = $self->{PRIORITY}{$_};
+                        my $priority = $$self{PRIORITY}{$_};
                         $priority = 1 unless defined $priority;
                         next unless $priority >= $oldPriority;
                         $tag = $_;
@@ -3111,7 +3195,7 @@ sub SetFoundTags($)
                 # put entry in return list even without value (value is undef)
                 $matches[0] = $byValue ? "$tag #(0)" : "$tag (0)";
                 # bogus file order entry to avoid warning if sorting in file order
-                $self->{FILE_ORDER}{$matches[0]} = 9999;
+                $$self{FILE_ORDER}{$matches[0]} = 9999;
             }
             # save indices of tags extracted by value
             push @byValue, scalar(@$rtnTags) .. (scalar(@$rtnTags)+scalar(@matches)-1) if $byValue;
@@ -3178,10 +3262,10 @@ sub SetFoundTags($)
             $family = $1 || 0;
             $wantGroup{$family} or $wantGroup{$family} = { };
             my $groupList;
-            if (ref $options->{$groupOpt} eq 'ARRAY') {
-                $groupList = $options->{$groupOpt};
+            if (ref $$options{$groupOpt} eq 'ARRAY') {
+                $groupList = $$options{$groupOpt};
             } else {
-                $groupList = [ $options->{$groupOpt} ];
+                $groupList = [ $$options{$groupOpt} ];
             }
             foreach (@$groupList) {
                 # groups have priority in order they were specified
@@ -3243,7 +3327,7 @@ GR_TAG: foreach $tag (@$rtnTags) {
         $rtnTags = \@tags;
         last;
     }
-    $self->{FOUND_TAGS} = $rtnTags;     # save found tags
+    $$self{FOUND_TAGS} = $rtnTags;      # save found tags
 
     # return reference to found tag keys (and list of indices of tags to extract by value)
     return wantarray ? ($rtnTags, \@byValue, \@wildTags) : $rtnTags;
@@ -3295,7 +3379,7 @@ sub Warn($$;$)
 {
     my ($self, $str, $ignorable) = @_;
     if ($ignorable) {
-        return 0 if $self->{OPTIONS}{IgnoreMinorErrors};
+        return 0 if $$self{OPTIONS}{IgnoreMinorErrors};
         $str = $ignorable eq '2' ? "[Minor] $str" : "[minor] $str";
     }
     $self->FoundTag('Warning', $str);
@@ -3309,7 +3393,7 @@ sub Warn($$;$)
 sub WarnOnce($$;$)
 {
     my ($self, $str, $ignorable) = @_;
-    return 0 if $ignorable and $self->{OPTIONS}{IgnoreMinorErrors};
+    return 0 if $ignorable and $$self{OPTIONS}{IgnoreMinorErrors};
     unless ($$self{WARNED_ONCE}{$str}) {
         $self->Warn($str, $ignorable);
         $$self{WARNED_ONCE}{$str} = 1;
@@ -3324,11 +3408,11 @@ sub WarnOnce($$;$)
 sub Error($$;$)
 {
     my ($self, $str, $ignorable) = @_;
-    if ($ignorable) {
-        if ($self->{OPTIONS}{IgnoreMinorErrors}) {
-            $self->Warn($str);
-            return 0;
-        }
+    if ($$self{DemoteErrors}) {
+        $self->Warn($str) and ++$$self{DemoteErrors};
+        return 1;
+    } elsif ($ignorable) {
+        $$self{OPTIONS}{IgnoreMinorErrors} and $self->Warn($str), return 0;
         $str = "[minor] $str";
     }
     $self->FoundTag('Error', $str);
@@ -3454,9 +3538,9 @@ sub AddCompositeTags($;$)
 
     # make sure default groups are defined in families 0 and 1
     if ($defaultGroups) {
-        $defaultGroups->{0} or $defaultGroups->{0} = 'Composite';
-        $defaultGroups->{1} or $defaultGroups->{1} = 'Composite';
-        $defaultGroups->{2} or $defaultGroups->{2} = 'Other';
+        $$defaultGroups{0} or $$defaultGroups{0} = 'Composite';
+        $$defaultGroups{1} or $$defaultGroups{1} = 'Composite';
+        $$defaultGroups{2} or $$defaultGroups{2} = 'Other';
     } else {
         $defaultGroups = $$add{GROUPS} = { 0 => 'Composite', 1 => 'Composite', 2 => 'Other' };
     }
@@ -3552,12 +3636,7 @@ sub SetupTagTable($)
         foreach $tagInfo (@infoArray) {
             $$tagInfo{Table} = $tagTablePtr;
             $$tagInfo{TagID} = $tagID;
-            my $tag = $$tagInfo{Name};
-            unless (defined $tag) {
-                # generate name equal to tag ID if 'Name' doesn't exist
-                $tag = $tagID;
-                $$tagInfo{Name} = ucfirst($tag); # make first char uppercase
-            }
+            $$tagInfo{Name} or $$tagInfo{Name} = MakeTagName($tagID);
             $$tagInfo{Flags} and ExpandFlags($tagInfo);
         }
         next unless @infoArray > 1;
@@ -3721,6 +3800,7 @@ sub Get32u($$)    { return DoUnpackStd('L', @_); }
 sub GetFloat($$)  { return DoUnpack(4, 'f', @_); }
 sub GetDouble($$) { return DoUnpackDbl('d', @_); }
 sub Get16uRev($$) { return DoUnpackRev('S', @_); }
+sub Get32uRev($$) { return DoUnpackRev('L', @_); }
 
 # rationals may be a floating point number, 'inf' or 'undef'
 my ($ratNumer, $ratDenom);
@@ -3850,6 +3930,7 @@ my %formatSize = (
     int16uRev => 2,
     int32s => 4,
     int32u => 4,
+    int32uRev => 4,
     int64s => 8,
     int64u => 8,
     rational32s => 4,
@@ -3879,6 +3960,7 @@ my %readValueProc = (
     int16uRev => \&Get16uRev,
     int32s => \&Get32s,
     int32u => \&Get32u,
+    int32uRev => \&Get32uRev,
     int64s => \&Get64s,
     int64u => \&Get64u,
     rational32s => \&GetRational32s,
@@ -4049,7 +4131,7 @@ sub ValidateImage($$$)
             $self->Options('IgnoreMinorErrors'))
     {
         # issue warning only if the tag was specifically requested
-        if ($self->{REQ_TAG_LOOKUP}{lc GetTagName($tag)}) {
+        if ($$self{REQ_TAG_LOOKUP}{lc GetTagName($tag)}) {
             $self->Warn("$tag is not a valid JPEG image",1);
             return undef;
         }
@@ -4058,6 +4140,19 @@ sub ValidateImage($$$)
 }
 
 #------------------------------------------------------------------------------
+# Generate a valid tag name based on the tag ID or name
+# Inputs: 0) tag ID or name
+# Returns: valid tag name
+sub MakeTagName($)
+{
+    my $name = shift;
+    $name =~ tr/-_a-zA-Z0-9//dc;    # remove illegal characters
+    $name = ucfirst $name;          # capitalize first letter
+    $name = "Tag$name" if length($name) < 2; # must at least 2 characters long
+    return $name;
+}
+
+#------------------------------------------------------------------------------
 # Make description from a tag name
 # Inputs: 0) tag name 1) optional tagID to add at end of description
 # Returns: description
@@ -4108,7 +4203,7 @@ sub Printable($;$)
     return '(undef)' unless defined $outStr;
     $outStr =~ tr/\x01-\x1f\x7f-\xff/./;
     $outStr =~ s/\x00//g;
-    my $verbose = $self->{OPTIONS}{Verbose};
+    my $verbose = $$self{OPTIONS}{Verbose};
     if ($verbose < 4) {
         if ($maxLen) {
             $maxLen = 20 if $maxLen < 20;   # minimum length is 20
@@ -4135,8 +4230,8 @@ sub Printable($;$)
 sub ConvertDateTime($$)
 {
     my ($self, $date) = @_;
-    my $dateFormat = $self->{OPTIONS}{DateFormat};
-    my $shift = $self->{OPTIONS}{GlobalTimeShift};
+    my $fmt = $$self{OPTIONS}{DateFormat};
+    my $shift = $$self{OPTIONS}{GlobalTimeShift};
     if ($shift) {
         my $dir = ($shift =~ s/^([-+])// and $1 eq '-') ? -1 : 1;
         require 'Image/ExifTool/Shift.pl';
@@ -4145,17 +4240,36 @@ sub ConvertDateTime($$)
         ShiftTime($date, $shift, $dir, $offset);
     }
     # only convert date if a format was specified and the date is recognizable
-    if ($dateFormat) {
+    if ($fmt) {
+        # separate time zone if it exists
+        my $tz;
+        $date =~ s/([-+]\d{2}:\d{2}|Z)$// and $tz = $1;
         # a few cameras use incorrect date/time formatting:
         # - slashes instead of colons in date (RolleiD330, ImpressCam)
         # - date/time values separated by colon instead of space (Polariod, Sanyo, Sharp, Vivitar)
         # - single-digit seconds with leading space (HP scanners)
-        $date =~ s/[-+]\d{2}:\d{2}$//;  # remove timezone if it exists
-        my @a = ($date =~ /\d+/g);      # be very flexible about date/time format
-        if (@a and $a[0] >= 1000 and $a[0] < 3000 and eval 'require POSIX') {
-            $date = POSIX::strftime($dateFormat, $a[5]||0, $a[4]||0, $a[3]||0,
-                                                 $a[2]||1, ($a[1]||1)-1, $a[0]-1900);
-        } elsif ($self->{OPTIONS}{StrictDate}) {
+        my @a = reverse ($date =~ /\d+/g);  # be very flexible about date/time format
+        if (@a and $a[-1] >= 1000 and $a[-1] < 3000 and eval { require POSIX }) {
+            shift @a while @a > 6;      # remove superfluous entries
+            unshift @a, 1 while @a < 3; # add month and day if necessary
+            unshift @a, 0 while @a < 6; # add h,m,s if necessary
+            $a[5] -= 1900;              # base year is 1900
+            $a[4] -= 1;                 # base month is 1
+            # parse %z and %s ourself (to handle time zones properly)
+            if ($fmt =~ /%[sz]/) {
+                # use system time zone unless otherwise specified
+                $tz = TimeZoneString(\@a, TimeLocal(@a)) if not $tz and eval { require Time::Local };
+                # remove colon, setting to UTC if time zone is not numeric
+                $tz = ($tz and $tz=~/^([-+]\d{2}):(\d{2})$/) ? "$1$2" : '+0000';
+                $fmt =~ s/(^|[^%])((%%)*)%z/$1$2$tz/g;      # convert '%z' format codes
+                if ($fmt =~ /%s/ and eval { require Time::Local }) {
+                    # calculate seconds since the Epoch, UTC
+                    my $s = Time::Local::timegm(@a) - 60 * ($tz - int($tz/100) * 40);
+                    $fmt =~ s/(^|[^%])((%%)*)%s/$1$2$s/g;   # convert '%s' format codes
+                }
+            }
+            $date = POSIX::strftime($fmt, @a);  # generate the formatted date/time
+        } elsif ($$self{OPTIONS}{StrictDate}) {
             undef $date;
         }
     }
@@ -4207,7 +4321,7 @@ sub TimeLocal(@)
 # Get time zone in minutes
 # Inputs: 0) localtime array ref, 1) gmtime array ref
 # Returns: time zone offset in minutes
-sub GetTimeZone(;$$)
+sub GetTimeZone($$)
 {
     my ($tm, $gm) = @_;
     # compute the number of minutes between localtime and gmtime
@@ -4251,6 +4365,7 @@ sub ConvertUnixTime($;$)
 {
     my ($time, $toLocal) = @_;
     return '0000:00:00 00:00:00' if $time == 0;
+    $time = int($time + 1e-6) if $time != int($time);  # avoid round-off errors
     my (@tm, $tz);
     if ($toLocal) {
         @tm = localtime($time);
@@ -4273,7 +4388,7 @@ sub GetUnixTime($;$)
     my ($timeStr, $isLocal) = @_;
     return 0 if $timeStr eq '0000:00:00 00:00:00';
     my @tm = ($timeStr =~ /^(\d+):(\d+):(\d+)\s+(\d+):(\d+):(\d+)/);
-    return undef unless @tm == 6 and eval 'require Time::Local';
+    return undef unless @tm == 6 and eval { require Time::Local };
     my $tzsec = 0;
     # use specified timezone offset (if given) instead of local system time
     # if we are converting a local time value
@@ -4317,6 +4432,11 @@ sub ConvertDuration($)
     $time -= $h * 3600;
     my $m = int($time / 60);
     $time -= $m * 60;
+    if ($h > 24) {
+        my $d = int($h / 24);
+        $h -= $d * 24;
+        $sign = "$sign$d days ";
+    }
     return sprintf("$sign%d:%.2d:%.2d", $h, $m, int($time));
 }
 
@@ -4348,7 +4468,7 @@ sub HDump($$$$;$$)
     if ($$self{HTML_DUMP}) {
         my $pos = shift;
         $pos += $$self{BASE} if $$self{BASE};
-        $self->{HTML_DUMP}->Add($pos, @_);
+        $$self{HTML_DUMP}->Add($pos, @_);
     }
 }
 
@@ -4537,7 +4657,22 @@ sub JpegMarkerName($)
 }
 
 #------------------------------------------------------------------------------
-# Extract EXIF information from a jpg image
+# Adjust directory start position
+# Inputs: 0) dirInfo ref, 1) start offset
+#         2) Base for offsets (relative to DataPos, defaults to absolute Base of 0)
+sub DirStart($$;$)
+{
+    my ($dirInfo, $start, $base) = @_;
+    $$dirInfo{DirStart} = $start;
+    $$dirInfo{DirLen} -= $start;
+    if (defined $base) {
+        $$dirInfo{Base} = $$dirInfo{DataPos} + $base;
+        $$dirInfo{DataPos} = -$base;    # (relative to Base!)
+    }
+}
+
+#------------------------------------------------------------------------------
+# Extract metadata from a jpg image
 # Inputs: 0) ExifTool object reference, 1) dirInfo ref with RAF set
 # Returns: 1 on success, 0 if this wasn't a valid JPEG file
 sub ProcessJPEG($$)
@@ -4545,28 +4680,33 @@ sub ProcessJPEG($$)
     local $_;
     my ($self, $dirInfo) = @_;
     my ($ch, $s, $length);
-    my $verbose = $self->{OPTIONS}{Verbose};
-    my $out = $self->{OPTIONS}{TextOut};
-    my $fast = $self->{OPTIONS}{FastScan};
+    my $verbose = $$self{OPTIONS}{Verbose};
+    my $out = $$self{OPTIONS}{TextOut};
+    my $fast = $$self{OPTIONS}{FastScan};
     my $raf = $$dirInfo{RAF};
-    my $htmlDump = $self->{HTML_DUMP};
+    my $htmlDump = $$self{HTML_DUMP};
     my %dumpParms = ( Out => $out );
-    my ($success, $wantTrailer, $trailInfo);
+    my ($success, $wantTrailer, $trailInfo, $type);
     my (@iccChunk, $iccChunkCount, $iccChunksTotal, @flirChunk, $flirCount, $flirTotal);
     my ($preview, $scalado, @dqt, $subSampling, $dumpEnd, %extendedXMP);
 
-    # check to be sure this is a valid JPG (or J2C) file
-    return 0 unless $raf->Read($s, 2) == 2 and $s =~ /^\xff[\xd8\x4f]/;
-    $dumpParms{MaxLen} = 128 if $verbose < 4;
+    # check to be sure this is a valid JPG (or J2C, or EXV) file
+    return 0 unless $raf->Read($s, 2) == 2 and $s =~ /^\xff[\xd8\x4f\x01]/;
+    if ($s eq "\xff\x01") {
+        return 0 unless $raf->Read($s, 5) == 5 and $s eq 'Exiv2';
+        $type = 'EXV';
+    }
     if (not $$self{VALUE}{FileType} or ($$self{DOC_NUM} and $$self{OPTIONS}{ExtractEmbedded})) {
-        $self->SetFileType();               # set FileType tag
+        $self->SetFileType($type);          # set FileType tag
         $$self{LOW_PRIORITY_DIR}{IFD1} = 1; # lower priority of IFD1 tags
     }
+    $dumpParms{MaxLen} = 128 if $verbose < 4;
     if ($htmlDump) {
         $dumpEnd = $raf->Tell();
-        my $pos = $dumpEnd - 2;
+        my ($n, $t, $m) = $s eq 'Exiv2' ? (7,'EXV','TEM') : (2,'JPEG','SOI');
+        my $pos = $dumpEnd - $n;
         $self->HDump(0, $pos, '[unknown header]') if $pos;
-        $self->HDump($pos, 2, 'JPEG header', 'SOI Marker');
+        $self->HDump($pos, $n, "$t header", "$m Marker");
     }
     my $path = $$self{PATH};
     my $pn = scalar @$path;
@@ -4687,7 +4827,7 @@ sub ProcessJPEG($$)
                     # (and Minolta and Sony previews can have a random first byte...)
                     my $scanLen = $$self{Make} =~ /Sony/i ? 65536 : 1024;
                     if ($raf->Read($buff, $scanLen) and ($buff =~ /\xff\xd8\xff./g or
-                        ($self->{Make} =~ /(Minolta|Sony)/i and $buff =~ /.\xd8\xff\xdb/g)))
+                        ($$self{Make} =~ /(Minolta|Sony)/i and $buff =~ /.\xd8\xff\xdb/g)))
                     {
                         # adjust PreviewImageStart to this location
                         my $actual = $pos + pos($buff) - 4;
@@ -4695,7 +4835,7 @@ sub ProcessJPEG($$)
                             print $out "(Fixed PreviewImage location: $start -> $actual)\n";
                         }
                         # update preview image offsets
-                        $self->{VALUE}{PreviewImageStart} = $actual if $self->{VALUE}{PreviewImageStart};
+                        $$self{VALUE}{PreviewImageStart} = $actual if $$self{VALUE}{PreviewImageStart};
                         $$self{PreviewImageStart} = $actual;
                         # load preview now if we tried and failed earlier
                         if ($$self{PreviewError} and $$self{PreviewImageLength}) {
@@ -4785,7 +4925,11 @@ sub ProcessJPEG($$)
             next;
         } elsif ($marker == 0xdb and length($$segDataPt) and    # DQT
             # save the DQT data only if JPEGDigest has been requested
-            $self->{REQ_TAG_LOOKUP}{jpegdigest})
+            # (Note: this will not work with the application -p option
+            #  because we aren't checking the RequestAll API option here.
+            #  The reason is that there is too much overhead involved in
+            #  the calculation of this tag to make this worth the CPU time.)
+            $$self{REQ_TAG_LOOKUP}{jpegdigest})
         {
             my $num = unpack('C',$$segDataPt) & 0x0f;   # get table index
             $dqt[$num] = $$segDataPt if $num < 4;       # save for MD5 calculation
@@ -4801,15 +4945,20 @@ sub ProcessJPEG($$)
                 HexDump($segDataPt, undef, %dumpParms, %extraParms);
             }
         }
+        # prepare dirInfo hash for processing this information
+        my %dirInfo = (
+            Parent   => $markerName,
+            DataPt   => $segDataPt,
+            DataPos  => $segPos,
+            DataLen  => $length,
+            DirStart => 0,
+            DirLen   => $length,
+            Base     => 0,
+        );
         if ($marker == 0xe0) {              # APP0 (JFIF, JFXX, CIFF, AVI1, Ocad)
             if ($$segDataPt =~ /^JFIF\0/) {
                 $dumpType = 'JFIF';
-                my %dirInfo = (
-                    DataPt => $segDataPt,
-                    DataPos  => $segPos,
-                    DirStart => 5,
-                    DirLen => $length - 5,
-                );
+                DirStart(\%dirInfo, 5); # start at byte 5
                 SetByteOrder('MM');
                 my $tagTablePtr = GetTagTable('Image::ExifTool::JFIF::Main');
                 $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
@@ -4822,22 +4971,17 @@ sub ProcessJPEG($$)
                 next if $fast and $fast > 1;    # skip processing for very fast
                 $dumpType = 'CIFF';
                 my %dirInfo = ( RAF => new File::RandomAccess($segDataPt) );
-                $self->{SET_GROUP1} = 'CIFF';
-                push @{$self->{PATH}}, 'CIFF';
+                $$self{SET_GROUP1} = 'CIFF';
+                push @{$$self{PATH}}, 'CIFF';
                 require Image::ExifTool::CanonRaw;
                 Image::ExifTool::CanonRaw::ProcessCRW($self, \%dirInfo);
-                pop @{$self->{PATH}};
-                delete $self->{SET_GROUP1};
+                pop @{$$self{PATH}};
+                delete $$self{SET_GROUP1};
             } elsif ($$segDataPt =~ /^(AVI1|Ocad)/) {
                 $dumpType = $1;
                 SetByteOrder('MM');
                 my $tagTablePtr = GetTagTable("Image::ExifTool::JPEG::$dumpType");
-                my %dirInfo = (
-                    DataPt   => $segDataPt,
-                    DataPos  => $segPos,
-                    DirStart => 4,
-                    DirLen   => $length - 4,
-                );
+                DirStart(\%dirInfo, 4);
                 $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
             }
         } elsif ($marker == 0xe1) {         # APP1 (EXIF, XMP, QVCI)
@@ -4854,13 +4998,7 @@ sub ProcessJPEG($$)
                 } elsif ($$segDataPt !~ /^Exif\0/) {
                     $self->Warn('Incorrect EXIF segment identifier',1);
                 }
-                my %dirInfo = (
-                    Parent => $markerName,
-                    DataPt => $segDataPt,
-                    DataPos => -$hdrLen, # (remember: relative to Base!)
-                    DirStart => $hdrLen,
-                    Base => $segPos + $hdrLen,
-                );
+                DirStart(\%dirInfo, $hdrLen, $hdrLen);
                 if ($htmlDump) {
                     $self->HDump($segPos-4, 4, 'APP1 header', "Data size: $length bytes");
                     $self->HDump($segPos, $hdrLen, 'Exif header', 'APP1 data type: Exif');
@@ -4878,10 +5016,10 @@ sub ProcessJPEG($$)
                     $plen = $$self{PreviewImageLength};
                 }
                 if ($start and $plen and IsInt($start) and IsInt($plen) and
-                    $start + $plen > $self->{EXIF_POS} + length($self->{EXIF_DATA}) and
-                    ($self->{REQ_TAG_LOOKUP}{previewimage} or
+                    $start + $plen > $$self{EXIF_POS} + length($$self{EXIF_DATA}) and
+                    ($$self{REQ_TAG_LOOKUP}{previewimage} or
                     # (extracted normally, so check Binary option)
-                    ($self->{OPTIONS}{Binary} and not $self->{EXCL_TAG_LOOKUP}{previewimage})))
+                    ($$self{OPTIONS}{Binary} and not $$self{EXCL_TAG_LOOKUP}{previewimage})))
                 {
                     $$self{PreviewImageStart} = $start;
                     $$self{PreviewImageLength} = $plen;
@@ -4927,15 +5065,6 @@ sub ProcessJPEG($$)
             } elsif ($$segDataPt =~ /^QVCI\0/) {
                 $dumpType = 'QVCI';
                 my $tagTablePtr = GetTagTable('Image::ExifTool::Casio::QVCI');
-                my %dirInfo = (
-                    Base     => 0,
-                    DataPt   => $segDataPt,
-                    DataPos  => $segPos,
-                    DataLen  => $length,
-                    DirStart => 0,
-                    DirLen   => $length,
-                    Parent   => $markerName,
-                );
                 $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
             } elsif ($$segDataPt =~ /^FLIR\0/ and $length >= 8) {
                 $dumpType = 'FLIR';
@@ -4985,16 +5114,8 @@ sub ProcessJPEG($$)
                     # (note: this non-standard XMP is ignored when writing)
                     my $start = ($$segDataPt =~ /^$xmpAPP1hdr/) ? length($xmpAPP1hdr) : 0;
                     my $tagTablePtr = GetTagTable('Image::ExifTool::XMP::Main');
-                    my %dirInfo = (
-                        Base     => 0,
-                        DataPt   => $segDataPt,
-                        DataPos  => $segPos,
-                        DataLen  => $length,
-                        DirStart => $start,
-                        DirLen   => $length - $start,
-                        DirName  => $start ? 'XMP' : 'XML',
-                        Parent   => $markerName,
-                    );
+                    DirStart(\%dirInfo, $start);
+                    $dirInfo{DirName} = $start ? 'XMP' : 'XML',
                     $processed = $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
                     if ($processed and not $start) {
                         $self->Warn('Non-standard header for APP1 XMP segment');
@@ -5051,27 +5172,13 @@ sub ProcessJPEG($$)
                 next if $fast and $fast > 1;    # skip processing for very fast
                 $dumpType = 'FPXR';
                 my $tagTablePtr = GetTagTable('Image::ExifTool::FlashPix::Main');
-                my %dirInfo = (
-                    DataPt   => $segDataPt,
-                    DataPos  => $segPos,
-                    DataLen  => $length,
-                    DirStart => 0,
-                    DirLen   => $length,
-                    Parent   => $markerName,
-                    # set flag if this is the last FPXR segment
-                    LastFPXR => not ($nextMarker==$marker and $$nextSegDataPt=~/^FPXR\0/),
-                );
+                # set flag if this is the last FPXR segment
+                $dirInfo{LastFPXR} = not ($nextMarker==$marker and $$nextSegDataPt=~/^FPXR\0/),
                 $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
             } elsif ($$segDataPt =~ /^MPF\0/) {
                 undef $dumpType;    # (will be dumped here)
-                my %dirInfo = (
-                    Parent => $markerName,
-                    DataPt => $segDataPt,
-                    DataPos => -4, # (relative to Base)
-                    DirStart => 4,
-                    Base => $segPos + 4,
-                    Multi => 1, # the MP Attribute IFD will be MPF1
-                );
+                DirStart(\%dirInfo, 4, 4);
+                $dirInfo{Multi} = 1;    # the MP Attribute IFD will be MPF1
                 if ($htmlDump) {
                     $self->HDump($segPos-4, 4, 'APP2 header', "Data size: $length bytes");
                     $self->HDump($segPos, 4, 'MPF header', 'APP2 data type: MPF');
@@ -5095,13 +5202,7 @@ sub ProcessJPEG($$)
         } elsif ($marker == 0xe3) {         # APP3 (Kodak "Meta", Stim)
             if ($$segDataPt =~ /^(Meta|META|Exif)\0\0/) {
                 undef $dumpType;    # (will be dumped here)
-                my %dirInfo = (
-                    Parent => $markerName,
-                    DataPt => $segDataPt,
-                    DataPos => -6, # (relative to Base)
-                    DirStart => 6,
-                    Base => $segPos + 6,
-                );
+                DirStart(\%dirInfo, 6, 6);
                 if ($htmlDump) {
                     $self->HDump($segPos-4, 10, 'APP3 Meta header');
                     $dumpEnd = $segPos + $length;
@@ -5110,13 +5211,7 @@ sub ProcessJPEG($$)
                 $self->ProcessTIFF(\%dirInfo, $tagTablePtr);
             } elsif ($$segDataPt =~ /^Stim\0/) {
                 undef $dumpType;    # (will be dumped here)
-                my %dirInfo = (
-                    Parent => $markerName,
-                    DataPt => $segDataPt,
-                    DataPos => -6, # (relative to Base)
-                    DirStart => 6,
-                    Base => $segPos + 6,
-                );
+                DirStart(\%dirInfo, 6, 6);
                 if ($htmlDump) {
                     $self->HDump($segPos-4, 4, 'APP3 header', "Data size: $length bytes");
                     $self->HDump($segPos, 5, 'Stim header', 'APP3 data type: Stim');
@@ -5148,7 +5243,7 @@ sub ProcessJPEG($$)
                         Parent => $markerName,
                         DataPt => \$scalado,
                     );
-                    my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::Scalado');
+                    my $tagTablePtr = GetTagTable('Image::ExifTool::Scalado::Main');
                     $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
                     undef $scalado;
                 }
@@ -5156,16 +5251,8 @@ sub ProcessJPEG($$)
                 next if $fast and $fast > 1;    # skip processing for very fast
                 $dumpType = 'FPXR';
                 my $tagTablePtr = GetTagTable('Image::ExifTool::FlashPix::Main');
-                my %dirInfo = (
-                    DataPt   => $segDataPt,
-                    DataPos  => $segPos,
-                    DataLen  => $length,
-                    DirStart => 0,
-                    DirLen   => $length,
-                    Parent   => $markerName,
-                    # set flag if this is the last FPXR segment
-                    LastFPXR => not ($nextMarker==$marker and $$nextSegDataPt=~/^FPXR\0/),
-                );
+                # set flag if this is the last FPXR segment
+                $dirInfo{LastFPXR} = not ($nextMarker==$marker and $$nextSegDataPt=~/^FPXR\0/),
                 $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
             } elsif ($preview) {
                 # continued Samsung S1060 preview from APP3
@@ -5180,13 +5267,7 @@ sub ProcessJPEG($$)
         } elsif ($marker == 0xe5) {         # APP5 (Ricoh "RMETA")
             if ($$segDataPt =~ /^RMETA\0/) {
                 $dumpType = 'Ricoh RMETA';
-                my %dirInfo = (
-                    Parent => $markerName,
-                    DataPt => $segDataPt,
-                    DataPos => -6, # (relative to Base)
-                    DirStart => 6,
-                    Base => $segPos + 6,
-                );
+                DirStart(\%dirInfo, 6, 6);
                 my $tagTablePtr = GetTagTable('Image::ExifTool::Ricoh::RMETA');
                 $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
             } elsif ($preview) {
@@ -5198,13 +5279,7 @@ sub ProcessJPEG($$)
         } elsif ($marker == 0xe6) {         # APP6 (Toshiba EPPIM, NITF, HP_TDHD)
             if ($$segDataPt =~ /^EPPIM\0/) {
                 undef $dumpType;    # (will be dumped here)
-                my %dirInfo = (
-                    Parent => $markerName,
-                    DataPt => $segDataPt,
-                    DataPos => -6, # (relative to Base)
-                    DirStart => 6,
-                    Base => $segPos + 6,
-                );
+                DirStart(\%dirInfo, 6, 6);
                 if ($htmlDump) {
                     $self->HDump($segPos-4, 10, 'APP6 EPPIM header');
                     $dumpEnd = $segPos + $length;
@@ -5215,71 +5290,91 @@ sub ProcessJPEG($$)
                 $dumpType = 'NITF';
                 SetByteOrder('MM');
                 my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::NITF');
-                my %dirInfo = (
-                    DataPt   => $segDataPt,
-                    DataPos  => $segPos,
-                    DirStart => 5,
-                    DirLen   => $length - 5,
-                );
+                DirStart(\%dirInfo, 5);
                 $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
             } elsif ($$segDataPt =~ /^TDHD\x01\0\0\0/ and $length > 12) {
                 # HP Photosmart R837 APP6 "TDHD" segment
                 $dumpType = 'TDHD';
                 my $tagTablePtr = GetTagTable('Image::ExifTool::HP::TDHD');
-                my %dirInfo = (
-                    DataPt   => $segDataPt,
-                    DataPos  => $segPos,
-                    DirStart => 12, # (ignore first TDHD element because size includes 12-byte tag header)
-                    DirLen   => $length - 12,
-                );
+                # (ignore first TDHD element because size includes 12-byte tag header)
+                DirStart(\%dirInfo, 12);
                 $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
             }
-        } elsif ($marker == 0xe7) {         # APP7 (Qualcomm)
-            if ($$segDataPt =~ /^\x1aQualcomm Camera Attributes/) {
+        } elsif ($marker == 0xe7) {         # APP7 (Pentax, Qualcomm)
+            if ($$segDataPt =~ /^PENTAX \0(II|MM)/) {
+                # found in K-3 images (is this multi-segment??)
+                SetByteOrder($1);
+                undef $dumpType; # (dump this ourself)
+                my $hdrLen = 10;
+                my $tagTablePtr = GetTagTable('Image::ExifTool::Pentax::Main');
+                DirStart(\%dirInfo, $hdrLen, 0);
+                $dirInfo{DirName} = 'Pentax APP7';
+                if ($htmlDump) {
+                    $self->HDump($segPos-4, 4, 'APP7 header', "Data size: $length bytes");
+                    $self->HDump($segPos, $hdrLen, 'Pentax header', 'APP7 data type: Pentax');
+                    $dumpEnd = $segPos + $length;
+                }
+                $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
+            } elsif ($$segDataPt =~ /^\x1aQualcomm Camera Attributes/) {
                 # found in HP iPAQ_VoiceMessenger
                 $dumpType = 'Qualcomm';
                 my $tagTablePtr = GetTagTable('Image::ExifTool::Qualcomm::Main');
-                my %dirInfo = (
-                    DataPt   => $segDataPt,
-                    DataPos  => $segPos,
-                    DirStart => 27, # (skip header)
-                    DirLen   => $length - 27,
-                    DirName  => 'Qualcomm',
-                );
+                DirStart(\%dirInfo, 27);
+                $dirInfo{DirName} = 'Qualcomm';
                 $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
             }
         } elsif ($marker == 0xe8) {         # APP8 (SPIFF)
             # my sample SPIFF has 32 bytes of data, but spec states 30
             if ($$segDataPt =~ /^SPIFF\0/ and $length == 32) {
                 $dumpType = 'SPIFF';
-                my %dirInfo = (
-                    DataPt   => $segDataPt,
-                    DataPos  => $segPos,
-                    DirStart => 6,
-                    DirLen   => $length - 6,
-                );
+                DirStart(\%dirInfo, 6);
                 my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::SPIFF');
                 $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
             }
+        } elsif ($marker == 0xe9) {         # APP9 (Media Jukebox)
+            if ($$segDataPt =~ /^Media Jukebox\0/ and $length > 22) {
+                $dumpType = 'MediaJukebox';
+                # (start parsing after the "<MJMD>")
+                DirStart(\%dirInfo, 22);
+                $dirInfo{DirName} = 'MediaJukebox';
+                require Image::ExifTool::XMP;
+                my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::MediaJukebox');
+                $self->ProcessDirectory(\%dirInfo, $tagTablePtr, \&Image::ExifTool::XMP::ProcessXMP);
+            }
         } elsif ($marker == 0xea) {         # APP10 (PhotoStudio Unicode comments)
             if ($$segDataPt =~ /^UNICODE\0/) {
                 $dumpType = 'PhotoStudio';
                 my $comment = $self->Decode(substr($$segDataPt,8), 'UCS2', 'MM');
                 $self->FoundTag('Comment', $comment);
             }
+        } elsif ($marker == 0xeb) {         # APP11 (JPEG-HDR)
+            if ($$segDataPt =~ /^HDR_RI /) {
+                $dumpType = 'JPEG-HDR';
+                my $dataPt = $segDataPt;
+                if (defined $combinedSegData) {
+                    if ($$segDataPt =~ /~\0/g) {
+                        $combinedSegData .= substr($$segDataPt,pos($$segDataPt));
+                    } else {
+                        $self->Warn('Invalid format for JPEG-HDR extended segment');
+                    }
+                    $dataPt = \$combinedSegData;
+                }
+                if ($nextMarker == $marker and $$nextSegDataPt =~ /^HDR_RI /) {
+                    $combinedSegData = $$segDataPt unless defined $combinedSegData;
+                } else {
+                    my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::HDR');
+                    my %dirInfo = ( DataPt => $dataPt );
+                    $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
+                    undef $combinedSegData;
+                }
+            }
         } elsif ($marker == 0xec) {         # APP12 (Ducky, Picture Info)
             if ($$segDataPt =~ /^Ducky/) {
                 $dumpType = 'Ducky';
-                my %dirInfo = (
-                    DataPt   => $segDataPt,
-                    DataPos  => $segPos,
-                    DirStart => 5,
-                    DirLen   => $length - 5,
-                );
+                DirStart(\%dirInfo, 5);
                 my $tagTablePtr = GetTagTable('Image::ExifTool::APP12::Ducky');
                 $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
             } else {
-                my %dirInfo = ( DataPt => $segDataPt );
                 my $tagTablePtr = GetTagTable('Image::ExifTool::APP12::PictureInfo');
                 $self->ProcessDirectory(\%dirInfo, $tagTablePtr) and $dumpType = 'Picture Info';
             }
@@ -5299,15 +5394,15 @@ sub ProcessJPEG($$)
                     $combinedSegData = $$segDataPt unless defined $combinedSegData;
                     # (will handle the Photoshop data the next time around)
                 } else {
-                    my $hdrlen = $isOld ? 27 : 14;
+                    my $hdrLen = $isOld ? 27 : 14;
                     # process APP13 Photoshop record
                     my $tagTablePtr = GetTagTable('Image::ExifTool::Photoshop::Main');
                     my %dirInfo = (
                         DataPt   => $dataPt,
                         DataPos  => $segPos,
                         DataLen  => length $$dataPt,
-                        DirStart => $hdrlen,    # directory starts after identifier
-                        DirLen   => length($$dataPt) - $hdrlen,
+                        DirStart => $hdrLen,    # directory starts after identifier
+                        DirLen   => length($$dataPt) - $hdrLen,
                         Parent   => $markerName,
                     );
                     $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
@@ -5317,12 +5412,7 @@ sub ProcessJPEG($$)
                 $dumpType = 'Adobe_CM';
                 SetByteOrder('MM');
                 my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::AdobeCM');
-                my %dirInfo = (
-                    DataPt   => $segDataPt,
-                    DataPos  => $segPos,
-                    DirStart => 8,
-                    DirLen   => $length - 8,
-                );
+                DirStart(\%dirInfo, 8);
                 $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
             }
         } elsif ($marker == 0xee) {         # APP14 (Adobe)
@@ -5337,12 +5427,7 @@ sub ProcessJPEG($$)
                 $dumpType = 'Adobe';
                 SetByteOrder('MM');
                 my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::Adobe');
-                my %dirInfo = (
-                    DataPt   => $segDataPt,
-                    DataPos  => $segPos,
-                    DirStart => 5,
-                    DirLen   => $length - 5,
-                );
+                DirStart(\%dirInfo, 5);
                 $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
             }
         } elsif ($marker == 0xef) {         # APP15 (GraphicConverter)
@@ -5372,7 +5457,7 @@ sub ProcessJPEG($$)
             undef $dumpType;    # only dump unknown APP segments
         }
         if (defined $dumpType) {
-            if (not $dumpType and $self->{OPTIONS}{Unknown}) {
+            if (not $dumpType and $$self{OPTIONS}{Unknown}) {
                 $self->Warn("Unknown $markerName segment", 1);
             }
             if ($htmlDump) {
@@ -5399,6 +5484,16 @@ sub ProcessJPEG($$)
 }
 
 #------------------------------------------------------------------------------
+# Extract metadata from an Exiv2 EXV file
+# Inputs: 0) ExifTool object reference, 1) dirInfo ref with RAF set
+# Returns: 1 on success, 0 if this wasn't a valid JPEG file
+sub ProcessEXV($$)
+{
+    my ($self, $dirInfo) = @_;
+    return $self->ProcessJPEG($dirInfo);
+}
+
+#------------------------------------------------------------------------------
 # Process EXIF file
 # Inputs/Returns: same as ProcessTIFF
 sub ProcessEXIF($$;$)
@@ -5437,10 +5532,10 @@ sub DoProcessTIFF($$;$)
     my $raf = $$dirInfo{RAF};
     my $base = $$dirInfo{Base} || 0;
     my $outfile = $$dirInfo{OutFile};
-    my ($err, $canonSig, $otherSig);
+    my ($err, $sig, $canonSig, $otherSig);
 
     # attempt to read TIFF header
-    $self->{EXIF_DATA} = '';
+    $$self{EXIF_DATA} = '';
     if ($raf) {
         if ($outfile) {
             $raf->Seek(0, 0) or return 0;
@@ -5453,17 +5548,17 @@ sub DoProcessTIFF($$;$)
         }
         # extract full EXIF block (for block copy) from EXIF file
         my $amount = $fileType eq 'EXIF' ? 65536 * 8 : 8;
-        my $n = $raf->Read($self->{EXIF_DATA}, $amount);
+        my $n = $raf->Read($$self{EXIF_DATA}, $amount);
         if ($n < 8) {
             return 0 if $n or not $outfile or $fileType ne 'EXIF';
             # create EXIF file from scratch
-            delete $self->{EXIF_DATA};
+            delete $$self{EXIF_DATA};
             undef $raf;
         }
         if ($n > 8) {
             $raf->Seek(8, 0);
             if ($n == $amount) {
-                $self->{EXIF_DATA} = substr($self->{EXIF_DATA}, 0, 8);
+                $$self{EXIF_DATA} = substr($$self{EXIF_DATA}, 0, 8);
                 $self->Warn('EXIF too large to extract as a block'); #(shouldn't happen)
             }
         }
@@ -5471,24 +5566,24 @@ sub DoProcessTIFF($$;$)
         # save a copy of the EXIF data
         my $dirStart = $$dirInfo{DirStart} || 0;
         my $dirLen = $$dirInfo{DirLen} || (length($$dataPt) - $dirStart);
-        $self->{EXIF_DATA} = substr($$dataPt, $dirStart, $dirLen);
-        $self->VerboseDir('TIFF') if $self->{OPTIONS}{Verbose} and length($$self{INDENT}) > 2;
+        $$self{EXIF_DATA} = substr($$dataPt, $dirStart, $dirLen);
+        $self->VerboseDir('TIFF') if $$self{OPTIONS}{Verbose} and length($$self{INDENT}) > 2;
     } elsif ($outfile) {
-        delete $self->{EXIF_DATA};  # create from scratch
+        delete $$self{EXIF_DATA};  # create from scratch
     } else {
-        $self->{EXIF_DATA} = '';
+        $$self{EXIF_DATA} = '';
     }
-    unless (defined $self->{EXIF_DATA}) {
+    unless (defined $$self{EXIF_DATA}) {
         # create TIFF information from scratch
         if ($self->SetPreferredByteOrder() eq 'MM') {
-            $self->{EXIF_DATA} = "MM\0\x2a\0\0\0\x08";
+            $$self{EXIF_DATA} = "MM\0\x2a\0\0\0\x08";
         } else {
-            $self->{EXIF_DATA} = "II\x2a\0\x08\0\0\0";
+            $$self{EXIF_DATA} = "II\x2a\0\x08\0\0\0";
         }
     }
     $$self{FIRST_EXIF_POS} = $base + $$self{BASE} unless defined $$self{FIRST_EXIF_POS};
     $$self{EXIF_POS} = $base + $$self{BASE};
-    $dataPt = \$self->{EXIF_DATA};
+    $dataPt = \$$self{EXIF_DATA};
 
     # set byte ordering
     my $byteOrder = substr($$dataPt,0,2);
@@ -5506,16 +5601,21 @@ sub DoProcessTIFF($$;$)
     $offset >= 8 or return 0;
 
     if ($raf) {
-        # Canon CR2 images usually have an offset of 16, but it may be
-        # greater if edited by PhotoMechanic, so check the 4-byte signature
+        # check for canon or EXIF signature
+        # (Canon CR2 images should have an offset of 16, but it may be
+        #  greater if edited by PhotoMechanic)
         if ($identifier == 0x2a and $offset >= 16) {
-            $raf->Read($canonSig, 8) == 8 or return 0;
-            $$dataPt .= $canonSig;
-            if ($canonSig =~ /^(CR\x02\0|\xba\xb0\xac\xbb)/) {
-                $fileType = $canonSig =~ /^CR/ ? 'CR2' : 'Canon 1D RAW';
-                $self->HDump($base+8, 8, "[$fileType header]") if $self->{HTML_DUMP};
-            } else {
-                undef $canonSig;
+            $raf->Read($sig, 8) == 8 or return 0;
+            $$dataPt .= $sig;
+            if ($sig =~ /^(CR\x02\0|\xba\xb0\xac\xbb|ExifMeta)/) {
+                if ($sig eq 'ExifMeta') {
+                    $self->SetFileType($fileType = 'EXIF');
+                    $otherSig = $sig;
+                } else {
+                    $fileType = $sig =~ /^CR/ ? 'CR2' : 'Canon 1D RAW';
+                    $canonSig = $sig;
+                }
+                $self->HDump($base+8, 8, "[$fileType header]") if $$self{HTML_DUMP};
             }
         } elsif ($identifier == 0x55 and $fileType =~ /^(RAW|RW2|RWL|TIFF)$/) {
             # panasonic RAW, RW2 or RWL file
@@ -5553,7 +5653,7 @@ sub DoProcessTIFF($$;$)
             }
         }
         # we have a valid TIFF (or whatever) file
-        if ($fileType and not $self->{VALUE}{FileType}) {
+        if ($fileType and not $$self{VALUE}{FileType}) {
             my $lookup = $fileTypeLookup{$fileType};
             $lookup = $fileTypeLookup{$lookup} unless ref $lookup or not $lookup;
             # use file extension to pre-determine type if extension is TIFF-based or type is RAW
@@ -5568,13 +5668,13 @@ sub DoProcessTIFF($$;$)
     } else {
         $ifdName = $$tagTablePtr{GROUPS}{1};
     }
-    if ($self->{HTML_DUMP}) {
+    if ($$self{HTML_DUMP}) {
         my $tip = sprintf("Byte order: %s endian\nIdentifier: 0x%.4x\n$ifdName offset: 0x%.4x",
                           ($byteOrder eq 'II') ? 'Little' : 'Big', $identifier, $offset);
         $self->HDump($base, 8, 'TIFF header', $tip, 0);
     }
     # remember where we found the TIFF data (APP1, APP3, TIFF, NEF, etc...)
-    $self->{TIFF_TYPE} = $fileType;
+    $$self{TIFF_TYPE} = $fileType;
 
     # get reference to the main EXIF table
     $tagTablePtr or $tagTablePtr = GetTagTable('Image::ExifTool::Exif::Main');
@@ -5599,7 +5699,7 @@ sub DoProcessTIFF($$;$)
         # process the directory
         $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
         # process GeoTiff information if available
-        if ($self->{VALUE}{GeoTiffDirectory}) {
+        if ($$self{VALUE}{GeoTiffDirectory}) {
             require Image::ExifTool::GeoTiff;
             Image::ExifTool::GeoTiff::ProcessGeoTiff($self);
         }
@@ -5620,7 +5720,7 @@ sub DoProcessTIFF($$;$)
            }
         }
         # update FileType if necessary now that we know more about the file
-        if ($$self{DNGVersion} and $self->{VALUE}{FileType} ne 'DNG') {
+        if ($$self{DNGVersion} and $$self{VALUE}{FileType} ne 'DNG') {
             # override whatever FileType we set since we now know it is DNG
             $self->OverrideFileType('DNG');
         }
@@ -5630,10 +5730,10 @@ sub DoProcessTIFF($$;$)
 # rewrite the image
 #
     if ($$dirInfo{NoTiffEnd}) {
-        delete $self->{TIFF_END};
+        delete $$self{TIFF_END};
     } else {
         # initialize TIFF_END so it will be updated by WriteExif()
-        $self->{TIFF_END} = 0;
+        $$self{TIFF_END} = 0;
     }
     if ($canonSig) {
         # write Canon CR2 specially because it has a header we want to preserve,
@@ -5643,7 +5743,11 @@ sub DoProcessTIFF($$;$)
         Image::ExifTool::CanonRaw::WriteCR2($self, \%dirInfo, $tagTablePtr) or $err = 1;
     } else {
         # write TIFF header (8 bytes [plus optional signature] followed by IFD)
-        $otherSig = '' unless defined $otherSig;
+        if ($fileType eq 'EXIF') {
+            $otherSig = 'ExifMeta'; # force this signature for all EXIF files
+        } elsif (not defined $otherSig) {
+            $otherSig = '';
+        }
         my $offset = 8 + length($otherSig);
         # construct tiff header
         my $header = substr($$dataPt, 0, 4) . Set32u($offset) . $otherSig;
@@ -5683,8 +5787,8 @@ sub DoProcessTIFF($$;$)
         }
     }
     # make local copy of TIFF_END now (it may be reset when processing trailers)
-    my $tiffEnd = $self->{TIFF_END};
-    delete $self->{TIFF_END};
+    my $tiffEnd = $$self{TIFF_END};
+    delete $$self{TIFF_END};
 
     # rewrite trailers if they exist
     if ($raf and $tiffEnd and not $err) {
@@ -5718,9 +5822,9 @@ sub DoProcessTIFF($$;$)
         }
         if ($extra > 0) {
             my $known = $$self{KnownTrailer};
-            if ($self->{DEL_GROUP}{Trailer} and not $known) {
+            if ($$self{DEL_GROUP}{Trailer} and not $known) {
                 $self->VPrint(0, "  Deleting unknown trailer ($extra bytes)\n");
-                ++$self->{CHANGED};
+                ++$$self{CHANGED};
             } elsif ($known) {
                 $self->VPrint(0, "  Copying $$known{Name} ($extra bytes)\n");
                 $raf->Seek($tiffEnd, 0) or $err = 1;
@@ -5846,7 +5950,7 @@ sub GetTagTable($)
             $$table{LANG_INFO} = \&Image::ExifTool::XMP::GetLangInfo unless $$table{LANG_INFO};
         }
         # generate a tag prefix for unknown tags if necessary
-        unless ($$table{TAG_PREFIX}) {
+        unless (defined $$table{TAG_PREFIX}) {
             my $tagPrefix;
             if ($tableName =~ /Image::.*?::(.*)::Main/ || $tableName =~ /Image::.*?::(.*)/) {
                 ($tagPrefix = $1) =~ s/::/_/g;
@@ -5899,26 +6003,27 @@ sub ProcessDirectory($$$;$)
         ($$dirInfo{DirLen} or not defined $$dirInfo{DirLen}))
     {
         my $addr = $$dirInfo{DirStart} + $$dirInfo{DataPos} + ($$dirInfo{Base}||0);
-        if ($self->{PROCESSED}{$addr}) {
-            $self->Warn("$dirName pointer references previous $self->{PROCESSED}{$addr} directory");
-            return 0;
+        if ($$self{PROCESSED}{$addr}) {
+            $self->Warn("$dirName pointer references previous $$self{PROCESSED}{$addr} directory");
+            # patch for bug in Windows phone 7.5 O/S that writes incorrect InteropIFD pointer
+            return 0 unless $dirName eq 'GPS' and $$self{PROCESSED}{$addr} eq 'InteropIFD';
         }
-        $self->{PROCESSED}{$addr} = $dirName;
+        $$self{PROCESSED}{$addr} = $dirName;
     }
     my $oldOrder = GetByteOrder();
-    my $oldIndent = $self->{INDENT};
-    my $oldDir = $self->{DIR_NAME};
-    $self->{LIST_TAGS} = { };  # don't build lists across different directories
-    $self->{INDENT} .= '| ';
-    $self->{DIR_NAME} = $dirName;
-    push @{$self->{PATH}}, $dirName;
+    my $oldIndent = $$self{INDENT};
+    my $oldDir = $$self{DIR_NAME};
+    $$self{LIST_TAGS} = { };    # don't build lists across different directories
+    $$self{INDENT} .= '| ';
+    $$self{DIR_NAME} = $dirName;
+    push @{$$self{PATH}}, $dirName;
 
     # process the directory
     my $rtnVal = &$proc($self, $dirInfo, $tagTablePtr);
 
-    pop @{$self->{PATH}};
-    $self->{INDENT} = $oldIndent;
-    $self->{DIR_NAME} = $oldDir;
+    pop @{$$self{PATH}};
+    $$self{INDENT} = $oldIndent;
+    $$self{DIR_NAME} = $oldDir;
     SetByteOrder($oldOrder);
     return $rtnVal;
 }
@@ -5941,7 +6046,7 @@ sub GetFileExtension($)
 {
     my $filename = shift;
     my $fileExt;
-    if ($filename and $filename =~ /.*\.([^.]+)$/) {
+    if ($filename and $filename =~ /^.*\.([^.]+)$/s) {
         $fileExt = uc($1);   # change extension to upper case
         # convert TIF extension to TIFF because we use the
         # extension for the file type tag of TIFF images
@@ -6060,8 +6165,8 @@ sub AddTagToTable($$;$$)
     if ($$tagInfo{Groups}) {
         # fill in default groups from table GROUPS
         foreach (keys %{$$tagTablePtr{GROUPS}}) {
-            next if $tagInfo->{Groups}{$_};
-            $tagInfo->{Groups}{$_} = $tagTablePtr->{GROUPS}{$_};
+            next if $$tagInfo{Groups}{$_};
+            $$tagInfo{Groups}{$_} = $$tagTablePtr{GROUPS}{$_};
         }
     } else {
         $$tagInfo{Groups} = { %{$$tagTablePtr{GROUPS}} };
@@ -6079,7 +6184,7 @@ sub AddTagToTable($$;$$)
         $name = $tagID;
         $name =~ tr/-_a-zA-Z0-9//dc;    # remove illegal characters
         $name = ucfirst $name;          # start with uppercase
-        # make sure name is a reasonable length
+        # add prefix if specified
         my $prefix = $$tagTablePtr{TAG_PREFIX};
         if ($prefix and not $noPrefix) {
             # make description to prevent tagID from getting mangled by MakeDescription()
@@ -6087,8 +6192,8 @@ sub AddTagToTable($$;$$)
             $name = "${prefix}_$name";
         }
     }
-    # tag names must be at least 2 characters long and begin with a letter
-    $name = "Tag$name" if length($name) <= 1 or $name !~ /^[A-Z]/i;
+    # tag names must be at least 2 characters long and prefer them to start with a letter
+    $name = "Tag$name" if length($name) < 2 or $name !~ /^[A-Z]/i;
     $$tagInfo{Name} = $name;
     # add tag to table, but never overwrite existing entries (could potentially happen
     # if someone thinks there isn't any tagInfo because a condition wasn't satisfied)
@@ -6108,7 +6213,7 @@ sub AddTagToTable($$;$$)
 sub HandleTag($$$$;%)
 {
     my ($self, $tagTablePtr, $tag, $val, %parms) = @_;
-    my $verbose = $self->{OPTIONS}{Verbose};
+    my $verbose = $$self{OPTIONS}{Verbose};
     my $tagInfo = $parms{TagInfo} || $self->GetTagInfo($tagTablePtr, $tag, \$val);
     my $dataPt = $parms{DataPt};
     my ($subdir, $format, $count, $size, $noTagInfo, $rational);
@@ -6214,9 +6319,15 @@ sub FoundTag($$$)
         # make temporary hash if tag doesn't exist in Extra
         # (not advised to do this since the tag won't show in list)
         $tagInfo or $tagInfo = { Name => $tag, Groups => \%allGroupsExifTool };
-        $self->{OPTIONS}{Verbose} and $self->VerboseInfo(undef, $tagInfo, Value => $value);
+        $$self{OPTIONS}{Verbose} and $self->VerboseInfo(undef, $tagInfo, Value => $value);
     }
-    my $valueHash = $self->{VALUE};
+    # get tag priority
+    my $priority = $$tagInfo{Priority};
+    unless (defined $priority) {
+        $priority = $$tagInfo{Table}{PRIORITY};
+        $priority = 0 if not defined $priority and $$tagInfo{Avoid};
+    }
+    my $valueHash = $$self{VALUE};
     if ($$tagInfo{RawConv}) {
         # initialize @val for use in Composite RawConv expressions
         my @val;
@@ -6231,30 +6342,24 @@ sub FoundTag($$$)
         } else {
             my $val = $value;   # do this so eval can use $val
             # NOTE: RawConv is also evaluated in Writer.pl
-            #### eval RawConv ($self, $val, $tag, $tagInfo)
+            #### eval RawConv ($self, $val, $tag, $tagInfo, $priority)
             $value = eval $conv;
             $@ and $evalWarning = $@;
         }
         $self->Warn("RawConv $tag: " . CleanWarning()) if $evalWarning;
         return undef unless defined $value;
     }
-    # get tag priority
-    my $priority = $$tagInfo{Priority};
-    unless (defined $priority) {
-        $priority = $tagInfo->{Table}{PRIORITY};
-        $priority = 0 if not defined $priority and $$tagInfo{Avoid};
-    }
     # handle duplicate tag names
     if (defined $$valueHash{$tag}) {
         # add to list if there is an active list for this tag
-        if ($self->{LIST_TAGS}{$tagInfo}) {
-            $tag = $self->{LIST_TAGS}{$tagInfo};  # use key from previous list tag
+        if ($$self{LIST_TAGS}{$tagInfo}) {
+            $tag = $$self{LIST_TAGS}{$tagInfo}; # use key from previous list tag
             if (defined $$self{NO_LIST}) {
                 # accumulate list in TAG_EXTRA "NoList" element
-                if (defined $self->{TAG_EXTRA}{$tag}{NoList}) {
-                    push @{$self->{TAG_EXTRA}{$tag}{NoList}}, $value;
+                if (defined $$self{TAG_EXTRA}{$tag}{NoList}) {
+                    push @{$$self{TAG_EXTRA}{$tag}{NoList}}, $value;
                 } else {
-                    $self->{TAG_EXTRA}{$tag}{NoList} = [ $$valueHash{$tag}, $value ];
+                    $$self{TAG_EXTRA}{$tag}{NoList} = [ $$valueHash{$tag}, $value ];
                 }
                 $noListDel = 1; # set flag to delete this tag if re-listed
             } else {
@@ -6266,17 +6371,17 @@ sub FoundTag($$$)
             }
         }
         # get next available tag key
-        my $nextInd = $self->{DUPL_TAG}{$tag} = ($self->{DUPL_TAG}{$tag} || 0) + 1;
+        my $nextInd = $$self{DUPL_TAG}{$tag} = ($$self{DUPL_TAG}{$tag} || 0) + 1;
         my $nextTag = "$tag ($nextInd)";
 #
 # take tag with highest priority
 #
         # promote existing 0-priority tag so it takes precedence over a new 0-tag
         # (unless old tag was a sub-document and new tag isn't)
-        my $oldPriority = $self->{PRIORITY}{$tag};
+        my $oldPriority = $$self{PRIORITY}{$tag};
         unless ($oldPriority) {
-            if ($self->{DOC_NUM} or not $self->{TAG_EXTRA}{$tag} or
-                                    not $self->{TAG_EXTRA}{$tag}{G3})
+            if ($$self{DOC_NUM} or not $$self{TAG_EXTRA}{$tag} or
+                                   not $$self{TAG_EXTRA}{$tag}{G3})
             {
                 $oldPriority = 1;
             } else {
@@ -6293,55 +6398,55 @@ sub FoundTag($$$)
         } else {
             $priority = 1;  # the normal default
         }
-        if ($priority >= $oldPriority and not $self->{DOC_NUM} and not $noListDel) {
+        if ($priority >= $oldPriority and not $$self{DOC_NUM} and not $noListDel) {
             # move existing tag out of the way since this tag is higher priority
             # (NOTE: any new members added here must also be added to DeleteTag())
-            $self->{MOVED_KEY} = $nextTag;  # used in BuildCompositeTags()
-            $self->{PRIORITY}{$nextTag} = $self->{PRIORITY}{$tag};
+            $$self{MOVED_KEY} = $nextTag;  # used in BuildCompositeTags()
+            $$self{PRIORITY}{$nextTag} = $$self{PRIORITY}{$tag};
             $$valueHash{$nextTag} = $$valueHash{$tag};
-            $self->{FILE_ORDER}{$nextTag} = $self->{FILE_ORDER}{$tag};
-            my $oldInfo = $self->{TAG_INFO}{$nextTag} = $self->{TAG_INFO}{$tag};
+            $$self{FILE_ORDER}{$nextTag} = $$self{FILE_ORDER}{$tag};
+            my $oldInfo = $$self{TAG_INFO}{$nextTag} = $$self{TAG_INFO}{$tag};
             foreach ('TAG_EXTRA','RATIONAL') {
-                if ($self->{$_}{$tag}) {
-                    $self->{$_}{$nextTag} = $self->{$_}{$tag};
-                    delete $self->{$_}{$tag};
+                if ($$self{$_}{$tag}) {
+                    $$self{$_}{$nextTag} = $$self{$_}{$tag};
+                    delete $$self{$_}{$tag};
                 }
             }
-            delete $self->{BOTH}{$tag};
+            delete $$self{BOTH}{$tag};
             # update tag key for list if necessary
-            $self->{LIST_TAGS}{$oldInfo} = $nextTag if $self->{LIST_TAGS}{$oldInfo};
+            $$self{LIST_TAGS}{$oldInfo} = $nextTag if $$self{LIST_TAGS}{$oldInfo};
         } else {
             $tag = $nextTag;        # don't override the existing tag
         }
-        $self->{PRIORITY}{$tag} = $priority;
-        $self->{TAG_EXTRA}{$tag}{NoListDel} = 1 if $noListDel;
+        $$self{PRIORITY}{$tag} = $priority;
+        $$self{TAG_EXTRA}{$tag}{NoListDel} = 1 if $noListDel;
     } elsif ($priority) {
         # set tag priority (only if exists and is non-zero)
-        $self->{PRIORITY}{$tag} = $priority;
+        $$self{PRIORITY}{$tag} = $priority;
     }
 
     # save the raw value, file order, tagInfo ref, group1 name,
     # and tag key for lists if necessary
     $$valueHash{$tag} = $value;
-    $self->{FILE_ORDER}{$tag} = ++$self->{NUM_FOUND};
-    $self->{TAG_INFO}{$tag} = $tagInfo;
+    $$self{FILE_ORDER}{$tag} = ++$$self{NUM_FOUND};
+    $$self{TAG_INFO}{$tag} = $tagInfo;
     # set dynamic groups 0, 1 and 3 if necessary
-    $self->{TAG_EXTRA}{$tag}{G0} = $self->{SET_GROUP0} if $self->{SET_GROUP0};
-    $self->{TAG_EXTRA}{$tag}{G1} = $self->{SET_GROUP1} if $self->{SET_GROUP1};
-    if ($self->{DOC_NUM}) {
-        $self->{TAG_EXTRA}{$tag}{G3} = $self->{DOC_NUM};
-        if ($self->{DOC_NUM} =~ /^(\d+)/) {
+    $$self{TAG_EXTRA}{$tag}{G0} = $$self{SET_GROUP0} if $$self{SET_GROUP0};
+    $$self{TAG_EXTRA}{$tag}{G1} = $$self{SET_GROUP1} if $$self{SET_GROUP1};
+    if ($$self{DOC_NUM}) {
+        $$self{TAG_EXTRA}{$tag}{G3} = $$self{DOC_NUM};
+        if ($$self{DOC_NUM} =~ /^(\d+)/) {
             # keep track of maximum 1st-level sub-document number
-            $self->{DOC_COUNT} = $1 unless $self->{DOC_COUNT} >= $1;
+            $$self{DOC_COUNT} = $1 unless $$self{DOC_COUNT} >= $1;
         }
     }
     # save path if requested
-    $self->{TAG_EXTRA}{$tag}{G5} = $self->MetadataPath() if $self->{OPTIONS}{SavePath};
+    $$self{TAG_EXTRA}{$tag}{G5} = $self->MetadataPath() if $$self{OPTIONS}{SavePath};
 
     # remember this tagInfo if we will be accumulating values in a list
     # (but don't override earlier list if this may be deleted by NoListDel flag)
     if ($$tagInfo{List} and not $$self{NO_LIST} and not $noListDel) {
-        $self->{LIST_TAGS}{$tagInfo} = $tag;
+        $$self{LIST_TAGS}{$tagInfo} = $tag;
     }
 
     return $tag;
@@ -6353,7 +6458,7 @@ sub FoundTag($$$)
 sub SetPriorityDir($)
 {
     my $self = shift;
-    $self->{PRIORITY_DIR} = $self->{DIR_NAME} unless $self->{PRIORITY_DIR};
+    $$self{PRIORITY_DIR} = $$self{DIR_NAME} unless $$self{PRIORITY_DIR};
 }
 
 #------------------------------------------------------------------------------
@@ -6362,7 +6467,7 @@ sub SetPriorityDir($)
 sub SetGroup($$$;$)
 {
     my ($self, $tagKey, $extra, $fam) = @_;
-    $self->{TAG_EXTRA}{$tagKey}{defined $fam ? "G$fam" : 'G1'} = $extra;
+    $$self{TAG_EXTRA}{$tagKey}{defined $fam ? "G$fam" : 'G1'} = $extra;
 }
 
 #------------------------------------------------------------------------------
@@ -6371,13 +6476,13 @@ sub SetGroup($$$;$)
 sub DeleteTag($$)
 {
     my ($self, $tag) = @_;
-    delete $self->{VALUE}{$tag};
-    delete $self->{FILE_ORDER}{$tag};
-    delete $self->{TAG_INFO}{$tag};
-    delete $self->{TAG_EXTRA}{$tag};
-    delete $self->{PRIORITY}{$tag};
-    delete $self->{RATIONAL}{$tag};
-    delete $self->{BOTH}{$tag};
+    delete $$self{VALUE}{$tag};
+    delete $$self{FILE_ORDER}{$tag};
+    delete $$self{TAG_INFO}{$tag};
+    delete $$self{TAG_EXTRA}{$tag};
+    delete $$self{PRIORITY}{$tag};
+    delete $$self{RATIONAL}{$tag};
+    delete $$self{BOTH}{$tag};
 }
 
 #------------------------------------------------------------------------------
@@ -6408,8 +6513,8 @@ sub DoEscape($$)
 sub SetFileType($;$$)
 {
     my ($self, $fileType, $mimeType) = @_;
-    unless ($self->{VALUE}{FileType} and not $$self{DOC_NUM}) {
-        my $baseType = $self->{FILE_TYPE};
+    unless ($$self{VALUE}{FileType} and not $$self{DOC_NUM}) {
+        my $baseType = $$self{FILE_TYPE};
         $fileType or $fileType = $baseType;
         $mimeType or $mimeType = $mimeType{$fileType};
         # use base file type if necessary (except if 'TIFF', which is a special case)
@@ -6445,12 +6550,12 @@ sub ModifyMimeType($;$)
 {
     my ($self, $mime) = @_;
     $mime =~ m{/} or $mime = $mimeType{$mime} or return;
-    my $old = $self->{VALUE}{MIMEType};
+    my $old = $$self{VALUE}{MIMEType};
     if (defined $old) {
         my ($a, $b) = split '/', $old;
         my ($c, $d) = split '/', $mime;
         $d =~ s/^x-//;
-        $self->{VALUE}{MIMEType} = "$c/$b-$d";
+        $$self{VALUE}{MIMEType} = "$c/$b-$d";
         $self->VPrint(0, "  Modified MIMEType = $c/$b-$d\n");
     } else {
         $self->FoundTag('MIMEType', $mime);
@@ -6464,9 +6569,10 @@ sub VPrint($$@)
 {
     my $self = shift;
     my $level = shift;
-    if ($self->{OPTIONS}{Verbose} and $self->{OPTIONS}{Verbose} > $level) {
-        my $out = $self->{OPTIONS}{TextOut};
+    if ($$self{OPTIONS}{Verbose} and $$self{OPTIONS}{Verbose} > $level) {
+        my $out = $$self{OPTIONS}{TextOut};
         print $out @_;
+        print $out "\n" unless $_[-1] =~ /\n$/;
     }
 }
 
@@ -6477,11 +6583,11 @@ sub VerboseDump($$;%)
 {
     my $self = shift;
     my $dataPt = shift;
-    if ($self->{OPTIONS}{Verbose} and $self->{OPTIONS}{Verbose} > 2) {
+    if ($$self{OPTIONS}{Verbose} and $$self{OPTIONS}{Verbose} > 2) {
         my %parms = (
-            Prefix => $self->{INDENT},
-            Out    => $self->{OPTIONS}{TextOut},
-            MaxLen => $self->{OPTIONS}{Verbose} < 4 ? 96 : undef,
+            Prefix => $$self{INDENT},
+            Out    => $$self{OPTIONS}{TextOut},
+            MaxLen => $$self{OPTIONS}{Verbose} < 4 ? 96 : undef,
         );
         HexDump($dataPt, undef, %parms, @_);
     }
@@ -6517,14 +6623,14 @@ sub ExtractBinary($$$;$)
             $isPreview = 1;
         }
         my $lcTag = lc $tag;
-        if ((not $self->{OPTIONS}{Binary} or $self->{EXCL_TAG_LOOKUP}{$lcTag}) and
-             not $self->{OPTIONS}{Verbose} and not $self->{REQ_TAG_LOOKUP}{$lcTag})
+        if ((not $$self{OPTIONS}{Binary} or $$self{EXCL_TAG_LOOKUP}{$lcTag}) and
+             not $$self{OPTIONS}{Verbose} and not $$self{REQ_TAG_LOOKUP}{$lcTag})
         {
             return "Binary data $length bytes";
         }
     }
-    unless ($self->{RAF}->Seek($offset,0)
-        and $self->{RAF}->Read($buff, $length) == $length)
+    unless ($$self{RAF}->Seek($offset,0)
+        and $$self{RAF}->Read($buff, $length) == $length)
     {
         $tag or $tag = 'binary data';
         if ($isPreview and not $$self{BuildingComposite}) {
@@ -6550,8 +6656,8 @@ sub ProcessBinaryData($$$)
     my $offset = $$dirInfo{DirStart} || 0;
     my $size = $$dirInfo{DirLen} || (length($$dataPt) - $offset);
     my $base = $$dirInfo{Base} || 0;
-    my $verbose = $self->{OPTIONS}{Verbose};
-    my $unknown = $self->{OPTIONS}{Unknown};
+    my $verbose = $$self{OPTIONS}{Verbose};
+    my $unknown = $$self{OPTIONS}{Unknown};
     my $dataPos = $$dirInfo{DataPos} || 0;
 
     # get default format ('int8u' unless specified)
@@ -6563,21 +6669,25 @@ sub ProcessBinaryData($$$)
         $increment = $formatSize{$defaultFormat};
     }
     # prepare list of tag numbers to extract
-    my @tags;
+    my (@tags, $topIndex);
     if ($unknown > 1 and defined $$tagTablePtr{FIRST_ENTRY}) {
         # don't create a stupid number of tags if data is huge
         my $sizeLimit = $size < 65536 ? $size : 65536;
         # scan through entire binary table
-        @tags = ($$tagTablePtr{FIRST_ENTRY}..(int($sizeLimit/$increment) - 1));
+        $topIndex = int($sizeLimit/$increment);
+        @tags = ($$tagTablePtr{FIRST_ENTRY}..($topIndex - 1));
         # add in floating point tag ID's if they exist
         my @ftags = grep /\./, TagTableKeys($tagTablePtr);
         @tags = sort { $a <=> $b } @tags, @ftags if @ftags;
     } elsif ($$dirInfo{DataMember}) {
         @tags = @{$$dirInfo{DataMember}};
         $verbose = 0;   # no verbose output of extracted values when writing
+    } elsif ($$dirInfo{MixedTags}) {
+        # process sorted integer-ID tags only
+        @tags = sort { $a <=> $b } grep /^\d+$/, TagTableKeys($tagTablePtr);
     } else {
         # extract known tags in numerical order
-        @tags = sort { $a <=> $b } TagTableKeys($tagTablePtr);
+        @tags = sort { ($a < 0 ? $a + 1e9 : $a) <=> ($b < 0 ? $b + 1e9 : $b) } TagTableKeys($tagTablePtr);
     }
     $self->VerboseDir('BinaryData', undef, $size) if $verbose;
     # avoid creating unknown tags for tags that fail condition if Unknown is 1
@@ -6592,6 +6702,10 @@ sub ProcessBinaryData($$$)
             unless ($tagInfo) {
                 next unless defined $tagInfo;
                 my $entry = int($index) * $increment + $varSize;
+                if ($entry < 0) {
+                    $entry += $size;
+                    next if $entry < 0;
+                }
                 next if $entry >= $size;
                 my $more = $size - $entry;
                 $more = 128 if $more > 128;
@@ -6601,6 +6715,8 @@ sub ProcessBinaryData($$$)
             }
             next if $$tagInfo{Unknown} and
                    ($$tagInfo{Unknown} > $unknown or $index < $nextIndex);
+        } elsif ($topIndex and $$tagTablePtr{$index - $topIndex}) {
+            $tagInfo = $self->GetTagInfo($tagTablePtr, $index - $topIndex) or next;
         } else {
             # don't generate unknown tags in binary tables unless Unknown > 1
             next unless $unknown > 1;
@@ -6610,6 +6726,11 @@ sub ProcessBinaryData($$$)
         }
         # get relative offset of this entry
         my $entry = int($index) * $increment + $varSize;
+        # allow negative indices to represent bytes from end
+        if ($entry < 0) {
+            $entry += $size;
+            next if $entry < 0;
+        }
         my $more = $size - $entry;
         last if $more <= 0;     # all done if we have reached the end of data
         my $count = 1;
@@ -6641,7 +6762,7 @@ sub ProcessBinaryData($$$)
                     $wasVar = 1;
                     # save variable size data if required for writing
                     if ($$dirInfo{VarFormatData}) {
-                        push @{$$dirInfo{VarFormatData}}, $index, $varSize;
+                        push @{$$dirInfo{VarFormatData}}, [ $index, $varSize, $format ];
                     }
                 }
             } elsif ($format =~ /^var_/) {
@@ -6678,18 +6799,18 @@ sub ProcessBinaryData($$$)
                 $wasVar = 1;
                 # save variable size data if required for writing
                 if ($$dirInfo{VarFormatData}) {
-                    push @{$$dirInfo{VarFormatData}}, $index, $varSize;
+                    push @{$$dirInfo{VarFormatData}}, [ $index, $varSize, $format ];
                 }
             }
         }
         # hook to allow format, etc to be set dynamically
         if (defined $$tagInfo{Hook}) {
-            #### eval Hook ($format, $varSize)
+            #### eval Hook ($format, $varSize, $size)
             eval $$tagInfo{Hook};
             # save variable size data if required for writing (in case changed by Hook)
             if ($$dirInfo{VarFormatData}) {
-                $#{$$dirInfo{VarFormatData}} -= 2 if $wasVar; # remove previous entries for this tag
-                push @{$$dirInfo{VarFormatData}}, $index, $varSize;
+                $#{$$dirInfo{VarFormatData}} -= 1 if $wasVar; # remove previous entry for this tag
+                push @{$$dirInfo{VarFormatData}}, [ $index, $varSize, $format ];
             }
         }
         if ($unknown > 1) {
@@ -6760,12 +6881,18 @@ sub ProcessBinaryData($$$)
             next;
         }
         if ($$tagInfo{IsOffset} and $$tagInfo{IsOffset} ne '3') {
-            my $exifTool = $self;
-            #### eval IsOffset ($val, $exifTool)
+            my $et = $self;
+            #### eval IsOffset ($val, $et)
             $val += $base + $$self{BASE} if eval $$tagInfo{IsOffset};
         }
         $val{$index} = $val;
+        my $oldBase;
+        if ($$tagInfo{SetBase}) {
+            $oldBase = $$self{BASE};
+            $$self{BASE} += $base;
+        }
         my $key = $self->FoundTag($tagInfo,$val);
+        $$self{BASE} = $oldBase if defined $oldBase;
         if ($key) {
             $$self{RATIONAL}{$key} = $rational if defined $rational;
         } else {
@@ -6806,6 +6933,29 @@ if (@Image::ExifTool::UserDefined::Lenses) {
         $Image::ExifTool::userLens{$_} = 1;
     }
 }
+# add user-defined file types
+if (%Image::ExifTool::UserDefined::FileTypes) {
+    foreach (sort keys %Image::ExifTool::UserDefined::FileTypes) {
+        my $fileInfo = $Image::ExifTool::UserDefined::FileTypes{$_};
+        my $type = uc $_;
+        ref $fileInfo eq 'HASH' or $fileTypeLookup{$type} = $type, next;
+        if ($$fileInfo{BaseType}) {
+            if ($$fileInfo{Description}) {
+                $fileTypeLookup{$type} = [ $$fileInfo{BaseType}, $$fileInfo{Description} ];
+            } else {
+                $fileTypeLookup{$type} = $$fileInfo{BaseType};
+            }
+        } else {
+            $fileTypeLookup{$type} = [ $type, $$fileInfo{Description} || $type ];
+            $moduleName{$type} = 0; # not supported
+            if ($$fileInfo{Magic}) {
+                $magicNumber{$type} = $$fileInfo{Magic};
+                push @fileTypes, $type unless grep /^$type$/, @fileTypes;
+            }
+        }
+        $mimeType{$type} = $$fileInfo{MIMEType} if defined $$fileInfo{MIMEType};
+    }
+}
 
 #------------------------------------------------------------------------------
 1;  # end
@@ -5,7 +5,7 @@
 #
 # URL:          http://owl.phy.queensu.ca/~phil/exiftool/
 #
-# Legal:        Copyright (c) 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
+# Legal:        Copyright (c) 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
 #               This library is free software; you can redistribute it and/or
 #               modify it under the same terms as Perl itself.
 #------------------------------------------------------------------------------
@@ -53,49 +53,49 @@ Image::ExifTool - Read and write meta information
 
 =head1 DESCRIPTION
 
-ExifTool provides an extensible set of perl modules to read and write meta
-information in a wide variety of files, including the maker note information
-of many digital cameras by various manufacturers such as Canon, Casio,
-FujiFilm, GE, HP, JVC/Victor, Kodak, Leaf, Minolta/Konica-Minolta, Nikon,
-Olympus/Epson, Panasonic/Leica, Pentax/Asahi, Phase One, Reconyx, Ricoh,
-Samsung, Sanyo, Sigma/Foveon and Sony.
+Reads and writes meta information in a wide variety of files, including the
+maker notes of many digital cameras by various manufacturers such as Canon,
+Casio, FLIR, FujiFilm, GE, HP, JVC/Victor, Kodak, Leaf,
+Minolta/Konica-Minolta, Nikon, Olympus/Epson, Panasonic/Leica, Pentax/Asahi,
+Phase One, Reconyx, Ricoh, Samsung, Sanyo, Sigma/Foveon and Sony.
 
 Below is a list of file types and meta information formats currently
 supported by ExifTool (r = read, w = write, c = create):
 
   File Types
   ------------+-------------+-------------+-------------+------------
-  3FR   r     | EIP   r     | LA    r     | ORF   r/w   | RSRC  r
-  3G2   r     | EPS   r/w   | LNK   r     | OTF   r     | RTF   r
-  3GP   r     | ERF   r/w   | M2TS  r     | PAC   r     | RW2   r/w
-  ACR   r     | EXE   r     | M4A/V r     | PAGES r     | RWL   r/w
-  AFM   r     | EXIF  r/w/c | MEF   r/w   | PBM   r/w   | RWZ   r
-  AI    r/w   | EXR   r     | MIE   r/w/c | PCD   r     | RM    r
-  AIFF  r     | F4A/V r     | MIFF  r     | PDF   r/w   | SO    r
-  APE   r     | FFF   r/w   | MKA   r     | PEF   r/w   | SR2   r/w
-  ARW   r/w   | FLA   r     | MKS   r     | PFA   r     | SRF   r
-  ASF   r     | FLAC  r     | MKV   r     | PFB   r     | SRW   r/w
-  AVI   r     | FLV   r     | MNG   r/w   | PFM   r     | SVG   r
-  BMP   r     | FPF   r     | MODD  r     | PGF   r     | SWF   r
-  BTF   r     | FPX   r     | MOS   r/w   | PGM   r/w   | THM   r/w
-  CHM   r     | GIF   r/w   | MOV   r     | PLIST r     | TIFF  r/w
-  COS   r     | GZ    r     | MP3   r     | PICT  r     | TTC   r
-  CR2   r/w   | HDP   r/w   | MP4   r     | PMP   r     | TTF   r
-  CRW   r/w   | HDR   r     | MPC   r     | PNG   r/w   | VRD   r/w/c
-  CS1   r/w   | HTML  r     | MPG   r     | PPM   r/w   | VSD   r
-  DCM   r     | ICC   r/w/c | MPO   r/w   | PPT   r     | WAV   r
-  DCP   r/w   | IDML  r     | MQV   r     | PPTX  r     | WDP   r/w
-  DCR   r     | IIQ   r/w   | MRW   r/w   | PS    r/w   | WEBP  r
-  DFONT r     | IND   r/w   | MXF   r     | PSB   r/w   | WEBM  r
-  DIVX  r     | INX   r     | NEF   r/w   | PSD   r/w   | WMA   r
-  DJVU  r     | ITC   r     | NRW   r/w   | PSP   r     | WMV   r
-  DLL   r     | J2C   r     | NUMBERS r   | QTIF  r     | WV    r
-  DNG   r/w   | JNG   r/w   | ODP   r     | RA    r     | X3F   r/w
-  DOC   r     | JP2   r/w   | ODS   r     | RAF   r/w   | XCF   r
-  DOCX  r     | JPEG  r/w   | ODT   r     | RAM   r     | XLS   r
-  DV    r     | K25   r     | OFR   r     | RAR   r     | XLSX  r
-  DVB   r     | KDC   r     | OGG   r     | RAW   r/w   | XMP   r/w/c
-  DYLIB r     | KEY   r     | OGV   r     | RIFF  r     | ZIP   r
+  3FR   r     | EIP   r     | LNK   r     | PAC   r     | RWL   r/w
+  3G2   r/w   | EPS   r/w   | M2TS  r     | PAGES r     | RWZ   r
+  3GP   r/w   | ERF   r/w   | M4A/V r/w   | PBM   r/w   | RM    r
+  ACR   r     | EXE   r     | MEF   r/w   | PCD   r     | SO    r
+  AFM   r     | EXIF  r/w/c | MIE   r/w/c | PDF   r/w   | SR2   r/w
+  AI    r/w   | EXR   r     | MIFF  r     | PEF   r/w   | SRF   r
+  AIFF  r     | F4A/V r/w   | MKA   r     | PFA   r     | SRW   r/w
+  APE   r     | FFF   r/w   | MKS   r     | PFB   r     | SVG   r
+  ARW   r/w   | FLA   r     | MKV   r     | PFM   r     | SWF   r
+  ASF   r     | FLAC  r     | MNG   r/w   | PGF   r     | THM   r/w
+  AVI   r     | FLV   r     | MODD  r     | PGM   r/w   | TIFF  r/w
+  BMP   r     | FPF   r     | MOS   r/w   | PLIST r     | TORRENT r
+  BTF   r     | FPX   r     | MOV   r/w   | PICT  r     | TTC   r
+  CHM   r     | GIF   r/w   | MP3   r     | PMP   r     | TTF   r
+  COS   r     | GZ    r     | MP4   r/w   | PNG   r/w   | VRD   r/w/c
+  CR2   r/w   | HDP   r/w   | MPC   r     | PPM   r/w   | VSD   r
+  CRW   r/w   | HDR   r     | MPG   r     | PPT   r     | WAV   r
+  CS1   r/w   | HTML  r     | MPO   r/w   | PPTX  r     | WDP   r/w
+  DCM   r     | ICC   r/w/c | MQV   r/w   | PS    r/w   | WEBP  r
+  DCP   r/w   | IDML  r     | MRW   r/w   | PSB   r/w   | WEBM  r
+  DCR   r     | IIQ   r/w   | MXF   r     | PSD   r/w   | WMA   r
+  DFONT r     | IND   r/w   | NEF   r/w   | PSP   r     | WMV   r
+  DIVX  r     | INX   r     | NRW   r/w   | QTIF  r/w   | WV    r
+  DJVU  r     | ITC   r     | NUMBERS r   | RA    r     | X3F   r/w
+  DLL   r     | J2C   r     | ODP   r     | RAF   r/w   | XCF   r
+  DNG   r/w   | JNG   r/w   | ODS   r     | RAM   r     | XLS   r
+  DOC   r     | JP2   r/w   | ODT   r     | RAR   r     | XLSX  r
+  DOCX  r     | JPEG  r/w   | OFR   r     | RAW   r/w   | XMP   r/w/c
+  DPX   r     | K25   r     | OGG   r     | RIFF  r     | ZIP   r
+  DV    r     | KDC   r     | OGV   r     | RSRC  r     |
+  DVB   r/w   | KEY   r     | ORF   r/w   | RTF   r     |
+  DYLIB r     | LA    r     | OTF   r     | RW2   r/w   |
 
   Meta Information
   ----------------------+----------------------+---------------------
@@ -104,15 +104,16 @@ supported by ExifTool (r = read, w = write, c = create):
   IPTC           r/w/c  |  Kodak Meta     r/w  |  Adobe APP14    r
   XMP            r/w/c  |  FotoStation    r/w  |  MPF            r
   MakerNotes     r/w/c  |  PhotoMechanic  r/w  |  Stim           r
-  Photoshop IRB  r/w/c  |  JPEG 2000      r    |  APE            r
-  ICC Profile    r/w/c  |  DICOM          r    |  Vorbis         r
-  MIE            r/w/c  |  Flash          r    |  SPIFF          r
-  JFIF           r/w/c  |  FlashPix       r    |  DjVu           r
-  Ducky APP12    r/w/c  |  QuickTime      r    |  M2TS           r
-  PDF            r/w/c  |  Matroska       r    |  PE/COFF        r
-  PNG            r/w/c  |  GeoTIFF        r    |  AVCHD          r
-  Canon VRD      r/w/c  |  PrintIM        r    |  ZIP            r
-  Nikon Capture  r/w/c  |  ID3            r    |  (and more)
+  Photoshop IRB  r/w/c  |  JPEG 2000      r    |  DPX            r
+  ICC Profile    r/w/c  |  DICOM          r    |  APE            r
+  MIE            r/w/c  |  Flash          r    |  Vorbis         r
+  JFIF           r/w/c  |  FlashPix       r    |  SPIFF          r
+  Ducky APP12    r/w/c  |  QuickTime      r    |  DjVu           r
+  PDF            r/w/c  |  Matroska       r    |  M2TS           r
+  PNG            r/w/c  |  MXF            r    |  PE/COFF        r
+  Canon VRD      r/w/c  |  PrintIM        r    |  AVCHD          r
+  Nikon Capture  r/w/c  |  FLAC           r    |  ZIP            r
+  GeoTIFF        r/w/c  |  ID3            r    |  (and more)
 
 =head1 CONFIGURATION
 
@@ -368,7 +369,7 @@ the following tags generated by ExifTool may be returned:
 Get/set ExifTool options.  This function can be called to set the default
 options for an ExifTool object.  Options set this way are in effect for
 all function calls but may be overridden by options passed as arguments
-to some functions.
+to some functions.  Option names are not case sensitive.
 
 The default option values may be changed by defining a
 %Image::ExifTool::UserDefined::Options hash.  See the ExifTool_config file
@@ -399,13 +400,13 @@ in the full ExifTool distribution for examples.
 
 =item Inputs:
 
-0) ExifTool object reference.
+0) ExifTool object reference
 
-1) Option parameter name.
+1) Option parameter name (case-insensitive)
 
-2) [optional] Option parameter value (may be undef to clear option).
+2) [optional] Option parameter value (may be undef to clear option)
 
-3-N) [optional] Additional parameter/value pairs.
+3-N) [optional] Additional parameter/value pairs
 
 =item Option Parameters:
 
@@ -425,8 +426,8 @@ EXIF information already exists, the existing order is maintained.  Valid
 values are 'MM', 'II' and undef.  If ByteOrder is not defined (the default),
 then the maker note byte order is used (if they are being copied), otherwise
 big-endian ('MM') order is assumed.  This can also be set via the
-ExifByteOrder tag, but the ByteOrder option takes precedence if both are
-set.
+L<ExifByteOrder tag|Image::ExifTool::TagNames/Extra Tags>, but the ByteOrder
+option takes precedence if both are set.
 
 =item Charset
 
@@ -712,6 +713,23 @@ Password for reading/writing password-protected PDF documents.  Ignored if a
 password is not required.  Character encoding of the password is determined
 by the value of the Charset option at processing time.  Default is undef.
 
+=item PNGEarlyXMP
+
+Flag to write XMP in PNG images before the IDAT (image data) chunk.  By
+default, ExifTool adds new XMP to the end of a PNG file (just before IEND).
+This is allowed by the PNG and XMP specifications, but some utilities seem
+to ignore XMP if it comes after the image data.  The PNGEarlyXMP option
+causes ExifTool to instead add new XMP before the PNG IDAT chunk.  However,
+since ExifTool uses a single-pass writing algorithm, it has no way to tell
+if XMP already exists later in the file before writing the new XMP in this
+location.  If this happens, a minor error is issued when the extra XMP is
+encountered, and the file is not written.  Adding the L</IgnoreMinorErrors>
+option causes the XMP after IDAT to be deleted, thus resolving the conflict
+(at the expense of possible metadata loss), and allowing the file to be
+written.  The PNGEarlyXMP option is applied automatically when deleting all
+XMP and writing new XMP back in one step.  When reading, this option causes
+a warning to be issued if standard XMP is found after the IDAT chunk.
+
 =item PrintConv
 
 Flag to enable automatic print conversion.  Also enables inverse
@@ -729,7 +747,9 @@ time zone), so the default is 0.
 
 Flag to request all tags to be extracted.  This causes some tags to be
 generated which normally would not be unless specifically requested (by
-passing the tag name to ImageInfo or ExtractInfo).  Default is 0.
+passing the tag name to ImageInfo or ExtractInfo).  Note that this flag is
+set automatically during a call to L</SetNewValuesFromFile> to make all tags
+available for copying.  Default is 0.
 
 =item ScanForXMP
 
@@ -926,12 +946,14 @@ additional files without the need to call L</SetNewValue> again.
 0) ExifTool object reference
 
 1) Source file name, file reference, scalar reference, or undef to create a
-file from scratch
+file from scratch.  A reference to a
+L<File::RandomAccess|File::RandomAccess> object is also allowed as a source,
+but in this case the destination is not optional.
 
 2) [optional] Destination file name, file reference, scalar reference, or
-undef to overwrite the original file
+undef to overwrite the original file.  May be '-' to write to stdout.
 
-3) [optional] Destination file type
+3) [optional] Destination file type.  Ignored if a source is defined.
 
 =item Return Value:
 
@@ -949,10 +971,10 @@ and Warning tags.
 =item Notes:
 
 The source file name may be undefined to create a file from scratch
-(currently only XMP, MIE, ICC, VRD and EXIF files can be created in this way
--- see L</CanCreate> for details).  If undefined, the destination file type
-is required unless the type can be determined from the destination file
-name.
+(currently only XMP, MIE, ICC, VRD, EXV and EXIF files can be created in
+this way -- see L</CanCreate> for details).  If undefined, the destination
+file type is required unless the type can be determined from the extension
+of the destination file name.
 
 If a destination file name is given, the specified file must not exist
 because an existing destination file will not be overwritten.  The
@@ -963,8 +985,6 @@ errors occurred while writing.  Otherwise, if a source file reference or
 scalar reference is used, the image is first written to memory then copied
 back to replace the original if there were no errors.
 
-The destination file type is only used if the source file is undefined.
-
 On Mac OS systems, the file resource fork is preserved if this routine is
 called with a source file name.
 
@@ -985,13 +1005,13 @@ Get a sorted list of tags from the specified information hash or tag list.
 
 =item Inputs:
 
-0) ExifTool object reference,
+0) ExifTool object reference
 
-1) [optional] Information hash reference or tag list reference,
+1) [optional] Information hash reference or tag list reference
 
-2) [optional] Sort order ('Input', 'File', 'Tag', 'Descr' or 'Group#').
+2) [optional] Sort order ('Input', 'File', 'Tag', 'Descr' or 'Group#')
 
-3) [optional] Secondary sort order ('File', 'Tag' or 'Descr').
+3) [optional] Secondary sort order ('File', 'Tag' or 'Descr')
 
 If the information hash or tag list reference is not provided, then the list
 of found tags from the last call to L</ImageInfo>, L</ExtractInfo> or
@@ -1207,15 +1227,18 @@ a description of the structure serialization technique.)
 0) ExifTool object reference
 
 1) [optional] Tag key or tag name, or undef to clear all new values.  The
-tag name may be prefixed by group name, separated by a colon (ie.
-'EXIF:Artist'), which is equivalent to using a Group option argument.  Also,
+tag name may be prefixed by one or more family 0, 1 or 2 group names with
+optional leading family numbers, separated by colons (ie. 'EXIF:Artist',
+'XMP:Time:*'), which is equivalent to using a Group option argument.  Also,
 a '#' may be appended to the tag name (ie. 'EXIF:Orientation#'), with the
 same effect as setting Type to 'ValueConv'.  Wildcards ('*' and '?') may be
 used in the tag name to assign multiple tags simultaneously.  A tag name of
 '*' is special when deleting information, and will delete an entire group
-even if some individual tags in the group are not writable.  See
-L<Image::ExifTool::TagNames|Image::ExifTool::TagNames> for a complete list
-of tag names.
+even if some individual tags in the group are not writable, but only if a
+single family 0 or 1 group is specified (otherwise the tags are deleted
+individually).  Use L</GetDeleteGroups> to get a list of deletable group
+names, and see L<Image::ExifTool::TagNames|Image::ExifTool::TagNames> for a
+complete list of tag names.
 
 2) [optional] New value for tag.  Undefined to delete tag from file.  May be
 a scalar, scalar reference, list reference to set a list of values, or hash
@@ -1257,8 +1280,9 @@ this tag only.  Default is 0.
 =item Group
 
 Specifies group name where tag should be written.  If not specified, tag is
-written to highest priority group as specified by L</SetNewGroups>.  Any
-family 0 or 1 group name may be used.  Case is not significant.
+written to highest priority group as specified by L</SetNewGroups>.  May be
+one or more family 0, 1 or 2 groups with optional leading family number,
+separated by colons.  Case is not significant.
 
 =item NoFlat
 
@@ -1321,7 +1345,8 @@ error string (which is undefined if there was no error).
 
 When deleting groups of tags, the Replace option may be used as in the last
 example above to exclude specific groups from a mass delete.  However, this
-technique may not be used to exclude individual tags.  Instead, use
+technique may not be used to exclude individual tags from a group delete
+(unless a family 2 group was specified in the delete).  Instead, use
 L</SetNewValuesFromFile> to recover the values of individual tags after
 deleting a group.
 
@@ -1389,40 +1414,41 @@ in a specified file.
 
 2-N) [optional] List of tag names to set or options hash references.  All
 writable tags are set if none are specified.  The tag names are not case
-sensitive, and may be prefixed by an optional family 0 or 1 group name,
-separated by a colon (ie. 'exif:iso').  A leading '-' indicates tags to be
-excluded (ie. '-comment'), or a trailing '#' causes the ValueConv value to
-be copied (same as setting the Type option to 'ValueConv' for this tag
-only).  Wildcards ('*' and '?') may be used in the tag name.  A tag name of
-'*' is commonly used when a group is specified to copy all tags in the group
-(ie. 'XMP:*').  A special feature allows tag names of the form
+sensitive, and may be prefixed by one or more family 0, 1 or 2 group names with
+optional leading family numbers, separated by colons (ie. 'exif:iso').  A
+leading '-' indicates tags to be excluded (ie. '-comment'), or a trailing '#'
+causes the ValueConv value to be copied (same as setting the Type option to
+'ValueConv' for this tag only).  Wildcards ('*' and '?') may be used in the tag
+name.  A tag name of '*' is commonly used when a group is specified to copy all
+tags in the group (ie. 'XMP:*').  A special feature allows tag names of the form
 'DSTTAGE<lt>SRCTAG' (or 'SRCTAGE<gt>DSTTAG') to be specified to copy information
-to a tag with a different name or a specified group.  Both 'SRCTAG' and
-'DSTTAG' may contain wildcards and/or be prefixed by a group name (ie.
+to a tag with a different name or a specified group.  Both 'SRCTAG' and 'DSTTAG'
+may contain wildcards and/or be prefixed by a group name (ie.
 'fileModifyDateE<lt>modifyDate' or 'xmp:*E<lt>*'), and/or suffixed by a '#' to
-disable print conversion.  Copied tags may also be added or deleted from a
-list with arguments of the form 'DSTTAG+E<lt>SRCTAG' or 'DSTTAG-E<lt>SRCTAG'.  Tags
-are evaluated in order, so exclusions apply only to tags included earlier in
-the list.  An extension of this feature allows the tag value to be set from
-an expression containing tag names with leading '$' symbols (ie.
-'CommentE<lt>the file is $filename').  Braces '{}' may be used around the
-tag name to separate it from subsequent text, and a '$$' is used to to
-represent a '$' symbol.  The behaviour for missing tags in expressions is
-defined by the L</MissingTagValue> option.  The tag value may be modified
-via changes to the default input variable ($_) in Perl expressions placed
-inside the braces and after a semicolon following the tag name.  Braces
-within the expression must be balanced.  Multiple options hash references
-may be passed to set different options for different tags.  Options apply to
-subsequent tags in the argument list.
+disable print conversion.  Copied tags may also be added or deleted from a list
+with arguments of the form 'DSTTAG+E<lt>SRCTAG' or 'DSTTAG-E<lt>SRCTAG'.  Tags
+are evaluated in order, so exclusions apply only to tags included earlier in the
+list.  An extension of this feature allows the tag value to be set from an
+expression containing tag names with leading '$' symbols (ie. 'CommentE<lt>the
+file is $filename').  Braces '{}' may be used around the tag name to separate it
+from subsequent text, and a '$$' is used to to represent a '$' symbol.  The
+behaviour for missing tags in expressions is defined by the L</MissingTagValue>
+option.  The tag value may be modified via changes to the default input variable
+($_) in Perl expressions placed inside the braces and after a semicolon
+following the tag name.  Braces within the expression must be balanced. 
+Multiple options hash references may be passed to set different options for
+different tags.  Options apply to subsequent tags in the argument list.
 
 By default, this routine will commute information between same-named tags in
 different groups, allowing information to be translated between images with
 different formats.  This behaviour may be modified by specifying a group
 name for extracted tags (even if '*' is used as a group name), in which case
 the information is written to the original group, unless redirected to a
-different group.  When '*' is used for a group name, the family 1 group of
-the original tag is preserved.  (For example, specifying '*:*' copies all
-information while preserving the original family 1 groups.)
+different group.  When '*' is used for a group name, by default the family 1
+group of the original tag is preserved, but a different family may be specified
+with a leading family number.  (For example, specifying '*:*' copies all
+information while preserving the original family 1 groups, while '0*:*'
+preserves the family 0 group.)
 
 =item SetNewValuesFromFile Options:
 
@@ -1590,7 +1616,7 @@ specified, local time is assumed.  When shifting, the time of the original
 file is used unless the optional base time is specified.
 
 The ability to write FileCreateDate is currently restricted to Windows
-systems only.
+systems only, and requires Win32API::File::Time to be installed.
 
 =back
 
@@ -1964,15 +1990,15 @@ Here is a complete list of groups for each of these families:
 
 =item Family 0 (Information Type):
 
-AFCP, AIFF, APE, APP0, APP1, APP12, APP13, APP14, APP15, APP4, APP5, APP6,
-APP8, ASF, CanonVRD, Composite, DICOM, DNG, DV, DjVu, Ducky, EXE, EXIF,
-ExifTool, FLAC, FLIR File, Flash, FlashPix,, Font, FotoStation, GIF, GIMP,
-GeoTiff, H264, HTML, ICC_Profile, ID3, IPTC, ITC, JFIF, JPEG, Jpeg2000, LNK,
-Leaf, M2TS, MIE, MIFF, MNG, MPC, MPEG, MPF, MXF, MakerNotes, Matroska, Meta,
-Ogg, OpenEXR, PDF, PICT, PLIST, PNG, PSP, PanasonicRaw, PhotoCD,
-PhotoMechanic, Photoshop, PostScript, PrintIM, QuickTime, RAF, RIFF, RSRC,
-RTF, Radiance, Rawzor, Real, SVG, SigmaRaw, Stim, Theora, Vorbis, XML, XMP,
-ZIP
+AFCP, AIFF, APE, APP0, APP1, APP11, APP12, APP13, APP14, APP15, APP4, APP5,
+APP6, APP8, ASF, CanonVRD, Composite, DICOM, DNG, DV, DjVu, Ducky, EXE,
+EXIF, ExifTool, FLAC, FLIR, File, Flash, FlashPix, Font, FotoStation, GIF,
+GIMP, GeoTiff, H264, HTML, ICC_Profile, ID3, IPTC, ITC, JFIF, JPEG,
+Jpeg2000, LNK, Leaf, M2TS, MIE, MIFF, MNG, MPC, MPEG, MPF, MXF, MakerNotes,
+Matroska, Meta, Ogg, OpenEXR, PDF, PICT, PLIST, PNG, PSP, PanasonicRaw,
+PhotoCD, PhotoMechanic, Photoshop, PostScript, PrintIM, QuickTime, RAF,
+RIFF, RSRC, RTF, Radiance, Rawzor, Real, SVG, SigmaRaw, Stim, Theora,
+Torrent, Vorbis, XML, XMP, ZIP
 
 =item Family 1 (Specific Location):
 
@@ -1984,22 +2010,23 @@ GPS, GeoTiff, GlobParamIFD, GraphConv, H264, HP, HTML, HTML-dc, HTML-ncc,
 HTML-office, HTML-prod, HTML-vw96, HTTP-equiv, ICC-chrm, ICC-clrt,
 ICC-header, ICC-meas, ICC-meta, ICC-view, ICC_Profile, ICC_Profile#, ID3,
 ID3v1, ID3v1_Enh, ID3v2_2, ID3v2_3, ID3v2_4, IFD0, IFD1, IPTC, IPTC#, ITC,
-InteropIFD, JFIF, JPEG, JVC, Jpeg2000, KDC_IFD, Kodak, KodakBordersIFD,
-KodakEffectsIFD, KodakIFD, KyoceraRaw, LNK, Leaf, LeafSubIFD, Leica, M2TS,
-MAC, MIE-Audio, MIE-Camera, MIE-Canon, MIE-Doc, MIE-Extender, MIE-Flash,
-MIE-GPS, MIE-Geo, MIE-Image, MIE-Lens, MIE-Main, MIE-MakerNotes, MIE-Meta,
-MIE-Orient, MIE-Preview, MIE-Thumbnail, MIE-UTM, MIE-Unknown, MIE-Video,
-MIFF, MNG, MPC, MPEG, MPF0, MPImage, MXF, MakerNotes, MakerUnknown,
-Matroska, MetaIFD, Microsoft, Minolta, MinoltaRaw, NITF, Nikon,
-NikonCapture, NikonCustom, NikonScan, Ocad, Ogg, Olympus, OpenEXR, PDF,
-PICT, PLIST, PNG, PSP, Panasonic, PanasonicRaw, Pentax, PhaseOne, PhotoCD,
-PhotoMechanic, Photoshop, PictureInfo, PostScript, PreviewIFD, PrintIM,
-ProfileIFD, Qualcomm, QuickTime, RAF, RAF2, RIFF, RMETA, RSRC, RTF,
-Radiance, Rawzor, Real, Real-CONT, Real-MDPR, Real-PROP, Real-RA3, Real-RA4,
-Real-RA5, Real-RJMD, Reconyx, Ricoh, SPIFF, SR2, SR2DataIFD, SR2SubIFD,
-SRF#, SVG, Samsung, Sanyo, Scalado, Sigma, SigmaRaw, Sony, SonyIDC, Stim,
-SubIFD, System, Theora, Track#, Version0, Vorbis, XML, XMP, XMP-DICOM,
-XMP-GPano, XMP-MP, XMP-MP1, XMP-PixelLive, XMP-aas, XMP-acdsee, XMP-album,
+InteropIFD, JFIF, JPEG, JPEG-HDR, JVC, Jpeg2000, KDC_IFD, Kodak,
+KodakBordersIFD, KodakEffectsIFD, KodakIFD, KyoceraRaw, LNK, Leaf,
+LeafSubIFD, Leica, M2TS, MAC, MIE-Audio, MIE-Camera, MIE-Canon, MIE-Doc,
+MIE-Extender, MIE-Flash, MIE-GPS, MIE-Geo, MIE-Image, MIE-Lens, MIE-Main,
+MIE-MakerNotes, MIE-Meta, MIE-Orient, MIE-Preview, MIE-Thumbnail, MIE-UTM,
+MIE-Unknown, MIE-Video, MIFF, MNG, MPC, MPEG, MPF0, MPImage, MXF,
+MakerNotes, MakerUnknown, Matroska, MediaJukebox, MetaIFD, Microsoft,
+Minolta, MinoltaRaw, NITF, Nikon, NikonCapture, NikonCustom, NikonScan,
+Ocad, Ogg, Olympus, OpenEXR, PDF, PICT, PLIST, PNG, PSP, Panasonic,
+PanasonicRaw, Pentax, PhaseOne, PhotoCD, PhotoMechanic, Photoshop,
+PictureInfo, PostScript, PreviewIFD, PrintIM, ProfileIFD, Qualcomm,
+QuickTime, RAF, RAF2, RIFF, RMETA, RSRC, RTF, Radiance, Rawzor, Real,
+Real-CONT, Real-MDPR, Real-PROP, Real-RA3, Real-RA4, Real-RA5, Real-RJMD,
+Reconyx, Ricoh, SPIFF, SR2, SR2DataIFD, SR2SubIFD, SRF#, SVG, Samsung,
+Sanyo, Scalado, Sigma, SigmaRaw, Sony, SonyIDC, Stim, SubIFD, System,
+Theora, Torrent, Track#, Version0, Vorbis, XML, XMP, XMP-DICOM, XMP-GPano,
+XMP-MP, XMP-MP1, XMP-PixelLive, XMP-aas, XMP-acdsee, XMP-album,
 XMP-apple-fi, XMP-aux, XMP-cc, XMP-cell, XMP-crs, XMP-dc, XMP-dex,
 XMP-digiKam, XMP-dwc, XMP-exif, XMP-expressionmedia, XMP-extensis, XMP-fpv,
 XMP-ics, XMP-iptcCore, XMP-iptcExt, XMP-lr, XMP-mediapro, XMP-microsoft,
@@ -2040,10 +2067,12 @@ None.
 A list of deletable group names in alphabetical order.  The current list of
 deletable group names is:
 
-AFCP, CIFF, CanonVRD, EXIF, ExifIFD, Ducky, File, FlashPix, FotoStation,
-GlobParamIFD, GPS, IFD0, IFD1, InteropIFD, ICC_Profile, IPTC, JFIF,
-MakerNotes, Meta, MetaIFD, MIE, PhotoMechanic, Photoshop, PNG, PrintIM,
-RMETA, SubIFD, Trailer, XMP
+AFCP, APP0, APP1, APP10, APP11, APP12, APP13, APP14, APP15, APP2, APP3,
+APP4, APP5, APP6, APP7, APP8, APP9, Adobe, CIFF, CanonVRD, Ducky, EXIF,
+ExifIFD, File, FlashPix, FotoStation, GPS, GlobParamIFD, ICC_Profile, IFD0,
+IFD1, IPTC, InteropIFD, JFIF, Jpeg2000, MIE, MPF, MakerNotes, Meta, MetaIFD,
+NikonCapture, PDF, PDF-update, PNG, PhotoMechanic, Photoshop, PrintIM,
+RMETA, RSRC, SubIFD, Trailer, XML, XML-*, XMP, XMP-*
 
 All names in this list are either family 0 or family 1 group names, with the
 exception of 'Trailer' which allows all trailers in JPEG and TIFF-format
@@ -2051,6 +2080,11 @@ images to be deleted at once, including unknown trailers.  To schedule a
 group for deletion, call L</SetNewValue> with an undefined value and a tag
 name like 'Trailer:*'.
 
+Note that the JPEG "APP" groups are special, and are used only to delete
+application segments which are not associated with another deletable group. 
+For example, deleting 'APP14:*' will delete other APP14 segments, but not
+the APP14 "Adobe" segment.
+
 =back
 
 =head2 GetFileType [static]
@@ -2117,8 +2151,9 @@ Can the specified file be created?
 
 =item Return Value:
 
-True if ExifTool can create files with this extension from scratch. 
-Currently, this can only be done with XMP, MIE, ICC, VRD and EXIF files.
+True if ExifTool can create files with this extension from scratch.
+Currently, this can only be done with XMP, MIE, ICC, VRD, EXV and EXIF
+files.
 
 =back
 
@@ -2165,7 +2200,7 @@ When writing, the inverse conversions are performed.  Alternatively, special
 characters may be converted to/from HTML character entities with the
 L</Escape> HTML option.
 
-A distinction is made between the external character set visible to via the
+A distinction is made between the external character set visible via the
 ExifTool API, and the internal character used to store text in the metadata
 of a file.  These character sets may be specified separately as follows:
 
@@ -2198,9 +2233,9 @@ Vorbis information:
 
 =head2 EXIF
 
-Most textual information in EXIF is stored in "ASCII" format (called
-"string" in the L<ExifTool tag name documentation|Image::ExifTool::TagNames>).
-By default ExifTool does not convert these strings.  However, it is not
+Most textual information in EXIF is stored in ASCII format (called "string"
+in the L<ExifTool tag name documentation|Image::ExifTool::TagNames>). By
+default ExifTool does not convert these strings.  However, it is not
 uncommon for applications to write UTF-8 or other encodings where ASCII is
 expected.  To deal with these, ExifTool allows the internal EXIF string
 encoding to be specified with L</CharsetEXIF>, which causes EXIF string
@@ -2217,7 +2252,7 @@ Unicode (UCS-2) or JIS.  When reading these tags, ExifTool converts Unicode
 and JIS to the external character set specified by the L</Charset>
 option, or to UTF-8 by default.  ASCII text is not converted. When writing,
 text is stored as ASCII unless the string contains special characters, in
-which case it is converted from the external character set (or UTF-8 by
+which case it is converted from the external character set (UTF-8 by
 default), and stored as Unicode. ExifTool writes Unicode in native EXIF byte
 ordering by default, but the byte order may be specified by setting the
 ExifUnicodeByteOrder tag (see the
@@ -2242,6 +2277,28 @@ not supported.  Instead, a warning is issued and the string is not converted
 if an ISO 2022 shift code is encountered.  See L<http://www.iptc.org/IIM/>
 for the official IPTC specification.
 
+ExifTool may be used to convert IPTC values to a different internal
+encoding.  To do this, all IPTC tags must be rewritten along with the
+desired value of CodedCharacterSet.  For example, the following command
+changes the internal IPTC encoding to UTF-8 (from Windows Latin1 unless
+CodedCharacterSet was already "UTF8"):
+
+  exiftool -tagsfromfile @ -iptc:all -codedcharacterset=utf8 a.jpg
+
+or from Windows Latin2 (cp1250) to UTF-8:
+
+  exiftool -tagsfromfile @ -iptc:all -codedcharacterset=utf8 \
+  -charset iptc=latin2 a.jpg
+
+and this command changes it back from UTF-8 to Windows Latin1 (cp1252):
+
+  exiftool -tagsfromfile @ -iptc:all -codedcharacterset= a.jpg
+
+or to Windows Latin2:
+
+  exiftool -tagsfromfile @ -iptc:all -codedcharacterset= \
+  -charset iptc=latin2 a.jpg
+
 Unless CodedCharacterSet is 'UTF8', applications have no reliable way to
 determine the IPTC character encoding.  For this reason, it is recommended
 that CodedCharacterSet be set to 'UTF8' when creating new IPTC.
@@ -2326,7 +2383,7 @@ specified by the L</Charset> option.
 
 =head1 AUTHOR
 
-Copyright 2003-2013, Phil Harvey
+Copyright 2003-2014, Phil Harvey
 
 This library is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
@@ -1,6 +1,6 @@
 Summary: perl module for image data extraction
 Name: perl-Image-ExifTool
-Version: 9.27
+Version: 9.53
 Release: 1
 License: Artistic/GPL
 Group: Development/Libraries/Perl
@@ -22,37 +22,38 @@ supported by ExifTool (r = read, w = write, c = create):
 
   File Types
   ------------+-------------+-------------+-------------+------------
-  3FR   r     | EIP   r     | LA    r     | ORF   r/w   | RSRC  r
-  3G2   r     | EPS   r/w   | LNK   r     | OTF   r     | RTF   r
-  3GP   r     | ERF   r/w   | M2TS  r     | PAC   r     | RW2   r/w
-  ACR   r     | EXE   r     | M4A/V r     | PAGES r     | RWL   r/w
-  AFM   r     | EXIF  r/w/c | MEF   r/w   | PBM   r/w   | RWZ   r
-  AI    r/w   | EXR   r     | MIE   r/w/c | PCD   r     | RM    r
-  AIFF  r     | F4A/V r     | MIFF  r     | PDF   r/w   | SO    r
-  APE   r     | FFF   r/w   | MKA   r     | PEF   r/w   | SR2   r/w
-  ARW   r/w   | FLA   r     | MKS   r     | PFA   r     | SRF   r
-  ASF   r     | FLAC  r     | MKV   r     | PFB   r     | SRW   r/w
-  AVI   r     | FLV   r     | MNG   r/w   | PFM   r     | SVG   r
-  BMP   r     | FPF   r     | MODD  r     | PGF   r     | SWF   r
-  BTF   r     | FPX   r     | MOS   r/w   | PGM   r/w   | THM   r/w
-  CHM   r     | GIF   r/w   | MOV   r     | PLIST r     | TIFF  r/w
-  COS   r     | GZ    r     | MP3   r     | PICT  r     | TTC   r
-  CR2   r/w   | HDP   r/w   | MP4   r     | PMP   r     | TTF   r
-  CRW   r/w   | HDR   r     | MPC   r     | PNG   r/w   | VRD   r/w/c
-  CS1   r/w   | HTML  r     | MPG   r     | PPM   r/w   | VSD   r
-  DCM   r     | ICC   r/w/c | MPO   r/w   | PPT   r     | WAV   r
-  DCP   r/w   | IDML  r     | MQV   r     | PPTX  r     | WDP   r/w
-  DCR   r     | IIQ   r/w   | MRW   r/w   | PS    r/w   | WEBP  r
-  DFONT r     | IND   r/w   | MXF   r     | PSB   r/w   | WEBM  r
-  DIVX  r     | INX   r     | NEF   r/w   | PSD   r/w   | WMA   r
-  DJVU  r     | ITC   r     | NRW   r/w   | PSP   r     | WMV   r
-  DLL   r     | J2C   r     | NUMBERS r   | QTIF  r     | WV    r
-  DNG   r/w   | JNG   r/w   | ODP   r     | RA    r     | X3F   r/w
-  DOC   r     | JP2   r/w   | ODS   r     | RAF   r/w   | XCF   r
-  DOCX  r     | JPEG  r/w   | ODT   r     | RAM   r     | XLS   r
-  DV    r     | K25   r     | OFR   r     | RAR   r     | XLSX  r
-  DVB   r     | KDC   r     | OGG   r     | RAW   r/w   | XMP   r/w/c
-  DYLIB r     | KEY   r     | OGV   r     | RIFF  r     | ZIP   r
+  3FR   r     | EIP   r     | LNK   r     | PAC   r     | RWL   r/w
+  3G2   r/w   | EPS   r/w   | M2TS  r     | PAGES r     | RWZ   r
+  3GP   r/w   | ERF   r/w   | M4A/V r/w   | PBM   r/w   | RM    r
+  ACR   r     | EXE   r     | MEF   r/w   | PCD   r     | SO    r
+  AFM   r     | EXIF  r/w/c | MIE   r/w/c | PDF   r/w   | SR2   r/w
+  AI    r/w   | EXR   r     | MIFF  r     | PEF   r/w   | SRF   r
+  AIFF  r     | F4A/V r/w   | MKA   r     | PFA   r     | SRW   r/w
+  APE   r     | FFF   r/w   | MKS   r     | PFB   r     | SVG   r
+  ARW   r/w   | FLA   r     | MKV   r     | PFM   r     | SWF   r
+  ASF   r     | FLAC  r     | MNG   r/w   | PGF   r     | THM   r/w
+  AVI   r     | FLV   r     | MODD  r     | PGM   r/w   | TIFF  r/w
+  BMP   r     | FPF   r     | MOS   r/w   | PLIST r     | TORRENT r
+  BTF   r     | FPX   r     | MOV   r/w   | PICT  r     | TTC   r
+  CHM   r     | GIF   r/w   | MP3   r     | PMP   r     | TTF   r
+  COS   r     | GZ    r     | MP4   r/w   | PNG   r/w   | VRD   r/w/c
+  CR2   r/w   | HDP   r/w   | MPC   r     | PPM   r/w   | VSD   r
+  CRW   r/w   | HDR   r     | MPG   r     | PPT   r     | WAV   r
+  CS1   r/w   | HTML  r     | MPO   r/w   | PPTX  r     | WDP   r/w
+  DCM   r     | ICC   r/w/c | MQV   r/w   | PS    r/w   | WEBP  r
+  DCP   r/w   | IDML  r     | MRW   r/w   | PSB   r/w   | WEBM  r
+  DCR   r     | IIQ   r/w   | MXF   r     | PSD   r/w   | WMA   r
+  DFONT r     | IND   r/w   | NEF   r/w   | PSP   r     | WMV   r
+  DIVX  r     | INX   r     | NRW   r/w   | QTIF  r/w   | WV    r
+  DJVU  r     | ITC   r     | NUMBERS r   | RA    r     | X3F   r/w
+  DLL   r     | J2C   r     | ODP   r     | RAF   r/w   | XCF   r
+  DNG   r/w   | JNG   r/w   | ODS   r     | RAM   r     | XLS   r
+  DOC   r     | JP2   r/w   | ODT   r     | RAR   r     | XLSX  r
+  DOCX  r     | JPEG  r/w   | OFR   r     | RAW   r/w   | XMP   r/w/c
+  DPX   r     | K25   r     | OGG   r     | RIFF  r     | ZIP   r
+  DV    r     | KDC   r     | OGV   r     | RSRC  r     |
+  DVB   r/w   | KEY   r     | ORF   r/w   | RTF   r     |
+  DYLIB r     | LA    r     | OTF   r     | RW2   r/w   |
 
   Meta Information
   ----------------------+----------------------+---------------------
@@ -61,15 +62,16 @@ supported by ExifTool (r = read, w = write, c = create):
   IPTC           r/w/c  |  Kodak Meta     r/w  |  Adobe APP14    r
   XMP            r/w/c  |  FotoStation    r/w  |  MPF            r
   MakerNotes     r/w/c  |  PhotoMechanic  r/w  |  Stim           r
-  Photoshop IRB  r/w/c  |  JPEG 2000      r    |  APE            r
-  ICC Profile    r/w/c  |  DICOM          r    |  Vorbis         r
-  MIE            r/w/c  |  Flash          r    |  SPIFF          r
-  JFIF           r/w/c  |  FlashPix       r    |  DjVu           r
-  Ducky APP12    r/w/c  |  QuickTime      r    |  M2TS           r
-  PDF            r/w/c  |  Matroska       r    |  PE/COFF        r
-  PNG            r/w/c  |  GeoTIFF        r    |  AVCHD          r
-  Canon VRD      r/w/c  |  PrintIM        r    |  ZIP            r
-  Nikon Capture  r/w/c  |  ID3            r    |  (and more)
+  Photoshop IRB  r/w/c  |  JPEG 2000      r    |  DPX            r
+  ICC Profile    r/w/c  |  DICOM          r    |  APE            r
+  MIE            r/w/c  |  Flash          r    |  Vorbis         r
+  JFIF           r/w/c  |  FlashPix       r    |  SPIFF          r
+  Ducky APP12    r/w/c  |  QuickTime      r    |  DjVu           r
+  PDF            r/w/c  |  Matroska       r    |  M2TS           r
+  PNG            r/w/c  |  MXF            r    |  PE/COFF        r
+  Canon VRD      r/w/c  |  PrintIM        r    |  AVCHD          r
+  Nikon Capture  r/w/c  |  FLAC           r    |  ZIP            r
+  GeoTIFF        r/w/c  |  ID3            r    |  (and more)
 
 See html/index.html for more details about ExifTool features.
 
@@ -1,10 +1,10 @@
-[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.07
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.29
 [File, System, Image] FileName - File Name: ASF.wmv
 [File, System, Image] Directory - Directory: t/images
 [File, System, Image] FileSize - File Size: 12 kB
 [File, System, Time] FileModifyDate - File Modification Date/Time: 2005:12:27 07:29:29-05:00
-[File, System, Time] FileAccessDate - File Access Date/Time: 2012:11:20 07:48:02-05:00
-[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2012:11:17 09:18:25-05:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2013:05:02 07:13:04-04:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2005:12:27 07:36:02-05:00
 [File, System, Image] FilePermissions - File Permissions: rw-r--r--
 [File, File, Image] FileType - File Type: WMV
 [File, File, Image] MIMEType - MIME Type: video/x-ms-wmv
@@ -28,6 +28,12 @@
 [ASF, ASF, Video] 68 - Min Packet Size: 1400
 [ASF, ASF, Video] 72 - Max Packet Size: 1400
 [ASF, ASF, Video] 76 - Max Bitrate: 30.6 kbps
+[ASF, ASF, Video] MediaClassPrimaryID - Media Class Primary ID: DB9830BD-3AB3-4FAB-8A37-1A995F7FF74B
+[ASF, ASF, Video] MediaClassSecondaryID - Media Class Secondary ID: 0B710218-8C0C-475E-AF73-4C41C0C8F8CE
+[ASF, ASF, Video] IsVBR - Is VBR: False
+[ASF, ASF, Video] IsVBR - Is VBR: False
+[ASF, ASF, Video] WMADRCPeakReference - WMADRC Peak Reference: 23311
+[ASF, ASF, Video] WMADRCAverageReference - WMADRC Average Reference: 5966
 [ASF, ASF, Other] AudioCodecName - Audio Codec Name: Windows Media Audio 9.1
 [ASF, ASF, Other] AudioCodecDescription - Audio Codec Description:  20 kbps, 22 kHz, stereo 1-pass CBR
 [ASF, ASF, Other] VideoCodecName - Video Codec Name: Windows Media Video 9 Image v2
@@ -1,10 +1,10 @@
-[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.07
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.40
 [File, System, Image] FileName - File Name: CanonRaw_4_failed.crw
 [File, System, Image] Directory - Directory: t
 [File, System, Image] FileSize - File Size: 12 kB
-[File, System, Time] FileModifyDate - File Modification Date/Time: 2012:11:20 07:49:37-05:00
-[File, System, Time] FileAccessDate - File Access Date/Time: 2012:11:20 07:49:37-05:00
-[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2012:11:20 07:49:37-05:00
+[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:10:27 14:58:47-04:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2013:10:27 14:58:47-04:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:10:27 14:58:47-04:00
 [File, System, Image] FilePermissions - File Permissions: rw-r--r--
 [File, File, Image] FileType - File Type: CRW
 [File, File, Image] MIMEType - MIME Type: image/x-canon-crw
@@ -140,10 +140,8 @@
 [MakerNotes, CanonRaw, Image] 3 - Raw Jpg Width: 2048
 [MakerNotes, CanonRaw, Image] 4 - Raw Jpg Height: 1360
 [MakerNotes, CanonRaw, Camera] 6203 - Serial Number Format: Format 1
-[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.07
+[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.40
 [XMP, XMP-aux, Camera] Lens - Lens: 18.0 - 55.0 mm
-[XMP, XMP-aux, Camera] OwnerName - Owner Name: Phil Harvey
-[XMP, XMP-aux, Camera] SerialNumber - Serial Number: 1234
 [XMP, XMP-dc, Image] description - Description: CRW with embedded XMP
 [XMP, XMP-exif, Image] ApertureValue - Aperture Value: 14.0
 [XMP, XMP-exif, Image] ColorSpace - Color Space: sRGB
@@ -180,6 +178,9 @@
 [XMP, XMP-exif, Image] ShutterSpeedValue - Shutter Speed Value: 1
 [XMP, XMP-exif, Image] UserComment - User Comment: 
 [XMP, XMP-exif, Camera] WhiteBalance - White Balance: Auto
+[XMP, XMP-exifEX, Image] BodySerialNumber - Serial Number: 1234
+[XMP, XMP-exifEX, Image] CameraOwnerName - Owner Name: Phil Harvey
+[XMP, XMP-exifEX, Image] InteroperabilityIndex - Interoperability Index: THM - DCF thumbnail file
 [XMP, XMP-tiff, Image] BitsPerSample - Bits Per Sample: 8
 [XMP, XMP-tiff, Image] ImageLength - Image Height: 8
 [XMP, XMP-tiff, Image] ImageWidth - Image Width: 8
@@ -1,10 +1,10 @@
-[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.07
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.32
 [File, System, Image] FileName - File Name: CanonRaw_7_failed.jpg
 [File, System, Image] Directory - Directory: t
-[File, System, Image] FileSize - File Size: 6.9 kB
-[File, System, Time] FileModifyDate - File Modification Date/Time: 2012:11:20 07:49:37-05:00
-[File, System, Time] FileAccessDate - File Access Date/Time: 2012:11:20 07:49:37-05:00
-[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2012:11:20 07:49:37-05:00
+[File, System, Image] FileSize - File Size: 7.0 kB
+[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:06:12 12:34:40-04:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2013:06:12 12:34:40-04:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:06:12 12:34:40-04:00
 [File, System, Image] FilePermissions - File Permissions: rw-r--r--
 [File, File, Image] FileType - File Type: JPEG
 [File, File, Image] MIMEType - MIME Type: image/jpeg
@@ -209,7 +209,7 @@
 [MakerNotes, Canon, Camera] 52 - Camera Color Calibration 14:  770  382  248 (2871K)
 [MakerNotes, Canon, Camera] 56 - Camera Color Calibration 15:  949  307  397 (2413K)
 [MakerNotes, Canon, Camera] 2 - Color Tone: Normal
-[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.07
+[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.32
 [XMP, XMP-aux, Camera] Lens - Lens: 18.0 - 55.0 mm
 [XMP, XMP-exif, Image] ComponentsConfiguration - Components Configuration: -, -, -, -
 [XMP, XMP-exif, Camera] FlashFired - Flash Fired: False
@@ -217,6 +217,7 @@
 [XMP, XMP-exif, Camera] FlashMode - Flash Mode: Off
 [XMP, XMP-exif, Camera] FlashRedEyeMode - Flash Red Eye Mode: False
 [XMP, XMP-exif, Camera] FlashReturn - Flash Return: No return detection
+[XMP, XMP-exifEX, Image] InteroperabilityIndex - Interoperability Index: R98 - DCF basic file (sRGB)
 [XMP, XMP-tiff, Image] BitsPerSample - Bits Per Sample: 8, 8, 8
 [XMP, XMP-tiff, Image] Compression - Compression: JPEG (old-style)
 [XMP, XMP-tiff, Image] ImageLength - Image Height: 1024
@@ -1,3 +1,3 @@
-[File, System, Image] FileSize - File Size: 27844
+[File, System, Image] FileSize - File Size: 28222
 [CanonVRD, CanonVRD, Image] 2 - VRD Version: 200
 [CanonVRD, CanonVRD, Image] 2 - VRD Version: 200
@@ -1 +1 @@
-[File, System, Image] FileSize - File Size: 22500
+[File, System, Image] FileSize - File Size: 22878
@@ -1,10 +1,10 @@
-[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.07
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.41
 [File, System, Image] FileName - File Name: Canon1DmkIII.jpg
 [File, System, Image] Directory - Directory: t/images
 [File, System, Image] FileSize - File Size: 8.1 kB
 [File, System, Time] FileModifyDate - File Modification Date/Time: 2008:01:18 14:10:05-05:00
-[File, System, Time] FileAccessDate - File Access Date/Time: 2012:11:20 07:47:34-05:00
-[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2012:11:17 09:18:25-05:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2013:11:14 08:40:57-05:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:11:11 12:05:21-05:00
 [File, System, Image] FilePermissions - File Permissions: rw-r--r--
 [File, File, Image] FileType - File Type: JPEG
 [File, File, Image] MIMEType - MIME Type: image/jpeg
@@ -320,6 +320,7 @@
 [MakerNotes, Canon, Camera] 49 - Color Temp Kelvin: 5210
 [MakerNotes, Canon, Camera] 50 - WB RGGB Levels Flash: 2422 1024 1024 1295
 [MakerNotes, Canon, Camera] 54 - Color Temp Flash: 6777
+[MakerNotes, Canon, Camera] 231 - Average Black Level: 1024 1024 1024 1024
 [MakerNotes, Canon, Camera] 640 - Raw Measured RGGB: 294111 455756 464315 279659
 [MakerNotes, Canon, Camera] 16400 - Custom Picture Style File Name: 
 [MakerNotes, Canon, Camera] 1 - AF Micro Adj Mode: Disable
@@ -0,0 +1,28 @@
+# Before "make install", this script should be runnable with "make test".
+# After "make install" it should work as "perl t/DPX.t".
+
+BEGIN { $| = 1; print "1..2\n"; $Image::ExifTool::noConfig = 1; }
+END {print "not ok 1\n" unless $loaded;}
+
+# test 1: Load the module(s)
+use Image::ExifTool 'ImageInfo';
+use Image::ExifTool::DPX;
+$loaded = 1;
+print "ok 1\n";
+
+use t::TestLib;
+
+my $testname = 'DPX';
+my $testnum = 1;
+
+# test 2: Extract information from DPX.dpx
+{
+    ++$testnum;
+    my $exifTool = new Image::ExifTool;
+    my $info = $exifTool->ImageInfo('t/images/DPX.dpx');
+    print 'not ' unless check($exifTool, $info, $testname, $testnum);
+    print "ok $testnum\n";
+}
+
+
+# end
@@ -0,0 +1,35 @@
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.38
+[File, System, Image] FileName - File Name: DPX.dpx
+[File, System, Image] Directory - Directory: t/images
+[File, System, Image] FileSize - File Size: 2.0 kB
+[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:09:20 08:49:38-04:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2013:09:20 20:36:32-04:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:09:20 20:36:32-04:00
+[File, System, Image] FilePermissions - File Permissions: rw-r--r--
+[File, File, Image] FileType - File Type: DPX
+[File, File, Image] MIMEType - MIME Type: image/x-dpx
+[File, File, Image] 0 - Byte Order: Big-endian
+[File, File, Image] 8 - Header Version: V1.0
+[File, File, Image] 16 - DPX File Size: 12812288
+[File, File, Image] 20 - Ditto Key: New
+[File, File, Image] 36 - Image File Name: Image filename         
+[File, File, Time] 136 - Create Date: 2010:08:03 08:38:16
+[File, File, Author] 160 - Creator: Creator                
+[File, File, Image] 260 - Project: Project name           
+[File, File, Author] 460 - Copyright: Copyright info         
+[File, File, Image] 660 - Encryption Key: ffffffff
+[File, File, Image] 768 - Orientation: Horizontal (normal)
+[File, File, Image] 770 - Image Elements: 1
+[File, File, Image] 772 - Image Width: 2048
+[File, File, Image] 776 - Image Height: 1556
+[File, File, Image] 780 - Data Sign: Unsigned
+[File, File, Image] 803 - Bit Depth: 10
+[File, File, Image] 820 - Image Description: CPD
+[File, File, Image] 1432 - Source File Name: 
+[File, File, Image] 1532 - Source Create Date: 
+[File, File, Image] 1556 - Input Device Name: SPIRIT-4K DATACINE 
+[File, File, Image] 1588 - Input Device Serial Number: 01018
+[File, File, Image] 1732 - Frame ID: 
+[File, File, Image] 1764 - Slate Information: 
+[File, File, Image] 2048 - User ID: Thomson BTS        
+[Composite, Composite, Image] ImageSize - Image Size: 2048x1556
@@ -1,10 +1,10 @@
-[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.07
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.47
 [File, System, Image] FileName - File Name: ExifTool.jpg
 [File, System, Image] Directory - Directory: t/images
-[File, System, Image] FileSize - File Size: 24 kB
-[File, System, Time] FileModifyDate - File Modification Date/Time: 2012:02:14 13:14:33-05:00
-[File, System, Time] FileAccessDate - File Access Date/Time: 2012:11:20 07:49:39-05:00
-[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2012:11:17 09:18:25-05:00
+[File, System, Image] FileSize - File Size: 25 kB
+[File, System, Time] FileModifyDate - File Modification Date/Time: 2014:01:17 09:28:51-05:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2014:01:17 09:33:29-05:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2014:01:17 09:28:51-05:00
 [File, System, Image] FilePermissions - File Permissions: rw-r--r--
 [File, File, Image] FileType - File Type: JPEG
 [File, File, Image] MIMEType - MIME Type: image/jpeg
@@ -18,7 +18,6 @@
 [File, File, Image] BitsPerSample - Bits Per Sample: 8
 [File, File, Image] ColorComponents - Color Components: 3
 [File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2)
-[Composite, Composite, Image] PreviewImage - Preview Image: (Binary data 1039273 bytes)
 [EXIF, IFD0, Image] 270 - Image Description: A witty caption
 [EXIF, IFD0, Camera] 271 - Make: FUJIFILM
 [EXIF, IFD0, Camera] 272 - Camera Model Name: FinePix2400Zoom
@@ -240,6 +239,21 @@
 [APP6, NITF, Image] 12 - Stream Color: Monochrome
 [APP6, NITF, Image] 13 - Stream Bit Depth: 8
 [APP6, NITF, Image] 14 - Flags: 0x1010000
+[XML, MediaJukebox, Image] Tool_Name - Tool Name: Media Center
+[XML, MediaJukebox, Image] Tool_Version - Tool Version: 19.0.67
+[XML, MediaJukebox, Image] People - People: Santa
+[XML, MediaJukebox, Image] Places - Places: Jamaica
+[XML, MediaJukebox, Time] Date - Date: 2013:09:01 20:12:19
+[XML, MediaJukebox, Image] Album - Album: 2013-09-01
+[XML, MediaJukebox, Image] Name - Name: Glass home at night
+[APP11, JPEG-HDR, Image] ver - JPEG-HDR Version: 11
+[APP11, JPEG-HDR, Image] ln0 - Ln0: 0.122262
+[APP11, JPEG-HDR, Image] ln1 - Ln1: 2.634655
+[APP11, JPEG-HDR, Image] s2n - S2n: 2.269635e+03
+[APP11, JPEG-HDR, Image] alp - Alpha: 1.000000
+[APP11, JPEG-HDR, Image] bet - Beta: 1.000000
+[APP11, JPEG-HDR, Image] cor - Correction Method: 0
+[APP11, JPEG-HDR, Image] RatioImage - Ratio Image: (Binary data 19 bytes)
 [APP12, PictureInfo, Time] TimeDate - Date/Time Original: 1998:12:31 15:17:20
 [APP12, PictureInfo, Image] Shutter - Exposure Time: 1/155
 [APP12, PictureInfo, Image] Flash - Flash: Off
@@ -389,6 +403,7 @@
 [FotoStation, FotoStation, Image] 11 - Crop Rotation: 0
 [Composite, Composite, Image] Aperture - Aperture: 3.5
 [Composite, Composite, Image] ImageSize - Image Size: 8x8
+[Composite, Composite, Image] PreviewImage - Preview Image: (Binary data 1039273 bytes)
 [Composite, Composite, Image] PreviewImage - Preview Image: (Binary data 5777 bytes)
 [Composite, Composite, Image] ShutterSpeed - Shutter Speed: 1/155
 [Composite, Composite, Image] LightValue - Light Value: 10.9
@@ -8,6 +8,7 @@
 [ICC_Profile, ICC-header, Time] 24 - Profile Date Time: 1999:05:03 00:00:00
 [FlashPix, FlashPix, Time] 4 - Extension Create Date: 1999:05:14 21:47:25
 [FlashPix, FlashPix, Time] 5 - Extension Modify Date: 1999:05:14 21:47:25
+[XML, MediaJukebox, Time] Date - Date: 2013:08:01 20:12:19
 [APP12, PictureInfo, Time] TimeDate - Date/Time Original: 1998:11:30 15:17:20
 [IPTC, IPTC, Time] 55 - Date Created: 2004:02:26
 [IPTC, IPTC3, Time] 55 - Date Created: 2005:12:23
@@ -1,10 +1,10 @@
-[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.26
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.29
 [File, System, Image] FileName - File Name: FLIR.jpg
 [File, System, Image] Directory - Directory: t/images
 [File, System, Image] FileSize - File Size: 7.2 kB
-[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:04:02 13:11:16-04:00
-[File, System, Time] FileAccessDate - File Access Date/Time: 2013:04:12 12:15:55-04:00
-[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:04:13 06:36:07-04:00
+[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:04:02 10:46:04-04:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2013:05:13 14:31:40-04:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:04:21 07:50:10-04:00
 [File, System, Image] FilePermissions - File Permissions: rw-r--r--
 [File, File, Image] FileType - File Type: JPEG
 [File, File, Image] MIMEType - MIME Type: image/jpeg
@@ -70,6 +70,9 @@
 [APP1, FLIR, Camera] 48 - IR Window Temperature: 20.0 C
 [APP1, FLIR, Camera] 52 - IR Window Transmission: 1.00
 [APP1, FLIR, Camera] 60 - Relative Humidity: 50.0 %
+[APP1, FLIR, Camera] 88 - Planck R1: 13799.269
+[APP1, FLIR, Camera] 92 - Planck B: 1374.5
+[APP1, FLIR, Camera] 96 - Planck F: 1.35
 [APP1, FLIR, Camera] 144 - Camera Temperature Range Max: 250.0 C
 [APP1, FLIR, Camera] 148 - Camera Temperature Range Min: -0.0 C
 [APP1, FLIR, Camera] 212 - Camera Model: FLIR_i7
@@ -79,15 +82,23 @@
 [APP1, FLIR, Camera] 368 - Lens Model: FOL7
 [APP1, FLIR, Camera] 400 - Lens Part Number: 
 [APP1, FLIR, Camera] 416 - Lens Serial Number: 
+[APP1, FLIR, Camera] 436 - Field Of View: 25.0 deg
 [APP1, FLIR, Camera] 492 - Filter Model: 
 [APP1, FLIR, Camera] 508 - Filter Part Number: 
 [APP1, FLIR, Camera] 540 - Filter Serial Number: 
+[APP1, FLIR, Camera] 776 - Planck O: -6646
+[APP1, FLIR, Camera] 780 - Planck R2: 0.022241818
+[APP1, FLIR, Image] 824 - Raw Value Median: 12582
+[APP1, FLIR, Image] 828 - Raw Value Range: 1980
 [APP1, FLIR, Time] 900 - Date/Time Original: 2012:02:11 14:17:08.253+01:00
+[APP1, FLIR, Camera] 912 - Focus Step Count: 0
+[APP1, FLIR, Camera] 1116 - Focus Distance: 2.0 m
 [APP1, FLIR, Image] 1 - Raw Thermal Image Width: 120
 [APP1, FLIR, Image] 2 - Raw Thermal Image Height: 120
 [APP1, FLIR, Image] 16 - Raw Thermal Image Type: PNG
 [APP1, FLIR, Image] 16.1 - Raw Thermal Image: (Binary data 79 bytes)
 [Composite, Composite, Image] ImageSize - Image Size: 8x8
+[Composite, FLIR, Camera] PeakSpectralSensitivity - Peak Spectral Sensitivity: 10.5 um
 [Composite, Composite, Image] ShutterSpeed - Shutter Speed: 1/32
 [Composite, Composite, Image] ThumbnailImage - Thumbnail Image: (Binary data 2314 bytes)
 [Composite, Composite, Camera] FocalLength35efl - Focal Length: 6.7 mm
@@ -1,10 +1,10 @@
-[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.26
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.28
 [File, System, Image] FileName - File Name: FLIR.fpf
 [File, System, Image] Directory - Directory: t/images
 [File, System, Image] FileSize - File Size: 914 bytes
 [File, System, Time] FileModifyDate - File Modification Date/Time: 2013:04:11 15:06:33-04:00
-[File, System, Time] FileAccessDate - File Access Date/Time: 2013:04:12 12:15:55-04:00
-[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:04:13 06:36:07-04:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2013:04:20 19:59:50-04:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:04:15 06:13:37-04:00
 [File, System, Image] FilePermissions - File Permissions: rw-r--r--
 [File, File, Image] FileType - File Type: FPF
 [File, File, Image] MIMEType - MIME Type: application/unknown
@@ -35,8 +35,8 @@
 [FLIR, FLIR, Image] 500 - Computed Atmospheric Trans: 0.99
 [FLIR, FLIR, Image] 504 - Estimated Atmospheric Trans: 0.00
 [FLIR, FLIR, Image] 508 - Reference Temperature: 20.0 C
-[FLIR, FLIR, Image] 512 - IR Window Temperature: 20.0 C
-[FLIR, FLIR, Image] 516 - IR Window Transmission: 1.00
+[FLIR, FLIR, Camera] 512 - IR Window Temperature: 20.0 C
+[FLIR, FLIR, Camera] 516 - IR Window Transmission: 1.00
 [FLIR, FLIR, Time] 584 - Date/Time Original: 2013:02:22 11:19:20.891
 [FLIR, FLIR, Image] 676 - Camera Scale Min: 267.3
 [FLIR, FLIR, Image] 680 - Camera Scale Max: 277.1
@@ -1,4 +1,4 @@
-[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.07
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.36
 [File, System, Image] FileSize - File Size: 38 kB
 [File, File, Image] FileType - File Type: RAF
 [File, File, Image] MIMEType - MIME Type: image/x-fujifilm-raf
@@ -82,8 +82,10 @@
 [MakerNotes, FujiFilm, Camera] 4112 - Fuji Flash Mode: Off
 [MakerNotes, FujiFilm, Camera] 4113 - Flash Exposure Comp: 0
 [MakerNotes, FujiFilm, Camera] 4129 - Focus Mode: Auto
+[MakerNotes, FujiFilm, Camera] 4130 - AF Point Set: Yes
 [MakerNotes, FujiFilm, Camera] 4144 - Slow Sync: Off
 [MakerNotes, FujiFilm, Camera] 4145 - Picture Mode: Manual
+[MakerNotes, FujiFilm, Camera] 4146 - Exposure Count: 1
 [MakerNotes, FujiFilm, Camera] 4352 - Auto Bracketing: Off
 [MakerNotes, FujiFilm, Camera] 4353 - Sequence Number: 0
 [MakerNotes, FujiFilm, Camera] 5120 - Dynamic Range: Wide
@@ -1,7 +1,7 @@
 # Before "make install", this script should be runnable with "make test".
 # After "make install" it should work as "perl t/GeoTiff.t".
 
-BEGIN { $| = 1; print "1..3\n"; $Image::ExifTool::noConfig = 1; }
+BEGIN { $| = 1; print "1..4\n"; $Image::ExifTool::noConfig = 1; }
 END {print "not ok 1\n" unless $loaded;}
 
 # test 1: Load the module(s)
@@ -32,5 +32,22 @@ my $testnum = 1;
     print "ok $testnum\n";
 }
 
+# test 4: Copy GeoTiff information
+{
+    ++$testnum;
+    my $exifTool = new Image::ExifTool;
+    my $testfile = "t/${testname}_${testnum}_failed.out";
+    unlink $testfile;
+    $exifTool->SetNewValuesFromFile('t/images/GeoTiff.tif', 'GeoTiff*');
+    my $ok = writeInfo($exifTool,'t/images/ExifTool.tif',$testfile);
+    my $info = $exifTool->ImageInfo($testfile, 'GeoTiff:*');
+    if (check($exifTool, $info, $testname, $testnum) and $ok) {
+        unlink $testfile;
+    } else {
+        print 'not ';
+    }
+    print "ok $testnum\n";
+}
+
 
 # end
@@ -0,0 +1,11 @@
+[GeoTiff, GeoTiff, Location] 1 - Geo Tiff Version: 1.1.0
+[GeoTiff, GeoTiff, Location] 1024 - GT Model Type: Projected
+[GeoTiff, GeoTiff, Location] 1025 - GT Raster Type: Pixel Is Area
+[GeoTiff, GeoTiff, Location] 2048 - Geographic Type: User Defined
+[GeoTiff, GeoTiff, Location] 2049 - Geog Citation: Hough UTM zone 17N
+[GeoTiff, GeoTiff, Location] 2050 - Geog Geodetic Datum: User Defined
+[GeoTiff, GeoTiff, Location] 2057 - Geog Semi Major Axis: 6378270
+[GeoTiff, GeoTiff, Location] 2058 - Geog Semi Minor Axis: 6356794.343479
+[GeoTiff, GeoTiff, Location] 3072 - Projected CS Type: User Defined
+[GeoTiff, GeoTiff, Location] 3073 - PCS Citation: Hough UTM zone 17N
+[GeoTiff, GeoTiff, Location] 3074 - Projection: UTM zone 17N
@@ -2,7 +2,7 @@
 # After "make install" it should work as "perl t/Geotag.t".
 
 BEGIN {
-    $| = 1; print "1..8\n"; $Image::ExifTool::noConfig = 1;
+    $| = 1; print "1..9\n"; $Image::ExifTool::noConfig = 1;
     # must create user-defined tags before loading ExifTool (used in test 8)
     %Image::ExifTool::UserDefined = (
         'Image::ExifTool::GPS::Main' => {
@@ -160,5 +160,22 @@ my $testfile2;
     print "ok $testnum\n";
 }
 
+# test 9: Geotag from KML track log, obtained from Google Location
+{
+    ++$testnum;
+    my $exifTool = new Image::ExifTool;
+    $testfile2 = "t/${testname}_${testnum}_failed.jpg";
+    unlink $testfile2;
+    $exifTool->SetNewValue(Geotag => 't/images/Geotag.kml');
+    $exifTool->SetNewValue(Geotime => '2013:11:13 09:04:31Z');
+    $exifTool->WriteInfo('t/images/Writer.jpg', $testfile2);
+    my $info = $exifTool->ImageInfo($testfile2, @testTags);
+    if (check($exifTool, $info, $testname, $testnum)) {
+        unlink $testfile2;
+    } else {
+        print 'not ';
+    }
+    print "ok $testnum\n";
+}
 
 # end
@@ -0,0 +1,7 @@
+[EXIF, GPS, Location] 0 - GPS Version ID: 2.3.0.0
+[EXIF, GPS, Location] 1 - GPS Latitude Ref: North
+[EXIF, GPS, Location] 2 - GPS Latitude: 34 deg 9' 55.90"
+[EXIF, GPS, Location] 3 - GPS Longitude Ref: West
+[EXIF, GPS, Location] 4 - GPS Longitude: 106 deg 1' 37.01"
+[EXIF, GPS, Time] 7 - GPS Time Stamp: 09:04:31
+[EXIF, GPS, Time] 29 - GPS Date Stamp: 2013:11:13
@@ -1,10 +1,10 @@
-[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.07
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.49
 [File, System, Image] FileName - File Name: M2TS.mts
 [File, System, Image] Directory - Directory: t/images
 [File, System, Image] FileSize - File Size: 1344 bytes
 [File, System, Time] FileModifyDate - File Modification Date/Time: 2009:07:08 13:57:28-04:00
-[File, System, Time] FileAccessDate - File Access Date/Time: 2012:11:19 15:31:05-05:00
-[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2012:11:17 09:18:25-05:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2014:01:31 08:47:10-05:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2014:01:25 07:49:16-05:00
 [File, System, Image] FilePermissions - File Permissions: rw-r--r--
 [File, File, Image] FileType - File Type: M2TS
 [File, File, Image] MIMEType - MIME Type: video/m2ts
@@ -20,8 +20,8 @@
 [H264, H264, Camera] 0 - Aperture Setting: 2.4
 [H264, H264, Camera] 1 - Gain: 9 dB
 [H264, H264, Camera] 1 - Image Stabilization: n/a
-[H264, H264, Image] 1.1 - Exposure Time: 1/30
+[H264, H264, Image] 1.1 - Exposure Time: 1/25
 [H264, H264, Camera] 0 - Make: Canon
 [H264, H264, Camera] 0 - Recording Mode: FXP
 [Composite, Composite, Image] ImageSize - Image Size: 1920x1080
-[Composite, Composite, Image] ShutterSpeed - Shutter Speed: 1/30
+[Composite, Composite, Image] ShutterSpeed - Shutter Speed: 1/25
@@ -1,7 +1,7 @@
 # Before "make install", this script should be runnable with "make test".
 # After "make install" it should work as "perl t/MWG.t".
 
-BEGIN { $| = 1; print "1..5\n"; $Image::ExifTool::noConfig = 1; }
+BEGIN { $| = 1; print "1..6\n"; $Image::ExifTool::noConfig = 1; }
 END {print "not ok 1\n" unless $loaded;}
 
 # test 1: Load the module(s)
@@ -32,15 +32,17 @@ my $testnum = 1;
     $exifTool->SetNewValue('MWG:DateTimeOriginal' => '2009:10:25 15:13:44.567-04:00');
     $exifTool->SetNewValue('MWG:Creator' => 'Creator One');
     $exifTool->SetNewValue('MWG:Creator' => 'Creator Two');
+    $exifTool->SetNewValue('MWG:City' => 'Some city');
     my @tags = qw(
         EXIF:DateTimeOriginal EXIF:SubSecTimeOriginal
         IPTC:DateCreated IPTC:TimeCreated XMP-photoshop:DateCreated
-        EXIF:Artist IPTC:By-line XMP-dc:Creator
+        EXIF:Artist IPTC:By-line XMP-dc:Creator IPTC:City
+        XMP-photoshop:City XMP-iptcExt:LocationShownCity
     );
     my $src;
     foreach $src('MWG.jpg', 'Writer.jpg') {
         ++$testnum;
-        $testfile = "t/${testname}_${testnum}_failed.jpg";
+        my $testfile = "t/${testname}_${testnum}_failed.jpg";
         unlink $testfile;
         $exifTool->WriteInfo("t/images/$src", $testfile);
         my $info = $exifTool->GetInfo('Warning');
@@ -68,5 +70,21 @@ my $testnum = 1;
     print "ok $testnum\n";
 }
 
+# test 6: Copy a tag with MWG feature active
+{
+    ++$testnum;
+    my $exifTool = new Image::ExifTool;
+    $exifTool->SetNewValuesFromFile('t/images/MWG.jpg', 'Creator');
+    my $testfile = "t/${testname}_${testnum}_failed.xmp";
+    unlink $testfile;
+    $exifTool->WriteInfo(undef, $testfile);
+    my $info = $exifTool->ImageInfo($testfile, 'Creator');
+    if (check($exifTool, $info, $testname, $testnum)) {
+        unlink $testfile;
+    } else {
+        print 'not ';
+    }
+    print "ok $testnum\n";
+}
 
 # end
@@ -4,5 +4,8 @@
 [IPTC, IPTC, Time] 55 - Date Created: 2009:10:25
 [IPTC, IPTC, Time] 60 - Time Created: 15:13:44-04:00
 [IPTC, IPTC, Author] 80 - By-line: Creator One, Creator Two
+[IPTC, IPTC, Location] 90 - City: Some city
+[XMP, XMP-iptcExt, Location] LocationShownCity - Location Shown City: Some city
 [XMP, XMP-dc, Author] creator - Creator: Creator One, Creator Two
+[XMP, XMP-photoshop, Location] City - City: Some city
 [XMP, XMP-photoshop, Time] DateCreated - Date Created: 2009:10:25 15:13:44.567-04:00
@@ -1,5 +1,7 @@
 [EXIF, IFD0, Author] 315 - Artist: Creator One, Creator Two
 [EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2009:10:25 15:13:44
 [EXIF, ExifIFD, Time] 37521 - Sub Sec Time Original: 567
+[XMP, XMP-iptcExt, Location] LocationShownCity - Location Shown City: Some city
 [XMP, XMP-dc, Author] creator - Creator: Creator One, Creator Two
+[XMP, XMP-photoshop, Location] City - City: Some city
 [XMP, XMP-photoshop, Time] DateCreated - Date Created: 2009:10:25 15:13:44.567-04:00
@@ -1,3 +1,6 @@
+[ExifTool, ExifTool, ExifTool] Warning - Warning: Ignored non-standard XMP at JPEG-APP9-MediaJukebox
+[ExifTool, ExifTool, ExifTool] Warning - Warning: Ignored non-standard IPTC at JPEG-Trailer-FotoStation-IPTC
+[ExifTool, ExifTool, ExifTool] Warning - Warning: Ignored non-standard IPTC at JPEG-Trailer-AFCP-IPTC
 [IPTC, IPTC, Other] 0 - Application Record Version: 2
 [IPTC, IPTC, Other] 120 - Caption-Abstract: A witty caption
 [IPTC, IPTC, Author] 122 - Writer-Editor: I wrote it
@@ -18,5 +21,3 @@
 [IPTC, IPTC, Other] 10 - Urgency: 8 (least urgent)
 [IPTC, IPTC, Author] 115 - Source: I'm the source
 [IPTC, IPTC, Other] 25 - Keywords: jambalaya
-[ExifTool, ExifTool, ExifTool] Warning - Warning: Ignored non-standard IPTC at JPEG-Trailer-FotoStation-IPTC
-[ExifTool, ExifTool, ExifTool] Warning - Warning: Ignored non-standard IPTC at JPEG-Trailer-AFCP-IPTC
@@ -0,0 +1,2 @@
+[XMP, XMP-dc, Author] creator - Creator: RIGHT1of2-EXIF-Creator, RIGHT2of2-EXIF-Creator
+[Composite, MWG, Author] Creator - Creator: RIGHT1of2-EXIF-Creator, RIGHT2of2-EXIF-Creator
@@ -1,10 +1,10 @@
-[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.26
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.32
 [File, System, Image] FileName - File Name: Nikon_4_failed.jpg
 [File, System, Image] Directory - Directory: t
-[File, System, Image] FileSize - File Size: 6.7 kB
-[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:04:09 07:53:14-04:00
-[File, System, Time] FileAccessDate - File Access Date/Time: 2013:04:09 07:53:14-04:00
-[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:04:09 07:53:14-04:00
+[File, System, Image] FileSize - File Size: 6.8 kB
+[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:06:12 12:34:49-04:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2013:06:12 12:34:49-04:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:06:12 12:34:49-04:00
 [File, System, Image] FilePermissions - File Permissions: rw-r--r--
 [File, File, Image] FileType - File Type: JPEG
 [File, File, Image] MIMEType - MIME Type: image/jpeg
@@ -136,7 +136,7 @@
 [MakerNotes, Nikon, Camera] 169 - Image Optimization: Custom
 [MakerNotes, Nikon, Camera] 170 - Saturation: Enhanced
 [MakerNotes, Nikon, Camera] 171 - Vari Program: 
-[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.26
+[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.32
 [XMP, XMP-aux, Camera] FlashCompensation - Flash Compensation: 0
 [XMP, XMP-aux, Camera] Lens - Lens: 18-70mm f/3.5-4.5
 [XMP, XMP-exif, Image] ComponentsConfiguration - Components Configuration: Y, Cb, Cr, -
@@ -146,6 +146,7 @@
 [XMP, XMP-exif, Camera] FlashMode - Flash Mode: Auto
 [XMP, XMP-exif, Camera] FlashRedEyeMode - Flash Red Eye Mode: False
 [XMP, XMP-exif, Camera] FlashReturn - Flash Return: Return detected
+[XMP, XMP-exifEX, Image] InteroperabilityIndex - Interoperability Index: R03 - DCF option file (Adobe RGB)
 [XMP, XMP-tiff, Image] BitsPerSample - Bits Per Sample: 8
 [XMP, XMP-tiff, Image] Compression - Compression: JPEG (old-style)
 [XMP, XMP-tiff, Image] ImageLength - Image Height: 47
@@ -1,10 +1,10 @@
-[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.07
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.31
 [File, System, Image] FileName - File Name: OlympusE1.jpg
 [File, System, Image] Directory - Directory: t/images
 [File, System, Image] FileSize - File Size: 7.2 kB
 [File, System, Time] FileModifyDate - File Modification Date/Time: 2006:01:04 14:02:27-05:00
-[File, System, Time] FileAccessDate - File Access Date/Time: 2012:11:19 15:31:02-05:00
-[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2012:11:17 09:18:25-05:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2013:05:30 08:55:04-04:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:05:25 07:37:29-04:00
 [File, System, Image] FilePermissions - File Permissions: rw-r--r--
 [File, File, Image] FileType - File Type: JPEG
 [File, File, Image] MIMEType - MIME Type: image/jpeg
@@ -172,7 +172,7 @@
 [MakerNotes, Olympus, Camera] 4612 - External Flash Bounce: Bounce or Off
 [MakerNotes, Olympus, Camera] 4613 - External Flash Zoom: 0
 [MakerNotes, Olympus, Camera] 4616 - Internal Flash: Off
-[MakerNotes, Olympus, Camera] 5376 - Sensor Temperature: 20
+[MakerNotes, Olympus, Camera] 5376 - Sensor Temperature: 20 C
 [PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0250
 [Composite, Composite, Image] Aperture - Aperture: 4.5
 [Composite, Composite, Camera] BlueBalance - Blue Balance: 1.132813
@@ -1,10 +1,10 @@
-[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.07
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.31
 [File, System, Image] FileName - File Name: Olympus_5_failed.jpg
 [File, System, Image] Directory - Directory: t
 [File, System, Image] FileSize - File Size: 7.2 kB
-[File, System, Time] FileModifyDate - File Modification Date/Time: 2012:11:20 07:49:46-05:00
-[File, System, Time] FileAccessDate - File Access Date/Time: 2012:11:20 07:49:46-05:00
-[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2012:11:20 07:49:46-05:00
+[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:05:30 09:51:24-04:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2013:05:30 09:51:24-04:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:05:30 09:51:24-04:00
 [File, System, Image] FilePermissions - File Permissions: rw-r--r--
 [File, File, Image] FileType - File Type: JPEG
 [File, File, Image] MIMEType - MIME Type: image/jpeg
@@ -224,7 +224,7 @@
 [MakerNotes, Olympus, Camera] 4614 - Olympus Focus Info 0x1206: 0
 [MakerNotes, Olympus, Camera] 4615 - Olympus Focus Info 0x1207: 0
 [MakerNotes, Olympus, Camera] 4616 - Internal Flash: Off
-[MakerNotes, Olympus, Camera] 5376 - Sensor Temperature: 20
+[MakerNotes, Olympus, Camera] 5376 - Sensor Temperature: 20 C
 [PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0250
 [PrintIM, PrintIM, Printing] 1 - Print IM 0x0001: 0x00140014
 [PrintIM, PrintIM, Printing] 2 - Print IM 0x0002: 0x00000001
@@ -1,7 +1,7 @@
 # Before "make install", this script should be runnable with "make test".
 # After "make install" it should work as "perl t/PNG.t".
 
-BEGIN { $| = 1; print "1..4\n"; $Image::ExifTool::noConfig = 1; }
+BEGIN { $| = 1; print "1..5\n"; $Image::ExifTool::noConfig = 1; }
 END {print "not ok 1\n" unless $loaded;}
 
 # test 1: Load the module(s)
@@ -72,4 +72,34 @@ my $testnum = 1;
     print "ok $testnum\n";
 }
 
+# test 5: Try moving XMP from after IDAT to before
+{
+    ++$testnum;
+    my $exifTool = new Image::ExifTool;
+    # start with a clean image
+    $exifTool->SetNewValue('all');
+    my $image;  
+    $exifTool->WriteInfo('t/images/PNG.png', \$image);
+    # add new XMP (should go after IDAT)
+    $exifTool->SetNewValue();
+    $exifTool->SetNewValue('XMP:Subject' => 'test');
+    $exifTool->WriteInfo(\$image);
+    # delete all XMP then copy back again (should move to before IDAT)
+    $exifTool->SetNewValue();
+    my $txtfile = "t/${testname}_${testnum}.failed";
+    open PNG_TEST_5, ">$txtfile" or warn "Error opening $txtfile\n";
+    $exifTool->Options(Verbose => 2);
+    $exifTool->Options(TextOut => \*PNG_TEST_5);
+    $exifTool->SetNewValue('xmp:all');
+    $exifTool->SetNewValuesFromFile(\$image, 'all:all<xmp:all');
+    my $rtnVal = $exifTool->WriteInfo(\$image);
+    close PNG_TEST_5;
+    if (testCompare('t/PNG_5.out', $txtfile, $testnum)) {
+        unlink $txtfile;
+    } else {
+        print 'not ';
+    }
+    print "ok $testnum\n";
+}
+
 # end
@@ -0,0 +1,17 @@
+  Deleting tags in: XMP XMP-*
+Sorry, XMP-x:XMPToolkit is unsafe for writing
+  Writing new tags after deleting groups: XMP XMP-*
+Writing XMP-dc:Subject
+  Editing tags in: PNG XMP 
+  Creating tags in: PNG XMP 
+  FileType = PNG
+  MIMEType = image/png
+PNG IHDR (13 bytes):
+PNG bKGD (2 bytes):
+Creating XMP iTXt chunk:
+  Creating XMP
+    + XMP-dc:Subject = 'test'
+PNG IDAT (1 chunk, total 14 bytes)
+PNG iTXt (436 bytes):
+  Deleting XMP
+PNG IEND (end of image)
@@ -1,10 +1,10 @@
-[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.25
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.51
 [File, System, Image] FileName - File Name: Panasonic.rw2
 [File, System, Image] Directory - Directory: t/images
 [File, System, Image] FileSize - File Size: 12 kB
 [File, System, Time] FileModifyDate - File Modification Date/Time: 2009:03:25 12:10:29-04:00
-[File, System, Time] FileAccessDate - File Access Date/Time: 2013:03:27 08:41:21-04:00
-[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:03:23 09:21:39-04:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2014:02:12 11:26:16-05:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2014:02:08 07:50:45-05:00
 [File, System, Image] FilePermissions - File Permissions: rw-r--r--
 [File, File, Image] FileType - File Type: RW2
 [File, File, Image] MIMEType - MIME Type: image/x-panasonic-rw2
@@ -23,7 +23,19 @@
 [EXIF, IFD0, Image] 5 - Sensor Left Border: 8
 [EXIF, IFD0, Image] 6 - Sensor Bottom Border: 2742
 [EXIF, IFD0, Image] 7 - Sensor Right Border: 3656
+[EXIF, IFD0, Image] 8 - Black Level 1: 1
+[EXIF, IFD0, Image] 9 - Black Level 2: 4
+[EXIF, IFD0, Image] 10 - Black Level 3: 12
+[EXIF, IFD0, Image] 14 - Linearity Limit Red: 4095
+[EXIF, IFD0, Image] 15 - Linearity Limit Green: 4095
+[EXIF, IFD0, Image] 16 - Linearity Limit Blue: 4095
 [EXIF, IFD0, Image] 23 - ISO: 80
+[EXIF, IFD0, Image] 24 - High ISO Multiplier Red: 0
+[EXIF, IFD0, Image] 25 - High ISO Multiplier Green: 0
+[EXIF, IFD0, Image] 26 - High ISO Multiplier Blue: 0
+[EXIF, IFD0, Image] 28 - Black Level Red: 0
+[EXIF, IFD0, Image] 29 - Black Level Green: 0
+[EXIF, IFD0, Image] 30 - Black Level Blue: 0
 [EXIF, IFD0, Image] 36 - WB Red Level: 570
 [EXIF, IFD0, Image] 37 - WB Green Level: 263
 [EXIF, IFD0, Image] 38 - WB Blue Level: 438
@@ -1,10 +1,10 @@
-[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.25
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.51
 [File, System, Image] FileName - File Name: Panasonic_5_failed.rw2
 [File, System, Image] Directory - Directory: t
 [File, System, Image] FileSize - File Size: 14 kB
-[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:03:27 08:41:55-04:00
-[File, System, Time] FileAccessDate - File Access Date/Time: 2013:03:27 08:41:55-04:00
-[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:03:27 08:41:55-04:00
+[File, System, Time] FileModifyDate - File Modification Date/Time: 2014:02:12 11:27:00-05:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2014:02:12 11:27:00-05:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2014:02:12 11:27:00-05:00
 [File, System, Image] FilePermissions - File Permissions: rw-r--r--
 [File, File, Image] FileType - File Type: RW2
 [File, File, Image] MIMEType - MIME Type: image/x-panasonic-rw2
@@ -24,22 +24,22 @@
 [EXIF, IFD0, Image] 5 - Sensor Left Border: 8
 [EXIF, IFD0, Image] 6 - Sensor Bottom Border: 2742
 [EXIF, IFD0, Image] 7 - Sensor Right Border: 3656
-[EXIF, IFD0, Image] 8 - Panasonic Raw 0x0008: 1
-[EXIF, IFD0, Image] 9 - Panasonic Raw 0x0009: 4
-[EXIF, IFD0, Image] 10 - Panasonic Raw 0x000a: 12
+[EXIF, IFD0, Image] 8 - Black Level 1: 1
+[EXIF, IFD0, Image] 9 - Black Level 2: 4
+[EXIF, IFD0, Image] 10 - Black Level 3: 12
 [EXIF, IFD0, Image] 11 - Panasonic Raw 0x000b: 34316
 [EXIF, IFD0, Image] 13 - Panasonic Raw 0x000d: 1
-[EXIF, IFD0, Image] 14 - Panasonic Raw 0x000e: 4095
-[EXIF, IFD0, Image] 15 - Panasonic Raw 0x000f: 4095
-[EXIF, IFD0, Image] 16 - Panasonic Raw 0x0010: 4095
+[EXIF, IFD0, Image] 14 - Linearity Limit Red: 4095
+[EXIF, IFD0, Image] 15 - Linearity Limit Green: 4095
+[EXIF, IFD0, Image] 16 - Linearity Limit Blue: 4095
 [EXIF, IFD0, Image] 23 - ISO: 80
-[EXIF, IFD0, Image] 24 - Panasonic Raw 0x0018: 0
-[EXIF, IFD0, Image] 25 - Panasonic Raw 0x0019: 0
-[EXIF, IFD0, Image] 26 - Panasonic Raw 0x001a: 0
+[EXIF, IFD0, Image] 24 - High ISO Multiplier Red: 0
+[EXIF, IFD0, Image] 25 - High ISO Multiplier Green: 0
+[EXIF, IFD0, Image] 26 - High ISO Multiplier Blue: 0
 [EXIF, IFD0, Image] 27 - Panasonic Raw 0x001b: .d...È...%90....
-[EXIF, IFD0, Image] 28 - Panasonic Raw 0x001c: 0
-[EXIF, IFD0, Image] 29 - Panasonic Raw 0x001d: 0
-[EXIF, IFD0, Image] 30 - Panasonic Raw 0x001e: 0
+[EXIF, IFD0, Image] 28 - Black Level Red: 0
+[EXIF, IFD0, Image] 29 - Black Level Green: 0
+[EXIF, IFD0, Image] 30 - Black Level Blue: 0
 [EXIF, IFD0, Image] 36 - WB Red Level: 570
 [EXIF, IFD0, Image] 37 - WB Green Level: 263
 [EXIF, IFD0, Image] 38 - WB Blue Level: 438
@@ -207,7 +207,7 @@
 [PanasonicRaw, PanasonicRaw, Image] 9 - Distortion Param 09: 0.00579833984375
 [PanasonicRaw, PanasonicRaw, Image] 11 - Distortion Param 11: -0.02374267578125
 [PanasonicRaw, PanasonicRaw, Image] 12 - Distortion N: 2280
-[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.25
+[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.51
 [XMP, XMP-dc, Image] title - Title: new title
 [IPTC, IPTC, Other] 25 - Keywords: a keyword
 [IPTC, IPTC, Other] 0 - Application Record Version: 4
@@ -1,10 +1,10 @@
-[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.21
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.43
 [File, System, Image] FileName - File Name: Pentax.jpg
 [File, System, Image] Directory - Directory: t/images
 [File, System, Image] FileSize - File Size: 2.7 kB
 [File, System, Time] FileModifyDate - File Modification Date/Time: 2008:03:28 13:40:33-04:00
-[File, System, Time] FileAccessDate - File Access Date/Time: 2013:02:25 09:25:12-05:00
-[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:02:21 07:55:43-05:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2013:12:01 10:59:58-05:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:12:08 06:32:51-05:00
 [File, System, Image] FilePermissions - File Permissions: rw-r--r--
 [File, File, Image] FileType - File Type: JPEG
 [File, File, Image] MIMEType - MIME Type: image/jpeg
@@ -74,7 +74,7 @@
 [MakerNotes, Pentax, Time] 7 - Time: 12:01:23
 [MakerNotes, Pentax, Camera] 8 - Quality: Better
 [MakerNotes, Pentax, Camera] 12 - Flash Mode: Off, Did not fire; Internal
-[MakerNotes, Pentax, Camera] 13 - Focus Mode: AF-S
+[MakerNotes, Pentax, Camera] 13 - Focus Mode: AF-S (Focus-priority)
 [MakerNotes, Pentax, Camera] 14 - AF Point Selected: Center
 [MakerNotes, Pentax, Camera] 18 - Exposure Time: 1/100
 [MakerNotes, Pentax, Camera] 19 - F Number: 13.0
@@ -152,6 +152,7 @@
 [MakerNotes, Pentax, Camera] 4 - AEB Xv: 0
 [MakerNotes, Pentax, Camera] 5 - AE Min Exposure Time: 1/3862
 [MakerNotes, Pentax, Camera] 6 - AE Program Mode: Av, B or X
+[MakerNotes, Pentax, Camera] 8 - AE Aperture Steps: 28
 [MakerNotes, Pentax, Camera] 9 - AE Max Aperture: 4.0
 [MakerNotes, Pentax, Camera] 10 - AE Max Aperture 2: 4.0
 [MakerNotes, Pentax, Camera] 11 - AE Min Aperture: 23
@@ -1,10 +1,10 @@
-[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.21
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.43
 [File, System, Image] FileName - File Name: Pentax_3_failed.jpg
 [File, System, Image] Directory - Directory: t
 [File, System, Image] FileSize - File Size: 2.5 kB
-[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:02:25 11:32:56-05:00
-[File, System, Time] FileAccessDate - File Access Date/Time: 2013:02:25 11:32:56-05:00
-[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:02:25 11:32:56-05:00
+[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:12:08 06:33:06-05:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2013:12:08 06:33:05-05:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:12:08 06:33:06-05:00
 [File, System, Image] FilePermissions - File Permissions: rw-r--r--
 [File, File, Image] FileType - File Type: JPEG
 [File, File, Image] MIMEType - MIME Type: image/jpeg
@@ -68,7 +68,7 @@
 [MakerNotes, Pentax, Time] 7 - Time: 12:01:23
 [MakerNotes, Pentax, Camera] 8 - Quality: Better
 [MakerNotes, Pentax, Camera] 12 - Flash Mode: Off, Did not fire; Internal
-[MakerNotes, Pentax, Camera] 13 - Focus Mode: AF-S
+[MakerNotes, Pentax, Camera] 13 - Focus Mode: AF-S (Focus-priority)
 [MakerNotes, Pentax, Camera] 14 - AF Point Selected: Center
 [MakerNotes, Pentax, Camera] 18 - Exposure Time: 1/100
 [MakerNotes, Pentax, Camera] 19 - F Number: 13.0
@@ -148,6 +148,7 @@
 [MakerNotes, Pentax, Camera] 5 - AE Min Exposure Time: 1/3862
 [MakerNotes, Pentax, Camera] 6 - AE Program Mode: Av, B or X
 [MakerNotes, Pentax, Camera] 7 - AE Flags: (none)
+[MakerNotes, Pentax, Camera] 8 - AE Aperture Steps: 28
 [MakerNotes, Pentax, Camera] 9 - AE Max Aperture: 4.0
 [MakerNotes, Pentax, Camera] 10 - AE Max Aperture 2: 4.0
 [MakerNotes, Pentax, Camera] 11 - AE Min Aperture: 23
@@ -1,10 +1,10 @@
-[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.07
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.42
 [File, System, Image] FileName - File Name: Pentax.avi
 [File, System, Image] Directory - Directory: t/images
 [File, System, Image] FileSize - File Size: 1672 bytes
 [File, System, Time] FileModifyDate - File Modification Date/Time: 2009:10:30 08:10:17-04:00
-[File, System, Time] FileAccessDate - File Access Date/Time: 2012:11:19 15:31:05-05:00
-[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2012:11:17 09:18:25-05:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2013:12:01 09:36:02-05:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:11:05 20:04:31-05:00
 [File, System, Image] FilePermissions - File Permissions: rw-r--r--
 [File, File, Image] FileType - File Type: AVI
 [File, File, Image] MIMEType - MIME Type: video/x-msvideo
@@ -94,11 +94,15 @@
 [MakerNotes, Pentax, Camera] 4 - AEB Xv: 0
 [MakerNotes, Pentax, Camera] 5 - AE Min Exposure Time: 1/5461
 [MakerNotes, Pentax, Camera] 6 - AE Program Mode: Standard
+[MakerNotes, Pentax, Camera] 8 - AE Aperture Steps: 0
 [MakerNotes, Pentax, Camera] 9 - AE Max Aperture: 4.0
 [MakerNotes, Pentax, Camera] 10 - AE Max Aperture 2: 3.8
 [MakerNotes, Pentax, Camera] 11 - AE Min Aperture: 27
 [MakerNotes, Pentax, Camera] 12 - AE Metering Mode: Multi-segment
+[MakerNotes, Pentax, Camera] 13 - AE White Balance: Daylight Fluorescent
+[MakerNotes, Pentax, Camera] 13.1 - AE Metering Mode 2: Multi-segment
 [MakerNotes, Pentax, Camera] 14 - Flash Exposure Comp. Setting: -1.0
+[MakerNotes, Pentax, Camera] 21 - Level Indicator: n/a
 [MakerNotes, Pentax, Camera] 0 - Lens Type: smc PENTAX-DA L 18-55mm F3.5-5.6
 [MakerNotes, Pentax, Camera] 0.1 - Auto Aperture: On
 [MakerNotes, Pentax, Camera] 0.2 - Min Aperture: 32
@@ -1,10 +1,10 @@
-[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.07
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.31
 [File, System, Image] FileName - File Name: Photoshop_3_failed.psd
 [File, System, Image] Directory - Directory: t
 [File, System, Image] FileSize - File Size: 16 kB
-[File, System, Time] FileModifyDate - File Modification Date/Time: 2012:11:20 07:49:48-05:00
-[File, System, Time] FileAccessDate - File Access Date/Time: 2012:11:20 07:49:48-05:00
-[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2012:11:20 07:49:48-05:00
+[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:05:28 09:10:19-04:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2013:05:28 09:10:19-04:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:05:28 09:10:19-04:00
 [File, System, Image] FilePermissions - File Permissions: rw-r--r--
 [File, File, Image] FileType - File Type: PSD
 [File, File, Image] MIMEType - MIME Type: application/vnd.adobe.photoshop
@@ -25,7 +25,7 @@
 [Photoshop, Photoshop, Image] 1062 - Print Scale: ?€
 [Photoshop, Photoshop, Image] 1037 - Global Angle: 120
 [Photoshop, Photoshop, Image] 1049 - Global Altitude: 30
-[Photoshop, Photoshop, Image] 1011 - Print Flags: .
+[Photoshop, Photoshop, Image] 1011 - Print Flags: 0 0 0 0 0 0 0 0 1
 [Photoshop, Photoshop, Author] 1034 - Copyright Flag: False
 [Photoshop, Photoshop, Author] 1035 - URL: http://owl.phy.queensu.ca/~phil/exiftool/
 [Photoshop, Photoshop, Image] 10000 - Print Flags Info: ..
@@ -34,7 +34,7 @@
 [Photoshop, Photoshop, Image] 1032 - Grid Guides Info: ..@.@
 [Photoshop, Photoshop, Image] 1054 - URL List: 
 [Photoshop, Photoshop, Image] 1050 - Slices: ....b.......null..boundsObjc.Rct1.Top longLeftlongBtomlong.Rghtlong..slicesVlLs.Objc..slice..sliceIDlong.groupIDlong.originenum.ESliceOrigin;autoGeneratedTypeenum;ESliceTypeImg .boundsObjc.Rct1.Top longLeftlongBtomlong.Rghtlong..urlTEXT.nullTEXT.MsgeTEXT..altTagTEXT..cellTextIsHTMLbool..cellTextTEXT..horzAlignenum.ESliceHorzAlign.default.vertAlignenum.ESliceVertAlign.default.bgColorTypeenum.ESliceBGColorTypeNone.topOutsetlong;leftOutsetlong.bottomOutsetlong.rightOutsetlong
-[Photoshop, Photoshop, Image] 1044 - IDs Base Value: .
+[Photoshop, Photoshop, Image] 1044 - IDs Base Value: 1
 [Photoshop, Photoshop, Image] 1057 - Version Info: ...Adobe Photoshop.Adobe Photoshop 7.0.
 [IPTC, IPTC, Other] 0 - Application Record Version: 2
 [IPTC, IPTC, Other] 120 - Caption-Abstract: This is a teeny weeny white square
@@ -43,7 +43,7 @@
 [IPTC, IPTC, Author] 85 - By-line Title: Supreme leader
 [IPTC, IPTC, Other] 5 - Object Name: Test Picture
 [IPTC, IPTC, Author] 116 - Copyright Notice: Free for all
-[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.07
+[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.30
 [XMP, XMP-rdf, Document] about - About: uuid:c197d41e-f8f7-11d9-b03e-c023c3939af5
 [XMP, XMP-dc, Author] creator - Creator: Phil Harvey
 [XMP, XMP-dc, Image] description - Description: This is a teeny weeny white square
@@ -1,7 +1,7 @@
 # Before "make install", this script should be runnable with "make test".
 # After "make install" it should work as "perl t/QuickTime.t".
 
-BEGIN { $| = 1; print "1..3\n"; $Image::ExifTool::noConfig = 1; }
+BEGIN { $| = 1; print "1..5\n"; $Image::ExifTool::noConfig = 1; }
 END {print "not ok 1\n" unless $loaded;}
 
 # test 1: Load the module(s)
@@ -27,5 +27,28 @@ my $testnum = 1;
     }
 }
 
+# tests 4-5: Try writing XMP to the different file formats
+{
+    my $ext;
+    my $exifTool = new Image::ExifTool;
+    $exifTool->Options(SavePath => 1); # to save group 5 names
+    $exifTool->SetNewValue('XMP:Title' => 'x');
+    $exifTool->SetNewValue('TrackCreateDate' => '2000:01:02 03:04:05');
+    $exifTool->SetNewValue('Track1:TrackModifyDate' => '2013:11:04 10:32:15');
+    foreach $ext (qw(mov m4a)) {
+        ++$testnum;
+    	my $testfile = "t/${testname}_$testnum.failed";
+    	unlink $testfile;
+        my $rtnVal = $exifTool->WriteInfo("t/images/QuickTime.$ext", $testfile);
+        my $info = $exifTool->ImageInfo($testfile, 'title', 'time:all');
+		if (check($exifTool, $info, $testname, $testnum, undef, 5)) {
+			unlink $testfile;
+		} else {
+			print 'not ';
+		}
+		print "ok $testnum\n";
+    }
+}
+
 
 # end
@@ -1,10 +1,10 @@
-[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.07
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.46
 [File, System, Image] FileName - File Name: QuickTime.mov
 [File, System, Image] Directory - Directory: t/images
 [File, System, Image] FileSize - File Size: 3.8 kB
-[File, System, Time] FileModifyDate - File Modification Date/Time: 2010:07:30 12:56:41-04:00
-[File, System, Time] FileAccessDate - File Access Date/Time: 2012:11:19 15:31:35-05:00
-[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2012:11:17 09:18:25-05:00
+[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:11:05 10:27:25-05:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2014:01:02 11:35:35-05:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:12:21 08:10:14-05:00
 [File, System, Image] FilePermissions - File Permissions: rw-r--r--
 [File, File, Image] FileType - File Type: MOV
 [File, File, Image] MIMEType - MIME Type: video/quicktime
@@ -78,10 +78,10 @@
 [QuickTime, Track2, Video] 4 - Handler Class: Data Handler
 [QuickTime, Track2, Video] 8 - Handler Type: Alias Data
 [QuickTime, Track2, Video] 12 - Handler Vendor ID: Pentax
-[QuickTime, Track2, Audio] 2 - Audio Format: raw 
-[QuickTime, Track2, Audio] 12 - Audio Channels: 1
-[QuickTime, Track2, Audio] 13 - Audio Bits Per Sample: 8
-[QuickTime, Track2, Audio] 16 - Audio Sample Rate: 7875
+[QuickTime, Track2, Audio] 4 - Audio Format: raw 
+[QuickTime, Track2, Audio] 24 - Audio Channels: 1
+[QuickTime, Track2, Audio] 26 - Audio Bits Per Sample: 8
+[QuickTime, Track2, Audio] 32 - Audio Sample Rate: 7875
 [QuickTime, QuickTime, Video] 8 - Handler Type: Metadata Tags
 [QuickTime, QuickTime, Audio] 1 - Album: ålbum
 [QuickTime, QuickTime, Audio] 2 - Artist: årtist
@@ -108,6 +108,8 @@
 [QuickTime, QuickTime, Time] ©day - Year: 2010
 [QuickTime, QuickTime, Audio] ©cmt - Comment: çømménts
 [QuickTime, QuickTime, Audio] tmpo - Beats Per Minute: 128
+[QuickTime, QuickTime, Video] mdat-size - Movie Data Size: 0
+[QuickTime, QuickTime, Video] mdat-offset - Movie Data Offset: 3871
 [MakerNotes, Pentax, Camera] 0 - Make: PENTAX DIGITAL CAMERA
 [MakerNotes, Pentax, Camera] 38 - Exposure Time: 1/38
 [MakerNotes, Pentax, Camera] 42 - F Number: 4.0
@@ -121,6 +123,7 @@
 [XMP, XMP-xmp, Time] MetadataDate - Metadata Date: 2008:09:12 11:17:39-04:00
 [XMP, XMP-dc, Author] creator - Creator: Phil Harvey
 [Composite, Composite, Image] Aperture - Aperture: 4.0
+[Composite, Composite, Video] AvgBitrate - Avg Bitrate: 0 bps
 [Composite, Composite, Image] ImageSize - Image Size: 320x240
 [Composite, Composite, Video] Rotation - Rotation: 0
 [Composite, Composite, Image] ShutterSpeed - Shutter Speed: 1/38
@@ -1,10 +1,10 @@
-[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.17
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.46
 [File, System, Image] FileName - File Name: QuickTime.m4a
 [File, System, Image] Directory - Directory: t/images
 [File, System, Image] FileSize - File Size: 5.1 kB
-[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:09:23 16:45:18-04:00
-[File, System, Time] FileAccessDate - File Access Date/Time: 2013:02:05 08:34:38-05:00
-[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:02:02 10:48:34-05:00
+[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:11:05 10:27:28-05:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2014:01:02 11:35:35-05:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:12:21 08:10:14-05:00
 [File, System, Image] FilePermissions - File Permissions: rw-r--r--
 [File, File, Image] FileType - File Type: M4A
 [File, File, Image] MIMEType - MIME Type: audio/mp4
@@ -42,10 +42,10 @@
 [QuickTime, Track1, Video] 5 - Media Language Code: und
 [QuickTime, Track1, Video] 8 - Handler Type: Audio Track
 [QuickTime, Track1, Audio] 2 - Balance: 0
-[QuickTime, Track1, Audio] 2 - Audio Format: mp4a
-[QuickTime, Track1, Audio] 12 - Audio Channels: 2
-[QuickTime, Track1, Audio] 13 - Audio Bits Per Sample: 16
-[QuickTime, Track1, Audio] 16 - Audio Sample Rate: 44100
+[QuickTime, Track1, Audio] 4 - Audio Format: mp4a
+[QuickTime, Track1, Audio] 24 - Audio Channels: 2
+[QuickTime, Track1, Audio] 26 - Audio Bits Per Sample: 16
+[QuickTime, Track1, Audio] 32 - Audio Sample Rate: 44100
 [QuickTime, QuickTime, Video] 8 - Handler Type: Metadata
 [QuickTime, QuickTime, Video] 12 - Handler Vendor ID: Apple
 [QuickTime, QuickTime, Audio] ©nam - Title: Sample
@@ -67,3 +67,6 @@
 [QuickTime, QuickTime, Audio] pgap - Play Gap: No Gap
 [QuickTime, QuickTime, Audio] covr - Cover Art: (Binary data 19 bytes)
 [QuickTime, QuickTime, Audio] covr - Cover Art: (Binary data 19 bytes)
+[QuickTime, QuickTime, Video] mdat-size - Movie Data Size: 0
+[QuickTime, QuickTime, Video] mdat-offset - Movie Data Offset: 5237
+[Composite, Composite, Video] AvgBitrate - Avg Bitrate: 0 bps
@@ -0,0 +1,16 @@
+[File, System, Time, Main, , System] FileModifyDate - File Modification Date/Time: 2013:11:04 10:32:33-05:00
+[File, System, Time, Main, , System] FileAccessDate - File Access Date/Time: 2013:11:04 10:32:33-05:00
+[File, System, Time, Main, , System] FileInodeChangeDate - File Inode Change Date/Time: 2013:11:04 10:32:33-05:00
+[QuickTime, QuickTime, Time, Main, , MOV-Movie-MovieHeader] 1 - Create Date: 2005:08:11 14:03:54
+[QuickTime, QuickTime, Time, Main, , MOV-Movie-MovieHeader] 2 - Modify Date: 2010:07:30 15:43:59
+[QuickTime, Track1, Time, Main, , MOV-Movie-Track-TrackHeader] 1 - Track Create Date: 2000:01:02 03:04:05
+[QuickTime, Track1, Time, Main, , MOV-Movie-Track-TrackHeader] 2 - Track Modify Date: 2013:11:04 10:32:15
+[QuickTime, Track1, Time, Main, Copy1, MOV-Movie-Track-Media-MediaHeader] 1 - Media Create Date: 2005:08:11 14:03:54
+[QuickTime, Track1, Time, Main, Copy1, MOV-Movie-Track-Media-MediaHeader] 2 - Media Modify Date: 2005:08:11 14:03:54
+[QuickTime, Track2, Time, Main, Copy1, MOV-Movie-Track-TrackHeader] 1 - Track Create Date: 2000:01:02 03:04:05
+[QuickTime, Track2, Time, Main, Copy1, MOV-Movie-Track-TrackHeader] 2 - Track Modify Date: 2005:08:11 14:03:54
+[QuickTime, Track2, Time, Main, , MOV-Movie-Track-Media-MediaHeader] 1 - Media Create Date: 2005:08:11 14:03:54
+[QuickTime, Track2, Time, Main, , MOV-Movie-Track-Media-MediaHeader] 2 - Media Modify Date: 2005:08:11 14:03:54
+[QuickTime, QuickTime, Time, Main, , MOV-Movie-UserData-Meta-ItemList] ©day - Year: 2010
+[XMP, XMP-dc, Image, Main, , MOV-Movie-UserData-XMP] title - Title: x
+[XMP, XMP-xmp, Time, Main, , MOV-Movie-UserData-XMP] MetadataDate - Metadata Date: 2008:09:12 11:17:39-04:00
@@ -0,0 +1,12 @@
+[File, System, Time, Main, , System] FileModifyDate - File Modification Date/Time: 2013:11:04 10:32:33-05:00
+[File, System, Time, Main, , System] FileAccessDate - File Access Date/Time: 2013:11:04 10:32:33-05:00
+[File, System, Time, Main, , System] FileInodeChangeDate - File Inode Change Date/Time: 2013:11:04 10:32:33-05:00
+[QuickTime, QuickTime, Time, Main, , MOV-Movie-MovieHeader] 1 - Create Date: 2005:06:29 19:02:19
+[QuickTime, QuickTime, Time, Main, , MOV-Movie-MovieHeader] 2 - Modify Date: 2006:09:22 11:06:45
+[QuickTime, Track1, Time, Main, , MOV-Movie-Track-TrackHeader] 1 - Track Create Date: 2000:01:02 03:04:05
+[QuickTime, Track1, Time, Main, , MOV-Movie-Track-TrackHeader] 2 - Track Modify Date: 2013:11:04 10:32:15
+[QuickTime, Track1, Time, Main, , MOV-Movie-Track-Media-MediaHeader] 1 - Media Create Date: 2005:06:29 19:02:19
+[QuickTime, Track1, Time, Main, , MOV-Movie-Track-Media-MediaHeader] 2 - Media Modify Date: 2006:09:22 11:06:45
+[QuickTime, QuickTime, Audio, Main, Copy1, MOV-Movie-UserData-Meta-ItemList] ©nam - Title: Sample
+[QuickTime, QuickTime, Time, Main, , MOV-Movie-UserData-Meta-ItemList] ©day - Year: 2006
+[XMP, XMP-dc, Image, Main, , MOV-UUID-XMP] title - Title: x
@@ -0,0 +1,28 @@
+# Before "make install", this script should be runnable with "make test".
+# After "make install" it should work as "perl t/Torrent.t".
+
+BEGIN { $| = 1; print "1..2\n"; $Image::ExifTool::noConfig = 1; }
+END {print "not ok 1\n" unless $loaded;}
+
+# test 1: Load the module(s)
+use Image::ExifTool 'ImageInfo';
+use Image::ExifTool::Torrent;
+$loaded = 1;
+print "ok 1\n";
+
+use t::TestLib;
+
+my $testname = 'Torrent';
+my $testnum = 1;
+
+# test 2: Extract information from a BitTorrent file
+{
+    my $exifTool = new Image::ExifTool;
+    ++$testnum;
+    my $info = $exifTool->ImageInfo('t/images/Torrent.torrent');
+    print 'not ' unless check($exifTool, $info, $testname, $testnum);
+    print "ok $testnum\n";
+}
+
+
+# end
@@ -0,0 +1,31 @@
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.36
+[File, System, Image] FileName - File Name: Torrent.torrent
+[File, System, Image] Directory - Directory: t/images
+[File, System, Image] FileSize - File Size: 837 bytes
+[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:09:06 11:33:59-04:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2013:09:06 11:34:18-04:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:09:06 11:33:59-04:00
+[File, System, Image] FilePermissions - File Permissions: rw-r--r--
+[File, File, Image] FileType - File Type: TORRENT
+[File, File, Image] MIMEType - MIME Type: application/x-bittorrent
+[Torrent, Torrent, Document] announce - Announce: udp://tracker.bogus.com:80/announce
+[Torrent, Torrent, Document] announce-list1 - Announce List 1: udp://tracker.bogus.com:80/announce
+[Torrent, Torrent, Document] announce-list2 - Announce List 2: udp://tracker.bogus2.com:80/announce
+[Torrent, Torrent, Document] announce-list3 - Announce List 3: udp://tracker.bogus3.com:80/announce
+[Torrent, Torrent, Document] comment - Comment: Test BitTorrent description file
+[Torrent, Torrent, Document] created by - Creator: uTorrent/1840
+[Torrent, Torrent, Time] creation date - Create Date: 2013:09:06 11:33:59-04:00
+[Torrent, Torrent, Document] encoding - Encoding: UTF-8
+[Torrent, Torrent, Document] length1 - File 1 Length: 3.5 MB
+[Torrent, Torrent, Document] path1 - File 1 Path: exiftool-9.35.zip
+[Torrent, Torrent, Document] length2 - File 2 Length: 3.5 MB
+[Torrent, Torrent, Document] path2 - File 2 Path: Image-ExifTool-9.35.tar.gz
+[Torrent, Torrent, Document] length3 - File 3 Length: 2.3 MB
+[Torrent, Torrent, Document] path3 - File 3 Path: ExifTool-9.35.dmg
+[Torrent, Torrent, Document] length4 - File 4 Length: 11 kB
+[Torrent, Torrent, Document] path4 - File 4 Path: docs/README
+[Torrent, Torrent, Document] name - Name: Image-ExifTool-9.35
+[Torrent, Torrent, Document] piece length - Piece Length: 1048576
+[Torrent, Torrent, Document] pieces - Pieces: (Binary data 200 bytes)
+[Torrent, Torrent, Document] url-list1 - URL List 1: http://seed.bogus.com/
+[Torrent, Torrent, Document] url-list2 - URL List 2: http://seed.bogus2.com/
@@ -1,7 +1,7 @@
 # Before "make install", this script should be runnable with "make test".
 # After "make install" it should work as "perl t/Writer.t".
 
-BEGIN { $| = 1; print "1..50\n"; $Image::ExifTool::noConfig = 1; }
+BEGIN { $| = 1; print "1..56\n"; $Image::ExifTool::noConfig = 1; }
 END {print "not ok 1\n" unless $loaded;}
 
 # test 1: Load the module(s)
@@ -834,7 +834,7 @@ my $testOK;
     print "ok $testnum\n";
 }
 
-# tests 48-49: More WriteMode 'cg' tests, and test AddUserDefinedTags()
+# tests 48-50: More WriteMode 'cg' tests, and test AddUserDefinedTags()
 {
     ++$testnum;
     my $testfile = "t/${testname}_${testnum}_failed.jpg";
@@ -893,4 +893,105 @@ my $testOK;
     print "ok $testnum\n";
 }
 
+# test 51: Delete a unknown JPEG APP segment
+{
+    ++$testnum;
+    my $exifTool = new Image::ExifTool;
+    $exifTool->SetNewValue('APP6:*' => undef);
+    $testfile = "t/${testname}_${testnum}_failed.jpg";
+    unlink $testfile;
+    writeInfo($exifTool, 't/images/ExifTool.jpg', $testfile);
+    my $info = $exifTool->ImageInfo($testfile);
+    if (check($exifTool, $info, $testname, $testnum)) {
+        unlink $testfile;
+    } else {
+        print 'not ';
+    }
+    print "ok $testnum\n";
+}
+
+# test 52: Delete groups by family 2 group name
+{
+    ++$testnum;
+    my $exifTool = new Image::ExifTool;
+    $exifTool->SetNewValue('Image:*');
+    $exifTool->SetNewValue('Camera:*');
+    $testfile = "t/${testname}_${testnum}_failed.xmp";
+    unlink $testfile;
+    writeInfo($exifTool, 't/images/XMP.xmp', $testfile);
+    my $info = $exifTool->ImageInfo($testfile);
+    if (check($exifTool, $info, $testname, $testnum)) {
+        unlink $testfile;
+    } else {
+        print 'not ';
+    }
+    print "ok $testnum\n";
+}
+
+# test 53: Exclude groups when copying
+{
+    ++$testnum;
+    my $exifTool = new Image::ExifTool;
+    $exifTool->SetNewValuesFromFile('t/images/Canon.jpg', '-Exif:All', '-Canon:All');
+    $testfile = "t/${testname}_${testnum}_failed.xmp";
+    unlink $testfile;
+    writeInfo($exifTool, 't/images/Writer.jpg', $testfile);
+    my $info = $exifTool->ImageInfo($testfile);
+    if (check($exifTool, $info, $testname, $testnum)) {
+        unlink $testfile;
+    } else {
+        print 'not ';
+    }
+    print "ok $testnum\n";
+}
+
+# test 54: Specify multiple groups when copying, excluding a single tag
+{
+    ++$testnum;
+    my $exifTool = new Image::ExifTool;
+    $exifTool->SetNewValuesFromFile('t/images/Canon.jpg', 'Exif:Time:All', '-createdate');
+    $testfile = "t/${testname}_${testnum}_failed.xmp";
+    unlink $testfile;
+    writeInfo($exifTool, 't/images/Writer.jpg', $testfile);
+    my $info = $exifTool->ImageInfo($testfile, 'exif:*', '-image:all');
+    if (check($exifTool, $info, $testname, $testnum)) {
+        unlink $testfile;
+    } else {
+        print 'not ';
+    }
+    print "ok $testnum\n";
+}
+
+# test 55-56: Create and edit EXV file
+{
+    ++$testnum;
+    my $exifTool = new Image::ExifTool;
+    $exifTool->SetNewValue(Artist => 'me');
+    $exifTool->SetNewValue(Keywords => ['one','two']);
+    $testfile = "t/${testname}_${testnum}_failed.exv";
+    unlink $testfile;
+    writeInfo($exifTool, undef, $testfile);
+    my $info = $exifTool->ImageInfo($testfile, 'exif:*', 'iptc:*', 'xmp:*');
+    unless (check($exifTool, $info, $testname, $testnum)) {
+        print 'not ';
+    }
+    print "ok $testnum\n";
+
+    ++$testnum;
+    $exifTool->SetNewValue();
+    $exifTool->SetNewValue(Artist);
+    $exifTool->SetNewValue(Title => 'Test');
+    my $testfile2 = "t/${testname}_${testnum}_failed.exv";
+    unlink $testfile2;
+    writeInfo($exifTool, $testfile, $testfile2);
+    $info = $exifTool->ImageInfo($testfile2, 'exif:*', 'iptc:*', 'xmp:*');
+    if (check($exifTool, $info, $testname, $testnum)) {
+        unlink $testfile;
+        unlink $testfile2;
+    } else {
+        print 'not ';
+    }
+    print "ok $testnum\n";
+}
+
 # end
@@ -1,10 +1,10 @@
-[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.21
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.43
 [File, System, Image] FileName - File Name: Writer_10_failed.jpg
 [File, System, Image] Directory - Directory: t
-[File, System, Image] FileSize - File Size: 6.8 kB
-[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:02:25 11:33:01-05:00
-[File, System, Time] FileAccessDate - File Access Date/Time: 2013:02:25 11:33:01-05:00
-[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:02:25 11:33:01-05:00
+[File, System, Image] FileSize - File Size: 7.0 kB
+[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:12:08 06:33:11-05:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2013:12:08 06:33:11-05:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:12:08 06:33:11-05:00
 [File, System, Image] FilePermissions - File Permissions: rw-r--r--
 [File, File, Image] FileType - File Type: JPEG
 [File, File, Image] MIMEType - MIME Type: image/jpeg
@@ -80,7 +80,7 @@
 [MakerNotes, Pentax, Time] 7 - Time: 12:01:23
 [MakerNotes, Pentax, Camera] 8 - Quality: Better
 [MakerNotes, Pentax, Camera] 12 - Flash Mode: Off, Did not fire; Internal
-[MakerNotes, Pentax, Camera] 13 - Focus Mode: AF-S
+[MakerNotes, Pentax, Camera] 13 - Focus Mode: AF-S (Focus-priority)
 [MakerNotes, Pentax, Camera] 14 - AF Point Selected: Center
 [MakerNotes, Pentax, Camera] 18 - Exposure Time: 1/100
 [MakerNotes, Pentax, Camera] 19 - F Number: 13.0
@@ -158,6 +158,7 @@
 [MakerNotes, Pentax, Camera] 4 - AEB Xv: 0
 [MakerNotes, Pentax, Camera] 5 - AE Min Exposure Time: 1/3862
 [MakerNotes, Pentax, Camera] 6 - AE Program Mode: Av, B or X
+[MakerNotes, Pentax, Camera] 8 - AE Aperture Steps: 28
 [MakerNotes, Pentax, Camera] 9 - AE Max Aperture: 4.0
 [MakerNotes, Pentax, Camera] 10 - AE Max Aperture 2: 4.0
 [MakerNotes, Pentax, Camera] 11 - AE Min Aperture: 23
@@ -211,7 +212,7 @@
 [MakerNotes, Pentax, Image] 16 - WB Shift AB: 0
 [MakerNotes, Pentax, Image] 17 - WB Shift GM: 0
 [PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0300
-[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.21
+[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.43
 [XMP, XMP-dc, Time] date - Date: 2008:03:02
 [XMP, XMP-exif, Image] ComponentsConfiguration - Components Configuration: Y, Cb, Cr, -
 [XMP, XMP-exif, Camera] FlashFired - Flash Fired: False
@@ -219,6 +220,7 @@
 [XMP, XMP-exif, Camera] FlashMode - Flash Mode: Off
 [XMP, XMP-exif, Camera] FlashRedEyeMode - Flash Red Eye Mode: False
 [XMP, XMP-exif, Camera] FlashReturn - Flash Return: No return detection
+[XMP, XMP-exifEX, Image] InteroperabilityIndex - Interoperability Index: R98 - DCF basic file (sRGB)
 [XMP, XMP-tiff, Image] BitsPerSample - Bits Per Sample: 8
 [XMP, XMP-tiff, Image] Compression - Compression: JPEG (old-style)
 [XMP, XMP-tiff, Image] ImageLength - Image Height: 8
@@ -1,10 +1,10 @@
-[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.13
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.40
 [File, System, Image] FileName - File Name: Writer_46_failed.jpg
 [File, System, Image] Directory - Directory: t
-[File, System, Image] FileSize - File Size: 6.8 kB
-[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:01:07 14:13:57-05:00
-[File, System, Time] FileAccessDate - File Access Date/Time: 2013:01:07 14:13:57-05:00
-[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:01:07 14:13:57-05:00
+[File, System, Image] FileSize - File Size: 6.9 kB
+[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:10:30 08:24:02-04:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2013:10:30 08:24:02-04:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:10:30 08:24:02-04:00
 [File, System, Image] FilePermissions - File Permissions: rw-r--r--
 [File, File, Image] FileType - File Type: JPEG
 [File, File, Image] MIMEType - MIME Type: image/jpeg
@@ -34,7 +34,7 @@
 [IPTC, IPTC, Other] 152 - Audio Sampling Resolution: 07
 [IPTC, IPTC, Other] 153 - Audio Duration: 000007
 [IPTC, IPTC, Other] 154 - Audio Outcue: 7
-[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.13
+[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.40
 [XMP, XMP-iptcExt, Author] AddlModelInfo - Additional Model Information: 7
 [XMP, XMP-iptcExt, Author] ArtworkOrObjectAOCopyrightNotice - Artwork Copyright Notice: 7
 [XMP, XMP-iptcExt, Author] ArtworkOrObjectAOCreator - Artwork Creator: 7
@@ -48,6 +48,7 @@
 [XMP, XMP-aas, Image] AffineX - Affine X: 7
 [XMP, XMP-aas, Image] AffineY - Affine Y: 7
 [XMP, XMP-apple-fi, Image] AngleInfoRoll - Angle Info Roll: 7
+[XMP, XMP-apple-fi, Image] AngleInfoYaw - Angle Info Yaw: 7
 [XMP, XMP-aux, Camera] ApproximateFocusDistance - Approximate Focus Distance: 7
 [XMP, XMP-cc, Author] attributionName - Attribution Name: 7
 [XMP, XMP-cc, Author] attributionURL - Attribution URL: 7
@@ -73,5 +74,6 @@
 [XMP, XMP-crs, Image] AutoExposure - Auto Exposure: True
 [XMP, XMP-crs, Image] AutoLateralCA - Auto Lateral CA: 7
 [XMP, XMP-crs, Image] AutoShadows - Auto Shadows: True
+[XMP, XMP-crs, Image] AutoWhiteVersion - Auto White Version: 7
 [Composite, Composite, Image] Aperture - Aperture: 7.0
 [Composite, Composite, Image] ImageSize - Image Size: 8x8
@@ -0,0 +1,401 @@
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.47
+[File, System, Image] FileName - File Name: Writer_51_failed.jpg
+[File, System, Image] Directory - Directory: t
+[File, System, Image] FileSize - File Size: 24 kB
+[File, System, Time] FileModifyDate - File Modification Date/Time: 2014:01:17 09:33:44-05:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2014:01:17 09:33:44-05:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2014:01:17 09:33:44-05:00
+[File, System, Image] FilePermissions - File Permissions: rw-r--r--
+[File, File, Image] FileType - File Type: JPEG
+[File, File, Image] MIMEType - MIME Type: image/jpeg
+[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II)
+[File, File, Image] Comment - Comment: © PhotoStudio Unicode comment;;
+[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: 6895be53ef9a287520f400aa17242c09
+[File, File, Image] Comment - Comment: a comment
+[File, File, Image] ImageWidth - Image Width: 8
+[File, File, Image] ImageHeight - Image Height: 8
+[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding
+[File, File, Image] BitsPerSample - Bits Per Sample: 8
+[File, File, Image] ColorComponents - Color Components: 3
+[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2)
+[EXIF, IFD0, Image] 270 - Image Description: A witty caption
+[EXIF, IFD0, Camera] 271 - Make: FUJIFILM
+[EXIF, IFD0, Camera] 272 - Camera Model Name: FinePix2400Zoom
+[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal)
+[EXIF, IFD0, Image] 282 - X Resolution: 72
+[EXIF, IFD0, Image] 283 - Y Resolution: 72
+[EXIF, IFD0, Image] 296 - Resolution Unit: inches
+[EXIF, IFD0, Image] 305 - Software: Adobe Photoshop 7.0
+[EXIF, IFD0, Time] 306 - Modify Date: 2004:02:26 09:36:46
+[EXIF, IFD0, Author] 315 - Artist: Phil Harvey
+[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited
+[EXIF, IFD0, Author] 33432 - Copyright: Copyright 2004 Phil Harvey
+[EXIF, ExifIFD, Image] 33437 - F Number: 3.5
+[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE
+[EXIF, ExifIFD, Image] 34855 - ISO: 100
+[EXIF, ExifIFD, Image] 36864 - Exif Version: 0210
+[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:05:19 18:36:41
+[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:05:19 18:36:41
+[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, -
+[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 1.6
+[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/64
+[EXIF, ExifIFD, Image] 37378 - Aperture Value: 3.5
+[EXIF, ExifIFD, Image] 37379 - Brightness Value: 2
+[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0
+[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 3.5
+[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment
+[EXIF, ExifIFD, Camera] 37385 - Flash: Fired
+[EXIF, ExifIFD, Camera] 37386 - Focal Length: 6.0 mm
+[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100
+[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB
+[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 100
+[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 80
+[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3053
+[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3053
+[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: cm
+[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area
+[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera
+[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed
+[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style)
+[EXIF, IFD1, Image] 282 - X Resolution: 72
+[EXIF, IFD1, Image] 283 - Y Resolution: 72
+[EXIF, IFD1, Image] 296 - Resolution Unit: inches
+[EXIF, IFD1, Image] 513 - Thumbnail Offset: 852
+[EXIF, IFD1, Image] 514 - Thumbnail Length: 0
+[JFIF, JFIF, Image] 0 - JFIF Version: 1.01
+[JFIF, JFIF, Image] 2 - Resolution Unit: inches
+[JFIF, JFIF, Image] 3 - X Resolution: 144
+[JFIF, JFIF, Image] 5 - Y Resolution: 144
+[JFIF, JFIF, Image] 16 - Thumbnail Image: (Binary data 1558 bytes)
+[APP8, SPIFF, Image] 0 - SPIFF Version: 1.2
+[APP8, SPIFF, Image] 2 - Profile ID: Continuous-tone Base
+[APP8, SPIFF, Image] 3 - Color Components: 3
+[APP8, SPIFF, Image] 6 - Image Height: 4500
+[APP8, SPIFF, Image] 10 - Image Width: 3000
+[APP8, SPIFF, Image] 14 - Color Space: YCbCr, ITU-R BT 709, video
+[APP8, SPIFF, Image] 15 - Bits Per Sample: 8
+[APP8, SPIFF, Image] 16 - Compression: JPEG
+[APP8, SPIFF, Image] 17 - Resolution Unit: inches
+[APP8, SPIFF, Image] 18 - Y Resolution: 300
+[APP8, SPIFF, Image] 22 - X Resolution: 300
+[MakerNotes, CIFF, Image] 0 - File Format: JPEG (lossy)
+[MakerNotes, CIFF, Image] 1 - Target Compression Ratio: 2
+[MakerNotes, CIFF, Image] 0 - Image Width: 512
+[MakerNotes, CIFF, Image] 1 - Image Height: 384
+[MakerNotes, CIFF, Image] 2 - Pixel Aspect Ratio: 1
+[MakerNotes, CIFF, Image] 3 - Rotation: 0
+[MakerNotes, CIFF, Image] 4 - Component Bit Depth: 8
+[MakerNotes, CIFF, Image] 5 - Color Bit Depth: 24
+[MakerNotes, CIFF, Image] 6 - Color BW: 1
+[MakerNotes, CIFF, Camera] 4106 - Target Image Type: Real-world Subject
+[MakerNotes, CIFF, Camera] 6148 - Record ID: 0
+[MakerNotes, CIFF, Image] 6167 - File Number: 45
+[MakerNotes, CIFF, Time] 0 - Date/Time Original: 1998:05:01 21:33:18
+[MakerNotes, CIFF, Time] 1 - Time Zone Code: 0
+[MakerNotes, CIFF, Time] 2 - Time Zone Info: 0
+[MakerNotes, CIFF, Camera] 2070 - Original File Name: C:\DC97\CTG_0000\AUT_0045.JPG
+[MakerNotes, CIFF, Camera] 2071 - Thumbnail File Name: C:\DC97\CTG_0000\THM_0045.JPG
+[MakerNotes, CIFF, Camera] 4112 - Shutter Release Method: Single Shot
+[MakerNotes, CIFF, Camera] 4113 - Shutter Release Timing: Priority on focus
+[MakerNotes, CIFF, Image] 0 - Flash Guide Number: 0
+[MakerNotes, CIFF, Image] 1 - Flash Threshold: 0
+[MakerNotes, CIFF, Image] 0 - Exposure Compensation: 1
+[MakerNotes, CIFF, Image] 1 - Shutter Speed Value: 1/83
+[MakerNotes, CIFF, Image] 2 - Aperture Value: 6.2
+[MakerNotes, CIFF, Camera] 6151 - Target Distance Setting: 476 mm
+[MakerNotes, CIFF, Camera] 6164 - Measured EV: 16.25
+[MakerNotes, CIFF, Camera] 2053 - Canon File Description: 
+[MakerNotes, CIFF, Camera] 2069 - Canon Image Type: AUT:Full automatic mode
+[MakerNotes, CIFF, Camera] 2064 - Owner Name: 
+[MakerNotes, CIFF, Camera] 0 - Make: Canon
+[MakerNotes, CIFF, Camera] 6 - Camera Model Name: Canon PowerShot A5
+[MakerNotes, CIFF, Camera] 4124 - Base ISO: 100
+[MakerNotes, CIFF, Camera] 2061 - ROM Operation Mode: USA
+[MakerNotes, CIFF, Camera] 2059 - Canon Firmware Version: Firmware Version 01.00
+[MakerNotes, CIFF, Camera] 1 - Free Bytes: (Binary data 12 bytes)
+[MakerNotes, CIFF, Image] 0 - Focal Type: Fixed
+[MakerNotes, CIFF, Image] 1 - Focal Length: 5 mm
+[MakerNotes, CIFF, Image] 2 - Focal Plane X Size: 5.05 mm
+[MakerNotes, CIFF, Image] 3 - Focal Plane Y Size: 3.71 mm
+[MakerNotes, Qualcomm, Camera] aec_current_sensor_luma - AEC Current Sensor Luma: 22
+[MakerNotes, Qualcomm, Camera] af_position - AF Position: 26
+[MakerNotes, Qualcomm, Camera] aec_current_exp_index - AEC Current Exp Index: 308
+[MakerNotes, Qualcomm, Camera] awb_sample_decision - AWB Sample Decision: 7
+[MakerNotes, Qualcomm, Camera] asf5_enable - ASF5 Enable: 1
+[MakerNotes, Qualcomm, Camera] asf5_filter_mode - ASF5 Filter Mode: 0
+[MakerNotes, Qualcomm, Camera] asf5_exposure_index_1 - ASF5 Exposure Index 1: 180
+[MakerNotes, Qualcomm, Camera] asf5_exposure_index_2 - ASF5 Exposure Index 2: 270
+[MakerNotes, Qualcomm, Camera] asf5_max_exposure_index - ASF5 Max Exposure Index: 290
+[APP0, AVI1, Image] 0 - Interleaved Field: Not Interleaved
+[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 4.73
+[XMP, XMP-rdf, Document] about - About: uuid:80056b68-1045-fa97-3401-6f4ed84cd53d
+[XMP, XMP-dc, Author] creator - Creator: Phil Harvey
+[XMP, XMP-dc, Image] description - Description: UTF-16 (big-endian) encoded XMP
+[XMP, XMP-dc, Author] rights - Rights: Copyright 2004 Phil Harvey
+[XMP, XMP-dc, Image] subject - Subject: ExifTool, Test, XMP
+[XMP, XMP-dc, Image] title - Title: Test IPTC picture
+[XMP, XMP-photoshop, Author] AuthorsPosition - Authors Position: My Position
+[XMP, XMP-photoshop, Author] CaptionWriter - Caption Writer: I wrote it
+[XMP, XMP-photoshop, Image] Category - Category: 1
+[XMP, XMP-photoshop, Location] City - City: Kingston
+[XMP, XMP-photoshop, Location] Country - Country: Canada
+[XMP, XMP-photoshop, Author] Credit - Credit: My Credit
+[XMP, XMP-photoshop, Time] DateCreated - Date Created: 2004:02:26
+[XMP, XMP-photoshop, Image] Headline - Headline: No headline
+[XMP, XMP-photoshop, Image] Instructions - Instructions: What instructions
+[XMP, XMP-photoshop, Author] Source - Source: I'm the source
+[XMP, XMP-photoshop, Location] State - State: Ont
+[XMP, XMP-photoshop, Image] SupplementalCategories - Supplemental Categories: amazing, image, utilities
+[XMP, XMP-photoshop, Image] TransmissionReference - Transmission Reference: What is a transmission reference?
+[XMP, XMP-photoshop, Image] Urgency - Urgency: 8 (least urgent)
+[XMP, XMP-xmpBJ, Other] JobRefName - Job Ref Name: My Job
+[XMP, XMP-xmpMM, Other] DocumentID - Document ID: adobe:docid:photoshop:4cc7b857-69d0-11d8-8ac4-bb59c92f0d9a
+[XMP, XMP-xmpRights, Author] Marked - Marked: False
+[XMP, XMP-xmpRights, Author] WebStatement - Web Statement: http://owl.phy.queensu.ca/~phil/exiftool/
+[ICC_Profile, ICC-header, Image] 4 - Profile CMM Type: ADBE
+[ICC_Profile, ICC-header, Image] 8 - Profile Version: 2.1.0
+[ICC_Profile, ICC-header, Image] 12 - Profile Class: Display Device Profile
+[ICC_Profile, ICC-header, Image] 16 - Color Space Data: RGB 
+[ICC_Profile, ICC-header, Image] 20 - Profile Connection Space: XYZ 
+[ICC_Profile, ICC-header, Time] 24 - Profile Date Time: 1999:06:03 00:00:00
+[ICC_Profile, ICC-header, Image] 36 - Profile File Signature: acsp
+[ICC_Profile, ICC-header, Image] 40 - Primary Platform: Apple Computer Inc.
+[ICC_Profile, ICC-header, Image] 44 - CMM Flags: Not Embedded, Independent
+[ICC_Profile, ICC-header, Image] 48 - Device Manufacturer: none
+[ICC_Profile, ICC-header, Image] 52 - Device Model: 
+[ICC_Profile, ICC-header, Image] 56 - Device Attributes: Reflective, Glossy, Positive, Color
+[ICC_Profile, ICC-header, Image] 64 - Rendering Intent: Perceptual
+[ICC_Profile, ICC-header, Image] 68 - Connection Space Illuminant: 0.9642 1 0.82491
+[ICC_Profile, ICC-header, Image] 80 - Profile Creator: ADBE
+[ICC_Profile, ICC-header, Image] 84 - Profile ID: 0
+[ICC_Profile, ICC_Profile, Image] cprt - Profile Copyright: Copyright 1999 Adobe Systems Incorporated
+[ICC_Profile, ICC_Profile, Image] desc - Profile Description: Adobe RGB (1998)
+[ICC_Profile, ICC_Profile, Image] wtpt - Media White Point: 0.95045 1 1.08905
+[ICC_Profile, ICC_Profile, Image] bkpt - Media Black Point: 0 0 0
+[ICC_Profile, ICC_Profile, Image] rTRC - Red Tone Reproduction Curve: (Binary data 14 bytes)
+[ICC_Profile, ICC_Profile, Image] gTRC - Green Tone Reproduction Curve: (Binary data 14 bytes)
+[ICC_Profile, ICC_Profile, Image] bTRC - Blue Tone Reproduction Curve: (Binary data 14 bytes)
+[ICC_Profile, ICC_Profile, Image] rXYZ - Red Matrix Column: 0.60974 0.31111 0.01947
+[ICC_Profile, ICC_Profile, Image] gXYZ - Green Matrix Column: 0.20528 0.62567 0.06087
+[ICC_Profile, ICC_Profile, Image] bXYZ - Blue Matrix Column: 0.14919 0.06322 0.74457
+[FlashPix, FlashPix, Other] 1 - Code Page: Unicode UTF-16, little endian
+[FlashPix, FlashPix, Other] 268435456 - Used Extension Numbers: 1
+[FlashPix, FlashPix, Other] 1 - Extension Name: Screen nail
+[FlashPix, FlashPix, Other] 2 - Extension Class ID: 10000230-6FC0-11D0-BD01-00609719A180
+[FlashPix, FlashPix, Other] 3 - Extension Persistence: Invalidated By Modification
+[FlashPix, FlashPix, Time] 4 - Extension Create Date: 1999:05:14 21:47:25
+[FlashPix, FlashPix, Time] 5 - Extension Modify Date: 1999:05:14 21:47:25
+[FlashPix, FlashPix, Other] 6 - Creating Application: Digita
+[FlashPix, FlashPix, Other] 7 - Extension Description: Presized image for LCD display
+[FlashPix, FlashPix, Other] 4096 - Storage-Stream Pathname: /.Screen Nail_bd0100609719a180
+[FlashPix, FlashPix, Other] Screen Nail - Screen Nail: (Binary data 5917 bytes)
+[MPF, MPF0, Image] 45056 - MPF Version: 0100
+[MPF, MPF0, Image] 45057 - Number Of Images: 2
+[MPF, MPImage1, Image] 0.1 - MP Image Flags: Dependent parent image
+[MPF, MPImage1, Image] 0.2 - MP Image Format: JPEG
+[MPF, MPImage1, Image] 0.3 - MP Image Type: Baseline MP Primary Image
+[MPF, MPImage1, Image] 4 - MP Image Length: 5959981
+[MPF, MPImage1, Image] 8 - MP Image Start: 0
+[MPF, MPImage1, Image] 12 - Dependent Image 1 Entry Number: 2
+[MPF, MPImage1, Image] 14 - Dependent Image 2 Entry Number: 0
+[MPF, MPImage2, Image] 0.1 - MP Image Flags: Dependent child image
+[MPF, MPImage2, Image] 0.2 - MP Image Format: JPEG
+[MPF, MPImage2, Image] 0.3 - MP Image Type: Large Thumbnail (full HD equivalent)
+[MPF, MPImage2, Image] 4 - MP Image Length: 1039273
+[MPF, MPImage2, Image] 8 - MP Image Start: 5945405
+[MPF, MPImage2, Image] 12 - Dependent Image 1 Entry Number: 0
+[MPF, MPImage2, Image] 14 - Dependent Image 2 Entry Number: 0
+[Meta, MetaIFD, Image] 50000 - Film Product Code: 37
+[Meta, MetaIFD, Image] 50001 - Image Source EK: 1
+[Meta, MetaIFD, Image] 50002 - Capture Conditions PAR: 1
+[Meta, MetaIFD, Image] 50009 - Frame Number: 0
+[Meta, MetaIFD, Image] 50010 - Film Category: 2
+[Meta, MetaIFD, Image] 50011 - Film Gencode: 2
+[Meta, MetaIFD, Image] 50012 - Model And Version: Version 9
+[Meta, MetaIFD, Image] 50013 - Film Size: 1
+[Meta, MetaIFD, Image] 50014 - SBA RGB Shifts: 0 0 0
+[Meta, MetaIFD, Image] 50015 - SBA Input Image Colorspace: 3
+[Meta, MetaIFD, Image] 50016 - SBA Input Image Bit Depth: 12 12 12
+[Meta, MetaIFD, Image] 50017 - SBA Exposure Record: (Binary data 368 bytes)
+[Meta, MetaIFD, Image] 50018 - User Adj SBA RGB Shifts: (Binary data 5 bytes)
+[Meta, MetaIFD, Image] 50019 - Image Rotation Status: 0
+[Meta, MetaIFD, Image] 50020 - Roll Guid Elements: 00000000000000000000000000000000
+[Meta, MetaIFD, Image] 50021 - Metadata Number: 0100
+[APP5, RMETA, Image] Sign type - Sign Type: Information
+[APP5, RMETA, Image] Location - Location: Roundabout
+[APP5, RMETA, Image] Lit - Lit: No
+[APP5, RMETA, Image] Condition - Condition: Good
+[APP5, RMETA, Image] Azimuth - Azimuth: E
+[XML, MediaJukebox, Image] Tool_Name - Tool Name: Media Center
+[XML, MediaJukebox, Image] Tool_Version - Tool Version: 19.0.67
+[XML, MediaJukebox, Image] People - People: Santa
+[XML, MediaJukebox, Image] Places - Places: Jamaica
+[XML, MediaJukebox, Time] Date - Date: 2013:09:01 20:12:19
+[XML, MediaJukebox, Image] Album - Album: 2013-09-01
+[XML, MediaJukebox, Image] Name - Name: Glass home at night
+[APP11, JPEG-HDR, Image] ver - JPEG-HDR Version: 11
+[APP11, JPEG-HDR, Image] ln0 - Ln0: 0.122262
+[APP11, JPEG-HDR, Image] ln1 - Ln1: 2.634655
+[APP11, JPEG-HDR, Image] s2n - S2n: 2.269635e+03
+[APP11, JPEG-HDR, Image] alp - Alpha: 1.000000
+[APP11, JPEG-HDR, Image] bet - Beta: 1.000000
+[APP11, JPEG-HDR, Image] cor - Correction Method: 0
+[APP11, JPEG-HDR, Image] RatioImage - Ratio Image: (Binary data 19 bytes)
+[APP12, PictureInfo, Time] TimeDate - Date/Time Original: 1998:12:31 15:17:20
+[APP12, PictureInfo, Image] Shutter - Exposure Time: 1/155
+[APP12, PictureInfo, Image] Flash - Flash: Off
+[APP12, PictureInfo, Image] Resolution - Resolution: 5
+[APP12, PictureInfo, Image] Protect - Protect: 0
+[APP12, PictureInfo, Image] ContTake - Cont Take: 0
+[APP12, PictureInfo, Image] ImageSize - Image Size: 1280x960
+[APP12, PictureInfo, Image] ColorMode - Color Mode: 1
+[APP12, PictureInfo, Image] FNumber - F Number: 11.0
+[APP12, PictureInfo, Image] Zoom - Zoom: 2.1
+[APP12, PictureInfo, Image] Macro - Macro: Off
+[APP12, PictureInfo, Image] LightS - Light S: 0
+[APP12, PictureInfo, Image] ExpBias - Exposure Compensation: +2.0
+[APP12, PictureInfo, Camera] Type - Camera Type: SR84
+[APP12, PictureInfo, Camera] Serial# - Serial Number: #00000001
+[APP12, PictureInfo, Camera] Version - Version: v84-71
+[APP12, PictureInfo, Camera] ID - ID: AGFA DIGITAL CAMERA
+[APP12, PictureInfo, Image] PicLen - Pic Len: 561039
+[APP12, PictureInfo, Image] ThmLen - Thm Len: 3802
+[APP12, PictureInfo, Image] Q - Tag Q: 96
+[APP12, PictureInfo, Image] R - Tag R: 293
+[APP12, PictureInfo, Image] B - Tag B: 332
+[APP12, PictureInfo, Image] s0 - S0: 1e8,0,11b0,6f72,15cf,4225,4225,1050000,a1e0004,0,2f0030d,2f102c5,2880090,0,0
+[APP12, PictureInfo, Image] T0 - T0: 11b15600,1290000,e00c0f,2,0,0
+[Ducky, Ducky, Image] 1 - Quality: 84%
+[Ducky, Ducky, Author] 3 - Copyright: Copyright 2004 Phil Harvey
+[IPTC, IPTC, Other] 0 - Application Record Version: 2
+[IPTC, IPTC, Other] 120 - Caption-Abstract: A witty caption
+[IPTC, IPTC, Author] 122 - Writer-Editor: I wrote it
+[IPTC, IPTC, Other] 105 - Headline: No headline
+[IPTC, IPTC, Other] 40 - Special Instructions: What instructions
+[IPTC, IPTC, Author] 80 - By-line: Phil Harvey
+[IPTC, IPTC, Author] 85 - By-line Title: My Position
+[IPTC, IPTC, Author] 110 - Credit: My Credit
+[IPTC, IPTC, Other] 5 - Object Name: Test IPTC picture
+[IPTC, IPTC, Time] 55 - Date Created: 2004:02:26
+[IPTC, IPTC, Location] 90 - City: Kingston
+[IPTC, IPTC, Location] 95 - Province-State: Ont
+[IPTC, IPTC, Location] 101 - Country-Primary Location Name: Canada
+[IPTC, IPTC, Other] 103 - Original Transmission Reference: What is a transmission reference
+[IPTC, IPTC, Other] 15 - Category: 1
+[IPTC, IPTC, Other] 20 - Supplemental Categories: amazing, image, utilities
+[IPTC, IPTC, Author] 116 - Copyright Notice: Copyright 2004 Phil Harvey
+[IPTC, IPTC, Other] 10 - Urgency: 8 (least urgent)
+[IPTC, IPTC, Author] 115 - Source: I'm the source
+[IPTC, IPTC, Other] 25 - Keywords: jambalaya
+[IPTC, IPTC2, Other] 0 - Application Record Version: 2
+[IPTC, IPTC3, Other] 0 - Application Record Version: 2
+[IPTC, IPTC3, Other] 15 - Category: p
+[IPTC, IPTC3, Time] 55 - Date Created: 2005:12:23
+[IPTC, IPTC3, Other] 5 - Object Name: object name
+[IPTC, IPTC3, Other] 10 - Urgency: 2
+[IPTC, IPTC3, Other] 20 - Supplemental Categories: supp cat
+[IPTC, IPTC3, Other] 40 - Special Instructions: special instructions
+[IPTC, IPTC3, Author] 80 - By-line: byline
+[IPTC, IPTC3, Author] 85 - By-line Title: byline title
+[IPTC, IPTC3, Location] 90 - City: city
+[IPTC, IPTC3, Location] 101 - Country-Primary Location Name: country name
+[IPTC, IPTC3, Other] 103 - Original Transmission Reference: otr
+[IPTC, IPTC3, Other] 105 - Headline: headline
+[IPTC, IPTC3, Author] 110 - Credit: credit
+[IPTC, IPTC3, Author] 115 - Source: source
+[IPTC, IPTC3, Author] 116 - Copyright Notice: copy freely
+[IPTC, IPTC3, Other] 120 - Caption-Abstract: ExifTool AFCP test
+[IPTC, IPTC3, Author] 122 - Writer-Editor: caption writer
+[IPTC, IPTC3, Location] 95 - Province-State: state
+[IPTC, IPTC3, Other] 25 - Keywords: jambalaya
+[Photoshop, Photoshop, Image] 1061 - IPTC Digest: 05ad1770b1a95f1f9788ac995fa647da
+[Photoshop, Photoshop, Image] 0 - X Resolution: 72
+[Photoshop, Photoshop, Image] 2 - Displayed Units X: inches
+[Photoshop, Photoshop, Image] 4 - Y Resolution: 72
+[Photoshop, Photoshop, Image] 6 - Displayed Units Y: inches
+[Photoshop, Photoshop, Image] 1037 - Global Angle: 30
+[Photoshop, Photoshop, Image] 1049 - Global Altitude: 30
+[Photoshop, Photoshop, Author] 1034 - Copyright Flag: False
+[Photoshop, Photoshop, Author] 1035 - URL: http://owl.phy.queensu.ca/~phil/exiftool/
+[Photoshop, Photoshop, Image] 0 - Photoshop Quality: 7
+[Photoshop, Photoshop, Image] 1 - Photoshop Format: Standard
+[Photoshop, Photoshop, Image] 2 - Progressive Scans: 3 Scans
+[APP13, AdobeCM, Image] 0 - Adobe CM Type: 3
+[APP14, Adobe, Image] 0 - DCT Encode Version: 100
+[APP14, Adobe, Image] 1 - APP14 Flags 0: (none)
+[APP14, Adobe, Image] 2 - APP14 Flags 1: (none)
+[APP14, Adobe, Image] 3 - Color Transform: YCbCr
+[APP15, GraphConv, Image] Q - Quality: 70
+[MIE, MIE-Doc, Author] Copyright - Copyright: © 2006 Phil Harvey
+[MIE, MIE-Main, Other] zmie - Trailer Signature: 
+[PhotoMechanic, PhotoMechanic, Image] 221 - Tagged: Yes
+[PhotoMechanic, PhotoMechanic, Image] 222 - Color Class: 6 (Typical alt)
+[PhotoMechanic, PhotoMechanic, Image] 216 - Rotation: 180
+[PhotoMechanic, PhotoMechanic, Image] 217 - Crop Left: 438
+[PhotoMechanic, PhotoMechanic, Image] 218 - Crop Top: 618
+[PhotoMechanic, PhotoMechanic, Image] 219 - Crop Right: 890
+[PhotoMechanic, PhotoMechanic, Image] 220 - Crop Bottom: 1072
+[CanonVRD, CanonVRD, Image] 2 - VRD Version: 1.0.0
+[CanonVRD, CanonVRD, Image] 6 - WB Adj RGGB Levels: 0 0 0 0
+[CanonVRD, CanonVRD, Image] 24 - White Balance Adj: Shot Settings
+[CanonVRD, CanonVRD, Image] 26 - WB Adj Color Temp: 5600
+[CanonVRD, CanonVRD, Image] 36 - WB Fine Tune Active: No
+[CanonVRD, CanonVRD, Image] 40 - WB Fine Tune Saturation: 0
+[CanonVRD, CanonVRD, Image] 44 - WB Fine Tune Tone: 0
+[CanonVRD, CanonVRD, Image] 46 - Raw Color Adj: Shot Settings
+[CanonVRD, CanonVRD, Image] 48 - Raw Custom Saturation: 0
+[CanonVRD, CanonVRD, Image] 52 - Raw Custom Tone: 0
+[CanonVRD, CanonVRD, Image] 56 - Raw Brightness Adj: 0.00
+[CanonVRD, CanonVRD, Image] 60 - Tone Curve Property: Shot Settings
+[CanonVRD, CanonVRD, Image] 122 - Dynamic Range Min: 0
+[CanonVRD, CanonVRD, Image] 124 - Dynamic Range Max: 4095
+[CanonVRD, CanonVRD, Image] 272 - Tone Curve Active: No
+[CanonVRD, CanonVRD, Image] 275 - Tone Curve Mode: RGB
+[CanonVRD, CanonVRD, Image] 276 - Brightness Adj: 0
+[CanonVRD, CanonVRD, Image] 277 - Contrast Adj: 0
+[CanonVRD, CanonVRD, Image] 278 - Saturation Adj: 100
+[CanonVRD, CanonVRD, Image] 286 - Color Tone Adj: 0
+[CanonVRD, CanonVRD, Image] 294 - Luminance Curve Points: (0,0) (255,255)
+[CanonVRD, CanonVRD, Image] 336 - Luminance Curve Limits: 255 0 255 0
+[CanonVRD, CanonVRD, Image] 345 - Tone Curve Interpolation: Curve
+[CanonVRD, CanonVRD, Image] 352 - Red Curve Points: (0,0) (255,255)
+[CanonVRD, CanonVRD, Image] 394 - Red Curve Limits: 255 0 255 0
+[CanonVRD, CanonVRD, Image] 410 - Green Curve Points: (0,0) (255,255)
+[CanonVRD, CanonVRD, Image] 452 - Green Curve Limits: 255 0 255 0
+[CanonVRD, CanonVRD, Image] 468 - Blue Curve Points: (0,0) (255,255)
+[CanonVRD, CanonVRD, Image] 510 - Blue Curve Limits: 255 0 255 0
+[CanonVRD, CanonVRD, Image] 526 - RGB Curve Points: (0,0) (255,255)
+[CanonVRD, CanonVRD, Image] 568 - RGB Curve Limits: 255 0 255 0
+[CanonVRD, CanonVRD, Image] 580 - Crop Active: No
+[CanonVRD, CanonVRD, Image] 582 - Crop Left: 0
+[CanonVRD, CanonVRD, Image] 584 - Crop Top: 0
+[CanonVRD, CanonVRD, Image] 586 - Crop Width: 0
+[CanonVRD, CanonVRD, Image] 588 - Crop Height: 0
+[CanonVRD, CanonVRD, Image] 602 - Sharpness Adj: 0
+[CanonVRD, CanonVRD, Image] 608 - Crop Aspect Ratio: Free
+[CanonVRD, CanonVRD, Image] 610 - Constrained Crop Width: 0
+[CanonVRD, CanonVRD, Image] 614 - Constrained Crop Height: 0
+[CanonVRD, CanonVRD, Image] 618 - Check Mark: Clear
+[CanonVRD, CanonVRD, Image] 622 - Rotation: 90
+[CanonVRD, CanonVRD, Image] 624 - Work Color Space: sRGB
+[FotoStation, FotoStation, Image] 0 - Original Image Width: 16
+[FotoStation, FotoStation, Image] 1 - Original Image Height: 16
+[FotoStation, FotoStation, Image] 2 - Color Planes: 3
+[FotoStation, FotoStation, Image] 3 - XY Resolution: 9
+[FotoStation, FotoStation, Image] 4 - Rotation: 0
+[FotoStation, FotoStation, Image] 6 - Crop Left: 24.557%
+[FotoStation, FotoStation, Image] 7 - Crop Top: 21.25%
+[FotoStation, FotoStation, Image] 8 - Crop Right: 30.676%
+[FotoStation, FotoStation, Image] 9 - Crop Bottom: 86.25%
+[FotoStation, FotoStation, Image] 11 - Crop Rotation: 0
+[Composite, Composite, Image] Aperture - Aperture: 3.5
+[Composite, Composite, Image] PreviewImage - Preview Image: (Binary data 1039273 bytes)
+[Composite, Composite, Image] PreviewImage - Preview Image: (Binary data 5777 bytes)
+[Composite, Composite, Image] ShutterSpeed - Shutter Speed: 1/155
+[Composite, Composite, Image] ImageSize - Image Size: 8x8
+[Composite, Composite, Image] LightValue - Light Value: 10.9
+[Composite, Composite, Camera] ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 6.9
+[Composite, Composite, Camera] CircleOfConfusion - Circle Of Confusion: 0.004 mm
+[Composite, Composite, Image] FOV - Field Of View: 47.0 deg
+[Composite, Composite, Camera] FocalLength35efl - Focal Length: 6.0 mm (35 mm equivalent: 41.4 mm)
+[Composite, Composite, Camera] HyperfocalDistance - Hyperfocal Distance: 2.36 m
@@ -0,0 +1,22 @@
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.40
+[File, System, Image] FileName - File Name: Writer_52_failed.xmp
+[File, System, Image] Directory - Directory: t
+[File, System, Image] FileSize - File Size: 1637 bytes
+[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:11:04 11:30:56-05:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2013:11:04 11:30:56-05:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:11:04 11:30:56-05:00
+[File, System, Image] FilePermissions - File Permissions: rw-r--r--
+[File, File, Image] FileType - File Type: XMP
+[File, File, Image] MIMEType - MIME Type: application/rdf+xml
+[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.40
+[XMP, XMP-dc, Author] rights - Rights: © Copyright Phil Harvey
+[XMP, XMP-dc, Author] rights-fr - Rights (fr): © Droit d'auteur Phil Harvey
+[XMP, XMP-exif, Time] DateTimeDigitized - Date/Time Digitized: 2005:06:09 20:09:27+02:00
+[XMP, XMP-exif, Time] DateTimeOriginal - Date/Time Original: 2005:06:09 20:09:27+02:00
+[XMP, XMP-xmp, Time] CreateDate - Create Date: 2005:11:21 17:07:14+01:00
+[XMP, XMP-xmp, Time] MetadataDate - Metadata Date: 2005:11:21 17:11:31+01:00
+[XMP, XMP-xmp, Time] ModifyDate - Modify Date: 2005:11:21 17:07:14+01:00
+[XMP, XMP-xmpMM, Other] DerivedFromDocumentID - Derived From Document ID: adobe:docid:photoshop:f481cc67-d8f5-11d9-a31e-a1606d941d83
+[XMP, XMP-xmpMM, Other] DerivedFromInstanceID - Derived From Instance ID: adobe:docid:photoshop:f481cc67-d8f5-11d9-a31e-a1606d941d83
+[XMP, XMP-xmpMM, Other] DocumentID - Document ID: uuid:7A9636BAA85ADA11B611C7FA524F1F71
+[XMP, XMP-xmpMM, Other] InstanceID - Instance ID: uuid:7B9636BAA85ADA11B611C7FA524F1F71
@@ -0,0 +1,33 @@
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.41
+[File, System, Image] FileName - File Name: Writer_53_failed.xmp
+[File, System, Image] Directory - Directory: t
+[File, System, Image] FileSize - File Size: 3.6 kB
+[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:11:14 09:32:36-05:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2013:11:14 09:32:36-05:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:11:14 09:32:36-05:00
+[File, System, Image] FilePermissions - File Permissions: rw-r--r--
+[File, File, Image] FileType - File Type: JPEG
+[File, File, Image] MIMEType - MIME Type: image/jpeg
+[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II)
+[File, File, Image] ImageWidth - Image Width: 8
+[File, File, Image] ImageHeight - Image Height: 8
+[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding
+[File, File, Image] BitsPerSample - Bits Per Sample: 8
+[File, File, Image] ColorComponents - Color Components: 3
+[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2)
+[EXIF, IFD0, Image] 282 - X Resolution: 72
+[EXIF, IFD0, Image] 283 - Y Resolution: 72
+[EXIF, IFD0, Image] 296 - Resolution Unit: inches
+[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered
+[EXIF, ExifIFD, Image] 34855 - ISO: 100
+[EXIF, ExifIFD, Image] 36864 - Exif Version: 0230
+[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, -
+[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100
+[EXIF, ExifIFD, Image] 40961 - Color Space: Uncalibrated
+[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.41
+[XMP, XMP-aux, Camera] Lens - Lens: 18.0 - 55.0 mm
+[XMP, XMP-tiff, Image] BitsPerSample - Bits Per Sample: 8
+[XMP, XMP-tiff, Image] ImageLength - Image Height: 8
+[XMP, XMP-tiff, Image] ImageWidth - Image Width: 8
+[XMP, XMP-tiff, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2)
+[Composite, Composite, Image] ImageSize - Image Size: 8x8
@@ -0,0 +1,2 @@
+[EXIF, IFD0, Time] 306 - Modify Date: 2003:12:04 06:46:52
+[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2003:12:04 06:46:52
@@ -0,0 +1,7 @@
+[EXIF, IFD0, Image] 282 - X Resolution: 72
+[EXIF, IFD0, Image] 283 - Y Resolution: 72
+[EXIF, IFD0, Image] 296 - Resolution Unit: inches
+[EXIF, IFD0, Author] 315 - Artist: me
+[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered
+[IPTC, IPTC, Other] 25 - Keywords: one, two
+[IPTC, IPTC, Other] 0 - Application Record Version: 4
@@ -0,0 +1,4 @@
+[IPTC, IPTC, Other] 25 - Keywords: one, two
+[IPTC, IPTC, Other] 0 - Application Record Version: 4
+[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.50
+[XMP, XMP-dc, Image] title - Title: Test
@@ -1,10 +1,10 @@
-[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.07
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.32
 [File, System, Image] FileName - File Name: Writer_9_failed.jpg
 [File, System, Image] Directory - Directory: t
-[File, System, Image] FileSize - File Size: 9.5 kB
-[File, System, Time] FileModifyDate - File Modification Date/Time: 2012:11:20 07:49:51-05:00
-[File, System, Time] FileAccessDate - File Access Date/Time: 2012:11:20 07:49:51-05:00
-[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2012:11:20 07:49:51-05:00
+[File, System, Image] FileSize - File Size: 9.7 kB
+[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:06:12 12:34:55-04:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2013:06:12 12:34:55-04:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:06:12 12:34:55-04:00
 [File, System, Image] FilePermissions - File Permissions: rw-r--r--
 [File, File, Image] FileType - File Type: JPEG
 [File, File, Image] MIMEType - MIME Type: image/jpeg
@@ -161,7 +161,7 @@
 [MakerNotes, Canon, Camera] 9 - AF Area Y Positions: 0 0 -506 0 506 0 0
 [MakerNotes, Canon, Camera] 10 - AF Points In Focus: (none)
 [MakerNotes, Canon, Camera] 19 - Thumbnail Image Valid Area: 0 159 7 112
-[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.07
+[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.32
 [XMP, XMP-aux, Camera] Lens - Lens: 18.0 - 55.0 mm
 [XMP, XMP-exif, Image] ComponentsConfiguration - Components Configuration: Y, Cb, Cr, -
 [XMP, XMP-exif, Image] CompressedBitsPerPixel - Compressed Bits Per Pixel: 9
@@ -170,6 +170,7 @@
 [XMP, XMP-exif, Camera] FlashMode - Flash Mode: Unknown
 [XMP, XMP-exif, Camera] FlashRedEyeMode - Flash Red Eye Mode: False
 [XMP, XMP-exif, Camera] FlashReturn - Flash Return: No return detection
+[XMP, XMP-exifEX, Image] InteroperabilityIndex - Interoperability Index: THM - DCF thumbnail file
 [XMP, XMP-tiff, Image] BitsPerSample - Bits Per Sample: 8
 [XMP, XMP-tiff, Image] ImageLength - Image Height: 8
 [XMP, XMP-tiff, Image] ImageWidth - Image Width: 8
@@ -1,4 +1,4 @@
-[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 8.44
+[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.32
 [XMP, XMP-exif, Image] ApertureValue - Aperture Value: 14.0
 [XMP, XMP-exif, Image] ColorSpace - Color Space: sRGB
 [XMP, XMP-exif, Image] ComponentsConfiguration - Components Configuration: Y, Cb, Cr, -
@@ -26,6 +26,7 @@
 [XMP, XMP-exif, Image] ShutterSpeedValue - Shutter Speed Value: 1
 [XMP, XMP-exif, Image] UserComment - User Comment: 
 [XMP, XMP-exif, Camera] WhiteBalance - White Balance: Auto
+[XMP, XMP-exifEX, Image] InteroperabilityIndex - Interoperability Index: THM - DCF thumbnail file
 [XMP, XMP-tiff, Camera] Make - Make: Canon
 [XMP, XMP-tiff, Camera] Model - Camera Model Name: Canon EOS DIGITAL REBEL
 [XMP, XMP-tiff, Image] Orientation - Orientation: Horizontal (normal)
@@ -1,4 +1,4 @@
-[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 8.44
+[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.32
 [XMP, XMP-exif, Image] ApertureValue - Aperture Value: 14.0000277425244
 [XMP, XMP-exif, Image] ColorSpace - Color Space: 1
 [XMP, XMP-exif, Image] ComponentsConfiguration - Components Configuration: [1,2,3,0]
@@ -26,6 +26,7 @@
 [XMP, XMP-exif, Image] ShutterSpeedValue - Shutter Speed Value: 1
 [XMP, XMP-exif, Image] UserComment - User Comment: 
 [XMP, XMP-exif, Camera] WhiteBalance - White Balance: 0
+[XMP, XMP-exifEX, Image] InteroperabilityIndex - Interoperability Index: THM
 [XMP, XMP-tiff, Camera] Make - Make: Canon
 [XMP, XMP-tiff, Camera] Model - Camera Model Name: Canon EOS DIGITAL REBEL
 [XMP, XMP-tiff, Image] Orientation - Orientation: 1
@@ -1,14 +1,14 @@
-[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.16
+[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.48
 [File, System, Image] FileName - File Name: XMP_41_failed.xmp
 [File, System, Image] Directory - Directory: t
-[File, System, Image] FileSize - File Size: 9.5 kB
-[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:01:30 08:38:09-05:00
-[File, System, Time] FileAccessDate - File Access Date/Time: 2013:01:30 08:38:09-05:00
-[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2013:01:30 08:38:09-05:00
+[File, System, Image] FileSize - File Size: 9.8 kB
+[File, System, Time] FileModifyDate - File Modification Date/Time: 2014:01:23 08:34:51-05:00
+[File, System, Time] FileAccessDate - File Access Date/Time: 2014:01:23 08:34:51-05:00
+[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2014:01:23 08:34:51-05:00
 [File, System, Image] FilePermissions - File Permissions: rw-r--r--
 [File, File, Image] FileType - File Type: XMP
 [File, File, Image] MIMEType - MIME Type: application/rdf+xml
-[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.16
+[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.48
 [XMP, XMP-dwc, Time] EventDay - Event Day: 2013
 [XMP, XMP-dwc, Time] EventEarliestDate - Event Earliest Date: 2013
 [XMP, XMP-dwc, Time] EventEndDayOfYear - Event End Day Of Year: 2013
@@ -38,6 +38,7 @@
 [XMP, XMP-dwc, Other] GeologicalContextLatestAgeOrHighestStage - Latest Age Or Highest Stage: 2013
 [XMP, XMP-dwc, Other] GeologicalContextLatestEonOrHighestEonothem - Latest Eon Or Highest Eonothem: 2013
 [XMP, XMP-dwc, Other] GeologicalContextLatestEpochOrHighestSeries - Latest Epoch Or Highest Series: 2013
+[XMP, XMP-dwc, Other] GeologicalContextLatestEraOrHighestErathem - Latest Era Or Highest Erathem: 2013
 [XMP, XMP-dwc, Other] GeologicalContextLatestPeriodOrHighestSystem - Latest Period Or Highest System: 2013
 [XMP, XMP-dwc, Other] GeologicalContextLithostratigraphicTerms - Lithostratigraphic Terms: 2013
 [XMP, XMP-dwc, Other] GeologicalContextLowestBiostratigraphicZone - Lowest Biostratigraphic Zone: 2013
@@ -47,6 +48,7 @@
 [XMP, XMP-dwc, Other] IdentificationIdentificationQualifier - Identification Qualifier: 2013
 [XMP, XMP-dwc, Other] IdentificationIdentificationReferences - Identification References: 2013
 [XMP, XMP-dwc, Other] IdentificationIdentificationRemarks - Identification Remarks: 2013
+[XMP, XMP-dwc, Other] IdentificationIdentificationVerificationStatus - Identification Verification Status: 2013
 [XMP, XMP-dwc, Other] IdentificationIdentifiedBy - Identified By: 2013
 [XMP, XMP-dwc, Other] IdentificationTypeStatus - Type Status: 2013
 [XMP, XMP-dwc, Other] MeasurementOrFactMeasurementAccuracy - Measurement Accuracy: 2013
@@ -111,10 +113,12 @@
 [XMP, XMP-dwc, Other] TaxonNameAccordingToID - Taxon Name According To ID: 2013
 [XMP, XMP-dwc, Other] TaxonNamePublishedIn - Taxon Name Published In: 2013
 [XMP, XMP-dwc, Other] TaxonNamePublishedInID - Taxon Name Published In ID: 2013
+[XMP, XMP-dwc, Other] TaxonNamePublishedInYear - Taxon Name Published In Year: 2013
 [XMP, XMP-dwc, Other] TaxonNomenclaturalCode - Taxon Nomenclatural Code: 2013
 [XMP, XMP-dwc, Other] TaxonNomenclaturalStatus - Taxon Nomenclatural Status: 2013
 [XMP, XMP-dwc, Other] TaxonOrder - Taxon Order: 2013
 [XMP, XMP-dwc, Other] TaxonOriginalNameUsage - Taxon Original Name Usage: 2013
+[XMP, XMP-dwc, Other] TaxonOriginalNameUsageID - Taxon Original Name Usage ID: 2013
 [XMP, XMP-dwc, Other] TaxonParentNameUsage - Taxon Parent Name Usage: 2013
 [XMP, XMP-dwc, Other] TaxonParentNameUsageID - Taxon Parent Name Usage ID: 2013
 [XMP, XMP-dwc, Other] TaxonPhylum - Taxon Phylum: 2013
@@ -147,6 +151,7 @@
 [XMP, XMP-dwc, Location] dctermsLocationGeoreferenceSources - DC Georeference Sources: 2013
 [XMP, XMP-dwc, Location] dctermsLocationGeoreferenceVerificationStatus - DC Georeference Verification Status: 2013
 [XMP, XMP-dwc, Location] dctermsLocationGeoreferencedBy - DC Georeferenced By: 2013
+[XMP, XMP-dwc, Location] dctermsLocationGeoreferencedDate - DC Georeferenced Date: 2013
 [XMP, XMP-dwc, Location] dctermsLocationHigherGeography - DC Higher Geography: 2013
 [XMP, XMP-dwc, Location] dctermsLocationHigherGeographyID - DC Higher Geography ID: 2013
 [XMP, XMP-dwc, Location] dctermsLocationIsland - DC Island: 2013
diff --git a/var/tmp/source/EXIFTOOL/Image-ExifTool-9.53/Image-ExifTool-9.53/t/images/DPX.dpx b/var/tmp/source/EXIFTOOL/Image-ExifTool-9.53/Image-ExifTool-9.53/t/images/DPX.dpx
new file mode 100644
index 00000000..6a9c7017
Binary files /dev/null and b/var/tmp/source/EXIFTOOL/Image-ExifTool-9.53/Image-ExifTool-9.53/t/images/DPX.dpx differ
diff --git a/var/tmp/source/EXIFTOOL/Image-ExifTool-9.27/Image-ExifTool-9.27/t/images/ExifTool.jpg b/var/tmp/source/EXIFTOOL/Image-ExifTool-9.53/Image-ExifTool-9.53/t/images/ExifTool.jpg
index c2a98dfe..25a2e0ac 100644
Binary files a/var/tmp/source/EXIFTOOL/Image-ExifTool-9.27/Image-ExifTool-9.27/t/images/ExifTool.jpg and b/var/tmp/source/EXIFTOOL/Image-ExifTool-9.53/Image-ExifTool-9.53/t/images/ExifTool.jpg differ
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
+<Document>
+<name>Location history from 11/13/2013 to 11/13/2013</name>
+<open>1</open>
+<description/>
+<StyleMap id="multiTrack">
+<Pair>
+<key>normal</key>
+<styleUrl>#multiTrack_n</styleUrl>
+</Pair>
+<Pair>
+<key>highlight</key>
+<styleUrl>#multiTrack_h</styleUrl>
+</Pair>
+</StyleMap>
+<Style id="multiTrack_n">
+<IconStyle>
+<Icon>
+<href>http://earth.google.com/images/kml-icons/track-directional/track-0.png</href>
+</Icon>
+</IconStyle>
+<LineStyle>
+<color>99ffac59</color>
+<width>6</width>
+</LineStyle>
+</Style>
+<Style id="multiTrack_h">
+<IconStyle>
+<scale>1.2</scale>
+<Icon>
+<href>http://earth.google.com/images/kml-icons/track-directional/track-0.png</href>
+</Icon>
+</IconStyle>
+<LineStyle>
+<color>99ffac59</color>
+<width>8</width>
+</LineStyle>
+</Style>
+<Placemark>
+<name>Latitude User</name>
+<description>Location history for Latitude User from 11/13/2013 to 11/13/2013</description>
+<styleUrl>#multiTrack</styleUrl>
+<gx:Track>
+<altitudeMode>clampToGround</altitudeMode>
+<when>2013-11-13T01:03:34.245-08:00</when>
+<gx:coord>-106.026069 34.166232 0</gx:coord>
+<when>2013-11-13T01:04:35.259-08:00</when>
+<gx:coord>-106.027012 34.165476 0</gx:coord>
+<when>2013-11-13T01:05:35.277-08:00</when>
+<gx:coord>-106.027854 34.164765 0</gx:coord>
+</gx:Track>
+</Placemark>
+</Document>
+</kml>
diff --git a/var/tmp/source/EXIFTOOL/Image-ExifTool-9.27/Image-ExifTool-9.27/t/images/QuickTime.m4a b/var/tmp/source/EXIFTOOL/Image-ExifTool-9.53/Image-ExifTool-9.53/t/images/QuickTime.m4a
index b4e258c7..d0b0c8fa 100644
Binary files a/var/tmp/source/EXIFTOOL/Image-ExifTool-9.27/Image-ExifTool-9.27/t/images/QuickTime.m4a and b/var/tmp/source/EXIFTOOL/Image-ExifTool-9.53/Image-ExifTool-9.53/t/images/QuickTime.m4a differ
diff --git a/var/tmp/source/EXIFTOOL/Image-ExifTool-9.27/Image-ExifTool-9.27/t/images/QuickTime.mov b/var/tmp/source/EXIFTOOL/Image-ExifTool-9.53/Image-ExifTool-9.53/t/images/QuickTime.mov
index c9aae0ee..c9f39d09 100644
Binary files a/var/tmp/source/EXIFTOOL/Image-ExifTool-9.27/Image-ExifTool-9.27/t/images/QuickTime.mov and b/var/tmp/source/EXIFTOOL/Image-ExifTool-9.53/Image-ExifTool-9.53/t/images/QuickTime.mov differ
diff --git a/var/tmp/source/EXIFTOOL/Image-ExifTool-9.27/Image-ExifTool-9.27/t/images/RIFF.wav b/var/tmp/source/EXIFTOOL/Image-ExifTool-9.53/Image-ExifTool-9.53/t/images/RIFF.wav
old mode 100755
new mode 100644
@@ -0,0 +1 @@
+d8:announce35:udp://tracker.bogus.com:80/announce13:announce-listll35:udp://tracker.bogus.com:80/announce36:udp://tracker.bogus2.com:80/announce36:udp://tracker.bogus3.com:80/announceee7:comment32:Test BitTorrent description file10:created by13:uTorrent/184013:creation datei1378481639e8:encoding5:UTF-84:infod5:filesld6:lengthi3700748e4:pathl17:exiftool-9.35.zipeed6:lengthi3662939e4:pathl26:Image-ExifTool-9.35.tar.gzeed6:lengthi2394706e4:pathl17:ExifTool-9.35.dmgeed6:lengthi10848e4:pathl4:docs6:READMEeee4:name19:Image-ExifTool-9.3512:piece lengthi1048576e6:pieces200:¦æ‡[ûš'§OïÕãtš=ÙÖà£aPœÿ"÷á5!“S®:%8Ff¹8—Îɯg²æO¹ŽkéKÝ|á%9D[^åÒâY•S%90æ׌öhò¬/î×èáˆÙ$e 1›4¨ᛀ§HXg(縵«aL72‰UâðD©┧ôdUZ&±³Q:ƒ¹XµÞ|y³²%8Fx¼ØiCKîώz–#ñö‘»=W¬8Bƒ;šòÅz¡Š]ù#âˆzêçœöd%81º­Âú$2ÆrVþ@l¢De8:url-listl22:http://seed.bogus.com/23:http://seed.bogus2.com/ee
\ No newline at end of file