Exiv2 / exiv2

Image metadata library and tools
http://www.exiv2.org/
Other
887 stars 279 forks source link

Unit test test_issue_1959.py fails when run on a system whose UTC offset is nonzero #2083

Closed mallman closed 2 years ago

mallman commented 2 years ago
Describe the bug

Unit test test_issue_1959.py fails when run on a system whose UTC offset is nonzero. For example, this test fails on my system, where the time zone is set to Pacific Standard Time. However, the failure is simply a result of the test expecting exiv2 to run with a UTC offset of zero.

To Reproduce

Steps to reproduce the behavior:

Run ctest on a machine with a time zone which has a nonzero offset from UTC.

Expected behavior

Test test_issue_1959 passes.

Desktop (please complete the following information):
Additional context

While I don't know if this is the "best" or "correct" solution to this issue, I was able to fix it by modifying the command in https://github.com/Exiv2/exiv2/blob/8505f4d9350ce84e7a775330911874889bc05efe/tests/bugfixes/github/test_issue_1959.py#L18

to

TZ=UTC $exiv2 -Pkvt $filename

Unless I hear otherwise, I will submit a PR with this change. Cheers.

mallman commented 2 years ago

I've submitted PR #2084 to address this issue.

clanmills commented 2 years ago

@mallman Can you run the test as follows and send me your output please. Here's what I get in England (GMT, UTC):

676 rmills@rmillsm1:~/gnu/github/exiv2/main/build $ exiv2 --version | head -1
exiv2 1.0.0.9
677 rmills@rmillsm1:~/gnu/github/exiv2/main/build $ (cd ../tests ; python3 runner.py bugfixes/github/test_issue_1959.py)
.
----------------------------------------------------------------------
Ran 1 test in 0.050s

OK
678 rmills@rmillsm1:~/gnu/github/exiv2/main/build $ 
mallman commented 2 years ago

Here you go!

