exiftool-vendored.pl 13.0.0 → 13.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/bin/Changes +254 -20
  2. package/bin/MANIFEST +10 -0
  3. package/bin/META.json +1 -1
  4. package/bin/META.yml +1 -1
  5. package/bin/README +3 -3
  6. package/bin/arg_files/exif2xmp.args +4 -0
  7. package/bin/arg_files/xmp2exif.args +2 -1
  8. package/bin/build_geolocation +1 -1
  9. package/bin/exiftool +356 -213
  10. package/bin/lib/File/RandomAccess.pm +1 -1
  11. package/bin/lib/File/RandomAccess.pod +2 -2
  12. package/bin/lib/Image/ExifTool/AAC.pm +1 -1
  13. package/bin/lib/Image/ExifTool/AES.pm +1 -1
  14. package/bin/lib/Image/ExifTool/AFCP.pm +6 -6
  15. package/bin/lib/Image/ExifTool/AIFF.pm +2 -2
  16. package/bin/lib/Image/ExifTool/APE.pm +2 -2
  17. package/bin/lib/Image/ExifTool/APP12.pm +1 -1
  18. package/bin/lib/Image/ExifTool/ASF.pm +2 -2
  19. package/bin/lib/Image/ExifTool/Apple.pm +11 -9
  20. package/bin/lib/Image/ExifTool/Audible.pm +1 -1
  21. package/bin/lib/Image/ExifTool/BMP.pm +1 -1
  22. package/bin/lib/Image/ExifTool/BPG.pm +1 -1
  23. package/bin/lib/Image/ExifTool/BZZ.pm +1 -1
  24. package/bin/lib/Image/ExifTool/BigTIFF.pm +1 -1
  25. package/bin/lib/Image/ExifTool/BuildTagLookup.pm +36 -22
  26. package/bin/lib/Image/ExifTool/CBOR.pm +5 -2
  27. package/bin/lib/Image/ExifTool/Canon.pm +66 -27
  28. package/bin/lib/Image/ExifTool/CanonCustom.pm +1 -1
  29. package/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
  30. package/bin/lib/Image/ExifTool/CanonVRD.pm +1 -1
  31. package/bin/lib/Image/ExifTool/CaptureOne.pm +1 -1
  32. package/bin/lib/Image/ExifTool/Casio.pm +1 -1
  33. package/bin/lib/Image/ExifTool/Charset.pm +1 -1
  34. package/bin/lib/Image/ExifTool/DICOM.pm +1 -1
  35. package/bin/lib/Image/ExifTool/DJI.pm +196 -30
  36. package/bin/lib/Image/ExifTool/DNG.pm +1 -1
  37. package/bin/lib/Image/ExifTool/DPX.pm +1 -1
  38. package/bin/lib/Image/ExifTool/DV.pm +1 -1
  39. package/bin/lib/Image/ExifTool/DarwinCore.pm +1 -1
  40. package/bin/lib/Image/ExifTool/DjVu.pm +1 -1
  41. package/bin/lib/Image/ExifTool/EXE.pm +138 -33
  42. package/bin/lib/Image/ExifTool/Exif.pm +29 -16
  43. package/bin/lib/Image/ExifTool/FITS.pm +3 -3
  44. package/bin/lib/Image/ExifTool/FLAC.pm +1 -1
  45. package/bin/lib/Image/ExifTool/FLIF.pm +3 -3
  46. package/bin/lib/Image/ExifTool/FLIR.pm +1 -1
  47. package/bin/lib/Image/ExifTool/Fixup.pm +1 -1
  48. package/bin/lib/Image/ExifTool/Flash.pm +1 -1
  49. package/bin/lib/Image/ExifTool/FlashPix.pm +17 -21
  50. package/bin/lib/Image/ExifTool/Font.pm +2 -2
  51. package/bin/lib/Image/ExifTool/FotoStation.pm +1 -1
  52. package/bin/lib/Image/ExifTool/FujiFilm.pm +1 -1
  53. package/bin/lib/Image/ExifTool/GE.pm +1 -1
  54. package/bin/lib/Image/ExifTool/GIF.pm +144 -93
  55. package/bin/lib/Image/ExifTool/GIMP.pm +1 -1
  56. package/bin/lib/Image/ExifTool/GM.pm +1 -1
  57. package/bin/lib/Image/ExifTool/GPS.pm +34 -30
  58. package/bin/lib/Image/ExifTool/GeoTiff.pm +1 -1
  59. package/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
  60. package/bin/lib/Image/ExifTool/Geolocation.pm +19 -9
  61. package/bin/lib/Image/ExifTool/Geotag.pm +46 -12
  62. package/bin/lib/Image/ExifTool/GoPro.pm +120 -8
  63. package/bin/lib/Image/ExifTool/H264.pm +1 -1
  64. package/bin/lib/Image/ExifTool/HP.pm +2 -2
  65. package/bin/lib/Image/ExifTool/HTML.pm +1 -1
  66. package/bin/lib/Image/ExifTool/HtmlDump.pm +1 -1
  67. package/bin/lib/Image/ExifTool/ICC_Profile.pm +81 -2
  68. package/bin/lib/Image/ExifTool/ICO.pm +1 -1
  69. package/bin/lib/Image/ExifTool/ID3.pm +8 -8
  70. package/bin/lib/Image/ExifTool/IPTC.pm +10 -7
  71. package/bin/lib/Image/ExifTool/ISO.pm +1 -1
  72. package/bin/lib/Image/ExifTool/ITC.pm +1 -1
  73. package/bin/lib/Image/ExifTool/Import.pm +5 -4
  74. package/bin/lib/Image/ExifTool/InDesign.pm +2 -2
  75. package/bin/lib/Image/ExifTool/InfiRay.pm +1 -1
  76. package/bin/lib/Image/ExifTool/JPEG.pm +32 -5
  77. package/bin/lib/Image/ExifTool/JPEGDigest.pm +1 -1
  78. package/bin/lib/Image/ExifTool/JSON.pm +1 -1
  79. package/bin/lib/Image/ExifTool/JVC.pm +1 -1
  80. package/bin/lib/Image/ExifTool/Jpeg2000.pm +10 -9
  81. package/bin/lib/Image/ExifTool/Kodak.pm +1 -1
  82. package/bin/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
  83. package/bin/lib/Image/ExifTool/LIF.pm +1 -1
  84. package/bin/lib/Image/ExifTool/LNK.pm +2 -2
  85. package/bin/lib/Image/ExifTool/Lang/cs.pm +1 -1
  86. package/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
  87. package/bin/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
  88. package/bin/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
  89. package/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
  90. package/bin/lib/Image/ExifTool/Lang/fi.pm +1 -1
  91. package/bin/lib/Image/ExifTool/Lang/fr.pm +1 -1
  92. package/bin/lib/Image/ExifTool/Lang/it.pm +1 -1
  93. package/bin/lib/Image/ExifTool/Lang/ja.pm +1 -1
  94. package/bin/lib/Image/ExifTool/Lang/ko.pm +1 -1
  95. package/bin/lib/Image/ExifTool/Lang/nl.pm +1 -1
  96. package/bin/lib/Image/ExifTool/Lang/pl.pm +1 -1
  97. package/bin/lib/Image/ExifTool/Lang/ru.pm +1 -1
  98. package/bin/lib/Image/ExifTool/Lang/sk.pm +1 -1
  99. package/bin/lib/Image/ExifTool/Lang/sv.pm +1 -1
  100. package/bin/lib/Image/ExifTool/Lang/tr.pm +1 -1
  101. package/bin/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
  102. package/bin/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
  103. package/bin/lib/Image/ExifTool/Leaf.pm +1 -1
  104. package/bin/lib/Image/ExifTool/LigoGPS.pm +409 -0
  105. package/bin/lib/Image/ExifTool/Lytro.pm +1 -1
  106. package/bin/lib/Image/ExifTool/M2TS.pm +57 -18
  107. package/bin/lib/Image/ExifTool/MIE.pm +15 -6
  108. package/bin/lib/Image/ExifTool/MIEUnits.pod +1 -1
  109. package/bin/lib/Image/ExifTool/MIFF.pm +1 -1
  110. package/bin/lib/Image/ExifTool/MISB.pm +1 -1
  111. package/bin/lib/Image/ExifTool/MNG.pm +1 -1
  112. package/bin/lib/Image/ExifTool/MOI.pm +1 -1
  113. package/bin/lib/Image/ExifTool/MPC.pm +1 -1
  114. package/bin/lib/Image/ExifTool/MPEG.pm +1 -1
  115. package/bin/lib/Image/ExifTool/MPF.pm +1 -1
  116. package/bin/lib/Image/ExifTool/MRC.pm +1 -1
  117. package/bin/lib/Image/ExifTool/MWG.pm +1 -1
  118. package/bin/lib/Image/ExifTool/MXF.pm +3 -3
  119. package/bin/lib/Image/ExifTool/MacOS.pm +3 -2
  120. package/bin/lib/Image/ExifTool/MakerNotes.pm +1 -1
  121. package/bin/lib/Image/ExifTool/Matroska.pm +22 -6
  122. package/bin/lib/Image/ExifTool/Microsoft.pm +2 -2
  123. package/bin/lib/Image/ExifTool/Minolta.pm +1 -1
  124. package/bin/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
  125. package/bin/lib/Image/ExifTool/Motorola.pm +1 -1
  126. package/bin/lib/Image/ExifTool/Nikon.pm +495 -39
  127. package/bin/lib/Image/ExifTool/NikonCapture.pm +1 -1
  128. package/bin/lib/Image/ExifTool/NikonCustom.pm +2 -2
  129. package/bin/lib/Image/ExifTool/NikonSettings.pm +1 -1
  130. package/bin/lib/Image/ExifTool/Nintendo.pm +1 -1
  131. package/bin/lib/Image/ExifTool/OOXML.pm +8 -8
  132. package/bin/lib/Image/ExifTool/Ogg.pm +1 -1
  133. package/bin/lib/Image/ExifTool/Olympus.pm +1 -1
  134. package/bin/lib/Image/ExifTool/OpenEXR.pm +1 -1
  135. package/bin/lib/Image/ExifTool/Opus.pm +1 -1
  136. package/bin/lib/Image/ExifTool/Other.pm +1 -1
  137. package/bin/lib/Image/ExifTool/PCX.pm +1 -1
  138. package/bin/lib/Image/ExifTool/PDF.pm +49 -18
  139. package/bin/lib/Image/ExifTool/PGF.pm +1 -1
  140. package/bin/lib/Image/ExifTool/PICT.pm +1 -1
  141. package/bin/lib/Image/ExifTool/PLIST.pm +4 -4
  142. package/bin/lib/Image/ExifTool/PLUS.pm +1 -1
  143. package/bin/lib/Image/ExifTool/PNG.pm +20 -8
  144. package/bin/lib/Image/ExifTool/PPM.pm +12 -3
  145. package/bin/lib/Image/ExifTool/PSP.pm +1 -1
  146. package/bin/lib/Image/ExifTool/Palm.pm +1 -1
  147. package/bin/lib/Image/ExifTool/Panasonic.pm +27 -3
  148. package/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
  149. package/bin/lib/Image/ExifTool/Parrot.pm +1 -1
  150. package/bin/lib/Image/ExifTool/Pentax.pm +1 -1
  151. package/bin/lib/Image/ExifTool/PhaseOne.pm +4 -4
  152. package/bin/lib/Image/ExifTool/PhotoCD.pm +1 -1
  153. package/bin/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
  154. package/bin/lib/Image/ExifTool/Photoshop.pm +65 -4
  155. package/bin/lib/Image/ExifTool/PostScript.pm +1 -1
  156. package/bin/lib/Image/ExifTool/PrintIM.pm +1 -1
  157. package/bin/lib/Image/ExifTool/Protobuf.pm +270 -0
  158. package/bin/lib/Image/ExifTool/Qualcomm.pm +1 -1
  159. package/bin/lib/Image/ExifTool/QuickTime.pm +326 -88
  160. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +199 -195
  161. package/bin/lib/Image/ExifTool/README +12 -2
  162. package/bin/lib/Image/ExifTool/RIFF.pm +21 -6
  163. package/bin/lib/Image/ExifTool/RSRC.pm +1 -1
  164. package/bin/lib/Image/ExifTool/RTF.pm +2 -2
  165. package/bin/lib/Image/ExifTool/Radiance.pm +1 -1
  166. package/bin/lib/Image/ExifTool/Rawzor.pm +1 -1
  167. package/bin/lib/Image/ExifTool/Real.pm +1 -1
  168. package/bin/lib/Image/ExifTool/Reconyx.pm +1 -1
  169. package/bin/lib/Image/ExifTool/Red.pm +1 -1
  170. package/bin/lib/Image/ExifTool/Ricoh.pm +4 -4
  171. package/bin/lib/Image/ExifTool/Samsung.pm +2 -2
  172. package/bin/lib/Image/ExifTool/Sanyo.pm +1 -1
  173. package/bin/lib/Image/ExifTool/Scalado.pm +1 -1
  174. package/bin/lib/Image/ExifTool/Shift.pl +1 -1
  175. package/bin/lib/Image/ExifTool/Shortcuts.pm +1 -1
  176. package/bin/lib/Image/ExifTool/Sigma.pm +1 -1
  177. package/bin/lib/Image/ExifTool/SigmaRaw.pm +1 -1
  178. package/bin/lib/Image/ExifTool/Sony.pm +5 -4
  179. package/bin/lib/Image/ExifTool/SonyIDC.pm +1 -1
  180. package/bin/lib/Image/ExifTool/Stim.pm +1 -1
  181. package/bin/lib/Image/ExifTool/TagInfoXML.pm +6 -5
  182. package/bin/lib/Image/ExifTool/TagLookup.pm +7023 -6968
  183. package/bin/lib/Image/ExifTool/TagNames.pod +445 -29
  184. package/bin/lib/Image/ExifTool/Text.pm +4 -3
  185. package/bin/lib/Image/ExifTool/Theora.pm +1 -1
  186. package/bin/lib/Image/ExifTool/Torrent.pm +3 -3
  187. package/bin/lib/Image/ExifTool/Unknown.pm +1 -1
  188. package/bin/lib/Image/ExifTool/VCard.pm +3 -3
  189. package/bin/lib/Image/ExifTool/Validate.pm +6 -6
  190. package/bin/lib/Image/ExifTool/Vivo.pm +124 -0
  191. package/bin/lib/Image/ExifTool/Vorbis.pm +1 -1
  192. package/bin/lib/Image/ExifTool/WPG.pm +1 -1
  193. package/bin/lib/Image/ExifTool/WTV.pm +1 -1
  194. package/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  195. package/bin/lib/Image/ExifTool/WriteExif.pl +3 -3
  196. package/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
  197. package/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
  198. package/bin/lib/Image/ExifTool/WritePNG.pl +1 -1
  199. package/bin/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
  200. package/bin/lib/Image/ExifTool/WritePostScript.pl +1 -1
  201. package/bin/lib/Image/ExifTool/WriteQuickTime.pl +166 -79
  202. package/bin/lib/Image/ExifTool/WriteRIFF.pl +17 -6
  203. package/bin/lib/Image/ExifTool/WriteXMP.pl +3 -3
  204. package/bin/lib/Image/ExifTool/Writer.pl +89 -96
  205. package/bin/lib/Image/ExifTool/XISF.pm +1 -1
  206. package/bin/lib/Image/ExifTool/XMP.pm +28 -13
  207. package/bin/lib/Image/ExifTool/XMP2.pl +103 -1
  208. package/bin/lib/Image/ExifTool/XMPStruct.pl +2 -3
  209. package/bin/lib/Image/ExifTool/ZIP.pm +2 -2
  210. package/bin/lib/Image/ExifTool/ZISRAW.pm +1 -1
  211. package/bin/lib/Image/ExifTool/iWork.pm +1 -1
  212. package/bin/lib/Image/ExifTool.pm +335 -163
  213. package/bin/lib/Image/ExifTool.pod +119 -73
  214. package/bin/perl-Image-ExifTool.spec +1 -1
  215. package/bin/windows_exiftool.txt +96 -51
  216. package/package.json +9 -9