[msa@hoodoo build]$ exiv2 --version | head -1
exiv2 1.0.0.9
[msa@hoodoo build]$ (cd ../tests ; python3 runner.py bugfixes/github/test_issue_1959.py)
F
======================================================================
FAIL: test_run (test_issue_1959.XmpIptcStandardsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/msa/coad/ImageMetadata/exiv2/tests/system_tests.py", line 653, in test_run
    self.compare_stdout(i, command, processed_stdout, stdout)
  File "/Users/msa/coad/ImageMetadata/exiv2/tests/system_tests.py", line 766, in compare_stdout
    self._compare_output(
  File "/Users/msa/coad/ImageMetadata/exiv2/tests/system_tests.py", line 745, in _compare_output
    self.assertMultiLineEqual(
AssertionError: 'Exif[794 chars]:04 01:41:01  2022:01:04 01:41:01\nIptc.Applic[56526 chars]gs\n' != 'Exif[794 chars]:04 09:41:01  2022:01:04 09:41:01\nIptc.Applic[56526 chars]gs\n'
  Exif.Image.YCbCrPositioning                   1  Centered
  Exif.Image.XResolution                        72/1  72
  Exif.Image.YResolution                        72/1  72
  Exif.Image.ResolutionUnit                     2  inch
  Exif.Image.ImageDescription                   Test file for the IPTC XMP tags  Test file for the IPTC XMP tags
  Exif.Image.Artist                             postscript-dev  postscript-dev
  Exif.Image.Copyright                          Copyright Exiv2  Copyright Exiv2
  Exif.Photo.ExifVersion                        48 50 51 50  2.32
  Exif.Photo.FlashpixVersion                    48 49 48 48  1.00
  Exif.Photo.ColorSpace                         65535  Uncalibrated
  Exif.Photo.ComponentsConfiguration            1  Y
- Exif.Photo.DateTimeOriginal                   2022:01:04 01:41:01  2022:01:04 01:41:01
?                                                           ^                    ^
+ Exif.Photo.DateTimeOriginal                   2022:01:04 09:41:01  2022:01:04 09:41:01
?                                                           ^                    ^
  Iptc.Application2.ObjectName                  Test IPTC XMP file  Test IPTC XMP file
  Iptc.Envelope.CharacterSet                    G  G
  Iptc.Application2.Keywords                    Test  Test
  Iptc.Application2.SubLocation                 Test Sublocation  Test Sublocation
  Iptc.Application2.SpecialInstructions         Test Instructions  Test Instructions
  Iptc.Application2.DateCreated                 2022-01-04  2022-01-04
  Iptc.Application2.Byline                      postscript-dev  postscript-dev
  Iptc.Application2.BylineTitle                 Test Creator's Job Title  Test Creator's Job Title
  Iptc.Application2.City                        Test City  Test City
  Iptc.Application2.ProvinceState               Test Province/State)  Test Province/State)
  Iptc.Application2.CountryCode                 GBR  GBR
  Iptc.Application2.CountryName                 Test Country  Test Country
  Iptc.Application2.TransmissionReference       Test Job ID  Test Job ID
  Iptc.Application2.Headline                    Test Headline  Test Headline
  Iptc.Application2.Credit                      Test Credit Line  Test Credit Line
  Iptc.Application2.Source                      Test Source  Test Source
  Iptc.Application2.Copyright                   Copyright Exiv2  Copyright Exiv2
  Iptc.Application2.Caption                     Test file for the IPTC XMP tags  Test file for the IPTC XMP tags
  Iptc.Application2.Writer                      Test Name  Test Name
  Xmp.iptc.IntellectualGenre                    Test Genre  Test Genre
  Xmp.iptc.Location                             Test Sublocation  Test Sublocation
  Xmp.iptc.CountryCode                          GBR  GBR
  Xmp.iptc.AltTextAccessibility                 lang="x-default" Alternative text description for accessibility  lang="x-default" Alternative text description for accessibility
  Xmp.iptc.CreatorContactInfo                   type="Struct"
  Xmp.iptc.CreatorContactInfo/Iptc4xmpCore:CiAdrCity  Test Creator's City  Test Creator's City
  Xmp.iptc.CreatorContactInfo/Iptc4xmpCore:CiAdrCtry  Test Creator's Country  Test Creator's Country
  Xmp.iptc.CreatorContactInfo/Iptc4xmpCore:CiAdrExtadr  Test Creator's Address  Test Creator's Address
  Xmp.iptc.CreatorContactInfo/Iptc4xmpCore:CiAdrPcode  TE5 5ST  TE5 5ST
  Xmp.iptc.CreatorContactInfo/Iptc4xmpCore:CiAdrRegion  Test Creator's Address Region  Test Creator's Address Region
  Xmp.iptc.CreatorContactInfo/Iptc4xmpCore:CiEmailWork  ciworkemail_aweoi4mg02349m@example.com  ciworkemail_aweoi4mg02349m@example.com
  Xmp.iptc.CreatorContactInfo/Iptc4xmpCore:CiTelWork  +1 (123) 456789  +1 (123) 456789
  Xmp.iptc.CreatorContactInfo/Iptc4xmpCore:CiUrlWork  http://www.example.com/workurl/3w94kjngi9mn50gj0mg34jire  http://www.example.com/workurl/3w94kjngi9mn50gj0mg34jire
  Xmp.iptc.ExtDescrAccessibility                lang="x-default" Test Extended Accessibility Description  lang="x-default" Test Extended Accessibility Description
  Xmp.iptc.Scene                                010100, 010200, 010300, 010400, 010500, 010600, 010700, 010800, 010900, 011000, 011100, 011200, 011300, 011400, 011500, 011600, 011700, 011800, 011900, 012000, 012100, 012200, 012300, 012400, 900000  Headshot, Half-length, Full-length, Profile, rear view, Single, Couple, Two, Group, General view, Panoramic view, Aerial view, Under-water, Night scene, Satellite, Exterior view, Interior view, Close-up, Action, Performing, Posing, Symbolic, Off-beat, Movie scene, (900000)
  Xmp.iptc.SubjectCode                          01000000, 01001000, 01002000, 01003000, 01004000, 01005000, 01005001, 01006000, 01007000, 01007001, 01008000, 01009000, 01010000, 01010001, 01010002, 01011000, 01011001, 01011002, 01011003, 01011004, 01011005, 01011006, 01011007, 01012000, 01013000, 01014000, 01015000, 01015001, 01016000, 01016001, 01017000, 01017001, 01018000, 01018001, 01019000, 01020000, 01021000, 01021001, 01022000, 01022001, 01023000, 01024000, 01025000, 01026000, 01026001, 01026002, 01026003, 01026004, 01027000, 01028000, 02000000, 02001000, 02001001, 02001002, 02001003, 02001004, 02001005, 02001006, 02001007, 02001008, 02001009, 02001010, 02002000, 02002001, 02002002, 02002003, 02003000, 02003001, 02003002, 02003003, 02004000, 02004001, 02004002, 02005000, 02006000, 02006001, 02006002, 02007000, 02007001, 02008000, 02008001, 02008002, 02008003, 02009000, 02009001, 02009002, 02010000, 02011000, 02011001, 02011002, 02012000, 02012001, 02012002, 02012003, 02012004, 02012005, 02012006, 02012007, 02013000, 02014000, 02015000, 02016000, 03000000, 03001000, 03002000, 03003000, 03004000, 03005000, 03006000, 03006001, 03007000, 03007001, 03008000, 03009000, 03010000, 03010001, 03010002, 03010003, 03010004, 03011000, 03012000, 03013000, 03014000, 03014001, 03015000, 03015001, 03015002, 03016000, 03017000, 04000000, 04001000, 04001001, 04001002, 04001003, 04001004, 04001005, 04001006, 04002000, 04002001, 04002002, 04002003, 04002004, 04002005, 04002006, 04002007, 04003000, 04003001, 04003002, 04003003, 04003004, 04003005, 04003006, 04003007, 04003008, 04003009, 04004000, 04004001, 04004002, 04004003, 04004004, 04004005, 04004006, 04004007, 04005000, 04005001, 04005002, 04005003, 04005004, 04005005, 04005006, 04005007, 04005008, 04005009, 04005010, 04005011, 04005012, 04005013, 04005014, 04006000, 04006001, 04006002, 04006003, 04006004, 04006005, 04006006, 04006007, 04006008, 04006009, 04006010, 04006011, 04006012, 04006013, 04006014, 04006015, 04006016, 04006017, 04006018, 04006019, 04006020, 04006021, 04006022, 04007000, 04007001, 04007002, 04007003, 04007004, 04007005, 04007006, 04007007, 04007008, 04007009, 04007010, 04007011, 04007012, 04008000, 04008001, 04008002, 04008003, 04008004, 04008005, 04008006, 04008007, 04008008, 04008009, 04008010, 04008011, 04008012, 04008013, 04008014, 04008015, 04008016, 04008017, 04008018, 04008019, 04008020, 04008021, 04008022, 04008023, 04008024, 04008025, 04008026, 04008027, 04008028, 04008029, 04008030, 04008031, 04008032, 04008033, 04008034, 04008035, 04008036, 04009000, 04009001, 04009002, 04009003, 04009004, 04010000, 04010001, 04010002, 04010003, 04010004, 04010005, 04010006, 04010007, 04010008, 04010009, 04010010, 04010011, 04011000, 04011001, 04011002, 04011003, 04011004, 04011005, 04011006, 04011007, 04011008, 04011009, 04012000, 04012001, 04012002, 04012003, 04012004, 04012005, 04013000, 04013001, 04013002, 04013003, 04013004, 04013005, 04013006, 04013007, 04013008, 04014000, 04014001, 04014002, 04014003, 04014004, 04014005, 04015000, 04015001, 04015002, 04015003, 04015004, 04016000, 04016001, 04016002, 04016003, 04016004, 04016005, 04016006, 04016007, 04016008, 04016009, 04016010, 04016011, 04016012, 04016013, 04016014, 04016015, 04016016, 04016017, 04016018, 04016019, 04016020, 04016021, 04016022, 04016023, 04016024, 04016025, 04016026, 04016027, 04016028, 04016029, 04016030, 04016031, 04016032, 04016033, 04016034, 04016035, 04016036, 04016037, 04016038, 04016039, 04016040, 04016041, 04016042, 04016043, 04016044, 04016045, 04016046, 04016047, 04016048, 04016049, 04016050, 04016051, 04016052, 04016053, 04016054, 04016055, 04016056, 04016057, 04017000, 04017001, 04018000, 04018001, 04019000, 04019001, 05000000, 05001000, 05002000, 05003000, 05004000, 05005000, 05005001, 05005002, 05005003, 05006000, 05007000, 05008000, 05009000, 05010000, 05010001, 05010002, 05010003, 05010004, 05011000, 05011001, 05011002, 05011003, 05011004, 06000000, 06001000, 06002000, 06002001, 06002002, 06003000, 06004000, 06005000, 06005001, 06005002, 06006000, 06006001, 06006002, 06006003, 06006004, 06006005, 06006006, 06006007, 06006008, 06006009, 06007000, 06007001, 06008000, 06009000, 06010000, 06011000, 06012000, 06013000, 07000000, 07001000, 07001001, 07001002, 07001003, 07001004, 07001005, 07001006, 07001007, 07001008, 07001009, 07002000, 07003000, 07003001, 07003002, 07003003, 07003004, 07003005, 07004000, 07005000, 07006000, 07006001, 07006002, 07007000, 07007001, 07007002, 07007003, 07007004, 07008000, 07008001, 07009000, 07010000, 07011000, 07011001, 07011002, 07012000, 07013000, 07013001, 07014000, 07014001, 07014002, 07014003, 07014004, 07014005, 07015000, 07016000, 07017000, 07017001, 07017002, 07017003, 07018000, 07019000, 08000000, 08001000, 08002000, 08003000, 08003001, 08003002, 08003003, 08003004, 08003005, 08004000, 08005000, 08005001, 08005002, 08005003, 08005004, 08005005, 08006000, 08006001, 08007000, 08008000, 09000000, 09001000, 09002000, 09002001, 09002002, 09002003, 09003000, 09003001, 09003002, 09003003, 09003004, 09004000, 09005000, 09006000, 09007000, 09008000, 09009000, 09010000, 09011000, 09011001, 09011002, 09012000, 09013000, 09014000, 09015000, 09016000, 10000000, 10001000, 10001001, 10001002, 10001003, 10001004, 10002000, 10003000, 10003001, 10004000, 10004001, 10004002, 10004003, 10005000, 10006000, 10007000, 10007001, 10008000, 10009000, 10010000, 10011000, 10012000, 10013000, 10014000, 10015000, 10016000, 10017000, 10018000, 11000000, 11001000, 11001001, 11001002, 11001003, 11001004, 11001005, 11001006, 11001007, 11001008, 11001009, 11002000, 11002001, 11002002, 11002003, 11002004, 11003000, 11003001, 11003002, 11003003, 11003004, 11003005, 11003006, 11003007, 11003008, 11003009, 11003010, 11004000, 11005000, 11005001, 11006000, 11006001, 11006002, 11006003, 11006004, 11006005, 11006006, 11006007, 11006008, 11006009, 11006010, 11006011, 11006012, 11006013, 11007000, 11008000, 11009000, 11009001, 11009002, 11010000, 11010001, 11011000, 11012000, 11013000, 11013001, 11014000, 11014001, 11014002, 11014003, 11015000, 11016000, 11016001, 11016002, 11016003, 11016004, 11016005, 11016006, 11016007, 11017000, 11018000, 11019000, 11020000, 11021000, 11022000, 11023000, 11024000, 11024001, 11024002, 11024003, 11025000, 11026000, 11027000, 11028000, 12000000, 12001000, 12002000, 12002001, 12002002, 12003000, 12004000, 12004001, 12004002, 12004003, 12004004, 12004005, 12005000, 12005001, 12006000, 12006001, 12006002, 12007000, 12008000, 12009000, 12009001, 12009002, 12009003, 12009004, 12009005, 12009006, 12009007, 12009009, 12009010, 12009011, 12009012, 12009013, 12010000, 12011000, 12012000, 12013000, 12014000, 12014001, 12014002, 12014003, 12014004, 12014005, 12015000, 12015001, 12016000, 12017000, 12018000, 12019000, 12020000, 12021000, 12022000, 12023000, 12023001, 12023002, 12023003, 12024000, 12025000, 12025001, 12025002, 12025004, 12026000, 12027000, 13000000, 13001000, 13001001, 13001002, 13001003, 13001004, 13002000, 13002001, 13003000, 13003001, 13003002, 13003003, 13003004, 13003005, 13004000, 13004001, 13004002, 13004003, 13004004, 13004005, 13004006, 13004007, 13004008, 13005000, 13006000, 13006001, 13007000, 13008000, 13009000, 13010000, 13010001, 13010002, 13011000, 13012000, 13013000, 13014000, 13015000, 13016000, 13017000, 13018000, 13019000, 13020000, 13021000, 13022000, 13023000, 14000000, 14001000, 14002000, 14003000, 14003001, 14003002, 14003003, 14003004, 14004000, 14005000, 14005001, 14006000, 14006001, 14006002, 14006003, 14006004, 14006005, 14006006, 14007000, 14008000, 14009000, 14010000, 14010001, 14010002, 14011000, 14012000, 14013000, 14014000, 14015000, 14016000, 14017000, 14017001, 14018000, 14019000, 14020000, 14021000, 14022000, 14023000, 14024000, 14024001, 14024002, 14024003, 14024004, 14024005, 14025000, 14025001, 14025002, 14025003, 14025004, 14025005, 14026000, 14027000, 15000000, 15001000, 15001001, 15001002, 15002000, 15002001, 15002002, 15002003, 15002004, 15002005, 15003000, 15003001, 15003002, 15003003, 15004000, 15004001, 15004002, 15005000, 15005001, 15005002, 15005003, 15005004, 15005005, 15005006, 15005007, 15005008, 15005009, 15005010, 15005011, 15005012, 15005013, 15005014, 15005015, 15005016, 15005017, 15005018, 15005019, 15005020, 15005021, 15005022, 15005023, 15005024, 15005025, 15005026, 15005027, 15005028, 15005029, 15005030, 15005031, 15005032, 15005033, 15005034, 15005035, 15005036, 15005037, 15005038, 15005039, 15005040, 15005041, 15005042, 15005043, 15005044, 15005045, 15005046, 15005047, 15005048, 15005049, 15005050, 15005051, 15005052, 15005053, 15005054, 15005055, 15005056, 15005057, 15005058, 15005059, 15005060, 15005061, 15005062, 15005063, 15005064, 15005065, 15005066, 15005067, 15005068, 15005069, 15006000, 15007000, 15007001, 15007002, 15007003, 15007004, 15007005, 15007006, 15008000, 15008001, 15008002, 15008003, 15008004, 15008005, 15009000, 15009001, 15009002, 15009003, 15009004, 15009005, 15009006, 15010000, 15010001, 15010002, 15010003, 15010004, 15010005, 15010006, 15011000, 15011001, 15011002, 15012000, 15013000, 15014000, 15014001, 15014002, 15014003, 15014004, 15014005, 15014006, 15014007, 15014008, 15014009, 15014010, 15014011, 15014012, 15014013, 15014014, 15014015, 15014016, 15014017, 15014018, 15014019, 15014020, 15014021, 15014022, 15014023, 15014024, 15015000, 15015001, 15015002, 15015003, 15015004, 15015005, 15015006, 15015007, 15015008, 15015009, 15015010, 15015011, 15015012, 15016000, 15016001, 15016002, 15017000, 15018000, 15018001, 15019000, 15019001, 15019002, 15019003, 15019004, 15019005, 15019006, 15019007, 15019008, 15019009, 15019010, 15019011, 15019012, 15019013, 15019014, 15019015, 15019016, 15019017, 15019018, 15019019, 15019020, 15019021, 15020000, 15021000, 15021001, 15021002, 15021003, 15021004, 15021005, 15021006, 15022000, 15022001, 15022002, 15022003, 15022004, 15023000, 15023001, 15023002, 15023003, 15024000, 15024001, 15025000, 15025001, 15025002, 15025003, 15026000, 15026001, 15026002, 15026003, 15027000, 15028000, 15028001, 15028002, 15028003, 15028004, 15028005, 15028006, 15028007, 15028008, 15028009, 15028010, 15028011, 15028012, 15028013, 15028014, 15028015, 15029000, 15030000, 15030001, 15030002, 15030003, 15030004, 15031000, 15031001, 15031002, 15032000, 15032001, 15032002, 15032003, 15032004, 15032005, 15032006, 15032007, 15032008, 15032009, 15032010, 15032011, 15032012, 15033000, 15033001, 15033002, 15033003, 15033004, 15033005, 15033006, 15033007, 15034000, 15034001, 15034002, 15035000, 15036000, 15036001, 15036002, 15037000, 15038000, 15038001, 15038002, 15038003, 15038004, 15038005, 15039000, 15039001, 15039002, 15039003, 15039004, 15039005, 15039006, 15039007, 15039008, 15040000, 15040001, 15040002, 15040003, 15041000, 15041001, 15041002, 15041003, 15041004, 15041005, 15041006, 15041007, 15041008, 15041009, 15041010, 15041011, 15041012, 15041013, 15041014, 15042000, 15043000, 15043001, 15043002, 15043003, 15043004, 15043005, 15043006, 15043007, 15043008, 15043009, 15043010, 15043011, 15043012, 15043013, 15043014, 15043015, 15043016, 15043017, 15044000, 15044001, 15045000, 15046000, 15046001, 15046002, 15047000, 15047001, 15047002, 15047003, 15047004, 15047005, 15047006, 15047007, 15048000, 15049000, 15049001, 15050000, 15050001, 15050002, 15050003, 15050004, 15050005, 15050006, 15050007, 15050008, 15050009, 15050010, 15050011, 15050012, 15050013, 15050014, 15050015, 15050016, 15051000, 15051001, 15051002, 15051003, 15051004, 15051005, 15051006, 15051007, 15051008, 15051009, 15051010, 15051011, 15051012, 15052000, 15052001, 15052002, 15052003, 15053000, 15053001, 15053002, 15054000, 15055000, 15056000, 15056001, 15056002, 15056003, 15056004, 15056005, 15056006, 15056007, 15056008, 15056009, 15056010, 15056011, 15056012, 15056013, 15056014, 15057000, 15058000, 15058001, 15058002, 15058003, 15058004, 15058005, 15059000, 15060000, 15061000, 15062000, 15062001, 15062002, 15062003, 15062004, 15062005, 15062006, 15062007, 15062008, 15062009, 15062010, 15062011, 15062012, 15062013, 15062014, 15062015, 15062016, 15062017, 15062018, 15062019, 15062020, 15062021, 15062022, 15062023, 15062024, 15062025, 15062026, 15063000, 15064000, 15064001, 15064002, 15064003, 15064004, 15064005, 15064006, 15064007, 15064008, 15065000, 15065001, 15066000, 15066001, 15066002, 15066003, 15067000, 15067001, 15068000, 15069000, 15069001, 15069002, 15069003, 15069004, 15070000, 15070001, 15070002, 15070003, 15070004, 15070005, 15070006, 15070007, 15070008, 15070009, 15070010, 15070011, 15070012, 15070013, 15070014, 15070015, 15070016, 15071000, 15071001, 15071002, 15071003, 15071004, 15072000, 15072001, 15072002, 15072003, 15072004, 15072005, 15072006, 15072007, 15072008, 15072009, 15072010, 15072011, 15072012, 15073000, 15073001, 15073002, 15073003, 15073004, 15073005, 15073006, 15073007, 15073008, 15073009, 15073010, 15073011, 15073012, 15073013, 15073014, 15073015, 15073016, 15073017, 15073018, 15073019, 15073020, 15073021, 15073022, 15073023, 15073024, 15073025, 15073026, 15073027, 15073028, 15073029, 15073030, 15073031, 15073032, 15073033, 15073034, 15073035, 15073036, 15073037, 15073038, 15073039, 15073040, 15073041, 15073042, 15073043, 15073044, 15073045, 15073046, 15073047, 15074000, 15074001, 15074002, 15074003, 15074004, 15074005, 15074006, 15074007, 15075000, 15076000, 15077000, 15077001, 15077002, 15077003, 15077004, 15077005, 15077006, 15077007, 15077008, 15077009, 15077010, 15078000, 15079000, 15080000, 15081000, 15082000, 15082001, 15082002, 15083000, 15084000, 15085000, 15086000, 15087000, 15088000, 15089000, 15090000, 15091000, 15092000, 15093000, 15094000, 15095000, 15096000, 15097000, 15098000, 15099000, 15100000, 15101000, 15102000, 15103000, 16000000, 16001000, 16002000, 16003000, 16003001, 16003002, 16003003, 16003004, 16003005, 16004000, 16005000, 16005001, 16005002, 16006000, 16006001, 16007000, 16008000, 16009000, 16009001, 16009002, 16009003, 16010000, 16010001, 16011000, 16012000, 17000000, 17001000, 17002000, 17003000, 17003001, 17004000, 17005000  arts, culture and entertainment, archaeology, architecture, bullfighting, festive event (including carnival), cinema, film festival, dance, fashion, jewelry, language, library and museum, literature, fiction, poetry, music, classical music, folk music, jazz music, popular music, country music, rock and roll music, hip-hop, painting, photography, radio, sculpture, plastic art, television, soap opera, theatre, music theatre, monument and heritage site, institution-DEPRECATED, customs and tradition, arts (general), entertainment (general), entertainment award, culture (general), cultural development, nightclub, cartoon, animation, mass media, periodicals, news media, newspapers, reviews, internet, history, crime, law and justice, crime, homicide, computer crime, theft, drug trafficking, sexual assault, assault (general), kidnapping, arson, gang activity, terrorism, judiciary (system of justice), lawyer, judge, court administration, police, law enforcement, investigation, arrest, punishment, fine, execution, prison, laws, criminal, civil, justice and rights, civil rights, trials, litigation, arbitration, court preliminary, prosecution, defendant, witness, organized crime, international law, international court or tribunal, extradition, corporate crime, fraud, embezzlement, restraint of trade, breach of contract, anti-trust crime, corruption, bribery, war crime, inquest, inquiry, tribunal, disaster and accident, drought, earthquake, famine, fire, flood, industrial accident, structural failures, meteorological disaster, windstorms, nuclear accident, pollution, transport accident, road accident, railway accident, air and space accident, maritime accident, volcanic eruption, relief and aid organisation, accident (general), emergency incident, explosion, disaster (general), natural disasters, avalanche/landslide, emergency planning, rescue, economy, business and finance, agriculture, arable farming, fishing industry, forestry and timber, livestock farming, viniculture, aquaculture, chemicals, biotechnology, fertiliser, health and beauty product, inorganic chemical, organic chemical, pharmaceutical, synthetic and plastic, computing and information technology, hardware, networking, satellite technology, semiconductors and active components, software, telecommunication equipment, telecommunication service, security, wireless technology, construction and property, heavy construction, house building, real estate, farms, land price, renovation, design and engineering, energy and resource, alternative energy, coal, oil and gas - downstream activities, oil and gas - upstream activities, nuclear power, electricity production and distribution, waste management and pollution control, water supply, natural resources (general), energy (general), natural gas, petrol, diesel fuel, kerosene/paraffin, financial and business service, accountancy and auditing, banking, consultancy service, employment agency, healthcare provider, insurance, legal service, market research, stock broking, personal investing, market trend, shipping service, personal service, janitorial service, funeral parlour and crematorium, rental service, wedding service, personal finance, personal income, auction service, printing/promotional service, investment service, consumer goods, clothing, department store, food, mail order, retail, speciality store, wholesale, beverage, electronic commerce, luxury good, non-durable good, toy, macro economics, central bank, consumer issue, debt market, economic indicator, emerging market, foreign exchange market, government aid, government debt, interest rate, international economic institution, international (foreign) trade, loan market, economic organization, consumer confidence, trade dispute, inflation and deflation, prices, currency values, budgets and budgeting, credit and debt, loans, mortgages, financial markets, commodity markets, investments, stocks, bonds, mutual funds, derivative securities, imports, exports, trade agreements, trade policy, business enterprises, tariff, trade balance, market and exchange, energy, metal, securities, soft commodity, media, advertising, book, cinema industry, news agency, newspaper and magazine, online, public relation, radio industry, satellite and cable service, television industry, music industry, manufacturing and engineering, aerospace, automotive equipment, defence equipment, electrical appliance, heavy engineering, industrial component, instrument engineering, shipbuilding, machine manufacturing, metal and mineral, building material, gold and precious material, iron and steel, non ferrous metal, mining, process industry, distiller and brewer, food, furnishings and furniture, paper and packaging product, rubber product, soft drinks, textile and clothing, tobacco, tourism and leisure, casino and gambling, hotel and accommodation, recreational and sporting goods, restaurant and catering, tour operator, transport, air transport, railway, road transport, waterway and maritime transport, company information, accounting and audit, annual and special corporate meeting, annual report, antitrust issue, merger, acquisition and takeover, analysts' comment, bankruptcy, board of directors (appointment and change), buyback, C.E.O. interview, corporate officer, corporate profile, contract, defence contract, dividend announcement, earnings forecast, financially distressed company, earnings, financing and stock offering, government contract, global expansion, insider trading, joint venture, leveraged buyout, layoffs and downsizing, licensing agreement, litigation and regulation, management change, marketing, new product, patent, copyright and trademark, plant closing, plant opening, privatisation, proxy filing, rating, research and development, quarterly or semiannual financial statement, restructuring and recapitalisation, spin-off, stock activity, industrial production, productivity, inventories, sales, corporations, shareholders, corporate performance, losses, credit ratings, stock splits, stock options, recalls (products), globalization, consumers, purchase, new service, economy (general), economic policy, business (general), institution, finance (general), money and monetary policy, education, adult education, further education, parent organisation, preschool, school, elementary schools, middle schools, high schools, teachers union, university, upbringing, entrance examination, teaching and learning, students, teachers, curriculum, test/examination, religious education, parochial school, seminary, yeshiva, madrasa, environmental issue, renewable energy, conservation, endangered species, ecosystem, energy saving, environmental politics, environmental pollution, air pollution, water pollution, natural resources, land resources, parks, forests, wetlands, mountains, rivers, oceans, wildlife, energy resources, nature, invasive species, population, waste, water, global warming, hazardous materials, environmental cleanup, health, disease, communicable diseases, virus diseases, AIDS, cancer, heart disease, alzheimer's disease, animal diseases, plant diseases, retrovirus, epidemic and plague, health treatment, prescription drugs, dietary supplements, diet, medical procedure/test, therapy, health organisations, medical research, medical staff, primary care physician, health-workers union, medicine, herbal, holistic, western, traditional Chinese, preventative medicine, vaccines, injury, hospital and clinic, government health care, medicare, medicaid, private health care, healthcare policy, food safety, medical specialisation, geriatric, pediatrics, reproduction, genetics, obstetrics/gynecology, medical service, physical fitness, illness, mental illness, eating disorder, obesity, medical conditions, patient, human interest, animal, curiosity, people, advice, celebrity, accomplishment, human mishap, fortune-telling, mystery, society, ceremony, death, funeral, estate bestowal, memorial, award and prize, record, imperial and royal matters, plant, labour, apprentices, collective contract, contract issue-wages, contract issue-healthcare, contract issue-work rules, employment, labor market, job layoffs, child labor, occupations, labour dispute, labour legislation, retirement, retraining, strike, unemployment, unions, wage and pension, employee benefits, social security, work relations, health and safety at work, advanced training, employer, employee, lifestyle and leisure, game, Go, chess, bridge, shogi, gaming and lottery, gastronomy, organic foods, hobby, DIY, shopping, gardening, holiday or vacation, tourism, travel and commuting, traffic, club and association, lifestyle (house and home), leisure (general), public holiday, hunting, fishing, auto trends, adventure, beauty, consumer issue, wedding, politics, defence, veterans affairs, national security, security measures, armed Forces, military equipment, firearms, biological and chemical weapons, missile systems, nuclear weapons, diplomacy, summit, international relations, peace negotiations, alliances, election, political candidates, political campaigns, campaign finance, national elections, regional elections, local elections, voting, poll, european elections, primary, espionage and intelligence, foreign aid, economic sanction, government, civil and public service, safety of citizens, think tank, national government, executive (government), heads of state, government departments, public officials, ministers (government), public employees, privatisation, nationalisation, impeachment, human rights, local authority, parliament, upper house, lower house, parties and movements, non government organizations (NGO), refugee, regional authority, state budget and tax, public finance, treaty and international organisation-DEPRECATED, international relations-DEPRECATED, peace negotiations-DEPRECATED, alliances-DEPRECATED, constitution, interior policy, data protection, housing and urban planning, pension and welfare, personal weapon control, indigenous people, personal data collection, planning inquiries, migration, citizens initiative and recall, referenda, nuclear policy, lobbying, regulatory policy and organisation, censorship, politics (general), political systems, democracy, political development, freedom of the press, freedom of religion, treaty, international organisation, religion and belief, cult and sect, belief (faith), unificationism, scientology, freemasonry, religion-DEPRECATED, christianity-DEPRECATED, islam-DEPRECATED, judaism-DEPRECATED, buddhism-DEPRECATED, hinduism-DEPRECATED, church (organisation)-DEPRECATED, religious facilities-DEPRECATED, values, ethics, corrupt practices, church and state relations, philosophy, christianity, protestant, lutheran, reformed, anglican, methodist, baptist, mennonite, mormon, roman catholic, old catholic, orthodoxy, salvation army, islam, judaism, buddhism, hinduism, religious festival or holiday, christmas, easter, pentecost, ramadan, yom kippur, religious leader, pope, nature religion, taoism, shintoism, sikhism, jainism, parsasm, confucianism, religious text, bible, qur'an, torah, interreligious dialogue, religious event, catholic convention, protestant convention, ritual, concordat, ecumenism, science and technology, applied science, physics, chemistry, cosmology, particle physics, engineering, material science, human science, social sciences, history, psychology, sociology, anthropology, natural science, geology, paleontology, geography, botany, zoology, physiology, astronomy, biology, philosophical science, research, survey, scientific exploration, space programme, science (general), technology (general), rocketry, laser, standards, animal science, micro science, marine science, weather science, electronics, identification technology, mathematics, biotechnology, agricultural research and technology, nanotechnology, IT/computer sciences, scientific institutions, social issue, addiction, charity, demographics, population and census, immigration, illegal immigrants, emigrants, disabled, euthanasia (also includes assisted suicide), suicide, family, parent and child, adoption, marriage, divorce, sex, courtship, family planning, health insurance, homelessness, minority group, gays and lesbians, national or ethnic minority, pornography, poverty, prostitution, racism, welfare, abortion, missing person, missing due to hostilities, long term care, juvenile delinquency, nuclear radiation victims, slavery, abusive behaviour, death and dying, people, children, infants, teen-agers, adults, senior citizens, social issues (general), social conditions, social problems, discrimination, social services, death penalty policies, ordnance clearance, reconstruction, sport, aero and aviation sport, parachuting, sky diving, alpine skiing, downhill, giant slalom, super G, slalom, combined, American football, (US) National Football League (NFL) (North American), CFL, AFL-DEPRECATED, archery, FITA / Outdoor target archery, crossbow shooting, athletics, track and field, 100 m, 200 m, 400 m, 800 m, 1000 m, 1500 m, mile, 2000 m, 3000 m, 5000 m, 10,000 m, 20 km, one hour, 25000, 30000, 110 m hurdles, 400 m hurdles, 3000 m steeplechase, high jump, pole vault, long jump, triple jump, shot put, discus throw, hammer throw, javelin throw, decathlon, 4x100 m, 4x200 m, 4x400 m, 4x800 m, 4x1500 m, walk 1 h, walk 2 h, 10 km walk, 15 km walk, 20 km walk, 30 km walk, 50 km walk, 100 m hurdles, 5 km walk, heptathlon, 1500 m walk, 2000 m walk, 3000 m walk, 50 m, 50 m hurdles, 50 yards, 50 yard hurdles, 60 m, 60 m hurdles, 60 yards, 60 yard hurdles, 100 yards, 100 yard hurdles, 300 m, 300 yards, 440 yards, 500 m, 500 yards, 600 m, 600 yards, 880 yards, 1000 yards, 2 miles, 3 miles, 6 miles, 4x1 mile, pentathlon, badminton, baseball, Major League Baseball (North American Professional) - American League, Major League Baseball (North American Professional) - National League, Major League Baseball (North American Professional) - Special (e.g. All-Star, World Series), rubberball baseball, Major League Baseball Playoffs, World Series, basketball, National Basketball Association (North American Professional), professional - Women general, Swiss netball, German netball, Dutch netball, biathlon, 7.5 km, 10 km, 15 km, 20 km, 4x7.5 km relay, 12.5 km pursuit, billiards, snooker and pool, 8 ball, 9 ball, 14.1, continuous-DEPRECATED, other-DEPRECATED, snooker, bobsleigh, two-man sled, four-man sled, bowling, bowls and petanque, boxing, super-heavyweight, heavyweight, cruiserweight, light-heavyweight, super-middleweight, middleweight, light-middleweight, welterweight, light-welterweight, lightweight, super-featherweight, featherweight, super-bantamweight, bantamweight, super-flyweight, flyweight, light flyweight, straw, IBF, WBA, WBC, WBO, French boxing, Thai boxing, canoeing and kayaking, Slalom, 200 m, 500 m, 1000 m, K1, K2, K4, C1, C2, C4, canoe sailing, pontoniering, climbing, mountaineering, sport climbing, cricket, curling, icestock sport, cycling, track, pursuit, Olympic sprint, sprint, Keirin, points race, Madison race, 500 m time trial, 1 km time trial, one hour, road race, road time trial, staging race, cyclo-cross, Vtt, Vtt-cross, Vtt-downhill, bi-crossing, trial, artistic cycling, cycle ball, dancing, diving, 10 m platform, 10 m platform synchronised, 3 m springboard, 3 m springboard synchronised, subaquatics, scuba diving, equestrian, three-day event, dressage, jumping, cross country, fencing, epee, foil, sabre, field Hockey, roll hockey, figure Skating, singles, pairs, ice dance, freestyle Skiing, moguls, aerials, artistic skiing, golf, gymnastics, floor exercise, vault, pommel horse, uneven bars, parallel bars, horizontal bar, rings, beam, rhythmic, clubs, hoop, ribbon, rope, ball, trampoline, handball (team), horse racing, harness racing, flat racing, steeple chase, trotting, cross country, ice hockey, National Hockey League (North American), sledge hockey, Jai Alai (Pelota), fronton, jai-alai, left wall, trinquet, rebot, chistera ancha, chistera corta, bare hand, pala-ancha, pala-corta, pasaka, xare, judo, heavyweight, half-heavyweight, middleweight, half-middleweight, half-lightweight, lightweight, extra lightweight, karate, sparring, formal exercise-DEPRECATED, lacrosse, luge, singles, doubles, marathon, modern pentathlon, running, shooting, swimming, fencing, showjumping, motor racing, Formula One, F3000, endurance, Indy, CART, NHRA, NASCAR, TRUCKI, motor rallying, rallying, pursuit, rallycross, motorcycling, speed-Grand-Prix, enduro, grass-track, moto-ball, moto-cross, rallying, trial, endurance, superbike, 125 cm3, 250 cm3, 500 cm3, side-cars, motoGP, netball, nordic skiing, cross-country, 5 km classical time, 10 km classical style, 10 km pursuit free style, 15 km classical style, 15 km pursuit free style, 10 km + 15 km combined, 30 km classical style, 30km free style, 50 km free style, 4x5 km relay, 4x10 km relay, nordic combined, raid, 5 km pursuit free style, 1.5 km sprint free, 50 km classic style, orienteering, ski orienteering, polo, power boating, F1, F2, rowing, single sculls, double sculls, quadruple sculls, coxless pair, coxless four, eight, lightweight, rugby league, rugby union, rugby 7, sailing, Tornado, soling, 49er, Europe, Laser, 470, Finn, Star, flying dutchmann, 505, staging race, around the world, monohull, multihulls, yngling, mistral, shooting, 10 m air rifle, 10 m air pistol, 10 m running target, 25 m rapid fire pistol, 25 m sport pistol, 50 m free pistol, 50 m free rifle prone, 50 m free rifle 3x40, 50 m sport rifle 3x20, trap, double trap, skeet, ski jumping, K90 jump, K120 jump, K180 (flying jump), snow boarding, giant slalom, half-pipe, soccer, softball, speed skating, 500 m, 1000 m, 1500 m, 3000 m, 5000 m, 10000 m, Short-track, st 500 m, st 1000m, st 1500m, st 3000m, st 3000m relay, st 5000m, st 5000m relay, speedway, sports organisations, IOC, international federation, continental federation, national federation, GAISF, squash, sumo wrestling, surfing, swimming, 50 m freestyle, 100 m freestyle, 200 m freestyle, 400 m freestyle, 800 m freestyle, 1500 m freestyle, relay 4x50 m freestyle, relay 4x100 m freestyle, relay 4x200 m freestyle, 50 m backstroke, 100 m backstroke, 200 m backstroke, 50 m breaststroke, 100 m breaststroke, 200 m breaststroke, 50 m butterfly, 100 m butterfly, 200 m butterfly, 100 m medley, 200 m medley, 400 m medley, relay 4x50 m medlay, relay4x100 m medley, short course, synchronised technical routine, synchronised free routine, table tennis, Taekwon-Do, under 49 kg, under 58 kg, 49-57 kg, 58-68 kg, 57-67 kg, 68-80 kg, over 67 kg, over 80 kg, tennis, soft tennis, triathlon, triathlon swimming, triathlon cycling, triathlon run, volleyball, beach volleyball, water polo, water skiing, slalom, trick, jump, combined, weightlifting, snatch, clean and jerk, 48 kg, 53 kg, 63 kg, 75 kg, over 75 kg, 56 kg, 62 kg, 69 kg, 77 kg, 85 kg, 94 kg, 105 kg, over 105 kg, powerlifting, windsurfing, ocean, lake, river, land, wrestling, freestyle, greco-roman, over 130 kg, 130 kg, 97 kg, 85 kg, 76 kg, 69 kg, 63 kg, 58 kg, 54 kg, Swiss wrestling, sports event, Summer Olympics, Winter Olympics, Summer universiade, Winter Universiade, Commonwealth Games, Winter Goodwill Games, Summer Asian Games, Winter Asian Games, Panamerican Games, African Games, Mediterranean Games, SouthEast Asiatic Games, PanPacific Games, SouthPacific Games, PanArabic Games, Summer Goodwill Games, World games, World Cup, intercontinental cup, continental cup, international cup, National Cup, interregional cup, regional cup, league cup, world championship, intercontinental championship, continental championship 1st level, continental championship 2nd level, continental championship 3rd level, national championship 1st level, national championship 2nd level, national championship3rdlevel, national championship 4th level, regional championship, Grand Prix, intercontinental tournament, continental tournament, international tournament, national tournament, inter-nations competition, inter-clubs competition, friendly competition, all-stars competition, exhibition, Super Bowl, paralympic games, rodeo, barrel racing, calf roping, bull riding, bulldogging, saddle bronc, bareback, goat roping, mini golf sport, bandy, flying disc, ultimate, guts, overall, distance, discathon, DDC, SCF, freestyle, accuracy, disc golf, floorball, casting, tug-of-war, croquette, dog racing, sled, oval track, skeleton, Australian rules football, Canadian football, duathlon, hornuss, fist ball, inline skating, grass ski, snowbiking, twirling, kendo, jukendo, naginata, kyudo, kabaddi, sepak takraw, wushu, darts, bodybuilding, sports disciplinary action, sports awards, unrest, conflicts and war, act of terror, armed conflict, civil unrest, revolutions, rebellions, political dissent, religious conflict, social conflict, coup d'etat, guerrilla activity, bioterrorism, bombings, massacre, genocide, riots, demonstration, war, civil war, international military intervention, prisoners and detainees, conflict (general), peacekeeping force, crisis, weaponry, weather, forecast, global change, report, weather news, statistic, warning
  Xmp.iptcExt.AddlModelInfo                     Test Model Info  Test Model Info
  Xmp.iptcExt.DigImageGUID                      nq394uihqtj085jh0qj5h034jhq905mtrjh  nq394uihqtj085jh0qj5h034jhq905mtrjh
  Xmp.iptcExt.DigitalSourceType                 http://cv.iptc.org/newscodes/digitalsourcetype/softwareImage  The digital image was created by computer software
  Xmp.iptcExt.MaxAvailHeight                    250  250
  Xmp.iptcExt.MaxAvailWidth                     250  250
  Xmp.iptcExt.AboutCvTerm                       type="Bag"
  Xmp.iptcExt.AboutCvTerm[1]                    type="Struct"
  Xmp.iptcExt.AboutCvTerm[1]/Iptc4xmpExt:CvId   http://example.com/cv/test  http://example.com/cv/test
  Xmp.iptcExt.AboutCvTerm[1]/Iptc4xmpExt:CvTermId  http://example.com/2489rtuj35i5gon3509hg  http://example.com/2489rtuj35i5gon3509hg
  Xmp.iptcExt.AboutCvTerm[1]/Iptc4xmpExt:CvTermRefinedAbout  http://example.com/eopihjg30mhn0q4emn09  http://example.com/eopihjg30mhn0q4emn09
  Xmp.iptcExt.AboutCvTerm[1]/Iptc4xmpExt:CvTermName  lang="x-default" Test CV-Term Name  lang="x-default" Test CV-Term Name
  Xmp.iptcExt.ArtworkOrObject                   type="Bag"
  Xmp.iptcExt.ArtworkOrObject[1]                type="Struct"
  Xmp.iptcExt.ArtworkOrObject[1]/Iptc4xmpExt:AOCircaDateCreated  2022-01-04  2022-01-04
  Xmp.iptcExt.ArtworkOrObject[1]/Iptc4xmpExt:AOCopyrightNotice  Copyright Exiv2  Copyright Exiv2
  Xmp.iptcExt.ArtworkOrObject[1]/Iptc4xmpExt:AOCurrentCopyrightOwnerId  http://www.example.com/userID/q30w4jyg34nh0h4j0934jh  http://www.example.com/userID/q30w4jyg34nh0h4j0934jh
  Xmp.iptcExt.ArtworkOrObject[1]/Iptc4xmpExt:AOCurrentCopyrightOwnerName  Exiv2  Exiv2
  Xmp.iptcExt.ArtworkOrObject[1]/Iptc4xmpExt:AOCurrentLicensorId  http://www.example.com/licensorID/j70948tjg308jgn093q4  http://www.example.com/licensorID/j70948tjg308jgn093q4
  Xmp.iptcExt.ArtworkOrObject[1]/Iptc4xmpExt:AOCurrentLicensorName  Licensor  Licensor
  Xmp.iptcExt.ArtworkOrObject[1]/Iptc4xmpExt:AODateCreated  2022-01-04T09:41:01+00:00  2022-01-04T09:41:01+00:00
  Xmp.iptcExt.ArtworkOrObject[1]/Iptc4xmpExt:AOSource  Exiv2  Exiv2
  Xmp.iptcExt.ArtworkOrObject[1]/Iptc4xmpExt:AOSourceInvNo  3984u1tIAEUshjg03j409  3984u1tIAEUshjg03j409
  Xmp.iptcExt.ArtworkOrObject[1]/Iptc4xmpExt:AOSourceInvURL  http://www.example.com/sourceID/309g30qm00ginm55-hj0  http://www.example.com/sourceID/309g30qm00ginm55-hj0
  Xmp.iptcExt.ArtworkOrObject[1]/Iptc4xmpExt:AOContentDescription  lang="x-default" Test data  lang="x-default" Test data
  Xmp.iptcExt.ArtworkOrObject[1]/Iptc4xmpExt:AOContributionDescription  lang="x-default" None  lang="x-default" None
  Xmp.iptcExt.ArtworkOrObject[1]/Iptc4xmpExt:AOCreator  postscript-dev  postscript-dev
  Xmp.iptcExt.ArtworkOrObject[1]/Iptc4xmpExt:AOCreatorId  http://www.example.com/userID/q3049jq09mn0hq39m5h  http://www.example.com/userID/q3049jq09mn0hq39m5h
  Xmp.iptcExt.ArtworkOrObject[1]/Iptc4xmpExt:AOPhysicalDescription  lang="x-default" Test data  lang="x-default" Test data
  Xmp.iptcExt.ArtworkOrObject[1]/Iptc4xmpExt:AOStylePeriod  Art Deco  Art Deco
  Xmp.iptcExt.ArtworkOrObject[1]/Iptc4xmpExt:AOTitle  lang="x-default" Xmp.iptc.* and Xmp.iptcExt.* test data  lang="x-default" Xmp.iptc.* and Xmp.iptcExt.* test data
  Xmp.iptcExt.EmbdEncRightsExpr                 type="Bag"
  Xmp.iptcExt.EmbdEncRightsExpr[1]              type="Struct"
  Xmp.iptcExt.EmbdEncRightsExpr[1]/Iptc4xmpExt:EncRightsExpr  Exiv2 project license: https://raw.githubusercontent.com/Exiv2/exiv2/main/COPYING  Exiv2 project license: https://raw.githubusercontent.com/Exiv2/exiv2/main/COPYING
  Xmp.iptcExt.EmbdEncRightsExpr[1]/Iptc4xmpExt:RightsExprEncType  text/plain  text/plain
  Xmp.iptcExt.EmbdEncRightsExpr[1]/Iptc4xmpExt:RightsExprLangId  http://www.example.com/rightsID/lkjusahgnoie439j9340  http://www.example.com/rightsID/lkjusahgnoie439j9340
  Xmp.iptcExt.Event                             lang="x-default" None  lang="x-default" None
  Xmp.iptcExt.EventId                           https://example.com/eventID/39085yjinmhq09043h  https://example.com/eventID/39085yjinmhq09043h
  Xmp.iptcExt.Genre                             type="Bag"
  Xmp.iptcExt.Genre[1]                          type="Struct"
  Xmp.iptcExt.Genre[1]/Iptc4xmpExt:CvId         http://example.com/cvID/380940jeokjhinthrstn  http://example.com/cvID/380940jeokjhinthrstn
  Xmp.iptcExt.Genre[1]/Iptc4xmpExt:CvTermId     http://example.com/cvtermID/dfjkhng93jqg03jrs0hm  http://example.com/cvtermID/dfjkhng93jqg03jrs0hm
  Xmp.iptcExt.Genre[1]/Iptc4xmpExt:CvTermRefinedAbout  http://example.com/cvtermrefinedabout/fjh3n809jn0q3jh5q09hjrojh3509  http://example.com/cvtermrefinedabout/fjh3n809jn0q3jh5q09hjrojh3509
  Xmp.iptcExt.Genre[1]/Iptc4xmpExt:CvTermName   lang="x-default" Test CvTermName  lang="x-default" Test CvTermName
  Xmp.iptcExt.ImageRegion                       type="Bag"
  Xmp.iptcExt.ImageRegion[1]                    type="Struct"
  Xmp.iptcExt.ImageRegion[1]/Iptc4xmpExt:rId    testregion  testregion
  Xmp.iptcExt.ImageRegion[1]/Iptc4xmpExt:Name   lang="x-default" Test Region  lang="x-default" Test Region
  Xmp.iptcExt.ImageRegion[1]/Iptc4xmpExt:OrganisationInImageName  Exiv2  Exiv2
  Xmp.iptcExt.ImageRegion[1]/Iptc4xmpExt:PersonInImage  None  None
  Xmp.iptcExt.ImageRegion[1]/Iptc4xmpExt:RegionBoundary  type="Struct"
  Xmp.iptcExt.ImageRegion[1]/Iptc4xmpExt:RegionBoundary/Iptc4xmpExt:rbH  0.35  0.35
  Xmp.iptcExt.ImageRegion[1]/Iptc4xmpExt:RegionBoundary/Iptc4xmpExt:rbShape  rectangle  rectangle
  Xmp.iptcExt.ImageRegion[1]/Iptc4xmpExt:RegionBoundary/Iptc4xmpExt:rbUnit  relative  relative
  Xmp.iptcExt.ImageRegion[1]/Iptc4xmpExt:RegionBoundary/Iptc4xmpExt:rbW  0.15  0.15
  Xmp.iptcExt.ImageRegion[1]/Iptc4xmpExt:RegionBoundary/Iptc4xmpExt:rbX  0.25  0.25
  Xmp.iptcExt.ImageRegion[1]/Iptc4xmpExt:RegionBoundary/Iptc4xmpExt:rbY  0.25  0.25
  Xmp.iptcExt.ImageRegion[1]/Iptc4xmpExt:rCtype  type="Bag"
  Xmp.iptcExt.ImageRegion[1]/Iptc4xmpExt:rCtype[1]  type="Struct"
  Xmp.iptcExt.ImageRegion[1]/Iptc4xmpExt:rCtype[1]/Iptc4xmpExt:Name  lang="x-default" Somewhere  lang="x-default" Somewhere
  Xmp.iptcExt.ImageRegion[1]/Iptc4xmpExt:rCtype[1]/xmp:Identifier  https://example.org/GUID/q3094jg304ng3049jhtio4j3  https://example.org/GUID/q3094jg304ng3049jhtio4j3
  Xmp.iptcExt.ImageRegion[1]/Iptc4xmpExt:rRole  type="Bag"
  Xmp.iptcExt.ImageRegion[1]/Iptc4xmpExt:rRole[1]  type="Struct"
  Xmp.iptcExt.ImageRegion[1]/Iptc4xmpExt:rRole[1]/Iptc4xmpExt:Name  lang="x-default" Test name  lang="x-default" Test name
  Xmp.iptcExt.ImageRegion[1]/Iptc4xmpExt:rRole[1]/xmp:Identifier  https://example.org/GUID/ioehg03q94jh0935nhq3hj9  https://example.org/GUID/ioehg03q94jh0935nhq3hj9
  Xmp.iptcExt.LinkedEncRightsExpr               type="Bag"
  Xmp.iptcExt.LinkedEncRightsExpr[1]            type="Struct"
  Xmp.iptcExt.LinkedEncRightsExpr[1]/Iptc4xmpExt:LinkedRightsExpr  http://example.org/linkedrightsexpression/034j093jhn0erihjmkjnh034  http://example.org/linkedrightsexpression/034j093jhn0erihjmkjnh034
  Xmp.iptcExt.LinkedEncRightsExpr[1]/Iptc4xmpExt:RightsExprEncType  text/xml  text/xml
  Xmp.iptcExt.LinkedEncRightsExpr[1]/Iptc4xmpExt:RightsExprLangId  http://example.org/rightsexprlangid/3098jnyqgh03jnh0jw45uj65yh  http://example.org/rightsexprlangid/3098jnyqgh03jnh0jw45uj65yh
  Xmp.iptcExt.LocationCreated                   type="Bag"
  Xmp.iptcExt.LocationCreated[1]                type="Struct"
  Xmp.iptcExt.LocationCreated[1]/Iptc4xmpExt:City  Test City  Test City
  Xmp.iptcExt.LocationCreated[1]/Iptc4xmpExt:CountryCode  GBR  GBR
  Xmp.iptcExt.LocationCreated[1]/Iptc4xmpExt:CountryName  Test Country  Test Country
  Xmp.iptcExt.LocationCreated[1]/Iptc4xmpExt:ProvinceState  Test Province/State  Test Province/State
  Xmp.iptcExt.LocationCreated[1]/Iptc4xmpExt:Sublocation  Test Sublocation  Test Sublocation
  Xmp.iptcExt.LocationCreated[1]/Iptc4xmpExt:WorldRegion  Test Region  Test Region
  Xmp.iptcExt.LocationCreated[1]/exif:GPSAltitude  25/1  25/1
  Xmp.iptcExt.LocationCreated[1]/exif:GPSLatitude  51,30.30N  51,30.30N
  Xmp.iptcExt.LocationCreated[1]/exif:GPSLongitude  0,07.32W  0,07.32W
  Xmp.iptcExt.LocationCreated[1]/Iptc4xmpExt:LocationId  http://example.org/locationId/3409j0ijm3fgldsgjk2  http://example.org/locationId/3409j0ijm3fgldsgjk2
  Xmp.iptcExt.LocationCreated[1]/Iptc4xmpExt:LocationName  lang="x-default" Test Location  lang="x-default" Test Location
  Xmp.iptcExt.LocationShown                     type="Bag"
  Xmp.iptcExt.LocationShown[1]                  type="Struct"
  Xmp.iptcExt.LocationShown[1]/Iptc4xmpExt:City  Test City  Test City
  Xmp.iptcExt.LocationShown[1]/Iptc4xmpExt:CountryCode  GBR  GBR
  Xmp.iptcExt.LocationShown[1]/Iptc4xmpExt:CountryName  Test Country  Test Country
  Xmp.iptcExt.LocationShown[1]/Iptc4xmpExt:ProvinceState  Test Province/State  Test Province/State
  Xmp.iptcExt.LocationShown[1]/Iptc4xmpExt:Sublocation  Test Sublocation  Test Sublocation
  Xmp.iptcExt.LocationShown[1]/Iptc4xmpExt:WorldRegion  Test Region  Test Region
  Xmp.iptcExt.LocationShown[1]/exif:GPSAltitude  25/1  25/1
  Xmp.iptcExt.LocationShown[1]/exif:GPSLatitude  51,30.30N  51,30.30N
  Xmp.iptcExt.LocationShown[1]/exif:GPSLongitude  0,07.32W  0,07.32W
  Xmp.iptcExt.LocationShown[1]/Iptc4xmpExt:LocationId  http://example.org/locationId/3409j0ijm3fgldsgjk2  http://example.org/locationId/3409j0ijm3fgldsgjk2
  Xmp.iptcExt.LocationShown[1]/Iptc4xmpExt:LocationName  lang="x-default" Test Location  lang="x-default" Test Location
  Xmp.iptcExt.ModelAge                          25  25
  Xmp.iptcExt.OrganisationInImageCode           Test code:code  Test code:code
  Xmp.iptcExt.OrganisationInImageName           None  None
  Xmp.iptcExt.PersonInImage                     Nobody  Nobody
  Xmp.iptcExt.PersonInImageWDetails             type="Bag"
  Xmp.iptcExt.PersonInImageWDetails[1]          type="Struct"
  Xmp.iptcExt.PersonInImageWDetails[1]/Iptc4xmpExt:PersonCharacteristic  type="Bag"
  Xmp.iptcExt.PersonInImageWDetails[1]/Iptc4xmpExt:PersonCharacteristic[1]  type="Struct"
  Xmp.iptcExt.PersonInImageWDetails[1]/Iptc4xmpExt:PersonCharacteristic[1]/Iptc4xmpExt:CvId  http://example.com/cvid/0q349ji3mg30gme45h4  http://example.com/cvid/0q349ji3mg30gme45h4
  Xmp.iptcExt.PersonInImageWDetails[1]/Iptc4xmpExt:PersonCharacteristic[1]/Iptc4xmpExt:CvTermId  http://example.com/cvtermid/0249jtgmn3wopmhpmklfmnh5  http://example.com/cvtermid/0249jtgmn3wopmhpmklfmnh5
  Xmp.iptcExt.PersonInImageWDetails[1]/Iptc4xmpExt:PersonCharacteristic[1]/Iptc4xmpExt:CvTermRefinedAbout  http://example.com/cvtermrefinedabout/0294jgmionmheohknmm5ohtyk  http://example.com/cvtermrefinedabout/0294jgmionmheohknmm5ohtyk
  Xmp.iptcExt.PersonInImageWDetails[1]/Iptc4xmpExt:PersonCharacteristic[1]/Iptc4xmpExt:CvTermName  lang="x-default" Nobody  lang="x-default" Nobody
  Xmp.iptcExt.PersonInImageWDetails[1]/Iptc4xmpExt:PersonDescription  lang="x-default" None  lang="x-default" None
  Xmp.iptcExt.PersonInImageWDetails[1]/Iptc4xmpExt:PersonId  http://www.example.com/personid/039nmkojnsrgaioj4g04ew4gm  http://www.example.com/personid/039nmkojnsrgaioj4g04ew4gm
  Xmp.iptcExt.PersonInImageWDetails[1]/Iptc4xmpExt:PersonName  lang="x-default" Nobody  lang="x-default" Nobody
  Xmp.iptcExt.ProductInImage                    type="Bag"
  Xmp.iptcExt.ProductInImage[1]                 type="Struct"
  Xmp.iptcExt.ProductInImage[1]/Iptc4xmpExt:ProductGTIN  12345678901234  12345678901234
  Xmp.iptcExt.ProductInImage[1]/Iptc4xmpExt:ProductDescription  lang="x-default" None  lang="x-default" None
  Xmp.iptcExt.ProductInImage[1]/Iptc4xmpExt:ProductName  lang="x-default" None  lang="x-default" None
  Xmp.iptcExt.RegistryId                        type="Bag"
  Xmp.iptcExt.RegistryId[1]                     type="Struct"
  Xmp.iptcExt.RegistryId[1]/Iptc4xmpExt:RegEntryRole  http://www.example.com/regentryrole/09mnwergomng409mg049  http://www.example.com/regentryrole/09mnwergomng409mg049
  Xmp.iptcExt.RegistryId[1]/Iptc4xmpExt:RegItemId  aeijt0293jtg0in340g0gh  aeijt0293jtg0in340g0gh
  Xmp.iptcExt.RegistryId[1]/Iptc4xmpExt:RegOrgId  awring049j0gm4i03jh340  awring049j0gm4i03jh340
  Xmp.plus.ImageCreatorImageID                  Test Image Creator Image ID  Test Image Creator Image ID
  Xmp.plus.ImageSupplierImageID                 Test Image Supplier Image ID  Test Image Supplier Image ID
  Xmp.plus.MinorModelAgeDisclosure              http://ns.useplus.org/ldf/vocab/AG-A25  Age 25 or Over
  Xmp.plus.ModelReleaseStatus                   http://ns.useplus.org/ldf/vocab/MR-NAP  Not Applicable
  Xmp.plus.PropertyReleaseStatus                http://ns.useplus.org/ldf/vocab/PR-NAP  Not Applicable
  Xmp.plus.CopyrightOwner                       type="Seq"
  Xmp.plus.CopyrightOwner[1]                    type="Struct"
  Xmp.plus.CopyrightOwner[1]/plus:CopyrightOwnerID  http://www.example.com/copyrightownerid/0n4w3g0m409mg04dalnowun9  http://www.example.com/copyrightownerid/0n4w3g0m409mg04dalnowun9
  Xmp.plus.CopyrightOwner[1]/plus:CopyrightOwnerName  Exiv2  Exiv2
  Xmp.plus.ImageCreator                         type="Seq"
  Xmp.plus.ImageCreator[1]                      type="Struct"
  Xmp.plus.ImageCreator[1]/plus:ImageCreatorID  http://www.example.com/imagecreatorid/09n4mg09jreokrmhglwkmgdv  http://www.example.com/imagecreatorid/09n4mg09jreokrmhglwkmgdv
  Xmp.plus.ImageCreator[1]/plus:ImageCreatorName  postscript-dev  postscript-dev
  Xmp.plus.ImageSupplier                        type="Seq"
  Xmp.plus.ImageSupplier[1]                     type="Struct"
  Xmp.plus.ImageSupplier[1]/plus:ImageSupplierID  http://www.example.com/imagesupplierid/09gmn0pamwpomgnhtuhn50  http://www.example.com/imagesupplierid/09gmn0pamwpomgnhtuhn50
  Xmp.plus.ImageSupplier[1]/plus:ImageSupplierName  Exiv2  Exiv2
  Xmp.plus.Licensor                             type="Seq"
  Xmp.plus.Licensor[1]                          type="Struct"
  Xmp.plus.Licensor[1]/plus:LicensorCity        Test City  Test City
  Xmp.plus.Licensor[1]/plus:LicensorCountry     Test Country  Test Country
  Xmp.plus.Licensor[1]/plus:LicensorEmail       testlicensoremail_q23048jtn042@example.com  testlicensoremail_q23048jtn042@example.com
  Xmp.plus.Licensor[1]/plus:LicensorExtendedAddress  Test Licensor Extended Address  Test Licensor Extended Address
  Xmp.plus.Licensor[1]/plus:LicensorID          http://www.example.com/licensorid/0iaskrgmnowim4g0934m90gm43  http://www.example.com/licensorid/0iaskrgmnowim4g0934m90gm43
  Xmp.plus.Licensor[1]/plus:LicensorName        Someone  Someone
  Xmp.plus.Licensor[1]/plus:LicensorPostalCode  Test Licensor Postcode  Test Licensor Postcode
  Xmp.plus.Licensor[1]/plus:LicensorRegion      Test Licensor Region  Test Licensor Region
  Xmp.plus.Licensor[1]/plus:LicensorStreetAddress  Test Licensor Street Address  Test Licensor Street Address
  Xmp.plus.Licensor[1]/plus:LicensorTelephone1  +1 (234) 567890  +1 (234) 567890
  Xmp.plus.Licensor[1]/plus:LicensorTelephone2  +1 (345) 678901  +1 (345) 678901
  Xmp.plus.Licensor[1]/plus:LicensorTelephoneType1  http://ns.useplus.org/ldf/vocab/work  http://ns.useplus.org/ldf/vocab/work
  Xmp.plus.Licensor[1]/plus:LicensorTelephoneType2  http://ns.useplus.org/ldf/vocab/cell  http://ns.useplus.org/ldf/vocab/cell
  Xmp.plus.Licensor[1]/plus:LicensorURL         http://www.example.com/licensorurl/okng0934j9jkrg0430gjn0mn03  http://www.example.com/licensorurl/okng0934j9jkrg0430gjn0mn03
  Xmp.plus.ModelReleaseID                       http://www.example.com/modelreleaseid/jhgmw3m0932mg0943mh32  http://www.example.com/modelreleaseid/jhgmw3m0932mg0943mh32
  Xmp.plus.PropertyReleaseID                    http://www.example.com/propertyreleaseid/wii09mng290mg0b3mgb0ebebt  http://www.example.com/propertyreleaseid/wii09mng290mg0b3mgb0ebebt
  Xmp.xmp.Rating                                5.0  5.0
  Xmp.xmpRights.WebStatement                    http://www.example.com/WebStatement/testing123  http://www.example.com/WebStatement/testing123
  Xmp.xmpRights.UsageTerms                      lang="x-default" See https://github.com/Exiv2/exiv2/blob/main/COPYING  lang="x-default" See https://github.com/Exiv2/exiv2/blob/main/COPYING
  Xmp.tiff.YCbCrPositioning                     1  Centered
  Xmp.tiff.XResolution                          72/1  72
  Xmp.tiff.YResolution                          72/1  72
  Xmp.tiff.ResolutionUnit                       2  inch
  Xmp.exif.ExifVersion                          0232  2.32
  Xmp.exif.FlashpixVersion                      0100  1.00
  Xmp.exif.ColorSpace                           65535  Uncalibrated
  Xmp.exif.ComponentsConfiguration              1  Y
  Xmp.photoshop.DateCreated                     2022-01-04T09:41:01+00:00  2022-01-04T09:41:01+00:00
  Xmp.photoshop.Instructions                    Test Instructions  Test Instructions
  Xmp.photoshop.AuthorsPosition                 Test Creator's Job Title  Test Creator's Job Title
  Xmp.photoshop.City                            Test City  Test City
  Xmp.photoshop.State                           Test Province/State)  Test Province/State)
  Xmp.photoshop.Country                         Test Country  Test Country
  Xmp.photoshop.TransmissionReference           Test Job ID  Test Job ID
  Xmp.photoshop.Headline                        Test Headline  Test Headline
  Xmp.photoshop.Credit                          Test Credit Line  Test Credit Line
  Xmp.photoshop.Source                          Test Source  Test Source
  Xmp.photoshop.CaptionWriter                   Test Name  Test Name
  Xmp.dc.title                                  lang="x-default" Test IPTC XMP file  lang="x-default" Test IPTC XMP file
  Xmp.dc.subject                                Test  Test
  Xmp.dc.creator                                postscript-dev  postscript-dev
  Xmp.dc.rights                                 lang="x-default" Copyright Exiv2  lang="x-default" Copyright Exiv2
  Xmp.dc.description                            lang="x-default" Test file for the IPTC XMP tags  lang="x-default" Test file for the IPTC XMP tags
 : Standard output does not match