@@ -920,7 +920,7 @@ page.
920
920
 
921
921
  =head1 AUTHOR
922
922
 
923
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
923
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
924
924
 
925
925
  This library is free software; you can redistribute it and/or modify it
926
926
  under the same terms as Perl itself.
@@ -12,6 +12,7 @@
12
12
  # 5) http://www.color.org/icc_specs2.xalter (approved revisions, 2010-07-16)
13
13
  # 6) Eef Vreeland private communication
14
14
  # 7) https://color.org/specification/ICC.2-2019.pdf
15
+ # 8) https://www.color.org/specification/ICC.1-2022-05.pdf
15
16
  #
16
17
  # Notes: The ICC profile information is different: the format of each
17
18
  # tag is embedded in the information instead of in the directory
@@ -25,7 +26,7 @@ use strict;
25
26
  use vars qw($VERSION);
26
27
  use Image::ExifTool qw(:DataAccess :Utils);
27
28
 
28
- $VERSION = '1.40';
29
+ $VERSION = '1.41';
29
30
 
30
31
  sub ProcessICC($$);
31
32
  sub ProcessICC_Profile($$$);
@@ -367,6 +368,7 @@ my %manuSig = ( #6
367
368
  Groups => { 2 => 'Time' },
368
369
  PrintConv => '$self->ConvertDateTime($val)',
369
370
  },
371
+
370
372
  targ => {
371
373
  Name => 'CharTarget',
372
374
  ValueConv => '$val=~s/\0.*//; length $val > 128 ? \$val : $val',
@@ -493,6 +495,10 @@ my %manuSig = ( #6
493
495
  },
494
496
  },
495
497
  ciis => 'ColorimetricIntentImageState', #5
498
+ cicp => { #8 (Coding-independent Code Points)
499
+ Name => 'ColorRepresentation',
500
+ SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::ColorRep' },
501
+ },
496
502
  scoe => 'SceneColorimetryEstimates', #5
497
503
  sape => 'SceneAppearanceEstimates', #5
498
504
  fpce => 'FocalPlaneColorimetryEstimates', #5
@@ -628,6 +634,7 @@ my %manuSig = ( #6
628
634
  s2cp => 'StandardToCustomPcc',
629
635
  smap => 'SurfaceMap',
630
636
  # smwp ? (seen in some v5 samples [was a mistake in sample production])
637
+ hdgm => { Name => 'HDGainMapInfo', Binary => 1 }, #PH
631
638
 
632
639
  # the following entry represents the ICC profile header, and doesn't
633
640
  # exist as a tag in the directory. It is only in this table to provide
@@ -747,6 +754,78 @@ my %manuSig = ( #6
747
754
  },
748
755
  );