----------------------------------------------------------------------
Ran 1 test in 0.020s

FAILED (failures=1)
[msa@hoodoo build]$ 
clanmills commented 2 years ago

Michael @mallman Thanks for sharing this with me. I don't know why I'm only seeing this email today on Sunday when you posted it on Thursday. I know I've spoken to you elsewhere about this when I remembered how to "go home" to California. The issue is being caused by the metadata convertors.

I think the aim of the test is to read sidecar files (.xmp). Choosing a side-car file which doesn't have timestamps will probably evade this part of the convertor and the test will no longer be sensitive to the host TZ settings. @postscript-dev may have discovered a way in which to run all tests in TZ=UTC.

For sure this is ugly and undesirable. I'm confident that we can make this disappear with a change in the test suite. We need a better understanding of the rationale for the convertors. Perhaps the library needs a global switch to enable/disable metadata convertors.

clanmills commented 2 years ago

This looks mostly pain free. There's a comment in src/xmpsidecar.cpp

        // #1112 - store dates to deal with loss of TZ information during conversions
        for (auto&& it : xmpData_) {
            std::string key(it.key());
            if ( key.find("Date") != std::string::npos ) {
                std::string value(it.value().toString());
                dates_[key] = value;
            }
        }

        copyXmpToIptc(xmpData_, iptcData_);
        copyXmpToExif(xmpData_, exifData_);