749
756
 
757
+ # Coding-independent code points (cicp) definition
758
+ # (NOTE: conversions are the same as Image::ExifTool::QuickTime::ColorRep tags)
759
+ %Image::ExifTool::ICC_Profile::ColorRep = (
760
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
761
+ GROUPS => { 0 => 'ICC_Profile', 1 => 'ICC-cicp', 2 => 'Image' },
762
+ 8 => {
763
+ Name => 'ColorPrimaries',
764
+ PrintConv => {
765
+ 1 => 'BT.709',
766
+ 2 => 'Unspecified',
767
+ 4 => 'BT.470 System M (historical)',
768
+ 5 => 'BT.470 System B, G (historical)',
769
+ 6 => 'BT.601',
770
+ 7 => 'SMPTE 240',
771
+ 8 => 'Generic film (color filters using illuminant C)',
772
+ 9 => 'BT.2020, BT.2100',
773
+ 10 => 'SMPTE 428 (CIE 1931 XYZ)', #forum14766
774
+ 11 => 'SMPTE RP 431-2',
775
+ 12 => 'SMPTE EG 432-1',
776
+ 22 => 'EBU Tech. 3213-E',
777
+ },
778
+ },
779
+ 9 => {
780
+ Name => 'TransferCharacteristics',
781
+ PrintConv => {
782
+ 0 => 'For future use (0)',
783
+ 1 => 'BT.709',
784
+ 2 => 'Unspecified',
785
+ 3 => 'For future use (3)',
786
+ 4 => 'BT.470 System M (historical)', # Gamma 2.2? (ref forum14960)
787
+ 5 => 'BT.470 System B, G (historical)', # Gamma 2.8? (ref forum14960)
788
+ 6 => 'BT.601',
789
+ 7 => 'SMPTE 240 M',
790
+ 8 => 'Linear',
791
+ 9 => 'Logarithmic (100 : 1 range)',
792
+ 10 => 'Logarithmic (100 * Sqrt(10) : 1 range)',
793
+ 11 => 'IEC 61966-2-4',
794
+ 12 => 'BT.1361',
795
+ 13 => 'sRGB or sYCC',
796
+ 14 => 'BT.2020 10-bit systems',
797
+ 15 => 'BT.2020 12-bit systems',
798
+ 16 => 'SMPTE ST 2084, ITU BT.2100 PQ',
799
+ 17 => 'SMPTE ST 428',
800
+ 18 => 'BT.2100 HLG, ARIB STD-B67',
801
+ },
802
+ },
803
+ 10 => {
804
+ Name => 'MatrixCoefficients',
805
+ PrintConv => {
806
+ 0 => 'Identity matrix',
807
+ 1 => 'BT.709',
808
+ 2 => 'Unspecified',
809
+ 3 => 'For future use (3)',
810
+ 4 => 'US FCC 73.628',
811
+ 5 => 'BT.470 System B, G (historical)',
812
+ 6 => 'BT.601',
813
+ 7 => 'SMPTE 240 M',
814
+ 8 => 'YCgCo',
815
+ 9 => 'BT.2020 non-constant luminance, BT.2100 YCbCr',
816
+ 10 => 'BT.2020 constant luminance',
817
+ 11 => 'SMPTE ST 2085 YDzDx',
818
+ 12 => 'Chromaticity-derived non-constant luminance',
819
+ 13 => 'Chromaticity-derived constant luminance',
820
+ 14 => 'BT.2100 ICtCp',
821
+ },
822
+ },
823
+ 11 => {
824
+ Name => 'VideoFullRangeFlag',
825
+ PrintConv => { 0 => 'Limited', 1 => 'Full' },
826
+ },
827
+ );
828
+
750
829
  # viewingConditionsType (view) definition
751
830
  %Image::ExifTool::ICC_Profile::ViewingConditions = (
752
831
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
@@ -1357,7 +1436,7 @@ data created on one device into another device's native color space.
1357
1436
 
1358
1437
  =head1 AUTHOR
1359
1438
 
1360
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
1439
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
1361
1440
 
1362
1441
  This library is free software; you can redistribute it and/or modify it
1363
1442
  under the same terms as Perl itself.
@@ -121,7 +121,7 @@ information from Windows ICO (icon) and CUR (cursor) files.
121
121
 
122
122
  =head1 AUTHOR
123
123
 
124
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
124
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
125
125
 
126
126
  This library is free software; you can redistribute it and/or modify it
127
127
  under the same terms as Perl itself.
@@ -18,7 +18,7 @@ use strict;
18
18
  use vars qw($VERSION);
19
19
  use Image::ExifTool qw(:DataAccess :Utils);
20
20
 
21
- $VERSION = '1.62';
21
+ $VERSION = '1.63';
22
22
 
23
23
  sub ProcessID3v2($$$);
24
24
  sub ProcessPrivate($$$);
@@ -1169,7 +1169,7 @@ sub ProcessID3v2($$$)
1169
1169
  }
1170
1170
  $tagInfo = $et->GetTagInfo($otherTable, $id) if $otherTable;
1171
1171
  if ($tagInfo) {
1172
- $et->WarnOnce("Frame '${id}' is not valid for this ID3 version", 1);
1172
+ $et->Warn("Frame '${id}' is not valid for this ID3 version", 1);
1173
1173
  } else {
1174
1174
  next unless $verbose or $et->Options('Unknown');
1175
1175
  $id =~ tr/-A-Za-z0-9_//dc;
@@ -1198,7 +1198,7 @@ sub ProcessID3v2($$$)
1198
1198
  }
1199
1199
  }
1200
1200
  if ($flags{Encrypt}) {
1201
- $et->WarnOnce('Encrypted frames currently not supported');
1201
+ $et->Warn('Encrypted frames currently not supported');
1202
1202
  next;
1203
1203
  }
1204
1204
  # extract the value
@@ -1232,7 +1232,7 @@ sub ProcessID3v2($$$)
1232
1232
  next;
1233
1233
  }
1234
1234
  } else {
1235
- $et->WarnOnce('Install Compress::Zlib to decode compressed frames');
1235
+ $et->Warn('Install Compress::Zlib to decode compressed frames');
1236
1236
  next;
1237
1237
  }
1238
1238
  }
@@ -1278,9 +1278,9 @@ sub ProcessID3v2($$$)
1278
1278
  my $enc = unpack('C', $val);
1279
1279
  my ($tag, $url);
1280
1280
  if ($enc == 1 or $enc == 2) {
1281
- ($tag, $url) = ($tag =~ /^(.(?:..)*?)\0\0(.*)/s);
1281
+ ($tag, $url) = ($val =~ /^(.(?:..)*?)\0\0(.*)/s);
1282
1282
  } else {
1283
- ($tag, $url) = ($tag =~ /^(..*?)\0(.*)/s);
1283
+ ($tag, $url) = ($val =~ /^(..*?)\0(.*)/s);
1284
1284
  }
1285
1285
  unless (defined $tag and defined $url) {
1286
1286
  $et->Warn("Invalid $id frame value");
@@ -1293,7 +1293,7 @@ sub ProcessID3v2($$$)
1293
1293
  $tagInfo = $$tagTablePtr{$id} || AddTagToTable($tagTablePtr, $id, MakeTagName($tag));
1294
1294
  }
1295
1295
  $url =~ s/\0.*//s;
1296
- $val = $url;
1296
+ $val = $et->Decode($url, 'Latin');
1297
1297
  } elsif ($id =~ /^W/) {
1298
1298
  $val =~ s/\0.*//s; # truncate at null
1299
1299
  } elsif ($id =~ /^(COM|COMM|ULT|USLT)$/) {
@@ -1746,7 +1746,7 @@ other types of audio files.
1746
1746
 
1747
1747
  =head1 AUTHOR
1748
1748
 
1749
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
1749
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
1750
1750
 
1751
1751
  This library is free software; you can redistribute it and/or modify it
1752
1752
  under the same terms as Perl itself.
@@ -15,7 +15,7 @@ use strict;
15
15
  use vars qw($VERSION $AUTOLOAD %iptcCharset);
16
16
  use Image::ExifTool qw(:DataAccess :Utils);
17
17
 
18
- $VERSION = '1.58';
18
+ $VERSION = '1.59';
19
19
 
20
20
  %iptcCharset = (
21
21
  "\x1b%G" => 'UTF8',
@@ -1025,7 +1025,7 @@ sub TranslateCodedString($$$$)
1025
1025
  $$valPtr = $et->Decode($$valPtr, $$xlatPtr);
1026
1026
  } else {
1027
1027
  # don't yet support reading ISO 2022 shifted character sets
1028
- $et->WarnOnce('Some IPTC characters not converted (ISO 2022 shifting not supported)');
1028
+ $et->Warn('Some IPTC characters not converted (ISO 2022 shifting not supported)');
1029
1029
  }
1030
1030
  }
1031
1031
 
@@ -1057,7 +1057,7 @@ sub ProcessIPTC($$$)
1057
1057
  my $verbose = $et->Options('Verbose');
1058
1058
  my $validate = $et->Options('Validate');
1059
1059
  my $success = 0;
1060
- my ($lastRec, $recordPtr, $recordName);
1060
+ my ($lastRec, $recordPtr, $recordName, %seen);
1061
1061
 
1062
1062
  $verbose and $dirInfo and $et->VerboseDir('IPTC', 0, $$dirInfo{DirLen});
1063
1063
 
@@ -1083,7 +1083,7 @@ sub ProcessIPTC($$$)
1083
1083
  $et->FoundTag('CurrentIPTCDigest', $md5);
1084
1084
  }