That refers to 1112 on redmine. So this was about 2014 or so.

The 1112 issue was that the XMP to Exif convertor rounded the XMP (XML date with TZ and decimal point seconds) to Exif seconds (which at that time didn't support sub-seconds, or TZ offsets). Then the Exif to XMP convertor copied the Exif DataTime into the XMP.

So my fix in 1112 was to store the XML date before the convertor dance and restore them in writeMetadata().

Here are examples of the date time formats in Exif and XML. You'll spot the image was taken in July when the UK was in Summer Time (+1.00). I labelled the image "Classic View" about 8:30pm when I got home from taking guests to visit the stones and Picasa correctly set Xmp.xmp.ModifyDate

543 rmills@rmillsmm-local:~/gnu/github/exiv2/main $ exiv2 -px  https://exiv2.org/Stonehenge.jpg
Xmp.xmp.Rating                               XmpText     1  0
Xmp.xmp.ModifyDate                           XmpText    25  2015-07-16T20:25:28+01:00
Xmp.dc.description                           LangAlt     1  lang="x-default" Classic View
544 rmills@rmillsmm-local:~/gnu/github/exiv2/main $ exiv2 -g Original/i  https://exiv2.org/Stonehenge.jpg
Exif.Photo.DateTimeOriginal                  Ascii      20  2015:07:16 15:38:54
Exif.Photo.SubSecTimeOriginal                Ascii       3  00
545 rmills@rmillsmm-local:~/gnu/github/exiv2/main $ 

So, we have the XML date in our hands and have to add something like:

std::string dateTimeOriginal = 'Xmp.photoshop.DateCreated' ;
if ( exifData_.find("Exif.Photos.DateTimeOriginal") >= 0 && dates_.count(dateTimeOriginal) ) {
    exifData_["Exif.Photo.DateTimeOriginal"] = xmlToExif(dates_[dateTimeOriginal]);
}

We'll need an xmlToExif() convertor which is almost certain in the code base. We might need to tell him to ignore TZ.

542 rmills@rmillsmm-local:~/gnu/github/exiv2/main $ grep date src/convert.cpp 
          @brief Exif date to XMP conversion function.
          Sets the XMP property to an XmpText value containing date and time. This function
          @brief XMP to Exif date conversion function.
          Converts the XmpText value to Exif date and time. This function
          XMP and Exif was updated more recently and copies metadata in appropriate direction.
...

This looks straight-forward to fix.

mallman commented 2 years ago

Hi @clanmills.

I don't think that an image with an embedded Exif.Photo.DateTimeOriginal, such as https://exiv2.org/Stonehenge.jpg, is an accurate proxy for the problem described in this issue (and in #2084). In that case, we only have an XMP sidecar, and it does not provide a sort of DateTimeOriginal—at least, that's my claim.

The problem is we don't have Exif.Photo.DateTimeOriginal and are trying to derive it from a timestamp such as Xmp.photoshop.DateCreated. Absent additional information, a timestamp says nothing definite about a local time and vice versa. I may shoot a photo at 14:22 local time but can't know the timestamp without knowing some additional information like the local UTC offset. Likewise, I may shoot a photo at 14:22 UTC but that doesn't tell me the local time without additional information such as the local UTC offset.

The problem isn't a lack of a conversion function or a bug in a conversion function. I think the problem is such a conversion function is impossible without timezone information.

So one solution to this problem is specifying a local time zone or UTC offset as a parameter of a "timestamp to local time" function. I think this is the essence of how and why exiv uses the system time zone or the TZ environment variable in these conversions. My concern there is that TZ is a system-defined concept, and the idea that it implies a local time zone for a metadata conversion is a bit specious IMHO. I think if we require a client library or user to specify a local time zone for converting from a timestamp to a local time, it should be supplied explicitly—in the library API as as an additional, required function parameter and in the cli tool as a cli parameter (ignoring the local system time or some TZ variable). In this scenario, failing to provide a local time zone parameter to the exiv2 tool when converting between timestamps and local times would either be an error or exiv2 would simply omit that data (e.g. omit Exif.Photo.DateTimeOriginal when converting from a timestamp).

Likewise, I suggest a function that converts a local time to a timestamp, should require an additional time zone (or offset) function parameter to specify the time zone of the local time.

clanmills commented 2 years ago

@mallman I think there are two different subjects here. The first and immediate puzzle is to get the #1959 test to pass. The test in #1959 arrived with a request from IPTC to provide support for changes to their standards. I've outlined an approach that I believe will result in #1959 passing without causing issues to existing tests.

The second puzzle is the specification for the convertors. Are they based on work by a standards committee? I don't know.

I don't want to get further drawn into this matter. I retired last year from Exiv2 (after 13 years). I'm continuing to support the 0.27-maintenance branch and made two releases in 2021. I expect another "dot" will be required in 2022 as my final contribution to the project.

mallman commented 2 years ago

The first and immediate puzzle is to get the https://github.com/Exiv2/exiv2/issues/1959 test to pass.

Done! (Indirectly, but done nonetheless)

The second puzzle is the specification for the convertors. Are they based on work by a standards committee? I don't know.

Let's take this out of scope. I thought—naively—that this time conversion issue could be contained to a tidy scope. Wrong. Moving on to more higher priorities...