1085
1085
  } else {
1086
- if (($Image::ExifTool::MWG::strict or $et->Options('Validate')) and
1086
+ if (($Image::ExifTool::MWG::strict or $validate) and
1087
1087
  $$et{FILE_TYPE} =~ /^(JPEG|TIFF|PSD)$/)
1088
1088
  {
1089
1089
  if ($Image::ExifTool::MWG::strict) {
@@ -1164,7 +1164,7 @@ sub ProcessIPTC($$$)
1164
1164
  }
1165
1165
  my $tableInfo = $tagTablePtr->{$rec};
1166
1166
  unless ($tableInfo) {
1167
- $et->WarnOnce("Unrecognized IPTC record $rec (ignored)");
1167
+ $et->Warn("Unrecognized IPTC record $rec (ignored)");
1168
1168
  $pos += $len;
1169
1169
  next; # ignore this entry
1170
1170
  }
@@ -1186,8 +1186,11 @@ sub ProcessIPTC($$$)
1186
1186
  # - no Name so name is generated automatically with decimal tag number
1187
1187
  AddTagToTable($recordPtr, $tag, { Unknown => 1 });
1188
1188
  }
1189
-
1190
1189
  my $tagInfo = $et->GetTagInfo($recordPtr, $tag);
1190
+ if ($validate and not $$tagInfo{List} and not $$tagInfo{Unknown}) {
1191
+ $et->Warn("Multiple IPTC $$tagInfo{Name} tags") if $seen{$tagInfo};
1192
+ $seen{$tagInfo} = 1;
1193
+ }
1191
1194
  my $format;
1192
1195
  # (could use $$recordPtr{FORMAT} if no Format below, but don't do this to
1193
1196
  # be backward compatible with improperly written PhotoMechanic tags)
@@ -1284,7 +1287,7 @@ image files.
1284
1287
 
1285
1288
  =head1 AUTHOR
1286
1289
 
1287
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
1290
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
1288
1291
 
1289
1292
  This library is free software; you can redistribute it and/or modify it
1290
1293
  under the same terms as Perl itself.
@@ -184,7 +184,7 @@ information from ISO 9660 disk images.
184
184
 
185
185
  =head1 AUTHOR
186
186
 
187
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
187
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
188
188
 
189
189
  This library is free software; you can redistribute it and/or modify it
190
190
  under the same terms as Perl itself.
@@ -191,7 +191,7 @@ information (including artwork images) from iTunes Cover Flow files.
191
191
 
192
192
  =head1 AUTHOR
193
193
 
194
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
194
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
195
195
 
196
196
  This library is free software; you can redistribute it and/or modify it
197
197
  under the same terms as Perl itself.
@@ -12,7 +12,7 @@ require Exporter;
12
12
 
13
13
  use vars qw($VERSION @ISA @EXPORT_OK);
14
14
 
15
- $VERSION = '1.13';
15
+ $VERSION = '1.14';
16
16
  @ISA = qw(Exporter);
17
17
  @EXPORT_OK = qw(ReadCSV ReadJSON);
18
18
 
@@ -80,14 +80,15 @@ sub ReadCSV($$;$$)
80
80
  }
81
81
  if (@tags) {
82
82
  # save values for each tag
83
+ $fileInfo{_ordered_keys_} = [ ];
83
84
  for ($i=0; $i<@vals and $i<@tags; ++$i) {
84
85
  # ignore empty entries unless missingValue is empty too
85
86
  next unless length $vals[$i] or defined $missingValue and $missingValue eq '';
86
87
  # delete tag (set value to undef) if value is same as missing tag
87
88
  $fileInfo{$tags[$i]} =
88
89
  (defined $missingValue and $vals[$i] eq $missingValue) ? undef : $vals[$i];
90
+ push @{$fileInfo{_ordered_keys_}}, $tags[$i];
89
91
  }
90
- $fileInfo{_ordered_keys_} = \@tags;
91
92
  # figure out the file name to use
92
93
  if ($fileInfo{SourceFile}) {
93
94
  $$database{$fileInfo{SourceFile}} = \%fileInfo;
@@ -99,7 +100,7 @@ sub ReadCSV($$;$$)
99
100
  # terminate at first blank tag name (eg. extra comma at end of line)
100
101
  last unless length $_;
101
102
  @tags or s/^\xef\xbb\xbf//; # remove UTF-8 BOM if it exists
102
- /^[-\w]+(:[-\w+]+)?#?$/ or $err = "Invalid tag name '${_}'", last;
103
+ /^([-_0-9A-Z]+:)*[-_0-9A-Z]+#?$/i or $err = "Invalid tag name '${_}'", last;
103
104
  push(@tags, $_);
104
105
  }
105
106
  last if $err;
@@ -355,7 +356,7 @@ ARRAY reference in a special "_ordered_keys_" element of this hash.
355
356
 
356
357
  =head1 AUTHOR
357
358
 
358
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
359
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
359
360
 
360
361
  This library is free software; you can redistribute it and/or modify it
361
362
  under the same terms as Perl itself.
@@ -78,7 +78,7 @@ sub ProcessIND($$)
78
78
  $err = 'InDesign files larger than 2 GB not supported (LargeFileSupport not set)';
79
79
  goto DONE;
80
80
  } elsif ($et->Options('LargeFileSupport') eq '2') {
81
- $et->WarnOnce('Processing large file (LargeFileSupport is 2)');
81
+ $et->Warn('Processing large file (LargeFileSupport is 2)');
82
82
  }
83
83
  }
84
84
  if ($outfile) {
@@ -277,7 +277,7 @@ them and the LargeFileSupport option is enabled.
277
277
 
278
278
  =head1 AUTHOR
279
279
 
280
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
280
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
281
281
 
282
282
  This library is free software; you can redistribute it and/or modify it
283
283
  under the same terms as Perl itself.
@@ -206,7 +206,7 @@ IJPEG SDK, used in cameras such as the P2 Pro.
206
206
 
207
207
  =head1 AUTHOR
208
208
 
209
- Copyright 2003-2024, Marcos Del Sol Vives (marcos at orca.pet)
209
+ Copyright 2003-2025, Marcos Del Sol Vives (marcos at orca.pet)
210
210
 
211
211
  This library is free software; you can redistribute it and/or modify it
212
212
  under the same terms as Perl itself.
@@ -11,7 +11,7 @@ use strict;
11
11
  use vars qw($VERSION);
12
12
  use Image::ExifTool qw(:DataAccess :Utils);
13
13
 
14
- $VERSION = '1.36';
14
+ $VERSION = '1.39';
15
15
 
16
16
  sub ProcessOcad($$$);
17
17
  sub ProcessJPEG_HDR($$$);
@@ -87,6 +87,11 @@ sub ProcessJPEG_HDR($$$);
87
87
  Name => 'InfiRayVersion',
88
88
  Condition => '$$valPt =~ /^....IJPEG\0/s',
89
89
  SubDirectory => { TagTable => 'Image::ExifTool::InfiRay::Version' },
90
+ }, {
91
+ Name => 'UniformResourceName',
92
+ Groups => { 1 => 'APP2' },
93
+ Condition => '$$valPt =~ /^urn:/',
94
+ Notes => 'used in Apple HDR images',
90
95
  }, {
91
96
  Name => 'PreviewImage',
92
97
  Condition => '$$valPt =~ /^(|QVGA\0|BGTH)\xff\xd8\xff\xdb/',
@@ -228,6 +233,10 @@ sub ProcessJPEG_HDR($$$);
228
233
  Name => 'InfiRayIsothermal',
229
234
  Condition => '$$self{HasIJPEG}',
230
235
  SubDirectory => { TagTable => 'Image::ExifTool::InfiRay::Isothermal' },
236
+ }, {
237
+ Name => 'SEAL',
238
+ Condition => '$$valPt =~ /^SEAL\0/',
239
+ SubDirectory => { TagTable => 'Image::ExifTool::XMP::SEAL' },
231
240
  }],
232
241
  APP9 => [{
233
242
  Name => 'MediaJukebox',
@@ -237,17 +246,31 @@ sub ProcessJPEG_HDR($$$);
237
246
  Name => 'InfiRaySensor',
238
247
  Condition => '$$self{HasIJPEG}',
239
248
  SubDirectory => { TagTable => 'Image::ExifTool::InfiRay::Sensor' },
249
+ }, {
250
+ Name => 'SEAL',
251
+ Condition => '$$valPt =~ /^SEAL\0/',
252
+ SubDirectory => { TagTable => 'Image::ExifTool::XMP::SEAL' },
240
253
  }],
241
- APP10 => {
254
+ APP10 => [{
242
255
  Name => 'Comment',
243
256
  Condition => '$$valPt =~ /^UNICODE\0/',
244
257
  Notes => 'PhotoStudio Unicode comment',
245
- },
258
+ }, {
259
+ Name => 'HDRGainCurve', #PH (NC)
260
+ Condition => '$$valPt =~ /^AROT\0\0.{4}/s',
261
+ Groups => { 1 => 'APP10', 2 => 'Image' },
262
+ ValueConv => q{
263
+ my $n = unpack('x6N', $val);
264
+ return '<truncated AROT data>' if length($val)-6 < $n * 4;
265
+ my $str = join ' ', unpack("x10V$n", $val);
266
+ return \$str;
267
+ },
268
+ }],
246
269
  APP11 => [{
247
270
  Name => 'JPEG-HDR',
248
271
  Condition => '$$valPt =~ /^HDR_RI /',
249
272
  SubDirectory => { TagTable => 'Image::ExifTool::JPEG::HDR' },
250
- },{
273
+ }, {
251
274
  Name => 'JUMBF',
252
275
  Condition => '$$valPt =~ /^JP/',
253
276
  SubDirectory => { TagTable => 'Image::ExifTool::Jpeg2000::Main' },
@@ -324,6 +347,10 @@ sub ProcessJPEG_HDR($$$);
324
347
  Name => 'Samsung',
325
348
  Condition => '$$valPt =~ /QDIOBS$/',
326
349
  SubDirectory => { TagTable => 'Image::ExifTool::Samsung::Trailer' },
350
+ }, {
351
+ Name => 'Vivo',
352
+ Condition => '$$valPt =~ /^(streamdata|vivo\{")/',
353
+ SubDirectory => { TagTable => 'Image::ExifTool::Vivo::Main' },
327
354
  }, {
328
355
  Name => 'EmbeddedVideo',
329
356
  Notes => 'extracted only when ExtractEmbedded option is used',
@@ -768,7 +795,7 @@ segments are included in the Image::ExifTool module itself.
768
795
 
769
796
  =head1 AUTHOR
770
797
 
771
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
798
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
772
799
 
773
800
  This library is free software; you can redistribute it and/or modify it
774
801
  under the same terms as Perl itself.
@@ -2590,7 +2590,7 @@ estimated JPEG quality if requested.
2590
2590
 
2591
2591
  =head1 AUTHOR
2592
2592
 
2593
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
2593
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
2594
2594
 
2595
2595
  This library is free software; you can redistribute it and/or modify it
2596
2596
  under the same terms as Perl itself.
@@ -183,7 +183,7 @@ information from JSON files.
183
183
 
184
184
  =head1 AUTHOR
185
185
 
186
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
186
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
187
187
 
188
188
  This library is free software; you can redistribute it and/or modify it
189
189
  under the same terms as Perl itself.
@@ -117,7 +117,7 @@ notes.
117
117
 
118
118
  =head1 AUTHOR
119
119
 
120
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
120
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
121
121
 
122
122
  This library is free software; you can redistribute it and/or modify it
123
123
  under the same terms as Perl itself.
@@ -16,7 +16,7 @@ use strict;
16
16
  use vars qw($VERSION);
17
17
  use Image::ExifTool qw(:DataAccess :Utils);
18
18
 
19
- $VERSION = '1.41';
19
+ $VERSION = '1.43';
20
20
 
21
21
  sub ProcessJpeg2000Box($$$);
22
22
  sub ProcessJUMD($$$);
@@ -631,6 +631,7 @@ my %j2cMarker = (
631
631
  %Image::ExifTool::Jpeg2000::ColorSpec = (
632
632
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
633
633
  WRITE_PROC => \&Image::ExifTool::WriteBinaryData, # (we don't actually call this)
634
+ CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
634
635
  GROUPS => { 2 => 'Image' },
635
636
  FORMAT => 'int8s',
636
637
  WRITABLE => 1,
@@ -866,8 +867,8 @@ sub BrotliWarn($$;$)
866
867
  {
867
868
  my ($et, $type, $uncompress) = @_;
868
869
  my ($enc, $mod) = $uncompress ? qw(decoding Uncompress) : qw(encoding Compress);
869
- $et->WarnOnce("Error $enc '${type}' brob box");
870
- $et->WarnOnce("Try updating to IO::${mod}::Brotli 0.004 or later");
870
+ $et->Warn("Error $enc '${type}' brob box");
871
+ $et->Warn("Try updating to IO::${mod}::Brotli 0.004 or later");
871
872
  }
872
873
 
873
874
  #------------------------------------------------------------------------------
@@ -933,7 +934,7 @@ sub CreateNewBoxes($$)
933
934
  $tag = 'brob';
934
935
  }
935
936
  } else {
936
- $et->WarnOnce('Install IO::Compress::Brotli to create Brotli-compressed metadata');
937
+ $et->Warn('Install IO::Compress::Brotli to create Brotli-compressed metadata');
937
938
  }
938
939
  }
939
940
  my $boxhdr = pack('N', length($newdir) + length($pad) + 8) . $tag;
@@ -1285,7 +1286,7 @@ sub ProcessJpeg2000Box($$$)
1285
1286
  ++$$et{CHANGED};
1286
1287
  }
1287
1288
  } else {
1288
- $et->WarnOnce('Install IO::Compress::Brotli to write Brotli-compressed metadata');
1289
+ $et->Warn('Install IO::Compress::Brotli to write Brotli-compressed metadata');
1289
1290
  }
1290
1291
  } elsif (not $compress and $boxID eq 'brob') {
1291
1292
  # (in this case, ProcessBrotli has returned uncompressed data,
@@ -1338,7 +1339,7 @@ sub ProcessJpeg2000Box($$$)
1338
1339
  if (defined $val) {
1339
1340
  my $key = $et->FoundTag($tagInfo, $val);
1340
1341
  # save Rational value
1341
- $$et{RATIONAL}{$key} = $rational if defined $rational and defined $key;
1342
+ $$et{TAG_EXTRA}{$key}{Rational} = $rational if defined $rational and defined $key;
1342
1343
  }
1343
1344
  } elsif ($outfile) {
1344
1345
  my $boxhdr = pack('N', $boxLen + 8) . $boxID;
@@ -1410,7 +1411,7 @@ sub ProcessBrotli($$$)
1410
1411
  }
1411
1412
  if (eval { require IO::Uncompress::Brotli }) {
1412
1413
  if ($isWriting and not eval { require IO::Compress::Brotli }) {
1413
- $et->WarnOnce('Install IO::Compress::Brotli to write Brotli-compressed metadata');
1414
+ $et->Warn('Install IO::Compress::Brotli to write Brotli-compressed metadata');
1414
1415
  return undef;
1415
1416
  }
1416
1417
  my $compress = $et->Options('Compress');
@@ -1455,7 +1456,7 @@ sub ProcessBrotli($$$)
1455
1456
  return $type . $dat;
1456
1457
  }
1457
1458
  } else {
1458
- $et->WarnOnce('Install IO::Uncompress::Brotli to decode Brotli-compressed metadata');
1459
+ $et->Warn('Install IO::Uncompress::Brotli to decode Brotli-compressed metadata');
1459
1460
  return undef if $isWriting;
1460
1461
  }
1461
1462
  return 1;
@@ -1670,7 +1671,7 @@ files.
1670
1671
 
1671
1672
  =head1 AUTHOR
1672
1673
 
1673
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
1674
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
1674
1675
 
1675
1676
  This library is free software; you can redistribute it and/or modify it
1676
1677
  under the same terms as Perl itself.
@@ -3252,7 +3252,7 @@ interpret Kodak maker notes EXIF meta information.
3252
3252
 
3253
3253
  =head1 AUTHOR
3254
3254
 
3255
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
3255
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
3256
3256
 
3257
3257
  This library is free software; you can redistribute it and/or modify it
3258
3258
  under the same terms as Perl itself.
@@ -152,7 +152,7 @@ meta information from Kyocera Contax N Digital RAW images.
152
152
 
153
153
  =head1 AUTHOR
154
154
 
155
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
155
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
156
156
 
157
157
  This library is free software; you can redistribute it and/or modify it
158
158
  under the same terms as Perl itself.
@@ -147,7 +147,7 @@ metadata from Leica Image File (LIF) images.
147
147
 
148
148
  =head1 AUTHOR
149
149
 
150
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
150
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
151
151
 
152
152
  This library is free software; you can redistribute it and/or modify it
153
153
  under the same terms as Perl itself.
@@ -650,7 +650,7 @@ sub ProcessLNK($$)
650
650
  my $mask = 0x04 << $i;
651
651
  next unless $flags & $mask;
652
652
  $raf->Read($buff, 2) or return 1;
653
- $len = unpack('v', $buff);
653
+ $len = unpack('v', $buff) or next;
654
654
  $len *= 2 if $flags & 0x80; # characters are 2 bytes if Unicode flag is set
655
655
  $raf->Read($buff, $len) or return 1;
656
656
  my $val;
@@ -703,7 +703,7 @@ information MS Shell Link (Windows shortcut) files.
703
703
 
704
704
  =head1 AUTHOR
705
705
 
706
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
706
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
707
707
 
708
708
  This library is free software; you can redistribute it and/or modify it
709
709
  under the same terms as Perl itself.
@@ -1570,7 +1570,7 @@ and values.
1570
1570
 
1571
1571
  =head1 AUTHOR
1572
1572
 
1573
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
1573
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
1574
1574
 
1575
1575
  This library is free software; you can redistribute it and/or modify it
1576
1576
  under the same terms as Perl itself.
@@ -8702,7 +8702,7 @@ and values.
8702
8702
 
8703
8703
  =head1 AUTHOR
8704
8704
 
8705
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
8705
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
8706
8706
 
8707
8707
  This library is free software; you can redistribute it and/or modify it
8708
8708
  under the same terms as Perl itself.
@@ -989,7 +989,7 @@ and values.
989
989
 
990
990
  =head1 AUTHOR
991
991
 
992
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
992
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
993
993
 
994
994
  This library is free software; you can redistribute it and/or modify it
995
995
  under the same terms as Perl itself.
@@ -1032,7 +1032,7 @@ and values.
1032
1032
 
1033
1033
  =head1 AUTHOR
1034
1034
 
1035
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
1035
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
1036
1036
 
1037
1037
  This library is free software; you can redistribute it and/or modify it
1038
1038
  under the same terms as Perl itself.