NextGEN Gallery – WordPress Gallery Plugin - Version 3.6.0

Version Description

  • 02.10.2020 =
  • NEW: Added new 'Bulk actions' option to remove EXIF Orientation from existing images (1137)
  • NEW: Allow maximum_entity_limit display setting regardless of source (1146)
  • NEW: Provide hooks to customize Uppy settings (1139)
  • NEW: Recreated legacy templates as modern "views" (1127)
  • Fixed: A compatibility warning with NextGEN Plus would appear when users had NextGEN Starter (1097)
  • Fixed: Compatibility issue with Topscorer Theme (344171)
  • Fixed: Compatibility with Custom Post Types UI (1076)
  • Fixed: Compatibility with jQuery.mmenu (1140)
  • Fixed: Disable marketing additions for users with NextGEN Starter enabled
  • Fixed: Error responses from the server when uploading images failed were not specific (1121)
  • Fixed: Image rotation not reliable (1137)
  • Fixed: Imagebrowser pagination broke on images with UTF8 characters in their title (1135)
  • Fixed: Shortcodes displaying albums did not appear in the order listed (1128)
  • Fixed: Transient tracker was calling update_option() on every page (1074)
Download this release

Release Info

Developer photocrati
Plugin Icon 128x128 NextGEN Gallery – WordPress Gallery Plugin
Version 3.6.0
Comparing to
See all releases

Code changes from version 3.5.0 to 3.6.0

Files changed (153) hide show
  1. LICENSE +617 -282
  2. changelog.txt +19 -3
  3. composer.lock +9 -8
  4. nggallery.php +17 -11
  5. non_pope/class.photocrati_transient_manager.php +5 -3
  6. products/photocrati_nextgen/modules/lightbox/static/fancybox/jquery.fancybox-1.3.4.js +2 -2
  7. products/photocrati_nextgen/modules/lightbox/static/fancybox/jquery.fancybox-1.3.4.min.js +1 -1
  8. products/photocrati_nextgen/modules/lightbox/static/fancybox/jquery.fancybox-1.3.4.pack.js +1 -1
  9. products/photocrati_nextgen/modules/lightbox/static/fancybox/jquery.fancybox-1.3.4.pack.min.js +1 -1
  10. products/photocrati_nextgen/modules/lightbox/static/fancybox/nextgen_fancybox_init.js +22 -9
  11. products/photocrati_nextgen/modules/lightbox/static/fancybox/nextgen_fancybox_init.min.js +1 -1
  12. products/photocrati_nextgen/modules/marketing/module.marketing.php +4 -1
  13. products/photocrati_nextgen/modules/nextgen_addgallery_page/module.nextgen_addgallery_page.php +3 -1
  14. products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php +44 -2
  15. products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php +93 -100
  16. products/photocrati_nextgen/modules/nextgen_admin/package.module.nextgen_admin.php +2 -2
  17. products/photocrati_nextgen/modules/nextgen_basic_gallery/package.module.nextgen_basic_gallery.php +15 -0
  18. products/photocrati_nextgen/modules/nextgen_basic_gallery/static/thumbnails/nextgen_basic_thumbnails.css +22 -0
  19. products/photocrati_nextgen/modules/nextgen_basic_gallery/static/thumbnails/nextgen_basic_thumbnails.min.css +1 -1
  20. products/photocrati_nextgen/modules/nextgen_basic_gallery/templates/thumbnails/caption-view.php +66 -0
  21. products/photocrati_nextgen/modules/nextgen_basic_gallery/templates/thumbnails/carousel-view.php +80 -0
  22. products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/package.module.nextgen_basic_imagebrowser.php +1 -1
  23. products/photocrati_nextgen/modules/nextgen_basic_templates/static/ngg_template_settings.js +38 -5
  24. products/photocrati_nextgen/modules/nextgen_basic_templates/static/ngg_template_settings.min.js +1 -1
  25. products/photocrati_nextgen/modules/nextgen_block/static/build/post-thumbnail.min.js +1 -1
  26. products/photocrati_nextgen/modules/nextgen_block/static/build/post-thumbnail.min.js.map +1 -1
  27. products/photocrati_nextgen/modules/nextgen_block/static/src/post-thumbnail.jsx +5 -1
  28. products/photocrati_nextgen/modules/nextgen_data/module.nextgen_data.php +2 -1
  29. products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php +25 -49
  30. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/TODO +0 -74
  31. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/examples/README.md +0 -56
  32. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/examples/dirsort.php +0 -105
  33. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/examples/dump-image.php +0 -99
  34. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/examples/edit-description.php +0 -247
  35. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/examples/gps.php +0 -214
  36. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/examples/rename.php +0 -117
  37. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/examples/resize.php +0 -130
  38. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/make-release.sh +0 -197
  39. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/makepackagexml.php +0 -87
  40. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/run-phpdoc.sh +0 -55
  41. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/scripts/make-image-test.php +0 -251
  42. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/AsciiTest.php +0 -122
  43. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/BrokenImagesTest.php +0 -55
  44. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/Bug3017880Test.php +0 -85
  45. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/ConvertTest.php +0 -250
  46. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/DataWindowTest.php +0 -143
  47. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/GH16Test.php +0 -86
  48. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/GH21Test.php +0 -86
  49. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/GH77Test.php +0 -52
  50. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/IfdTest.php +0 -78
  51. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/MisplacedExifTest.php +0 -82
  52. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/NoExifTest.php +0 -44
  53. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/NumberByteTest.php +0 -42
  54. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/NumberLongTest.php +0 -42
  55. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/NumberRationalTest.php +0 -84
  56. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/NumberSByteTest.php +0 -42
  57. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/NumberSLongTest.php +0 -42
  58. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/NumberSRationalTest.php +0 -83
  59. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/NumberSShortTest.php +0 -42
  60. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/NumberShortTest.php +0 -42
  61. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/NumberTestCase.php +0 -107
  62. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/PelEntryUndefinedTest.php +0 -84
  63. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/PelEntryUserCommentTest.php +0 -47
  64. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/PelEntryVersionTest.php +0 -59
  65. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/PelEntryWindowsStringTest.php +0 -60
  66. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/PelFormatTest.php +0 -53
  67. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/PelJpegMarkerTest.php +0 -65
  68. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/PelTagTest.php +0 -63
  69. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/README.md +0 -47
  70. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/ReadWriteTest.php +0 -246
  71. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/Tags1Test.php +0 -67
  72. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/broken_images/gh-10-a.jpg +0 -0
  73. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/broken_images/gh-10-b.jpg +0 -0
  74. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/broken_images/gh-11.jpg +0 -0
  75. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/broken_images/gh-156.jpg +0 -0
  76. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/broken_images/misplaced-exif.jpg +0 -0
  77. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/images/bug3017880.jpg +0 -0
  78. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/images/gh-16.jpg +0 -0
  79. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/images/gh-21.jpg +0 -0
  80. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/images/gh-77.jpg +0 -0
  81. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/images/no-exif.jpg +0 -0
  82. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/images/sample-1.tiff +0 -0
  83. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/images/test-tags-1.jpg +0 -0
  84. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/COPYING +0 -340
  85. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/CanonEos650dTest.php +0 -335
  86. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/CanonIxusIITest.php +0 -416
  87. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/CanonPowershotS60Test.php +0 -414
  88. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/LeicaDLuxTest.php +0 -419
  89. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/NikonCoolscanIVTest.php +0 -166
  90. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/NikonE5000Test.php +0 -313
  91. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/NikonE950Test.php +0 -334
  92. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/OlympusC5050zTest.php +0 -388
  93. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/OlympusC50zTest.php +0 -376
  94. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/OlympusC765uzTest.php +0 -388
  95. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/PentaxIstDSTest.php +0 -429
  96. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/README +0 -61
  97. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/SonyDscV1Test.php +0 -369
  98. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/canon-eos-650d-thumb.jpg +0 -0
  99. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/canon-eos-650d.jpg +0 -0
  100. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/canon-ixus-ii-thumb.jpg +0 -0
  101. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/canon-ixus-ii.jpg +0 -0
  102. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/canon-powershot-s60-thumb.jpg +0 -0
  103. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/canon-powershot-s60.jpg +0 -0
  104. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/fujifilm_x_a5.jpg +0 -0
  105. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/leica-d-lux-thumb.jpg +0 -0
  106. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/leica-d-lux.jpg +0 -0
  107. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/nikon-coolscan-iv.jpg +0 -0
  108. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/nikon-e5000-thumb.jpg +0 -0
  109. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/nikon-e5000.jpg +0 -0
  110. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/nikon-e950-thumb.jpg +0 -0
  111. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/nikon-e950.jpg +0 -0
  112. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/olympus-c5050z-thumb.jpg +0 -0
  113. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/olympus-c5050z.jpg +0 -0
  114. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/olympus-c50z-thumb.jpg +0 -0
  115. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/olympus-c50z.jpg +0 -0
  116. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/olympus-c765uz-thumb.jpg +0 -0
  117. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/olympus-c765uz.jpg +0 -0
  118. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/pentax-istDS-thumb.jpg +0 -0
  119. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/pentax-istDS.jpg +0 -0
  120. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/sony-dsc-v1-thumb.jpg +0 -0
  121. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/sony-dsc-v1.jpg +0 -0
  122. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/tutorials/PEL/PEL.pkg +0 -60
  123. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/tutorials/PEL/PEL.pkg.ini +0 -3
  124. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/tutorials/PEL/faq.pkg +0 -273
  125. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/tutorials/PEL/schemas.xml +0 -4
  126. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/tutorials/PEL/using.pkg +0 -176
  127. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/update-locales.sh +0 -37
  128. products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/update-pot.sh +0 -40
  129. products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php +6 -2
  130. products/photocrati_nextgen/modules/nextgen_pagination/module.nextgen_pagination.php +1 -1
  131. products/photocrati_nextgen/modules/nextgen_pagination/package.module.nextgen_pagination.php +51 -33
  132. products/photocrati_nextgen/modules/nextgen_pagination/static/style.css +14 -0
  133. products/photocrati_nextgen/modules/nextgen_pagination/static/style.min.css +1 -1
  134. products/photocrati_nextgen/modules/ngglegacy/admin/ajax.php +16 -1
  135. products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php +1 -0
  136. products/photocrati_nextgen/modules/ngglegacy/admin/manage.php +3 -0
  137. products/photocrati_nextgen/modules/ngglegacy/lib/core.php +0 -11
  138. products/photocrati_nextgen/modules/ngglegacy/nggallery.php +0 -3
  139. readme.txt +20 -4
  140. vendor/bin/php-parse +0 -205
  141. vendor/composer/autoload_psr4.php +0 -1
  142. vendor/composer/autoload_static.php +0 -16
  143. vendor/composer/installed.json +9 -69
  144. vendor/imagely/pope-framework/.gitignore +1 -0
  145. vendor/imagely/pope-framework/lib/autoload.php +1 -1
  146. vendor/imagely/pope-framework/lib/class.component_registry.php +2 -2
  147. vendor/nikic/php-parser/LICENSE +0 -31
  148. vendor/nikic/php-parser/README.md +0 -225
  149. vendor/nikic/php-parser/bin/php-parse +0 -205
  150. vendor/nikic/php-parser/composer.json +0 -41
  151. vendor/nikic/php-parser/grammar/README.md +0 -30
  152. vendor/nikic/php-parser/grammar/parser.template +0 -106
  153. vendor/nikic/php-parser/grammar/php5.y +0 -821
LICENSE CHANGED
@@ -1,281 +1,622 @@
1
  GNU GENERAL PUBLIC LICENSE
2
- Version 2, June 1991
3
 
4
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
5
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6
  Everyone is permitted to copy and distribute verbatim copies
7
  of this license document, but changing it is not allowed.
8
 
9
  Preamble
10
 
11
- The licenses for most software are designed to take away your
12
- freedom to share and change it. By contrast, the GNU General Public
13
- License is intended to guarantee your freedom to share and change free
14
- software--to make sure the software is free for all its users. This
15
- General Public License applies to most of the Free Software
16
- Foundation's software and to any other program whose authors commit to
17
- using it. (Some other Free Software Foundation software is covered by
18
- the GNU Lesser General Public License instead.) You can apply it to
 
 
19
  your programs, too.
20
 
21
  When we speak of free software, we are referring to freedom, not
22
  price. Our General Public Licenses are designed to make sure that you
23
  have the freedom to distribute copies of free software (and charge for
24
- this service if you wish), that you receive source code or can get it
25
- if you want it, that you can change the software or use pieces of it
26
- in new free programs; and that you know you can do these things.
27
 
28
- To protect your rights, we need to make restrictions that forbid
29
- anyone to deny you these rights or to ask you to surrender the rights.
30
- These restrictions translate to certain responsibilities for you if you
31
- distribute copies of the software, or if you modify it.
32
 
33
  For example, if you distribute copies of such a program, whether
34
- gratis or for a fee, you must give the recipients all the rights that
35
- you have. You must make sure that they, too, receive or can get the
36
- source code. And you must show them these terms so they know their
37
- rights.
38
-
39
- We protect your rights with two steps: (1) copyright the software, and
40
- (2) offer you this license which gives you legal permission to copy,
41
- distribute and/or modify the software.
42
-
43
- Also, for each author's protection and ours, we want to make certain
44
- that everyone understands that there is no warranty for this free
45
- software. If the software is modified by someone else and passed on, we
46
- want its recipients to know that what they have is not the original, so
47
- that any problems introduced by others will not reflect on the original
48
- authors' reputations.
49
-
50
- Finally, any free program is threatened constantly by software
51
- patents. We wish to avoid the danger that redistributors of a free
52
- program will individually obtain patent licenses, in effect making the
53
- program proprietary. To prevent this, we have made it clear that any
54
- patent must be licensed for everyone's free use or not licensed at all.
 
 
 
 
 
 
 
 
 
 
 
55
 
56
  The precise terms and conditions for copying, distribution and
57
  modification follow.
58
 
59
- GNU GENERAL PUBLIC LICENSE
60
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61
-
62
- 0. This License applies to any program or other work which contains
63
- a notice placed by the copyright holder saying it may be distributed
64
- under the terms of this General Public License. The "Program", below,
65
- refers to any such program or work, and a "work based on the Program"
66
- means either the Program or any derivative work under copyright law:
67
- that is to say, a work containing the Program or a portion of it,
68
- either verbatim or with modifications and/or translated into another
69
- language. (Hereinafter, translation is included without limitation in
70
- the term "modification".) Each licensee is addressed as "you".
71
-
72
- Activities other than copying, distribution and modification are not
73
- covered by this License; they are outside its scope. The act of
74
- running the Program is not restricted, and the output from the Program
75
- is covered only if its contents constitute a work based on the
76
- Program (independent of having been made by running the Program).
77
- Whether that is true depends on what the Program does.
78
-
79
- 1. You may copy and distribute verbatim copies of the Program's
80
- source code as you receive it, in any medium, provided that you
81
- conspicuously and appropriately publish on each copy an appropriate
82
- copyright notice and disclaimer of warranty; keep intact all the
83
- notices that refer to this License and to the absence of any warranty;
84
- and give any other recipients of the Program a copy of this License
85
- along with the Program.
86
-
87
- You may charge a fee for the physical act of transferring a copy, and
88
- you may at your option offer warranty protection in exchange for a fee.
89
-
90
- 2. You may modify your copy or copies of the Program or any portion
91
- of it, thus forming a work based on the Program, and copy and
92
- distribute such modifications or work under the terms of Section 1
93
- above, provided that you also meet all of these conditions:
94
-
95
- a) You must cause the modified files to carry prominent notices
96
- stating that you changed the files and the date of any change.
97
-
98
- b) You must cause any work that you distribute or publish, that in
99
- whole or in part contains or is derived from the Program or any
100
- part thereof, to be licensed as a whole at no charge to all third
101
- parties under the terms of this License.
102
-
103
- c) If the modified program normally reads commands interactively
104
- when run, you must cause it, when started running for such
105
- interactive use in the most ordinary way, to print or display an
106
- announcement including an appropriate copyright notice and a
107
- notice that there is no warranty (or else, saying that you provide
108
- a warranty) and that users may redistribute the program under
109
- these conditions, and telling the user how to view a copy of this
110
- License. (Exception: if the Program itself is interactive but
111
- does not normally print such an announcement, your work based on
112
- the Program is not required to print an announcement.)
113
-
114
- These requirements apply to the modified work as a whole. If
115
- identifiable sections of that work are not derived from the Program,
116
- and can be reasonably considered independent and separate works in
117
- themselves, then this License, and its terms, do not apply to those
118
- sections when you distribute them as separate works. But when you
119
- distribute the same sections as part of a whole which is a work based
120
- on the Program, the distribution of the whole must be on the terms of
121
- this License, whose permissions for other licensees extend to the
122
- entire whole, and thus to each and every part regardless of who wrote it.
123
-
124
- Thus, it is not the intent of this section to claim rights or contest
125
- your rights to work written entirely by you; rather, the intent is to
126
- exercise the right to control the distribution of derivative or
127
- collective works based on the Program.
128
-
129
- In addition, mere aggregation of another work not based on the Program
130
- with the Program (or with a work based on the Program) on a volume of
131
- a storage or distribution medium does not bring the other work under
132
- the scope of this License.
133
-
134
- 3. You may copy and distribute the Program (or a work based on it,
135
- under Section 2) in object code or executable form under the terms of
136
- Sections 1 and 2 above provided that you also do one of the following:
137
-
138
- a) Accompany it with the complete corresponding machine-readable
139
- source code, which must be distributed under the terms of Sections
140
- 1 and 2 above on a medium customarily used for software interchange; or,
141
-
142
- b) Accompany it with a written offer, valid for at least three
143
- years, to give any third party, for a charge no more than your
144
- cost of physically performing source distribution, a complete
145
- machine-readable copy of the corresponding source code, to be
146
- distributed under the terms of Sections 1 and 2 above on a medium
147
- customarily used for software interchange; or,
148
-
149
- c) Accompany it with the information you received as to the offer
150
- to distribute corresponding source code. (This alternative is
151
- allowed only for noncommercial distribution and only if you
152
- received the program in object code or executable form with such
153
- an offer, in accord with Subsection b above.)
154
-
155
- The source code for a work means the preferred form of the work for
156
- making modifications to it. For an executable work, complete source
157
- code means all the source code for all modules it contains, plus any
158
- associated interface definition files, plus the scripts used to
159
- control compilation and installation of the executable. However, as a
160
- special exception, the source code distributed need not include
161
- anything that is normally distributed (in either source or binary
162
- form) with the major components (compiler, kernel, and so on) of the
163
- operating system on which the executable runs, unless that component
164
- itself accompanies the executable.
165
-
166
- If distribution of executable or object code is made by offering
167
- access to copy from a designated place, then offering equivalent
168
- access to copy the source code from the same place counts as
169
- distribution of the source code, even though third parties are not
170
- compelled to copy the source along with the object code.
171
-
172
- 4. You may not copy, modify, sublicense, or distribute the Program
173
- except as expressly provided under this License. Any attempt
174
- otherwise to copy, modify, sublicense or distribute the Program is
175
- void, and will automatically terminate your rights under this License.
176
- However, parties who have received copies, or rights, from you under
177
- this License will not have their licenses terminated so long as such
178
- parties remain in full compliance.
179
-
180
- 5. You are not required to accept this License, since you have not
181
- signed it. However, nothing else grants you permission to modify or
182
- distribute the Program or its derivative works. These actions are
183
- prohibited by law if you do not accept this License. Therefore, by
184
- modifying or distributing the Program (or any work based on the
185
- Program), you indicate your acceptance of this License to do so, and
186
- all its terms and conditions for copying, distributing or modifying
187
- the Program or works based on it.
188
-
189
- 6. Each time you redistribute the Program (or any work based on the
190
- Program), the recipient automatically receives a license from the
191
- original licensor to copy, distribute or modify the Program subject to
192
- these terms and conditions. You may not impose any further
193
- restrictions on the recipients' exercise of the rights granted herein.
194
- You are not responsible for enforcing compliance by third parties to
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
195
  this License.
196
 
197
- 7. If, as a consequence of a court judgment or allegation of patent
198
- infringement or for any other reason (not limited to patent issues),
199
- conditions are imposed on you (whether by court order, agreement or
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
200
  otherwise) that contradict the conditions of this License, they do not
201
- excuse you from the conditions of this License. If you cannot
202
- distribute so as to satisfy simultaneously your obligations under this
203
- License and any other pertinent obligations, then as a consequence you
204
- may not distribute the Program at all. For example, if a patent
205
- license would not permit royalty-free redistribution of the Program by
206
- all those who receive copies directly or indirectly through you, then
207
- the only way you could satisfy both it and this License would be to
208
- refrain entirely from distribution of the Program.
209
-
210
- If any portion of this section is held invalid or unenforceable under
211
- any particular circumstance, the balance of the section is intended to
212
- apply and the section as a whole is intended to apply in other
213
- circumstances.
214
-
215
- It is not the purpose of this section to induce you to infringe any
216
- patents or other property right claims or to contest validity of any
217
- such claims; this section has the sole purpose of protecting the
218
- integrity of the free software distribution system, which is
219
- implemented by public license practices. Many people have made
220
- generous contributions to the wide range of software distributed
221
- through that system in reliance on consistent application of that
222
- system; it is up to the author/donor to decide if he or she is willing
223
- to distribute software through any other system and a licensee cannot
224
- impose that choice.
225
-
226
- This section is intended to make thoroughly clear what is believed to
227
- be a consequence of the rest of this License.
228
-
229
- 8. If the distribution and/or use of the Program is restricted in
230
- certain countries either by patents or by copyrighted interfaces, the
231
- original copyright holder who places the Program under this License
232
- may add an explicit geographical distribution limitation excluding
233
- those countries, so that distribution is permitted only in or among
234
- countries not thus excluded. In such case, this License incorporates
235
- the limitation as if written in the body of this License.
236
-
237
- 9. The Free Software Foundation may publish revised and/or new versions
238
- of the General Public License from time to time. Such new versions will
239
  be similar in spirit to the present version, but may differ in detail to
240
  address new problems or concerns.
241
 
242
- Each version is given a distinguishing version number. If the Program
243
- specifies a version number of this License which applies to it and "any
244
- later version", you have the option of following the terms and conditions
245
- either of that version or of any later version published by the Free
246
- Software Foundation. If the Program does not specify a version number of
247
- this License, you may choose any version ever published by the Free Software
248
- Foundation.
249
-
250
- 10. If you wish to incorporate parts of the Program into other free
251
- programs whose distribution conditions are different, write to the author
252
- to ask for permission. For software which is copyrighted by the Free
253
- Software Foundation, write to the Free Software Foundation; we sometimes
254
- make exceptions for this. Our decision will be guided by the two goals
255
- of preserving the free status of all derivatives of our free software and
256
- of promoting the sharing and reuse of software generally.
257
-
258
- NO WARRANTY
259
-
260
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261
- FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262
- OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263
- PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264
- OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265
- MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266
- TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267
- PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268
- REPAIR OR CORRECTION.
269
-
270
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271
- WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272
- REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273
- INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274
- OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275
- TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276
- YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277
- PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278
- POSSIBILITY OF SUCH DAMAGES.
 
 
 
 
 
 
 
 
 
 
 
 
 
279
 
280
  END OF TERMS AND CONDITIONS
281
 
@@ -287,15 +628,15 @@ free software which everyone can redistribute and change under these terms.
287
 
288
  To do so, attach the following notices to the program. It is safest
289
  to attach them to the start of each source file to most effectively
290
- convey the exclusion of warranty; and each file should have at least
291
  the "copyright" line and a pointer to where the full notice is found.
292
 
293
  <one line to give the program's name and a brief idea of what it does.>
294
  Copyright (C) <year> <name of author>
295
 
296
- This program is free software; you can redistribute it and/or modify
297
  it under the terms of the GNU General Public License as published by
298
- the Free Software Foundation; either version 2 of the License, or
299
  (at your option) any later version.
300
 
301
  This program is distributed in the hope that it will be useful,
@@ -303,37 +644,31 @@ the "copyright" line and a pointer to where the full notice is found.
303
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304
  GNU General Public License for more details.
305
 
306
- You should have received a copy of the GNU General Public License along
307
- with this program; if not, write to the Free Software Foundation, Inc.,
308
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
309
 
310
  Also add information on how to contact you by electronic and paper mail.
311
 
312
- If the program is interactive, make it output a short notice like this
313
- when it starts in an interactive mode:
314
 
315
- Gnomovision version 69, Copyright (C) year name of author
316
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
317
  This is free software, and you are welcome to redistribute it
318
  under certain conditions; type `show c' for details.
319
 
320
  The hypothetical commands `show w' and `show c' should show the appropriate
321
- parts of the General Public License. Of course, the commands you use may
322
- be called something other than `show w' and `show c'; they could even be
323
- mouse-clicks or menu items--whatever suits your program.
324
-
325
- You should also get your employer (if you work as a programmer) or your
326
- school, if any, to sign a "copyright disclaimer" for the program, if
327
- necessary. Here is a sample; alter the names:
328
-
329
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
331
-
332
- <signature of Ty Coon>, 1 April 1989
333
- Ty Coon, President of Vice
334
-
335
- This General Public License does not permit incorporating your program into
336
- proprietary programs. If your program is a subroutine library, you may
337
- consider it more useful to permit linking proprietary applications with the
338
- library. If this is what you want to do, use the GNU Lesser General
339
- Public License instead of this License.
1
  GNU GENERAL PUBLIC LICENSE
2
+ Version 3, 29 June 2007
3
 
4
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 
5
  Everyone is permitted to copy and distribute verbatim copies
6
  of this license document, but changing it is not allowed.
7
 
8
  Preamble
9
 
10
+ The GNU General Public License is a free, copyleft license for
11
+ software and other kinds of works.
12
+
13
+ The licenses for most software and other practical works are designed
14
+ to take away your freedom to share and change the works. By contrast,
15
+ the GNU General Public License is intended to guarantee your freedom to
16
+ share and change all versions of a program--to make sure it remains free
17
+ software for all its users. We, the Free Software Foundation, use the
18
+ GNU General Public License for most of our software; it applies also to
19
+ any other work released this way by its authors. You can apply it to
20
  your programs, too.
21
 
22
  When we speak of free software, we are referring to freedom, not
23
  price. Our General Public Licenses are designed to make sure that you
24
  have the freedom to distribute copies of free software (and charge for
25
+ them if you wish), that you receive source code or can get it if you
26
+ want it, that you can change the software or use pieces of it in new
27
+ free programs, and that you know you can do these things.
28
 
29
+ To protect your rights, we need to prevent others from denying you
30
+ these rights or asking you to surrender the rights. Therefore, you have
31
+ certain responsibilities if you distribute copies of the software, or if
32
+ you modify it: responsibilities to respect the freedom of others.
33
 
34
  For example, if you distribute copies of such a program, whether
35
+ gratis or for a fee, you must pass on to the recipients the same
36
+ freedoms that you received. You must make sure that they, too, receive
37
+ or can get the source code. And you must show them these terms so they
38
+ know their rights.
39
+
40
+ Developers that use the GNU GPL protect your rights with two steps:
41
+ (1) assert copyright on the software, and (2) offer you this License
42
+ giving you legal permission to copy, distribute and/or modify it.
43
+
44
+ For the developers' and authors' protection, the GPL clearly explains
45
+ that there is no warranty for this free software. For both users' and
46
+ authors' sake, the GPL requires that modified versions be marked as
47
+ changed, so that their problems will not be attributed erroneously to
48
+ authors of previous versions.
49
+
50
+ Some devices are designed to deny users access to install or run
51
+ modified versions of the software inside them, although the manufacturer
52
+ can do so. This is fundamentally incompatible with the aim of
53
+ protecting users' freedom to change the software. The systematic
54
+ pattern of such abuse occurs in the area of products for individuals to
55
+ use, which is precisely where it is most unacceptable. Therefore, we
56
+ have designed this version of the GPL to prohibit the practice for those
57
+ products. If such problems arise substantially in other domains, we
58
+ stand ready to extend this provision to those domains in future versions
59
+ of the GPL, as needed to protect the freedom of users.
60
+
61
+ Finally, every program is threatened constantly by software patents.
62
+ States should not allow patents to restrict development and use of
63
+ software on general-purpose computers, but in those that do, we wish to
64
+ avoid the special danger that patents applied to a free program could
65
+ make it effectively proprietary. To prevent this, the GPL assures that
66
+ patents cannot be used to render the program non-free.
67
 
68
  The precise terms and conditions for copying, distribution and
69
  modification follow.
70
 
71
+ TERMS AND CONDITIONS
72
+
73
+ 0. Definitions.
74
+
75
+ "This License" refers to version 3 of the GNU General Public License.
76
+
77
+ "Copyright" also means copyright-like laws that apply to other kinds of
78
+ works, such as semiconductor masks.
79
+
80
+ "The Program" refers to any copyrightable work licensed under this
81
+ License. Each licensee is addressed as "you". "Licensees" and
82
+ "recipients" may be individuals or organizations.
83
+
84
+ To "modify" a work means to copy from or adapt all or part of the work
85
+ in a fashion requiring copyright permission, other than the making of an
86
+ exact copy. The resulting work is called a "modified version" of the
87
+ earlier work or a work "based on" the earlier work.
88
+
89
+ A "covered work" means either the unmodified Program or a work based
90
+ on the Program.
91
+
92
+ To "propagate" a work means to do anything with it that, without
93
+ permission, would make you directly or secondarily liable for
94
+ infringement under applicable copyright law, except executing it on a
95
+ computer or modifying a private copy. Propagation includes copying,
96
+ distribution (with or without modification), making available to the
97
+ public, and in some countries other activities as well.
98
+
99
+ To "convey" a work means any kind of propagation that enables other
100
+ parties to make or receive copies. Mere interaction with a user through
101
+ a computer network, with no transfer of a copy, is not conveying.
102
+
103
+ An interactive user interface displays "Appropriate Legal Notices"
104
+ to the extent that it includes a convenient and prominently visible
105
+ feature that (1) displays an appropriate copyright notice, and (2)
106
+ tells the user that there is no warranty for the work (except to the
107
+ extent that warranties are provided), that licensees may convey the
108
+ work under this License, and how to view a copy of this License. If
109
+ the interface presents a list of user commands or options, such as a
110
+ menu, a prominent item in the list meets this criterion.
111
+
112
+ 1. Source Code.
113
+
114
+ The "source code" for a work means the preferred form of the work
115
+ for making modifications to it. "Object code" means any non-source
116
+ form of a work.
117
+
118
+ A "Standard Interface" means an interface that either is an official
119
+ standard defined by a recognized standards body, or, in the case of
120
+ interfaces specified for a particular programming language, one that
121
+ is widely used among developers working in that language.
122
+
123
+ The "System Libraries" of an executable work include anything, other
124
+ than the work as a whole, that (a) is included in the normal form of
125
+ packaging a Major Component, but which is not part of that Major
126
+ Component, and (b) serves only to enable use of the work with that
127
+ Major Component, or to implement a Standard Interface for which an
128
+ implementation is available to the public in source code form. A
129
+ "Major Component", in this context, means a major essential component
130
+ (kernel, window system, and so on) of the specific operating system
131
+ (if any) on which the executable work runs, or a compiler used to
132
+ produce the work, or an object code interpreter used to run it.
133
+
134
+ The "Corresponding Source" for a work in object code form means all
135
+ the source code needed to generate, install, and (for an executable
136
+ work) run the object code and to modify the work, including scripts to
137
+ control those activities. However, it does not include the work's
138
+ System Libraries, or general-purpose tools or generally available free
139
+ programs which are used unmodified in performing those activities but
140
+ which are not part of the work. For example, Corresponding Source
141
+ includes interface definition files associated with source files for
142
+ the work, and the source code for shared libraries and dynamically
143
+ linked subprograms that the work is specifically designed to require,
144
+ such as by intimate data communication or control flow between those
145
+ subprograms and other parts of the work.
146
+
147
+ The Corresponding Source need not include anything that users
148
+ can regenerate automatically from other parts of the Corresponding
149
+ Source.
150
+
151
+ The Corresponding Source for a work in source code form is that
152
+ same work.
153
+
154
+ 2. Basic Permissions.
155
+
156
+ All rights granted under this License are granted for the term of
157
+ copyright on the Program, and are irrevocable provided the stated
158
+ conditions are met. This License explicitly affirms your unlimited
159
+ permission to run the unmodified Program. The output from running a
160
+ covered work is covered by this License only if the output, given its
161
+ content, constitutes a covered work. This License acknowledges your
162
+ rights of fair use or other equivalent, as provided by copyright law.
163
+
164
+ You may make, run and propagate covered works that you do not
165
+ convey, without conditions so long as your license otherwise remains
166
+ in force. You may convey covered works to others for the sole purpose
167
+ of having them make modifications exclusively for you, or provide you
168
+ with facilities for running those works, provided that you comply with
169
+ the terms of this License in conveying all material for which you do
170
+ not control copyright. Those thus making or running the covered works
171
+ for you must do so exclusively on your behalf, under your direction
172
+ and control, on terms that prohibit them from making any copies of
173
+ your copyrighted material outside their relationship with you.
174
+
175
+ Conveying under any other circumstances is permitted solely under
176
+ the conditions stated below. Sublicensing is not allowed; section 10
177
+ makes it unnecessary.
178
+
179
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180
+
181
+ No covered work shall be deemed part of an effective technological
182
+ measure under any applicable law fulfilling obligations under article
183
+ 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184
+ similar laws prohibiting or restricting circumvention of such
185
+ measures.
186
+
187
+ When you convey a covered work, you waive any legal power to forbid
188
+ circumvention of technological measures to the extent such circumvention
189
+ is effected by exercising rights under this License with respect to
190
+ the covered work, and you disclaim any intention to limit operation or
191
+ modification of the work as a means of enforcing, against the work's
192
+ users, your or third parties' legal rights to forbid circumvention of
193
+ technological measures.
194
+
195
+ 4. Conveying Verbatim Copies.
196
+
197
+ You may convey verbatim copies of the Program's source code as you
198
+ receive it, in any medium, provided that you conspicuously and
199
+ appropriately publish on each copy an appropriate copyright notice;
200
+ keep intact all notices stating that this License and any
201
+ non-permissive terms added in accord with section 7 apply to the code;
202
+ keep intact all notices of the absence of any warranty; and give all
203
+ recipients a copy of this License along with the Program.
204
+
205
+ You may charge any price or no price for each copy that you convey,
206
+ and you may offer support or warranty protection for a fee.
207
+
208
+ 5. Conveying Modified Source Versions.
209
+
210
+ You may convey a work based on the Program, or the modifications to
211
+ produce it from the Program, in the form of source code under the
212
+ terms of section 4, provided that you also meet all of these conditions:
213
+
214
+ a) The work must carry prominent notices stating that you modified
215
+ it, and giving a relevant date.
216
+
217
+ b) The work must carry prominent notices stating that it is
218
+ released under this License and any conditions added under section
219
+ 7. This requirement modifies the requirement in section 4 to
220
+ "keep intact all notices".
221
+
222
+ c) You must license the entire work, as a whole, under this
223
+ License to anyone who comes into possession of a copy. This
224
+ License will therefore apply, along with any applicable section 7
225
+ additional terms, to the whole of the work, and all its parts,
226
+ regardless of how they are packaged. This License gives no
227
+ permission to license the work in any other way, but it does not
228
+ invalidate such permission if you have separately received it.
229
+
230
+ d) If the work has interactive user interfaces, each must display
231
+ Appropriate Legal Notices; however, if the Program has interactive
232
+ interfaces that do not display Appropriate Legal Notices, your
233
+ work need not make them do so.
234
+
235
+ A compilation of a covered work with other separate and independent
236
+ works, which are not by their nature extensions of the covered work,
237
+ and which are not combined with it such as to form a larger program,
238
+ in or on a volume of a storage or distribution medium, is called an
239
+ "aggregate" if the compilation and its resulting copyright are not
240
+ used to limit the access or legal rights of the compilation's users
241
+ beyond what the individual works permit. Inclusion of a covered work
242
+ in an aggregate does not cause this License to apply to the other
243
+ parts of the aggregate.
244
+
245
+ 6. Conveying Non-Source Forms.
246
+
247
+ You may convey a covered work in object code form under the terms
248
+ of sections 4 and 5, provided that you also convey the
249
+ machine-readable Corresponding Source under the terms of this License,
250
+ in one of these ways:
251
+
252
+ a) Convey the object code in, or embodied in, a physical product
253
+ (including a physical distribution medium), accompanied by the
254
+ Corresponding Source fixed on a durable physical medium
255
+ customarily used for software interchange.
256
+
257
+ b) Convey the object code in, or embodied in, a physical product
258
+ (including a physical distribution medium), accompanied by a
259
+ written offer, valid for at least three years and valid for as
260
+ long as you offer spare parts or customer support for that product
261
+ model, to give anyone who possesses the object code either (1) a
262
+ copy of the Corresponding Source for all the software in the
263
+ product that is covered by this License, on a durable physical
264
+ medium customarily used for software interchange, for a price no
265
+ more than your reasonable cost of physically performing this
266
+ conveying of source, or (2) access to copy the
267
+ Corresponding Source from a network server at no charge.
268
+
269
+ c) Convey individual copies of the object code with a copy of the
270
+ written offer to provide the Corresponding Source. This
271
+ alternative is allowed only occasionally and noncommercially, and
272
+ only if you received the object code with such an offer, in accord
273
+ with subsection 6b.
274
+
275
+ d) Convey the object code by offering access from a designated
276
+ place (gratis or for a charge), and offer equivalent access to the
277
+ Corresponding Source in the same way through the same place at no
278
+ further charge. You need not require recipients to copy the
279
+ Corresponding Source along with the object code. If the place to
280
+ copy the object code is a network server, the Corresponding Source
281
+ may be on a different server (operated by you or a third party)
282
+ that supports equivalent copying facilities, provided you maintain
283
+ clear directions next to the object code saying where to find the
284
+ Corresponding Source. Regardless of what server hosts the
285
+ Corresponding Source, you remain obligated to ensure that it is
286
+ available for as long as needed to satisfy these requirements.
287
+
288
+ e) Convey the object code using peer-to-peer transmission, provided
289
+ you inform other peers where the object code and Corresponding
290
+ Source of the work are being offered to the general public at no
291
+ charge under subsection 6d.
292
+
293
+ A separable portion of the object code, whose source code is excluded
294
+ from the Corresponding Source as a System Library, need not be
295
+ included in conveying the object code work.
296
+
297
+ A "User Product" is either (1) a "consumer product", which means any
298
+ tangible personal property which is normally used for personal, family,
299
+ or household purposes, or (2) anything designed or sold for incorporation
300
+ into a dwelling. In determining whether a product is a consumer product,
301
+ doubtful cases shall be resolved in favor of coverage. For a particular
302
+ product received by a particular user, "normally used" refers to a
303
+ typical or common use of that class of product, regardless of the status
304
+ of the particular user or of the way in which the particular user
305
+ actually uses, or expects or is expected to use, the product. A product
306
+ is a consumer product regardless of whether the product has substantial
307
+ commercial, industrial or non-consumer uses, unless such uses represent
308
+ the only significant mode of use of the product.
309
+
310
+ "Installation Information" for a User Product means any methods,
311
+ procedures, authorization keys, or other information required to install
312
+ and execute modified versions of a covered work in that User Product from
313
+ a modified version of its Corresponding Source. The information must
314
+ suffice to ensure that the continued functioning of the modified object
315
+ code is in no case prevented or interfered with solely because
316
+ modification has been made.
317
+
318
+ If you convey an object code work under this section in, or with, or
319
+ specifically for use in, a User Product, and the conveying occurs as
320
+ part of a transaction in which the right of possession and use of the
321
+ User Product is transferred to the recipient in perpetuity or for a
322
+ fixed term (regardless of how the transaction is characterized), the
323
+ Corresponding Source conveyed under this section must be accompanied
324
+ by the Installation Information. But this requirement does not apply
325
+ if neither you nor any third party retains the ability to install
326
+ modified object code on the User Product (for example, the work has
327
+ been installed in ROM).
328
+
329
+ The requirement to provide Installation Information does not include a
330
+ requirement to continue to provide support service, warranty, or updates
331
+ for a work that has been modified or installed by the recipient, or for
332
+ the User Product in which it has been modified or installed. Access to a
333
+ network may be denied when the modification itself materially and
334
+ adversely affects the operation of the network or violates the rules and
335
+ protocols for communication across the network.
336
+
337
+ Corresponding Source conveyed, and Installation Information provided,
338
+ in accord with this section must be in a format that is publicly
339
+ documented (and with an implementation available to the public in
340
+ source code form), and must require no special password or key for
341
+ unpacking, reading or copying.
342
+
343
+ 7. Additional Terms.
344
+
345
+ "Additional permissions" are terms that supplement the terms of this
346
+ License by making exceptions from one or more of its conditions.
347
+ Additional permissions that are applicable to the entire Program shall
348
+ be treated as though they were included in this License, to the extent
349
+ that they are valid under applicable law. If additional permissions
350
+ apply only to part of the Program, that part may be used separately
351
+ under those permissions, but the entire Program remains governed by
352
+ this License without regard to the additional permissions.
353
+
354
+ When you convey a copy of a covered work, you may at your option
355
+ remove any additional permissions from that copy, or from any part of
356
+ it. (Additional permissions may be written to require their own
357
+ removal in certain cases when you modify the work.) You may place
358
+ additional permissions on material, added by you to a covered work,
359
+ for which you have or can give appropriate copyright permission.
360
+
361
+ Notwithstanding any other provision of this License, for material you
362
+ add to a covered work, you may (if authorized by the copyright holders of
363
+ that material) supplement the terms of this License with terms:
364
+
365
+ a) Disclaiming warranty or limiting liability differently from the
366
+ terms of sections 15 and 16 of this License; or
367
+
368
+ b) Requiring preservation of specified reasonable legal notices or
369
+ author attributions in that material or in the Appropriate Legal
370
+ Notices displayed by works containing it; or
371
+
372
+ c) Prohibiting misrepresentation of the origin of that material, or
373
+ requiring that modified versions of such material be marked in
374
+ reasonable ways as different from the original version; or
375
+
376
+ d) Limiting the use for publicity purposes of names of licensors or
377
+ authors of the material; or
378
+
379
+ e) Declining to grant rights under trademark law for use of some
380
+ trade names, trademarks, or service marks; or
381
+
382
+ f) Requiring indemnification of licensors and authors of that
383
+ material by anyone who conveys the material (or modified versions of
384
+ it) with contractual assumptions of liability to the recipient, for
385
+ any liability that these contractual assumptions directly impose on
386
+ those licensors and authors.
387
+
388
+ All other non-permissive additional terms are considered "further
389
+ restrictions" within the meaning of section 10. If the Program as you
390
+ received it, or any part of it, contains a notice stating that it is
391
+ governed by this License along with a term that is a further
392
+ restriction, you may remove that term. If a license document contains
393
+ a further restriction but permits relicensing or conveying under this
394
+ License, you may add to a covered work material governed by the terms
395
+ of that license document, provided that the further restriction does
396
+ not survive such relicensing or conveying.
397
+
398
+ If you add terms to a covered work in accord with this section, you
399
+ must place, in the relevant source files, a statement of the
400
+ additional terms that apply to those files, or a notice indicating
401
+ where to find the applicable terms.
402
+
403
+ Additional terms, permissive or non-permissive, may be stated in the
404
+ form of a separately written license, or stated as exceptions;
405
+ the above requirements apply either way.
406
+
407
+ 8. Termination.
408
+
409
+ You may not propagate or modify a covered work except as expressly
410
+ provided under this License. Any attempt otherwise to propagate or
411
+ modify it is void, and will automatically terminate your rights under
412
+ this License (including any patent licenses granted under the third
413
+ paragraph of section 11).
414
+
415
+ However, if you cease all violation of this License, then your
416
+ license from a particular copyright holder is reinstated (a)
417
+ provisionally, unless and until the copyright holder explicitly and
418
+ finally terminates your license, and (b) permanently, if the copyright
419
+ holder fails to notify you of the violation by some reasonable means
420
+ prior to 60 days after the cessation.
421
+
422
+ Moreover, your license from a particular copyright holder is
423
+ reinstated permanently if the copyright holder notifies you of the
424
+ violation by some reasonable means, this is the first time you have
425
+ received notice of violation of this License (for any work) from that
426
+ copyright holder, and you cure the violation prior to 30 days after
427
+ your receipt of the notice.
428
+
429
+ Termination of your rights under this section does not terminate the
430
+ licenses of parties who have received copies or rights from you under
431
+ this License. If your rights have been terminated and not permanently
432
+ reinstated, you do not qualify to receive new licenses for the same
433
+ material under section 10.
434
+
435
+ 9. Acceptance Not Required for Having Copies.
436
+
437
+ You are not required to accept this License in order to receive or
438
+ run a copy of the Program. Ancillary propagation of a covered work
439
+ occurring solely as a consequence of using peer-to-peer transmission
440
+ to receive a copy likewise does not require acceptance. However,
441
+ nothing other than this License grants you permission to propagate or
442
+ modify any covered work. These actions infringe copyright if you do
443
+ not accept this License. Therefore, by modifying or propagating a
444
+ covered work, you indicate your acceptance of this License to do so.
445
+
446
+ 10. Automatic Licensing of Downstream Recipients.
447
+
448
+ Each time you convey a covered work, the recipient automatically
449
+ receives a license from the original licensors, to run, modify and
450
+ propagate that work, subject to this License. You are not responsible
451
+ for enforcing compliance by third parties with this License.
452
+
453
+ An "entity transaction" is a transaction transferring control of an
454
+ organization, or substantially all assets of one, or subdividing an
455
+ organization, or merging organizations. If propagation of a covered
456
+ work results from an entity transaction, each party to that
457
+ transaction who receives a copy of the work also receives whatever
458
+ licenses to the work the party's predecessor in interest had or could
459
+ give under the previous paragraph, plus a right to possession of the
460
+ Corresponding Source of the work from the predecessor in interest, if
461
+ the predecessor has it or can get it with reasonable efforts.
462
+
463
+ You may not impose any further restrictions on the exercise of the
464
+ rights granted or affirmed under this License. For example, you may
465
+ not impose a license fee, royalty, or other charge for exercise of
466
+ rights granted under this License, and you may not initiate litigation
467
+ (including a cross-claim or counterclaim in a lawsuit) alleging that
468
+ any patent claim is infringed by making, using, selling, offering for
469
+ sale, or importing the Program or any portion of it.
470
+
471
+ 11. Patents.
472
+
473
+ A "contributor" is a copyright holder who authorizes use under this
474
+ License of the Program or a work on which the Program is based. The
475
+ work thus licensed is called the contributor's "contributor version".
476
+
477
+ A contributor's "essential patent claims" are all patent claims
478
+ owned or controlled by the contributor, whether already acquired or
479
+ hereafter acquired, that would be infringed by some manner, permitted
480
+ by this License, of making, using, or selling its contributor version,
481
+ but do not include claims that would be infringed only as a
482
+ consequence of further modification of the contributor version. For
483
+ purposes of this definition, "control" includes the right to grant
484
+ patent sublicenses in a manner consistent with the requirements of
485
  this License.
486
 
487
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
488
+ patent license under the contributor's essential patent claims, to
489
+ make, use, sell, offer for sale, import and otherwise run, modify and
490
+ propagate the contents of its contributor version.
491
+
492
+ In the following three paragraphs, a "patent license" is any express
493
+ agreement or commitment, however denominated, not to enforce a patent
494
+ (such as an express permission to practice a patent or covenant not to
495
+ sue for patent infringement). To "grant" such a patent license to a
496
+ party means to make such an agreement or commitment not to enforce a
497
+ patent against the party.
498
+
499
+ If you convey a covered work, knowingly relying on a patent license,
500
+ and the Corresponding Source of the work is not available for anyone
501
+ to copy, free of charge and under the terms of this License, through a
502
+ publicly available network server or other readily accessible means,
503
+ then you must either (1) cause the Corresponding Source to be so
504
+ available, or (2) arrange to deprive yourself of the benefit of the
505
+ patent license for this particular work, or (3) arrange, in a manner
506
+ consistent with the requirements of this License, to extend the patent
507
+ license to downstream recipients. "Knowingly relying" means you have
508
+ actual knowledge that, but for the patent license, your conveying the
509
+ covered work in a country, or your recipient's use of the covered work
510
+ in a country, would infringe one or more identifiable patents in that
511
+ country that you have reason to believe are valid.
512
+
513
+ If, pursuant to or in connection with a single transaction or
514
+ arrangement, you convey, or propagate by procuring conveyance of, a
515
+ covered work, and grant a patent license to some of the parties
516
+ receiving the covered work authorizing them to use, propagate, modify
517
+ or convey a specific copy of the covered work, then the patent license
518
+ you grant is automatically extended to all recipients of the covered
519
+ work and works based on it.
520
+
521
+ A patent license is "discriminatory" if it does not include within
522
+ the scope of its coverage, prohibits the exercise of, or is
523
+ conditioned on the non-exercise of one or more of the rights that are
524
+ specifically granted under this License. You may not convey a covered
525
+ work if you are a party to an arrangement with a third party that is
526
+ in the business of distributing software, under which you make payment
527
+ to the third party based on the extent of your activity of conveying
528
+ the work, and under which the third party grants, to any of the
529
+ parties who would receive the covered work from you, a discriminatory
530
+ patent license (a) in connection with copies of the covered work
531
+ conveyed by you (or copies made from those copies), or (b) primarily
532
+ for and in connection with specific products or compilations that
533
+ contain the covered work, unless you entered into that arrangement,
534
+ or that patent license was granted, prior to 28 March 2007.
535
+
536
+ Nothing in this License shall be construed as excluding or limiting
537
+ any implied license or other defenses to infringement that may
538
+ otherwise be available to you under applicable patent law.
539
+
540
+ 12. No Surrender of Others' Freedom.
541
+
542
+ If conditions are imposed on you (whether by court order, agreement or
543
  otherwise) that contradict the conditions of this License, they do not
544
+ excuse you from the conditions of this License. If you cannot convey a
545
+ covered work so as to satisfy simultaneously your obligations under this
546
+ License and any other pertinent obligations, then as a consequence you may
547
+ not convey it at all. For example, if you agree to terms that obligate you
548
+ to collect a royalty for further conveying from those to whom you convey
549
+ the Program, the only way you could satisfy both those terms and this
550
+ License would be to refrain entirely from conveying the Program.
551
+
552
+ 13. Use with the GNU Affero General Public License.
553
+
554
+ Notwithstanding any other provision of this License, you have
555
+ permission to link or combine any covered work with a work licensed
556
+ under version 3 of the GNU Affero General Public License into a single
557
+ combined work, and to convey the resulting work. The terms of this
558
+ License will continue to apply to the part which is the covered work,
559
+ but the special requirements of the GNU Affero General Public License,
560
+ section 13, concerning interaction through a network will apply to the
561
+ combination as such.
562
+
563
+ 14. Revised Versions of this License.
564
+
565
+ The Free Software Foundation may publish revised and/or new versions of
566
+ the GNU General Public License from time to time. Such new versions will
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
567
  be similar in spirit to the present version, but may differ in detail to
568
  address new problems or concerns.
569
 
570
+ Each version is given a distinguishing version number. If the
571
+ Program specifies that a certain numbered version of the GNU General
572
+ Public License "or any later version" applies to it, you have the
573
+ option of following the terms and conditions either of that numbered
574
+ version or of any later version published by the Free Software
575
+ Foundation. If the Program does not specify a version number of the
576
+ GNU General Public License, you may choose any version ever published
577
+ by the Free Software Foundation.
578
+
579
+ If the Program specifies that a proxy can decide which future
580
+ versions of the GNU General Public License can be used, that proxy's
581
+ public statement of acceptance of a version permanently authorizes you
582
+ to choose that version for the Program.
583
+
584
+ Later license versions may give you additional or different
585
+ permissions. However, no additional obligations are imposed on any
586
+ author or copyright holder as a result of your choosing to follow a
587
+ later version.
588
+
589
+ 15. Disclaimer of Warranty.
590
+
591
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592
+ APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593
+ HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594
+ OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596
+ PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597
+ IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598
+ ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599
+
600
+ 16. Limitation of Liability.
601
+
602
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604
+ THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605
+ GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606
+ USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607
+ DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608
+ PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609
+ EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610
+ SUCH DAMAGES.
611
+
612
+ 17. Interpretation of Sections 15 and 16.
613
+
614
+ If the disclaimer of warranty and limitation of liability provided
615
+ above cannot be given local legal effect according to their terms,
616
+ reviewing courts shall apply local law that most closely approximates
617
+ an absolute waiver of all civil liability in connection with the
618
+ Program, unless a warranty or assumption of liability accompanies a
619
+ copy of the Program in return for a fee.
620
 
621
  END OF TERMS AND CONDITIONS
622
 
628
 
629
  To do so, attach the following notices to the program. It is safest
630
  to attach them to the start of each source file to most effectively
631
+ state the exclusion of warranty; and each file should have at least
632
  the "copyright" line and a pointer to where the full notice is found.
633
 
634
  <one line to give the program's name and a brief idea of what it does.>
635
  Copyright (C) <year> <name of author>
636
 
637
+ This program is free software: you can redistribute it and/or modify
638
  it under the terms of the GNU General Public License as published by
639
+ the Free Software Foundation, either version 3 of the License, or
640
  (at your option) any later version.
641
 
642
  This program is distributed in the hope that it will be useful,
644
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645
  GNU General Public License for more details.
646
 
647
+ You should have received a copy of the GNU General Public License
648
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
 
649
 
650
  Also add information on how to contact you by electronic and paper mail.
651
 
652
+ If the program does terminal interaction, make it output a short
653
+ notice like this when it starts in an interactive mode:
654
 
655
+ <program> Copyright (C) <year> <name of author>
656
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657
  This is free software, and you are welcome to redistribute it
658
  under certain conditions; type `show c' for details.
659
 
660
  The hypothetical commands `show w' and `show c' should show the appropriate
661
+ parts of the General Public License. Of course, your program's commands
662
+ might be different; for a GUI interface, you would use an "about box".
663
+
664
+ You should also get your employer (if you work as a programmer) or school,
665
+ if any, to sign a "copyright disclaimer" for the program, if necessary.
666
+ For more information on this, and how to apply and follow the GNU GPL, see
667
+ <https://www.gnu.org/licenses/>.
668
+
669
+ The GNU General Public License does not permit incorporating your program
670
+ into proprietary programs. If your program is a subroutine library, you
671
+ may consider it more useful to permit linking proprietary applications with
672
+ the library. If this is what you want to do, use the GNU Lesser General
673
+ Public License instead of this License. But first, please read
674
+ <https://www.gnu.org/licenses/why-not-lgpl.html>.
 
 
 
 
 
changelog.txt CHANGED
@@ -1,6 +1,22 @@
1
  NextGEN Gallery
2
  by Imagely
3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  = v3.5.0 - 12.17.2020 =
5
  * Changed: Deprecated legacy template functionality
6
  * Changed: Deprecated built-in custom style / CSS mechanism
@@ -212,12 +228,12 @@ by Imagely
212
  * Changed: Updated jquery.waitforimages.js
213
  * Fixed: Uploading of non-JPEG images and uploading of JPEG with invalid EXIF data
214
 
215
- = V3.1.4 - 12.21.2018 =
216
- * Fixed: Visual shortcode not displaying in WP 5.0.2
217
-
218
  = V3.1.3 - 01.08.2018 =
219
  * Fixed: Post thumbnail support for NextGEN Gallery when using Block Editor
220
 
 
 
 
221
  = V3.1.2 - 12.18.2018 =
222
  * Fixed: Variable mismatch error when using central gallery management pages
223
 
1
  NextGEN Gallery
2
  by Imagely
3
 
4
+ = V3.6.0 - 02.10.2020 =
5
+ * NEW: Added new 'Bulk actions' option to remove EXIF Orientation from existing images (1137)
6
+ * NEW: Allow maximum_entity_limit display setting regardless of source (1146)
7
+ * NEW: Provide hooks to customize Uppy settings (1139)
8
+ * NEW: Recreated legacy templates as modern "views" (1127)
9
+ * Fixed: A compatibility warning with NextGEN Plus would appear when users had NextGEN Starter (1097)
10
+ * Fixed: Compatibility issue with Topscorer Theme (344171)
11
+ * Fixed: Compatibility with Custom Post Types UI (1076)
12
+ * Fixed: Compatibility with jQuery.mmenu (1140)
13
+ * Fixed: Disable marketing additions for users with NextGEN Starter enabled
14
+ * Fixed: Error responses from the server when uploading images failed were not specific (1121)
15
+ * Fixed: Image rotation not reliable (1137)
16
+ * Fixed: Imagebrowser pagination broke on images with UTF8 characters in their title (1135)
17
+ * Fixed: Shortcodes displaying albums did not appear in the order listed (1128)
18
+ * Fixed: Transient tracker was calling update_option() on every page (1074)
19
+
20
  = v3.5.0 - 12.17.2020 =
21
  * Changed: Deprecated legacy template functionality
22
  * Changed: Deprecated built-in custom style / CSS mechanism
228
  * Changed: Updated jquery.waitforimages.js
229
  * Fixed: Uploading of non-JPEG images and uploading of JPEG with invalid EXIF data
230
 
 
 
 
231
  = V3.1.3 - 01.08.2018 =
232
  * Fixed: Post thumbnail support for NextGEN Gallery when using Block Editor
233
 
234
+ = V3.1.4 - 12.21.2018 =
235
+ * Fixed: Visual shortcode not displaying in WP 5.0.2
236
+
237
  = V3.1.2 - 12.18.2018 =
238
  * Fixed: Variable mismatch error when using central gallery management pages
239
 
composer.lock CHANGED
@@ -4,7 +4,7 @@
4
  "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5
  "This file is @generated automatically"
6
  ],
7
- "content-hash": "956135bbaec31c8fc7a076fffe733ce3",
8
  "packages": [
9
  {
10
  "name": "ezyang/htmlpurifier",
@@ -109,16 +109,16 @@
109
  "packages-dev": [
110
  {
111
  "name": "nikic/php-parser",
112
- "version": "v4.10.2",
113
  "source": {
114
  "type": "git",
115
  "url": "https://github.com/nikic/PHP-Parser.git",
116
- "reference": "658f1be311a230e0907f5dfe0213742aff0596de"
117
  },
118
  "dist": {
119
  "type": "zip",
120
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/658f1be311a230e0907f5dfe0213742aff0596de",
121
- "reference": "658f1be311a230e0907f5dfe0213742aff0596de",
122
  "shasum": "",
123
  "mirrors": [
124
  {
@@ -165,9 +165,9 @@
165
  ],
166
  "support": {
167
  "issues": "https://github.com/nikic/PHP-Parser/issues",
168
- "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.2"
169
  },
170
- "time": "2020-09-26T10:30:38+00:00"
171
  }
172
  ],
173
  "aliases": [],
@@ -176,5 +176,6 @@
176
  "prefer-stable": false,
177
  "prefer-lowest": false,
178
  "platform": [],
179
- "platform-dev": []
 
180
  }
4
  "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5
  "This file is @generated automatically"
6
  ],
7
+ "content-hash": "95428e682aeba320e034a477c1f68ebb",
8
  "packages": [
9
  {
10
  "name": "ezyang/htmlpurifier",
109
  "packages-dev": [
110
  {
111
  "name": "nikic/php-parser",
112
+ "version": "v4.10.4",
113
  "source": {
114
  "type": "git",
115
  "url": "https://github.com/nikic/PHP-Parser.git",
116
+ "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e"
117
  },
118
  "dist": {
119
  "type": "zip",
120
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/c6d052fc58cb876152f89f532b95a8d7907e7f0e",
121
+ "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e",
122
  "shasum": "",
123
  "mirrors": [
124
  {
165
  ],
166
  "support": {
167
  "issues": "https://github.com/nikic/PHP-Parser/issues",
168
+ "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.4"
169
  },
170
+ "time": "2020-12-20T10:01:03+00:00"
171
  }
172
  ],
173
  "aliases": [],
176
  "prefer-stable": false,
177
  "prefer-lowest": false,
178
  "platform": [],
179
+ "platform-dev": [],
180
+ "plugin-api-version": "1.1.0"
181
  }
nggallery.php CHANGED
@@ -4,11 +4,11 @@ if(preg_match('#' . basename(__FILE__) . '#', $_SERVER['PHP_SELF'])) { die('You
4
  /**
5
  * Plugin Name: NextGEN Gallery
6
  * Description: The most popular gallery plugin for WordPress and one of the most popular plugins of all time with over 30 million downloads.
7
- * Version: 3.5.0
8
  * Author: Imagely
9
  * Plugin URI: https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/
10
  * Author URI: https://www.imagely.com
11
- * License: GPLv2
12
  * Text Domain: nggallery
13
  * Domain Path: /products/photocrati_nextgen/modules/i18n/lang
14
  * Requires PHP: 5.6
@@ -166,7 +166,7 @@ class C_NextGEN_Bootstrap
166
  // We only load the plugin if we're outside of the activation request, loaded in an iframe
167
  // by WordPress. Reason being, if WP_DEBUG is enabled, and another Pope-based plugin (such as
168
  // the photocrati theme or NextGEN Pro/Plus), then PHP will output strict warnings
169
- if ($this->is_not_activating()) {
170
  $this->_define_constants();
171
  $this->_load_non_pope();
172
  $this->_register_hooks();
@@ -174,6 +174,11 @@ class C_NextGEN_Bootstrap
174
  }
175
  }
176
 
 
 
 
 
 
177
  function is_not_activating()
178
  {
179
  return !$this->is_activating();
@@ -374,23 +379,24 @@ class C_NextGEN_Bootstrap
374
  public function render_jquery_wp_55_warning()
375
  {
376
  $render = false;
377
- $account_msg = sprintf(__("Please download the latest version of NextGEN Pro from your <a href='%s' target='_blank'>account area</a>", 'nggallery'), 'https://www.imagely.com/account/');
378
- if (preg_match("#photocrati#i", wp_get_theme()->get('Name'))) {
379
- $account_msg = sprintf(__("Please download the latest version of NextGEN Pro from your <a href='%s' target='_blank'>account area</a>", 'nggallery'), 'https://members.photocrati.com/account/');
380
- }
381
  global $wp_version;
382
 
383
  if (defined('NGG_PRO_PLUGIN_VERSION') && version_compare(NGG_PRO_PLUGIN_VERSION, '3.1') < 0)
384
  {
385
  $render = TRUE;
386
-
387
- $message = __("Your version of NextGEN Pro is known to have some issues with NextGEN Gallery 3.4 and later.", 'nggallery');
 
 
388
  }
389
 
390
  if (defined('NGG_PLUS_PLUGIN_VERSION') && version_compare(NGG_PLUS_PLUGIN_VERSION, '1.7') < 0)
391
  {
392
  $render = TRUE;
393
- $message = __("Your version of NextGEN Plus is known to have some issues with NextGEN 3.4 and later. Please update NextGEN Plus to version 1.7 or higher to ensure your site works correctly.", 'nggallery');
 
 
 
394
  }
395
 
396
  if (!$render)
@@ -720,7 +726,7 @@ class C_NextGEN_Bootstrap
720
  define('NGG_PRODUCT_URL', path_join(str_replace("\\" , '/', NGG_PLUGIN_URL), 'products'));
721
  define('NGG_MODULE_URL', path_join(str_replace("\\", '/', NGG_PRODUCT_URL), 'photocrati_nextgen/modules'));
722
  define('NGG_PLUGIN_STARTED_AT', microtime());
723
- define('NGG_PLUGIN_VERSION', '3.5.0');
724
 
725
  define(
726
  'NGG_SCRIPT_VERSION',
4
  /**
5
  * Plugin Name: NextGEN Gallery
6
  * Description: The most popular gallery plugin for WordPress and one of the most popular plugins of all time with over 30 million downloads.
7
+ * Version: 3.6.0
8
  * Author: Imagely
9
  * Plugin URI: https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/
10
  * Author URI: https://www.imagely.com
11
+ * License: GPLv3
12
  * Text Domain: nggallery
13
  * Domain Path: /products/photocrati_nextgen/modules/i18n/lang
14
  * Requires PHP: 5.6
166
  // We only load the plugin if we're outside of the activation request, loaded in an iframe
167
  // by WordPress. Reason being, if WP_DEBUG is enabled, and another Pope-based plugin (such as
168
  // the photocrati theme or NextGEN Pro/Plus), then PHP will output strict warnings
169
+ if ($this->is_not_activating() && !$this->is_topscorer_request()) {
170
  $this->_define_constants();
171
  $this->_load_non_pope();
172
  $this->_register_hooks();
174
  }
175
  }
176
 
177
+ function is_topscorer_request()
178
+ {
179
+ return strpos($_SERVER['REQUEST_URI'], 'topscorer/v1') !== FALSE;
180
+ }
181
+
182
  function is_not_activating()
183
  {
184
  return !$this->is_activating();
379
  public function render_jquery_wp_55_warning()
380
  {
381
  $render = false;
 
 
 
 
382
  global $wp_version;
383
 
384
  if (defined('NGG_PRO_PLUGIN_VERSION') && version_compare(NGG_PRO_PLUGIN_VERSION, '3.1') < 0)
385
  {
386
  $render = TRUE;
387
+ $message = __("Your version of NextGEN Pro is known to have some issues with NextGEN Gallery 3.4 and later.", 'nggallery');
388
+ $account_msg = preg_match("#photocrati#i", wp_get_theme()->get('Name'))
389
+ ? sprintf(__("Please download the latest version of NextGEN Pro from your <a href='%s' target='_blank'>account area</a>", 'nggallery'), 'https://members.photocrati.com/account/')
390
+ : sprintf(__("Please download the latest version of NextGEN Pro from your <a href='%s' target='_blank'>account area</a>", 'nggallery'), 'https://www.imagely.com/account/');
391
  }
392
 
393
  if (defined('NGG_PLUS_PLUGIN_VERSION') && version_compare(NGG_PLUS_PLUGIN_VERSION, '1.7') < 0)
394
  {
395
  $render = TRUE;
396
+ $message = __("Your version of NextGEN Plus is known to have some issues with NextGEN Gallery 3.4 and later.", 'nggallery');
397
+ $account_msg = preg_match("#photocrati#i", wp_get_theme()->get('Name'))
398
+ ? sprintf(__("Please download the latest version of NextGEN Plus from your <a href='%s' target='_blank'>account area</a>", 'nggallery'), 'https://members.photocrati.com/account/')
399
+ : sprintf(__("Please download the latest version of NextGEN Plus from your <a href='%s' target='_blank'>account area</a>", 'nggallery'), 'https://www.imagely.com/account/');
400
  }
401
 
402
  if (!$render)
726
  define('NGG_PRODUCT_URL', path_join(str_replace("\\" , '/', NGG_PLUGIN_URL), 'products'));
727
  define('NGG_MODULE_URL', path_join(str_replace("\\", '/', NGG_PRODUCT_URL), 'photocrati_nextgen/modules'));
728
  define('NGG_PLUGIN_STARTED_AT', microtime());
729
+ define('NGG_PLUGIN_VERSION', '3.6.0');
730
 
731
  define(
732
  'NGG_SCRIPT_VERSION',
non_pope/class.photocrati_transient_manager.php CHANGED
@@ -45,9 +45,11 @@ class C_Photocrati_Transient_Manager
45
  function _update_tracker()
46
  {
47
  global $_wp_using_ext_object_cache;
48
- if ($_wp_using_ext_object_cache) {
49
- delete_option('photocrati_cache_tracker');
50
- add_option('photocrati_cache_tracker', $this->_tracker, '', 'no');
 
 
51
  }
52
  }
53
 
45
  function _update_tracker()
46
  {
47
  global $_wp_using_ext_object_cache;
48
+ if ($_wp_using_ext_object_cache)
49
+ {
50
+ $current_value = get_option('photocrati_cache_tracker', []);
51
+ if ($current_value !== $this->_tracker)
52
+ update_option('photocrati_cache_tracker', $this->_tracker, 'no');
53
  }
54
  }
55
 
products/photocrati_nextgen/modules/lightbox/static/fancybox/jquery.fancybox-1.3.4.js CHANGED
@@ -28,7 +28,7 @@
28
 
29
  titleHeight = 0, titleStr = '', start_pos, final_pos, busy = false, fx = $.extend($('<div/>')[0], { prop: 0 }),
30
 
31
- isIE6 = $.browser.msie && $.browser.version < 7 && !window.XMLHttpRequest,
32
 
33
  /*
34
  * Private methods
@@ -618,7 +618,7 @@
618
  }
619
 
620
  if (currentOpts.type == 'iframe') {
621
- $('<iframe id="fancybox-frame" name="fancybox-frame' + new Date().getTime() + '" frameborder="0" hspace="0" ' + ($.browser.msie ? 'allowtransparency="true""' : '') + ' scrolling="' + selectedOpts.scrolling + '" src="' + currentOpts.href + '"></iframe>').appendTo(content);
622
  }
623
 
624
  wrap.show();
28
 
29
  titleHeight = 0, titleStr = '', start_pos, final_pos, busy = false, fx = $.extend($('<div/>')[0], { prop: 0 }),
30
 
31
+ isIE6 = false,
32
 
33
  /*
34
  * Private methods
618
  }
619
 
620
  if (currentOpts.type == 'iframe') {
621
+ $('<iframe id="fancybox-frame" name="fancybox-frame' + new Date().getTime() + '" frameborder="0" hspace="0" ' + ' scrolling="' + selectedOpts.scrolling + '" src="' + currentOpts.href + '"></iframe>').appendTo(content);
622
  }
623
 
624
  wrap.show();
products/photocrati_nextgen/modules/lightbox/static/fancybox/jquery.fancybox-1.3.4.min.js CHANGED
@@ -1 +1 @@
1
- "use strict";function _typeof(t){"@babel/helpers - typeof";return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}!function(t){var e,i,n,a,o,d,r,c,s,h,l,f,p,g=0,y={},b=[],u=0,w={},v=[],m=null,x=new Image,I=/\.(jpg|gif|png|bmp|jpeg)(.*)?$/i,C=/[^\.]\.(swf)\s*$/i,k=1,O=0,j="",S=!1,T=t.extend(t("<div/>")[0],{prop:0}),D=t.browser.msie&&t.browser.version<7&&!window.XMLHttpRequest,A=function(){i.hide(),x.onerror=x.onload=null,m&&m.abort(),e.empty()},E=function(){if(!1===y.onError(b,g,y))return i.hide(),void(S=!1);y.titleShow=!1,y.width="auto",y.height="auto",e.html('<p id="fancybox-error">The requested content cannot be loaded.<br />Please try again later.</p>'),N()},F=function(){var n,a,o,r,c,s,h=b[g];if(A(),y=t.extend({},t.fn.fancybox.defaults,void 0===t(h).data("fancybox")?y:t(h).data("fancybox")),!1===(s=y.onStart(b,g,y)))return void(S=!1);if("object"==_typeof(s)&&(y=t.extend(y,s)),o=y.title||(h.nodeName?t(h).attr("title"):h.title)||"",h.nodeName&&!y.orig&&(y.orig=t(h).children("img:first").length?t(h).children("img:first"):t(h)),""===o&&y.orig&&y.titleFromAlt&&(o=y.orig.attr("alt")),n=y.href||(h.nodeName?t(h).attr("href"):h.href)||null,(/^(?:javascript)/i.test(n)||"#"==n)&&(n=null),y.type?(a=y.type,n||(n=y.content)):y.content?a="html":n&&(a=n.match(I)?"image":n.match(C)?"swf":t(h).hasClass("iframe")?"iframe":0===n.indexOf("#")?"inline":"ajax"),!a)return void E();switch("inline"==a&&(h=n.substr(n.indexOf("#")),a=t(h).length>0?"inline":"ajax"),y.type=a,y.href=n,y.title=o,y.autoDimensions&&("html"==y.type||"inline"==y.type||"ajax"==y.type?(y.width="auto",y.height="auto"):y.autoDimensions=!1),y.modal&&(y.overlayShow=!0,y.hideOnOverlayClick=!1,y.hideOnContentClick=!1,y.enableEscapeButton=!1,y.showCloseButton=!1),y.padding=parseInt(y.padding,10),y.margin=parseInt(y.margin,10),e.css("padding",y.padding+y.margin),t(".fancybox-inline-tmp").off("fancybox-cancel").on("fancybox-change",function(){t(this).replaceWith(d.children())}),a){case"html":e.html(y.content),N();break;case"inline":if(!0===t(h).parent().is("#fancybox-content"))return void(S=!1);t('<div class="fancybox-inline-tmp" />').hide().insertBefore(t(h)).on("fancybox-cleanup",function(){t(this).replaceWith(d.children())}).on("fancybox-cancel",function(){t(this).replaceWith(e.children())}),t(h).appendTo(e),N();break;case"image":S=!1,t.fancybox.showActivity(),x=new Image,x.onerror=function(){E()},x.onload=function(){S=!0,x.onerror=x.onload=null,P()},x.src=n;break;case"swf":y.scrolling="no",r='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="'+y.width+'" height="'+y.height+'"><param name="movie" value="'+n+'"></param>',c="",t.each(y.swf,function(t,e){r+='<param name="'+t+'" value="'+e+'"></param>',c+=" "+t+'="'+e+'"'}),r+='<embed src="'+n+'" type="application/x-shockwave-flash" width="'+y.width+'" height="'+y.height+'"'+c+"></embed></object>",e.html(r),N();break;case"ajax":S=!1,t.fancybox.showActivity(),y.ajax.win=y.ajax.success,m=t.ajax(t.extend({},y.ajax,{url:n,data:y.ajax.data||{},error:function(t,e,i){t.status>0&&E()},success:function(t,a,o){if(200==("object"==_typeof(o)?o:m).status){if("function"==typeof y.ajax.win){if(!1===(s=y.ajax.win(n,t,a,o)))return void i.hide();"string"!=typeof s&&"object"!=_typeof(s)||(t=s)}e.html(t),N()}}}));break;case"iframe":B()}},N=function(){var i=y.width,n=y.height;i=i.toString().indexOf("%")>-1?parseInt((t(window).width()-2*y.margin)*parseFloat(i)/100,10)+"px":"auto"==i?"auto":i+"px",n=n.toString().indexOf("%")>-1?parseInt((t(window).height()-2*y.margin)*parseFloat(n)/100,10)+"px":"auto"==n?"auto":n+"px",e.wrapInner('<div style="width:'+i+";height:"+n+";overflow: "+("auto"==y.scrolling?"auto":"yes"==y.scrolling?"scroll":"hidden")+';position:relative;"></div>'),y.width=e.width(),y.height=e.height(),B()},P=function(){y.width=x.width,y.height=x.height,t("<img />").attr({id:"fancybox-img",src:x.src,alt:y.title}).appendTo(e),B()},B=function(){var o,l;return i.hide(),a.is(":visible")&&!1===w.onCleanup(v,u,w)?(t.event.trigger("fancybox-cancel"),void(S=!1)):(S=!0,t(d.add(n)).off(),t(window).off("resize.fb scroll.fb"),t(document).off("keydown.fb"),a.is(":visible")&&"outside"!==w.titlePosition&&a.css("height",a.height()),v=b,u=g,w=y,w.overlayShow?(n.css({"background-color":w.overlayColor,opacity:w.overlayOpacity,cursor:w.hideOnOverlayClick?"pointer":"auto",height:t(document).height()}),n.is(":visible")||(D&&t("select:not(#fancybox-tmp select)").filter(function(){return"hidden"!==this.style.visibility}).css({visibility:"hidden"}).one("fancybox-cleanup",function(){this.style.visibility="inherit"}),n.show())):n.hide(),p=Q(),M(),a.is(":visible")?(t(r.add(s).add(h)).hide(),o=a.position(),f={top:o.top,left:o.left,width:a.width(),height:a.height()},l=f.width==p.width&&f.height==p.height,void d.fadeTo(w.changeFade,.3,function(){var i=function(){d.html(e.contents()).fadeTo(w.changeFade,1,z)};t.event.trigger("fancybox-change"),d.empty().removeAttr("filter").css({"border-width":w.padding,width:p.width-2*w.padding,height:y.autoDimensions?"auto":p.height-O-2*w.padding}),l?i():(T.prop=0,t(T).animate({prop:1},{duration:w.changeSpeed,easing:w.easingChange,step:R,complete:i}))})):(a.removeAttr("style"),d.css("border-width",w.padding),"elastic"==w.transitionIn?(f=q(),d.html(e.contents()),a.show(),w.opacity&&(p.opacity=0),T.prop=0,void t(T).animate({prop:1},{duration:w.speedIn,easing:w.easingIn,step:R,complete:z})):("inside"==w.titlePosition&&O>0&&c.show(),d.css({width:p.width-2*w.padding,height:y.autoDimensions?"auto":p.height-O-2*w.padding}).html(e.contents()),void a.css(p).fadeIn("none"==w.transitionIn?0:w.speedIn,z))))},L=function(t){return!(!t||!t.length)&&("float"==w.titlePosition?'<table id="fancybox-title-float-wrap" cellpadding="0" cellspacing="0"><tr><td id="fancybox-title-float-left"></td><td id="fancybox-title-float-main">'+t+'</td><td id="fancybox-title-float-right"></td></tr></table>':'<div id="fancybox-title-'+w.titlePosition+'">'+t+"</div>")},M=function(){if(j=w.title||"",O=0,c.empty().removeAttr("style").removeClass(),!1===w.titleShow)return void c.hide();if(!(j=function(t){return"function"==typeof t}(w.titleFormat)?w.titleFormat(j,v,u,w):L(j))||""===j)return void c.hide();switch(c.addClass("fancybox-title-"+w.titlePosition).html(j).appendTo("body").show(),w.titlePosition){case"inside":c.css({width:p.width-2*w.padding,marginLeft:w.padding,marginRight:w.padding}),O=c.outerHeight(!0),c.appendTo(o),p.height+=O;break;case"over":c.css({marginLeft:w.padding,width:p.width-2*w.padding,bottom:w.padding}).appendTo(o);break;case"float":c.css("left",-1*parseInt((c.width()-p.width-40)/2,10)).appendTo(a);break;default:c.css({width:p.width-2*w.padding,paddingLeft:w.padding,paddingRight:w.padding}).appendTo(a)}c.hide()},_=function(){if((w.enableEscapeButton||w.enableKeyboardNav)&&t(document).on("keydown.fb",function(e){27==e.keyCode&&w.enableEscapeButton?(e.preventDefault(),t.fancybox.close()):37!=e.keyCode&&39!=e.keyCode||!w.enableKeyboardNav||"INPUT"===e.target.tagName||"TEXTAREA"===e.target.tagName||"SELECT"===e.target.tagName||(e.preventDefault(),t.fancybox[37==e.keyCode?"prev":"next"]())}),!w.showNavArrows)return s.hide(),void h.hide();(w.cyclic&&v.length>1||0!==u)&&s.show(),(w.cyclic&&v.length>1||u!=v.length-1)&&h.show()},z=function(){t.support.opacity||(d.get(0).style.removeProperty("filter"),a.get(0).style.removeProperty("filter")),y.autoDimensions&&d.css("height","auto"),a.css("height","auto"),j&&j.length&&c.show(),w.showCloseButton&&r.show(),_(),w.hideOnContentClick&&d.on("click",t.fancybox.close),w.hideOnOverlayClick&&n.on("click",t.fancybox.close),t(window).on("resize.fb",t.fancybox.resize),w.centerOnScroll&&t(window).on("scroll.fb",t.fancybox.center),"iframe"==w.type&&t('<iframe id="fancybox-frame" name="fancybox-frame'+(new Date).getTime()+'" frameborder="0" hspace="0" '+(t.browser.msie?'allowtransparency="true""':"")+' scrolling="'+y.scrolling+'" src="'+w.href+'"></iframe>').appendTo(d),a.show(),S=!1,t.fancybox.center(),w.onComplete(v,u,w),H()},H=function(){var t,e;v.length-1>u&&void 0!==(t=v[u+1].href)&&t.match(I)&&(e=new Image,e.src=t),u>0&&void 0!==(t=v[u-1].href)&&t.match(I)&&(e=new Image,e.src=t)},R=function(t){var e={width:parseInt(f.width+(p.width-f.width)*t,10),height:parseInt(f.height+(p.height-f.height)*t,10),top:parseInt(f.top+(p.top-f.top)*t,10),left:parseInt(f.left+(p.left-f.left)*t,10)};void 0!==p.opacity&&(e.opacity=t<.5?.5:t),a.css(e),d.css({width:e.width-2*w.padding,height:e.height-O*t-2*w.padding})},K=function(){return[t(window).width()-2*w.margin,t(window).height()-2*w.margin,t(document).scrollLeft()+w.margin,t(document).scrollTop()+w.margin]},Q=function(){var t,e=K(),i={},n=w.autoScale,a=2*w.padding;return w.width.toString().indexOf("%")>-1?i.width=parseInt(e[0]*parseFloat(w.width)/100,10):i.width=w.width+a,w.height.toString().indexOf("%")>-1?i.height=parseInt(e[1]*parseFloat(w.height)/100,10):i.height=w.height+a,n&&(i.width>e[0]||i.height>e[1])&&("image"==y.type||"swf"==y.type?(t=w.width/w.height,i.width>e[0]&&(i.width=e[0],i.height=parseInt((i.width-a)/t+a,10)),i.height>e[1]&&(i.height=e[1],i.width=parseInt((i.height-a)*t+a,10))):(i.width=Math.min(i.width,e[0]),i.height=Math.min(i.height,e[1]))),i.top=parseInt(Math.max(e[3]-20,e[3]+.5*(e[1]-i.height-40)),10),i.left=parseInt(Math.max(e[2]-20,e[2]+.5*(e[0]-i.width-40)),10),i},W=function(t){var e=t.offset();return e.top+=parseInt(t.css("paddingTop"),10)||0,e.left+=parseInt(t.css("paddingLeft"),10)||0,e.top+=parseInt(t.css("border-top-width"),10)||0,e.left+=parseInt(t.css("border-left-width"),10)||0,e.width=t.width(),e.height=t.height(),e},q=function(){var e,i,n=!!y.orig&&t(y.orig),a={};return n&&n.length?(e=W(n),a={width:e.width+2*w.padding,height:e.height+2*w.padding,top:e.top-w.padding-20,left:e.left-w.padding-20}):(i=K(),a={width:2*w.padding,height:2*w.padding,top:parseInt(i[3]+.5*i[1],10),left:parseInt(i[2]+.5*i[0],10)}),a},X=function(){if(!i.is(":visible"))return void clearInterval(l);t("div",i).css("top",-40*k+"px"),k=(k+1)%12};t.fn.fancybox=function(e){return t(this).length?(t(this).data("fancybox",t.extend({},e,t.metadata?t(this).metadata():{})).off("click.fb").on("click.fb",function(e){if(e.preventDefault(),!S){S=!0,t(this).trigger("blur"),b=[],g=0;var i=t(this).attr("rel")||"";i&&""!=i&&"nofollow"!==i?(b=t("a[rel="+i+"], area[rel="+i+"]"),g=b.index(this)):b.push(this),F()}}),this):this},t.fancybox=function(e){var i;if(!S){if(S=!0,i=void 0!==arguments[1]?arguments[1]:{},b=[],g=parseInt(i.index,10)||0,Array.isArray(e)){for(var n=0,a=e.length;n<a;n++)"object"==_typeof(e[n])?t(e[n]).data("fancybox",t.extend({},i,e[n])):e[n]=t({}).data("fancybox",t.extend({content:e[n]},i));b=jQuery.merge(b,e)}else"object"==_typeof(e)?t(e).data("fancybox",t.extend({},i,e)):e=t({}).data("fancybox",t.extend({content:e},i)),b.push(e);(g>b.length||g<0)&&(g=0),F()}},t.fancybox.showActivity=function(){clearInterval(l),i.show(),l=setInterval(X,66)},t.fancybox.hideActivity=function(){i.hide()},t.fancybox.next=function(){return t.fancybox.pos(u+1)},t.fancybox.prev=function(){return t.fancybox.pos(u-1)},t.fancybox.pos=function(t){S||(t=parseInt(t),b=v,t>-1&&t<v.length?(g=t,F()):w.cyclic&&v.length>1&&(g=t>=v.length?0:v.length-1,F()))},t.fancybox.cancel=function(){S||(S=!0,t.event.trigger("fancybox-cancel"),A(),y.onCancel(b,g,y),S=!1)},t.fancybox.close=function(){function e(){n.fadeOut("fast"),c.empty().hide(),a.hide(),t.event.trigger("fancybox-cleanup"),d.empty(),w.onClosed(v,u,w),v=y=[],u=g=0,w=y={},S=!1}if(!S&&!a.is(":hidden")){if(S=!0,w&&!1===w.onCleanup(v,u,w))return void(S=!1);if(A(),t(r.add(s).add(h)).hide(),t(d.add(n)).off(),t(window).off("resize.fb scroll.fb"),t(document).off("keydown.fb"),d.find("iframe").attr("src",D&&/^https/i.test(window.location.href||"")?"javascript:void(false)":"about:blank"),"inside"!==w.titlePosition&&c.empty(),a.stop(),"elastic"==w.transitionOut){f=q();var i=a.position();p={top:i.top,left:i.left,width:a.width(),height:a.height()},w.opacity&&(p.opacity=1),c.empty().hide(),T.prop=1,t(T).animate({prop:0},{duration:w.speedOut,easing:w.easingOut,step:R,complete:e})}else a.fadeOut("none"==w.transitionOut?0:w.speedOut,e)}},t.fancybox.resize=function(){n.is(":visible")&&n.css("height",t(document).height()),t.fancybox.center(!0)},t.fancybox.center=function(){var t,e;S||(e=!0===arguments[0]?1:0,t=K(),!e&&(a.width()>t[0]||a.height()>t[1])||a.stop().animate({top:parseInt(Math.max(t[3]-20,t[3]+.5*(t[1]-d.height()-40)-w.padding)),left:parseInt(Math.max(t[2]-20,t[2]+.5*(t[0]-d.width()-40)-w.padding))},"number"==typeof arguments[0]?arguments[0]:200))},t.fancybox.init=function(){t("#fancybox-wrap").length||(t("body").append(e=t('<div id="fancybox-tmp"></div>'),i=t('<div id="fancybox-loading"><div></div></div>'),n=t('<div id="fancybox-overlay"></div>'),a=t('<div id="fancybox-wrap"></div>')),o=t('<div id="fancybox-outer"></div>').append('<div class="fancybox-bg" id="fancybox-bg-n"></div><div class="fancybox-bg" id="fancybox-bg-ne"></div><div class="fancybox-bg" id="fancybox-bg-e"></div><div class="fancybox-bg" id="fancybox-bg-se"></div><div class="fancybox-bg" id="fancybox-bg-s"></div><div class="fancybox-bg" id="fancybox-bg-sw"></div><div class="fancybox-bg" id="fancybox-bg-w"></div><div class="fancybox-bg" id="fancybox-bg-nw"></div>').appendTo(a),o.append(d=t('<div id="fancybox-content"></div>'),r=t('<a id="fancybox-close"></a>'),c=t('<div id="fancybox-title"></div>'),s=t('<a href="javascript:;" id="fancybox-left"><span class="fancy-ico" id="fancybox-left-ico"></span></a>'),h=t('<a href="javascript:;" id="fancybox-right"><span class="fancy-ico" id="fancybox-right-ico"></span></a>')),r.on("click",t.fancybox.close),i.on("click",t.fancybox.cancel),s.on("click",function(e){e.preventDefault(),t.fancybox.prev()}),h.on("click",function(e){e.preventDefault(),t.fancybox.next()}),t.fn.mousewheel&&a.on("mousewheel.fb",function(e,i){S?e.preventDefault():0!=t(e.target).get(0).clientHeight&&t(e.target).get(0).scrollHeight!==t(e.target).get(0).clientHeight||(e.preventDefault(),t.fancybox[i>0?"prev":"next"]())}),t.support.opacity||a.addClass("fancybox-ie"),D&&(i.addClass("fancybox-ie6"),a.addClass("fancybox-ie6"),t('<iframe id="fancybox-hide-sel-frame" src="'+(/^https/i.test(window.location.href||"")?"javascript:void(false)":"about:blank")+'" scrolling="no" border="0" frameborder="0" tabindex="-1"></iframe>').prependTo(o)))},t.fn.fancybox.defaults={padding:10,margin:40,opacity:!1,modal:!1,cyclic:!1,scrolling:"auto",width:560,height:340,autoScale:!0,autoDimensions:!0,centerOnScroll:!1,ajax:{},swf:{wmode:"transparent"},hideOnOverlayClick:!0,hideOnContentClick:!1,overlayShow:!0,overlayOpacity:.7,overlayColor:"#777",titleShow:!0,titlePosition:"float",titleFormat:null,titleFromAlt:!1,transitionIn:"fade",transitionOut:"fade",speedIn:300,speedOut:300,changeSpeed:300,changeFade:"fast",easingIn:"swing",easingOut:"swing",showCloseButton:!0,showNavArrows:!0,enableEscapeButton:!0,enableKeyboardNav:!0,onStart:function(){},onCancel:function(){},onComplete:function(){},onCleanup:function(){},onClosed:function(){},onError:function(){}},jQuery(function(t){t.fancybox.init()})}(jQuery);
1
+ "use strict";function _typeof(t){"@babel/helpers - typeof";return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}!function(t){var e,i,n,a,o,d,c,r,h,s,f,l,p,g=0,y={},u=[],b=0,w={},m=[],v=null,x=new Image,I=/\.(jpg|gif|png|bmp|jpeg)(.*)?$/i,C=/[^\.]\.(swf)\s*$/i,k=1,O=0,j="",S=!1,T=t.extend(t("<div/>")[0],{prop:0}),D=function(){i.hide(),x.onerror=x.onload=null,v&&v.abort(),e.empty()},A=function(){if(!1===y.onError(u,g,y))return i.hide(),void(S=!1);y.titleShow=!1,y.width="auto",y.height="auto",e.html('<p id="fancybox-error">The requested content cannot be loaded.<br />Please try again later.</p>'),F()},E=function(){var n,a,o,c,r,h,s=u[g];if(D(),y=t.extend({},t.fn.fancybox.defaults,void 0===t(s).data("fancybox")?y:t(s).data("fancybox")),!1===(h=y.onStart(u,g,y)))return void(S=!1);if("object"==_typeof(h)&&(y=t.extend(y,h)),o=y.title||(s.nodeName?t(s).attr("title"):s.title)||"",s.nodeName&&!y.orig&&(y.orig=t(s).children("img:first").length?t(s).children("img:first"):t(s)),""===o&&y.orig&&y.titleFromAlt&&(o=y.orig.attr("alt")),n=y.href||(s.nodeName?t(s).attr("href"):s.href)||null,(/^(?:javascript)/i.test(n)||"#"==n)&&(n=null),y.type?(a=y.type,n||(n=y.content)):y.content?a="html":n&&(a=n.match(I)?"image":n.match(C)?"swf":t(s).hasClass("iframe")?"iframe":0===n.indexOf("#")?"inline":"ajax"),!a)return void A();switch("inline"==a&&(s=n.substr(n.indexOf("#")),a=t(s).length>0?"inline":"ajax"),y.type=a,y.href=n,y.title=o,y.autoDimensions&&("html"==y.type||"inline"==y.type||"ajax"==y.type?(y.width="auto",y.height="auto"):y.autoDimensions=!1),y.modal&&(y.overlayShow=!0,y.hideOnOverlayClick=!1,y.hideOnContentClick=!1,y.enableEscapeButton=!1,y.showCloseButton=!1),y.padding=parseInt(y.padding,10),y.margin=parseInt(y.margin,10),e.css("padding",y.padding+y.margin),t(".fancybox-inline-tmp").off("fancybox-cancel").on("fancybox-change",function(){t(this).replaceWith(d.children())}),a){case"html":e.html(y.content),F();break;case"inline":if(!0===t(s).parent().is("#fancybox-content"))return void(S=!1);t('<div class="fancybox-inline-tmp" />').hide().insertBefore(t(s)).on("fancybox-cleanup",function(){t(this).replaceWith(d.children())}).on("fancybox-cancel",function(){t(this).replaceWith(e.children())}),t(s).appendTo(e),F();break;case"image":S=!1,t.fancybox.showActivity(),x=new Image,x.onerror=function(){A()},x.onload=function(){S=!0,x.onerror=x.onload=null,N()},x.src=n;break;case"swf":y.scrolling="no",c='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="'+y.width+'" height="'+y.height+'"><param name="movie" value="'+n+'"></param>',r="",t.each(y.swf,function(t,e){c+='<param name="'+t+'" value="'+e+'"></param>',r+=" "+t+'="'+e+'"'}),c+='<embed src="'+n+'" type="application/x-shockwave-flash" width="'+y.width+'" height="'+y.height+'"'+r+"></embed></object>",e.html(c),F();break;case"ajax":S=!1,t.fancybox.showActivity(),y.ajax.win=y.ajax.success,v=t.ajax(t.extend({},y.ajax,{url:n,data:y.ajax.data||{},error:function(t,e,i){t.status>0&&A()},success:function(t,a,o){if(200==("object"==_typeof(o)?o:v).status){if("function"==typeof y.ajax.win){if(!1===(h=y.ajax.win(n,t,a,o)))return void i.hide();"string"!=typeof h&&"object"!=_typeof(h)||(t=h)}e.html(t),F()}}}));break;case"iframe":P()}},F=function(){var i=y.width,n=y.height;i=i.toString().indexOf("%")>-1?parseInt((t(window).width()-2*y.margin)*parseFloat(i)/100,10)+"px":"auto"==i?"auto":i+"px",n=n.toString().indexOf("%")>-1?parseInt((t(window).height()-2*y.margin)*parseFloat(n)/100,10)+"px":"auto"==n?"auto":n+"px",e.wrapInner('<div style="width:'+i+";height:"+n+";overflow: "+("auto"==y.scrolling?"auto":"yes"==y.scrolling?"scroll":"hidden")+';position:relative;"></div>'),y.width=e.width(),y.height=e.height(),P()},N=function(){y.width=x.width,y.height=x.height,t("<img />").attr({id:"fancybox-img",src:x.src,alt:y.title}).appendTo(e),P()},P=function(){var o,f;return i.hide(),a.is(":visible")&&!1===w.onCleanup(m,b,w)?(t.event.trigger("fancybox-cancel"),void(S=!1)):(S=!0,t(d.add(n)).off(),t(window).off("resize.fb scroll.fb"),t(document).off("keydown.fb"),a.is(":visible")&&"outside"!==w.titlePosition&&a.css("height",a.height()),m=u,b=g,w=y,w.overlayShow?(n.css({"background-color":w.overlayColor,opacity:w.overlayOpacity,cursor:w.hideOnOverlayClick?"pointer":"auto",height:t(document).height()}),n.is(":visible")||n.show()):n.hide(),p=Q(),_(),a.is(":visible")?(t(c.add(h).add(s)).hide(),o=a.position(),l={top:o.top,left:o.left,width:a.width(),height:a.height()},f=l.width==p.width&&l.height==p.height,void d.fadeTo(w.changeFade,.3,function(){var i=function(){d.html(e.contents()).fadeTo(w.changeFade,1,M)};t.event.trigger("fancybox-change"),d.empty().removeAttr("filter").css({"border-width":w.padding,width:p.width-2*w.padding,height:y.autoDimensions?"auto":p.height-O-2*w.padding}),f?i():(T.prop=0,t(T).animate({prop:1},{duration:w.changeSpeed,easing:w.easingChange,step:H,complete:i}))})):(a.removeAttr("style"),d.css("border-width",w.padding),"elastic"==w.transitionIn?(l=W(),d.html(e.contents()),a.show(),w.opacity&&(p.opacity=0),T.prop=0,void t(T).animate({prop:1},{duration:w.speedIn,easing:w.easingIn,step:H,complete:M})):("inside"==w.titlePosition&&O>0&&r.show(),d.css({width:p.width-2*w.padding,height:y.autoDimensions?"auto":p.height-O-2*w.padding}).html(e.contents()),void a.css(p).fadeIn("none"==w.transitionIn?0:w.speedIn,M))))},B=function(t){return!(!t||!t.length)&&("float"==w.titlePosition?'<table id="fancybox-title-float-wrap" cellpadding="0" cellspacing="0"><tr><td id="fancybox-title-float-left"></td><td id="fancybox-title-float-main">'+t+'</td><td id="fancybox-title-float-right"></td></tr></table>':'<div id="fancybox-title-'+w.titlePosition+'">'+t+"</div>")},_=function(){if(j=w.title||"",O=0,r.empty().removeAttr("style").removeClass(),!1===w.titleShow)return void r.hide();if(!(j=function(t){return"function"==typeof t}(w.titleFormat)?w.titleFormat(j,m,b,w):B(j))||""===j)return void r.hide();switch(r.addClass("fancybox-title-"+w.titlePosition).html(j).appendTo("body").show(),w.titlePosition){case"inside":r.css({width:p.width-2*w.padding,marginLeft:w.padding,marginRight:w.padding}),O=r.outerHeight(!0),r.appendTo(o),p.height+=O;break;case"over":r.css({marginLeft:w.padding,width:p.width-2*w.padding,bottom:w.padding}).appendTo(o);break;case"float":r.css("left",-1*parseInt((r.width()-p.width-40)/2,10)).appendTo(a);break;default:r.css({width:p.width-2*w.padding,paddingLeft:w.padding,paddingRight:w.padding}).appendTo(a)}r.hide()},L=function(){if((w.enableEscapeButton||w.enableKeyboardNav)&&t(document).on("keydown.fb",function(e){27==e.keyCode&&w.enableEscapeButton?(e.preventDefault(),t.fancybox.close()):37!=e.keyCode&&39!=e.keyCode||!w.enableKeyboardNav||"INPUT"===e.target.tagName||"TEXTAREA"===e.target.tagName||"SELECT"===e.target.tagName||(e.preventDefault(),t.fancybox[37==e.keyCode?"prev":"next"]())}),!w.showNavArrows)return h.hide(),void s.hide();(w.cyclic&&m.length>1||0!==b)&&h.show(),(w.cyclic&&m.length>1||b!=m.length-1)&&s.show()},M=function(){t.support.opacity||(d.get(0).style.removeProperty("filter"),a.get(0).style.removeProperty("filter")),y.autoDimensions&&d.css("height","auto"),a.css("height","auto"),j&&j.length&&r.show(),w.showCloseButton&&c.show(),L(),w.hideOnContentClick&&d.on("click",t.fancybox.close),w.hideOnOverlayClick&&n.on("click",t.fancybox.close),t(window).on("resize.fb",t.fancybox.resize),w.centerOnScroll&&t(window).on("scroll.fb",t.fancybox.center),"iframe"==w.type&&t('<iframe id="fancybox-frame" name="fancybox-frame'+(new Date).getTime()+'" frameborder="0" hspace="0" scrolling="'+y.scrolling+'" src="'+w.href+'"></iframe>').appendTo(d),a.show(),S=!1,t.fancybox.center(),w.onComplete(m,b,w),z()},z=function(){var t,e;m.length-1>b&&void 0!==(t=m[b+1].href)&&t.match(I)&&(e=new Image,e.src=t),b>0&&void 0!==(t=m[b-1].href)&&t.match(I)&&(e=new Image,e.src=t)},H=function(t){var e={width:parseInt(l.width+(p.width-l.width)*t,10),height:parseInt(l.height+(p.height-l.height)*t,10),top:parseInt(l.top+(p.top-l.top)*t,10),left:parseInt(l.left+(p.left-l.left)*t,10)};void 0!==p.opacity&&(e.opacity=t<.5?.5:t),a.css(e),d.css({width:e.width-2*w.padding,height:e.height-O*t-2*w.padding})},K=function(){return[t(window).width()-2*w.margin,t(window).height()-2*w.margin,t(document).scrollLeft()+w.margin,t(document).scrollTop()+w.margin]},Q=function(){var t,e=K(),i={},n=w.autoScale,a=2*w.padding;return w.width.toString().indexOf("%")>-1?i.width=parseInt(e[0]*parseFloat(w.width)/100,10):i.width=w.width+a,w.height.toString().indexOf("%")>-1?i.height=parseInt(e[1]*parseFloat(w.height)/100,10):i.height=w.height+a,n&&(i.width>e[0]||i.height>e[1])&&("image"==y.type||"swf"==y.type?(t=w.width/w.height,i.width>e[0]&&(i.width=e[0],i.height=parseInt((i.width-a)/t+a,10)),i.height>e[1]&&(i.height=e[1],i.width=parseInt((i.height-a)*t+a,10))):(i.width=Math.min(i.width,e[0]),i.height=Math.min(i.height,e[1]))),i.top=parseInt(Math.max(e[3]-20,e[3]+.5*(e[1]-i.height-40)),10),i.left=parseInt(Math.max(e[2]-20,e[2]+.5*(e[0]-i.width-40)),10),i},R=function(t){var e=t.offset();return e.top+=parseInt(t.css("paddingTop"),10)||0,e.left+=parseInt(t.css("paddingLeft"),10)||0,e.top+=parseInt(t.css("border-top-width"),10)||0,e.left+=parseInt(t.css("border-left-width"),10)||0,e.width=t.width(),e.height=t.height(),e},W=function(){var e,i,n=!!y.orig&&t(y.orig),a={};return n&&n.length?(e=R(n),a={width:e.width+2*w.padding,height:e.height+2*w.padding,top:e.top-w.padding-20,left:e.left-w.padding-20}):(i=K(),a={width:2*w.padding,height:2*w.padding,top:parseInt(i[3]+.5*i[1],10),left:parseInt(i[2]+.5*i[0],10)}),a},$=function(){if(!i.is(":visible"))return void clearInterval(f);t("div",i).css("top",-40*k+"px"),k=(k+1)%12};t.fn.fancybox=function(e){return t(this).length?(t(this).data("fancybox",t.extend({},e,t.metadata?t(this).metadata():{})).off("click.fb").on("click.fb",function(e){if(e.preventDefault(),!S){S=!0,t(this).trigger("blur"),u=[],g=0;var i=t(this).attr("rel")||"";i&&""!=i&&"nofollow"!==i?(u=t("a[rel="+i+"], area[rel="+i+"]"),g=u.index(this)):u.push(this),E()}}),this):this},t.fancybox=function(e){var i;if(!S){if(S=!0,i=void 0!==arguments[1]?arguments[1]:{},u=[],g=parseInt(i.index,10)||0,Array.isArray(e)){for(var n=0,a=e.length;n<a;n++)"object"==_typeof(e[n])?t(e[n]).data("fancybox",t.extend({},i,e[n])):e[n]=t({}).data("fancybox",t.extend({content:e[n]},i));u=jQuery.merge(u,e)}else"object"==_typeof(e)?t(e).data("fancybox",t.extend({},i,e)):e=t({}).data("fancybox",t.extend({content:e},i)),u.push(e);(g>u.length||g<0)&&(g=0),E()}},t.fancybox.showActivity=function(){clearInterval(f),i.show(),f=setInterval($,66)},t.fancybox.hideActivity=function(){i.hide()},t.fancybox.next=function(){return t.fancybox.pos(b+1)},t.fancybox.prev=function(){return t.fancybox.pos(b-1)},t.fancybox.pos=function(t){S||(t=parseInt(t),u=m,t>-1&&t<m.length?(g=t,E()):w.cyclic&&m.length>1&&(g=t>=m.length?0:m.length-1,E()))},t.fancybox.cancel=function(){S||(S=!0,t.event.trigger("fancybox-cancel"),D(),y.onCancel(u,g,y),S=!1)},t.fancybox.close=function(){function e(){n.fadeOut("fast"),r.empty().hide(),a.hide(),t.event.trigger("fancybox-cleanup"),d.empty(),w.onClosed(m,b,w),m=y=[],b=g=0,w=y={},S=!1}if(!S&&!a.is(":hidden")){if(S=!0,w&&!1===w.onCleanup(m,b,w))return void(S=!1);if(D(),t(c.add(h).add(s)).hide(),t(d.add(n)).off(),t(window).off("resize.fb scroll.fb"),t(document).off("keydown.fb"),d.find("iframe").attr("src","about:blank"),"inside"!==w.titlePosition&&r.empty(),a.stop(),"elastic"==w.transitionOut){l=W();var i=a.position();p={top:i.top,left:i.left,width:a.width(),height:a.height()},w.opacity&&(p.opacity=1),r.empty().hide(),T.prop=1,t(T).animate({prop:0},{duration:w.speedOut,easing:w.easingOut,step:H,complete:e})}else a.fadeOut("none"==w.transitionOut?0:w.speedOut,e)}},t.fancybox.resize=function(){n.is(":visible")&&n.css("height",t(document).height()),t.fancybox.center(!0)},t.fancybox.center=function(){var t,e;S||(e=!0===arguments[0]?1:0,t=K(),!e&&(a.width()>t[0]||a.height()>t[1])||a.stop().animate({top:parseInt(Math.max(t[3]-20,t[3]+.5*(t[1]-d.height()-40)-w.padding)),left:parseInt(Math.max(t[2]-20,t[2]+.5*(t[0]-d.width()-40)-w.padding))},"number"==typeof arguments[0]?arguments[0]:200))},t.fancybox.init=function(){t("#fancybox-wrap").length||(t("body").append(e=t('<div id="fancybox-tmp"></div>'),i=t('<div id="fancybox-loading"><div></div></div>'),n=t('<div id="fancybox-overlay"></div>'),a=t('<div id="fancybox-wrap"></div>')),o=t('<div id="fancybox-outer"></div>').append('<div class="fancybox-bg" id="fancybox-bg-n"></div><div class="fancybox-bg" id="fancybox-bg-ne"></div><div class="fancybox-bg" id="fancybox-bg-e"></div><div class="fancybox-bg" id="fancybox-bg-se"></div><div class="fancybox-bg" id="fancybox-bg-s"></div><div class="fancybox-bg" id="fancybox-bg-sw"></div><div class="fancybox-bg" id="fancybox-bg-w"></div><div class="fancybox-bg" id="fancybox-bg-nw"></div>').appendTo(a),o.append(d=t('<div id="fancybox-content"></div>'),c=t('<a id="fancybox-close"></a>'),r=t('<div id="fancybox-title"></div>'),h=t('<a href="javascript:;" id="fancybox-left"><span class="fancy-ico" id="fancybox-left-ico"></span></a>'),s=t('<a href="javascript:;" id="fancybox-right"><span class="fancy-ico" id="fancybox-right-ico"></span></a>')),c.on("click",t.fancybox.close),i.on("click",t.fancybox.cancel),h.on("click",function(e){e.preventDefault(),t.fancybox.prev()}),s.on("click",function(e){e.preventDefault(),t.fancybox.next()}),t.fn.mousewheel&&a.on("mousewheel.fb",function(e,i){S?e.preventDefault():0!=t(e.target).get(0).clientHeight&&t(e.target).get(0).scrollHeight!==t(e.target).get(0).clientHeight||(e.preventDefault(),t.fancybox[i>0?"prev":"next"]())}),t.support.opacity||a.addClass("fancybox-ie"))},t.fn.fancybox.defaults={padding:10,margin:40,opacity:!1,modal:!1,cyclic:!1,scrolling:"auto",width:560,height:340,autoScale:!0,autoDimensions:!0,centerOnScroll:!1,ajax:{},swf:{wmode:"transparent"},hideOnOverlayClick:!0,hideOnContentClick:!1,overlayShow:!0,overlayOpacity:.7,overlayColor:"#777",titleShow:!0,titlePosition:"float",titleFormat:null,titleFromAlt:!1,transitionIn:"fade",transitionOut:"fade",speedIn:300,speedOut:300,changeSpeed:300,changeFade:"fast",easingIn:"swing",easingOut:"swing",showCloseButton:!0,showNavArrows:!0,enableEscapeButton:!0,enableKeyboardNav:!0,onStart:function(){},onCancel:function(){},onComplete:function(){},onCleanup:function(){},onClosed:function(){},onError:function(){}},jQuery(function(t){t.fancybox.init()})}(jQuery);
products/photocrati_nextgen/modules/lightbox/static/fancybox/jquery.fancybox-1.3.4.pack.js CHANGED
@@ -1 +1 @@
1
- !function(c){function r(){l.hide(),j.onerror=j.onload=null,O&&O.abort(),h.empty()}function s(){if(!1===m.onError(v,x,m))return l.hide(),F=!1;m.titleShow=!1,m.width="auto",m.height="auto",h.html('<p id="fancybox-error">The requested content cannot be loaded.<br />Please try again later.</p>'),B()}function a(){var n,t,e,i,a,o,d=v[x];if(r(),m=c.extend({},c.fn.fancybox.defaults,void 0===c(d).data("fancybox")?m:c(d).data("fancybox")),!1!==(o=m.onStart(v,x,m)))if("object"==typeof o&&(m=c.extend(m,o)),e=m.title||(d.nodeName?c(d).attr("title"):d.title)||"",d.nodeName&&!m.orig&&(m.orig=c(d).children("img:first").length?c(d).children("img:first"):c(d)),""===e&&m.orig&&m.titleFromAlt&&(e=m.orig.attr("alt")),n=m.href||(d.nodeName?c(d).attr("href"):d.href)||null,!/^(?:javascript)/i.test(n)&&"#"!=n||(n=null),m.type?(t=m.type,n=n||m.content):m.content?t="html":n&&(t=n.match(T)?"image":n.match(S)?"swf":c(d).hasClass("iframe")?"iframe":0===n.indexOf("#")?"inline":"ajax"),t)switch("inline"==t&&(d=n.substr(n.indexOf("#")),t=0<c(d).length?"inline":"ajax"),m.type=t,m.href=n,m.title=e,m.autoDimensions&&("html"==m.type||"inline"==m.type||"ajax"==m.type?(m.width="auto",m.height="auto"):m.autoDimensions=!1),m.modal&&(m.overlayShow=!0,m.hideOnOverlayClick=!1,m.hideOnContentClick=!1,m.enableEscapeButton=!1,m.showCloseButton=!1),m.padding=parseInt(m.padding,10),m.margin=parseInt(m.margin,10),h.css("padding",m.padding+m.margin),c(".fancybox-inline-tmp").off("fancybox-cancel").on("fancybox-change",function(){c(this).replaceWith(f.children())}),t){case"html":h.html(m.content),B();break;case"inline":if(!0===c(d).parent().is("#fancybox-content"))return F=!1,0;c('<div class="fancybox-inline-tmp" />').hide().insertBefore(c(d)).on("fancybox-cleanup",function(){c(this).replaceWith(f.children())}).on("fancybox-cancel",function(){c(this).replaceWith(h.children())}),c(d).appendTo(h),B();break;case"image":F=!1,c.fancybox.showActivity(),(j=new Image).onerror=function(){s()},j.onload=function(){F=!0,j.onerror=j.onload=null,L()},j.src=n;break;case"swf":m.scrolling="no",i='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="'+m.width+'" height="'+m.height+'"><param name="movie" value="'+n+'"></param>',a="",c.each(m.swf,function(t,e){i+='<param name="'+t+'" value="'+e+'"></param>',a+=" "+t+'="'+e+'"'}),i+='<embed src="'+n+'" type="application/x-shockwave-flash" width="'+m.width+'" height="'+m.height+'"'+a+"></embed></object>",h.html(i),B();break;case"ajax":F=!1,c.fancybox.showActivity(),m.ajax.win=m.ajax.success,O=c.ajax(c.extend({},m.ajax,{url:n,data:m.ajax.data||{},error:function(t,e,i){0<t.status&&s()},success:function(t,e,i){if(200==("object"==typeof i?i:O).status){if("function"==typeof m.ajax.win){if(!1===(o=m.ajax.win(n,t,e,i)))return void l.hide();"string"!=typeof o&&"object"!=typeof o||(t=o)}h.html(t),B()}}}));break;case"iframe":M()}else s();else F=!1}function o(){return[c(window).width()-2*C.margin,c(window).height()-2*C.margin,c(document).scrollLeft()+C.margin,c(document).scrollTop()+C.margin]}function t(){l.is(":visible")?(c("div",l).css("top",-40*D+"px"),D=(D+1)%12):clearInterval(y)}var h,l,i,n,e,f,d,p,g,b,y,u,w,x=0,m={},v=[],I=0,C={},k=[],O=null,j=new Image,T=/\.(jpg|gif|png|bmp|jpeg)(.*)?$/i,S=/[^\.]\.(swf)\s*$/i,D=1,A=0,E="",F=!1,N=c.extend(c("<div/>")[0],{prop:0}),P=c.browser.msie&&c.browser.version<7&&!window.XMLHttpRequest,B=function(){var t=m.width,e=m.height,t=-1<t.toString().indexOf("%")?parseInt((c(window).width()-2*m.margin)*parseFloat(t)/100,10)+"px":"auto"==t?"auto":t+"px",e=-1<e.toString().indexOf("%")?parseInt((c(window).height()-2*m.margin)*parseFloat(e)/100,10)+"px":"auto"==e?"auto":e+"px";h.wrapInner('<div style="width:'+t+";height:"+e+";overflow: "+("auto"==m.scrolling?"auto":"yes"==m.scrolling?"scroll":"hidden")+';position:relative;"></div>'),m.width=h.width(),m.height=h.height(),M()},L=function(){m.width=j.width,m.height=j.height,c("<img />").attr({id:"fancybox-img",src:j.src,alt:m.title}).appendTo(h),M()},M=function(){var t,e;return l.hide(),n.is(":visible")&&!1===C.onCleanup(k,I,C)?(c.event.trigger("fancybox-cancel"),void(F=!1)):(F=!0,c(f.add(i)).off(),c(window).off("resize.fb scroll.fb"),c(document).off("keydown.fb"),n.is(":visible")&&"outside"!==C.titlePosition&&n.css("height",n.height()),k=v,I=x,(C=m).overlayShow?(i.css({"background-color":C.overlayColor,opacity:C.overlayOpacity,cursor:C.hideOnOverlayClick?"pointer":"auto",height:c(document).height()}),i.is(":visible")||(P&&c("select:not(#fancybox-tmp select)").filter(function(){return"hidden"!==this.style.visibility}).css({visibility:"hidden"}).one("fancybox-cleanup",function(){this.style.visibility="inherit"}),i.show())):i.hide(),w=Q(),z(),n.is(":visible")?(c(d.add(g).add(b)).hide(),t=n.position(),u={top:t.top,left:t.left,width:n.width(),height:n.height()},e=u.width==w.width&&u.height==w.height,void f.fadeTo(C.changeFade,.3,function(){function t(){f.html(h.contents()).fadeTo(C.changeFade,1,H)}c.event.trigger("fancybox-change"),f.empty().removeAttr("filter").css({"border-width":C.padding,width:w.width-2*C.padding,height:m.autoDimensions?"auto":w.height-A-2*C.padding}),e?t():(N.prop=0,c(N).animate({prop:1},{duration:C.changeSpeed,easing:C.easingChange,step:K,complete:t}))})):(n.removeAttr("style"),f.css("border-width",C.padding),"elastic"==C.transitionIn?(u=W(),f.html(h.contents()),n.show(),C.opacity&&(w.opacity=0),N.prop=0,void c(N).animate({prop:1},{duration:C.speedIn,easing:C.easingIn,step:K,complete:H})):("inside"==C.titlePosition&&0<A&&p.show(),f.css({width:w.width-2*C.padding,height:m.autoDimensions?"auto":w.height-A-2*C.padding}).html(h.contents()),void n.css(w).fadeIn("none"==C.transitionIn?0:C.speedIn,H))))},z=function(){if(E=C.title||"",A=0,p.empty().removeAttr("style").removeClass(),!1!==C.titleShow){var t;if((E="function"==typeof C.titleFormat?C.titleFormat(E,k,I,C):!(!(t=E)||!t.length)&&("float"==C.titlePosition?'<table id="fancybox-title-float-wrap" cellpadding="0" cellspacing="0"><tr><td id="fancybox-title-float-left"></td><td id="fancybox-title-float-main">'+t+'</td><td id="fancybox-title-float-right"></td></tr></table>':'<div id="fancybox-title-'+C.titlePosition+'">'+t+"</div>"))&&""!==E){switch(p.addClass("fancybox-title-"+C.titlePosition).html(E).appendTo("body").show(),C.titlePosition){case"inside":p.css({width:w.width-2*C.padding,marginLeft:C.padding,marginRight:C.padding}),A=p.outerHeight(!0),p.appendTo(e),w.height+=A;break;case"over":p.css({marginLeft:C.padding,width:w.width-2*C.padding,bottom:C.padding}).appendTo(e);break;case"float":p.css("left",-1*parseInt((p.width()-w.width-40)/2,10)).appendTo(n);break;default:p.css({width:w.width-2*C.padding,paddingLeft:C.padding,paddingRight:C.padding}).appendTo(n)}p.hide()}else p.hide()}else p.hide()},H=function(){c.support.opacity||(f.get(0).style.removeProperty("filter"),n.get(0).style.removeProperty("filter")),m.autoDimensions&&f.css("height","auto"),n.css("height","auto"),E&&E.length&&p.show(),C.showCloseButton&&d.show(),function(){if((C.enableEscapeButton||C.enableKeyboardNav)&&c(document).on("keydown.fb",function(t){27==t.keyCode&&C.enableEscapeButton?(t.preventDefault(),c.fancybox.close()):37!=t.keyCode&&39!=t.keyCode||!C.enableKeyboardNav||"INPUT"===t.target.tagName||"TEXTAREA"===t.target.tagName||"SELECT"===t.target.tagName||(t.preventDefault(),c.fancybox[37==t.keyCode?"prev":"next"]())}),!C.showNavArrows)return g.hide(),b.hide();(C.cyclic&&1<k.length||0!==I)&&g.show(),(C.cyclic&&1<k.length||I!=k.length-1)&&b.show()}(),C.hideOnContentClick&&f.on("click",c.fancybox.close),C.hideOnOverlayClick&&i.on("click",c.fancybox.close),c(window).on("resize.fb",c.fancybox.resize),C.centerOnScroll&&c(window).on("scroll.fb",c.fancybox.center),"iframe"==C.type&&c('<iframe id="fancybox-frame" name="fancybox-frame'+(new Date).getTime()+'" frameborder="0" hspace="0" '+(c.browser.msie?'allowtransparency="true""':"")+' scrolling="'+m.scrolling+'" src="'+C.href+'"></iframe>').appendTo(f),n.show(),F=!1,c.fancybox.center(),C.onComplete(k,I,C),R()},R=function(){var t;k.length-1>I&&void 0!==(t=k[I+1].href)&&t.match(T)&&((new Image).src=t),0<I&&void 0!==(t=k[I-1].href)&&t.match(T)&&((new Image).src=t)},K=function(t){var e={width:parseInt(u.width+(w.width-u.width)*t,10),height:parseInt(u.height+(w.height-u.height)*t,10),top:parseInt(u.top+(w.top-u.top)*t,10),left:parseInt(u.left+(w.left-u.left)*t,10)};void 0!==w.opacity&&(e.opacity=t<.5?.5:t),n.css(e),f.css({width:e.width-2*C.padding,height:e.height-A*t-2*C.padding})},Q=function(){var t,e=o(),i={},n=C.autoScale,a=2*C.padding;return-1<C.width.toString().indexOf("%")?i.width=parseInt(e[0]*parseFloat(C.width)/100,10):i.width=C.width+a,-1<C.height.toString().indexOf("%")?i.height=parseInt(e[1]*parseFloat(C.height)/100,10):i.height=C.height+a,n&&(i.width>e[0]||i.height>e[1])&&("image"==m.type||"swf"==m.type?(t=C.width/C.height,i.width>e[0]&&(i.width=e[0],i.height=parseInt((i.width-a)/t+a,10)),i.height>e[1]&&(i.height=e[1],i.width=parseInt((i.height-a)*t+a,10))):(i.width=Math.min(i.width,e[0]),i.height=Math.min(i.height,e[1]))),i.top=parseInt(Math.max(e[3]-20,e[3]+.5*(e[1]-i.height-40)),10),i.left=parseInt(Math.max(e[2]-20,e[2]+.5*(e[0]-i.width-40)),10),i},W=function(){var t,e,i,n=!!m.orig&&c(m.orig);return n&&n.length?((i=(e=n).offset()).top+=parseInt(e.css("paddingTop"),10)||0,i.left+=parseInt(e.css("paddingLeft"),10)||0,i.top+=parseInt(e.css("border-top-width"),10)||0,i.left+=parseInt(e.css("border-left-width"),10)||0,i.width=e.width(),i.height=e.height(),{width:i.width+2*C.padding,height:i.height+2*C.padding,top:i.top-C.padding-20,left:i.left-C.padding-20}):(t=o(),{width:2*C.padding,height:2*C.padding,top:parseInt(t[3]+.5*t[1],10),left:parseInt(t[2]+.5*t[0],10)})};c.fn.fancybox=function(t){return c(this).length&&c(this).data("fancybox",c.extend({},t,c.metadata?c(this).metadata():{})).off("click.fb").on("click.fb",function(t){var e;t.preventDefault(),F||(F=!0,c(this).trigger("blur"),v=[],x=0,(e=c(this).attr("rel")||"")&&""!=e&&"nofollow"!==e?(v=c("a[rel="+e+"], area[rel="+e+"]"),x=v.index(this)):v.push(this),a())}),this},c.fancybox=function(t){var e;if(!F){if(F=!0,e=void 0!==arguments[1]?arguments[1]:{},v=[],x=parseInt(e.index,10)||0,Array.isArray(t)){for(var i=0,n=t.length;i<n;i++)"object"==typeof t[i]?c(t[i]).data("fancybox",c.extend({},e,t[i])):t[i]=c({}).data("fancybox",c.extend({content:t[i]},e));v=jQuery.merge(v,t)}else"object"==typeof t?c(t).data("fancybox",c.extend({},e,t)):t=c({}).data("fancybox",c.extend({content:t},e)),v.push(t);(x>v.length||x<0)&&(x=0),a()}},c.fancybox.showActivity=function(){clearInterval(y),l.show(),y=setInterval(t,66)},c.fancybox.hideActivity=function(){l.hide()},c.fancybox.next=function(){return c.fancybox.pos(I+1)},c.fancybox.prev=function(){return c.fancybox.pos(I-1)},c.fancybox.pos=function(t){F||(t=parseInt(t),v=k,-1<t&&t<k.length?(x=t,a()):C.cyclic&&1<k.length&&(x=t>=k.length?0:k.length-1,a()))},c.fancybox.cancel=function(){F||(F=!0,c.event.trigger("fancybox-cancel"),r(),m.onCancel(v,x,m),F=!1)},c.fancybox.close=function(){var t;function e(){i.fadeOut("fast"),p.empty().hide(),n.hide(),c.event.trigger("fancybox-cleanup"),f.empty(),C.onClosed(k,I,C),k=m=[],I=x=0,C=m={},F=!1}F||n.is(":hidden")||(F=!0,C&&!1===C.onCleanup(k,I,C)?F=!1:(r(),c(d.add(g).add(b)).hide(),c(f.add(i)).off(),c(window).off("resize.fb scroll.fb"),c(document).off("keydown.fb"),f.find("iframe").attr("src",P&&/^https/i.test(window.location.href||"")?"javascript:void(false)":"about:blank"),"inside"!==C.titlePosition&&p.empty(),n.stop(),"elastic"==C.transitionOut?(u=W(),t=n.position(),w={top:t.top,left:t.left,width:n.width(),height:n.height()},C.opacity&&(w.opacity=1),p.empty().hide(),N.prop=1,c(N).animate({prop:0},{duration:C.speedOut,easing:C.easingOut,step:K,complete:e})):n.fadeOut("none"==C.transitionOut?0:C.speedOut,e)))},c.fancybox.resize=function(){i.is(":visible")&&i.css("height",c(document).height()),c.fancybox.center(!0)},c.fancybox.center=function(){var t,e;F||(e=!0===arguments[0]?1:0,t=o(),!e&&(n.width()>t[0]||n.height()>t[1])||n.stop().animate({top:parseInt(Math.max(t[3]-20,t[3]+.5*(t[1]-f.height()-40)-C.padding)),left:parseInt(Math.max(t[2]-20,t[2]+.5*(t[0]-f.width()-40)-C.padding))},"number"==typeof arguments[0]?arguments[0]:200))},c.fancybox.init=function(){c("#fancybox-wrap").length||(c("body").append(h=c('<div id="fancybox-tmp"></div>'),l=c('<div id="fancybox-loading"><div></div></div>'),i=c('<div id="fancybox-overlay"></div>'),n=c('<div id="fancybox-wrap"></div>')),(e=c('<div id="fancybox-outer"></div>').append('<div class="fancybox-bg" id="fancybox-bg-n"></div><div class="fancybox-bg" id="fancybox-bg-ne"></div><div class="fancybox-bg" id="fancybox-bg-e"></div><div class="fancybox-bg" id="fancybox-bg-se"></div><div class="fancybox-bg" id="fancybox-bg-s"></div><div class="fancybox-bg" id="fancybox-bg-sw"></div><div class="fancybox-bg" id="fancybox-bg-w"></div><div class="fancybox-bg" id="fancybox-bg-nw"></div>').appendTo(n)).append(f=c('<div id="fancybox-content"></div>'),d=c('<a id="fancybox-close"></a>'),p=c('<div id="fancybox-title"></div>'),g=c('<a href="javascript:;" id="fancybox-left"><span class="fancy-ico" id="fancybox-left-ico"></span></a>'),b=c('<a href="javascript:;" id="fancybox-right"><span class="fancy-ico" id="fancybox-right-ico"></span></a>')),d.on("click",c.fancybox.close),l.on("click",c.fancybox.cancel),g.on("click",function(t){t.preventDefault(),c.fancybox.prev()}),b.on("click",function(t){t.preventDefault(),c.fancybox.next()}),c.fn.mousewheel&&n.on("mousewheel.fb",function(t,e){F?t.preventDefault():0!=c(t.target).get(0).clientHeight&&c(t.target).get(0).scrollHeight!==c(t.target).get(0).clientHeight||(t.preventDefault(),c.fancybox[0<e?"prev":"next"]())}),c.support.opacity||n.addClass("fancybox-ie"),P&&(l.addClass("fancybox-ie6"),n.addClass("fancybox-ie6"),c('<iframe id="fancybox-hide-sel-frame" src="'+(/^https/i.test(window.location.href||"")?"javascript:void(false)":"about:blank")+'" scrolling="no" border="0" frameborder="0" tabindex="-1"></iframe>').prependTo(e)))},c.fn.fancybox.defaults={padding:10,margin:40,opacity:!1,modal:!1,cyclic:!1,scrolling:"auto",width:560,height:340,autoScale:!0,autoDimensions:!0,centerOnScroll:!1,ajax:{},swf:{wmode:"transparent"},hideOnOverlayClick:!0,hideOnContentClick:!1,overlayShow:!0,overlayOpacity:.7,overlayColor:"#777",titleShow:!0,titlePosition:"float",titleFormat:null,titleFromAlt:!1,transitionIn:"fade",transitionOut:"fade",speedIn:300,speedOut:300,changeSpeed:300,changeFade:"fast",easingIn:"swing",easingOut:"swing",showCloseButton:!0,showNavArrows:!0,enableEscapeButton:!0,enableKeyboardNav:!0,onStart:function(){},onCancel:function(){},onComplete:function(){},onCleanup:function(){},onClosed:function(){},onError:function(){}},jQuery(function(t){t.fancybox.init()})}(jQuery);
1
+ !function(c){function r(){l.hide(),j.onerror=j.onload=null,O&&O.abort(),s.empty()}function h(){if(!1===m.onError(v,x,m))return l.hide(),F=!1;m.titleShow=!1,m.width="auto",m.height="auto",s.html('<p id="fancybox-error">The requested content cannot be loaded.<br />Please try again later.</p>'),P()}function a(){var n,t,e,i,a,o,d=v[x];if(r(),m=c.extend({},c.fn.fancybox.defaults,void 0===c(d).data("fancybox")?m:c(d).data("fancybox")),!1!==(o=m.onStart(v,x,m)))if("object"==typeof o&&(m=c.extend(m,o)),e=m.title||(d.nodeName?c(d).attr("title"):d.title)||"",d.nodeName&&!m.orig&&(m.orig=c(d).children("img:first").length?c(d).children("img:first"):c(d)),""===e&&m.orig&&m.titleFromAlt&&(e=m.orig.attr("alt")),n=m.href||(d.nodeName?c(d).attr("href"):d.href)||null,!/^(?:javascript)/i.test(n)&&"#"!=n||(n=null),m.type?(t=m.type,n=n||m.content):m.content?t="html":n&&(t=n.match(S)?"image":n.match(T)?"swf":c(d).hasClass("iframe")?"iframe":0===n.indexOf("#")?"inline":"ajax"),t)switch("inline"==t&&(d=n.substr(n.indexOf("#")),t=0<c(d).length?"inline":"ajax"),m.type=t,m.href=n,m.title=e,m.autoDimensions&&("html"==m.type||"inline"==m.type||"ajax"==m.type?(m.width="auto",m.height="auto"):m.autoDimensions=!1),m.modal&&(m.overlayShow=!0,m.hideOnOverlayClick=!1,m.hideOnContentClick=!1,m.enableEscapeButton=!1,m.showCloseButton=!1),m.padding=parseInt(m.padding,10),m.margin=parseInt(m.margin,10),s.css("padding",m.padding+m.margin),c(".fancybox-inline-tmp").off("fancybox-cancel").on("fancybox-change",function(){c(this).replaceWith(f.children())}),t){case"html":s.html(m.content),P();break;case"inline":if(!0===c(d).parent().is("#fancybox-content"))return F=!1,0;c('<div class="fancybox-inline-tmp" />').hide().insertBefore(c(d)).on("fancybox-cleanup",function(){c(this).replaceWith(f.children())}).on("fancybox-cancel",function(){c(this).replaceWith(s.children())}),c(d).appendTo(s),P();break;case"image":F=!1,c.fancybox.showActivity(),(j=new Image).onerror=function(){h()},j.onload=function(){F=!0,j.onerror=j.onload=null,B()},j.src=n;break;case"swf":m.scrolling="no",i='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="'+m.width+'" height="'+m.height+'"><param name="movie" value="'+n+'"></param>',a="",c.each(m.swf,function(t,e){i+='<param name="'+t+'" value="'+e+'"></param>',a+=" "+t+'="'+e+'"'}),i+='<embed src="'+n+'" type="application/x-shockwave-flash" width="'+m.width+'" height="'+m.height+'"'+a+"></embed></object>",s.html(i),P();break;case"ajax":F=!1,c.fancybox.showActivity(),m.ajax.win=m.ajax.success,O=c.ajax(c.extend({},m.ajax,{url:n,data:m.ajax.data||{},error:function(t,e,i){0<t.status&&h()},success:function(t,e,i){if(200==("object"==typeof i?i:O).status){if("function"==typeof m.ajax.win){if(!1===(o=m.ajax.win(n,t,e,i)))return void l.hide();"string"!=typeof o&&"object"!=typeof o||(t=o)}s.html(t),P()}}}));break;case"iframe":L()}else h();else F=!1}function o(){return[c(window).width()-2*C.margin,c(window).height()-2*C.margin,c(document).scrollLeft()+C.margin,c(document).scrollTop()+C.margin]}function t(){l.is(":visible")?(c("div",l).css("top",-40*D+"px"),D=(D+1)%12):clearInterval(b)}var s,l,i,n,e,f,d,p,g,y,b,u,w,x=0,m={},v=[],I=0,C={},k=[],O=null,j=new Image,S=/\.(jpg|gif|png|bmp|jpeg)(.*)?$/i,T=/[^\.]\.(swf)\s*$/i,D=1,A=0,E="",F=!1,N=c.extend(c("<div/>")[0],{prop:0}),P=function(){var t=m.width,e=m.height,t=-1<t.toString().indexOf("%")?parseInt((c(window).width()-2*m.margin)*parseFloat(t)/100,10)+"px":"auto"==t?"auto":t+"px",e=-1<e.toString().indexOf("%")?parseInt((c(window).height()-2*m.margin)*parseFloat(e)/100,10)+"px":"auto"==e?"auto":e+"px";s.wrapInner('<div style="width:'+t+";height:"+e+";overflow: "+("auto"==m.scrolling?"auto":"yes"==m.scrolling?"scroll":"hidden")+';position:relative;"></div>'),m.width=s.width(),m.height=s.height(),L()},B=function(){m.width=j.width,m.height=j.height,c("<img />").attr({id:"fancybox-img",src:j.src,alt:m.title}).appendTo(s),L()},L=function(){var t,e;return l.hide(),n.is(":visible")&&!1===C.onCleanup(k,I,C)?(c.event.trigger("fancybox-cancel"),void(F=!1)):(F=!0,c(f.add(i)).off(),c(window).off("resize.fb scroll.fb"),c(document).off("keydown.fb"),n.is(":visible")&&"outside"!==C.titlePosition&&n.css("height",n.height()),k=v,I=x,(C=m).overlayShow?(i.css({"background-color":C.overlayColor,opacity:C.overlayOpacity,cursor:C.hideOnOverlayClick?"pointer":"auto",height:c(document).height()}),i.is(":visible")||i.show()):i.hide(),w=Q(),M(),n.is(":visible")?(c(d.add(g).add(y)).hide(),t=n.position(),u={top:t.top,left:t.left,width:n.width(),height:n.height()},e=u.width==w.width&&u.height==w.height,void f.fadeTo(C.changeFade,.3,function(){function t(){f.html(s.contents()).fadeTo(C.changeFade,1,z)}c.event.trigger("fancybox-change"),f.empty().removeAttr("filter").css({"border-width":C.padding,width:w.width-2*C.padding,height:m.autoDimensions?"auto":w.height-A-2*C.padding}),e?t():(N.prop=0,c(N).animate({prop:1},{duration:C.changeSpeed,easing:C.easingChange,step:K,complete:t}))})):(n.removeAttr("style"),f.css("border-width",C.padding),"elastic"==C.transitionIn?(u=R(),f.html(s.contents()),n.show(),C.opacity&&(w.opacity=0),N.prop=0,void c(N).animate({prop:1},{duration:C.speedIn,easing:C.easingIn,step:K,complete:z})):("inside"==C.titlePosition&&0<A&&p.show(),f.css({width:w.width-2*C.padding,height:m.autoDimensions?"auto":w.height-A-2*C.padding}).html(s.contents()),void n.css(w).fadeIn("none"==C.transitionIn?0:C.speedIn,z))))},M=function(){if(E=C.title||"",A=0,p.empty().removeAttr("style").removeClass(),!1!==C.titleShow){var t;if((E="function"==typeof C.titleFormat?C.titleFormat(E,k,I,C):!(!(t=E)||!t.length)&&("float"==C.titlePosition?'<table id="fancybox-title-float-wrap" cellpadding="0" cellspacing="0"><tr><td id="fancybox-title-float-left"></td><td id="fancybox-title-float-main">'+t+'</td><td id="fancybox-title-float-right"></td></tr></table>':'<div id="fancybox-title-'+C.titlePosition+'">'+t+"</div>"))&&""!==E){switch(p.addClass("fancybox-title-"+C.titlePosition).html(E).appendTo("body").show(),C.titlePosition){case"inside":p.css({width:w.width-2*C.padding,marginLeft:C.padding,marginRight:C.padding}),A=p.outerHeight(!0),p.appendTo(e),w.height+=A;break;case"over":p.css({marginLeft:C.padding,width:w.width-2*C.padding,bottom:C.padding}).appendTo(e);break;case"float":p.css("left",-1*parseInt((p.width()-w.width-40)/2,10)).appendTo(n);break;default:p.css({width:w.width-2*C.padding,paddingLeft:C.padding,paddingRight:C.padding}).appendTo(n)}p.hide()}else p.hide()}else p.hide()},z=function(){c.support.opacity||(f.get(0).style.removeProperty("filter"),n.get(0).style.removeProperty("filter")),m.autoDimensions&&f.css("height","auto"),n.css("height","auto"),E&&E.length&&p.show(),C.showCloseButton&&d.show(),function(){if((C.enableEscapeButton||C.enableKeyboardNav)&&c(document).on("keydown.fb",function(t){27==t.keyCode&&C.enableEscapeButton?(t.preventDefault(),c.fancybox.close()):37!=t.keyCode&&39!=t.keyCode||!C.enableKeyboardNav||"INPUT"===t.target.tagName||"TEXTAREA"===t.target.tagName||"SELECT"===t.target.tagName||(t.preventDefault(),c.fancybox[37==t.keyCode?"prev":"next"]())}),!C.showNavArrows)return g.hide(),y.hide();(C.cyclic&&1<k.length||0!==I)&&g.show(),(C.cyclic&&1<k.length||I!=k.length-1)&&y.show()}(),C.hideOnContentClick&&f.on("click",c.fancybox.close),C.hideOnOverlayClick&&i.on("click",c.fancybox.close),c(window).on("resize.fb",c.fancybox.resize),C.centerOnScroll&&c(window).on("scroll.fb",c.fancybox.center),"iframe"==C.type&&c('<iframe id="fancybox-frame" name="fancybox-frame'+(new Date).getTime()+'" frameborder="0" hspace="0" scrolling="'+m.scrolling+'" src="'+C.href+'"></iframe>').appendTo(f),n.show(),F=!1,c.fancybox.center(),C.onComplete(k,I,C),H()},H=function(){var t;k.length-1>I&&void 0!==(t=k[I+1].href)&&t.match(S)&&((new Image).src=t),0<I&&void 0!==(t=k[I-1].href)&&t.match(S)&&((new Image).src=t)},K=function(t){var e={width:parseInt(u.width+(w.width-u.width)*t,10),height:parseInt(u.height+(w.height-u.height)*t,10),top:parseInt(u.top+(w.top-u.top)*t,10),left:parseInt(u.left+(w.left-u.left)*t,10)};void 0!==w.opacity&&(e.opacity=t<.5?.5:t),n.css(e),f.css({width:e.width-2*C.padding,height:e.height-A*t-2*C.padding})},Q=function(){var t,e=o(),i={},n=C.autoScale,a=2*C.padding;return-1<C.width.toString().indexOf("%")?i.width=parseInt(e[0]*parseFloat(C.width)/100,10):i.width=C.width+a,-1<C.height.toString().indexOf("%")?i.height=parseInt(e[1]*parseFloat(C.height)/100,10):i.height=C.height+a,n&&(i.width>e[0]||i.height>e[1])&&("image"==m.type||"swf"==m.type?(t=C.width/C.height,i.width>e[0]&&(i.width=e[0],i.height=parseInt((i.width-a)/t+a,10)),i.height>e[1]&&(i.height=e[1],i.width=parseInt((i.height-a)*t+a,10))):(i.width=Math.min(i.width,e[0]),i.height=Math.min(i.height,e[1]))),i.top=parseInt(Math.max(e[3]-20,e[3]+.5*(e[1]-i.height-40)),10),i.left=parseInt(Math.max(e[2]-20,e[2]+.5*(e[0]-i.width-40)),10),i},R=function(){var t,e,i,n=!!m.orig&&c(m.orig);return n&&n.length?((i=(e=n).offset()).top+=parseInt(e.css("paddingTop"),10)||0,i.left+=parseInt(e.css("paddingLeft"),10)||0,i.top+=parseInt(e.css("border-top-width"),10)||0,i.left+=parseInt(e.css("border-left-width"),10)||0,i.width=e.width(),i.height=e.height(),{width:i.width+2*C.padding,height:i.height+2*C.padding,top:i.top-C.padding-20,left:i.left-C.padding-20}):(t=o(),{width:2*C.padding,height:2*C.padding,top:parseInt(t[3]+.5*t[1],10),left:parseInt(t[2]+.5*t[0],10)})};c.fn.fancybox=function(t){return c(this).length&&c(this).data("fancybox",c.extend({},t,c.metadata?c(this).metadata():{})).off("click.fb").on("click.fb",function(t){var e;t.preventDefault(),F||(F=!0,c(this).trigger("blur"),v=[],x=0,(e=c(this).attr("rel")||"")&&""!=e&&"nofollow"!==e?(v=c("a[rel="+e+"], area[rel="+e+"]"),x=v.index(this)):v.push(this),a())}),this},c.fancybox=function(t){var e;if(!F){if(F=!0,e=void 0!==arguments[1]?arguments[1]:{},v=[],x=parseInt(e.index,10)||0,Array.isArray(t)){for(var i=0,n=t.length;i<n;i++)"object"==typeof t[i]?c(t[i]).data("fancybox",c.extend({},e,t[i])):t[i]=c({}).data("fancybox",c.extend({content:t[i]},e));v=jQuery.merge(v,t)}else"object"==typeof t?c(t).data("fancybox",c.extend({},e,t)):t=c({}).data("fancybox",c.extend({content:t},e)),v.push(t);(x>v.length||x<0)&&(x=0),a()}},c.fancybox.showActivity=function(){clearInterval(b),l.show(),b=setInterval(t,66)},c.fancybox.hideActivity=function(){l.hide()},c.fancybox.next=function(){return c.fancybox.pos(I+1)},c.fancybox.prev=function(){return c.fancybox.pos(I-1)},c.fancybox.pos=function(t){F||(t=parseInt(t),v=k,-1<t&&t<k.length?(x=t,a()):C.cyclic&&1<k.length&&(x=t>=k.length?0:k.length-1,a()))},c.fancybox.cancel=function(){F||(F=!0,c.event.trigger("fancybox-cancel"),r(),m.onCancel(v,x,m),F=!1)},c.fancybox.close=function(){var t;function e(){i.fadeOut("fast"),p.empty().hide(),n.hide(),c.event.trigger("fancybox-cleanup"),f.empty(),C.onClosed(k,I,C),k=m=[],I=x=0,C=m={},F=!1}F||n.is(":hidden")||(F=!0,C&&!1===C.onCleanup(k,I,C)?F=!1:(r(),c(d.add(g).add(y)).hide(),c(f.add(i)).off(),c(window).off("resize.fb scroll.fb"),c(document).off("keydown.fb"),f.find("iframe").attr("src","about:blank"),"inside"!==C.titlePosition&&p.empty(),n.stop(),"elastic"==C.transitionOut?(u=R(),t=n.position(),w={top:t.top,left:t.left,width:n.width(),height:n.height()},C.opacity&&(w.opacity=1),p.empty().hide(),N.prop=1,c(N).animate({prop:0},{duration:C.speedOut,easing:C.easingOut,step:K,complete:e})):n.fadeOut("none"==C.transitionOut?0:C.speedOut,e)))},c.fancybox.resize=function(){i.is(":visible")&&i.css("height",c(document).height()),c.fancybox.center(!0)},c.fancybox.center=function(){var t,e;F||(e=!0===arguments[0]?1:0,t=o(),!e&&(n.width()>t[0]||n.height()>t[1])||n.stop().animate({top:parseInt(Math.max(t[3]-20,t[3]+.5*(t[1]-f.height()-40)-C.padding)),left:parseInt(Math.max(t[2]-20,t[2]+.5*(t[0]-f.width()-40)-C.padding))},"number"==typeof arguments[0]?arguments[0]:200))},c.fancybox.init=function(){c("#fancybox-wrap").length||(c("body").append(s=c('<div id="fancybox-tmp"></div>'),l=c('<div id="fancybox-loading"><div></div></div>'),i=c('<div id="fancybox-overlay"></div>'),n=c('<div id="fancybox-wrap"></div>')),(e=c('<div id="fancybox-outer"></div>').append('<div class="fancybox-bg" id="fancybox-bg-n"></div><div class="fancybox-bg" id="fancybox-bg-ne"></div><div class="fancybox-bg" id="fancybox-bg-e"></div><div class="fancybox-bg" id="fancybox-bg-se"></div><div class="fancybox-bg" id="fancybox-bg-s"></div><div class="fancybox-bg" id="fancybox-bg-sw"></div><div class="fancybox-bg" id="fancybox-bg-w"></div><div class="fancybox-bg" id="fancybox-bg-nw"></div>').appendTo(n)).append(f=c('<div id="fancybox-content"></div>'),d=c('<a id="fancybox-close"></a>'),p=c('<div id="fancybox-title"></div>'),g=c('<a href="javascript:;" id="fancybox-left"><span class="fancy-ico" id="fancybox-left-ico"></span></a>'),y=c('<a href="javascript:;" id="fancybox-right"><span class="fancy-ico" id="fancybox-right-ico"></span></a>')),d.on("click",c.fancybox.close),l.on("click",c.fancybox.cancel),g.on("click",function(t){t.preventDefault(),c.fancybox.prev()}),y.on("click",function(t){t.preventDefault(),c.fancybox.next()}),c.fn.mousewheel&&n.on("mousewheel.fb",function(t,e){F?t.preventDefault():0!=c(t.target).get(0).clientHeight&&c(t.target).get(0).scrollHeight!==c(t.target).get(0).clientHeight||(t.preventDefault(),c.fancybox[0<e?"prev":"next"]())}),c.support.opacity||n.addClass("fancybox-ie"))},c.fn.fancybox.defaults={padding:10,margin:40,opacity:!1,modal:!1,cyclic:!1,scrolling:"auto",width:560,height:340,autoScale:!0,autoDimensions:!0,centerOnScroll:!1,ajax:{},swf:{wmode:"transparent"},hideOnOverlayClick:!0,hideOnContentClick:!1,overlayShow:!0,overlayOpacity:.7,overlayColor:"#777",titleShow:!0,titlePosition:"float",titleFormat:null,titleFromAlt:!1,transitionIn:"fade",transitionOut:"fade",speedIn:300,speedOut:300,changeSpeed:300,changeFade:"fast",easingIn:"swing",easingOut:"swing",showCloseButton:!0,showNavArrows:!0,enableEscapeButton:!0,enableKeyboardNav:!0,onStart:function(){},onCancel:function(){},onComplete:function(){},onCleanup:function(){},onClosed:function(){},onError:function(){}},jQuery(function(t){t.fancybox.init()})}(jQuery);
products/photocrati_nextgen/modules/lightbox/static/fancybox/jquery.fancybox-1.3.4.pack.min.js CHANGED
@@ -1 +1 @@
1
- "use strict";function _typeof(t){"@babel/helpers - typeof";return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}!function(t){function e(){c.hide(),j.onerror=j.onload=null,O&&O.abort(),d.empty()}function i(){if(!1===x.onError(v,m,x))return c.hide(),F=!1;x.titleShow=!1,x.width="auto",x.height="auto",d.html('<p id="fancybox-error">The requested content cannot be loaded.<br />Please try again later.</p>'),B()}function n(){var n,a,o,r,s,h,f=v[m];if(e(),x=t.extend({},t.fn.fancybox.defaults,void 0===t(f).data("fancybox")?x:t(f).data("fancybox")),!1!==(h=x.onStart(v,m,x)))if("object"==_typeof(h)&&(x=t.extend(x,h)),o=x.title||(f.nodeName?t(f).attr("title"):f.title)||"",f.nodeName&&!x.orig&&(x.orig=t(f).children("img:first").length?t(f).children("img:first"):t(f)),""===o&&x.orig&&x.titleFromAlt&&(o=x.orig.attr("alt")),n=x.href||(f.nodeName?t(f).attr("href"):f.href)||null,!/^(?:javascript)/i.test(n)&&"#"!=n||(n=null),x.type?(a=x.type,n=n||x.content):x.content?a="html":n&&(a=n.match(S)?"image":n.match(T)?"swf":t(f).hasClass("iframe")?"iframe":0===n.indexOf("#")?"inline":"ajax"),a)switch("inline"==a&&(f=n.substr(n.indexOf("#")),a=0<t(f).length?"inline":"ajax"),x.type=a,x.href=n,x.title=o,x.autoDimensions&&("html"==x.type||"inline"==x.type||"ajax"==x.type?(x.width="auto",x.height="auto"):x.autoDimensions=!1),x.modal&&(x.overlayShow=!0,x.hideOnOverlayClick=!1,x.hideOnContentClick=!1,x.enableEscapeButton=!1,x.showCloseButton=!1),x.padding=parseInt(x.padding,10),x.margin=parseInt(x.margin,10),d.css("padding",x.padding+x.margin),t(".fancybox-inline-tmp").off("fancybox-cancel").on("fancybox-change",function(){t(this).replaceWith(l.children())}),a){case"html":d.html(x.content),B();break;case"inline":if(!0===t(f).parent().is("#fancybox-content"))return F=!1,0;t('<div class="fancybox-inline-tmp" />').hide().insertBefore(t(f)).on("fancybox-cleanup",function(){t(this).replaceWith(l.children())}).on("fancybox-cancel",function(){t(this).replaceWith(d.children())}),t(f).appendTo(d),B();break;case"image":F=!1,t.fancybox.showActivity(),(j=new Image).onerror=function(){i()},j.onload=function(){F=!0,j.onerror=j.onload=null,L()},j.src=n;break;case"swf":x.scrolling="no",r='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="'+x.width+'" height="'+x.height+'"><param name="movie" value="'+n+'"></param>',s="",t.each(x.swf,function(t,e){r+='<param name="'+t+'" value="'+e+'"></param>',s+=" "+t+'="'+e+'"'}),r+='<embed src="'+n+'" type="application/x-shockwave-flash" width="'+x.width+'" height="'+x.height+'"'+s+"></embed></object>",d.html(r),B();break;case"ajax":F=!1,t.fancybox.showActivity(),x.ajax.win=x.ajax.success,O=t.ajax(t.extend({},x.ajax,{url:n,data:x.ajax.data||{},error:function(t,e,n){0<t.status&&i()},success:function(t,e,i){if(200==("object"==_typeof(i)?i:O).status){if("function"==typeof x.ajax.win){if(!1===(h=x.ajax.win(n,t,e,i)))return void c.hide();"string"!=typeof h&&"object"!=_typeof(h)||(t=h)}d.html(t),B()}}}));break;case"iframe":M()}else i();else F=!1}function a(){return[t(window).width()-2*C.margin,t(window).height()-2*C.margin,t(document).scrollLeft()+C.margin,t(document).scrollTop()+C.margin]}function o(){c.is(":visible")?(t("div",c).css("top",-40*D+"px"),D=(D+1)%12):clearInterval(b)}var d,c,r,s,h,l,f,p,g,y,b,u,w,m=0,x={},v=[],I=0,C={},k=[],O=null,j=new Image,S=/\.(jpg|gif|png|bmp|jpeg)(.*)?$/i,T=/[^\.]\.(swf)\s*$/i,D=1,A=0,E="",F=!1,N=t.extend(t("<div/>")[0],{prop:0}),P=t.browser.msie&&t.browser.version<7&&!window.XMLHttpRequest,B=function(){var e=x.width,i=x.height,e=-1<e.toString().indexOf("%")?parseInt((t(window).width()-2*x.margin)*parseFloat(e)/100,10)+"px":"auto"==e?"auto":e+"px",i=-1<i.toString().indexOf("%")?parseInt((t(window).height()-2*x.margin)*parseFloat(i)/100,10)+"px":"auto"==i?"auto":i+"px";d.wrapInner('<div style="width:'+e+";height:"+i+";overflow: "+("auto"==x.scrolling?"auto":"yes"==x.scrolling?"scroll":"hidden")+';position:relative;"></div>'),x.width=d.width(),x.height=d.height(),M()},L=function(){x.width=j.width,x.height=j.height,t("<img />").attr({id:"fancybox-img",src:j.src,alt:x.title}).appendTo(d),M()},M=function(){var e,i;return c.hide(),s.is(":visible")&&!1===C.onCleanup(k,I,C)?(t.event.trigger("fancybox-cancel"),void(F=!1)):(F=!0,t(l.add(r)).off(),t(window).off("resize.fb scroll.fb"),t(document).off("keydown.fb"),s.is(":visible")&&"outside"!==C.titlePosition&&s.css("height",s.height()),k=v,I=m,(C=x).overlayShow?(r.css({"background-color":C.overlayColor,opacity:C.overlayOpacity,cursor:C.hideOnOverlayClick?"pointer":"auto",height:t(document).height()}),r.is(":visible")||(P&&t("select:not(#fancybox-tmp select)").filter(function(){return"hidden"!==this.style.visibility}).css({visibility:"hidden"}).one("fancybox-cleanup",function(){this.style.visibility="inherit"}),r.show())):r.hide(),w=K(),_(),s.is(":visible")?(t(f.add(g).add(y)).hide(),e=s.position(),u={top:e.top,left:e.left,width:s.width(),height:s.height()},i=u.width==w.width&&u.height==w.height,void l.fadeTo(C.changeFade,.3,function(){function e(){l.html(d.contents()).fadeTo(C.changeFade,1,z)}t.event.trigger("fancybox-change"),l.empty().removeAttr("filter").css({"border-width":C.padding,width:w.width-2*C.padding,height:x.autoDimensions?"auto":w.height-A-2*C.padding}),i?e():(N.prop=0,t(N).animate({prop:1},{duration:C.changeSpeed,easing:C.easingChange,step:R,complete:e}))})):(s.removeAttr("style"),l.css("border-width",C.padding),"elastic"==C.transitionIn?(u=Q(),l.html(d.contents()),s.show(),C.opacity&&(w.opacity=0),N.prop=0,void t(N).animate({prop:1},{duration:C.speedIn,easing:C.easingIn,step:R,complete:z})):("inside"==C.titlePosition&&0<A&&p.show(),l.css({width:w.width-2*C.padding,height:x.autoDimensions?"auto":w.height-A-2*C.padding}).html(d.contents()),void s.css(w).fadeIn("none"==C.transitionIn?0:C.speedIn,z))))},_=function(){if(E=C.title||"",A=0,p.empty().removeAttr("style").removeClass(),!1!==C.titleShow){var t;if((E="function"==typeof C.titleFormat?C.titleFormat(E,k,I,C):!(!(t=E)||!t.length)&&("float"==C.titlePosition?'<table id="fancybox-title-float-wrap" cellpadding="0" cellspacing="0"><tr><td id="fancybox-title-float-left"></td><td id="fancybox-title-float-main">'+t+'</td><td id="fancybox-title-float-right"></td></tr></table>':'<div id="fancybox-title-'+C.titlePosition+'">'+t+"</div>"))&&""!==E){switch(p.addClass("fancybox-title-"+C.titlePosition).html(E).appendTo("body").show(),C.titlePosition){case"inside":p.css({width:w.width-2*C.padding,marginLeft:C.padding,marginRight:C.padding}),A=p.outerHeight(!0),p.appendTo(h),w.height+=A;break;case"over":p.css({marginLeft:C.padding,width:w.width-2*C.padding,bottom:C.padding}).appendTo(h);break;case"float":p.css("left",-1*parseInt((p.width()-w.width-40)/2,10)).appendTo(s);break;default:p.css({width:w.width-2*C.padding,paddingLeft:C.padding,paddingRight:C.padding}).appendTo(s)}p.hide()}else p.hide()}else p.hide()},z=function(){t.support.opacity||(l.get(0).style.removeProperty("filter"),s.get(0).style.removeProperty("filter")),x.autoDimensions&&l.css("height","auto"),s.css("height","auto"),E&&E.length&&p.show(),C.showCloseButton&&f.show(),function(){if((C.enableEscapeButton||C.enableKeyboardNav)&&t(document).on("keydown.fb",function(e){27==e.keyCode&&C.enableEscapeButton?(e.preventDefault(),t.fancybox.close()):37!=e.keyCode&&39!=e.keyCode||!C.enableKeyboardNav||"INPUT"===e.target.tagName||"TEXTAREA"===e.target.tagName||"SELECT"===e.target.tagName||(e.preventDefault(),t.fancybox[37==e.keyCode?"prev":"next"]())}),!C.showNavArrows)return g.hide(),y.hide();(C.cyclic&&1<k.length||0!==I)&&g.show(),(C.cyclic&&1<k.length||I!=k.length-1)&&y.show()}(),C.hideOnContentClick&&l.on("click",t.fancybox.close),C.hideOnOverlayClick&&r.on("click",t.fancybox.close),t(window).on("resize.fb",t.fancybox.resize),C.centerOnScroll&&t(window).on("scroll.fb",t.fancybox.center),"iframe"==C.type&&t('<iframe id="fancybox-frame" name="fancybox-frame'+(new Date).getTime()+'" frameborder="0" hspace="0" '+(t.browser.msie?'allowtransparency="true""':"")+' scrolling="'+x.scrolling+'" src="'+C.href+'"></iframe>').appendTo(l),s.show(),F=!1,t.fancybox.center(),C.onComplete(k,I,C),H()},H=function(){var t;k.length-1>I&&void 0!==(t=k[I+1].href)&&t.match(S)&&((new Image).src=t),0<I&&void 0!==(t=k[I-1].href)&&t.match(S)&&((new Image).src=t)},R=function(t){var e={width:parseInt(u.width+(w.width-u.width)*t,10),height:parseInt(u.height+(w.height-u.height)*t,10),top:parseInt(u.top+(w.top-u.top)*t,10),left:parseInt(u.left+(w.left-u.left)*t,10)};void 0!==w.opacity&&(e.opacity=t<.5?.5:t),s.css(e),l.css({width:e.width-2*C.padding,height:e.height-A*t-2*C.padding})},K=function(){var t,e=a(),i={},n=C.autoScale,o=2*C.padding;return-1<C.width.toString().indexOf("%")?i.width=parseInt(e[0]*parseFloat(C.width)/100,10):i.width=C.width+o,-1<C.height.toString().indexOf("%")?i.height=parseInt(e[1]*parseFloat(C.height)/100,10):i.height=C.height+o,n&&(i.width>e[0]||i.height>e[1])&&("image"==x.type||"swf"==x.type?(t=C.width/C.height,i.width>e[0]&&(i.width=e[0],i.height=parseInt((i.width-o)/t+o,10)),i.height>e[1]&&(i.height=e[1],i.width=parseInt((i.height-o)*t+o,10))):(i.width=Math.min(i.width,e[0]),i.height=Math.min(i.height,e[1]))),i.top=parseInt(Math.max(e[3]-20,e[3]+.5*(e[1]-i.height-40)),10),i.left=parseInt(Math.max(e[2]-20,e[2]+.5*(e[0]-i.width-40)),10),i},Q=function(){var e,i,n,o=!!x.orig&&t(x.orig);return o&&o.length?((n=(i=o).offset()).top+=parseInt(i.css("paddingTop"),10)||0,n.left+=parseInt(i.css("paddingLeft"),10)||0,n.top+=parseInt(i.css("border-top-width"),10)||0,n.left+=parseInt(i.css("border-left-width"),10)||0,n.width=i.width(),n.height=i.height(),{width:n.width+2*C.padding,height:n.height+2*C.padding,top:n.top-C.padding-20,left:n.left-C.padding-20}):(e=a(),{width:2*C.padding,height:2*C.padding,top:parseInt(e[3]+.5*e[1],10),left:parseInt(e[2]+.5*e[0],10)})};t.fn.fancybox=function(e){return t(this).length&&t(this).data("fancybox",t.extend({},e,t.metadata?t(this).metadata():{})).off("click.fb").on("click.fb",function(e){var i;e.preventDefault(),F||(F=!0,t(this).trigger("blur"),v=[],m=0,(i=t(this).attr("rel")||"")&&""!=i&&"nofollow"!==i?(v=t("a[rel="+i+"], area[rel="+i+"]"),m=v.index(this)):v.push(this),n())}),this},t.fancybox=function(e){var i;if(!F){if(F=!0,i=void 0!==arguments[1]?arguments[1]:{},v=[],m=parseInt(i.index,10)||0,Array.isArray(e)){for(var a=0,o=e.length;a<o;a++)"object"==_typeof(e[a])?t(e[a]).data("fancybox",t.extend({},i,e[a])):e[a]=t({}).data("fancybox",t.extend({content:e[a]},i));v=jQuery.merge(v,e)}else"object"==_typeof(e)?t(e).data("fancybox",t.extend({},i,e)):e=t({}).data("fancybox",t.extend({content:e},i)),v.push(e);(m>v.length||m<0)&&(m=0),n()}},t.fancybox.showActivity=function(){clearInterval(b),c.show(),b=setInterval(o,66)},t.fancybox.hideActivity=function(){c.hide()},t.fancybox.next=function(){return t.fancybox.pos(I+1)},t.fancybox.prev=function(){return t.fancybox.pos(I-1)},t.fancybox.pos=function(t){F||(t=parseInt(t),v=k,-1<t&&t<k.length?(m=t,n()):C.cyclic&&1<k.length&&(m=t>=k.length?0:k.length-1,n()))},t.fancybox.cancel=function(){F||(F=!0,t.event.trigger("fancybox-cancel"),e(),x.onCancel(v,m,x),F=!1)},t.fancybox.close=function(){function i(){r.fadeOut("fast"),p.empty().hide(),s.hide(),t.event.trigger("fancybox-cleanup"),l.empty(),C.onClosed(k,I,C),k=x=[],I=m=0,C=x={},F=!1}var n;F||s.is(":hidden")||(F=!0,C&&!1===C.onCleanup(k,I,C)?F=!1:(e(),t(f.add(g).add(y)).hide(),t(l.add(r)).off(),t(window).off("resize.fb scroll.fb"),t(document).off("keydown.fb"),l.find("iframe").attr("src",P&&/^https/i.test(window.location.href||"")?"javascript:void(false)":"about:blank"),"inside"!==C.titlePosition&&p.empty(),s.stop(),"elastic"==C.transitionOut?(u=Q(),n=s.position(),w={top:n.top,left:n.left,width:s.width(),height:s.height()},C.opacity&&(w.opacity=1),p.empty().hide(),N.prop=1,t(N).animate({prop:0},{duration:C.speedOut,easing:C.easingOut,step:R,complete:i})):s.fadeOut("none"==C.transitionOut?0:C.speedOut,i)))},t.fancybox.resize=function(){r.is(":visible")&&r.css("height",t(document).height()),t.fancybox.center(!0)},t.fancybox.center=function(){var t,e;F||(e=!0===arguments[0]?1:0,t=a(),!e&&(s.width()>t[0]||s.height()>t[1])||s.stop().animate({top:parseInt(Math.max(t[3]-20,t[3]+.5*(t[1]-l.height()-40)-C.padding)),left:parseInt(Math.max(t[2]-20,t[2]+.5*(t[0]-l.width()-40)-C.padding))},"number"==typeof arguments[0]?arguments[0]:200))},t.fancybox.init=function(){t("#fancybox-wrap").length||(t("body").append(d=t('<div id="fancybox-tmp"></div>'),c=t('<div id="fancybox-loading"><div></div></div>'),r=t('<div id="fancybox-overlay"></div>'),s=t('<div id="fancybox-wrap"></div>')),(h=t('<div id="fancybox-outer"></div>').append('<div class="fancybox-bg" id="fancybox-bg-n"></div><div class="fancybox-bg" id="fancybox-bg-ne"></div><div class="fancybox-bg" id="fancybox-bg-e"></div><div class="fancybox-bg" id="fancybox-bg-se"></div><div class="fancybox-bg" id="fancybox-bg-s"></div><div class="fancybox-bg" id="fancybox-bg-sw"></div><div class="fancybox-bg" id="fancybox-bg-w"></div><div class="fancybox-bg" id="fancybox-bg-nw"></div>').appendTo(s)).append(l=t('<div id="fancybox-content"></div>'),f=t('<a id="fancybox-close"></a>'),p=t('<div id="fancybox-title"></div>'),g=t('<a href="javascript:;" id="fancybox-left"><span class="fancy-ico" id="fancybox-left-ico"></span></a>'),y=t('<a href="javascript:;" id="fancybox-right"><span class="fancy-ico" id="fancybox-right-ico"></span></a>')),f.on("click",t.fancybox.close),c.on("click",t.fancybox.cancel),g.on("click",function(e){e.preventDefault(),t.fancybox.prev()}),y.on("click",function(e){e.preventDefault(),t.fancybox.next()}),t.fn.mousewheel&&s.on("mousewheel.fb",function(e,i){F?e.preventDefault():0!=t(e.target).get(0).clientHeight&&t(e.target).get(0).scrollHeight!==t(e.target).get(0).clientHeight||(e.preventDefault(),t.fancybox[0<i?"prev":"next"]())}),t.support.opacity||s.addClass("fancybox-ie"),P&&(c.addClass("fancybox-ie6"),s.addClass("fancybox-ie6"),t('<iframe id="fancybox-hide-sel-frame" src="'+(/^https/i.test(window.location.href||"")?"javascript:void(false)":"about:blank")+'" scrolling="no" border="0" frameborder="0" tabindex="-1"></iframe>').prependTo(h)))},t.fn.fancybox.defaults={padding:10,margin:40,opacity:!1,modal:!1,cyclic:!1,scrolling:"auto",width:560,height:340,autoScale:!0,autoDimensions:!0,centerOnScroll:!1,ajax:{},swf:{wmode:"transparent"},hideOnOverlayClick:!0,hideOnContentClick:!1,overlayShow:!0,overlayOpacity:.7,overlayColor:"#777",titleShow:!0,titlePosition:"float",titleFormat:null,titleFromAlt:!1,transitionIn:"fade",transitionOut:"fade",speedIn:300,speedOut:300,changeSpeed:300,changeFade:"fast",easingIn:"swing",easingOut:"swing",showCloseButton:!0,showNavArrows:!0,enableEscapeButton:!0,enableKeyboardNav:!0,onStart:function(){},onCancel:function(){},onComplete:function(){},onCleanup:function(){},onClosed:function(){},onError:function(){}},jQuery(function(t){t.fancybox.init()})}(jQuery);
1
+ "use strict";function _typeof(t){"@babel/helpers - typeof";return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}!function(t){function e(){c.hide(),j.onerror=j.onload=null,O&&O.abort(),d.empty()}function i(){if(!1===x.onError(v,m,x))return c.hide(),F=!1;x.titleShow=!1,x.width="auto",x.height="auto",d.html('<p id="fancybox-error">The requested content cannot be loaded.<br />Please try again later.</p>'),P()}function n(){var n,a,o,r,s,h,f=v[m];if(e(),x=t.extend({},t.fn.fancybox.defaults,void 0===t(f).data("fancybox")?x:t(f).data("fancybox")),!1!==(h=x.onStart(v,m,x)))if("object"==_typeof(h)&&(x=t.extend(x,h)),o=x.title||(f.nodeName?t(f).attr("title"):f.title)||"",f.nodeName&&!x.orig&&(x.orig=t(f).children("img:first").length?t(f).children("img:first"):t(f)),""===o&&x.orig&&x.titleFromAlt&&(o=x.orig.attr("alt")),n=x.href||(f.nodeName?t(f).attr("href"):f.href)||null,!/^(?:javascript)/i.test(n)&&"#"!=n||(n=null),x.type?(a=x.type,n=n||x.content):x.content?a="html":n&&(a=n.match(S)?"image":n.match(T)?"swf":t(f).hasClass("iframe")?"iframe":0===n.indexOf("#")?"inline":"ajax"),a)switch("inline"==a&&(f=n.substr(n.indexOf("#")),a=0<t(f).length?"inline":"ajax"),x.type=a,x.href=n,x.title=o,x.autoDimensions&&("html"==x.type||"inline"==x.type||"ajax"==x.type?(x.width="auto",x.height="auto"):x.autoDimensions=!1),x.modal&&(x.overlayShow=!0,x.hideOnOverlayClick=!1,x.hideOnContentClick=!1,x.enableEscapeButton=!1,x.showCloseButton=!1),x.padding=parseInt(x.padding,10),x.margin=parseInt(x.margin,10),d.css("padding",x.padding+x.margin),t(".fancybox-inline-tmp").off("fancybox-cancel").on("fancybox-change",function(){t(this).replaceWith(l.children())}),a){case"html":d.html(x.content),P();break;case"inline":if(!0===t(f).parent().is("#fancybox-content"))return F=!1,0;t('<div class="fancybox-inline-tmp" />').hide().insertBefore(t(f)).on("fancybox-cleanup",function(){t(this).replaceWith(l.children())}).on("fancybox-cancel",function(){t(this).replaceWith(d.children())}),t(f).appendTo(d),P();break;case"image":F=!1,t.fancybox.showActivity(),(j=new Image).onerror=function(){i()},j.onload=function(){F=!0,j.onerror=j.onload=null,B()},j.src=n;break;case"swf":x.scrolling="no",r='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="'+x.width+'" height="'+x.height+'"><param name="movie" value="'+n+'"></param>',s="",t.each(x.swf,function(t,e){r+='<param name="'+t+'" value="'+e+'"></param>',s+=" "+t+'="'+e+'"'}),r+='<embed src="'+n+'" type="application/x-shockwave-flash" width="'+x.width+'" height="'+x.height+'"'+s+"></embed></object>",d.html(r),P();break;case"ajax":F=!1,t.fancybox.showActivity(),x.ajax.win=x.ajax.success,O=t.ajax(t.extend({},x.ajax,{url:n,data:x.ajax.data||{},error:function(t,e,n){0<t.status&&i()},success:function(t,e,i){if(200==("object"==_typeof(i)?i:O).status){if("function"==typeof x.ajax.win){if(!1===(h=x.ajax.win(n,t,e,i)))return void c.hide();"string"!=typeof h&&"object"!=_typeof(h)||(t=h)}d.html(t),P()}}}));break;case"iframe":_()}else i();else F=!1}function a(){return[t(window).width()-2*C.margin,t(window).height()-2*C.margin,t(document).scrollLeft()+C.margin,t(document).scrollTop()+C.margin]}function o(){c.is(":visible")?(t("div",c).css("top",-40*D+"px"),D=(D+1)%12):clearInterval(b)}var d,c,r,s,h,l,f,p,g,y,b,u,w,m=0,x={},v=[],I=0,C={},k=[],O=null,j=new Image,S=/\.(jpg|gif|png|bmp|jpeg)(.*)?$/i,T=/[^\.]\.(swf)\s*$/i,D=1,A=0,E="",F=!1,N=t.extend(t("<div/>")[0],{prop:0}),P=function(){var e=x.width,i=x.height,e=-1<e.toString().indexOf("%")?parseInt((t(window).width()-2*x.margin)*parseFloat(e)/100,10)+"px":"auto"==e?"auto":e+"px",i=-1<i.toString().indexOf("%")?parseInt((t(window).height()-2*x.margin)*parseFloat(i)/100,10)+"px":"auto"==i?"auto":i+"px";d.wrapInner('<div style="width:'+e+";height:"+i+";overflow: "+("auto"==x.scrolling?"auto":"yes"==x.scrolling?"scroll":"hidden")+';position:relative;"></div>'),x.width=d.width(),x.height=d.height(),_()},B=function(){x.width=j.width,x.height=j.height,t("<img />").attr({id:"fancybox-img",src:j.src,alt:x.title}).appendTo(d),_()},_=function(){var e,i;return c.hide(),s.is(":visible")&&!1===C.onCleanup(k,I,C)?(t.event.trigger("fancybox-cancel"),void(F=!1)):(F=!0,t(l.add(r)).off(),t(window).off("resize.fb scroll.fb"),t(document).off("keydown.fb"),s.is(":visible")&&"outside"!==C.titlePosition&&s.css("height",s.height()),k=v,I=m,(C=x).overlayShow?(r.css({"background-color":C.overlayColor,opacity:C.overlayOpacity,cursor:C.hideOnOverlayClick?"pointer":"auto",height:t(document).height()}),r.is(":visible")||r.show()):r.hide(),w=K(),L(),s.is(":visible")?(t(f.add(g).add(y)).hide(),e=s.position(),u={top:e.top,left:e.left,width:s.width(),height:s.height()},i=u.width==w.width&&u.height==w.height,void l.fadeTo(C.changeFade,.3,function(){function e(){l.html(d.contents()).fadeTo(C.changeFade,1,M)}t.event.trigger("fancybox-change"),l.empty().removeAttr("filter").css({"border-width":C.padding,width:w.width-2*C.padding,height:x.autoDimensions?"auto":w.height-A-2*C.padding}),i?e():(N.prop=0,t(N).animate({prop:1},{duration:C.changeSpeed,easing:C.easingChange,step:H,complete:e}))})):(s.removeAttr("style"),l.css("border-width",C.padding),"elastic"==C.transitionIn?(u=Q(),l.html(d.contents()),s.show(),C.opacity&&(w.opacity=0),N.prop=0,void t(N).animate({prop:1},{duration:C.speedIn,easing:C.easingIn,step:H,complete:M})):("inside"==C.titlePosition&&0<A&&p.show(),l.css({width:w.width-2*C.padding,height:x.autoDimensions?"auto":w.height-A-2*C.padding}).html(d.contents()),void s.css(w).fadeIn("none"==C.transitionIn?0:C.speedIn,M))))},L=function(){if(E=C.title||"",A=0,p.empty().removeAttr("style").removeClass(),!1!==C.titleShow){var t;if((E="function"==typeof C.titleFormat?C.titleFormat(E,k,I,C):!(!(t=E)||!t.length)&&("float"==C.titlePosition?'<table id="fancybox-title-float-wrap" cellpadding="0" cellspacing="0"><tr><td id="fancybox-title-float-left"></td><td id="fancybox-title-float-main">'+t+'</td><td id="fancybox-title-float-right"></td></tr></table>':'<div id="fancybox-title-'+C.titlePosition+'">'+t+"</div>"))&&""!==E){switch(p.addClass("fancybox-title-"+C.titlePosition).html(E).appendTo("body").show(),C.titlePosition){case"inside":p.css({width:w.width-2*C.padding,marginLeft:C.padding,marginRight:C.padding}),A=p.outerHeight(!0),p.appendTo(h),w.height+=A;break;case"over":p.css({marginLeft:C.padding,width:w.width-2*C.padding,bottom:C.padding}).appendTo(h);break;case"float":p.css("left",-1*parseInt((p.width()-w.width-40)/2,10)).appendTo(s);break;default:p.css({width:w.width-2*C.padding,paddingLeft:C.padding,paddingRight:C.padding}).appendTo(s)}p.hide()}else p.hide()}else p.hide()},M=function(){t.support.opacity||(l.get(0).style.removeProperty("filter"),s.get(0).style.removeProperty("filter")),x.autoDimensions&&l.css("height","auto"),s.css("height","auto"),E&&E.length&&p.show(),C.showCloseButton&&f.show(),function(){if((C.enableEscapeButton||C.enableKeyboardNav)&&t(document).on("keydown.fb",function(e){27==e.keyCode&&C.enableEscapeButton?(e.preventDefault(),t.fancybox.close()):37!=e.keyCode&&39!=e.keyCode||!C.enableKeyboardNav||"INPUT"===e.target.tagName||"TEXTAREA"===e.target.tagName||"SELECT"===e.target.tagName||(e.preventDefault(),t.fancybox[37==e.keyCode?"prev":"next"]())}),!C.showNavArrows)return g.hide(),y.hide();(C.cyclic&&1<k.length||0!==I)&&g.show(),(C.cyclic&&1<k.length||I!=k.length-1)&&y.show()}(),C.hideOnContentClick&&l.on("click",t.fancybox.close),C.hideOnOverlayClick&&r.on("click",t.fancybox.close),t(window).on("resize.fb",t.fancybox.resize),C.centerOnScroll&&t(window).on("scroll.fb",t.fancybox.center),"iframe"==C.type&&t('<iframe id="fancybox-frame" name="fancybox-frame'+(new Date).getTime()+'" frameborder="0" hspace="0" scrolling="'+x.scrolling+'" src="'+C.href+'"></iframe>').appendTo(l),s.show(),F=!1,t.fancybox.center(),C.onComplete(k,I,C),z()},z=function(){var t;k.length-1>I&&void 0!==(t=k[I+1].href)&&t.match(S)&&((new Image).src=t),0<I&&void 0!==(t=k[I-1].href)&&t.match(S)&&((new Image).src=t)},H=function(t){var e={width:parseInt(u.width+(w.width-u.width)*t,10),height:parseInt(u.height+(w.height-u.height)*t,10),top:parseInt(u.top+(w.top-u.top)*t,10),left:parseInt(u.left+(w.left-u.left)*t,10)};void 0!==w.opacity&&(e.opacity=t<.5?.5:t),s.css(e),l.css({width:e.width-2*C.padding,height:e.height-A*t-2*C.padding})},K=function(){var t,e=a(),i={},n=C.autoScale,o=2*C.padding;return-1<C.width.toString().indexOf("%")?i.width=parseInt(e[0]*parseFloat(C.width)/100,10):i.width=C.width+o,-1<C.height.toString().indexOf("%")?i.height=parseInt(e[1]*parseFloat(C.height)/100,10):i.height=C.height+o,n&&(i.width>e[0]||i.height>e[1])&&("image"==x.type||"swf"==x.type?(t=C.width/C.height,i.width>e[0]&&(i.width=e[0],i.height=parseInt((i.width-o)/t+o,10)),i.height>e[1]&&(i.height=e[1],i.width=parseInt((i.height-o)*t+o,10))):(i.width=Math.min(i.width,e[0]),i.height=Math.min(i.height,e[1]))),i.top=parseInt(Math.max(e[3]-20,e[3]+.5*(e[1]-i.height-40)),10),i.left=parseInt(Math.max(e[2]-20,e[2]+.5*(e[0]-i.width-40)),10),i},Q=function(){var e,i,n,o=!!x.orig&&t(x.orig);return o&&o.length?((n=(i=o).offset()).top+=parseInt(i.css("paddingTop"),10)||0,n.left+=parseInt(i.css("paddingLeft"),10)||0,n.top+=parseInt(i.css("border-top-width"),10)||0,n.left+=parseInt(i.css("border-left-width"),10)||0,n.width=i.width(),n.height=i.height(),{width:n.width+2*C.padding,height:n.height+2*C.padding,top:n.top-C.padding-20,left:n.left-C.padding-20}):(e=a(),{width:2*C.padding,height:2*C.padding,top:parseInt(e[3]+.5*e[1],10),left:parseInt(e[2]+.5*e[0],10)})};t.fn.fancybox=function(e){return t(this).length&&t(this).data("fancybox",t.extend({},e,t.metadata?t(this).metadata():{})).off("click.fb").on("click.fb",function(e){var i;e.preventDefault(),F||(F=!0,t(this).trigger("blur"),v=[],m=0,(i=t(this).attr("rel")||"")&&""!=i&&"nofollow"!==i?(v=t("a[rel="+i+"], area[rel="+i+"]"),m=v.index(this)):v.push(this),n())}),this},t.fancybox=function(e){var i;if(!F){if(F=!0,i=void 0!==arguments[1]?arguments[1]:{},v=[],m=parseInt(i.index,10)||0,Array.isArray(e)){for(var a=0,o=e.length;a<o;a++)"object"==_typeof(e[a])?t(e[a]).data("fancybox",t.extend({},i,e[a])):e[a]=t({}).data("fancybox",t.extend({content:e[a]},i));v=jQuery.merge(v,e)}else"object"==_typeof(e)?t(e).data("fancybox",t.extend({},i,e)):e=t({}).data("fancybox",t.extend({content:e},i)),v.push(e);(m>v.length||m<0)&&(m=0),n()}},t.fancybox.showActivity=function(){clearInterval(b),c.show(),b=setInterval(o,66)},t.fancybox.hideActivity=function(){c.hide()},t.fancybox.next=function(){return t.fancybox.pos(I+1)},t.fancybox.prev=function(){return t.fancybox.pos(I-1)},t.fancybox.pos=function(t){F||(t=parseInt(t),v=k,-1<t&&t<k.length?(m=t,n()):C.cyclic&&1<k.length&&(m=t>=k.length?0:k.length-1,n()))},t.fancybox.cancel=function(){F||(F=!0,t.event.trigger("fancybox-cancel"),e(),x.onCancel(v,m,x),F=!1)},t.fancybox.close=function(){function i(){r.fadeOut("fast"),p.empty().hide(),s.hide(),t.event.trigger("fancybox-cleanup"),l.empty(),C.onClosed(k,I,C),k=x=[],I=m=0,C=x={},F=!1}var n;F||s.is(":hidden")||(F=!0,C&&!1===C.onCleanup(k,I,C)?F=!1:(e(),t(f.add(g).add(y)).hide(),t(l.add(r)).off(),t(window).off("resize.fb scroll.fb"),t(document).off("keydown.fb"),l.find("iframe").attr("src","about:blank"),"inside"!==C.titlePosition&&p.empty(),s.stop(),"elastic"==C.transitionOut?(u=Q(),n=s.position(),w={top:n.top,left:n.left,width:s.width(),height:s.height()},C.opacity&&(w.opacity=1),p.empty().hide(),N.prop=1,t(N).animate({prop:0},{duration:C.speedOut,easing:C.easingOut,step:H,complete:i})):s.fadeOut("none"==C.transitionOut?0:C.speedOut,i)))},t.fancybox.resize=function(){r.is(":visible")&&r.css("height",t(document).height()),t.fancybox.center(!0)},t.fancybox.center=function(){var t,e;F||(e=!0===arguments[0]?1:0,t=a(),!e&&(s.width()>t[0]||s.height()>t[1])||s.stop().animate({top:parseInt(Math.max(t[3]-20,t[3]+.5*(t[1]-l.height()-40)-C.padding)),left:parseInt(Math.max(t[2]-20,t[2]+.5*(t[0]-l.width()-40)-C.padding))},"number"==typeof arguments[0]?arguments[0]:200))},t.fancybox.init=function(){t("#fancybox-wrap").length||(t("body").append(d=t('<div id="fancybox-tmp"></div>'),c=t('<div id="fancybox-loading"><div></div></div>'),r=t('<div id="fancybox-overlay"></div>'),s=t('<div id="fancybox-wrap"></div>')),(h=t('<div id="fancybox-outer"></div>').append('<div class="fancybox-bg" id="fancybox-bg-n"></div><div class="fancybox-bg" id="fancybox-bg-ne"></div><div class="fancybox-bg" id="fancybox-bg-e"></div><div class="fancybox-bg" id="fancybox-bg-se"></div><div class="fancybox-bg" id="fancybox-bg-s"></div><div class="fancybox-bg" id="fancybox-bg-sw"></div><div class="fancybox-bg" id="fancybox-bg-w"></div><div class="fancybox-bg" id="fancybox-bg-nw"></div>').appendTo(s)).append(l=t('<div id="fancybox-content"></div>'),f=t('<a id="fancybox-close"></a>'),p=t('<div id="fancybox-title"></div>'),g=t('<a href="javascript:;" id="fancybox-left"><span class="fancy-ico" id="fancybox-left-ico"></span></a>'),y=t('<a href="javascript:;" id="fancybox-right"><span class="fancy-ico" id="fancybox-right-ico"></span></a>')),f.on("click",t.fancybox.close),c.on("click",t.fancybox.cancel),g.on("click",function(e){e.preventDefault(),t.fancybox.prev()}),y.on("click",function(e){e.preventDefault(),t.fancybox.next()}),t.fn.mousewheel&&s.on("mousewheel.fb",function(e,i){F?e.preventDefault():0!=t(e.target).get(0).clientHeight&&t(e.target).get(0).scrollHeight!==t(e.target).get(0).clientHeight||(e.preventDefault(),t.fancybox[0<i?"prev":"next"]())}),t.support.opacity||s.addClass("fancybox-ie"))},t.fn.fancybox.defaults={padding:10,margin:40,opacity:!1,modal:!1,cyclic:!1,scrolling:"auto",width:560,height:340,autoScale:!0,autoDimensions:!0,centerOnScroll:!1,ajax:{},swf:{wmode:"transparent"},hideOnOverlayClick:!0,hideOnContentClick:!1,overlayShow:!0,overlayOpacity:.7,overlayColor:"#777",titleShow:!0,titlePosition:"float",titleFormat:null,titleFromAlt:!1,transitionIn:"fade",transitionOut:"fade",speedIn:300,speedOut:300,changeSpeed:300,changeFade:"fast",easingIn:"swing",easingOut:"swing",showCloseButton:!0,showNavArrows:!0,enableEscapeButton:!0,enableKeyboardNav:!0,onStart:function(){},onCancel:function(){},onComplete:function(){},onCleanup:function(){},onClosed:function(){},onError:function(){}},jQuery(function(t){t.fancybox.init()})}(jQuery);
products/photocrati_nextgen/modules/lightbox/static/fancybox/nextgen_fancybox_init.js CHANGED
@@ -1,14 +1,27 @@
1
  jQuery(function($) {
2
  var nextgen_fancybox_init = function() {
3
- var selector = nextgen_lightbox_filter_selector($, $(".ngg-fancybox"));
4
-
5
- selector.fancybox({
6
- titlePosition: 'inside',
7
- // Needed for twenty eleven
8
- onComplete: function() {
9
- $('#fancybox-wrap').css('z-index', 10000);
10
- }
11
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  };
13
  $(window).on('refreshed', nextgen_fancybox_init);
14
  nextgen_fancybox_init();
1
  jQuery(function($) {
2
  var nextgen_fancybox_init = function() {
3
+ var selector = nextgen_lightbox_filter_selector($, $(".ngg-fancybox"));
4
+
5
+ window.addEventListener(
6
+ "click",
7
+ e => {
8
+ let $target = $(e.target);
9
+ if ($target.is(selector) || $target.parents('a').is(selector)) {
10
+ e.preventDefault();
11
+ $(selector).fancybox({
12
+ titlePosition: 'inside',
13
+ // Needed for twenty eleven
14
+ onComplete: function() {
15
+ $('#fancybox-wrap').css('z-index', 10000);
16
+ }
17
+ })
18
+ $target.trigger('click.fb');
19
+
20
+ e.stopPropagation();
21
+ }
22
+ },
23
+ true
24
+ )
25
  };
26
  $(window).on('refreshed', nextgen_fancybox_init);
27
  nextgen_fancybox_init();
products/photocrati_nextgen/modules/lightbox/static/fancybox/nextgen_fancybox_init.min.js CHANGED
@@ -1 +1 @@
1
- "use strict";jQuery(function(n){var e=function(){nextgen_lightbox_filter_selector(n,n(".ngg-fancybox")).fancybox({titlePosition:"inside",onComplete:function(){n("#fancybox-wrap").css("z-index",1e4)}})};n(window).on("refreshed",e),e()});
1
+ "use strict";jQuery(function(n){var e=function(){var e=nextgen_lightbox_filter_selector(n,n(".ngg-fancybox"));window.addEventListener("click",function(t){var i=n(t.target);(i.is(e)||i.parents("a").is(e))&&(t.preventDefault(),n(e).fancybox({titlePosition:"inside",onComplete:function(){n("#fancybox-wrap").css("z-index",1e4)}}),i.trigger("click.fb"),t.stopPropagation())},!0)};n(window).on("refreshed",e),e()});
products/photocrati_nextgen/modules/marketing/module.marketing.php CHANGED
@@ -28,7 +28,10 @@ class M_Marketing extends C_Base_Module
28
 
29
  public static function is_plus_or_pro_enabled()
30
  {
31
- return defined('NGG_PRO_PLUGIN_BASENAME') || defined('NGG_PLUS_PLUGIN_BASENAME') || is_multisite();
 
 
 
32
  }
33
 
34
  /**
28
 
29
  public static function is_plus_or_pro_enabled()
30
  {
31
+ return defined('NGG_PRO_PLUGIN_BASENAME')
32
+ || defined('NGG_PLUS_PLUGIN_BASENAME')
33
+ || defined('NGG_STARTER_PLUGIN_BASENAME')
34
+ || is_multisite();
35
  }
36
 
37
  /**
products/photocrati_nextgen/modules/nextgen_addgallery_page/module.nextgen_addgallery_page.php CHANGED
@@ -6,6 +6,8 @@
6
  **/
7
 
8
  define('NGG_ADD_GALLERY_SLUG', 'ngg_addgallery');
 
 
9
 
10
  class M_NextGen_AddGallery_Page extends C_Base_Module
11
  {
@@ -22,7 +24,7 @@ class M_NextGen_AddGallery_Page extends C_Base_Module
22
  'photocrati-nextgen_addgallery_page',
23
  'NextGEN Add Gallery Page',
24
  'Provides admin page for adding a gallery and uploading images',
25
- '3.3.21',
26
  'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/',
27
  'Imagely',
28
  'https://www.imagely.com'
6
  **/
7
 
8
  define('NGG_ADD_GALLERY_SLUG', 'ngg_addgallery');
9
+ if (!defined('NGG_UPLOAD_LIMIT')) define('NGG_UPLOAD_LIMIT', 6);
10
+ if (!defined('NGG_UPLOAD_TIMEOUT')) define('NGG_UPLOAD_TIMEOUT', 40);
11
 
12
  class M_NextGen_AddGallery_Page extends C_Base_Module
13
  {
24
  'photocrati-nextgen_addgallery_page',
25
  'NextGEN Add Gallery Page',
26
  'Provides admin page for adding a gallery and uploading images',
27
+ '3.5.0.4',
28
  'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/',
29
  'Imagely',
30
  'https://www.imagely.com'
products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php CHANGED
@@ -400,6 +400,17 @@ class A_Upload_Images_Form extends Mixin
400
  {
401
  return __("Upload Images", 'nggallery');
402
  }
 
 
 
 
 
 
 
 
 
 
 
403
  function enqueue_static_resources()
404
  {
405
  wp_enqueue_script('uppy');
@@ -408,6 +419,32 @@ class A_Upload_Images_Form extends Mixin
408
  wp_enqueue_script('toastify');
409
  wp_enqueue_style('toastify');
410
  wp_localize_script('uppy', 'NggUploadImages_i18n', $this->object->get_i18n_strings());
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
411
  }
412
  function get_uppy_locale()
413
  {
@@ -418,13 +455,18 @@ class A_Upload_Images_Form extends Mixin
418
  }
419
  return $locale;
420
  }
 
 
 
 
 
421
  function get_i18n_strings()
422
  {
423
- return ['locale' => $this->object->get_uppy_locale(), 'no_image_uploaded' => __('No images were uploaded successfully.', 'nggallery'), 'one_image_uploaded' => __('1 image was uploaded successfully.', 'nggallery'), 'x_images_uploaded' => __('{count} images were uploaded successfully.', 'nggallery'), 'manage_gallery' => __('Manage gallery > {name}', 'nggallery')];
424
  }
425
  function render()
426
  {
427
- return $this->object->render_partial('photocrati-nextgen_addgallery_page#upload_images', ['galleries' => $this->object->get_galleries(), 'nonce' => M_Security::create_nonce('nextgen_upload_image'), 'max_size' => wp_max_upload_size()], TRUE);
428
  }
429
  function get_galleries()
430
  {
400
  {
401
  return __("Upload Images", 'nggallery');
402
  }
403
+ /**
404
+ * Pass PHP object or array to JS, preserving numeric and boolean value
405
+ * @param string $handle
406
+ * @param string $name
407
+ * @param object|array $data
408
+ */
409
+ function pass_data_to_js($handle, $var_name, $data)
410
+ {
411
+ $var_name = esc_js($var_name);
412
+ return wp_add_inline_script($handle, "let {$var_name} = " . json_encode($data, JSON_NUMERIC_CHECK));
413
+ }
414
  function enqueue_static_resources()
415
  {
416
  wp_enqueue_script('uppy');
419
  wp_enqueue_script('toastify');
420
  wp_enqueue_style('toastify');
421
  wp_localize_script('uppy', 'NggUploadImages_i18n', $this->object->get_i18n_strings());
422
+ $this->pass_data_to_js('uppy', 'NggUppyCoreSettings', $this->object->get_uppy_core_settings());
423
+ $this->pass_data_to_js('uppy', 'NggUppyDashboardSettings', $this->object->get_uppy_dashboard_settings());
424
+ $this->pass_data_to_js('uppy', 'NggXHRSettings', $this->object->get_uppy_xhr_settings());
425
+ }
426
+ function get_allowed_image_mime_types()
427
+ {
428
+ return ['image/gif', 'image/jpg', 'image/jpeg', 'image/pjpeg', 'image/png'];
429
+ }
430
+ function get_uppy_note()
431
+ {
432
+ $core_settings = $this->object->get_uppy_core_settings();
433
+ $max_size = $core_settings['restrictions']['maxfileSize'];
434
+ $max_size_megabytes = round((int) $max_size / (1024 * 1024));
435
+ return sprintf(__('You may select files up to %dMB', 'nggallery'), $max_size_megabytes);
436
+ }
437
+ function get_uppy_xhr_settings()
438
+ {
439
+ return apply_filters('ngg_uppy_xhr_settings', ['timeout' => intval(NGG_UPLOAD_TIMEOUT) * 1000, 'limit' => intval(NGG_UPLOAD_LIMIT), 'fieldName' => 'file']);
440
+ }
441
+ function get_uppy_core_settings()
442
+ {
443
+ return apply_filters('ngg_uppy_core_settings', ['locale' => $this->object->get_uppy_locale(), 'restrictions' => ['maxfileSize' => wp_max_upload_size(), 'allowedFileTypes' => $this->can_upload_zips() ? array_merge($this->object->get_allowed_image_mime_types(), ['.zip']) : get_allowed_mime_types()]]);
444
+ }
445
+ function get_uppy_dashboard_settings()
446
+ {
447
+ return apply_filters('ngg_uppy_dashboard_settings', ['inline' => true, 'target' => '#uploader', 'width' => '100%', 'proudlyDisplayPoweredByUppy' => false, 'hideRetryButton' => true, 'note' => $this->object->get_uppy_note(), 'locale' => ['strings' => ['dropPaste' => $this->can_upload_zips() ? __('Drag image and ZIP files here or %{browse}', 'nggallery') : __('Drag image files here or %{browse}', 'nggallery')]]]);
448
  }
449
  function get_uppy_locale()
450
  {
455
  }
456
  return $locale;
457
  }
458
+ function can_upload_zips()
459
+ {
460
+ $global_settings = C_NextGen_Global_Settings::get_instance();
461
+ return !is_multisite() || is_multisite() && $global_settings->get('wpmuZipUpload');
462
+ }
463
  function get_i18n_strings()
464
  {
465
+ return ['locale' => $this->object->get_uppy_locale(), 'no_image_uploaded' => __('No images were uploaded successfully.', 'nggallery'), 'one_image_uploaded' => __('1 image was uploaded successfully.', 'nggallery'), 'x_images_uploaded' => __('{count} images were uploaded successfully.', 'nggallery'), 'manage_gallery' => __('Manage gallery > {name}', 'nggallery'), 'image_failed' => __('Image {filename} failed to upload: {error}', 'nggallery'), 'drag_files_here' => $this->can_upload_zips() ? __('Drag image and ZIP files here or %{browse}', 'nggallery') : __('Drag image files here or %{browse}', 'nggallery')];
466
  }
467
  function render()
468
  {
469
+ return $this->object->render_partial('photocrati-nextgen_addgallery_page#upload_images', ['galleries' => $this->object->get_galleries(), 'nonce' => M_Security::create_nonce('nextgen_upload_image')], TRUE);
470
  }
471
  function get_galleries()
472
  {
products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php CHANGED
@@ -45,22 +45,6 @@
45
 
46
  <div id="uploader"></div>
47
 
48
- <?php
49
- $global_settings = C_NextGen_Global_Settings::get_instance();
50
- $display_zips = (!is_multisite() || (is_multisite() && $global_settings->get('wpmuZipUpload')));
51
- if ($display_zips)
52
- $message = __('Drag image and ZIP files here or %{browse}', 'nggallery');
53
- else
54
- $message = __('Drag image files here or %{browse}', 'nggallery');
55
-
56
- $allowed_file_types = ['image/gif', 'image/jpg', 'image/jpeg', 'image/pjpeg', 'image/png'];
57
- if ($display_zips)
58
- $allowed_file_types[] = '.zip';
59
-
60
- $max_size_megabytes = round((int)$max_size / (1024 * 1024));
61
- $max_size_message = sprintf(__('You may select files up to %dMB', 'nggallery'), $max_size_megabytes);
62
- ?>
63
-
64
  <script type="text/javascript">
65
 
66
  window.urlencode = function(str) {
@@ -119,114 +103,123 @@ $max_size_message = sprintf(__('You may select files up to %dMB', 'nggallery'),
119
  const gallery_select = document.getElementById('gallery_id');
120
  const gallery_name = document.getElementById('gallery_name');
121
  const gallery_create = document.getElementById('gallery_create');
122
-
123
- const uppy = Uppy.Core({
124
- locale: Uppy.locales[NggUploadImages_i18n.locale],
125
- restrictions: {
126
- maxFileSize: <?php print esc_attr($max_size); ?>,
127
- allowedFileTypes: <?php print json_encode($allowed_file_types); ?>
128
- },
129
  onBeforeUpload: (files) => {
130
  gallery_select.disabled = true;
131
  gallery_name.disabled = true;
132
  gallery_create.disabled = true;
133
  return true;
134
  }
135
- }).use(Uppy.Dashboard, {
136
- inline: true,
137
- target: '#uploader',
138
- width: '100%',
139
- proudlyDisplayPoweredByUppy: false,
140
- hideRetryButton: true,
141
- note: "<?php print esc_attr($max_size_message); ?>",
142
- locale: {
143
- strings: {
144
- dropPaste: "<?php print esc_attr($message); ?>"
145
- }
146
- }
147
- }).use(Uppy.XHRUpload, {
148
  endpoint: set_ngg_upload_url(0, ''),
149
- fieldName: 'file',
150
- limit: 6,
151
  getResponseError: (text, response) => {
152
  if ('string' === typeof text) {
153
  text = JSON.parse(text);
154
  }
155
  return text.error;
156
  }
157
- }).on('file-added', (file) => {
158
- // If this is run right away the upload button won't yet exist and can't be found to disable it
159
- setTimeout(() => {
160
- adjust_upload_button();
161
- }, 250);
162
- }).on('file-removed', (file, reason) => {
163
- if (reason === 'removed-by-user') {
164
- adjust_upload_button();
165
- }
166
- }).on('complete', (result) => {
167
- // There was at least one error: remove the successful images so users can find out what went wrong
168
- if (result.failed.length > 0) {
169
- uppy.getFiles().forEach((file) => {
170
- if ('undefined' === typeof file.error) {
171
- uppy.removeFile(file.id);
172
  }
173
- });
174
- } else {
175
- // All uploads were a success; clear the board and reset the game
176
- setTimeout(() => {
177
- uppy.reset();
178
- }, 2000);
179
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
180
 
181
- const gallery_url = '<?php echo admin_url("/admin.php?page=nggallery-manage-gallery&mode=edit&gid=")?>' + gallery_select.value;
182
- const chosen_name = String(gallery_select.selectedOptions[0].dataset.originalValue);
183
 
184
- let upload_count = result.successful.length;
 
 
 
 
 
 
 
 
185
 
186
- // Adjust the upload count for images uploaded inside a zip file
187
- result.successful.forEach(function(uploaded_file) {
188
- if ('zip' === uploaded_file.extension) {
189
- upload_count = upload_count - 1;
190
- upload_count = upload_count + uploaded_file.response.body.image_ids.length;
 
191
  }
192
- });
193
 
194
- /** @var NggUploadImages_i18n object */
195
- let message = NggUploadImages_i18n.x_images_uploaded;
196
- if (upload_count === 0) {
197
- message = NggUploadImages_i18n.no_image_uploaded;
198
- } else if (upload_count === 1) {
199
- message = NggUploadImages_i18n.one_image_uploaded;
200
- }
201
 
202
- message = message + ' ' + NggUploadImages_i18n.manage_gallery;
203
- message = message.replace('{count}', String(upload_count))
204
- .replace('{name}', chosen_name);
205
-
206
- Toastify({
207
- text: message,
208
- duration: 180000,
209
- destination: gallery_url,
210
- newWindow: true,
211
- close: true,
212
- gravity: 'bottom',
213
- position: 'right',
214
- backgroundColor: 'black',
215
- stopOnFocus: true,
216
- onClick: function() {
217
  }
218
- }).showToast();
219
 
220
- gallery_select.value = 0;
221
- gallery_name.value = '';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
222
 
223
- gallery_name.disabled = false;
224
- gallery_select.disabled = false;
225
- gallery_create.disabled = true;
226
 
227
- gallery_name.classList.remove('hidden');
228
- gallery_create.classList.remove('hidden');
229
- });
 
 
 
 
 
230
 
231
  // This is used by the NextGEN wizard to determine when the uploads process is complete
232
  window.ngg_uppy = uppy;
45
 
46
  <div id="uploader"></div>
47
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  <script type="text/javascript">
49
 
50
  window.urlencode = function(str) {
103
  const gallery_select = document.getElementById('gallery_id');
104
  const gallery_name = document.getElementById('gallery_name');
105
  const gallery_create = document.getElementById('gallery_create');
106
+ const uppyCoreSettings = {
107
+ ...NggUppyDashboardSettings,
 
 
 
 
 
108
  onBeforeUpload: (files) => {
109
  gallery_select.disabled = true;
110
  gallery_name.disabled = true;
111
  gallery_create.disabled = true;
112
  return true;
113
  }
114
+ }
115
+ const uppyXHRSettings = {
116
+ ...NggXHRSettings,
 
 
 
 
 
 
 
 
 
 
117
  endpoint: set_ngg_upload_url(0, ''),
 
 
118
  getResponseError: (text, response) => {
119
  if ('string' === typeof text) {
120
  text = JSON.parse(text);
121
  }
122
  return text.error;
123
  }
124
+ }
125
+
126
+ const uppy = Uppy.Core(uppyCoreSettings)
127
+ .use(Uppy.Dashboard, NggUppyDashboardSettings)
128
+ .use(Uppy.XHRUpload, uppyXHRSettings)
129
+ .on('file-added', (file) => {
130
+ // If this is run right away the upload button won't yet exist and can't be found to disable it
131
+ setTimeout(() => {
132
+ adjust_upload_button();
133
+ }, 250);
134
+ })
135
+ .on('file-removed', (file, reason) => {
136
+ if (reason === 'removed-by-user') {
137
+ adjust_upload_button();
 
138
  }
139
+ })
140
+ .on('error', (file, error, response) => {
141
+ if (console && console.log) {
142
+ console.log(file)
143
+ console.log(error)
144
+ console.log(response)
145
+ }
146
+ })
147
+ .on('complete', (result) => {
148
+ // There was at least one error: remove the successful images so users can find out what went wrong
149
+ if (result.failed.length > 0) {
150
+ uppy.getFiles().forEach((file) => {
151
+ if ('undefined' === typeof file.error) {
152
+ uppy.removeFile(file.id);
153
+ }
154
+ });
155
+ } else {
156
+ // All uploads were a success; clear the board and reset the game
157
+ setTimeout(() => {
158
+ uppy.reset();
159
+ }, 2000);
160
+ }
161
 
162
+ const gallery_url = '<?php echo admin_url("/admin.php?page=nggallery-manage-gallery&mode=edit&gid=")?>' + gallery_select.value;
163
+ const chosen_name = String(gallery_select.selectedOptions[0].dataset.originalValue);
164
 
165
+ let upload_count = result.successful.length;
166
+
167
+ // Adjust the upload count for images uploaded inside a zip file
168
+ result.successful.forEach(function(uploaded_file) {
169
+ if ('zip' === uploaded_file.extension) {
170
+ upload_count = upload_count - 1;
171
+ upload_count = upload_count + uploaded_file.response.body.image_ids.length;
172
+ }
173
+ });
174
 
175
+ /** @var NggUploadImages_i18n object */
176
+ let message = NggUploadImages_i18n.x_images_uploaded;
177
+ if (upload_count === 0) {
178
+ message = NggUploadImages_i18n.no_image_uploaded;
179
+ } else if (upload_count === 1) {
180
+ message = NggUploadImages_i18n.one_image_uploaded;
181
  }
 
182
 
183
+ if (upload_count >= 1) {
184
+ message = message + ' ' + NggUploadImages_i18n.manage_gallery;
185
+ }
 
 
 
 
186
 
187
+ if (result.failed.length > 0) {
188
+ uppy.getFiles().forEach((file) => {
189
+ message = message + "<br/>" + NggUploadImages_i18n.image_failed;
190
+ message = message.replace('{filename}', file.name)
191
+ .replace('{error}', file.error);
192
+ })
 
 
 
 
 
 
 
 
 
193
  }
 
194
 
195
+ message = message.replace('{count}', String(upload_count))
196
+ .replace('{name}', chosen_name);
197
+
198
+ Toastify({
199
+ text: message,
200
+ duration: 180000,
201
+ destination: (upload_count === 0) ? '' : gallery_url,
202
+ newWindow: (upload_count !== 0),
203
+ close: true,
204
+ gravity: 'bottom',
205
+ position: 'right',
206
+ backgroundColor: 'black',
207
+ stopOnFocus: true,
208
+ onClick: function() {
209
+ }
210
+ }).showToast();
211
 
212
+ gallery_select.value = 0;
213
+ gallery_name.value = '';
 
214
 
215
+ gallery_name.disabled = false;
216
+ gallery_select.disabled = false;
217
+ gallery_create.disabled = true;
218
+
219
+ gallery_name.classList.remove('hidden');
220
+ gallery_create.classList.remove('hidden');
221
+ });
222
+
223
 
224
  // This is used by the NextGEN wizard to determine when the uploads process is complete
225
  window.ngg_uppy = uppy;
products/photocrati_nextgen/modules/nextgen_admin/package.module.nextgen_admin.php CHANGED
@@ -329,7 +329,7 @@ class C_Admin_Notification_Manager
329
  if ($this->has_displayed_notice()) {
330
  $router = C_Router::get_instance();
331
  wp_enqueue_script('ngg_admin_notices', $router->get_static_url('photocrati-nextgen_admin#admin_notices.js'), array(), NGG_SCRIPT_VERSION, TRUE);
332
- wp_localize_script('ngg_admin_notices', 'ngg_dismiss_url', $this->_dismiss_url);
333
  }
334
  }
335
  function serve_ajax_request()
@@ -767,7 +767,7 @@ class Mixin_Form_Manager extends Mixin
767
  if (isset($this->object->_forms[$type])) {
768
  foreach ($form_names as $form) {
769
  if ($index = array_search($form, $this->object->_forms[$type])) {
770
- unsset($this->object->_forms[$type][$index]);
771
  }
772
  }
773
  $retval = $this->object->get_form_count($type);
329
  if ($this->has_displayed_notice()) {
330
  $router = C_Router::get_instance();
331
  wp_enqueue_script('ngg_admin_notices', $router->get_static_url('photocrati-nextgen_admin#admin_notices.js'), array(), NGG_SCRIPT_VERSION, TRUE);
332
+ wp_localize_script('ngg_admin_notices', 'ngg_dismiss_url', [$this->_dismiss_url]);
333
  }
334
  }
335
  function serve_ajax_request()
767
  if (isset($this->object->_forms[$type])) {
768
  foreach ($form_names as $form) {
769
  if ($index = array_search($form, $this->object->_forms[$type])) {
770
+ unset($this->object->_forms[$type][$index]);
771
  }
772
  }
773
  $retval = $this->object->get_form_count($type);
products/photocrati_nextgen/modules/nextgen_basic_gallery/package.module.nextgen_basic_gallery.php CHANGED
@@ -582,6 +582,21 @@ class A_NextGen_Basic_Thumbnails_Controller extends Mixin
582
  $output = $this->object->legacy_render($display_settings['template'], $params, $return, 'gallery');
583
  } else {
584
  $params = $display_settings;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
585
  $params['storage'] =& $storage;
586
  $params['images'] =& $images;
587
  $params['displayed_gallery_id'] = $gallery_id;
582
  $output = $this->object->legacy_render($display_settings['template'], $params, $return, 'gallery');
583
  } else {
584
  $params = $display_settings;
585
+ // Additional values for the carousel display view
586
+ if (!empty($this->param('pid'))) {
587
+ foreach ($images as $image) {
588
+ if ($image->image_slug === $this->param('pid')) {
589
+ $params['current_image'] = $image;
590
+ }
591
+ }
592
+ if ($pagination_result) {
593
+ $params['pagination_prev'] = $pagination_result['prev'];
594
+ $params['pagination_next'] = $pagination_result['next'];
595
+ }
596
+ }
597
+ if (empty($params['current_image'])) {
598
+ $params['current_image'] = reset($images);
599
+ }
600
  $params['storage'] =& $storage;
601
  $params['images'] =& $images;
602
  $params['displayed_gallery_id'] = $gallery_id;
products/photocrati_nextgen/modules/nextgen_basic_gallery/static/thumbnails/nextgen_basic_thumbnails.css CHANGED
@@ -320,3 +320,25 @@ li.ngg-next a, li.ngg-prev a {
320
  border: none;
321
  text-decoration: none;
322
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
320
  border: none;
321
  text-decoration: none;
322
  }
323
+
324
+ /** Caption view */
325
+ .ngg-caption-view-wrapper {
326
+ display: flex;
327
+ justify-content: center;
328
+ flex-wrap: wrap;
329
+ }
330
+
331
+ /** Carousel view */
332
+ .ngg-basic-thumbnails-carousel {
333
+ display: flex;
334
+ justify-content: center;
335
+ }
336
+
337
+ .ngg-basic-thumbnails-carousel-list {
338
+ display: flex;
339
+ flex-wrap: wrap;
340
+ }
341
+
342
+ .ngg-galleryoverview.carousel-view .ngg-gallery-thumbnail img {
343
+ max-width: 80px !important;
344
+ }
products/photocrati_nextgen/modules/nextgen_basic_gallery/static/thumbnails/nextgen_basic_thumbnails.min.css CHANGED
@@ -1 +1 @@
1
- .ngg-galleryoverview{overflow:hidden;width:100%;clear:both;display:block!important}.ngg-galleryoverview .desc{margin:0 10px 10px 0;padding:5px}.ngg-gallery-thumbnail-box{float:left;max-width:100%!important}.ngg-template-caption .ngg-gallery-thumbnail-box{margin-right:0}.ngg-gallery-thumbnail{text-align:center;max-width:100%!important;background-color:#FFF;border:1px solid #A9A9A9;margin:5px}.ngg-template-caption .ngg-gallery-thumbnail{margin-right:0}.ngg-gallery-thumbnail a{display:block;margin:4px;border:none;box-shadow:none}.ngg-gallery-thumbnail img{display:block;margin:0;padding:0;position:relative;max-width:100%!important;height:auto}.ngg-gallery-thumbnail span{font-size:90%;padding-left:5px;display:block}.ngg-galleryoverview{margin-top:40px;margin-bottom:50px;-webkit-transition:width 1s,height 1s,background-color 1s,-webkit-transform 1s;transition:width 1s,height 1s,background-color 1s,transform 1s;min-height:100px}.ngg-gallery-thumbnail-box.ngg-1-columns{width:100%;float:left!important}.ngg-gallery-thumbnail-box.ngg-2-columns{width:50%;float:left!important}.ngg-gallery-thumbnail-box.ngg-3-columns{width:33.33333%;float:left!important}.ngg-gallery-thumbnail-box.ngg-4-columns{width:25%;float:left!important}.ngg-gallery-thumbnail-box.ngg-5-columns{width:20%;float:left!important}.ngg-gallery-thumbnail-box.ngg-6-columns{width:16.6666%;float:left!important}.ngg-gallery-thumbnail-box.ngg-7-columns{width:14.2857%;float:left!important}.ngg-gallery-thumbnail-box.ngg-8-columns{width:12.5%;float:left!important}.ngg-gallery-thumbnail-box.ngg-9-columns{width:11.1111%;float:left!important}.ngg-gallery-thumbnail-box.ngg-10-columns{width:10%;float:left!important}.ngg-gallery-thumbnail-box.ngg-11-columns{width:9.09%;float:left!important}.ngg-gallery-thumbnail-box.ngg-12-columns{width:8.3333%;float:left!important}.ngg-gallery-thumbnail-box.ngg-13-columns{width:7.692%;float:left!important}.ngg-gallery-thumbnail-box.ngg-14-columns{width:7.142%;float:left!important}.ngg-gallery-thumbnail-box.ngg-15-columns{width:6.6666%;float:left!important}@media (max-width:800px){.ngg-gallery-thumbnail-box.ngg-10-columns,.ngg-gallery-thumbnail-box.ngg-11-columns,.ngg-gallery-thumbnail-box.ngg-12-columns,.ngg-gallery-thumbnail-box.ngg-13-columns,.ngg-gallery-thumbnail-box.ngg-14-columns,.ngg-gallery-thumbnail-box.ngg-15-columns,.ngg-gallery-thumbnail-box.ngg-16-columns,.ngg-gallery-thumbnail-box.ngg-17-columns,.ngg-gallery-thumbnail-box.ngg-18-columns,.ngg-gallery-thumbnail-box.ngg-19-columns,.ngg-gallery-thumbnail-box.ngg-29-columns,.ngg-gallery-thumbnail-box.ngg-5-columns,.ngg-gallery-thumbnail-box.ngg-6-columns,.ngg-gallery-thumbnail-box.ngg-7-columns,.ngg-gallery-thumbnail-box.ngg-8-columns,.ngg-gallery-thumbnail-box.ngg-9-columns{width:25%}}@media (max-width:600px){.ngg-gallery-thumbnail-box.ngg-10-columns,.ngg-gallery-thumbnail-box.ngg-11-columns,.ngg-gallery-thumbnail-box.ngg-12-columns,.ngg-gallery-thumbnail-box.ngg-13-columns,.ngg-gallery-thumbnail-box.ngg-14-columns,.ngg-gallery-thumbnail-box.ngg-15-columns,.ngg-gallery-thumbnail-box.ngg-16-columns,.ngg-gallery-thumbnail-box.ngg-17-columns,.ngg-gallery-thumbnail-box.ngg-18-columns,.ngg-gallery-thumbnail-box.ngg-19-columns,.ngg-gallery-thumbnail-box.ngg-29-columns,.ngg-gallery-thumbnail-box.ngg-4-columns,.ngg-gallery-thumbnail-box.ngg-5-columns,.ngg-gallery-thumbnail-box.ngg-6-columns,.ngg-gallery-thumbnail-box.ngg-7-columns,.ngg-gallery-thumbnail-box.ngg-8-columns,.ngg-gallery-thumbnail-box.ngg-9-columns{width:33.33333%}}@media (max-width:400px){.ngg-gallery-thumbnail-box.ngg-10-columns,.ngg-gallery-thumbnail-box.ngg-11-columns,.ngg-gallery-thumbnail-box.ngg-12-columns,.ngg-gallery-thumbnail-box.ngg-13-columns,.ngg-gallery-thumbnail-box.ngg-14-columns,.ngg-gallery-thumbnail-box.ngg-15-columns,.ngg-gallery-thumbnail-box.ngg-16-columns,.ngg-gallery-thumbnail-box.ngg-17-columns,.ngg-gallery-thumbnail-box.ngg-18-columns,.ngg-gallery-thumbnail-box.ngg-19-columns,.ngg-gallery-thumbnail-box.ngg-29-columns,.ngg-gallery-thumbnail-box.ngg-3-columns,.ngg-gallery-thumbnail-box.ngg-4-columns,.ngg-gallery-thumbnail-box.ngg-5-columns,.ngg-gallery-thumbnail-box.ngg-6-columns,.ngg-gallery-thumbnail-box.ngg-7-columns,.ngg-gallery-thumbnail-box.ngg-8-columns,.ngg-gallery-thumbnail-box.ngg-9-columns{width:50%}}.ngg-galleryoverview.default-view{text-align:center;font-size:0!important;letter-spacing:0!important}.ngg-galleryoverview.default-view .ngg-gallery-thumbnail-box{display:inline-block;float:none;vertical-align:middle}.ngg-galleryoverview.default-view .ngg-gallery-thumbnail{background-color:transparent;border:none;margin:0;position:relative}.ngg-galleryoverview.default-view .ngg-gallery-thumbnail a{margin:2px;box-shadow:none}.ngg-galleryoverview.default-view .ngg-gallery-thumbnail img:hover{opacity:.8}.ngg-galleryoverview.default-view .ngg-gallery-thumbnail img{margin:0 auto;box-shadow:none;cursor:pointer}.ngg-galleryoverview.default-view .slideshowlink{margin:24px auto 0;text-align:center;text-transform:uppercase}.ngg-galleryoverview.default-view .slideshowlink a{font-size:13px;letter-spacing:.75px;cursor:pointer;text-decoration:none;box-shadow:none;border:none}.ngg-galleryoverview.default-view .slideshowlink a:hover{text-decoration:none!important;box-shadow:none!important;border:none!important}.ngg-galleryoverview ul li:before{content:''!important}.ngg-gallery-list{list-style-type:none;padding:0!important;text-indent:0!important}.ngg-galleryoverview div.pic img{width:100%;border:0;border-radius:0}.ngg-gallery-list li{float:left;margin:0 2px!important;overflow:hidden}.ngg-gallery-list li a{border:1px solid #CCC;display:block;padding:2px}.ngg-gallery-list li.selected a{-moz-background-inline-policy:continuous;-moz-background-origin:padding;background:#000}.ngg-gallery-list li img{height:40px;width:40px}li.ngg-next,li.ngg-prev{height:40px;width:40px;font-size:3.5em}li.ngg-next a,li.ngg-prev a{padding-top:10px;border:none;text-decoration:none}
1
+ .ngg-galleryoverview{overflow:hidden;width:100%;clear:both;display:block!important}.ngg-galleryoverview .desc{margin:0 10px 10px 0;padding:5px}.ngg-gallery-thumbnail-box{float:left;max-width:100%!important}.ngg-template-caption .ngg-gallery-thumbnail-box{margin-right:0}.ngg-gallery-thumbnail{text-align:center;max-width:100%!important;background-color:#FFF;border:1px solid #A9A9A9;margin:5px}.ngg-template-caption .ngg-gallery-thumbnail{margin-right:0}.ngg-gallery-thumbnail a{display:block;margin:4px;border:none;box-shadow:none}.ngg-gallery-thumbnail img{display:block;margin:0;padding:0;position:relative;max-width:100%!important;height:auto}.ngg-gallery-thumbnail span{font-size:90%;padding-left:5px;display:block}.ngg-galleryoverview{margin-top:40px;margin-bottom:50px;-webkit-transition:width 1s,height 1s,background-color 1s,-webkit-transform 1s;transition:width 1s,height 1s,background-color 1s,transform 1s;min-height:100px}.ngg-gallery-thumbnail-box.ngg-1-columns{width:100%;float:left!important}.ngg-gallery-thumbnail-box.ngg-2-columns{width:50%;float:left!important}.ngg-gallery-thumbnail-box.ngg-3-columns{width:33.33333%;float:left!important}.ngg-gallery-thumbnail-box.ngg-4-columns{width:25%;float:left!important}.ngg-gallery-thumbnail-box.ngg-5-columns{width:20%;float:left!important}.ngg-gallery-thumbnail-box.ngg-6-columns{width:16.6666%;float:left!important}.ngg-gallery-thumbnail-box.ngg-7-columns{width:14.2857%;float:left!important}.ngg-gallery-thumbnail-box.ngg-8-columns{width:12.5%;float:left!important}.ngg-gallery-thumbnail-box.ngg-9-columns{width:11.1111%;float:left!important}.ngg-gallery-thumbnail-box.ngg-10-columns{width:10%;float:left!important}.ngg-gallery-thumbnail-box.ngg-11-columns{width:9.09%;float:left!important}.ngg-gallery-thumbnail-box.ngg-12-columns{width:8.3333%;float:left!important}.ngg-gallery-thumbnail-box.ngg-13-columns{width:7.692%;float:left!important}.ngg-gallery-thumbnail-box.ngg-14-columns{width:7.142%;float:left!important}.ngg-gallery-thumbnail-box.ngg-15-columns{width:6.6666%;float:left!important}@media (max-width:800px){.ngg-gallery-thumbnail-box.ngg-10-columns,.ngg-gallery-thumbnail-box.ngg-11-columns,.ngg-gallery-thumbnail-box.ngg-12-columns,.ngg-gallery-thumbnail-box.ngg-13-columns,.ngg-gallery-thumbnail-box.ngg-14-columns,.ngg-gallery-thumbnail-box.ngg-15-columns,.ngg-gallery-thumbnail-box.ngg-16-columns,.ngg-gallery-thumbnail-box.ngg-17-columns,.ngg-gallery-thumbnail-box.ngg-18-columns,.ngg-gallery-thumbnail-box.ngg-19-columns,.ngg-gallery-thumbnail-box.ngg-29-columns,.ngg-gallery-thumbnail-box.ngg-5-columns,.ngg-gallery-thumbnail-box.ngg-6-columns,.ngg-gallery-thumbnail-box.ngg-7-columns,.ngg-gallery-thumbnail-box.ngg-8-columns,.ngg-gallery-thumbnail-box.ngg-9-columns{width:25%}}@media (max-width:600px){.ngg-gallery-thumbnail-box.ngg-10-columns,.ngg-gallery-thumbnail-box.ngg-11-columns,.ngg-gallery-thumbnail-box.ngg-12-columns,.ngg-gallery-thumbnail-box.ngg-13-columns,.ngg-gallery-thumbnail-box.ngg-14-columns,.ngg-gallery-thumbnail-box.ngg-15-columns,.ngg-gallery-thumbnail-box.ngg-16-columns,.ngg-gallery-thumbnail-box.ngg-17-columns,.ngg-gallery-thumbnail-box.ngg-18-columns,.ngg-gallery-thumbnail-box.ngg-19-columns,.ngg-gallery-thumbnail-box.ngg-29-columns,.ngg-gallery-thumbnail-box.ngg-4-columns,.ngg-gallery-thumbnail-box.ngg-5-columns,.ngg-gallery-thumbnail-box.ngg-6-columns,.ngg-gallery-thumbnail-box.ngg-7-columns,.ngg-gallery-thumbnail-box.ngg-8-columns,.ngg-gallery-thumbnail-box.ngg-9-columns{width:33.33333%}}@media (max-width:400px){.ngg-gallery-thumbnail-box.ngg-10-columns,.ngg-gallery-thumbnail-box.ngg-11-columns,.ngg-gallery-thumbnail-box.ngg-12-columns,.ngg-gallery-thumbnail-box.ngg-13-columns,.ngg-gallery-thumbnail-box.ngg-14-columns,.ngg-gallery-thumbnail-box.ngg-15-columns,.ngg-gallery-thumbnail-box.ngg-16-columns,.ngg-gallery-thumbnail-box.ngg-17-columns,.ngg-gallery-thumbnail-box.ngg-18-columns,.ngg-gallery-thumbnail-box.ngg-19-columns,.ngg-gallery-thumbnail-box.ngg-29-columns,.ngg-gallery-thumbnail-box.ngg-3-columns,.ngg-gallery-thumbnail-box.ngg-4-columns,.ngg-gallery-thumbnail-box.ngg-5-columns,.ngg-gallery-thumbnail-box.ngg-6-columns,.ngg-gallery-thumbnail-box.ngg-7-columns,.ngg-gallery-thumbnail-box.ngg-8-columns,.ngg-gallery-thumbnail-box.ngg-9-columns{width:50%}}.ngg-galleryoverview.default-view{text-align:center;font-size:0!important;letter-spacing:0!important}.ngg-galleryoverview.default-view .ngg-gallery-thumbnail-box{display:inline-block;float:none;vertical-align:middle}.ngg-galleryoverview.default-view .ngg-gallery-thumbnail{background-color:transparent;border:none;margin:0;position:relative}.ngg-galleryoverview.default-view .ngg-gallery-thumbnail a{margin:2px;box-shadow:none}.ngg-galleryoverview.default-view .ngg-gallery-thumbnail img:hover{opacity:.8}.ngg-galleryoverview.default-view .ngg-gallery-thumbnail img{margin:0 auto;box-shadow:none;cursor:pointer}.ngg-galleryoverview.default-view .slideshowlink{margin:24px auto 0;text-align:center;text-transform:uppercase}.ngg-galleryoverview.default-view .slideshowlink a{font-size:13px;letter-spacing:.75px;cursor:pointer;text-decoration:none;box-shadow:none;border:none}.ngg-galleryoverview.default-view .slideshowlink a:hover{text-decoration:none!important;box-shadow:none!important;border:none!important}.ngg-galleryoverview ul li:before{content:''!important}.ngg-gallery-list{list-style-type:none;padding:0!important;text-indent:0!important}.ngg-galleryoverview div.pic img{width:100%;border:0;border-radius:0}.ngg-gallery-list li{float:left;margin:0 2px!important;overflow:hidden}.ngg-gallery-list li a{border:1px solid #CCC;display:block;padding:2px}.ngg-gallery-list li.selected a{-moz-background-inline-policy:continuous;-moz-background-origin:padding;background:#000}.ngg-gallery-list li img{height:40px;width:40px}li.ngg-next,li.ngg-prev{height:40px;width:40px;font-size:3.5em}li.ngg-next a,li.ngg-prev a{padding-top:10px;border:none;text-decoration:none}.ngg-caption-view-wrapper{display:flex;justify-content:center;flex-wrap:wrap}.ngg-basic-thumbnails-carousel{display:flex;justify-content:center}.ngg-basic-thumbnails-carousel-list{display:flex;flex-wrap:wrap}.ngg-galleryoverview.carousel-view .ngg-gallery-thumbnail img{max-width:80px!important}
products/photocrati_nextgen/modules/nextgen_basic_gallery/templates/thumbnails/caption-view.php ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php $this->start_element('nextgen_gallery.gallery_container', 'container', $displayed_gallery); ?>
2
+
3
+ <div class="ngg-galleryoverview caption-view <?php if (!intval($ajax_pagination)) echo ' ngg-ajax-pagination-none'; ?>"
4
+ id="ngg-gallery-<?php echo esc_attr($displayed_gallery_id)?>-<?php echo esc_attr($current_page)?>">
5
+
6
+ <div class="ngg-caption-view-wrapper">
7
+ <?php $this->start_element('nextgen_gallery.image_list_container', 'container', $images); ?>
8
+ <?php
9
+ for ($i = 0; $i<count($images); $i++) {
10
+ $image = $images[$i];
11
+ $thumb_size = $storage->get_image_dimensions($image, $thumbnail_size_name);
12
+ $style = isset($image->style) ? $image->style : null;
13
+ $column_class = 'ngg-' . $number_of_columns . '-columns';
14
+
15
+ if (isset($image->hidden) && $image->hidden) {
16
+ $style = 'style="display: none;"';
17
+ } else {
18
+ $style = null;
19
+ }
20
+
21
+ $this->start_element('nextgen_gallery.image_panel', 'item', $image);
22
+ ?>
23
+ <div id="<?php echo esc_attr('ngg-image-' . $i) ?>" class="ngg-gallery-thumbnail-box <?php if ($number_of_columns > 0 && empty($show_all_in_lightbox)) { echo $column_class; } ?>" <?php if ($style) echo $style; ?>>
24
+ <?php $this->start_element('nextgen_gallery.image', 'item', $image); ?>
25
+ <div class="ngg-gallery-thumbnail">
26
+ <a href="<?php echo esc_attr($storage->get_image_url($image, 'full', TRUE))?>"
27
+ title="<?php echo esc_attr($image->description)?>"
28
+ data-src="<?php echo esc_attr($storage->get_image_url($image)); ?>"
29
+ data-thumbnail="<?php echo esc_attr($storage->get_image_url($image, 'thumb')); ?>"
30
+ data-image-id="<?php echo esc_attr($image->{$image->id_field}); ?>"
31
+ data-title="<?php echo esc_attr($image->alttext); ?>"
32
+ data-description="<?php echo esc_attr(stripslashes($image->description)); ?>"
33
+ data-image-slug="<?php echo esc_attr($image->image_slug); ?>"
34
+ <?php echo $effect_code ?>>
35
+ <img title="<?php echo esc_attr($image->alttext)?>"
36
+ alt="<?php echo esc_attr($image->alttext)?>"
37
+ src="<?php echo esc_attr($storage->get_image_url($image, $thumbnail_size_name))?>"
38
+ width="<?php echo esc_attr($thumb_size['width'])?>"
39
+ height="<?php echo esc_attr($thumb_size['height'])?>"
40
+ style="max-width:100%;"/>
41
+ </a>
42
+ <?php if (!isset($image->hidden) || !$image->hidden) { ?>
43
+ <span style="max-width: <?php print esc_attr($thumb_size['width']); ?>px">
44
+ <?php print $image->description; ?>
45
+ </span>
46
+ <?php } ?>
47
+ </div>
48
+ <?php $this->end_element(); ?>
49
+ </div>
50
+ <?php $this->end_element(); ?>
51
+ <?php } ?>
52
+ <?php $this->end_element(); ?>
53
+ </div>
54
+
55
+ <?php if (!empty($slideshow_link)) { ?>
56
+ <div class="slideshowlink">
57
+ <a href='<?php echo esc_attr($slideshow_link) ?>'><?php echo esc_html($slideshow_link_text) ?></a>
58
+ </div>
59
+ <?php } ?>
60
+
61
+ <?php if ($pagination) { ?>
62
+ <?php echo $pagination ?>
63
+ <?php } ?>
64
+ </div>
65
+
66
+ <?php $this->end_element(); ?>
products/photocrati_nextgen/modules/nextgen_basic_gallery/templates/thumbnails/carousel-view.php ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php $this->start_element('nextgen_gallery.gallery_container', 'container', $displayed_gallery); ?>
2
+
3
+ <div class="ngg-galleryoverview carousel-view <?php if (!intval($ajax_pagination)) echo ' ngg-ajax-pagination-none'; ?>"
4
+ id="ngg-gallery-<?php echo esc_attr($displayed_gallery_id)?>-<?php echo esc_attr($current_page)?>">
5
+
6
+ <div class="ngg-basic-thumbnails-carousel">
7
+ <?php
8
+ $image_size = $storage->get_image_dimensions($current_image, 'full');
9
+ ?>
10
+ <a href="<?php echo esc_attr($storage->get_current_image_url($current_image, 'full', TRUE))?>"
11
+ title="<?php echo esc_attr($current_image->description)?>"
12
+ data-src="<?php echo esc_attr($storage->get_current_image_url($current_image)); ?>"
13
+ data-thumbnail="<?php echo esc_attr($storage->get_current_image_url($current_image, 'thumb')); ?>"
14
+ data-current_image-id="<?php echo esc_attr($current_image->{$current_image->id_field}); ?>"
15
+ data-title="<?php echo esc_attr($current_image->alttext); ?>"
16
+ data-description="<?php echo esc_attr(stripslashes($current_image->description)); ?>"
17
+ data-current_image-slug="<?php echo esc_attr($current_image->current_image_slug); ?>"
18
+ <?php echo $effect_code ?>>
19
+ <img title="<?php echo esc_attr($current_image->alttext)?>"
20
+ alt="<?php echo esc_attr($current_image->alttext)?>"
21
+ src="<?php echo esc_attr($storage->get_current_image_url($current_image, 'full'))?>"
22
+ width="<?php echo esc_attr($image_size['width'])?>"
23
+ height="<?php echo esc_attr($image_size['height'])?>"
24
+ style="max-width: <?php print esc_attr($image_size['width']); ?>px;"/>
25
+ </a>
26
+ </div>
27
+
28
+ <div class="ngg-basic-thumbnails-carousel-list">
29
+ <?php $this->start_element('nextgen_gallery.image_list_container', 'container', $images); ?>
30
+ <?php
31
+
32
+ $application = C_Router::get_instance()->get_routed_app();
33
+ $controller = C_Display_Type_Controller::get_instance();
34
+
35
+ for ($i = 0; $i < count($images); $i++) {
36
+ $image = $images[$i];
37
+ $thumb_size = $storage->get_image_dimensions($image, $thumbnail_size_name);
38
+ $style = isset($image->style) ? $image->style : null;
39
+
40
+ if (isset($image->hidden) && $image->hidden) {
41
+ $style = 'style="display: none;"';
42
+ } else {
43
+ $style = null;
44
+ }
45
+
46
+ $this->start_element('nextgen_gallery.image_panel', 'item', $image);
47
+ ?>
48
+ <div id="<?php echo esc_attr('ngg-image-' . $i) ?>"
49
+ class="ngg-basic-thumbnails-carousel-thumbnail" <?php if ($style) echo $style; ?>>
50
+ <?php $this->start_element('nextgen_gallery.image', 'item', $image); ?>
51
+ <?php $href = $controller->set_param_for($application->get_routed_url(TRUE), 'pid', $image->image_slug); ?>
52
+ <div class="ngg-gallery-thumbnail">
53
+ <a href="<?php echo esc_attr($href); ?>"
54
+ title="<?php echo esc_attr($image->description)?>">
55
+ <img title="<?php echo esc_attr($image->alttext)?>"
56
+ alt="<?php echo esc_attr($image->alttext)?>"
57
+ src="<?php echo esc_attr($storage->get_image_url($image, $thumbnail_size_name))?>"
58
+ width="<?php echo esc_attr($thumb_size['width'])?>"
59
+ height="<?php echo esc_attr($thumb_size['height'])?>"/>
60
+ </a>
61
+ </div>
62
+ <?php $this->end_element(); ?>
63
+ </div>
64
+ <?php $this->end_element(); ?>
65
+ <?php } ?>
66
+ <?php $this->end_element(); ?>
67
+ </div>
68
+
69
+ <?php if (!empty($slideshow_link)) { ?>
70
+ <div class="slideshowlink">
71
+ <a href='<?php echo esc_attr($slideshow_link) ?>'><?php echo esc_html($slideshow_link_text) ?></a>
72
+ </div>
73
+ <?php } ?>
74
+
75
+ <?php if ($pagination) { ?>
76
+ <?php echo $pagination ?>
77
+ <?php } ?>
78
+ </div>
79
+
80
+ <?php $this->end_element(); ?>
products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/package.module.nextgen_basic_imagebrowser.php CHANGED
@@ -67,7 +67,7 @@ class A_NextGen_Basic_ImageBrowser_Controller extends Mixin
67
  } else {
68
  // in the case it's a slug we need to search for the pid
69
  foreach ($picture_list as $key => $picture) {
70
- if ($picture->image_slug == $pid) {
71
  $numeric_pid = $key;
72
  break;
73
  }
67
  } else {
68
  // in the case it's a slug we need to search for the pid
69
  foreach ($picture_list as $key => $picture) {
70
+ if ($picture->image_slug == $pid || strtoupper($picture->image_slug) === strtoupper(urlencode($pid))) {
71
  $numeric_pid = $key;
72
  break;
73
  }
products/photocrati_nextgen/modules/nextgen_basic_templates/static/ngg_template_settings.js CHANGED
@@ -1,7 +1,40 @@
1
- jQuery(function($){
2
- $('.ngg_settings_template').select2({
3
- placeholder: ngg_template_settings.placeholder_text,
4
- allowClear: true,
5
- width: 350
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  });
 
7
  });
1
+ jQuery(function($) {
2
+ const $template_fields = $('.ngg_settings_template');
3
+ $template_fields.each(function() {
4
+ const $this = $(this);
5
+
6
+ const template_field = $this.parents('tr').siblings('tr[id$="display_view"]');
7
+
8
+ $this.select2({
9
+ placeholder: ngg_template_settings.placeholder_text,
10
+ allowClear: true,
11
+ width: 350
12
+ });
13
+
14
+ $this.on('change', function(event) {
15
+ const val = $this.val();
16
+ if (val.match(/.*\/modules\/ngglegacy\/view\/gallery-carousel\.php/)) {
17
+ template_field.find('select').val('carousel-view.php');
18
+ $this.val(null).trigger('change');
19
+ }
20
+ if (val.match(/.*\/modules\/ngglegacy\/view\/gallery-caption\.php/)) {
21
+ template_field.find('select').val('caption-view.php');
22
+ $this.val(null).trigger('change');
23
+ }
24
+ if (val.match(/.*\/modules\/ngglegacy\/view\/gallery\.php/)) {
25
+ template_field.find('select').val('default-view.php');
26
+ $this.val(null).trigger('change');
27
+ }
28
+ if (val.match(/.*\/modules\/ngglegacy\/view\/album-compact\.php/)) {
29
+ template_field.find('select').val('default-view.php');
30
+ $this.val(null).trigger('change');
31
+ }
32
+ if (val.match(/.*\/modules\/ngglegacy\/view\/album-extend\.php/)) {
33
+ template_field.find('select').val('default-view.php');
34
+ $this.val(null).trigger('change');
35
+ }
36
+ });
37
+
38
  });
39
+
40
  });
products/photocrati_nextgen/modules/nextgen_basic_templates/static/ngg_template_settings.min.js CHANGED
@@ -1 +1 @@
1
- "use strict";jQuery(function(e){e(".ngg_settings_template").select2({placeholder:ngg_template_settings.placeholder_text,allowClear:!0,width:350})});
1
+ "use strict";jQuery(function(e){e(".ngg_settings_template").each(function(){var l=e(this),a=l.parents("tr").siblings('tr[id$="display_view"]');l.select2({placeholder:ngg_template_settings.placeholder_text,allowClear:!0,width:350}),l.on("change",function(e){var t=l.val();t.match(/.*\/modules\/ngglegacy\/view\/gallery-carousel\.php/)&&(a.find("select").val("carousel-view.php"),l.val(null).trigger("change")),t.match(/.*\/modules\/ngglegacy\/view\/gallery-caption\.php/)&&(a.find("select").val("caption-view.php"),l.val(null).trigger("change")),t.match(/.*\/modules\/ngglegacy\/view\/gallery\.php/)&&(a.find("select").val("default-view.php"),l.val(null).trigger("change")),t.match(/.*\/modules\/ngglegacy\/view\/album-compact\.php/)&&(a.find("select").val("default-view.php"),l.val(null).trigger("change")),t.match(/.*\/modules\/ngglegacy\/view\/album-extend\.php/)&&(a.find("select").val("default-view.php"),l.val(null).trigger("change"))})})});
products/photocrati_nextgen/modules/nextgen_block/static/build/post-thumbnail.min.js CHANGED
@@ -11,5 +11,5 @@
11
  object-assign
12
  (c) Sindre Sorhus
13
  @license MIT
14
- */var n=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},r=0;r<10;r++)t["_"+String.fromCharCode(r)]=r;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var n={};return"abcdefghijklmnopqrst".split("").forEach(function(e){n[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},n)).join("")}catch(e){return!1}}()?Object.assign:function(e,t){for(var r,a,u=function(e){if(null===e||void 0===e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),s=1;s<arguments.length;s++){for(var c in r=Object(arguments[s]))o.call(r,c)&&(u[c]=r[c]);if(n){a=n(r);for(var f=0;f<a.length;f++)i.call(r,a[f])&&(u[a[f]]=r[a[f]])}}return u}},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},function(e,t,r){"use strict";r.r(t);var n=r(0),o=r.n(n),i=r(1),a=r.n(i),u=r(2),s=r.n(u);function c(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function f(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?c(Object(r),!0).forEach(function(t){_(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):c(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}function l(e){"@babel/helpers - typeof";return(l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function p(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function y(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t,r){return t&&y(e.prototype,t),r&&y(e,r),e}function h(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&b(e,t)}function b(e,t){return(b=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function m(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(e){return!1}}();return function(){var r,n=g(e);if(t){var o=g(this).constructor;r=Reflect.construct(n,arguments,o)}else r=n.apply(this,arguments);return function(e,t){if(t&&("object"===l(t)||"function"==typeof t))return t;return v(e)}(this,r)}}function v(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function g(e){return(g=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function _(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var w=wp.data.dispatch,O=wp.components.Button,S=wp.element,P=S.Fragment,j=S.Component,E=wp.i18n.__,x=lodash.property,A=function(e){h(r,j);var t=m(r);function r(){var e;p(this,r);for(var n=arguments.length,o=new Array(n),i=0;i<n;i++)o[i]=arguments[i];return _(v(e=t.call.apply(t,[this].concat(o))),"state",{image_url:null,msg:E("Loading...")}),_(v(e),"updateImageUrl",function(){e.getImageUrl(e.props.image_id).then(function(t){return e.setState({image_url:t})}).catch(function(t){return console.log(t)&&e.setState({msg:E("Could not load image")})})}),_(v(e),"getImageUrl",function(e){var t=new a.a;return t.append("action","get_image"),t.append("image_id",e),s()(photocrati_ajax.url,{method:"POST",body:t,headers:{Accept:"application/json"}}).then(function(e){return e.json()}).then(x("image.image_url"))}),e}return d(r,[{key:"componentDidUpdate",value:function(e){this.props.image_id!==e.image_id&&this.updateImageUrl()}},{key:"componentDidMount",value:function(){this.updateImageUrl()}},{key:"render",value:function(){var e=this.state.msg,t=this.state.image_url?o.a.createElement("img",{src:this.state.image_url}):o.a.createElement("span",null,e);return o.a.createElement("div",{style:{paddingTop:"5px",paddingBottom:"5px"}},t)}}]),r}(),T=function(e){h(r,j);var t=m(r);function r(e){var n;return p(this,r),_(v(n=t.call(this,e)),"handleOpenClick",function(e){top.set_ngg_post_thumbnail=n.onUpdatePostThumbnail,tb_show("Set NextGEN Featured Image",ngg_featured_image.modal_url.replace(/%post_id%/,n.props.currentPostId))}),_(v(n),"handleRemoveClick",function(e){var t=f(f({},n.props.meta),{},{ngg_post_thumbnail:0,featured_media:0});n.setState({ngg_id:0}),w("core/editor").editPost({meta:t})}),_(v(n),"onUpdatePostThumbnail",function(e){tb_remove();var t=f(f({},n.props.meta),{},{ngg_post_thumbnail:parseInt(e)});n.setState({ngg_id:t.ngg_post_thumbnail}),w("core/editor").editPost({meta:t})}),n.state={ngg_id:e.meta.ngg_post_thumbnail,wp_ml_id:e.featuredImageId},n}return d(r,[{key:"render",value:function(){return o.a.createElement(P,null,o.a.createElement(O,{style:{marginTop:"10px"},onClick:this.handleOpenClick,className:"editor-post-featured-image__toggle"},E("Set NextGEN Featured Image")),this.state.ngg_id>0&&this.props.meta.ngg_post_thumbnail!==this.state.ngg_id?o.a.createElement(P,null,o.a.createElement(A,{image_id:this.state.ngg_id}),o.a.createElement(O,{onClick:this.handleRemoveClick,className:"is-link is-destructive"},E("Remove featured image"))):"")}}]),r}();function k(){return(k=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}var R=wp.data.select,B=wp.element.Fragment;wp.hooks.addFilter("editor.PostFeaturedImage","imagely/featured-image-display",function(e){return function(t){var r=R("core/editor").getCurrentPostAttribute("meta");return o.a.createElement(B,null,o.a.createElement(e,t),o.a.createElement(T,k({},t,{meta:r})))}})}]);
15
  //# sourceMappingURL=post-thumbnail.min.js.map
11
  object-assign
12
  (c) Sindre Sorhus
13
  @license MIT
14
+ */var n=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},r=0;r<10;r++)t["_"+String.fromCharCode(r)]=r;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var n={};return"abcdefghijklmnopqrst".split("").forEach(function(e){n[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},n)).join("")}catch(e){return!1}}()?Object.assign:function(e,t){for(var r,a,u=function(e){if(null===e||void 0===e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),s=1;s<arguments.length;s++){for(var c in r=Object(arguments[s]))o.call(r,c)&&(u[c]=r[c]);if(n){a=n(r);for(var f=0;f<a.length;f++)i.call(r,a[f])&&(u[a[f]]=r[a[f]])}}return u}},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},function(e,t,r){"use strict";r.r(t);var n=r(0),o=r.n(n),i=r(1),a=r.n(i),u=r(2),s=r.n(u);function c(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function f(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?c(Object(r),!0).forEach(function(t){_(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):c(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}function l(e){"@babel/helpers - typeof";return(l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function p(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function y(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t,r){return t&&y(e.prototype,t),r&&y(e,r),e}function h(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&b(e,t)}function b(e,t){return(b=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function m(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(e){return!1}}();return function(){var r,n=g(e);if(t){var o=g(this).constructor;r=Reflect.construct(n,arguments,o)}else r=n.apply(this,arguments);return function(e,t){if(t&&("object"===l(t)||"function"==typeof t))return t;return v(e)}(this,r)}}function v(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function g(e){return(g=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function _(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var w=wp.data.dispatch,O=wp.components.Button,S=wp.element,P=S.Fragment,j=S.Component,E=wp.i18n.__,x=lodash.property,A=function(e){h(r,j);var t=m(r);function r(){var e;p(this,r);for(var n=arguments.length,o=new Array(n),i=0;i<n;i++)o[i]=arguments[i];return _(v(e=t.call.apply(t,[this].concat(o))),"state",{image_url:null,msg:E("Loading...")}),_(v(e),"updateImageUrl",function(){e.getImageUrl(e.props.image_id).then(function(t){return e.setState({image_url:t})}).catch(function(t){return console.log(t)&&e.setState({msg:E("Could not load image")})})}),_(v(e),"getImageUrl",function(e){var t=new a.a;return t.append("action","get_image"),t.append("image_id",e),s()(photocrati_ajax.url,{method:"POST",body:t,headers:{Accept:"application/json"}}).then(function(e){return e.json()}).then(x("image.image_url"))}),e}return d(r,[{key:"componentDidUpdate",value:function(e){this.props.image_id!==e.image_id&&this.updateImageUrl()}},{key:"componentDidMount",value:function(){this.updateImageUrl()}},{key:"render",value:function(){var e=this.state.msg,t=this.state.image_url?o.a.createElement("img",{src:this.state.image_url}):o.a.createElement("span",null,e);return o.a.createElement("div",{style:{paddingTop:"5px",paddingBottom:"5px"}},t)}}]),r}(),T=function(e){h(r,j);var t=m(r);function r(e){var n;return p(this,r),_(v(n=t.call(this,e)),"handleOpenClick",function(e){top.set_ngg_post_thumbnail=n.onUpdatePostThumbnail,tb_show("Set NextGEN Featured Image",ngg_featured_image.modal_url.replace(/%post_id%/,n.props.currentPostId))}),_(v(n),"handleRemoveClick",function(e){var t=f(f({},n.props.meta),{},{ngg_post_thumbnail:0,featured_media:0});n.setState({ngg_id:0}),w("core/editor").editPost({meta:t})}),_(v(n),"onUpdatePostThumbnail",function(e){tb_remove();var t=f(f({},n.props.meta),{},{ngg_post_thumbnail:parseInt(e)});n.setState({ngg_id:t.ngg_post_thumbnail}),w("core/editor").editPost({meta:t})}),n.state={ngg_id:e.meta.ngg_post_thumbnail,wp_ml_id:e.featuredImageId},n}return d(r,[{key:"render",value:function(){return o.a.createElement(P,null,o.a.createElement(O,{style:{marginTop:"10px"},onClick:this.handleOpenClick,className:"editor-post-featured-image__toggle"},E("Set NextGEN Featured Image")),this.state.ngg_id>0&&this.props.meta.ngg_post_thumbnail!==this.state.ngg_id?o.a.createElement(P,null,o.a.createElement(A,{image_id:this.state.ngg_id}),o.a.createElement(O,{onClick:this.handleRemoveClick,className:"is-link is-destructive"},E("Remove featured image"))):"")}}]),r}();function k(){return(k=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}var R=wp.data.select,B=wp.element.Fragment;wp.hooks.addFilter("editor.PostFeaturedImage","imagely/featured-image-display",function(e){return function(t){var r,n=R("core/editor").getCurrentPostAttribute("meta");return void 0!==n&&(r=o.a.createElement(T,k({},t,{meta:n}))),o.a.createElement(B,null,o.a.createElement(e,t),r)}})}]);
15
  //# sourceMappingURL=post-thumbnail.min.js.map
products/photocrati_nextgen/modules/nextgen_block/static/build/post-thumbnail.min.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/react/index.js","webpack:///./node_modules/form-data/lib/browser.js","webpack:///./node_modules/cross-fetch/dist/browser-ponyfill.js","webpack:///./node_modules/react/cjs/react.production.min.js","webpack:///./node_modules/object-assign/index.js","webpack:///(webpack)/buildin/module.js","webpack:///./build/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/src/components/ngg-post-thumbnail.jsx","webpack:///./build/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/src/post-thumbnail.jsx"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","require","self","_typeof","FormData","window","__root__","root","F","this","fetch","support","searchParams","iterable","blob","Blob","e","formData","arrayBuffer","viewClasses","isDataView","obj","DataView","isPrototypeOf","isArrayBufferView","ArrayBuffer","isView","indexOf","toString","Headers","append","normalizeName","normalizeValue","oldValue","map","has","set","forEach","callback","thisArg","keys","items","push","iteratorFor","values","entries","iterator","methods","Request","clone","body","_bodyInit","Body","Response","status","statusText","headers","url","error","response","type","redirectStatuses","redirect","RangeError","location","input","init","Promise","resolve","reject","request","xhr","XMLHttpRequest","onload","options","rawHeaders","replace","split","line","parts","shift","trim","join","parseHeaders","getAllResponseHeaders","responseURL","responseText","onerror","TypeError","ontimeout","open","method","credentials","withCredentials","responseType","setRequestHeader","send","polyfill","String","test","toLowerCase","next","done","undefined","Array","isArray","header","getOwnPropertyNames","consumed","bodyUsed","fileReaderReady","reader","result","readBlobAsArrayBuffer","FileReader","promise","readAsArrayBuffer","bufferClone","buf","slice","view","Uint8Array","byteLength","buffer","_initBody","_bodyText","_bodyBlob","_bodyFormData","URLSearchParams","_bodyArrayBuffer","Error","rejected","then","text","readAsText","readBlobAsText","chars","length","fromCharCode","readArrayBufferAsText","decode","json","JSON","parse","upcased","toUpperCase","normalizeMethod","referrer","form","bytes","decodeURIComponent","bodyInit","ok","k","q","u","v","w","x","y","z","A","B","C","D","a","b","arguments","encodeURIComponent","g","h","f","framesToPop","aa","E","isMounted","enqueueForceUpdate","enqueueReplaceState","enqueueSetState","G","props","context","refs","updater","H","I","isReactComponent","setState","forceUpdate","J","constructor","isPureReactComponent","K","current","currentDispatcher","L","M","ref","__self","__source","N","children","defaultProps","$$typeof","_owner","O","P","Q","R","pop","keyPrefix","func","count","S","V","T","U","=",":","escape","ca","da","W","ba","X","Children","toArray","only","createRef","Component","PureComponent","createContext","_calculateChangedBits","_currentValue","_currentValue2","_threadCount","Provider","Consumer","_context","forwardRef","render","lazy","_ctor","_status","_result","memo","compare","Fragment","StrictMode","Suspense","createElement","cloneElement","createFactory","isValidElement","version","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","ReactCurrentOwner","assign","unstable_ConcurrentMode","unstable_Profiler","Y","default","Z","getOwnPropertySymbols","propIsEnumerable","propertyIsEnumerable","test1","test2","test3","letter","err","shouldUseNative","target","source","from","symbols","to","val","toObject","webpackPolyfill","deprecate","paths","dispatch","wp","data","Button","components","element","__","i18n","lodash","NGGFeaturedThumbnail","image_url","msg","_this","getImageUrl","image_id","console","log","photocrati_ajax","Accept","res","prevProps","updateImageUrl","state","el","react_default","src","style","paddingTop","paddingBottom","NGGFeaturedImage","_this2","_classCallCheck","_defineProperty","_assertThisInitialized","_super2","event","top","set_ngg_post_thumbnail","onUpdatePostThumbnail","tb_show","ngg_featured_image","modal_url","currentPostId","meta","_objectSpread","ngg_post_thumbnail","featured_media","ngg_id","editPost","ngg_image_id","tb_remove","parseInt","wp_ml_id","featuredImageId","marginTop","onClick","handleOpenClick","className","ngg_post_thumbnail_NGGFeaturedThumbnail","handleRemoveClick","select","hooks","addFilter","OriginalComponent","getCurrentPostAttribute","post_thumbnail_Fragment","ngg_post_thumbnail_NGGFeaturedImage","_extends"],"mappings":"aACA,IAAAA,KAGA,SAAAC,EAAAC,GAGA,GAAAF,EAAAE,GACA,OAAAF,EAAAE,GAAAC,QAGA,IAAAC,EAAAJ,EAAAE,IACAG,EAAAH,EACAI,GAAA,EACAH,YAUA,OANAI,EAAAL,GAAAM,KAAAJ,EAAAD,QAAAC,IAAAD,QAAAF,GAGAG,EAAAE,GAAA,EAGAF,EAAAD,QAKAF,EAAAQ,EAAAF,EAGAN,EAAAS,EAAAV,EAGAC,EAAAU,EAAA,SAAAR,EAAAS,EAAAC,GACAZ,EAAAa,EAAAX,EAAAS,IACAG,OAAAC,eAAAb,EAAAS,GAA0CK,YAAA,EAAAC,IAAAL,KAK1CZ,EAAAkB,EAAA,SAAAhB,GACA,oBAAAiB,eAAAC,aACAN,OAAAC,eAAAb,EAAAiB,OAAAC,aAAwDC,MAAA,WAExDP,OAAAC,eAAAb,EAAA,cAAiDmB,OAAA,KAQjDrB,EAAAsB,EAAA,SAAAD,EAAAE,GAEA,GADA,EAAAA,IAAAF,EAAArB,EAAAqB,IACA,EAAAE,EAAA,OAAAF,EACA,KAAAE,GAAA,iBAAAF,QAAAG,WAAA,OAAAH,EACA,IAAAI,EAAAX,OAAAY,OAAA,MAGA,GAFA1B,EAAAkB,EAAAO,GACAX,OAAAC,eAAAU,EAAA,WAAyCT,YAAA,EAAAK,UACzC,EAAAE,GAAA,iBAAAF,EAAA,QAAAM,KAAAN,EAAArB,EAAAU,EAAAe,EAAAE,EAAA,SAAAA,GAAgH,OAAAN,EAAAM,IAAqBC,KAAA,KAAAD,IACrI,OAAAF,GAIAzB,EAAA6B,EAAA,SAAA1B,GACA,IAAAS,EAAAT,KAAAqB,WACA,WAA2B,OAAArB,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAH,EAAAU,EAAAE,EAAA,IAAAA,GACAA,GAIAZ,EAAAa,EAAA,SAAAiB,EAAAC,GAAsD,OAAAjB,OAAAkB,UAAAC,eAAA1B,KAAAuB,EAAAC,IAGtD/B,EAAAkC,EAAA,GAIAlC,IAAAmC,EAAA,kCC/EEhC,EAAOD,QAAUkC,EAAQ,iRCF3BjC,EAAOD,QAAyB,WAAf,oBAAOmC,KAAP,YAAAC,EAAOD,OAAmBA,KAAKE,SAAWC,OAAOD,sSCDlE,IAAIE,EAAY,SAAUC,GAC1B,SAASC,IAAMC,KAAKC,OAAQ,EAE5B,OADAF,EAAEX,UAAYU,EACP,IAAIC,EAHK,CAIG,oBAATN,KAAuBA,KAAOO,OACxC,SAAUP,IAEV,SAAUA,GAER,IAAIA,EAAKQ,MAAT,CAIA,IAAIC,GACFC,aAAc,oBAAqBV,EACnCW,SAAU,WAAYX,GAAQ,aAAclB,OAC5C8B,KAAM,eAAgBZ,GAAQ,SAAUA,GAAS,WAC/C,IAEE,OADA,IAAIa,MACG,EACP,MAAMC,GACN,OAAO,GALsC,GAQjDC,SAAU,aAAcf,EACxBgB,YAAa,gBAAiBhB,GAGhC,GAAIS,EAAQO,YACV,IAAIC,GACF,qBACA,sBACA,6BACA,sBACA,uBACA,sBACA,uBACA,wBACA,yBAGEC,EAAa,SAASC,GACxB,OAAOA,GAAOC,SAASzB,UAAU0B,cAAcF,IAG7CG,EAAoBC,YAAYC,QAAU,SAASL,GACrD,OAAOA,GAAOF,EAAYQ,QAAQhD,OAAOkB,UAAU+B,SAASxD,KAAKiD,KAAS,GAyD9EQ,EAAQhC,UAAUiC,OAAS,SAAStD,EAAMU,GACxCV,EAAOuD,EAAcvD,GACrBU,EAAQ8C,EAAe9C,GACvB,IAAI+C,EAAWxB,KAAKyB,IAAI1D,GACxBiC,KAAKyB,IAAI1D,GAAQyD,EAAWA,EAAS,IAAI/C,EAAQA,GAGnD2C,EAAQhC,UAAR,OAA8B,SAASrB,UAC9BiC,KAAKyB,IAAIH,EAAcvD,KAGhCqD,EAAQhC,UAAUf,IAAM,SAASN,GAE/B,OADAA,EAAOuD,EAAcvD,GACdiC,KAAK0B,IAAI3D,GAAQiC,KAAKyB,IAAI1D,GAAQ,MAG3CqD,EAAQhC,UAAUsC,IAAM,SAAS3D,GAC/B,OAAOiC,KAAKyB,IAAIpC,eAAeiC,EAAcvD,KAG/CqD,EAAQhC,UAAUuC,IAAM,SAAS5D,EAAMU,GACrCuB,KAAKyB,IAAIH,EAAcvD,IAASwD,EAAe9C,IAGjD2C,EAAQhC,UAAUwC,QAAU,SAASC,EAAUC,GAC7C,IAAK,IAAI/D,KAAQiC,KAAKyB,IAChBzB,KAAKyB,IAAIpC,eAAetB,IAC1B8D,EAASlE,KAAKmE,EAAS9B,KAAKyB,IAAI1D,GAAOA,EAAMiC,OAKnDoB,EAAQhC,UAAU2C,KAAO,WACvB,IAAIC,KAEJ,OADAhC,KAAK4B,QAAQ,SAASnD,EAAOV,GAAQiE,EAAMC,KAAKlE,KACzCmE,EAAYF,IAGrBZ,EAAQhC,UAAU+C,OAAS,WACzB,IAAIH,KAEJ,OADAhC,KAAK4B,QAAQ,SAASnD,GAASuD,EAAMC,KAAKxD,KACnCyD,EAAYF,IAGrBZ,EAAQhC,UAAUgD,QAAU,WAC1B,IAAIJ,KAEJ,OADAhC,KAAK4B,QAAQ,SAASnD,EAAOV,GAAQiE,EAAMC,MAAMlE,EAAMU,MAChDyD,EAAYF,IAGjB9B,EAAQE,WACVgB,EAAQhC,UAAUb,OAAO8D,UAAYjB,EAAQhC,UAAUgD,SAqJzD,IAAIE,GAAW,SAAU,MAAO,OAAQ,UAAW,OAAQ,OA4C3DC,EAAQnD,UAAUoD,MAAQ,WACxB,OAAO,IAAID,EAAQvC,MAAQyC,KAAMzC,KAAK0C,aAgCxCC,EAAKhF,KAAK4E,EAAQnD,WAgBlBuD,EAAKhF,KAAKiF,EAASxD,WAEnBwD,EAASxD,UAAUoD,MAAQ,WACzB,OAAO,IAAII,EAAS5C,KAAK0C,WACvBG,OAAQ7C,KAAK6C,OACbC,WAAY9C,KAAK8C,WACjBC,QAAS,IAAI3B,EAAQpB,KAAK+C,SAC1BC,IAAKhD,KAAKgD,OAIdJ,EAASK,MAAQ,WACf,IAAIC,EAAW,IAAIN,EAAS,MAAOC,OAAQ,EAAGC,WAAY,KAE1D,OADAI,EAASC,KAAO,QACTD,GAGT,IAAIE,GAAoB,IAAK,IAAK,IAAK,IAAK,KAE5CR,EAASS,SAAW,SAASL,EAAKH,GAChC,IAA0C,IAAtCO,EAAiBlC,QAAQ2B,GAC3B,MAAM,IAAIS,WAAW,uBAGvB,OAAO,IAAIV,EAAS,MAAOC,OAAQA,EAAQE,SAAUQ,SAAUP,MAGjEvD,EAAK2B,QAAUA,EACf3B,EAAK8C,QAAUA,EACf9C,EAAKmD,SAAWA,EAEhBnD,EAAKQ,MAAQ,SAASuD,EAAOC,GAC3B,OAAO,IAAIC,QAAQ,SAASC,EAASC,GACnC,IAAIC,EAAU,IAAItB,EAAQiB,EAAOC,GAC7BK,EAAM,IAAIC,eAEdD,EAAIE,OAAS,WACX,IAAIC,GACFpB,OAAQiB,EAAIjB,OACZC,WAAYgB,EAAIhB,WAChBC,QAxER,SAAsBmB,GACpB,IAAInB,EAAU,IAAI3B,EAYlB,OAT0B8C,EAAWC,QAAQ,eAAgB,KACzCC,MAAM,SAASxC,QAAQ,SAASyC,GAClD,IAAIC,EAAQD,EAAKD,MAAM,KACnBrF,EAAMuF,EAAMC,QAAQC,OACxB,GAAIzF,EAAK,CACP,IAAIN,EAAQ6F,EAAMG,KAAK,KAAKD,OAC5BzB,EAAQ1B,OAAOtC,EAAKN,MAGjBsE,EA2DQ2B,CAAaZ,EAAIa,yBAA2B,KAEvDV,EAAQjB,IAAM,gBAAiBc,EAAMA,EAAIc,YAAcX,EAAQlB,QAAQ1E,IAAI,iBAC3E,IAAIoE,EAAO,aAAcqB,EAAMA,EAAIZ,SAAWY,EAAIe,aAClDlB,EAAQ,IAAIf,EAASH,EAAMwB,KAG7BH,EAAIgB,QAAU,WACZlB,EAAO,IAAImB,UAAU,4BAGvBjB,EAAIkB,UAAY,WACdpB,EAAO,IAAImB,UAAU,4BAGvBjB,EAAImB,KAAKpB,EAAQqB,OAAQrB,EAAQb,KAAK,GAEV,YAAxBa,EAAQsB,YACVrB,EAAIsB,iBAAkB,EACW,SAAxBvB,EAAQsB,cACjBrB,EAAIsB,iBAAkB,GAGpB,iBAAkBtB,GAAO5D,EAAQG,OACnCyD,EAAIuB,aAAe,QAGrBxB,EAAQd,QAAQnB,QAAQ,SAASnD,EAAOV,GACtC+F,EAAIwB,iBAAiBvH,EAAMU,KAG7BqF,EAAIyB,UAAkC,IAAtB1B,EAAQnB,UAA4B,KAAOmB,EAAQnB,cAGvEjD,EAAKQ,MAAMuF,UAAW,EApatB,SAASlE,EAAcvD,GAIrB,GAHoB,iBAATA,IACTA,EAAO0H,OAAO1H,IAEZ,6BAA6B2H,KAAK3H,GACpC,MAAM,IAAIgH,UAAU,0CAEtB,OAAOhH,EAAK4H,cAGd,SAASpE,EAAe9C,GAItB,MAHqB,iBAAVA,IACTA,EAAQgH,OAAOhH,IAEVA,EAIT,SAASyD,EAAYF,GACnB,IAAIK,GACFuD,KAAM,WACJ,IAAInH,EAAQuD,EAAMuC,QAClB,OAAQsB,UAAgBC,IAAVrH,EAAqBA,MAAOA,KAU9C,OANIyB,EAAQE,WACViC,EAAS9D,OAAO8D,UAAY,WAC1B,OAAOA,IAIJA,EAGT,SAASjB,EAAQ2B,GACf/C,KAAKyB,OAEDsB,aAAmB3B,EACrB2B,EAAQnB,QAAQ,SAASnD,EAAOV,GAC9BiC,KAAKqB,OAAOtD,EAAMU,IACjBuB,MACM+F,MAAMC,QAAQjD,GACvBA,EAAQnB,QAAQ,SAASqE,GACvBjG,KAAKqB,OAAO4E,EAAO,GAAIA,EAAO,KAC7BjG,MACM+C,GACT7E,OAAOgI,oBAAoBnD,GAASnB,QAAQ,SAAS7D,GACnDiC,KAAKqB,OAAOtD,EAAMgF,EAAQhF,KACzBiC,MA0DP,SAASmG,EAAS1D,GAChB,GAAIA,EAAK2D,SACP,OAAO1C,QAAQE,OAAO,IAAImB,UAAU,iBAEtCtC,EAAK2D,UAAW,EAGlB,SAASC,EAAgBC,GACvB,OAAO,IAAI5C,QAAQ,SAASC,EAASC,GACnC0C,EAAOtC,OAAS,WACdL,EAAQ2C,EAAOC,SAEjBD,EAAOxB,QAAU,WACflB,EAAO0C,EAAOrD,UAKpB,SAASuD,EAAsBnG,GAC7B,IAAIiG,EAAS,IAAIG,WACbC,EAAUL,EAAgBC,GAE9B,OADAA,EAAOK,kBAAkBtG,GAClBqG,EAoBT,SAASE,EAAYC,GACnB,GAAIA,EAAIC,MACN,OAAOD,EAAIC,MAAM,GAEjB,IAAIC,EAAO,IAAIC,WAAWH,EAAII,YAE9B,OADAF,EAAKpF,IAAI,IAAIqF,WAAWH,IACjBE,EAAKG,OAIhB,SAASvE,IA0FP,OAzFA3C,KAAKoG,UAAW,EAEhBpG,KAAKmH,UAAY,SAAS1E,GAExB,GADAzC,KAAK0C,UAAYD,EACZA,EAEE,GAAoB,iBAATA,EAChBzC,KAAKoH,UAAY3E,OACZ,GAAIvC,EAAQG,MAAQC,KAAKlB,UAAU0B,cAAc2B,GACtDzC,KAAKqH,UAAY5E,OACZ,GAAIvC,EAAQM,UAAYb,SAASP,UAAU0B,cAAc2B,GAC9DzC,KAAKsH,cAAgB7E,OAChB,GAAIvC,EAAQC,cAAgBoH,gBAAgBnI,UAAU0B,cAAc2B,GACzEzC,KAAKoH,UAAY3E,EAAKtB,gBACjB,GAAIjB,EAAQO,aAAeP,EAAQG,MAAQM,EAAW8B,GAC3DzC,KAAKwH,iBAAmBZ,EAAYnE,EAAKyE,QAEzClH,KAAK0C,UAAY,IAAIpC,MAAMN,KAAKwH,uBAC3B,KAAItH,EAAQO,cAAgBO,YAAY5B,UAAU0B,cAAc2B,KAAS1B,EAAkB0B,GAGhG,MAAM,IAAIgF,MAAM,6BAFhBzH,KAAKwH,iBAAmBZ,EAAYnE,QAdpCzC,KAAKoH,UAAY,GAmBdpH,KAAK+C,QAAQ1E,IAAI,kBACA,iBAAToE,EACTzC,KAAK+C,QAAQpB,IAAI,eAAgB,4BACxB3B,KAAKqH,WAAarH,KAAKqH,UAAUlE,KAC1CnD,KAAK+C,QAAQpB,IAAI,eAAgB3B,KAAKqH,UAAUlE,MACvCjD,EAAQC,cAAgBoH,gBAAgBnI,UAAU0B,cAAc2B,IACzEzC,KAAK+C,QAAQpB,IAAI,eAAgB,qDAKnCzB,EAAQG,OACVL,KAAKK,KAAO,WACV,IAAIqH,EAAWvB,EAASnG,MACxB,GAAI0H,EACF,OAAOA,EAGT,GAAI1H,KAAKqH,UACP,OAAO3D,QAAQC,QAAQ3D,KAAKqH,WACvB,GAAIrH,KAAKwH,iBACd,OAAO9D,QAAQC,QAAQ,IAAIrD,MAAMN,KAAKwH,oBACjC,GAAIxH,KAAKsH,cACd,MAAM,IAAIG,MAAM,wCAEhB,OAAO/D,QAAQC,QAAQ,IAAIrD,MAAMN,KAAKoH,cAI1CpH,KAAKS,YAAc,WACjB,OAAIT,KAAKwH,iBACArB,EAASnG,OAAS0D,QAAQC,QAAQ3D,KAAKwH,kBAEvCxH,KAAKK,OAAOsH,KAAKnB,KAK9BxG,KAAK4H,KAAO,WACV,IAAIF,EAAWvB,EAASnG,MACxB,GAAI0H,EACF,OAAOA,EAGT,GAAI1H,KAAKqH,UACP,OAjGN,SAAwBhH,GACtB,IAAIiG,EAAS,IAAIG,WACbC,EAAUL,EAAgBC,GAE9B,OADAA,EAAOuB,WAAWxH,GACXqG,EA6FIoB,CAAe9H,KAAKqH,WACtB,GAAIrH,KAAKwH,iBACd,OAAO9D,QAAQC,QA5FrB,SAA+BkD,GAI7B,IAHA,IAAIE,EAAO,IAAIC,WAAWH,GACtBkB,EAAQ,IAAIhC,MAAMgB,EAAKiB,QAElBxK,EAAI,EAAGA,EAAIuJ,EAAKiB,OAAQxK,IAC/BuK,EAAMvK,GAAKiI,OAAOwC,aAAalB,EAAKvJ,IAEtC,OAAOuK,EAAMtD,KAAK,IAqFSyD,CAAsBlI,KAAKwH,mBAC7C,GAAIxH,KAAKsH,cACd,MAAM,IAAIG,MAAM,wCAEhB,OAAO/D,QAAQC,QAAQ3D,KAAKoH,YAI5BlH,EAAQM,WACVR,KAAKQ,SAAW,WACd,OAAOR,KAAK4H,OAAOD,KAAKQ,KAI5BnI,KAAKoI,KAAO,WACV,OAAOpI,KAAK4H,OAAOD,KAAKU,KAAKC,QAGxBtI,KAWT,SAASuC,EAAQiB,EAAOS,GAEtB,IAAIxB,GADJwB,EAAUA,OACSxB,KAEnB,GAAIe,aAAiBjB,EAAS,CAC5B,GAAIiB,EAAM4C,SACR,MAAM,IAAIrB,UAAU,gBAEtB/E,KAAKgD,IAAMQ,EAAMR,IACjBhD,KAAKmF,YAAc3B,EAAM2B,YACpBlB,EAAQlB,UACX/C,KAAK+C,QAAU,IAAI3B,EAAQoC,EAAMT,UAEnC/C,KAAKkF,OAAS1B,EAAM0B,OACpBlF,KAAKrB,KAAO6E,EAAM7E,KACb8D,GAA2B,MAAnBe,EAAMd,YACjBD,EAAOe,EAAMd,UACbc,EAAM4C,UAAW,QAGnBpG,KAAKgD,IAAMyC,OAAOjC,GAWpB,GARAxD,KAAKmF,YAAclB,EAAQkB,aAAenF,KAAKmF,aAAe,QAC1DlB,EAAQlB,SAAY/C,KAAK+C,UAC3B/C,KAAK+C,QAAU,IAAI3B,EAAQ6C,EAAQlB,UAErC/C,KAAKkF,OAhCP,SAAyBA,GACvB,IAAIqD,EAAUrD,EAAOsD,cACrB,OAAQlG,EAAQpB,QAAQqH,IAAY,EAAKA,EAAUrD,EA8BrCuD,CAAgBxE,EAAQiB,QAAUlF,KAAKkF,QAAU,OAC/DlF,KAAKrB,KAAOsF,EAAQtF,MAAQqB,KAAKrB,MAAQ,KACzCqB,KAAK0I,SAAW,MAEK,QAAhB1I,KAAKkF,QAAoC,SAAhBlF,KAAKkF,SAAsBzC,EACvD,MAAM,IAAIsC,UAAU,6CAEtB/E,KAAKmH,UAAU1E,GAOjB,SAAS0F,EAAO1F,GACd,IAAIkG,EAAO,IAAIhJ,SASf,OARA8C,EAAK+B,OAAOJ,MAAM,KAAKxC,QAAQ,SAASgH,GACtC,GAAIA,EAAO,CACT,IAAIxE,EAAQwE,EAAMxE,MAAM,KACpBrG,EAAOqG,EAAMG,QAAQJ,QAAQ,MAAO,KACpC1F,EAAQ2F,EAAMK,KAAK,KAAKN,QAAQ,MAAO,KAC3CwE,EAAKtH,OAAOwH,mBAAmB9K,GAAO8K,mBAAmBpK,OAGtDkK,EAqBT,SAAS/F,EAASkG,EAAU7E,GACrBA,IACHA,MAGFjE,KAAKmD,KAAO,UACZnD,KAAK6C,YAA4BiD,IAAnB7B,EAAQpB,OAAuB,IAAMoB,EAAQpB,OAC3D7C,KAAK+I,GAAK/I,KAAK6C,QAAU,KAAO7C,KAAK6C,OAAS,IAC9C7C,KAAK8C,WAAa,eAAgBmB,EAAUA,EAAQnB,WAAa,KACjE9C,KAAK+C,QAAU,IAAI3B,EAAQ6C,EAAQlB,SACnC/C,KAAKgD,IAAMiB,EAAQjB,KAAO,GAC1BhD,KAAKmH,UAAU2B,IAlYnB,MAgdmB,IAATrJ,EAAuBA,EAAOO,QACrCrC,KAAKkC,OAAU,GAClB,IAAII,EAAQJ,EAASI,MACNA,EAAM2C,SAAW/C,EAAS+C,SAC3B3C,EAAMsC,QAAU1C,EAAS0C,QACzBtC,EAAMmB,QAAUvB,EAASuB,QACjB,WAAlB1B,EAAOnC,IAAuBA,EAAOD,UACzCC,EAAOD,QAAU2C,EAEjB1C,EAAOD,QAAP,QAAyB2C;;;;;;;;kQCvdZ,IAAI+I,EAAExJ,EAAQ,GAAiBP,EAAE,mBAAoBV,QAAQA,OAAM,IAAKe,EAAEL,EAAEV,OAAM,IAAK,iBAAiB,MAAM0K,EAAEhK,EAAEV,OAAM,IAAK,gBAAgB,MAAMD,EAAEW,EAAEV,OAAM,IAAK,kBAAkB,MAAMG,EAAEO,EAAEV,OAAM,IAAK,qBAAqB,MAAM2K,EAAEjK,EAAEV,OAAM,IAAK,kBAAkB,MAAM4K,EAAElK,EAAEV,OAAM,IAAK,kBAAkB,MAAM6K,EAAEnK,EAAEV,OAAM,IAAK,iBAAiB,MAAM8K,EAAEpK,EAAEV,OAAM,IAAK,yBAAyB,MAAM+K,EAAErK,EAAEV,OAAM,IAAK,qBAAqB,MAAMgL,EAAEtK,EAAEV,OAAM,IAAK,kBAAkB,MAAMiL,EAAEvK,EAAEV,OAAM,IAAK,cACnf,MAAMkL,EAAExK,EAAEV,OAAM,IAAK,cAAc,MAAMmL,EAAE,mBAAoBnL,QAAQA,OAAO8D,SAC9E,SAASsH,EAAEC,GAAG,IAAI,IAAIC,EAAEC,UAAU9B,OAAO,EAAEzH,EAAE,yDAAyDqJ,EAAE/L,EAAE,EAAEA,EAAEgM,EAAEhM,IAAI0C,GAAG,WAAWwJ,mBAAmBD,UAAUjM,EAAE,KAD1E,SAAY+L,EAAEC,EAAEtJ,EAAE1C,EAAEC,EAAEkM,EAAEC,EAAEC,GAAG,IAAIN,EAAE,CAAU,GAATA,OAAE,OAAU,IAASC,EAAED,EAAEnC,MAAM,qIAAqI,CAAC,IAAIhK,GAAG8C,EAAE1C,EAAEC,EAAEkM,EAAEC,EAAEC,GAAGtM,EAAE,GAAEgM,EAAEnC,MAAMoC,EAAE1F,QAAQ,MAAM,WAAW,OAAO1G,EAAEG,SAAUG,KAAK,sBAAsC,MAAhB6L,EAAEO,YAAY,EAAQP,GAC1PQ,EAAG,EAAG,yBAAyBR,EAAE,4HAA4HrJ,GAAG,IAAI8J,GAAGC,UAAU,WAAW,OAAM,GAAIC,mBAAmB,aAAaC,oBAAoB,aAAaC,gBAAgB,cAAc1K,KAC1c,SAAS2K,EAAEd,EAAEC,EAAEtJ,GAAGP,KAAK2K,MAAMf,EAAE5J,KAAK4K,QAAQf,EAAE7J,KAAK6K,KAAK9K,EAAEC,KAAK8K,QAAQvK,GAAG8J,EAAsR,SAASU,KAA6B,SAASC,EAAEpB,EAAEC,EAAEtJ,GAAGP,KAAK2K,MAAMf,EAAE5J,KAAK4K,QAAQf,EAAE7J,KAAK6K,KAAK9K,EAAEC,KAAK8K,QAAQvK,GAAG8J,EAApYK,EAAEtL,UAAU6L,oBAAoBP,EAAEtL,UAAU8L,SAAS,SAAStB,EAAEC,GAAG,WAAAnK,EAAkBkK,IAAG,mBAAoBA,GAAG,MAAMA,GAAED,EAAE,MAAa3J,KAAK8K,QAAQL,gBAAgBzK,KAAK4J,EAAEC,EAAE,aAAaa,EAAEtL,UAAU+L,YAAY,SAASvB,GAAG5J,KAAK8K,QAAQP,mBAAmBvK,KAAK4J,EAAE,gBAA8BmB,EAAE3L,UAAUsL,EAAEtL,UAAsF,IAAIgM,EAAEJ,EAAE5L,UAAU,IAAI2L,EACxeK,EAAEC,YAAYL,EAAEhC,EAAEoC,EAAEV,EAAEtL,WAAWgM,EAAEE,sBAAqB,EAAG,IAAIC,GAAGC,QAAQ,KAAKC,kBAAkB,MAAMC,EAAExN,OAAOkB,UAAUC,eAAesM,GAAG5M,KAAI,EAAG6M,KAAI,EAAGC,QAAO,EAAGC,UAAS,GAC7K,SAASC,EAAEnC,EAAEC,EAAEtJ,GAAG,IAAI1C,OAAE,EAAOC,KAAKkM,EAAE,KAAKC,EAAE,KAAK,GAAG,MAAMJ,EAAE,IAAIhM,UAAK,IAASgM,EAAE+B,MAAM3B,EAAEJ,EAAE+B,UAAK,IAAS/B,EAAE9K,MAAMiL,EAAE,GAAGH,EAAE9K,KAAK8K,EAAE6B,EAAE/N,KAAKkM,EAAEhM,KAAK8N,EAAEtM,eAAexB,KAAKC,EAAED,GAAGgM,EAAEhM,IAAI,IAAIqM,EAAEJ,UAAU9B,OAAO,EAAE,GAAG,IAAIkC,EAAEpM,EAAEkO,SAASzL,OAAO,GAAG,EAAE2J,EAAE,CAAC,IAAI,IAAIzM,EAAEsI,MAAMmE,GAAGtM,EAAE,EAAEA,EAAEsM,EAAEtM,IAAIH,EAAEG,GAAGkM,UAAUlM,EAAE,GAAGE,EAAEkO,SAASvO,EAAE,GAAGmM,GAAGA,EAAEqC,aAAa,IAAIpO,KAAKqM,EAAEN,EAAEqC,kBAAe,IAASnO,EAAED,KAAKC,EAAED,GAAGqM,EAAErM,IAAI,OAAOqO,SAAS5M,EAAE6D,KAAKyG,EAAE7K,IAAIiL,EAAE4B,IAAI3B,EAAEU,MAAM7M,EAAEqO,OAAOZ,EAAEC,SAC9U,SAASY,EAAExC,GAAG,MAAM,WAAAlK,EAAkBkK,IAAG,OAAOA,GAAGA,EAAEsC,WAAW5M,EAA0G,IAAI+M,EAAE,OAAOC,KAAK,SAASC,EAAE3C,EAAEC,EAAEtJ,EAAE1C,GAAG,GAAGyO,EAAEtE,OAAO,CAAC,IAAIlK,EAAEwO,EAAEE,MAA8D,OAAxD1O,EAAEyI,OAAOqD,EAAE9L,EAAE2O,UAAU5C,EAAE/L,EAAE4O,KAAKnM,EAAEzC,EAAE8M,QAAQ/M,EAAEC,EAAE6O,MAAM,EAAS7O,EAAE,OAAOyI,OAAOqD,EAAE6C,UAAU5C,EAAE6C,KAAKnM,EAAEqK,QAAQ/M,EAAE8O,MAAM,GAC7b,SAASC,EAAEhD,GAAGA,EAAErD,OAAO,KAAKqD,EAAE6C,UAAU,KAAK7C,EAAE8C,KAAK,KAAK9C,EAAEgB,QAAQ,KAAKhB,EAAE+C,MAAM,EAAE,GAAGL,EAAEtE,QAAQsE,EAAErK,KAAK2H,GAE+E,SAASiD,EAAEjD,EAAEC,EAAEtJ,GAAG,OAAO,MAAMqJ,EAAE,EADtN,SAASkD,EAAElD,EAAEC,EAAEtJ,EAAE1C,GAAG,IAAIC,EAAC4B,EAAQkK,GAAK,cAAc9L,GAAG,YAAYA,IAAE8L,EAAE,MAAK,IAAII,GAAE,EAAG,GAAG,OAAOJ,EAAEI,GAAE,OAAQ,OAAOlM,GAAG,IAAK,SAAS,IAAK,SAASkM,GAAE,EAAG,MAAM,IAAK,SAAS,OAAOJ,EAAEsC,UAAU,KAAK5M,EAAE,KAAK2J,EAAEe,GAAE,GAAI,GAAGA,EAAE,OAAOzJ,EAAE1C,EAAE+L,EAAE,KAAKC,EAAE,IAAIkD,EAAEnD,EAAE,GAAGC,GAAG,EAAyB,GAAvBG,EAAE,EAAEH,EAAE,KAAKA,EAAE,IAAIA,EAAE,IAAO9D,MAAMC,QAAQ4D,GAAG,IAAI,IAAIK,EAAE,EAAEA,EAAEL,EAAE5B,OAAOiC,IAAI,CAAQ,IAAIC,EAAEL,EAAEkD,EAAfjP,EAAE8L,EAAEK,GAAeA,GAAGD,GAAG8C,EAAEhP,EAAEoM,EAAE3J,EAAE1C,QAAQ,GAAiCqM,EAA9B,OAAON,GAAG,WAAAlK,EAAkBkK,GAAI,KAAmC,mBAA7BM,EAAER,GAAGE,EAAEF,IAAIE,EAAE,eAAsCM,EAAE,KAAM,mBAAoBA,EAAE,IAAIN,EAAEM,EAAEvM,KAAKiM,GAAGK,EACpf,IAAInM,EAAE8L,EAAEhE,QAAQC,MAA6BmE,GAAG8C,EAA1BhP,EAAEA,EAAEW,MAAMyL,EAAEL,EAAEkD,EAAEjP,EAAEmM,KAAc1J,EAAE1C,OAAO,WAAWC,GAAW6L,EAAE,KAAK,oBAAdpJ,EAAE,GAAGqJ,GAA+B,qBAAqB1L,OAAO6D,KAAK6H,GAAGnF,KAAK,MAAM,IAAIlE,EAAE,IAAK,OAAOyJ,EAAqC8C,CAAElD,EAAE,GAAGC,EAAEtJ,GAAG,SAASwM,EAAEnD,EAAEC,GAAG,MAAM,WAAAnK,EAAkBkK,IAAG,OAAOA,GAAG,MAAMA,EAAE7K,IAHjI,SAAgB6K,GAAG,IAAIC,GAAGmD,IAAI,KAAKC,IAAI,MAAM,MAAM,KAAK,GAAGrD,GAAGzF,QAAQ,QAAQ,SAASyF,GAAG,OAAOC,EAAED,KAGkCsD,CAAOtD,EAAE7K,KAAK8K,EAAE1I,SAAS,IAAI,SAASgM,EAAGvD,EAAEC,GAAGD,EAAE8C,KAAK/O,KAAKiM,EAAEgB,QAAQf,EAAED,EAAE+C,SAC7W,SAASS,EAAGxD,EAAEC,EAAEtJ,GAAG,IAAI1C,EAAE+L,EAAErD,OAAOzI,EAAE8L,EAAE6C,UAAU7C,EAAEA,EAAE8C,KAAK/O,KAAKiM,EAAEgB,QAAQf,EAAED,EAAE+C,SAAS5G,MAAMC,QAAQ4D,GAAGyD,EAAEzD,EAAE/L,EAAE0C,EAAE,SAASqJ,GAAG,OAAOA,IAAI,MAAMA,IAAIwC,EAAExC,KAAKA,EAJtJ,SAAYA,EAAEC,GAAG,OAAOqC,SAAS5M,EAAE6D,KAAKyG,EAAEzG,KAAKpE,IAAI8K,EAAE+B,IAAIhC,EAAEgC,IAAIjB,MAAMf,EAAEe,MAAMwB,OAAOvC,EAAEuC,QAIkEmB,CAAG1D,EAAE9L,IAAI8L,EAAE7K,KAAK8K,GAAGA,EAAE9K,MAAM6K,EAAE7K,IAAI,IAAI,GAAG6K,EAAE7K,KAAKoF,QAAQkI,EAAE,OAAO,KAAK9L,IAAI1C,EAAEoE,KAAK2H,IAAI,SAASyD,EAAEzD,EAAEC,EAAEtJ,EAAE1C,EAAEC,GAAG,IAAIkM,EAAE,GAAG,MAAMzJ,IAAIyJ,GAAG,GAAGzJ,GAAG4D,QAAQkI,EAAE,OAAO,KAAkBQ,EAAEjD,EAAEwD,EAAjBvD,EAAE0C,EAAE1C,EAAEG,EAAEnM,EAAEC,IAAa8O,EAAE/C,GAC7U,IAAI0D,GAAGC,UAAU/L,IAAI,SAASmI,EAAEC,EAAEtJ,GAAG,GAAG,MAAMqJ,EAAE,OAAOA,EAAE,IAAI/L,KAAqB,OAAhBwP,EAAEzD,EAAE/L,EAAE,KAAKgM,EAAEtJ,GAAU1C,GAAG+D,QAAQ,SAASgI,EAAEC,EAAEtJ,GAAG,GAAG,MAAMqJ,EAAE,OAAOA,EAAqBiD,EAAEjD,EAAEuD,EAAvBtD,EAAE0C,EAAE,KAAK,KAAK1C,EAAEtJ,IAAaqM,EAAE/C,IAAI8C,MAAM,SAAS/C,GAAG,OAAOiD,EAAEjD,EAAE,WAAW,OAAO,MAAM,OAAO6D,QAAQ,SAAS7D,GAAG,IAAIC,KAAuC,OAAlCwD,EAAEzD,EAAEC,EAAE,KAAK,SAASD,GAAG,OAAOA,IAAWC,GAAG6D,KAAK,SAAS9D,GAAwB,OAArBwC,EAAExC,IAAUD,EAAE,OAAcC,IAAI+D,UAAU,WAAW,OAAOnC,QAAQ,OAAOoC,UAAUlD,EAAEmD,cAAc7C,EAAE8C,cAAc,SAASlE,EAAEC,GACjV,YADoV,IAASA,IAAIA,EAAE,OAAMD,GAAGsC,SAAS9C,EAAE2E,sBAAsBlE,EAC7fmE,cAAcpE,EAAEqE,eAAerE,EAAEsE,aAAa,EAAEC,SAAS,KAAKC,SAAS,OAAQD,UAAUjC,SAAS/C,EAAEkF,SAASzE,GAAUA,EAAEwE,SAASxE,GAAG0E,WAAW,SAAS1E,GAAG,OAAOsC,SAAS5C,EAAEiF,OAAO3E,IAAI4E,KAAK,SAAS5E,GAAG,OAAOsC,SAASzC,EAAEgF,MAAM7E,EAAE8E,SAAS,EAAEC,QAAQ,OAAOC,KAAK,SAAShF,EAAEC,GAAG,OAAOqC,SAAS1C,EAAErG,KAAKyG,EAAEiF,aAAQ,IAAShF,EAAE,KAAKA,IAAIiF,SAASxQ,EAAEyQ,WAAWrQ,EAAEsQ,SAASzF,EAAE0F,cAAclD,EAAEmD,aAAa,SAAStF,EAAEC,EAAEtJ,IAAG,OAAOqJ,QAAG,IAASA,IAAED,EAAE,MAAMC,GAAU,IAAI/L,OAAE,EAAOC,EAAEkL,KAAKY,EAAEe,OAAOX,EAAEJ,EAAE7K,IAAIkL,EAAEL,EAAEgC,IAAI1B,EAAEN,EAAEuC,OAC9e,GAAG,MAAMtC,EAAE,MAAC,IAASA,EAAE+B,MAAM3B,EAAEJ,EAAE+B,IAAI1B,EAAEqB,EAAEC,cAAS,IAAS3B,EAAE9K,MAAMiL,EAAE,GAAGH,EAAE9K,KAAK,IAAItB,OAAE,EAA4D,IAAII,KAAzD+L,EAAEzG,MAAMyG,EAAEzG,KAAK8I,eAAexO,EAAEmM,EAAEzG,KAAK8I,cAAuBpC,EAAE6B,EAAE/N,KAAKkM,EAAEhM,KAAK8N,EAAEtM,eAAexB,KAAKC,EAAED,QAAG,IAASgM,EAAEhM,SAAI,IAASJ,EAAEA,EAAEI,GAAGgM,EAAEhM,IAAyB,GAAG,KAAxBA,EAAEiM,UAAU9B,OAAO,GAAWlK,EAAEkO,SAASzL,OAAO,GAAG,EAAE1C,EAAE,CAACJ,EAAEsI,MAAMlI,GAAG,IAAI,IAAID,EAAE,EAAEA,EAAEC,EAAED,IAAIH,EAAEG,GAAGkM,UAAUlM,EAAE,GAAGE,EAAEkO,SAASvO,EAAE,OAAOyO,SAAS5M,EAAE6D,KAAKyG,EAAEzG,KAAKpE,IAAIiL,EAAE4B,IAAI3B,EAAEU,MAAM7M,EAAEqO,OAAOjC,IAAIiF,cAAc,SAASvF,GAAG,IAAIC,EAAEkC,EAAE/M,KAAK,KAAK4K,GAAY,OAATC,EAAE1G,KAAKyG,EAASC,GAAGuF,eAAehD,EAAEiD,QAAQ,SAC1fC,oDAAoDC,kBAAkBhE,EAAEiE,OAAOxG,IAAIuE,EAAEkC,wBAAwBpG,EAAEkE,EAAEmC,kBAAkBxG,EAAE,IAAIyG,GAAGC,QAAQrC,GAAGsC,EAAEF,GAAGpC,GAAGoC,EAAEpS,EAAOD,QAAQuS,EAAC,SAAUA;;;;;ECf3L,IAAIC,EAAwB5R,OAAO4R,sBAC/BzQ,EAAiBnB,OAAOkB,UAAUC,eAClC0Q,EAAmB7R,OAAOkB,UAAU4Q,qBAsDxCzS,EAAOD,QA5CP,WACC,IACC,IAAKY,OAAOsR,OACX,OAAO,EAMR,IAAIS,EAAQ,IAAIxK,OAAO,OAEvB,GADAwK,EAAM,GAAK,KACkC,MAAzC/R,OAAOgI,oBAAoB+J,GAAO,GACrC,OAAO,EAKR,IADA,IAAIC,KACK1S,EAAI,EAAGA,EAAI,GAAIA,IACvB0S,EAAM,IAAMzK,OAAOwC,aAAazK,IAAMA,EAKvC,GAAwB,eAHXU,OAAOgI,oBAAoBgK,GAAOzO,IAAI,SAAUxC,GAC5D,OAAOiR,EAAMjR,KAEHwF,KAAK,IACf,OAAO,EAIR,IAAI0L,KAIJ,MAHA,uBAAuB/L,MAAM,IAAIxC,QAAQ,SAAUwO,GAClDD,EAAMC,GAAUA,IAGf,yBADElS,OAAO6D,KAAK7D,OAAOsR,UAAWW,IAAQ1L,KAAK,IAM9C,MAAO4L,GAER,OAAO,GAIQC,GAAoBpS,OAAOsR,OAAS,SAAUe,EAAQC,GAKtE,IAJA,IAAIC,EAEAC,EADAC,EAtDL,SAAkBC,GACjB,GAAY,OAARA,QAAwB9K,IAAR8K,EACnB,MAAM,IAAI7L,UAAU,yDAGrB,OAAO7G,OAAO0S,GAiDLC,CAASN,GAGThR,EAAI,EAAGA,EAAIuK,UAAU9B,OAAQzI,IAAK,CAG1C,IAAK,IAAIR,KAFT0R,EAAOvS,OAAO4L,UAAUvK,IAGnBF,EAAe1B,KAAK8S,EAAM1R,KAC7B4R,EAAG5R,GAAO0R,EAAK1R,IAIjB,GAAI+Q,EAAuB,CAC1BY,EAAUZ,EAAsBW,GAChC,IAAK,IAAIjT,EAAI,EAAGA,EAAIkT,EAAQ1I,OAAQxK,IAC/BuS,EAAiBpS,KAAK8S,EAAMC,EAAQlT,MACvCmT,EAAGD,EAAQlT,IAAMiT,EAAKC,EAAQlT,MAMlC,OAAOmT,kBCxFRpT,EAAOD,QAAU,SAASC,GAoBzB,OAnBKA,EAAOuT,kBACXvT,EAAOwT,UAAY,aACnBxT,EAAOyT,SAEFzT,EAAOyO,WAAUzO,EAAOyO,aAC7B9N,OAAOC,eAAeZ,EAAQ,UAC7Ba,YAAY,EACZC,IAAK,WACJ,OAAOd,EAAOE,KAGhBS,OAAOC,eAAeZ,EAAQ,MAC7Ba,YAAY,EACZC,IAAK,WACJ,OAAOd,EAAOC,KAGhBD,EAAOuT,gBAAkB,GAEnBvT,y3EChBD0T,EAAuBC,GAAGC,KAA1BF,SACAG,EAAuBF,GAAGG,WAA1BD,SACuBF,GAAGI,QAA1BxC,aAAUlB,cACV2D,EAAuBL,GAAGM,KAA1BD,GACApS,EAAuBsS,OAAvBtS,SAEDuS,kBAA6B9D,2KAEjC+D,UAAW,KACXC,IAAKL,EAAG,wCAaQ,WAChBM,EAAKC,YAAYD,EAAKlH,MAAMoH,UAC1BpK,KAAK,SAAAgK,GAAS,OAAIE,EAAK3G,UAAUyG,gBADnC,MAEQ,SAACtB,GAAD,OAAS2B,QAAQC,IAAI5B,IAAQwB,EAAK3G,UAAU0G,IAAKL,EAAG,mDAG/C,SAAAQ,GACb,IAAMZ,EAAO,IAAIxR,IAKjB,OAHAwR,EAAK9P,OAAO,SAAU,aACtB8P,EAAK9P,OAAO,WAAY0Q,GAEjB9R,IAAMiS,gBAAgBlP,KAE3BkC,OAAQ,OACRzC,KAAM0O,EACNpO,SACCoP,OAAU,sBAGXxK,KAAK,SAAAyK,GAAG,OAAIA,EAAIhK,SAChBT,KAAKxI,EAAS,6EA/BEkT,GACdrS,KAAK2K,MAAMoH,WAAaM,EAAUN,UACrC/R,KAAKsS,6DAKNtS,KAAKsS,kDA2BG,IACDV,EAAO5R,KAAKuS,MAAZX,IAODY,EAAKxS,KAAKuS,MAAMZ,UAAYc,EAAA7I,EAAAqF,cAAA,OAAKyD,IAAK1S,KAAKuS,MAAMZ,YAAec,EAAA7I,EAAAqF,cAAA,YAAO2C,GAE7E,OACCa,EAAA7I,EAAAqF,cAAA,OAAK0D,OAPLC,WAAY,MACZC,cAAe,QAMKL,YAKFM,kBAAyBlF,cAE7C,SAAAkF,EAAYnI,GAAO,IAAAoI,EAAA,OAAAC,EAAAhT,KAAA8S,GAAAG,EAAAC,EAClBH,EAAAI,EAAAxV,KAAAqC,KAAM2K,IADY,kBASD,SAAAyI,GACjBC,IAAIC,uBAAyBP,EAAKQ,sBAClCC,QACC,6BACAC,mBAAmBC,UAAUvP,QAAQ,YAAa4O,EAAKpI,MAAMgJ,kBAb5CV,EAAAC,EAAAH,GAAA,oBAiBC,SAAAK,GACnB,IAAMQ,EAAIC,OACNd,EAAKpI,MAAMiJ,UACdE,mBAAoB,EACpBC,eAAgB,IAEjBhB,EAAK7H,UACJ8I,OAAQ,IAET/C,EAAS,eAAegD,UAAUL,WA1BhBX,EAAAC,EAAAH,GAAA,wBA6BK,SAAAmB,GACvBC,YACA,IAAMP,EAAIC,OACNd,EAAKpI,MAAMiJ,UACdE,mBAAoBM,SAASF,KAE9BnB,EAAK7H,UACJ8I,OAAQJ,EAAKE,qBAEd7C,EAAS,eAAegD,UAAUL,WAnClCb,EAAKR,OACJyB,OAAQrJ,EAAMiJ,KAAKE,mBACnBO,SAAU1J,EAAM2J,iBALCvB,6CA0ClB,OACCN,EAAA7I,EAAAqF,cAACH,EAAD,KACC2D,EAAA7I,EAAAqF,cAACmC,GAAOuB,OAAQ4B,UAAW,QACzBC,QAASxU,KAAKyU,gBACdC,UAAU,sCACVnD,EAAG,+BAGJvR,KAAKuS,MAAMyB,OAAS,GAAKhU,KAAK2K,MAAMiJ,KAAKE,qBAAuB9T,KAAKuS,MAAMyB,OAC3EvB,EAAA7I,EAAAqF,cAACH,EAAD,KACC2D,EAAA7I,EAAAqF,cAAC0F,GAAqB5C,SAAU/R,KAAKuS,MAAMyB,SAC3CvB,EAAA7I,EAAAqF,cAACmC,GAAOoD,QAASxU,KAAK4U,kBACpBF,UAAU,0BACVnD,EAAG,2BAGJ,gOC3HAsD,EAAY3D,GAAGC,KAAf0D,OACA/F,EAAYoC,GAAGI,QAAfxC,SAcPoC,GAAG4D,MAAMC,UAAU,2BAA4B,iCAZ/C,SAAiCC,GAC7B,OAAO,SAACrK,GACJ,IAAMiJ,EAAOiB,EAAO,eAAeI,wBAAwB,QAC3D,OACIxC,EAAA7I,EAAAqF,cAACiG,EAAD,KACIzC,EAAA7I,EAAAqF,cAAC+F,EAAsBrK,GACvB8H,EAAA7I,EAAAqF,cAACkG,EAADC,KAAsBzK,GAAOiJ,KAAMA","file":"post-thumbnail.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 6);\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react.production.min.js');\n} else {\n module.exports = require('./cjs/react.development.js');\n}\n","/* eslint-env browser */\nmodule.exports = typeof self == 'object' ? self.FormData : window.FormData;\n","var __root__ = (function (root) {\nfunction F() { this.fetch = false; }\nF.prototype = root;\nreturn new F();\n})(typeof self !== 'undefined' ? self : this);\n(function(self) {\n\n(function(self) {\n\n if (self.fetch) {\n return\n }\n\n var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob();\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n };\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ];\n\n var isDataView = function(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n };\n\n var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n };\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name);\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value);\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift();\n return {done: value === undefined, value: value}\n }\n };\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n };\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {};\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value);\n }, this);\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n this.append(header[0], header[1]);\n }, this);\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name]);\n }, this);\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name);\n value = normalizeValue(value);\n var oldValue = this.map[name];\n this.map[name] = oldValue ? oldValue+','+value : value;\n };\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)];\n };\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name);\n return this.has(name) ? this.map[name] : null\n };\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n };\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value);\n };\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this);\n }\n }\n };\n\n Headers.prototype.keys = function() {\n var items = [];\n this.forEach(function(value, name) { items.push(name); });\n return iteratorFor(items)\n };\n\n Headers.prototype.values = function() {\n var items = [];\n this.forEach(function(value) { items.push(value); });\n return iteratorFor(items)\n };\n\n Headers.prototype.entries = function() {\n var items = [];\n this.forEach(function(value, name) { items.push([name, value]); });\n return iteratorFor(items)\n };\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries;\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true;\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result);\n };\n reader.onerror = function() {\n reject(reader.error);\n };\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader();\n var promise = fileReaderReady(reader);\n reader.readAsArrayBuffer(blob);\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader();\n var promise = fileReaderReady(reader);\n reader.readAsText(blob);\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf);\n var chars = new Array(view.length);\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i]);\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength);\n view.set(new Uint8Array(buf));\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false;\n\n this._initBody = function(body) {\n this._bodyInit = body;\n if (!body) {\n this._bodyText = '';\n } else if (typeof body === 'string') {\n this._bodyText = body;\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body;\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body;\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString();\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer);\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer]);\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body);\n } else {\n throw new Error('unsupported BodyInit type')\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8');\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type);\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n }\n };\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this);\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n };\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n };\n }\n\n this.text = function() {\n var rejected = consumed(this);\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n };\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n };\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n };\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase();\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {};\n var body = options.body;\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url;\n this.credentials = input.credentials;\n if (!options.headers) {\n this.headers = new Headers(input.headers);\n }\n this.method = input.method;\n this.mode = input.mode;\n if (!body && input._bodyInit != null) {\n body = input._bodyInit;\n input.bodyUsed = true;\n }\n } else {\n this.url = String(input);\n }\n\n this.credentials = options.credentials || this.credentials || 'omit';\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers);\n }\n this.method = normalizeMethod(options.method || this.method || 'GET');\n this.mode = options.mode || this.mode || null;\n this.referrer = null;\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body);\n }\n\n Request.prototype.clone = function() {\n return new Request(this, { body: this._bodyInit })\n };\n\n function decode(body) {\n var form = new FormData();\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=');\n var name = split.shift().replace(/\\+/g, ' ');\n var value = split.join('=').replace(/\\+/g, ' ');\n form.append(decodeURIComponent(name), decodeURIComponent(value));\n }\n });\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers();\n // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n // https://tools.ietf.org/html/rfc7230#section-3.2\n var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ');\n preProcessedHeaders.split(/\\r?\\n/).forEach(function(line) {\n var parts = line.split(':');\n var key = parts.shift().trim();\n if (key) {\n var value = parts.join(':').trim();\n headers.append(key, value);\n }\n });\n return headers\n }\n\n Body.call(Request.prototype);\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {};\n }\n\n this.type = 'default';\n this.status = options.status === undefined ? 200 : options.status;\n this.ok = this.status >= 200 && this.status < 300;\n this.statusText = 'statusText' in options ? options.statusText : 'OK';\n this.headers = new Headers(options.headers);\n this.url = options.url || '';\n this._initBody(bodyInit);\n }\n\n Body.call(Response.prototype);\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n };\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''});\n response.type = 'error';\n return response\n };\n\n var redirectStatuses = [301, 302, 303, 307, 308];\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n };\n\n self.Headers = Headers;\n self.Request = Request;\n self.Response = Response;\n\n self.fetch = function(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init);\n var xhr = new XMLHttpRequest();\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n };\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');\n var body = 'response' in xhr ? xhr.response : xhr.responseText;\n resolve(new Response(body, options));\n };\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'));\n };\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'));\n };\n\n xhr.open(request.method, request.url, true);\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true;\n } else if (request.credentials === 'omit') {\n xhr.withCredentials = false;\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob';\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value);\n });\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);\n })\n };\n self.fetch.polyfill = true;\n})(typeof self !== 'undefined' ? self : this);\n}).call(__root__, void(0));\nvar fetch = __root__.fetch;\nvar Response = fetch.Response = __root__.Response;\nvar Request = fetch.Request = __root__.Request;\nvar Headers = fetch.Headers = __root__.Headers;\nif (typeof module === 'object' && module.exports) {\nmodule.exports = fetch;\n// Needed for TypeScript consumers without esModuleInterop.\nmodule.exports.default = fetch;\n}\n","/** @license React v16.6.1\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';var k=require(\"object-assign\"),n=\"function\"===typeof Symbol&&Symbol.for,p=n?Symbol.for(\"react.element\"):60103,q=n?Symbol.for(\"react.portal\"):60106,r=n?Symbol.for(\"react.fragment\"):60107,t=n?Symbol.for(\"react.strict_mode\"):60108,u=n?Symbol.for(\"react.profiler\"):60114,v=n?Symbol.for(\"react.provider\"):60109,w=n?Symbol.for(\"react.context\"):60110,x=n?Symbol.for(\"react.concurrent_mode\"):60111,y=n?Symbol.for(\"react.forward_ref\"):60112,z=n?Symbol.for(\"react.suspense\"):60113,A=n?Symbol.for(\"react.memo\"):\n60115,B=n?Symbol.for(\"react.lazy\"):60116,C=\"function\"===typeof Symbol&&Symbol.iterator;function aa(a,b,e,c,d,g,h,f){if(!a){a=void 0;if(void 0===b)a=Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\");else{var l=[e,c,d,g,h,f],m=0;a=Error(b.replace(/%s/g,function(){return l[m++]}));a.name=\"Invariant Violation\"}a.framesToPop=1;throw a;}}\nfunction D(a){for(var b=arguments.length-1,e=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=0;c<b;c++)e+=\"&args[]=\"+encodeURIComponent(arguments[c+1]);aa(!1,\"Minified React error #\"+a+\"; visit %s for the full message or use the non-minified dev environment for full errors and additional helpful warnings. \",e)}var E={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},F={};\nfunction G(a,b,e){this.props=a;this.context=b;this.refs=F;this.updater=e||E}G.prototype.isReactComponent={};G.prototype.setState=function(a,b){\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a?D(\"85\"):void 0;this.updater.enqueueSetState(this,a,b,\"setState\")};G.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};function H(){}H.prototype=G.prototype;function I(a,b,e){this.props=a;this.context=b;this.refs=F;this.updater=e||E}var J=I.prototype=new H;\nJ.constructor=I;k(J,G.prototype);J.isPureReactComponent=!0;var K={current:null,currentDispatcher:null},L=Object.prototype.hasOwnProperty,M={key:!0,ref:!0,__self:!0,__source:!0};\nfunction N(a,b,e){var c=void 0,d={},g=null,h=null;if(null!=b)for(c in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(g=\"\"+b.key),b)L.call(b,c)&&!M.hasOwnProperty(c)&&(d[c]=b[c]);var f=arguments.length-2;if(1===f)d.children=e;else if(1<f){for(var l=Array(f),m=0;m<f;m++)l[m]=arguments[m+2];d.children=l}if(a&&a.defaultProps)for(c in f=a.defaultProps,f)void 0===d[c]&&(d[c]=f[c]);return{$$typeof:p,type:a,key:g,ref:h,props:d,_owner:K.current}}\nfunction ba(a,b){return{$$typeof:p,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function O(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===p}function escape(a){var b={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+(\"\"+a).replace(/[=:]/g,function(a){return b[a]})}var P=/\\/+/g,Q=[];function R(a,b,e,c){if(Q.length){var d=Q.pop();d.result=a;d.keyPrefix=b;d.func=e;d.context=c;d.count=0;return d}return{result:a,keyPrefix:b,func:e,context:c,count:0}}\nfunction S(a){a.result=null;a.keyPrefix=null;a.func=null;a.context=null;a.count=0;10>Q.length&&Q.push(a)}\nfunction T(a,b,e,c){var d=typeof a;if(\"undefined\"===d||\"boolean\"===d)a=null;var g=!1;if(null===a)g=!0;else switch(d){case \"string\":case \"number\":g=!0;break;case \"object\":switch(a.$$typeof){case p:case q:g=!0}}if(g)return e(c,a,\"\"===b?\".\"+U(a,0):b),1;g=0;b=\"\"===b?\".\":b+\":\";if(Array.isArray(a))for(var h=0;h<a.length;h++){d=a[h];var f=b+U(d,h);g+=T(d,f,e,c)}else if(null===a||\"object\"!==typeof a?f=null:(f=C&&a[C]||a[\"@@iterator\"],f=\"function\"===typeof f?f:null),\"function\"===typeof f)for(a=f.call(a),h=\n0;!(d=a.next()).done;)d=d.value,f=b+U(d,h++),g+=T(d,f,e,c);else\"object\"===d&&(e=\"\"+a,D(\"31\",\"[object Object]\"===e?\"object with keys {\"+Object.keys(a).join(\", \")+\"}\":e,\"\"));return g}function V(a,b,e){return null==a?0:T(a,\"\",b,e)}function U(a,b){return\"object\"===typeof a&&null!==a&&null!=a.key?escape(a.key):b.toString(36)}function ca(a,b){a.func.call(a.context,b,a.count++)}\nfunction da(a,b,e){var c=a.result,d=a.keyPrefix;a=a.func.call(a.context,b,a.count++);Array.isArray(a)?W(a,c,e,function(a){return a}):null!=a&&(O(a)&&(a=ba(a,d+(!a.key||b&&b.key===a.key?\"\":(\"\"+a.key).replace(P,\"$&/\")+\"/\")+e)),c.push(a))}function W(a,b,e,c,d){var g=\"\";null!=e&&(g=(\"\"+e).replace(P,\"$&/\")+\"/\");b=R(b,g,c,d);V(a,da,b);S(b)}\nvar X={Children:{map:function(a,b,e){if(null==a)return a;var c=[];W(a,c,null,b,e);return c},forEach:function(a,b,e){if(null==a)return a;b=R(null,null,b,e);V(a,ca,b);S(b)},count:function(a){return V(a,function(){return null},null)},toArray:function(a){var b=[];W(a,b,null,function(a){return a});return b},only:function(a){O(a)?void 0:D(\"143\");return a}},createRef:function(){return{current:null}},Component:G,PureComponent:I,createContext:function(a,b){void 0===b&&(b=null);a={$$typeof:w,_calculateChangedBits:b,\n_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null};a.Provider={$$typeof:v,_context:a};return a.Consumer=a},forwardRef:function(a){return{$$typeof:y,render:a}},lazy:function(a){return{$$typeof:B,_ctor:a,_status:-1,_result:null}},memo:function(a,b){return{$$typeof:A,type:a,compare:void 0===b?null:b}},Fragment:r,StrictMode:t,Suspense:z,createElement:N,cloneElement:function(a,b,e){null===a||void 0===a?D(\"267\",a):void 0;var c=void 0,d=k({},a.props),g=a.key,h=a.ref,f=a._owner;\nif(null!=b){void 0!==b.ref&&(h=b.ref,f=K.current);void 0!==b.key&&(g=\"\"+b.key);var l=void 0;a.type&&a.type.defaultProps&&(l=a.type.defaultProps);for(c in b)L.call(b,c)&&!M.hasOwnProperty(c)&&(d[c]=void 0===b[c]&&void 0!==l?l[c]:b[c])}c=arguments.length-2;if(1===c)d.children=e;else if(1<c){l=Array(c);for(var m=0;m<c;m++)l[m]=arguments[m+2];d.children=l}return{$$typeof:p,type:a.type,key:g,ref:h,props:d,_owner:f}},createFactory:function(a){var b=N.bind(null,a);b.type=a;return b},isValidElement:O,version:\"16.6.3\",\n__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{ReactCurrentOwner:K,assign:k}};X.unstable_ConcurrentMode=x;X.unstable_Profiler=u;var Y={default:X},Z=Y&&X||Y;module.exports=Z.default||Z;\n","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","import React from \"react\";\nimport FormData from \"form-data\";\nimport fetch from \"cross-fetch\";\n\nconst {dispatch} = wp.data;\nconst {Button} = wp.components\nconst {Fragment, Component} = wp.element\nconst {__} = wp.i18n\nconst {property} = lodash\n\nclass NGGFeaturedThumbnail extends Component {\n\tstate = {\n\t\timage_url: null,\n\t\tmsg: __('Loading...')\n\t}\n\n\tcomponentDidUpdate(prevProps) {\n\t\tif (this.props.image_id !== prevProps.image_id) {\n\t\t\tthis.updateImageUrl();\n\t\t}\n\t}\n\n\tcomponentDidMount() {\n\t\tthis.updateImageUrl();\n\t}\n\n\tupdateImageUrl = () => {\n\t\tthis.getImageUrl(this.props.image_id)\n\t\t\t.then(image_url => this.setState({image_url}))\n\t\t\t.catch((err) => console.log(err) && this.setState({msg: __(\"Could not load image\")}));\n\t}\n\n\tgetImageUrl = image_id => {\n\t\tconst data = new FormData();\n\n\t\tdata.append('action', 'get_image');\n\t\tdata.append('image_id', image_id);\n\n\t\treturn fetch(photocrati_ajax.url,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: data,\n\t\t\t\theaders: {\n\t\t\t\t\t'Accept': 'application/json'\n\t\t\t\t}\n\t\t\t})\n\t\t\t.then(res => res.json())\n\t\t\t.then(property('image.image_url'));\n\t}\n\n\trender() {\n\t\tconst {msg} = this.state;\n\n\t\tconst style = {\n\t\t\tpaddingTop: '5px',\n\t\t\tpaddingBottom: '5px'\n\t\t};\n\n\t\tconst el = this.state.image_url ? <img src={this.state.image_url}/> : <span>{msg}</span>;\n\n\t\treturn (\n\t\t\t<div style={style}>{el}</div>\n\t\t);\n\t}\n}\n\nexport default class NGGFeaturedImage extends Component {\n\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.state = {\n\t\t\tngg_id: props.meta.ngg_post_thumbnail,\n\t\t\twp_ml_id: props.featuredImageId\n\t\t}\n\t}\n\n\thandleOpenClick = event => {\n\t\ttop.set_ngg_post_thumbnail = this.onUpdatePostThumbnail;\n\t\ttb_show(\n\t\t\t\"Set NextGEN Featured Image\",\n\t\t\tngg_featured_image.modal_url.replace(/%post_id%/, this.props.currentPostId)\n\t\t);\n\t}\n\n\thandleRemoveClick = event => {\n\t\tconst meta = {\n\t\t\t...this.props.meta,\n\t\t\tngg_post_thumbnail: 0,\n\t\t\tfeatured_media: 0\n\t\t};\n\t\tthis.setState({\n\t\t\tngg_id: 0\n\t\t});\n\t\tdispatch('core/editor').editPost({meta});\n\t}\n\n\tonUpdatePostThumbnail = ngg_image_id => {\n\t\ttb_remove()\n\t\tconst meta = {\n\t\t\t...this.props.meta,\n\t\t\tngg_post_thumbnail: parseInt(ngg_image_id)\n\t\t};\n\t\tthis.setState({\n\t\t\tngg_id: meta.ngg_post_thumbnail\n\t\t});\n\t\tdispatch('core/editor').editPost({meta});\n\t}\n\n\trender() {\n\t\treturn (\n\t\t\t<Fragment>\n\t\t\t\t<Button style={{marginTop: '10px'}}\n\t\t\t\t\t\tonClick={this.handleOpenClick}\n\t\t\t\t\t\tclassName=\"editor-post-featured-image__toggle\">\n\t\t\t\t\t{__('Set NextGEN Featured Image')}\n\t\t\t\t</Button>\n\n\t\t\t\t{this.state.ngg_id > 0 && this.props.meta.ngg_post_thumbnail !== this.state.ngg_id ?\n\t\t\t\t\t<Fragment>\n\t\t\t\t\t\t<NGGFeaturedThumbnail image_id={this.state.ngg_id}/>\n\t\t\t\t\t\t<Button onClick={this.handleRemoveClick}\n\t\t\t\t\t\t\t\tclassName=\"is-link is-destructive\">\n\t\t\t\t\t\t\t{__('Remove featured image')}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</Fragment>\n\t\t\t\t\t: ''}\n\t\t\t</Fragment>\n\t\t);\n\t}\n}","import React from \"react\";\nimport NGGFeaturedImage from './components/ngg-post-thumbnail.jsx';\n\nconst {select} = wp.data;\nconst {Fragment} = wp.element\n\nfunction setFeaturedImageDisplay(OriginalComponent) {\n return (props) => {\n const meta = select('core/editor').getCurrentPostAttribute('meta');\n return (\n <Fragment>\n <OriginalComponent {...props}/>\n <NGGFeaturedImage {...props} meta={meta}/>\n </Fragment>\n );\n }\n}\n\nwp.hooks.addFilter('editor.PostFeaturedImage', 'imagely/featured-image-display', setFeaturedImageDisplay);"],"sourceRoot":""}
1
+ {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/react/index.js","webpack:///./node_modules/form-data/lib/browser.js","webpack:///./node_modules/cross-fetch/dist/browser-ponyfill.js","webpack:///./node_modules/react/cjs/react.production.min.js","webpack:///./node_modules/object-assign/index.js","webpack:///(webpack)/buildin/module.js","webpack:///./build/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/src/components/ngg-post-thumbnail.jsx","webpack:///./build/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/src/post-thumbnail.jsx"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","require","self","_typeof","FormData","window","__root__","root","F","this","fetch","support","searchParams","iterable","blob","Blob","e","formData","arrayBuffer","viewClasses","isDataView","obj","DataView","isPrototypeOf","isArrayBufferView","ArrayBuffer","isView","indexOf","toString","Headers","append","normalizeName","normalizeValue","oldValue","map","has","set","forEach","callback","thisArg","keys","items","push","iteratorFor","values","entries","iterator","methods","Request","clone","body","_bodyInit","Body","Response","status","statusText","headers","url","error","response","type","redirectStatuses","redirect","RangeError","location","input","init","Promise","resolve","reject","request","xhr","XMLHttpRequest","onload","options","rawHeaders","replace","split","line","parts","shift","trim","join","parseHeaders","getAllResponseHeaders","responseURL","responseText","onerror","TypeError","ontimeout","open","method","credentials","withCredentials","responseType","setRequestHeader","send","polyfill","String","test","toLowerCase","next","done","undefined","Array","isArray","header","getOwnPropertyNames","consumed","bodyUsed","fileReaderReady","reader","result","readBlobAsArrayBuffer","FileReader","promise","readAsArrayBuffer","bufferClone","buf","slice","view","Uint8Array","byteLength","buffer","_initBody","_bodyText","_bodyBlob","_bodyFormData","URLSearchParams","_bodyArrayBuffer","Error","rejected","then","text","readAsText","readBlobAsText","chars","length","fromCharCode","readArrayBufferAsText","decode","json","JSON","parse","upcased","toUpperCase","normalizeMethod","referrer","form","bytes","decodeURIComponent","bodyInit","ok","k","q","u","v","w","x","y","z","A","B","C","D","a","b","arguments","encodeURIComponent","g","h","f","framesToPop","aa","E","isMounted","enqueueForceUpdate","enqueueReplaceState","enqueueSetState","G","props","context","refs","updater","H","I","isReactComponent","setState","forceUpdate","J","constructor","isPureReactComponent","K","current","currentDispatcher","L","M","ref","__self","__source","N","children","defaultProps","$$typeof","_owner","O","P","Q","R","pop","keyPrefix","func","count","S","V","T","U","=",":","escape","ca","da","W","ba","X","Children","toArray","only","createRef","Component","PureComponent","createContext","_calculateChangedBits","_currentValue","_currentValue2","_threadCount","Provider","Consumer","_context","forwardRef","render","lazy","_ctor","_status","_result","memo","compare","Fragment","StrictMode","Suspense","createElement","cloneElement","createFactory","isValidElement","version","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","ReactCurrentOwner","assign","unstable_ConcurrentMode","unstable_Profiler","Y","default","Z","getOwnPropertySymbols","propIsEnumerable","propertyIsEnumerable","test1","test2","test3","letter","err","shouldUseNative","target","source","from","symbols","to","val","toObject","webpackPolyfill","deprecate","paths","dispatch","wp","data","Button","components","element","__","i18n","lodash","NGGFeaturedThumbnail","image_url","msg","_this","getImageUrl","image_id","console","log","photocrati_ajax","Accept","res","prevProps","updateImageUrl","state","el","react_default","src","style","paddingTop","paddingBottom","NGGFeaturedImage","_this2","_classCallCheck","_defineProperty","_assertThisInitialized","_super2","event","top","set_ngg_post_thumbnail","onUpdatePostThumbnail","tb_show","ngg_featured_image","modal_url","currentPostId","meta","_objectSpread","ngg_post_thumbnail","featured_media","ngg_id","editPost","ngg_image_id","tb_remove","parseInt","wp_ml_id","featuredImageId","marginTop","onClick","handleOpenClick","className","ngg_post_thumbnail_NGGFeaturedThumbnail","handleRemoveClick","select","hooks","addFilter","OriginalComponent","featuredImageWidget","getCurrentPostAttribute","ngg_post_thumbnail_NGGFeaturedImage","_extends","post_thumbnail_Fragment"],"mappings":"aACA,IAAAA,KAGA,SAAAC,EAAAC,GAGA,GAAAF,EAAAE,GACA,OAAAF,EAAAE,GAAAC,QAGA,IAAAC,EAAAJ,EAAAE,IACAG,EAAAH,EACAI,GAAA,EACAH,YAUA,OANAI,EAAAL,GAAAM,KAAAJ,EAAAD,QAAAC,IAAAD,QAAAF,GAGAG,EAAAE,GAAA,EAGAF,EAAAD,QAKAF,EAAAQ,EAAAF,EAGAN,EAAAS,EAAAV,EAGAC,EAAAU,EAAA,SAAAR,EAAAS,EAAAC,GACAZ,EAAAa,EAAAX,EAAAS,IACAG,OAAAC,eAAAb,EAAAS,GAA0CK,YAAA,EAAAC,IAAAL,KAK1CZ,EAAAkB,EAAA,SAAAhB,GACA,oBAAAiB,eAAAC,aACAN,OAAAC,eAAAb,EAAAiB,OAAAC,aAAwDC,MAAA,WAExDP,OAAAC,eAAAb,EAAA,cAAiDmB,OAAA,KAQjDrB,EAAAsB,EAAA,SAAAD,EAAAE,GAEA,GADA,EAAAA,IAAAF,EAAArB,EAAAqB,IACA,EAAAE,EAAA,OAAAF,EACA,KAAAE,GAAA,iBAAAF,QAAAG,WAAA,OAAAH,EACA,IAAAI,EAAAX,OAAAY,OAAA,MAGA,GAFA1B,EAAAkB,EAAAO,GACAX,OAAAC,eAAAU,EAAA,WAAyCT,YAAA,EAAAK,UACzC,EAAAE,GAAA,iBAAAF,EAAA,QAAAM,KAAAN,EAAArB,EAAAU,EAAAe,EAAAE,EAAA,SAAAA,GAAgH,OAAAN,EAAAM,IAAqBC,KAAA,KAAAD,IACrI,OAAAF,GAIAzB,EAAA6B,EAAA,SAAA1B,GACA,IAAAS,EAAAT,KAAAqB,WACA,WAA2B,OAAArB,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAH,EAAAU,EAAAE,EAAA,IAAAA,GACAA,GAIAZ,EAAAa,EAAA,SAAAiB,EAAAC,GAAsD,OAAAjB,OAAAkB,UAAAC,eAAA1B,KAAAuB,EAAAC,IAGtD/B,EAAAkC,EAAA,GAIAlC,IAAAmC,EAAA,kCC/EEhC,EAAOD,QAAUkC,EAAQ,iRCF3BjC,EAAOD,QAAyB,WAAf,oBAAOmC,KAAP,YAAAC,EAAOD,OAAmBA,KAAKE,SAAWC,OAAOD,sSCDlE,IAAIE,EAAY,SAAUC,GAC1B,SAASC,IAAMC,KAAKC,OAAQ,EAE5B,OADAF,EAAEX,UAAYU,EACP,IAAIC,EAHK,CAIG,oBAATN,KAAuBA,KAAOO,OACxC,SAAUP,IAEV,SAAUA,GAER,IAAIA,EAAKQ,MAAT,CAIA,IAAIC,GACFC,aAAc,oBAAqBV,EACnCW,SAAU,WAAYX,GAAQ,aAAclB,OAC5C8B,KAAM,eAAgBZ,GAAQ,SAAUA,GAAS,WAC/C,IAEE,OADA,IAAIa,MACG,EACP,MAAMC,GACN,OAAO,GALsC,GAQjDC,SAAU,aAAcf,EACxBgB,YAAa,gBAAiBhB,GAGhC,GAAIS,EAAQO,YACV,IAAIC,GACF,qBACA,sBACA,6BACA,sBACA,uBACA,sBACA,uBACA,wBACA,yBAGEC,EAAa,SAASC,GACxB,OAAOA,GAAOC,SAASzB,UAAU0B,cAAcF,IAG7CG,EAAoBC,YAAYC,QAAU,SAASL,GACrD,OAAOA,GAAOF,EAAYQ,QAAQhD,OAAOkB,UAAU+B,SAASxD,KAAKiD,KAAS,GAyD9EQ,EAAQhC,UAAUiC,OAAS,SAAStD,EAAMU,GACxCV,EAAOuD,EAAcvD,GACrBU,EAAQ8C,EAAe9C,GACvB,IAAI+C,EAAWxB,KAAKyB,IAAI1D,GACxBiC,KAAKyB,IAAI1D,GAAQyD,EAAWA,EAAS,IAAI/C,EAAQA,GAGnD2C,EAAQhC,UAAR,OAA8B,SAASrB,UAC9BiC,KAAKyB,IAAIH,EAAcvD,KAGhCqD,EAAQhC,UAAUf,IAAM,SAASN,GAE/B,OADAA,EAAOuD,EAAcvD,GACdiC,KAAK0B,IAAI3D,GAAQiC,KAAKyB,IAAI1D,GAAQ,MAG3CqD,EAAQhC,UAAUsC,IAAM,SAAS3D,GAC/B,OAAOiC,KAAKyB,IAAIpC,eAAeiC,EAAcvD,KAG/CqD,EAAQhC,UAAUuC,IAAM,SAAS5D,EAAMU,GACrCuB,KAAKyB,IAAIH,EAAcvD,IAASwD,EAAe9C,IAGjD2C,EAAQhC,UAAUwC,QAAU,SAASC,EAAUC,GAC7C,IAAK,IAAI/D,KAAQiC,KAAKyB,IAChBzB,KAAKyB,IAAIpC,eAAetB,IAC1B8D,EAASlE,KAAKmE,EAAS9B,KAAKyB,IAAI1D,GAAOA,EAAMiC,OAKnDoB,EAAQhC,UAAU2C,KAAO,WACvB,IAAIC,KAEJ,OADAhC,KAAK4B,QAAQ,SAASnD,EAAOV,GAAQiE,EAAMC,KAAKlE,KACzCmE,EAAYF,IAGrBZ,EAAQhC,UAAU+C,OAAS,WACzB,IAAIH,KAEJ,OADAhC,KAAK4B,QAAQ,SAASnD,GAASuD,EAAMC,KAAKxD,KACnCyD,EAAYF,IAGrBZ,EAAQhC,UAAUgD,QAAU,WAC1B,IAAIJ,KAEJ,OADAhC,KAAK4B,QAAQ,SAASnD,EAAOV,GAAQiE,EAAMC,MAAMlE,EAAMU,MAChDyD,EAAYF,IAGjB9B,EAAQE,WACVgB,EAAQhC,UAAUb,OAAO8D,UAAYjB,EAAQhC,UAAUgD,SAqJzD,IAAIE,GAAW,SAAU,MAAO,OAAQ,UAAW,OAAQ,OA4C3DC,EAAQnD,UAAUoD,MAAQ,WACxB,OAAO,IAAID,EAAQvC,MAAQyC,KAAMzC,KAAK0C,aAgCxCC,EAAKhF,KAAK4E,EAAQnD,WAgBlBuD,EAAKhF,KAAKiF,EAASxD,WAEnBwD,EAASxD,UAAUoD,MAAQ,WACzB,OAAO,IAAII,EAAS5C,KAAK0C,WACvBG,OAAQ7C,KAAK6C,OACbC,WAAY9C,KAAK8C,WACjBC,QAAS,IAAI3B,EAAQpB,KAAK+C,SAC1BC,IAAKhD,KAAKgD,OAIdJ,EAASK,MAAQ,WACf,IAAIC,EAAW,IAAIN,EAAS,MAAOC,OAAQ,EAAGC,WAAY,KAE1D,OADAI,EAASC,KAAO,QACTD,GAGT,IAAIE,GAAoB,IAAK,IAAK,IAAK,IAAK,KAE5CR,EAASS,SAAW,SAASL,EAAKH,GAChC,IAA0C,IAAtCO,EAAiBlC,QAAQ2B,GAC3B,MAAM,IAAIS,WAAW,uBAGvB,OAAO,IAAIV,EAAS,MAAOC,OAAQA,EAAQE,SAAUQ,SAAUP,MAGjEvD,EAAK2B,QAAUA,EACf3B,EAAK8C,QAAUA,EACf9C,EAAKmD,SAAWA,EAEhBnD,EAAKQ,MAAQ,SAASuD,EAAOC,GAC3B,OAAO,IAAIC,QAAQ,SAASC,EAASC,GACnC,IAAIC,EAAU,IAAItB,EAAQiB,EAAOC,GAC7BK,EAAM,IAAIC,eAEdD,EAAIE,OAAS,WACX,IAAIC,GACFpB,OAAQiB,EAAIjB,OACZC,WAAYgB,EAAIhB,WAChBC,QAxER,SAAsBmB,GACpB,IAAInB,EAAU,IAAI3B,EAYlB,OAT0B8C,EAAWC,QAAQ,eAAgB,KACzCC,MAAM,SAASxC,QAAQ,SAASyC,GAClD,IAAIC,EAAQD,EAAKD,MAAM,KACnBrF,EAAMuF,EAAMC,QAAQC,OACxB,GAAIzF,EAAK,CACP,IAAIN,EAAQ6F,EAAMG,KAAK,KAAKD,OAC5BzB,EAAQ1B,OAAOtC,EAAKN,MAGjBsE,EA2DQ2B,CAAaZ,EAAIa,yBAA2B,KAEvDV,EAAQjB,IAAM,gBAAiBc,EAAMA,EAAIc,YAAcX,EAAQlB,QAAQ1E,IAAI,iBAC3E,IAAIoE,EAAO,aAAcqB,EAAMA,EAAIZ,SAAWY,EAAIe,aAClDlB,EAAQ,IAAIf,EAASH,EAAMwB,KAG7BH,EAAIgB,QAAU,WACZlB,EAAO,IAAImB,UAAU,4BAGvBjB,EAAIkB,UAAY,WACdpB,EAAO,IAAImB,UAAU,4BAGvBjB,EAAImB,KAAKpB,EAAQqB,OAAQrB,EAAQb,KAAK,GAEV,YAAxBa,EAAQsB,YACVrB,EAAIsB,iBAAkB,EACW,SAAxBvB,EAAQsB,cACjBrB,EAAIsB,iBAAkB,GAGpB,iBAAkBtB,GAAO5D,EAAQG,OACnCyD,EAAIuB,aAAe,QAGrBxB,EAAQd,QAAQnB,QAAQ,SAASnD,EAAOV,GACtC+F,EAAIwB,iBAAiBvH,EAAMU,KAG7BqF,EAAIyB,UAAkC,IAAtB1B,EAAQnB,UAA4B,KAAOmB,EAAQnB,cAGvEjD,EAAKQ,MAAMuF,UAAW,EApatB,SAASlE,EAAcvD,GAIrB,GAHoB,iBAATA,IACTA,EAAO0H,OAAO1H,IAEZ,6BAA6B2H,KAAK3H,GACpC,MAAM,IAAIgH,UAAU,0CAEtB,OAAOhH,EAAK4H,cAGd,SAASpE,EAAe9C,GAItB,MAHqB,iBAAVA,IACTA,EAAQgH,OAAOhH,IAEVA,EAIT,SAASyD,EAAYF,GACnB,IAAIK,GACFuD,KAAM,WACJ,IAAInH,EAAQuD,EAAMuC,QAClB,OAAQsB,UAAgBC,IAAVrH,EAAqBA,MAAOA,KAU9C,OANIyB,EAAQE,WACViC,EAAS9D,OAAO8D,UAAY,WAC1B,OAAOA,IAIJA,EAGT,SAASjB,EAAQ2B,GACf/C,KAAKyB,OAEDsB,aAAmB3B,EACrB2B,EAAQnB,QAAQ,SAASnD,EAAOV,GAC9BiC,KAAKqB,OAAOtD,EAAMU,IACjBuB,MACM+F,MAAMC,QAAQjD,GACvBA,EAAQnB,QAAQ,SAASqE,GACvBjG,KAAKqB,OAAO4E,EAAO,GAAIA,EAAO,KAC7BjG,MACM+C,GACT7E,OAAOgI,oBAAoBnD,GAASnB,QAAQ,SAAS7D,GACnDiC,KAAKqB,OAAOtD,EAAMgF,EAAQhF,KACzBiC,MA0DP,SAASmG,EAAS1D,GAChB,GAAIA,EAAK2D,SACP,OAAO1C,QAAQE,OAAO,IAAImB,UAAU,iBAEtCtC,EAAK2D,UAAW,EAGlB,SAASC,EAAgBC,GACvB,OAAO,IAAI5C,QAAQ,SAASC,EAASC,GACnC0C,EAAOtC,OAAS,WACdL,EAAQ2C,EAAOC,SAEjBD,EAAOxB,QAAU,WACflB,EAAO0C,EAAOrD,UAKpB,SAASuD,EAAsBnG,GAC7B,IAAIiG,EAAS,IAAIG,WACbC,EAAUL,EAAgBC,GAE9B,OADAA,EAAOK,kBAAkBtG,GAClBqG,EAoBT,SAASE,EAAYC,GACnB,GAAIA,EAAIC,MACN,OAAOD,EAAIC,MAAM,GAEjB,IAAIC,EAAO,IAAIC,WAAWH,EAAII,YAE9B,OADAF,EAAKpF,IAAI,IAAIqF,WAAWH,IACjBE,EAAKG,OAIhB,SAASvE,IA0FP,OAzFA3C,KAAKoG,UAAW,EAEhBpG,KAAKmH,UAAY,SAAS1E,GAExB,GADAzC,KAAK0C,UAAYD,EACZA,EAEE,GAAoB,iBAATA,EAChBzC,KAAKoH,UAAY3E,OACZ,GAAIvC,EAAQG,MAAQC,KAAKlB,UAAU0B,cAAc2B,GACtDzC,KAAKqH,UAAY5E,OACZ,GAAIvC,EAAQM,UAAYb,SAASP,UAAU0B,cAAc2B,GAC9DzC,KAAKsH,cAAgB7E,OAChB,GAAIvC,EAAQC,cAAgBoH,gBAAgBnI,UAAU0B,cAAc2B,GACzEzC,KAAKoH,UAAY3E,EAAKtB,gBACjB,GAAIjB,EAAQO,aAAeP,EAAQG,MAAQM,EAAW8B,GAC3DzC,KAAKwH,iBAAmBZ,EAAYnE,EAAKyE,QAEzClH,KAAK0C,UAAY,IAAIpC,MAAMN,KAAKwH,uBAC3B,KAAItH,EAAQO,cAAgBO,YAAY5B,UAAU0B,cAAc2B,KAAS1B,EAAkB0B,GAGhG,MAAM,IAAIgF,MAAM,6BAFhBzH,KAAKwH,iBAAmBZ,EAAYnE,QAdpCzC,KAAKoH,UAAY,GAmBdpH,KAAK+C,QAAQ1E,IAAI,kBACA,iBAAToE,EACTzC,KAAK+C,QAAQpB,IAAI,eAAgB,4BACxB3B,KAAKqH,WAAarH,KAAKqH,UAAUlE,KAC1CnD,KAAK+C,QAAQpB,IAAI,eAAgB3B,KAAKqH,UAAUlE,MACvCjD,EAAQC,cAAgBoH,gBAAgBnI,UAAU0B,cAAc2B,IACzEzC,KAAK+C,QAAQpB,IAAI,eAAgB,qDAKnCzB,EAAQG,OACVL,KAAKK,KAAO,WACV,IAAIqH,EAAWvB,EAASnG,MACxB,GAAI0H,EACF,OAAOA,EAGT,GAAI1H,KAAKqH,UACP,OAAO3D,QAAQC,QAAQ3D,KAAKqH,WACvB,GAAIrH,KAAKwH,iBACd,OAAO9D,QAAQC,QAAQ,IAAIrD,MAAMN,KAAKwH,oBACjC,GAAIxH,KAAKsH,cACd,MAAM,IAAIG,MAAM,wCAEhB,OAAO/D,QAAQC,QAAQ,IAAIrD,MAAMN,KAAKoH,cAI1CpH,KAAKS,YAAc,WACjB,OAAIT,KAAKwH,iBACArB,EAASnG,OAAS0D,QAAQC,QAAQ3D,KAAKwH,kBAEvCxH,KAAKK,OAAOsH,KAAKnB,KAK9BxG,KAAK4H,KAAO,WACV,IAAIF,EAAWvB,EAASnG,MACxB,GAAI0H,EACF,OAAOA,EAGT,GAAI1H,KAAKqH,UACP,OAjGN,SAAwBhH,GACtB,IAAIiG,EAAS,IAAIG,WACbC,EAAUL,EAAgBC,GAE9B,OADAA,EAAOuB,WAAWxH,GACXqG,EA6FIoB,CAAe9H,KAAKqH,WACtB,GAAIrH,KAAKwH,iBACd,OAAO9D,QAAQC,QA5FrB,SAA+BkD,GAI7B,IAHA,IAAIE,EAAO,IAAIC,WAAWH,GACtBkB,EAAQ,IAAIhC,MAAMgB,EAAKiB,QAElBxK,EAAI,EAAGA,EAAIuJ,EAAKiB,OAAQxK,IAC/BuK,EAAMvK,GAAKiI,OAAOwC,aAAalB,EAAKvJ,IAEtC,OAAOuK,EAAMtD,KAAK,IAqFSyD,CAAsBlI,KAAKwH,mBAC7C,GAAIxH,KAAKsH,cACd,MAAM,IAAIG,MAAM,wCAEhB,OAAO/D,QAAQC,QAAQ3D,KAAKoH,YAI5BlH,EAAQM,WACVR,KAAKQ,SAAW,WACd,OAAOR,KAAK4H,OAAOD,KAAKQ,KAI5BnI,KAAKoI,KAAO,WACV,OAAOpI,KAAK4H,OAAOD,KAAKU,KAAKC,QAGxBtI,KAWT,SAASuC,EAAQiB,EAAOS,GAEtB,IAAIxB,GADJwB,EAAUA,OACSxB,KAEnB,GAAIe,aAAiBjB,EAAS,CAC5B,GAAIiB,EAAM4C,SACR,MAAM,IAAIrB,UAAU,gBAEtB/E,KAAKgD,IAAMQ,EAAMR,IACjBhD,KAAKmF,YAAc3B,EAAM2B,YACpBlB,EAAQlB,UACX/C,KAAK+C,QAAU,IAAI3B,EAAQoC,EAAMT,UAEnC/C,KAAKkF,OAAS1B,EAAM0B,OACpBlF,KAAKrB,KAAO6E,EAAM7E,KACb8D,GAA2B,MAAnBe,EAAMd,YACjBD,EAAOe,EAAMd,UACbc,EAAM4C,UAAW,QAGnBpG,KAAKgD,IAAMyC,OAAOjC,GAWpB,GARAxD,KAAKmF,YAAclB,EAAQkB,aAAenF,KAAKmF,aAAe,QAC1DlB,EAAQlB,SAAY/C,KAAK+C,UAC3B/C,KAAK+C,QAAU,IAAI3B,EAAQ6C,EAAQlB,UAErC/C,KAAKkF,OAhCP,SAAyBA,GACvB,IAAIqD,EAAUrD,EAAOsD,cACrB,OAAQlG,EAAQpB,QAAQqH,IAAY,EAAKA,EAAUrD,EA8BrCuD,CAAgBxE,EAAQiB,QAAUlF,KAAKkF,QAAU,OAC/DlF,KAAKrB,KAAOsF,EAAQtF,MAAQqB,KAAKrB,MAAQ,KACzCqB,KAAK0I,SAAW,MAEK,QAAhB1I,KAAKkF,QAAoC,SAAhBlF,KAAKkF,SAAsBzC,EACvD,MAAM,IAAIsC,UAAU,6CAEtB/E,KAAKmH,UAAU1E,GAOjB,SAAS0F,EAAO1F,GACd,IAAIkG,EAAO,IAAIhJ,SASf,OARA8C,EAAK+B,OAAOJ,MAAM,KAAKxC,QAAQ,SAASgH,GACtC,GAAIA,EAAO,CACT,IAAIxE,EAAQwE,EAAMxE,MAAM,KACpBrG,EAAOqG,EAAMG,QAAQJ,QAAQ,MAAO,KACpC1F,EAAQ2F,EAAMK,KAAK,KAAKN,QAAQ,MAAO,KAC3CwE,EAAKtH,OAAOwH,mBAAmB9K,GAAO8K,mBAAmBpK,OAGtDkK,EAqBT,SAAS/F,EAASkG,EAAU7E,GACrBA,IACHA,MAGFjE,KAAKmD,KAAO,UACZnD,KAAK6C,YAA4BiD,IAAnB7B,EAAQpB,OAAuB,IAAMoB,EAAQpB,OAC3D7C,KAAK+I,GAAK/I,KAAK6C,QAAU,KAAO7C,KAAK6C,OAAS,IAC9C7C,KAAK8C,WAAa,eAAgBmB,EAAUA,EAAQnB,WAAa,KACjE9C,KAAK+C,QAAU,IAAI3B,EAAQ6C,EAAQlB,SACnC/C,KAAKgD,IAAMiB,EAAQjB,KAAO,GAC1BhD,KAAKmH,UAAU2B,IAlYnB,MAgdmB,IAATrJ,EAAuBA,EAAOO,QACrCrC,KAAKkC,OAAU,GAClB,IAAII,EAAQJ,EAASI,MACNA,EAAM2C,SAAW/C,EAAS+C,SAC3B3C,EAAMsC,QAAU1C,EAAS0C,QACzBtC,EAAMmB,QAAUvB,EAASuB,QACjB,WAAlB1B,EAAOnC,IAAuBA,EAAOD,UACzCC,EAAOD,QAAU2C,EAEjB1C,EAAOD,QAAP,QAAyB2C;;;;;;;;kQCvdZ,IAAI+I,EAAExJ,EAAQ,GAAiBP,EAAE,mBAAoBV,QAAQA,OAAM,IAAKe,EAAEL,EAAEV,OAAM,IAAK,iBAAiB,MAAM0K,EAAEhK,EAAEV,OAAM,IAAK,gBAAgB,MAAMD,EAAEW,EAAEV,OAAM,IAAK,kBAAkB,MAAMG,EAAEO,EAAEV,OAAM,IAAK,qBAAqB,MAAM2K,EAAEjK,EAAEV,OAAM,IAAK,kBAAkB,MAAM4K,EAAElK,EAAEV,OAAM,IAAK,kBAAkB,MAAM6K,EAAEnK,EAAEV,OAAM,IAAK,iBAAiB,MAAM8K,EAAEpK,EAAEV,OAAM,IAAK,yBAAyB,MAAM+K,EAAErK,EAAEV,OAAM,IAAK,qBAAqB,MAAMgL,EAAEtK,EAAEV,OAAM,IAAK,kBAAkB,MAAMiL,EAAEvK,EAAEV,OAAM,IAAK,cACnf,MAAMkL,EAAExK,EAAEV,OAAM,IAAK,cAAc,MAAMmL,EAAE,mBAAoBnL,QAAQA,OAAO8D,SAC9E,SAASsH,EAAEC,GAAG,IAAI,IAAIC,EAAEC,UAAU9B,OAAO,EAAEzH,EAAE,yDAAyDqJ,EAAE/L,EAAE,EAAEA,EAAEgM,EAAEhM,IAAI0C,GAAG,WAAWwJ,mBAAmBD,UAAUjM,EAAE,KAD1E,SAAY+L,EAAEC,EAAEtJ,EAAE1C,EAAEC,EAAEkM,EAAEC,EAAEC,GAAG,IAAIN,EAAE,CAAU,GAATA,OAAE,OAAU,IAASC,EAAED,EAAEnC,MAAM,qIAAqI,CAAC,IAAIhK,GAAG8C,EAAE1C,EAAEC,EAAEkM,EAAEC,EAAEC,GAAGtM,EAAE,GAAEgM,EAAEnC,MAAMoC,EAAE1F,QAAQ,MAAM,WAAW,OAAO1G,EAAEG,SAAUG,KAAK,sBAAsC,MAAhB6L,EAAEO,YAAY,EAAQP,GAC1PQ,EAAG,EAAG,yBAAyBR,EAAE,4HAA4HrJ,GAAG,IAAI8J,GAAGC,UAAU,WAAW,OAAM,GAAIC,mBAAmB,aAAaC,oBAAoB,aAAaC,gBAAgB,cAAc1K,KAC1c,SAAS2K,EAAEd,EAAEC,EAAEtJ,GAAGP,KAAK2K,MAAMf,EAAE5J,KAAK4K,QAAQf,EAAE7J,KAAK6K,KAAK9K,EAAEC,KAAK8K,QAAQvK,GAAG8J,EAAsR,SAASU,KAA6B,SAASC,EAAEpB,EAAEC,EAAEtJ,GAAGP,KAAK2K,MAAMf,EAAE5J,KAAK4K,QAAQf,EAAE7J,KAAK6K,KAAK9K,EAAEC,KAAK8K,QAAQvK,GAAG8J,EAApYK,EAAEtL,UAAU6L,oBAAoBP,EAAEtL,UAAU8L,SAAS,SAAStB,EAAEC,GAAG,WAAAnK,EAAkBkK,IAAG,mBAAoBA,GAAG,MAAMA,GAAED,EAAE,MAAa3J,KAAK8K,QAAQL,gBAAgBzK,KAAK4J,EAAEC,EAAE,aAAaa,EAAEtL,UAAU+L,YAAY,SAASvB,GAAG5J,KAAK8K,QAAQP,mBAAmBvK,KAAK4J,EAAE,gBAA8BmB,EAAE3L,UAAUsL,EAAEtL,UAAsF,IAAIgM,EAAEJ,EAAE5L,UAAU,IAAI2L,EACxeK,EAAEC,YAAYL,EAAEhC,EAAEoC,EAAEV,EAAEtL,WAAWgM,EAAEE,sBAAqB,EAAG,IAAIC,GAAGC,QAAQ,KAAKC,kBAAkB,MAAMC,EAAExN,OAAOkB,UAAUC,eAAesM,GAAG5M,KAAI,EAAG6M,KAAI,EAAGC,QAAO,EAAGC,UAAS,GAC7K,SAASC,EAAEnC,EAAEC,EAAEtJ,GAAG,IAAI1C,OAAE,EAAOC,KAAKkM,EAAE,KAAKC,EAAE,KAAK,GAAG,MAAMJ,EAAE,IAAIhM,UAAK,IAASgM,EAAE+B,MAAM3B,EAAEJ,EAAE+B,UAAK,IAAS/B,EAAE9K,MAAMiL,EAAE,GAAGH,EAAE9K,KAAK8K,EAAE6B,EAAE/N,KAAKkM,EAAEhM,KAAK8N,EAAEtM,eAAexB,KAAKC,EAAED,GAAGgM,EAAEhM,IAAI,IAAIqM,EAAEJ,UAAU9B,OAAO,EAAE,GAAG,IAAIkC,EAAEpM,EAAEkO,SAASzL,OAAO,GAAG,EAAE2J,EAAE,CAAC,IAAI,IAAIzM,EAAEsI,MAAMmE,GAAGtM,EAAE,EAAEA,EAAEsM,EAAEtM,IAAIH,EAAEG,GAAGkM,UAAUlM,EAAE,GAAGE,EAAEkO,SAASvO,EAAE,GAAGmM,GAAGA,EAAEqC,aAAa,IAAIpO,KAAKqM,EAAEN,EAAEqC,kBAAe,IAASnO,EAAED,KAAKC,EAAED,GAAGqM,EAAErM,IAAI,OAAOqO,SAAS5M,EAAE6D,KAAKyG,EAAE7K,IAAIiL,EAAE4B,IAAI3B,EAAEU,MAAM7M,EAAEqO,OAAOZ,EAAEC,SAC9U,SAASY,EAAExC,GAAG,MAAM,WAAAlK,EAAkBkK,IAAG,OAAOA,GAAGA,EAAEsC,WAAW5M,EAA0G,IAAI+M,EAAE,OAAOC,KAAK,SAASC,EAAE3C,EAAEC,EAAEtJ,EAAE1C,GAAG,GAAGyO,EAAEtE,OAAO,CAAC,IAAIlK,EAAEwO,EAAEE,MAA8D,OAAxD1O,EAAEyI,OAAOqD,EAAE9L,EAAE2O,UAAU5C,EAAE/L,EAAE4O,KAAKnM,EAAEzC,EAAE8M,QAAQ/M,EAAEC,EAAE6O,MAAM,EAAS7O,EAAE,OAAOyI,OAAOqD,EAAE6C,UAAU5C,EAAE6C,KAAKnM,EAAEqK,QAAQ/M,EAAE8O,MAAM,GAC7b,SAASC,EAAEhD,GAAGA,EAAErD,OAAO,KAAKqD,EAAE6C,UAAU,KAAK7C,EAAE8C,KAAK,KAAK9C,EAAEgB,QAAQ,KAAKhB,EAAE+C,MAAM,EAAE,GAAGL,EAAEtE,QAAQsE,EAAErK,KAAK2H,GAE+E,SAASiD,EAAEjD,EAAEC,EAAEtJ,GAAG,OAAO,MAAMqJ,EAAE,EADtN,SAASkD,EAAElD,EAAEC,EAAEtJ,EAAE1C,GAAG,IAAIC,EAAC4B,EAAQkK,GAAK,cAAc9L,GAAG,YAAYA,IAAE8L,EAAE,MAAK,IAAII,GAAE,EAAG,GAAG,OAAOJ,EAAEI,GAAE,OAAQ,OAAOlM,GAAG,IAAK,SAAS,IAAK,SAASkM,GAAE,EAAG,MAAM,IAAK,SAAS,OAAOJ,EAAEsC,UAAU,KAAK5M,EAAE,KAAK2J,EAAEe,GAAE,GAAI,GAAGA,EAAE,OAAOzJ,EAAE1C,EAAE+L,EAAE,KAAKC,EAAE,IAAIkD,EAAEnD,EAAE,GAAGC,GAAG,EAAyB,GAAvBG,EAAE,EAAEH,EAAE,KAAKA,EAAE,IAAIA,EAAE,IAAO9D,MAAMC,QAAQ4D,GAAG,IAAI,IAAIK,EAAE,EAAEA,EAAEL,EAAE5B,OAAOiC,IAAI,CAAQ,IAAIC,EAAEL,EAAEkD,EAAfjP,EAAE8L,EAAEK,GAAeA,GAAGD,GAAG8C,EAAEhP,EAAEoM,EAAE3J,EAAE1C,QAAQ,GAAiCqM,EAA9B,OAAON,GAAG,WAAAlK,EAAkBkK,GAAI,KAAmC,mBAA7BM,EAAER,GAAGE,EAAEF,IAAIE,EAAE,eAAsCM,EAAE,KAAM,mBAAoBA,EAAE,IAAIN,EAAEM,EAAEvM,KAAKiM,GAAGK,EACpf,IAAInM,EAAE8L,EAAEhE,QAAQC,MAA6BmE,GAAG8C,EAA1BhP,EAAEA,EAAEW,MAAMyL,EAAEL,EAAEkD,EAAEjP,EAAEmM,KAAc1J,EAAE1C,OAAO,WAAWC,GAAW6L,EAAE,KAAK,oBAAdpJ,EAAE,GAAGqJ,GAA+B,qBAAqB1L,OAAO6D,KAAK6H,GAAGnF,KAAK,MAAM,IAAIlE,EAAE,IAAK,OAAOyJ,EAAqC8C,CAAElD,EAAE,GAAGC,EAAEtJ,GAAG,SAASwM,EAAEnD,EAAEC,GAAG,MAAM,WAAAnK,EAAkBkK,IAAG,OAAOA,GAAG,MAAMA,EAAE7K,IAHjI,SAAgB6K,GAAG,IAAIC,GAAGmD,IAAI,KAAKC,IAAI,MAAM,MAAM,KAAK,GAAGrD,GAAGzF,QAAQ,QAAQ,SAASyF,GAAG,OAAOC,EAAED,KAGkCsD,CAAOtD,EAAE7K,KAAK8K,EAAE1I,SAAS,IAAI,SAASgM,EAAGvD,EAAEC,GAAGD,EAAE8C,KAAK/O,KAAKiM,EAAEgB,QAAQf,EAAED,EAAE+C,SAC7W,SAASS,EAAGxD,EAAEC,EAAEtJ,GAAG,IAAI1C,EAAE+L,EAAErD,OAAOzI,EAAE8L,EAAE6C,UAAU7C,EAAEA,EAAE8C,KAAK/O,KAAKiM,EAAEgB,QAAQf,EAAED,EAAE+C,SAAS5G,MAAMC,QAAQ4D,GAAGyD,EAAEzD,EAAE/L,EAAE0C,EAAE,SAASqJ,GAAG,OAAOA,IAAI,MAAMA,IAAIwC,EAAExC,KAAKA,EAJtJ,SAAYA,EAAEC,GAAG,OAAOqC,SAAS5M,EAAE6D,KAAKyG,EAAEzG,KAAKpE,IAAI8K,EAAE+B,IAAIhC,EAAEgC,IAAIjB,MAAMf,EAAEe,MAAMwB,OAAOvC,EAAEuC,QAIkEmB,CAAG1D,EAAE9L,IAAI8L,EAAE7K,KAAK8K,GAAGA,EAAE9K,MAAM6K,EAAE7K,IAAI,IAAI,GAAG6K,EAAE7K,KAAKoF,QAAQkI,EAAE,OAAO,KAAK9L,IAAI1C,EAAEoE,KAAK2H,IAAI,SAASyD,EAAEzD,EAAEC,EAAEtJ,EAAE1C,EAAEC,GAAG,IAAIkM,EAAE,GAAG,MAAMzJ,IAAIyJ,GAAG,GAAGzJ,GAAG4D,QAAQkI,EAAE,OAAO,KAAkBQ,EAAEjD,EAAEwD,EAAjBvD,EAAE0C,EAAE1C,EAAEG,EAAEnM,EAAEC,IAAa8O,EAAE/C,GAC7U,IAAI0D,GAAGC,UAAU/L,IAAI,SAASmI,EAAEC,EAAEtJ,GAAG,GAAG,MAAMqJ,EAAE,OAAOA,EAAE,IAAI/L,KAAqB,OAAhBwP,EAAEzD,EAAE/L,EAAE,KAAKgM,EAAEtJ,GAAU1C,GAAG+D,QAAQ,SAASgI,EAAEC,EAAEtJ,GAAG,GAAG,MAAMqJ,EAAE,OAAOA,EAAqBiD,EAAEjD,EAAEuD,EAAvBtD,EAAE0C,EAAE,KAAK,KAAK1C,EAAEtJ,IAAaqM,EAAE/C,IAAI8C,MAAM,SAAS/C,GAAG,OAAOiD,EAAEjD,EAAE,WAAW,OAAO,MAAM,OAAO6D,QAAQ,SAAS7D,GAAG,IAAIC,KAAuC,OAAlCwD,EAAEzD,EAAEC,EAAE,KAAK,SAASD,GAAG,OAAOA,IAAWC,GAAG6D,KAAK,SAAS9D,GAAwB,OAArBwC,EAAExC,IAAUD,EAAE,OAAcC,IAAI+D,UAAU,WAAW,OAAOnC,QAAQ,OAAOoC,UAAUlD,EAAEmD,cAAc7C,EAAE8C,cAAc,SAASlE,EAAEC,GACjV,YADoV,IAASA,IAAIA,EAAE,OAAMD,GAAGsC,SAAS9C,EAAE2E,sBAAsBlE,EAC7fmE,cAAcpE,EAAEqE,eAAerE,EAAEsE,aAAa,EAAEC,SAAS,KAAKC,SAAS,OAAQD,UAAUjC,SAAS/C,EAAEkF,SAASzE,GAAUA,EAAEwE,SAASxE,GAAG0E,WAAW,SAAS1E,GAAG,OAAOsC,SAAS5C,EAAEiF,OAAO3E,IAAI4E,KAAK,SAAS5E,GAAG,OAAOsC,SAASzC,EAAEgF,MAAM7E,EAAE8E,SAAS,EAAEC,QAAQ,OAAOC,KAAK,SAAShF,EAAEC,GAAG,OAAOqC,SAAS1C,EAAErG,KAAKyG,EAAEiF,aAAQ,IAAShF,EAAE,KAAKA,IAAIiF,SAASxQ,EAAEyQ,WAAWrQ,EAAEsQ,SAASzF,EAAE0F,cAAclD,EAAEmD,aAAa,SAAStF,EAAEC,EAAEtJ,IAAG,OAAOqJ,QAAG,IAASA,IAAED,EAAE,MAAMC,GAAU,IAAI/L,OAAE,EAAOC,EAAEkL,KAAKY,EAAEe,OAAOX,EAAEJ,EAAE7K,IAAIkL,EAAEL,EAAEgC,IAAI1B,EAAEN,EAAEuC,OAC9e,GAAG,MAAMtC,EAAE,MAAC,IAASA,EAAE+B,MAAM3B,EAAEJ,EAAE+B,IAAI1B,EAAEqB,EAAEC,cAAS,IAAS3B,EAAE9K,MAAMiL,EAAE,GAAGH,EAAE9K,KAAK,IAAItB,OAAE,EAA4D,IAAII,KAAzD+L,EAAEzG,MAAMyG,EAAEzG,KAAK8I,eAAexO,EAAEmM,EAAEzG,KAAK8I,cAAuBpC,EAAE6B,EAAE/N,KAAKkM,EAAEhM,KAAK8N,EAAEtM,eAAexB,KAAKC,EAAED,QAAG,IAASgM,EAAEhM,SAAI,IAASJ,EAAEA,EAAEI,GAAGgM,EAAEhM,IAAyB,GAAG,KAAxBA,EAAEiM,UAAU9B,OAAO,GAAWlK,EAAEkO,SAASzL,OAAO,GAAG,EAAE1C,EAAE,CAACJ,EAAEsI,MAAMlI,GAAG,IAAI,IAAID,EAAE,EAAEA,EAAEC,EAAED,IAAIH,EAAEG,GAAGkM,UAAUlM,EAAE,GAAGE,EAAEkO,SAASvO,EAAE,OAAOyO,SAAS5M,EAAE6D,KAAKyG,EAAEzG,KAAKpE,IAAIiL,EAAE4B,IAAI3B,EAAEU,MAAM7M,EAAEqO,OAAOjC,IAAIiF,cAAc,SAASvF,GAAG,IAAIC,EAAEkC,EAAE/M,KAAK,KAAK4K,GAAY,OAATC,EAAE1G,KAAKyG,EAASC,GAAGuF,eAAehD,EAAEiD,QAAQ,SAC1fC,oDAAoDC,kBAAkBhE,EAAEiE,OAAOxG,IAAIuE,EAAEkC,wBAAwBpG,EAAEkE,EAAEmC,kBAAkBxG,EAAE,IAAIyG,GAAGC,QAAQrC,GAAGsC,EAAEF,GAAGpC,GAAGoC,EAAEpS,EAAOD,QAAQuS,EAAC,SAAUA;;;;;ECf3L,IAAIC,EAAwB5R,OAAO4R,sBAC/BzQ,EAAiBnB,OAAOkB,UAAUC,eAClC0Q,EAAmB7R,OAAOkB,UAAU4Q,qBAsDxCzS,EAAOD,QA5CP,WACC,IACC,IAAKY,OAAOsR,OACX,OAAO,EAMR,IAAIS,EAAQ,IAAIxK,OAAO,OAEvB,GADAwK,EAAM,GAAK,KACkC,MAAzC/R,OAAOgI,oBAAoB+J,GAAO,GACrC,OAAO,EAKR,IADA,IAAIC,KACK1S,EAAI,EAAGA,EAAI,GAAIA,IACvB0S,EAAM,IAAMzK,OAAOwC,aAAazK,IAAMA,EAKvC,GAAwB,eAHXU,OAAOgI,oBAAoBgK,GAAOzO,IAAI,SAAUxC,GAC5D,OAAOiR,EAAMjR,KAEHwF,KAAK,IACf,OAAO,EAIR,IAAI0L,KAIJ,MAHA,uBAAuB/L,MAAM,IAAIxC,QAAQ,SAAUwO,GAClDD,EAAMC,GAAUA,IAGf,yBADElS,OAAO6D,KAAK7D,OAAOsR,UAAWW,IAAQ1L,KAAK,IAM9C,MAAO4L,GAER,OAAO,GAIQC,GAAoBpS,OAAOsR,OAAS,SAAUe,EAAQC,GAKtE,IAJA,IAAIC,EAEAC,EADAC,EAtDL,SAAkBC,GACjB,GAAY,OAARA,QAAwB9K,IAAR8K,EACnB,MAAM,IAAI7L,UAAU,yDAGrB,OAAO7G,OAAO0S,GAiDLC,CAASN,GAGThR,EAAI,EAAGA,EAAIuK,UAAU9B,OAAQzI,IAAK,CAG1C,IAAK,IAAIR,KAFT0R,EAAOvS,OAAO4L,UAAUvK,IAGnBF,EAAe1B,KAAK8S,EAAM1R,KAC7B4R,EAAG5R,GAAO0R,EAAK1R,IAIjB,GAAI+Q,EAAuB,CAC1BY,EAAUZ,EAAsBW,GAChC,IAAK,IAAIjT,EAAI,EAAGA,EAAIkT,EAAQ1I,OAAQxK,IAC/BuS,EAAiBpS,KAAK8S,EAAMC,EAAQlT,MACvCmT,EAAGD,EAAQlT,IAAMiT,EAAKC,EAAQlT,MAMlC,OAAOmT,kBCxFRpT,EAAOD,QAAU,SAASC,GAoBzB,OAnBKA,EAAOuT,kBACXvT,EAAOwT,UAAY,aACnBxT,EAAOyT,SAEFzT,EAAOyO,WAAUzO,EAAOyO,aAC7B9N,OAAOC,eAAeZ,EAAQ,UAC7Ba,YAAY,EACZC,IAAK,WACJ,OAAOd,EAAOE,KAGhBS,OAAOC,eAAeZ,EAAQ,MAC7Ba,YAAY,EACZC,IAAK,WACJ,OAAOd,EAAOC,KAGhBD,EAAOuT,gBAAkB,GAEnBvT,y3EChBD0T,EAAuBC,GAAGC,KAA1BF,SACAG,EAAuBF,GAAGG,WAA1BD,SACuBF,GAAGI,QAA1BxC,aAAUlB,cACV2D,EAAuBL,GAAGM,KAA1BD,GACApS,EAAuBsS,OAAvBtS,SAEDuS,kBAA6B9D,2KAEjC+D,UAAW,KACXC,IAAKL,EAAG,wCAaQ,WAChBM,EAAKC,YAAYD,EAAKlH,MAAMoH,UAC1BpK,KAAK,SAAAgK,GAAS,OAAIE,EAAK3G,UAAUyG,gBADnC,MAEQ,SAACtB,GAAD,OAAS2B,QAAQC,IAAI5B,IAAQwB,EAAK3G,UAAU0G,IAAKL,EAAG,mDAG/C,SAAAQ,GACb,IAAMZ,EAAO,IAAIxR,IAKjB,OAHAwR,EAAK9P,OAAO,SAAU,aACtB8P,EAAK9P,OAAO,WAAY0Q,GAEjB9R,IAAMiS,gBAAgBlP,KAE3BkC,OAAQ,OACRzC,KAAM0O,EACNpO,SACCoP,OAAU,sBAGXxK,KAAK,SAAAyK,GAAG,OAAIA,EAAIhK,SAChBT,KAAKxI,EAAS,6EA/BEkT,GACdrS,KAAK2K,MAAMoH,WAAaM,EAAUN,UACrC/R,KAAKsS,6DAKNtS,KAAKsS,kDA2BG,IACDV,EAAO5R,KAAKuS,MAAZX,IAODY,EAAKxS,KAAKuS,MAAMZ,UAAYc,EAAA7I,EAAAqF,cAAA,OAAKyD,IAAK1S,KAAKuS,MAAMZ,YAAec,EAAA7I,EAAAqF,cAAA,YAAO2C,GAE7E,OACCa,EAAA7I,EAAAqF,cAAA,OAAK0D,OAPLC,WAAY,MACZC,cAAe,QAMKL,YAKFM,kBAAyBlF,cAE7C,SAAAkF,EAAYnI,GAAO,IAAAoI,EAAA,OAAAC,EAAAhT,KAAA8S,GAAAG,EAAAC,EAClBH,EAAAI,EAAAxV,KAAAqC,KAAM2K,IADY,kBASD,SAAAyI,GACjBC,IAAIC,uBAAyBP,EAAKQ,sBAClCC,QACC,6BACAC,mBAAmBC,UAAUvP,QAAQ,YAAa4O,EAAKpI,MAAMgJ,kBAb5CV,EAAAC,EAAAH,GAAA,oBAiBC,SAAAK,GACnB,IAAMQ,EAAIC,OACNd,EAAKpI,MAAMiJ,UACdE,mBAAoB,EACpBC,eAAgB,IAEjBhB,EAAK7H,UACJ8I,OAAQ,IAET/C,EAAS,eAAegD,UAAUL,WA1BhBX,EAAAC,EAAAH,GAAA,wBA6BK,SAAAmB,GACvBC,YACA,IAAMP,EAAIC,OACNd,EAAKpI,MAAMiJ,UACdE,mBAAoBM,SAASF,KAE9BnB,EAAK7H,UACJ8I,OAAQJ,EAAKE,qBAEd7C,EAAS,eAAegD,UAAUL,WAnClCb,EAAKR,OACJyB,OAAQrJ,EAAMiJ,KAAKE,mBACnBO,SAAU1J,EAAM2J,iBALCvB,6CA0ClB,OACCN,EAAA7I,EAAAqF,cAACH,EAAD,KACC2D,EAAA7I,EAAAqF,cAACmC,GAAOuB,OAAQ4B,UAAW,QACzBC,QAASxU,KAAKyU,gBACdC,UAAU,sCACVnD,EAAG,+BAGJvR,KAAKuS,MAAMyB,OAAS,GAAKhU,KAAK2K,MAAMiJ,KAAKE,qBAAuB9T,KAAKuS,MAAMyB,OAC3EvB,EAAA7I,EAAAqF,cAACH,EAAD,KACC2D,EAAA7I,EAAAqF,cAAC0F,GAAqB5C,SAAU/R,KAAKuS,MAAMyB,SAC3CvB,EAAA7I,EAAAqF,cAACmC,GAAOoD,QAASxU,KAAK4U,kBACpBF,UAAU,0BACVnD,EAAG,2BAGJ,gOC3HAsD,EAAY3D,GAAGC,KAAf0D,OACA/F,EAAYoC,GAAGI,QAAfxC,SAkBPoC,GAAG4D,MAAMC,UAAU,2BAA4B,iCAhB/C,SAAiCC,GAC7B,OAAO,SAACrK,GACJ,IACIsK,EADErB,EAAOiB,EAAO,eAAeK,wBAAwB,QAK3D,YAHI,IAAuBtB,IACvBqB,EAAsBxC,EAAA7I,EAAAqF,cAACkG,EAADC,KAAsBzK,GAAOiJ,KAAMA,MAGzDnB,EAAA7I,EAAAqF,cAACoG,EAAD,KACI5C,EAAA7I,EAAAqF,cAAC+F,EAAsBrK,GACtBsK","file":"post-thumbnail.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 6);\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react.production.min.js');\n} else {\n module.exports = require('./cjs/react.development.js');\n}\n","/* eslint-env browser */\nmodule.exports = typeof self == 'object' ? self.FormData : window.FormData;\n","var __root__ = (function (root) {\nfunction F() { this.fetch = false; }\nF.prototype = root;\nreturn new F();\n})(typeof self !== 'undefined' ? self : this);\n(function(self) {\n\n(function(self) {\n\n if (self.fetch) {\n return\n }\n\n var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob();\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n };\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ];\n\n var isDataView = function(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n };\n\n var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n };\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name);\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value);\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift();\n return {done: value === undefined, value: value}\n }\n };\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n };\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {};\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value);\n }, this);\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n this.append(header[0], header[1]);\n }, this);\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name]);\n }, this);\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name);\n value = normalizeValue(value);\n var oldValue = this.map[name];\n this.map[name] = oldValue ? oldValue+','+value : value;\n };\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)];\n };\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name);\n return this.has(name) ? this.map[name] : null\n };\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n };\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value);\n };\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this);\n }\n }\n };\n\n Headers.prototype.keys = function() {\n var items = [];\n this.forEach(function(value, name) { items.push(name); });\n return iteratorFor(items)\n };\n\n Headers.prototype.values = function() {\n var items = [];\n this.forEach(function(value) { items.push(value); });\n return iteratorFor(items)\n };\n\n Headers.prototype.entries = function() {\n var items = [];\n this.forEach(function(value, name) { items.push([name, value]); });\n return iteratorFor(items)\n };\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries;\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true;\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result);\n };\n reader.onerror = function() {\n reject(reader.error);\n };\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader();\n var promise = fileReaderReady(reader);\n reader.readAsArrayBuffer(blob);\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader();\n var promise = fileReaderReady(reader);\n reader.readAsText(blob);\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf);\n var chars = new Array(view.length);\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i]);\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength);\n view.set(new Uint8Array(buf));\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false;\n\n this._initBody = function(body) {\n this._bodyInit = body;\n if (!body) {\n this._bodyText = '';\n } else if (typeof body === 'string') {\n this._bodyText = body;\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body;\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body;\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString();\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer);\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer]);\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body);\n } else {\n throw new Error('unsupported BodyInit type')\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8');\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type);\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n }\n };\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this);\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n };\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n };\n }\n\n this.text = function() {\n var rejected = consumed(this);\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n };\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n };\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n };\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase();\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {};\n var body = options.body;\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url;\n this.credentials = input.credentials;\n if (!options.headers) {\n this.headers = new Headers(input.headers);\n }\n this.method = input.method;\n this.mode = input.mode;\n if (!body && input._bodyInit != null) {\n body = input._bodyInit;\n input.bodyUsed = true;\n }\n } else {\n this.url = String(input);\n }\n\n this.credentials = options.credentials || this.credentials || 'omit';\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers);\n }\n this.method = normalizeMethod(options.method || this.method || 'GET');\n this.mode = options.mode || this.mode || null;\n this.referrer = null;\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body);\n }\n\n Request.prototype.clone = function() {\n return new Request(this, { body: this._bodyInit })\n };\n\n function decode(body) {\n var form = new FormData();\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=');\n var name = split.shift().replace(/\\+/g, ' ');\n var value = split.join('=').replace(/\\+/g, ' ');\n form.append(decodeURIComponent(name), decodeURIComponent(value));\n }\n });\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers();\n // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n // https://tools.ietf.org/html/rfc7230#section-3.2\n var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ');\n preProcessedHeaders.split(/\\r?\\n/).forEach(function(line) {\n var parts = line.split(':');\n var key = parts.shift().trim();\n if (key) {\n var value = parts.join(':').trim();\n headers.append(key, value);\n }\n });\n return headers\n }\n\n Body.call(Request.prototype);\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {};\n }\n\n this.type = 'default';\n this.status = options.status === undefined ? 200 : options.status;\n this.ok = this.status >= 200 && this.status < 300;\n this.statusText = 'statusText' in options ? options.statusText : 'OK';\n this.headers = new Headers(options.headers);\n this.url = options.url || '';\n this._initBody(bodyInit);\n }\n\n Body.call(Response.prototype);\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n };\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''});\n response.type = 'error';\n return response\n };\n\n var redirectStatuses = [301, 302, 303, 307, 308];\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n };\n\n self.Headers = Headers;\n self.Request = Request;\n self.Response = Response;\n\n self.fetch = function(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init);\n var xhr = new XMLHttpRequest();\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n };\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');\n var body = 'response' in xhr ? xhr.response : xhr.responseText;\n resolve(new Response(body, options));\n };\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'));\n };\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'));\n };\n\n xhr.open(request.method, request.url, true);\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true;\n } else if (request.credentials === 'omit') {\n xhr.withCredentials = false;\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob';\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value);\n });\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);\n })\n };\n self.fetch.polyfill = true;\n})(typeof self !== 'undefined' ? self : this);\n}).call(__root__, void(0));\nvar fetch = __root__.fetch;\nvar Response = fetch.Response = __root__.Response;\nvar Request = fetch.Request = __root__.Request;\nvar Headers = fetch.Headers = __root__.Headers;\nif (typeof module === 'object' && module.exports) {\nmodule.exports = fetch;\n// Needed for TypeScript consumers without esModuleInterop.\nmodule.exports.default = fetch;\n}\n","/** @license React v16.6.1\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';var k=require(\"object-assign\"),n=\"function\"===typeof Symbol&&Symbol.for,p=n?Symbol.for(\"react.element\"):60103,q=n?Symbol.for(\"react.portal\"):60106,r=n?Symbol.for(\"react.fragment\"):60107,t=n?Symbol.for(\"react.strict_mode\"):60108,u=n?Symbol.for(\"react.profiler\"):60114,v=n?Symbol.for(\"react.provider\"):60109,w=n?Symbol.for(\"react.context\"):60110,x=n?Symbol.for(\"react.concurrent_mode\"):60111,y=n?Symbol.for(\"react.forward_ref\"):60112,z=n?Symbol.for(\"react.suspense\"):60113,A=n?Symbol.for(\"react.memo\"):\n60115,B=n?Symbol.for(\"react.lazy\"):60116,C=\"function\"===typeof Symbol&&Symbol.iterator;function aa(a,b,e,c,d,g,h,f){if(!a){a=void 0;if(void 0===b)a=Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\");else{var l=[e,c,d,g,h,f],m=0;a=Error(b.replace(/%s/g,function(){return l[m++]}));a.name=\"Invariant Violation\"}a.framesToPop=1;throw a;}}\nfunction D(a){for(var b=arguments.length-1,e=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=0;c<b;c++)e+=\"&args[]=\"+encodeURIComponent(arguments[c+1]);aa(!1,\"Minified React error #\"+a+\"; visit %s for the full message or use the non-minified dev environment for full errors and additional helpful warnings. \",e)}var E={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},F={};\nfunction G(a,b,e){this.props=a;this.context=b;this.refs=F;this.updater=e||E}G.prototype.isReactComponent={};G.prototype.setState=function(a,b){\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a?D(\"85\"):void 0;this.updater.enqueueSetState(this,a,b,\"setState\")};G.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};function H(){}H.prototype=G.prototype;function I(a,b,e){this.props=a;this.context=b;this.refs=F;this.updater=e||E}var J=I.prototype=new H;\nJ.constructor=I;k(J,G.prototype);J.isPureReactComponent=!0;var K={current:null,currentDispatcher:null},L=Object.prototype.hasOwnProperty,M={key:!0,ref:!0,__self:!0,__source:!0};\nfunction N(a,b,e){var c=void 0,d={},g=null,h=null;if(null!=b)for(c in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(g=\"\"+b.key),b)L.call(b,c)&&!M.hasOwnProperty(c)&&(d[c]=b[c]);var f=arguments.length-2;if(1===f)d.children=e;else if(1<f){for(var l=Array(f),m=0;m<f;m++)l[m]=arguments[m+2];d.children=l}if(a&&a.defaultProps)for(c in f=a.defaultProps,f)void 0===d[c]&&(d[c]=f[c]);return{$$typeof:p,type:a,key:g,ref:h,props:d,_owner:K.current}}\nfunction ba(a,b){return{$$typeof:p,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function O(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===p}function escape(a){var b={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+(\"\"+a).replace(/[=:]/g,function(a){return b[a]})}var P=/\\/+/g,Q=[];function R(a,b,e,c){if(Q.length){var d=Q.pop();d.result=a;d.keyPrefix=b;d.func=e;d.context=c;d.count=0;return d}return{result:a,keyPrefix:b,func:e,context:c,count:0}}\nfunction S(a){a.result=null;a.keyPrefix=null;a.func=null;a.context=null;a.count=0;10>Q.length&&Q.push(a)}\nfunction T(a,b,e,c){var d=typeof a;if(\"undefined\"===d||\"boolean\"===d)a=null;var g=!1;if(null===a)g=!0;else switch(d){case \"string\":case \"number\":g=!0;break;case \"object\":switch(a.$$typeof){case p:case q:g=!0}}if(g)return e(c,a,\"\"===b?\".\"+U(a,0):b),1;g=0;b=\"\"===b?\".\":b+\":\";if(Array.isArray(a))for(var h=0;h<a.length;h++){d=a[h];var f=b+U(d,h);g+=T(d,f,e,c)}else if(null===a||\"object\"!==typeof a?f=null:(f=C&&a[C]||a[\"@@iterator\"],f=\"function\"===typeof f?f:null),\"function\"===typeof f)for(a=f.call(a),h=\n0;!(d=a.next()).done;)d=d.value,f=b+U(d,h++),g+=T(d,f,e,c);else\"object\"===d&&(e=\"\"+a,D(\"31\",\"[object Object]\"===e?\"object with keys {\"+Object.keys(a).join(\", \")+\"}\":e,\"\"));return g}function V(a,b,e){return null==a?0:T(a,\"\",b,e)}function U(a,b){return\"object\"===typeof a&&null!==a&&null!=a.key?escape(a.key):b.toString(36)}function ca(a,b){a.func.call(a.context,b,a.count++)}\nfunction da(a,b,e){var c=a.result,d=a.keyPrefix;a=a.func.call(a.context,b,a.count++);Array.isArray(a)?W(a,c,e,function(a){return a}):null!=a&&(O(a)&&(a=ba(a,d+(!a.key||b&&b.key===a.key?\"\":(\"\"+a.key).replace(P,\"$&/\")+\"/\")+e)),c.push(a))}function W(a,b,e,c,d){var g=\"\";null!=e&&(g=(\"\"+e).replace(P,\"$&/\")+\"/\");b=R(b,g,c,d);V(a,da,b);S(b)}\nvar X={Children:{map:function(a,b,e){if(null==a)return a;var c=[];W(a,c,null,b,e);return c},forEach:function(a,b,e){if(null==a)return a;b=R(null,null,b,e);V(a,ca,b);S(b)},count:function(a){return V(a,function(){return null},null)},toArray:function(a){var b=[];W(a,b,null,function(a){return a});return b},only:function(a){O(a)?void 0:D(\"143\");return a}},createRef:function(){return{current:null}},Component:G,PureComponent:I,createContext:function(a,b){void 0===b&&(b=null);a={$$typeof:w,_calculateChangedBits:b,\n_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null};a.Provider={$$typeof:v,_context:a};return a.Consumer=a},forwardRef:function(a){return{$$typeof:y,render:a}},lazy:function(a){return{$$typeof:B,_ctor:a,_status:-1,_result:null}},memo:function(a,b){return{$$typeof:A,type:a,compare:void 0===b?null:b}},Fragment:r,StrictMode:t,Suspense:z,createElement:N,cloneElement:function(a,b,e){null===a||void 0===a?D(\"267\",a):void 0;var c=void 0,d=k({},a.props),g=a.key,h=a.ref,f=a._owner;\nif(null!=b){void 0!==b.ref&&(h=b.ref,f=K.current);void 0!==b.key&&(g=\"\"+b.key);var l=void 0;a.type&&a.type.defaultProps&&(l=a.type.defaultProps);for(c in b)L.call(b,c)&&!M.hasOwnProperty(c)&&(d[c]=void 0===b[c]&&void 0!==l?l[c]:b[c])}c=arguments.length-2;if(1===c)d.children=e;else if(1<c){l=Array(c);for(var m=0;m<c;m++)l[m]=arguments[m+2];d.children=l}return{$$typeof:p,type:a.type,key:g,ref:h,props:d,_owner:f}},createFactory:function(a){var b=N.bind(null,a);b.type=a;return b},isValidElement:O,version:\"16.6.3\",\n__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{ReactCurrentOwner:K,assign:k}};X.unstable_ConcurrentMode=x;X.unstable_Profiler=u;var Y={default:X},Z=Y&&X||Y;module.exports=Z.default||Z;\n","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","import React from \"react\";\nimport FormData from \"form-data\";\nimport fetch from \"cross-fetch\";\n\nconst {dispatch} = wp.data;\nconst {Button} = wp.components\nconst {Fragment, Component} = wp.element\nconst {__} = wp.i18n\nconst {property} = lodash\n\nclass NGGFeaturedThumbnail extends Component {\n\tstate = {\n\t\timage_url: null,\n\t\tmsg: __('Loading...')\n\t}\n\n\tcomponentDidUpdate(prevProps) {\n\t\tif (this.props.image_id !== prevProps.image_id) {\n\t\t\tthis.updateImageUrl();\n\t\t}\n\t}\n\n\tcomponentDidMount() {\n\t\tthis.updateImageUrl();\n\t}\n\n\tupdateImageUrl = () => {\n\t\tthis.getImageUrl(this.props.image_id)\n\t\t\t.then(image_url => this.setState({image_url}))\n\t\t\t.catch((err) => console.log(err) && this.setState({msg: __(\"Could not load image\")}));\n\t}\n\n\tgetImageUrl = image_id => {\n\t\tconst data = new FormData();\n\n\t\tdata.append('action', 'get_image');\n\t\tdata.append('image_id', image_id);\n\n\t\treturn fetch(photocrati_ajax.url,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: data,\n\t\t\t\theaders: {\n\t\t\t\t\t'Accept': 'application/json'\n\t\t\t\t}\n\t\t\t})\n\t\t\t.then(res => res.json())\n\t\t\t.then(property('image.image_url'));\n\t}\n\n\trender() {\n\t\tconst {msg} = this.state;\n\n\t\tconst style = {\n\t\t\tpaddingTop: '5px',\n\t\t\tpaddingBottom: '5px'\n\t\t};\n\n\t\tconst el = this.state.image_url ? <img src={this.state.image_url}/> : <span>{msg}</span>;\n\n\t\treturn (\n\t\t\t<div style={style}>{el}</div>\n\t\t);\n\t}\n}\n\nexport default class NGGFeaturedImage extends Component {\n\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.state = {\n\t\t\tngg_id: props.meta.ngg_post_thumbnail,\n\t\t\twp_ml_id: props.featuredImageId\n\t\t}\n\t}\n\n\thandleOpenClick = event => {\n\t\ttop.set_ngg_post_thumbnail = this.onUpdatePostThumbnail;\n\t\ttb_show(\n\t\t\t\"Set NextGEN Featured Image\",\n\t\t\tngg_featured_image.modal_url.replace(/%post_id%/, this.props.currentPostId)\n\t\t);\n\t}\n\n\thandleRemoveClick = event => {\n\t\tconst meta = {\n\t\t\t...this.props.meta,\n\t\t\tngg_post_thumbnail: 0,\n\t\t\tfeatured_media: 0\n\t\t};\n\t\tthis.setState({\n\t\t\tngg_id: 0\n\t\t});\n\t\tdispatch('core/editor').editPost({meta});\n\t}\n\n\tonUpdatePostThumbnail = ngg_image_id => {\n\t\ttb_remove()\n\t\tconst meta = {\n\t\t\t...this.props.meta,\n\t\t\tngg_post_thumbnail: parseInt(ngg_image_id)\n\t\t};\n\t\tthis.setState({\n\t\t\tngg_id: meta.ngg_post_thumbnail\n\t\t});\n\t\tdispatch('core/editor').editPost({meta});\n\t}\n\n\trender() {\n\t\treturn (\n\t\t\t<Fragment>\n\t\t\t\t<Button style={{marginTop: '10px'}}\n\t\t\t\t\t\tonClick={this.handleOpenClick}\n\t\t\t\t\t\tclassName=\"editor-post-featured-image__toggle\">\n\t\t\t\t\t{__('Set NextGEN Featured Image')}\n\t\t\t\t</Button>\n\n\t\t\t\t{this.state.ngg_id > 0 && this.props.meta.ngg_post_thumbnail !== this.state.ngg_id ?\n\t\t\t\t\t<Fragment>\n\t\t\t\t\t\t<NGGFeaturedThumbnail image_id={this.state.ngg_id}/>\n\t\t\t\t\t\t<Button onClick={this.handleRemoveClick}\n\t\t\t\t\t\t\t\tclassName=\"is-link is-destructive\">\n\t\t\t\t\t\t\t{__('Remove featured image')}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</Fragment>\n\t\t\t\t\t: ''}\n\t\t\t</Fragment>\n\t\t);\n\t}\n}","import React from \"react\";\nimport NGGFeaturedImage from './components/ngg-post-thumbnail.jsx';\n\nconst {select} = wp.data;\nconst {Fragment} = wp.element\n\nfunction setFeaturedImageDisplay(OriginalComponent) {\n return (props) => {\n const meta = select('core/editor').getCurrentPostAttribute('meta');\n let featuredImageWidget;\n if ('undefined' !== typeof meta) {\n featuredImageWidget = <NGGFeaturedImage {...props} meta={meta}/>;\n }\n return (\n <Fragment>\n <OriginalComponent {...props}/>\n {featuredImageWidget}\n </Fragment>\n );\n }\n}\n\nwp.hooks.addFilter('editor.PostFeaturedImage', 'imagely/featured-image-display', setFeaturedImageDisplay);"],"sourceRoot":""}
products/photocrati_nextgen/modules/nextgen_block/static/src/post-thumbnail.jsx CHANGED
@@ -7,10 +7,14 @@ const {Fragment} = wp.element
7
  function setFeaturedImageDisplay(OriginalComponent) {
8
  return (props) => {
9
  const meta = select('core/editor').getCurrentPostAttribute('meta');
 
 
 
 
10
  return (
11
  <Fragment>
12
  <OriginalComponent {...props}/>
13
- <NGGFeaturedImage {...props} meta={meta}/>
14
  </Fragment>
15
  );
16
  }
7
  function setFeaturedImageDisplay(OriginalComponent) {
8
  return (props) => {
9
  const meta = select('core/editor').getCurrentPostAttribute('meta');
10
+ let featuredImageWidget;
11
+ if ('undefined' !== typeof meta) {
12
+ featuredImageWidget = <NGGFeaturedImage {...props} meta={meta}/>;
13
+ }
14
  return (
15
  <Fragment>
16
  <OriginalComponent {...props}/>
17
+ {featuredImageWidget}
18
  </Fragment>
19
  );
20
  }
products/photocrati_nextgen/modules/nextgen_data/module.nextgen_data.php CHANGED
@@ -151,7 +151,8 @@ class M_NextGen_Data extends C_Base_Module
151
  $config = HTMLPurifier_Config::createDefault();
152
  $config->set('Cache.DefinitionImpl', NULL);
153
  $purifier = new HTMLPurifier($config);
154
- return $purifier->purify($data);
 
155
  }
156
  else {
157
  // wp_strip_all_tags() is misleading in a way - it only removes <script> and <style>
151
  $config = HTMLPurifier_Config::createDefault();
152
  $config->set('Cache.DefinitionImpl', NULL);
153
  $purifier = new HTMLPurifier($config);
154
+ $default_return = $purifier->purify($data);
155
+ return apply_filters('ngg_html_sanitization', $default_return, $data);
156
  }
157
  else {
158
  // wp_strip_all_tags() is misleading in a way - it only removes <script> and <style>
products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php CHANGED
@@ -699,6 +699,16 @@ class C_Exif_Writer
699
  return FALSE;
700
  }
701
  try {
 
 
 
 
 
 
 
 
 
 
702
  // Copy EXIF data to the new image and write it
703
  $new_image = new PelJpeg($filename);
704
  $new_image->setExif($metadata['exif']);
@@ -709,7 +719,9 @@ class C_Exif_Writer
709
  }
710
  } catch (PelInvalidArgumentException $exception) {
711
  return FALSE;
712
- } catch (PelJpegInvalidMarkerException $exception) {
 
 
713
  return FALSE;
714
  }
715
  }
@@ -783,31 +795,6 @@ class C_Exif_Writer
783
  $extension = M_I18n::mb_pathinfo($filename, PATHINFO_EXTENSION);
784
  return in_array(strtolower($extension), array('jpeg', 'jpg', 'jpeg_backup', 'jpg_backup')) ? TRUE : FALSE;
785
  }
786
- /**
787
- * Sets the EXIF' Orientation field to 1 aka Default or "TopLeft"
788
- *
789
- * This method is necessary to prevent images rotated by NextGen to appear even further rotated.
790
- * @param array $exif
791
- * @return array
792
- */
793
- public static function reset_orientation($exif = array())
794
- {
795
- $tiff = $exif->getTiff();
796
- if (empty($tiff)) {
797
- return $exif;
798
- }
799
- $ifd0 = $tiff->getIfd();
800
- if (empty($ifd0)) {
801
- return $exif;
802
- }
803
- $orientation = $ifd0->getEntry(PelTag::ORIENTATION);
804
- if (empty($orientation)) {
805
- return $exif;
806
- }
807
- $orientation = new PelEntryShort(PelTag::ORIENTATION, 1);
808
- $ifd0->addEntry($orientation);
809
- return $exif;
810
- }
811
  }
812
  class Mixin_NextGen_Gallery_Validation
813
  {
@@ -1044,8 +1031,11 @@ class Mixin_Gallery_Mapper extends Mixin
1044
  }
1045
  $retval = $this->call_parent('_save_entity', $entity);
1046
  if ($retval) {
1047
- wp_mkdir_p($storage->get_gallery_abspath($entity));
1048
- do_action('ngg_created_new_gallery', $entity->{$entity->id_field});
 
 
 
1049
  C_Photocrati_Transient_Manager::flush('displayed_gallery_rendering');
1050
  }
1051
  return $retval;
@@ -3259,12 +3249,12 @@ class C_NggLegacy_Thumbnail
3259
  function rotateImageAngle($angle = 90)
3260
  {
3261
  if (function_exists('imagerotate')) {
3262
- $this->workingImage = imagerotate($this->oldImage, 360 - $angle, 0);
3263
- // imagerotate() rotates CCW
3264
  $this->currentDimensions['width'] = imagesx($this->workingImage);
3265
  $this->currentDimensions['height'] = imagesy($this->workingImage);
3266
  $this->oldImage = $this->workingImage;
3267
- $this->newImage = $this->workingImage;
 
 
3268
  return true;
3269
  }
3270
  $this->workingImage = imagecreatetruecolor($this->currentDimensions['height'], $this->currentDimensions['width']);
@@ -3872,26 +3862,12 @@ class Mixin_GalleryStorage_Base_Dynamic extends Mixin
3872
  $thumbnail->format = strtoupper($format_list[$clone_format]);
3873
  }
3874
  $thumbnail = apply_filters('ngg_before_save_thumbnail', $thumbnail);
 
3875
  $backup_path = $image_path . '_backup';
3876
- try {
3877
- $exif_abspath = @file_exists($backup_path) ? $backup_path : $image_path;
3878
- $exif_iptc = @C_Exif_Writer::read_metadata($exif_abspath);
3879
- } catch (PelException $ex) {
3880
- error_log("Could not read image metadata {$exif_abspath}");
3881
- error_log(print_r($ex, TRUE));
3882
- }
3883
  $thumbnail->save($destpath, $quality);
3884
- // We've just rotated the image however the EXIF metadata contains an Orientation tag. To prevent
3885
- // certain browsers from rotating our already-rotated image we reset the Orientation tag to the default.
3886
- if ($remove_orientation_exif && !empty($exif_iptc['exif'])) {
3887
- $exif_iptc['exif'] = @C_Exif_Writer::reset_orientation($exif_iptc['exif']);
3888
- }
3889
- try {
3890
- @C_Exif_Writer::write_metadata($destpath, $exif_iptc);
3891
- } catch (PelException $ex) {
3892
- error_log("Could not write data to {$destpath}");
3893
- error_log(print_r($ex, TRUE));
3894
- }
3895
  }
3896
  }
3897
  return $thumbnail;
699
  return FALSE;
700
  }
701
  try {
702
+ // Prevent the orientation tag from ever being anything other than normal horizontal
703
+ /** @var PelExif $exif */
704
+ $exif = $metadata['exif'];
705
+ $tiff = $exif->getTiff();
706
+ $ifd0 = $tiff->getIfd();
707
+ $orientation = new PelEntryShort(PelTag::ORIENTATION, 1);
708
+ $ifd0->addEntry($orientation);
709
+ $tiff->setIfd($ifd0);
710
+ $exif->setTiff($tiff);
711
+ $metadata['exif'] = $exif;
712
  // Copy EXIF data to the new image and write it
713
  $new_image = new PelJpeg($filename);
714
  $new_image->setExif($metadata['exif']);
719
  }
720
  } catch (PelInvalidArgumentException $exception) {
721
  return FALSE;
722
+ } catch (PelInvalidDataException $exception) {
723
+ error_log("Could not write data to {$filename}");
724
+ error_log(print_r($exception, TRUE));
725
  return FALSE;
726
  }
727
  }
795
  $extension = M_I18n::mb_pathinfo($filename, PATHINFO_EXTENSION);
796
  return in_array(strtolower($extension), array('jpeg', 'jpg', 'jpeg_backup', 'jpg_backup')) ? TRUE : FALSE;
797
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
798
  }
799
  class Mixin_NextGen_Gallery_Validation
800
  {
1031
  }
1032
  $retval = $this->call_parent('_save_entity', $entity);
1033
  if ($retval) {
1034
+ $path = $storage->get_gallery_abspath($entity);
1035
+ if (!file_exists($path)) {
1036
+ wp_mkdir_p($path);
1037
+ do_action('ngg_created_new_gallery', $entity->{$entity->id_field});
1038
+ }
1039
  C_Photocrati_Transient_Manager::flush('displayed_gallery_rendering');
1040
  }
1041
  return $retval;
3249
  function rotateImageAngle($angle = 90)
3250
  {
3251
  if (function_exists('imagerotate')) {
 
 
3252
  $this->currentDimensions['width'] = imagesx($this->workingImage);
3253
  $this->currentDimensions['height'] = imagesy($this->workingImage);
3254
  $this->oldImage = $this->workingImage;
3255
+ // imagerotate() rotates CCW ;
3256
+ // See for help: https://evertpot.com/115/
3257
+ $this->newImage = imagerotate($this->oldImage, 360 - $angle, 0);
3258
  return true;
3259
  }
3260
  $this->workingImage = imagecreatetruecolor($this->currentDimensions['height'], $this->currentDimensions['width']);
3862
  $thumbnail->format = strtoupper($format_list[$clone_format]);
3863
  }
3864
  $thumbnail = apply_filters('ngg_before_save_thumbnail', $thumbnail);
3865
+ // Always retrieve metadata from the backup when possible
3866
  $backup_path = $image_path . '_backup';
3867
+ $exif_abspath = @file_exists($backup_path) ? $backup_path : $image_path;
3868
+ $exif_iptc = @C_Exif_Writer::read_metadata($exif_abspath);
 
 
 
 
 
3869
  $thumbnail->save($destpath, $quality);
3870
+ @C_Exif_Writer::write_metadata($destpath, $exif_iptc);
 
 
 
 
 
 
 
 
 
 
3871
  }
3872
  }
3873
  return $thumbnail;
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/TODO DELETED
@@ -1,74 +0,0 @@
1
- TODO file for PEL: PHP Exif Library. A library with support for
2
- reading and writing Exif headers in JPEG and TIFF images using PHP.
3
-
4
- Copyright (C) 2004, 2005, 2006 Martin Geisler.
5
- Licensed under the GNU GPL, see COPYING for details.
6
-
7
-
8
- TODO List for PEL
9
- *****************
10
-
11
- In addition to the following list, then the source contains a number
12
- of comments beginning with `TODO' and `FIXME' which marks extra places
13
- where attention is needed.
14
-
15
- The list has been roughly ordered by priority and the release
16
- targeted.
17
-
18
-
19
- PEL Version 1.0
20
- ---------------
21
-
22
- * Add convenience functions.
23
- It would be nice to have functions that could give you a particular
24
- entry or the embedded thumbnail with just one function call.
25
- Manually traversing the directory structure (and repeatedly
26
- checking for null pointers) requires too big a knowledge of the
27
- structure of JPEG, TIFF, and Exif formats.
28
-
29
-
30
- PEL Version 1.x
31
- ---------------
32
-
33
- * Only load necessary data.
34
- SF #1210126: instead of parsing the entire JPEG/TIFF image, we
35
- should load data as necessary. This will save memory with big
36
- images.
37
-
38
- * Interpret the MakerNotes.
39
- The libexif project already has code for interpretating the
40
- MakerNotes for a number of different camera models.
41
-
42
- * Handle character encodings of the USER_COMMENT tag.
43
- The first eight bytes store the character encoding, but PEL ignores
44
- them for now. Using the Multibyte String PHP extension we should
45
- be able to convert the data.
46
-
47
- * Deal with characters outside Latin-1 in PelEntryWindowsString.
48
- This needs testing from people running Windows XP set to a locale
49
- different from Latin-1.
50
-
51
-
52
- PEL Version 2.0
53
- ---------------
54
-
55
- * Restructure information about tags.
56
- Currently information about the tags are stored in several places
57
- around the code, making updates difficult. All information about a
58
- tag should be stored at one place, maybe by having a class per tag
59
- (how well does PHP handle 142 small classes?).
60
-
61
- The information in question is:
62
-
63
- - hex code,
64
- - title,
65
- - name,
66
- - description
67
- - format,
68
- - components,
69
- - valid IFD types,
70
- - how to load data,
71
- - how to display (the getText() method)
72
-
73
- This will most likely break API compatability and is delayed for
74
- PEL 2.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/examples/README.md DELETED
@@ -1,56 +0,0 @@
1
- # README file for PEL Examples
2
-
3
- ## PEL Examples
4
-
5
- This directory contains various examples of how PEL can be used in
6
- small scripts. The scripts are meant to be executed from the command
7
- line and they assume that you have PHP installed as /usr/bin/php. If
8
- that is not the case, then please adjust the first line before
9
- executing the scripts, or simply execute them as
10
-
11
- ```
12
- % php <script> <arguments>
13
- ```
14
-
15
- and let your shell find the PHP executable.
16
-
17
- The examples are:
18
-
19
- * dirsort.php: an example of how to use PEL to automatically sort a
20
- collection of photos into different folders.
21
-
22
- The script accepts a number of filenames on the command line, and
23
- will move them to folders based on the month the photo was taken.
24
-
25
- * dump-image.php: a simple script that will load an image and show the
26
- structure.
27
-
28
- A JPEG or TIFF image should be specified on the command line. The
29
- dump will give detailed information about the structure in the
30
- image.
31
-
32
- * edit-description.php: a big example showing how to update the
33
- ImageDescription Exif tag using PEL.
34
-
35
- The script is heavely commented, and should be used as a good
36
- reference as to how PEL works and how it should be used.
37
-
38
- * gps.php: shows how to add GPS information to an image using PEL.
39
-
40
- * rename.php: a script similar to dirsort.php, only that this one will
41
- rename photos to a filename containing the full date and time taken
42
- from the DateTime Exif tag.
43
-
44
- * resize.php: a script to resize images.
45
-
46
-
47
- ## Contributing New Examples
48
-
49
- More examples are needed! If you have a neat example of how PEL can
50
- be used, then please contribute it to PEL. Please submit it as a new
51
- item in the Github issue tracker:
52
-
53
- http://github.com/lsolesen/pel/issues
54
-
55
- Or issue a pull request. It will then be included in the next release
56
- of PEL, of course with full credit in the AUTHORS file.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/examples/dirsort.php DELETED
@@ -1,105 +0,0 @@
1
- #!/usr/bin/php
2
- <?php
3
-
4
- /**
5
- * PEL: PHP Exif Library.
6
- * A library with support for reading and
7
- * writing all Exif headers in JPEG and TIFF images using PHP.
8
- *
9
- * Copyright (C) 2004, 2006 Martin Geisler.
10
- *
11
- * This program is free software; you can redistribute it and/or modify
12
- * it under the terms of the GNU General Public License as published by
13
- * the Free Software Foundation; either version 2 of the License, or
14
- * (at your option) any later version.
15
- *
16
- * This program is distributed in the hope that it will be useful,
17
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- * GNU General Public License for more details.
20
- *
21
- * You should have received a copy of the GNU General Public License
22
- * along with this program in the file COPYING; if not, write to the
23
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
24
- * Boston, MA 02110-1301 USA
25
- */
26
-
27
- /* a printf() variant that appends a newline to the output. */
28
- function println($args)
29
- {
30
- $args = func_get_args();
31
- $fmt = array_shift($args);
32
- vprintf($fmt . "\n", $args);
33
- }
34
-
35
- /* Make PEL speak the users language, if it is available. */
36
- setlocale(LC_ALL, '');
37
- require_once '../autoload.php';
38
-
39
- use lsolesen\pel\PelDataWindow;
40
- use lsolesen\pel\PelJpeg;
41
- use lsolesen\pel\PelTiff;
42
-
43
- $prog = array_shift($argv);
44
- $error = false;
45
-
46
- if (isset($argv[0]) && $argv[0] == '-d') {
47
- Pel::setDebug(true);
48
- array_shift($argv);
49
- }
50
-
51
- if (empty($argv)) {
52
- println('Usage: %s [-d] <file> ...', $prog);
53
- println('Optional arguments:');
54
- println(' -d turn debug output on.');
55
- println('Mandatory arguments:');
56
- println(' file ... one or more file names.');
57
- exit(1);
58
- }
59
-
60
- /*
61
- * We typically need lots of RAM to parse TIFF images since they tend
62
- * to be big and uncompressed.
63
- */
64
- ini_set('memory_limit', '32M');
65
-
66
- foreach ($argv as $file) {
67
- println('Reading file "%s".', $file);
68
- $data = new PelDataWindow(file_get_contents($file));
69
-
70
- if (PelJpeg::isValid($data)) {
71
- $jpeg = new PelJpeg();
72
- $jpeg->load($data);
73
- $app1 = $jpeg->getExif();
74
- if ($app1 == null) {
75
- println('Skipping %s because no APP1 section was found.', $file);
76
- continue;
77
- }
78
-
79
- $tiff = $app1->getTiff();
80
- } elseif (PelTiff::isValid($data)) {
81
- $tiff = new PelTiff($data);
82
- } else {
83
- println('Unrecognized image format! Skipping.');
84
- continue;
85
- }
86
-
87
- $ifd0 = $tiff->getIfd();
88
- $entry = $ifd0->getEntry(PelTag::DATE_TIME);
89
-
90
- if ($entry == null) {
91
- println('Skipping %s because no DATE_TIME tag was found.', $file);
92
- continue;
93
- }
94
-
95
- $time = $entry->getValue();
96
-
97
- $new = gmdate('../Y-m/', $time) . $file;
98
-
99
- if (file_exists($new)) {
100
- die('Aborting, ' . $new . ' exists!');
101
- }
102
- println('mv %s %s', $file, $new);
103
-
104
- rename($file, $new);
105
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/examples/dump-image.php DELETED
@@ -1,99 +0,0 @@
1
- #!/usr/bin/php
2
- <?php
3
-
4
- /**
5
- * PEL: PHP Exif Library.
6
- * A library with support for reading and
7
- * writing all Exif headers in JPEG and TIFF images using PHP.
8
- *
9
- * Copyright (C) 2004, 2005, 2006 Martin Geisler.
10
- *
11
- * This program is free software; you can redistribute it and/or modify
12
- * it under the terms of the GNU General Public License as published by
13
- * the Free Software Foundation; either version 2 of the License, or
14
- * (at your option) any later version.
15
- *
16
- * This program is distributed in the hope that it will be useful,
17
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- * GNU General Public License for more details.
20
- *
21
- * You should have received a copy of the GNU General Public License
22
- * along with this program in the file COPYING; if not, write to the
23
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
24
- * Boston, MA 02110-1301 USA
25
- */
26
-
27
- /* Make PEL speak the users language, if it is available. */
28
- setlocale(LC_ALL, '');
29
-
30
- require_once dirname(__FILE__) . '/../vendor/autoload.php';
31
-
32
- use lsolesen\pel\Pel;
33
- use lsolesen\pel\PelDataWindow;
34
- use lsolesen\pel\PelJpeg;
35
- use lsolesen\pel\PelTiff;
36
-
37
- $prog = array_shift($argv);
38
- $file = '';
39
-
40
- while (! empty($argv)) {
41
- switch ($argv[0]) {
42
- case '-d':
43
- Pel::setDebug(true);
44
- break;
45
- case '-s':
46
- Pel::setStrictParsing(true);
47
- break;
48
- default:
49
- $file = $argv[0];
50
- break;
51
- }
52
- array_shift($argv);
53
- }
54
-
55
- if (empty($file)) {
56
- printf("Usage: %s [-d] [-s] <filename>\n", $prog);
57
- print("Optional arguments:\n");
58
- print(" -d turn debug output on.\n");
59
- print(" -s turn strict parsing on (halt on errors).\n");
60
- print("Mandatory arguments:\n");
61
- print(" filename a JPEG or TIFF image.\n");
62
- exit(1);
63
- }
64
-
65
- if (! is_readable($file)) {
66
- printf("Unable to read %s!\n", $file);
67
- exit(1);
68
- }
69
-
70
- /*
71
- * We typically need lots of RAM to parse TIFF images since they tend
72
- * to be big and uncompressed.
73
- */
74
- ini_set('memory_limit', '32M');
75
-
76
- $data = new PelDataWindow(file_get_contents($file));
77
-
78
- if (PelJpeg::isValid($data)) {
79
- $img = new PelJpeg();
80
- } elseif (PelTiff::isValid($data)) {
81
- $img = new PelTiff();
82
- } else {
83
- print("Unrecognized image format! The first 16 bytes follow:\n");
84
- PelConvert::bytesToDump($data->getBytes(0, 16));
85
- exit(1);
86
- }
87
-
88
- /* Try loading the data. */
89
- $img->load($data);
90
-
91
- print($img);
92
-
93
- /* Deal with any exceptions: */
94
- if (count(Pel::getExceptions()) > 0) {
95
- print("\nThe following errors were encountered while loading the image:\n");
96
- foreach (Pel::getExceptions() as $e) {
97
- print("\n" . $e->__toString());
98
- }
99
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/examples/edit-description.php DELETED
@@ -1,247 +0,0 @@
1
- #!/usr/bin/php
2
- <?php
3
-
4
- /**
5
- * PEL: PHP Exif Library.
6
- * A library with support for reading and
7
- * writing all Exif headers in JPEG and TIFF images using PHP.
8
- *
9
- * Copyright (C) 2004, 2005, 2006, 2007 Martin Geisler.
10
- *
11
- * This program is free software; you can redistribute it and/or modify
12
- * it under the terms of the GNU General Public License as published by
13
- * the Free Software Foundation; either version 2 of the License, or
14
- * (at your option) any later version.
15
- *
16
- * This program is distributed in the hope that it will be useful,
17
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- * GNU General Public License for more details.
20
- *
21
- * You should have received a copy of the GNU General Public License
22
- * along with this program in the file COPYING; if not, write to the
23
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
24
- * Boston, MA 02110-1301 USA
25
- */
26
-
27
- /* a printf() variant that appends a newline to the output. */
28
- function println($args)
29
- {
30
- $args = func_get_args();
31
- $fmt = array_shift($args);
32
- vprintf($fmt . "\n", $args);
33
- }
34
-
35
- /* Make PEL speak the users language, if it is available. */
36
- setlocale(LC_ALL, '');
37
-
38
- /*
39
- * Load the required files. One would normally just require the
40
- * PelJpeg.php file for dealing with JPEG images, but because this
41
- * example can handle both JPEG and TIFF it loads the PelDataWindow
42
- * class too.
43
- */
44
- require_once '../autoload.php';
45
-
46
- use lsolesen\pel\PelDataWindow;
47
- use lsolesen\pel\PelJpeg;
48
- use lsolesen\pel\PelTiff;
49
-
50
- /*
51
- * Store the name of the script in $prog and remove this first part of
52
- * the command line.
53
- */
54
- $prog = array_shift($argv);
55
- $error = false;
56
-
57
- /*
58
- * The next argument could be -d to signal debug mode where lots of
59
- * extra information is printed out when the image is parsed.
60
- */
61
- if (isset($argv[0]) && $argv[0] == '-d') {
62
- Pel::setDebug(true);
63
- array_shift($argv);
64
- }
65
-
66
- /* The mandatory input filename. */
67
- if (isset($argv[0])) {
68
- $input = array_shift($argv);
69
- } else {
70
- $error = true;
71
- }
72
-
73
- /* The mandatory output filename. */
74
- if (isset($argv[0])) {
75
- $output = array_shift($argv);
76
- } else {
77
- $error = true;
78
- }
79
-
80
- /*
81
- * Usage information is printed if an error was found in the command
82
- * line arguments.
83
- */
84
- if ($error) {
85
- println('Usage: %s [-d] <input> <output> [desc]', $prog);
86
- println('Optional arguments:');
87
- println(' -d turn debug output on.');
88
- println(' desc the new description.');
89
- println('Mandatory arguments:');
90
- println(' input the input file, a JPEG or TIFF image.');
91
- println(' output the output file for the changed image.');
92
- exit(1);
93
- }
94
-
95
- /* Any remaining arguments are considered the new description. */
96
- $description = implode(' ', $argv);
97
-
98
- /*
99
- * We typically need lots of RAM to parse TIFF images since they tend
100
- * to be big and uncompressed.
101
- */
102
- ini_set('memory_limit', '32M');
103
-
104
- /*
105
- * The input file is now read into a PelDataWindow object. At this
106
- * point we do not know if the file stores JPEG or TIFF data, so
107
- * instead of using one of the loadFile methods on PelJpeg or PelTiff
108
- * we store the data in a PelDataWindow.
109
- */
110
- println('Reading file "%s".', $input);
111
- $data = new PelDataWindow(file_get_contents($input));
112
-
113
- /*
114
- * The static isValid methods in PelJpeg and PelTiff will tell us in
115
- * an efficient maner which kind of data we are dealing with.
116
- */
117
- if (PelJpeg::isValid($data)) {
118
- /*
119
- * The data was recognized as JPEG data, so we create a new empty
120
- * PelJpeg object which will hold it. When we want to save the
121
- * image again, we need to know which object to same (using the
122
- * getBytes method), so we store $jpeg as $file too.
123
- */
124
- $jpeg = $file = new PelJpeg();
125
-
126
- /*
127
- * We then load the data from the PelDataWindow into our PelJpeg
128
- * object. No copying of data will be done, the PelJpeg object will
129
- * simply remember that it is to ask the PelDataWindow for data when
130
- * required.
131
- */
132
- $jpeg->load($data);
133
-
134
- /*
135
- * The PelJpeg object contains a number of sections, one of which
136
- * might be our Exif data. The getExif() method is a convenient way
137
- * of getting the right section with a minimum of fuzz.
138
- */
139
- $exif = $jpeg->getExif();
140
-
141
- if ($exif == null) {
142
- /*
143
- * Ups, there is no APP1 section in the JPEG file. This is where
144
- * the Exif data should be.
145
- */
146
- println('No APP1 section found, added new.');
147
-
148
- /*
149
- * In this case we simply create a new APP1 section (a PelExif
150
- * object) and adds it to the PelJpeg object.
151
- */
152
- $exif = new PelExif();
153
- $jpeg->setExif($exif);
154
-
155
- /* We then create an empty TIFF structure in the APP1 section. */
156
- $tiff = new PelTiff();
157
- $exif->setTiff($tiff);
158
- } else {
159
- /*
160
- * Surprice, surprice: Exif data is really just TIFF data! So we
161
- * extract the PelTiff object for later use.
162
- */
163
- println('Found existing APP1 section.');
164
- $tiff = $exif->getTiff();
165
- }
166
- } elseif (PelTiff::isValid($data)) {
167
- /*
168
- * The data was recognized as TIFF data. We prepare a PelTiff
169
- * object to hold it, and record in $file that the PelTiff object is
170
- * the top-most object (the one on which we will call getBytes).
171
- */
172
- $tiff = $file = new PelTiff();
173
- /* Now load the data. */
174
- $tiff->load($data);
175
- } else {
176
- /*
177
- * The data was not recognized as either JPEG or TIFF data.
178
- * Complain loudly, dump the first 16 bytes, and exit.
179
- */
180
- println('Unrecognized image format! The first 16 bytes follow:');
181
- PelConvert::bytesToDump($data->getBytes(0, 16));
182
- exit(1);
183
- }
184
-
185
- /*
186
- * TIFF data has a tree structure much like a file system. There is a
187
- * root IFD (Image File Directory) which contains a number of entries
188
- * and maybe a link to the next IFD. The IFDs are chained together
189
- * like this, but some of them can also contain what is known as
190
- * sub-IFDs. For our purpose we only need the first IFD, for this is
191
- * where the image description should be stored.
192
- */
193
- $ifd0 = $tiff->getIfd();
194
-
195
- if ($ifd0 == null) {
196
- /*
197
- * No IFD in the TIFF data? This probably means that the image
198
- * didn't have any Exif information to start with, and so an empty
199
- * PelTiff object was inserted by the code above. But this is no
200
- * problem, we just create and inserts an empty PelIfd object.
201
- */
202
- println('No IFD found, adding new.');
203
- $ifd0 = new PelIfd(PelIfd::IFD0);
204
- $tiff->setIfd($ifd0);
205
- }
206
-
207
- /*
208
- * Each entry in an IFD is identified with a tag. This will load the
209
- * ImageDescription entry if it is present. If the IFD does not
210
- * contain such an entry, null will be returned.
211
- */
212
- $desc = $ifd0->getEntry(PelTag::IMAGE_DESCRIPTION);
213
-
214
- /* We need to check if the image already had a description stored. */
215
- if ($desc == null) {
216
- /* The was no description in the image. */
217
- println('Added new IMAGE_DESCRIPTION entry with "%s".', $description);
218
-
219
- /*
220
- * In this case we simply create a new PelEntryAscii object to hold
221
- * the description. The constructor for PelEntryAscii needs to know
222
- * the tag and contents of the new entry.
223
- */
224
- $desc = new PelEntryAscii(PelTag::IMAGE_DESCRIPTION, $description);
225
-
226
- /*
227
- * This will insert the newly created entry with the description
228
- * into the IFD.
229
- */
230
- $ifd0->addEntry($desc);
231
- } else {
232
- /* An old description was found in the image. */
233
- println('Updating IMAGE_DESCRIPTION entry from "%s" to "%s".', $desc->getValue(), $description);
234
-
235
- /* The description is simply updated with the new description. */
236
- $desc->setValue($description);
237
- }
238
-
239
- /*
240
- * At this point the image on disk has not been changed, it is only
241
- * the object structure in memory which represent the image which has
242
- * been altered. This structure can be converted into a string of
243
- * bytes with the getBytes method, and saving this in the output file
244
- * completes the script.
245
- */
246
- println('Writing file "%s".', $output);
247
- $file->saveFile($output);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/examples/gps.php DELETED
@@ -1,214 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * PEL: PHP Exif Library.
5
- * A library with support for reading and
6
- * writing all Exif headers in JPEG and TIFF images using PHP.
7
- *
8
- * Copyright (C) 2007 Martin Geisler.
9
- *
10
- * This program is free software; you can redistribute it and/or modify
11
- * it under the terms of the GNU General Public License as published by
12
- * the Free Software Foundation; either version 2 of the License, or
13
- * (at your option) any later version.
14
- *
15
- * This program is distributed in the hope that it will be useful,
16
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
- * GNU General Public License for more details.
19
- *
20
- * You should have received a copy of the GNU General Public License
21
- * along with this program in the file COPYING; if not, write to the
22
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
23
- * Boston, MA 02110-1301 USA
24
- */
25
-
26
- /*
27
- * Contributed by Andac Aydin (aandac@gmx.de).
28
- * This example shows how one can add GPS information to a JPEG image.
29
- * Any Exif information in the image will be overwritten by the new
30
- * information.
31
- * This example includes two functions:
32
- * - convertDecimalTpDMS() converts decimal GPS coordinates (how you use them
33
- * in Google Maps for example) to the conventional coordinate-system
34
- * used in Exif data.
35
- * - addGpsInfo() adds several Exif tags to your JPEG file.
36
- */
37
- require_once '../autoload.php';
38
-
39
- use lsolesen\pel\PelJpeg;
40
- use lsolesen\pel\PelTiff;
41
-
42
- /**
43
- * Convert a decimal degree into degrees, minutes, and seconds.
44
- *
45
- * @param
46
- * int the degree in the form 123.456. Must be in the interval
47
- * [-180, 180].
48
- *
49
- * @return array a triple with the degrees, minutes, and seconds. Each
50
- * value is an array itself, suitable for passing to a
51
- * PelEntryRational. If the degree is outside the allowed interval,
52
- * null is returned instead.
53
- */
54
- function convertDecimalToDMS($degree)
55
- {
56
- if ($degree > 180 || $degree < - 180) {
57
- return null;
58
- }
59
-
60
- $degree = abs($degree); // make sure number is positive
61
- // (no distinction here for N/S
62
- // or W/E).
63
-
64
- $seconds = $degree * 3600; // Total number of seconds.
65
-
66
- $degrees = floor($degree); // Number of whole degrees.
67
- $seconds -= $degrees * 3600; // Subtract the number of seconds
68
- // taken by the degrees.
69
-
70
- $minutes = floor($seconds / 60); // Number of whole minutes.
71
- $seconds -= $minutes * 60; // Subtract the number of seconds
72
- // taken by the minutes.
73
-
74
- $seconds = round($seconds * 100, 0); // Round seconds with a 1/100th
75
- // second precision.
76
-
77
- return [
78
- [
79
- $degrees,
80
- 1
81
- ],
82
- [
83
- $minutes,
84
- 1
85
- ],
86
- [
87
- $seconds,
88
- 100
89
- ]
90
- ];
91
- }
92
-
93
- /**
94
- * Add GPS information to an image basic metadata.
95
- * Any old Exif data
96
- * is discarded.
97
- *
98
- * @param
99
- * string the input filename.
100
- *
101
- * @param
102
- * string the output filename. An updated copy of the input
103
- * image is saved here.
104
- *
105
- * @param
106
- * string image description.
107
- *
108
- * @param
109
- * string user comment.
110
- *
111
- * @param
112
- * string camera model.
113
- *
114
- * @param
115
- * float longitude expressed as a fractional number of degrees,
116
- * e.g. 12.345�. Negative values denotes degrees west of Greenwich.
117
- *
118
- * @param
119
- * float latitude expressed as for longitude. Negative values
120
- * denote degrees south of equator.
121
- *
122
- * @param
123
- * float the altitude, negative values express an altitude
124
- * below sea level.
125
- *
126
- * @param
127
- * string the date and time.
128
- */
129
- function addGpsInfo($input, $output, $description, $comment, $model, $longitude, $latitude, $altitude, $date_time)
130
- {
131
- /* Load the given image into a PelJpeg object */
132
- $jpeg = new PelJpeg($input);
133
-
134
- /*
135
- * Create and add empty Exif data to the image (this throws away any
136
- * old Exif data in the image).
137
- */
138
- $exif = new PelExif();
139
- $jpeg->setExif($exif);
140
-
141
- /*
142
- * Create and add TIFF data to the Exif data (Exif data is actually
143
- * stored in a TIFF format).
144
- */
145
- $tiff = new PelTiff();
146
- $exif->setTiff($tiff);
147
-
148
- /*
149
- * Create first Image File Directory and associate it with the TIFF
150
- * data.
151
- */
152
- $ifd0 = new PelIfd(PelIfd::IFD0);
153
- $tiff->setIfd($ifd0);
154
-
155
- /*
156
- * Create a sub-IFD for holding GPS information. GPS data must be
157
- * below the first IFD.
158
- */
159
- $gps_ifd = new PelIfd(PelIfd::GPS);
160
- $ifd0->addSubIfd($gps_ifd);
161
-
162
- /*
163
- * The USER_COMMENT tag must be put in a Exif sub-IFD under the
164
- * first IFD.
165
- */
166
- $exif_ifd = new PelIfd(PelIfd::EXIF);
167
- $exif_ifd->addEntry(new PelEntryUserComment($comment));
168
- $ifd0->addSubIfd($exif_ifd);
169
-
170
- $inter_ifd = new PelIfd(PelIfd::INTEROPERABILITY);
171
- $ifd0->addSubIfd($inter_ifd);
172
-
173
- $ifd0->addEntry(new PelEntryAscii(PelTag::MODEL, $model));
174
- $ifd0->addEntry(new PelEntryAscii(PelTag::DATE_TIME, $date_time));
175
- $ifd0->addEntry(new PelEntryAscii(PelTag::IMAGE_DESCRIPTION, $description));
176
-
177
- $gps_ifd->addEntry(new PelEntryByte(PelTag::GPS_VERSION_ID, 2, 2, 0, 0));
178
-
179
- /*
180
- * Use the convertDecimalToDMS function to convert the latitude from
181
- * something like 12.34� to 12� 20' 42"
182
- */
183
- list ($hours, $minutes, $seconds) = convertDecimalToDMS($latitude);
184
-
185
- /* We interpret a negative latitude as being south. */
186
- $latitude_ref = ($latitude < 0) ? 'S' : 'N';
187
-
188
- $gps_ifd->addEntry(new PelEntryAscii(PelTag::GPS_LATITUDE_REF, $latitude_ref));
189
- $gps_ifd->addEntry(new PelEntryRational(PelTag::GPS_LATITUDE, $hours, $minutes, $seconds));
190
-
191
- /* The longitude works like the latitude. */
192
- list ($hours, $minutes, $seconds) = convertDecimalToDMS($longitude);
193
- $longitude_ref = ($longitude < 0) ? 'W' : 'E';
194
-
195
- $gps_ifd->addEntry(new PelEntryAscii(PelTag::GPS_LONGITUDE_REF, $longitude_ref));
196
- $gps_ifd->addEntry(new PelEntryRational(PelTag::GPS_LONGITUDE, $hours, $minutes, $seconds));
197
-
198
- /*
199
- * Add the altitude. The absolute value is stored here, the sign is
200
- * stored in the GPS_ALTITUDE_REF tag below.
201
- */
202
- $gps_ifd->addEntry(new PelEntryRational(PelTag::GPS_ALTITUDE, [
203
- abs($altitude),
204
- 1
205
- ]));
206
- /*
207
- * The reference is set to 1 (true) if the altitude is below sea
208
- * level, or 0 (false) otherwise.
209
- */
210
- $gps_ifd->addEntry(new PelEntryByte(PelTag::GPS_ALTITUDE_REF, (int) ($altitude < 0)));
211
-
212
- /* Finally we store the data in the output file. */
213
- file_put_contents($output, $jpeg->getBytes());
214
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/examples/rename.php DELETED
@@ -1,117 +0,0 @@
1
- #!/usr/bin/php
2
- <?php
3
-
4
- /**
5
- * PEL: PHP Exif Library.
6
- * A library with support for reading and
7
- * writing all Exif headers in JPEG and TIFF images using PHP.
8
- *
9
- * Copyright (C) 2004, 2005, 2006 Martin Geisler.
10
- *
11
- * This program is free software; you can redistribute it and/or modify
12
- * it under the terms of the GNU General Public License as published by
13
- * the Free Software Foundation; either version 2 of the License, or
14
- * (at your option) any later version.
15
- *
16
- * This program is distributed in the hope that it will be useful,
17
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- * GNU General Public License for more details.
20
- *
21
- * You should have received a copy of the GNU General Public License
22
- * along with this program in the file COPYING; if not, write to the
23
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
24
- * Boston, MA 02110-1301 USA
25
- */
26
-
27
- /*
28
- * An example of how PEL can be used. The script will read the Exif
29
- * timestamps in the files given, and rename the files based on that.
30
- * Should there be several files with the same timestamp --- the
31
- * resolution of the Exif timestamp is one second, so a burst of
32
- * images will typically have identical timestamps --- then the next
33
- * available time will be used.
34
- */
35
-
36
- /* a printf() variant that appends a newline to the output. */
37
- function println($args)
38
- {
39
- $args = func_get_args();
40
- $fmt = array_shift($args);
41
- vprintf($fmt . "\n", $args);
42
- }
43
-
44
- /* Make PEL speak the users language, if it is available. */
45
- setlocale(LC_ALL, '');
46
-
47
- /* Load the required class definitions. */
48
- require_once '../autoload.php';
49
-
50
- use lsolesen\pel\PelDataWindow;
51
- use lsolesen\pel\PelJpeg;
52
- use lsolesen\pel\PelTiff;
53
-
54
- $prog = array_shift($argv);
55
- $error = false;
56
-
57
- /* Accept the optional -d command line argument. */
58
- if (isset($argv[0]) && $argv[0] == '-d') {
59
- Pel::setDebug(true);
60
- array_shift($argv);
61
- }
62
-
63
- /*
64
- * Print usage information if there are no more command line
65
- * arguments.
66
- */
67
- if (empty($argv)) {
68
- println('Usage: %s [-d] <file> ...', $prog);
69
- println('Optional arguments:');
70
- println(' -d turn debug output on.');
71
- println('Mandatory arguments:');
72
- println(' file ... one or more file names.');
73
- println();
74
- println('The files will be renamed based on their Exif timestamp.');
75
- exit(1);
76
- }
77
-
78
- /*
79
- * We typically need lots of RAM to parse TIFF images since they tend
80
- * to be big and uncompressed.
81
- */
82
- ini_set('memory_limit', '32M');
83
-
84
- foreach ($argv as $file) {
85
- println('Reading file "%s".', $file);
86
- $data = new PelDataWindow(file_get_contents($file));
87
-
88
- if (PelJpeg::isValid($data)) {
89
- $jpeg = new PelJpeg();
90
- $jpeg->load($data);
91
- $app1 = $jpeg->getExif();
92
- $tiff = $app1->getTiff();
93
- } elseif (PelTiff::isValid($data)) {
94
- $tiff = new PelTiff($data);
95
- } else {
96
- println('Unrecognized image format! Skipping.');
97
- continue;
98
- }
99
-
100
- $ifd0 = $tiff->getIfd();
101
- $entry = $ifd0->getEntry(PelTag::DATE_TIME);
102
-
103
- if ($entry == null) {
104
- println('Skipping %s because no DATE_TIME tag was found.', $file);
105
- continue;
106
- }
107
-
108
- $time = $entry->getValue();
109
-
110
- do {
111
- $new = gmdate('Y:m:d-H:i:s', $time) . strchr($file, '.');
112
- println('Trying file name %s', $new);
113
- $time ++;
114
- } while (file_exists($new));
115
-
116
- rename($file, $new);
117
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/examples/resize.php DELETED
@@ -1,130 +0,0 @@
1
- #!/usr/bin/php
2
- <?php
3
-
4
- /**
5
- * PEL: PHP Exif Library.
6
- * A library with support for reading and
7
- * writing all Exif headers in JPEG and TIFF images using PHP.
8
- *
9
- * Copyright (C) 2006, 2007 Martin Geisler.
10
- *
11
- * This program is free software; you can redistribute it and/or modify
12
- * it under the terms of the GNU General Public License as published by
13
- * the Free Software Foundation; either version 2 of the License, or
14
- * (at your option) any later version.
15
- *
16
- * This program is distributed in the hope that it will be useful,
17
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- * GNU General Public License for more details.
20
- *
21
- * You should have received a copy of the GNU General Public License
22
- * along with this program in the file COPYING; if not, write to the
23
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
24
- * Boston, MA 02110-1301 USA
25
- */
26
-
27
- /* a printf() variant that appends a newline to the output. */
28
- function println($args)
29
- {
30
- $args = func_get_args();
31
- $fmt = array_shift($args);
32
- vprintf($fmt . "\n", $args);
33
- }
34
-
35
- /* Make PEL speak the users language, if it is available. */
36
- setlocale(LC_ALL, '');
37
-
38
- /* Load the required PEL files for handling JPEG images. */
39
- require_once '../autoload.php';
40
-
41
- use lsolesen\pel\PelJpeg;
42
-
43
- /*
44
- * Store the name of the script in $prog and remove this first part of
45
- * the command line.
46
- */
47
- $prog = array_shift($argv);
48
- $error = false;
49
-
50
- /*
51
- * The next argument could be -d to signal debug mode where lots of
52
- * extra information is printed out when the image is parsed.
53
- */
54
- if (isset($argv[0]) && $argv[0] == '-d') {
55
- Pel::setDebug(true);
56
- array_shift($argv);
57
- }
58
-
59
- /* The mandatory input filename. */
60
- if (isset($argv[0])) {
61
- $input = array_shift($argv);
62
- } else {
63
- $error = true;
64
- }
65
-
66
- /* The mandatory output filename. */
67
- if (isset($argv[0])) {
68
- $output = array_shift($argv);
69
- } else {
70
- $error = true;
71
- }
72
-
73
- /* The mandatory scale factor. */
74
- if (isset($argv[0])) {
75
- $scale = array_shift($argv);
76
- } else {
77
- $error = true;
78
- }
79
-
80
- /*
81
- * Usage information is printed if an error was found in the command
82
- * line arguments.
83
- */
84
- if ($error) {
85
- println('Usage: %s [-d] <input> <output> <scale>', $prog);
86
- println('Optional arguments:');
87
- println(' -d turn debug output on.');
88
- println('Mandatory arguments:');
89
- println(' input the input filename, a JPEG image.');
90
- println(' output filename for saving the changed image.');
91
- println(' scale scale factor, say 0.5 to resize to half the ' . 'original size.');
92
- exit(1);
93
- }
94
-
95
- /* The input file is now loaded into a PelJpeg object. */
96
- println('Reading file "%s".', $input);
97
- $input_jpeg = new PelJpeg($input);
98
-
99
- /*
100
- * The input image is already loaded, so we can reuse the bytes stored
101
- * in $input_jpeg when creating the Image resource.
102
- */
103
- $original = ImageCreateFromString($input_jpeg->getBytes());
104
- $original_w = ImagesX($original);
105
- $original_h = ImagesY($original);
106
-
107
- $scaled_w = $original_w * $scale;
108
- $scaled_h = $original_h * $scale;
109
-
110
- /* Now create the scaled image. */
111
- $scaled = ImageCreateTrueColor($scaled_w, $scaled_h);
112
- ImageCopyResampled($scaled, $original, 0, 0, 0, 0, $scaled_w, $scaled_h, $original_w, $original_h);
113
-
114
- /*
115
- * We want the raw JPEG data from $scaled. Luckily, one can create a
116
- * PelJpeg object from an image resource directly:
117
- */
118
- $output_jpeg = new PelJpeg($scaled);
119
-
120
- /* Retrieve the original Exif data in $jpeg (if any). */
121
- $exif = $input_jpeg->getExif();
122
-
123
- /* If no Exif data was present, then $exif is null. */
124
- if ($exif != null) {
125
- $output_jpeg->setExif($exif);
126
- }
127
-
128
- /* We can now save the scaled image. */
129
- println('Writing file "%s".', $output);
130
- $output_jpeg->saveFile($output);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/make-release.sh DELETED
@@ -1,197 +0,0 @@
1
- #!/bin/sh
2
- #
3
- # PEL: PHP Exif Library. A library with support for reading and
4
- # writing all Exif headers in JPEG and TIFF images using PHP.
5
- #
6
- # Copyright (C) 2004, 2005, 2006 Martin Geisler.
7
- #
8
- # This program is free software; you can redistribute it and/or modify
9
- # it under the terms of the GNU General Public License as published by
10
- # the Free Software Foundation; either version 2 of the License, or
11
- # (at your option) any later version.
12
- #
13
- # This program is distributed in the hope that it will be useful,
14
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
- # GNU General Public License for more details.
17
- #
18
- # You should have received a copy of the GNU General Public License
19
- # along with this program in the file COPYING; if not, write to the
20
- # Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
21
- # Boston, MA 02110-1301 USA
22
-
23
- # $Id$
24
-
25
-
26
- # This small script retrieves the latest version of PEL, packs it up
27
- # into two tarballs (gz and bz2) and a zip file, and then asks for
28
- # permission to upload these files to SourceForge. The generated
29
- # files are placed in the current directory.
30
-
31
-
32
- # Fix the locale to C, e.g. untranslated.
33
- export LC_ALL=C
34
-
35
-
36
- # Paths used below
37
- BUILD_BASE="build-base.$$"
38
- PHPDOC_PATH='phpdoc'
39
-
40
-
41
-
42
- # Create the base directory for the build or bail out if it already
43
- # exists
44
- if [[ -d $BUILD_BASE ]]; then
45
- echo "The build directory $BUILD_BASE already exists!"
46
- exit
47
- else
48
- echo "Building the release in $BUILD_BASE"
49
- mkdir $BUILD_BASE
50
- fi
51
-
52
- cd $BUILD_BASE
53
-
54
-
55
- echo -n "Exporting trunk from SourceForge... "
56
- svn export https://pel.svn.sourceforge.net/svnroot/pel/trunk pel || exit
57
- echo "done."
58
-
59
- # Grab version number from ChangeLog...
60
- PREFIX='PEL Version'
61
- MIDDLE='[0-9]+\.[0-9]+(\.[0-9]+(-[0-9a-z]+)?)?'
62
- DATE=$(date -u '+%B %-d.. %Y')
63
- REGEXP="$PREFIX $MIDDLE $DATE"
64
-
65
- OFFSET=$(grep -n -E -m 1 "$REGEXP" pel/NEWS | cut -d ':' -f 1)
66
- if [[ -z $OFFSET ]]; then
67
- echo "Found no version from today in NEWS, creating SVN version."
68
- VERSION='svn' #$(date -u '+svn-%Y-%m-%d')
69
- else
70
- echo "Offset: $OFFSET"
71
- VERSION=$(head -n $OFFSET pel/NEWS | tail -n 1 | cut -d ' ' -f 3)
72
- echo "Found match for today in NEWS: $VERSION."
73
-
74
- LINE=$(head -n $OFFSET pel/NEWS | tail -n 1)
75
- STARS=$(head -n $((OFFSET+1)) pel/NEWS | tail -n 1)
76
- if [[ ${#LINE} != ${#STARS} ]]; then
77
- echo "Aborting because of bad underlining:"
78
- echo
79
- echo "$LINE"
80
- echo "$STARS"
81
- exit
82
- fi
83
- fi
84
-
85
- mv pel pel-$VERSION
86
-
87
- if [[ $VERSION == "svn" ]]; then
88
- echo "Skipping tagging since this is a SVN snapshot."
89
- else
90
- read -p "Create SVN tag? [y/N] " -n 1
91
- echo
92
-
93
- if [[ $REPLY == "y" ]]; then
94
- echo -n "Creating SVN tag 'pel-$VERSION'... "
95
- svn copy \
96
- https://pel.svn.sourceforge.net/svnroot/pel/trunk \
97
- https://pel.svn.sourceforge.net/svnroot/pel/tags/pel-$VERSION \
98
- -m "Tagging PEL version $VERSION."
99
- echo "done."
100
- else
101
- echo "Skipping tagging by user request."
102
- fi
103
- fi
104
-
105
- cd pel-$VERSION
106
-
107
- # Generate the ChangeLog, prefixed with a standard header
108
- echo -n "Generating SVN ChangeLog... "
109
- echo "ChangeLog file for PEL: PHP Exif Library. A library with support for
110
- reading and writing Exif headers in JPEG and TIFF images using PHP.
111
-
112
- Copyright (C) 2004, 2005, 2006 Martin Geisler.
113
- Licensed under the GNU GPL, see COPYING for details.
114
-
115
- " > ChangeLog
116
- svn2cl --include-rev --group-by-day --separate-daylogs \
117
- --reparagraph --authors=authors.xml --stdout \
118
- https://pel.svn.sourceforge.net/svnroot/pel/trunk/ >> ChangeLog || exit
119
- echo "done."
120
-
121
-
122
- #echo -n "Marking releases in ChangeLog... "
123
- #sed -re '/./{H;$!d;};x;/tags/s|tags/pel-([0-9]+\.[0-9]+).*|PEL Version \1|'
124
- #echo "done."
125
-
126
-
127
- # Generate the binary MO files
128
- ./update-locales.sh
129
-
130
-
131
- # Generate the API documentation
132
- ./run-phpdoc.sh $VERSION $PHPDOC_PATH
133
-
134
-
135
- # Cleanup files that aren't needed in the released package
136
- rm make-release.sh authors.xml
137
- rm -r tutorials
138
-
139
-
140
- # Add anchors and headers to the HTML ChangeLog so that each release
141
- # notices can link back to it
142
-
143
- #sed -i -re 's|^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2} tag release-([0-9])_([0-9])$|</pre>\n\n<div align="center"><h2 id="v\1.\2">PEL Version \1.\2</h2></div>\n\n<pre>\n|g' doc/ric_ChangeLog.html
144
-
145
- # Leave the pel-$VERSION directory
146
- cd ..
147
-
148
- mv pel-$VERSION/test/image-tests image-tests
149
-
150
- echo -n "Creating pel-image-tests-$VERSION.tar.gz... "
151
- tar -cz image-tests -f pel-image-tests-$VERSION.tar.gz
152
- echo "done."
153
-
154
- echo -n "Creating pel-image-tests-$VERSION.tar.bz2... "
155
- tar -cj image-tests -f pel-image-tests-$VERSION.tar.bz2
156
- echo "done."
157
-
158
- echo -n "Creating pel-images-$VERSION.zip... "
159
- zip -qr pel-image-tests-$VERSION.zip image-tests
160
- echo "done."
161
-
162
- echo -n "Creating pel-$VERSION.tar.gz... "
163
- tar -cz pel-$VERSION -f pel-$VERSION.tar.gz
164
- echo "done."
165
-
166
- echo -n "Creating pel-$VERSION.tar.bz2... "
167
- tar -cj pel-$VERSION -f pel-$VERSION.tar.bz2
168
- echo "done."
169
-
170
- echo -n "Creating pel-$VERSION.zip... "
171
- zip -qr pel-$VERSION.zip pel-$VERSION
172
- echo "done."
173
-
174
-
175
- # Upload the compressed files and API documentation, if allowed
176
- if [[ $VERSION != "svn" && ( $REPLY == "y" || $REPLY == "Y" ) ]]; then
177
- echo -n "Uploading files to SourceForge for release... "
178
- ncftpput upload.sourceforge.net /incoming \
179
- pel-$VERSION.tar.gz \
180
- pel-$VERSION.tar.bz2 \
181
- pel-$VERSION.zip \
182
- pel-image-tests-$VERSION.tar.gz \
183
- pel-image-tests-$VERSION.tar.bz2 \
184
- pel-image-tests-$VERSION.zip
185
- echo "done."
186
-
187
- echo -n "Uploading API documentation to SourceForge... "
188
- scp -C -q -r pel-$VERSION/doc \
189
- shell.sourceforge.net:/home/groups/p/pe/pel/htdocs
190
- echo "done."
191
- else
192
- echo "Skipping upload."
193
- fi
194
-
195
- echo "All done. The $BUILD_BASE directory can be removed at any time."
196
-
197
- # The End --- PEL has now been packaged (and maybe even released)!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/makepackagexml.php DELETED
@@ -1,87 +0,0 @@
1
- <?php
2
- /**
3
- * package.xml generation script
4
- *
5
- * To create a package you need to do the following. Before making the package
6
- * PEL should be compiled so the .mo files are created.
7
- *
8
- * <code>
9
- * $ php makepackagexml.php make
10
- * $ pear package package.xml
11
- * </code>
12
- *
13
- * @package PEL
14
- * @author Lars Olesen <lars@legestue.net>
15
- * @version @package-version@
16
- * @license http://www.gnu.org/licenses/gpl.html GNU General Public
17
- */
18
- require_once 'PEAR/PackageFileManager2.php';
19
-
20
- $version = '0.9.2';
21
- $stability = 'beta';
22
- $notes = '* initial release as a PEAR package';
23
- $url = 'http://downloads.sf.net/pel/PEL-' . $version . '.tgz';
24
-
25
- PEAR::setErrorHandling(PEAR_ERROR_DIE);
26
- $pfm = new PEAR_PackageFileManager2();
27
- $pfm->setOptions([
28
- 'baseinstalldir' => 'PEL',
29
- 'filelistgenerator' => 'file',
30
- 'packagedirectory' => dirname(__FILE__),
31
- 'packagefile' => 'package.xml',
32
- 'ignore' => [
33
- 'makepackagexml.php',
34
- '*.tgz',
35
- '*.sh',
36
- 'test/',
37
- 'tutorials/',
38
- 'authors.xml'
39
- ],
40
- 'dir_roles' => [
41
- 'doc' => 'doc',
42
- 'examples' => 'doc',
43
- 'test' => 'test'
44
- ],
45
- 'exceptions' => [
46
- 'README' => 'doc',
47
- 'AUTHORS' => 'doc',
48
- 'COPYING' => 'doc',
49
- 'INSTALL' => 'doc',
50
- 'NEWS' => 'doc',
51
- 'TODO' => 'doc'
52
- ],
53
- 'simpleoutput' => true
54
- ]);
55
-
56
- $pfm->setPackage('PEL');
57
- $pfm->setSummary('The PHP Exif Library (PEL) lets you fully manipulate Exif (Exchangeable Image File Format) data.');
58
- $pfm->setDescription('The PHP Exif Library (PEL) lets you fully manipulate Exif (Exchangeable Image File Format) data. This is the data that digital cameras place in their images, such as the date and time, shutter speed, ISO value and so on.
59
-
60
- Using PEL, one can fully modify the Exif data, meaning that it can be both read and written. Completely new Exif data can also be added to images. PEL is written completely in PHP and depends on nothing except a standard installation of PHP, version 5. PEL is hosted on SourceForge.');
61
- $pfm->setUri($url);
62
- $pfm->setLicense('GPL License', 'http://www.gnu.org/licenses/gpl.html');
63
- $pfm->addMaintainer('lead', 'mgeisler', 'Martin Geisler', 'mgeisler@mgeisler.net');
64
- $pfm->addMaintainer('helper', 'lsolesen', 'Lars Olesen', 'lars@legestue.net');
65
-
66
- $pfm->setPackageType('php');
67
-
68
- $pfm->setAPIVersion($version);
69
- $pfm->setReleaseVersion($version);
70
- $pfm->setAPIStability($stability);
71
- $pfm->setReleaseStability($stability);
72
- $pfm->setNotes($notes);
73
- $pfm->addRelease();
74
-
75
- $pfm->clearDeps();
76
- $pfm->setPhpDep('5.0.0');
77
- $pfm->setPearinstallerDep('1.5.0');
78
-
79
- $pfm->generateContents();
80
-
81
- if (isset($_GET['make']) || (isset($_SERVER['argv']) && $_SERVER['argv'][1] == 'make')) {
82
- if ($pfm->writePackageFile()) {
83
- exit('package created');
84
- }
85
- } else {
86
- $pfm->debugPackageFile();
87
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/run-phpdoc.sh DELETED
@@ -1,55 +0,0 @@
1
- #!/bin/sh
2
- #
3
- # PEL: PHP Exif Library. A library with support for reading and
4
- # writing all Exif headers of JPEG images using PHP.
5
- #
6
- # Copyright (C) 2004, 2006 Martin Geisler
7
- #
8
- # This program is free software; you can redistribute it and/or modify
9
- # it under the terms of the GNU General Public License as published by
10
- # the Free Software Foundation; either version 2 of the License, or
11
- # (at your option) any later version.
12
- #
13
- # This program is distributed in the hope that it will be useful,
14
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
- # GNU General Public License for more details.
17
- #
18
- # You should have received a copy of the GNU General Public License
19
- # along with this program in the file COPYING; if not, write to the
20
- # Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
21
- # Boston, MA 02110-1301 USA
22
-
23
- # $Id$
24
-
25
-
26
- # This small script simply runs phpDocumentor on the PEL sources. It
27
- # takes two optional arguments on the command line, the first of which
28
- # should be a version number to include in the documentation. The
29
- # second argument should be the full path to the `phpdoc' script.
30
-
31
- if [ -z $1 ]; then
32
- VERSION=""
33
- else
34
- VERSION=" Version $1"
35
- fi
36
-
37
- if [ -z $2 ]; then
38
- PHPDOC="phpdoc"
39
- else
40
- PHPDOC=$2
41
- fi
42
-
43
- # The ChangeLog file might not be here yet, but phpDocumentor fails if
44
- # it is missing...
45
- touch ChangeLog
46
-
47
- echo "Running phpDocumentor... "
48
- $PHPDOC \
49
- --sourcecode "on" \
50
- --title "PEL: PHP Exif Library$VERSION" \
51
- --customtags "date" \
52
- --defaultpackagename "PEL" \
53
- --directory "tutorials" \
54
- --filename "Pel*.php,README,INSTALL,NEWS,TODO,ChangeLog" \
55
- --target "doc"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/scripts/make-image-test.php DELETED
@@ -1,251 +0,0 @@
1
- #!/usr/bin/php
2
- <?php
3
-
4
- /*
5
- * PEL: PHP Exif Library. A library with support for reading and
6
- * writing all Exif headers in JPEG and TIFF images using PHP.
7
- *
8
- * Copyright (C) 2005, 2006 Martin Geisler.
9
- *
10
- * This program is free software; you can redistribute it and/or modify
11
- * it under the terms of the GNU General Public License as published by
12
- * the Free Software Foundation; either version 2 of the License, or
13
- * (at your option) any later version.
14
- *
15
- * This program is distributed in the hope that it will be useful,
16
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
- * GNU General Public License for more details.
19
- *
20
- * You should have received a copy of the GNU General Public License
21
- * along with this program in the file COPYING; if not, write to the
22
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
23
- * Boston, MA 02110-1301 USA
24
- */
25
-
26
- /*
27
- * This meta-program will generate a PHP script with unit tests for
28
- * testing the image supplied on the command line. It works by
29
- * loading the image, and traversing it, outputting test code at each
30
- * step which will verify that a future parse of the image gives the
31
- * same results.
32
- */
33
- if (count($argv) != 2) {
34
- exit("Usage: $argv[0] <image>\n");
35
- }
36
-
37
- $basename = substr($argv[1], 0, - strlen(strrchr($argv[1], '.')));
38
- $image_filename = $argv[1];
39
- $thumb_filename = $basename . '-thumb.jpg';
40
- $test_filename = $basename . '.php';
41
- $test_name = str_replace('-', '_', $basename);
42
-
43
- $indent = 0;
44
-
45
- function println($args)
46
- {
47
- global $indent;
48
- $args = func_get_args();
49
- $str = array_shift($args);
50
- vprintf(str_repeat(' ', $indent) . $str . "\n", $args);
51
- }
52
-
53
- function quote($str)
54
- {
55
- return str_replace([
56
- '\\',
57
- '\''
58
- ], [
59
- '\\\\',
60
- '\\\''
61
- ], $str);
62
- }
63
-
64
- function entryToTest($name, PelEntry $entry)
65
- {
66
- println('$this->assertInstanceOf(\'%s\', %s);', $name, get_class($entry));
67
-
68
- println('$this->assertEquals(%s->getValue(), %s);', $name, var_export($entry->getValue(), true));
69
-
70
- println('$this->assertEquals(%s->getText(), \'%s\');', $name, quote($entry->getText()));
71
- }
72
-
73
- function ifdToTest($name, $number, PelIfd $ifd)
74
- {
75
- println();
76
- println('/* Start of IDF %s%d. */', $name, $number);
77
-
78
- $entries = $ifd->getEntries();
79
- println('$this->assertEquals(count(%s%d->getEntries()), %d);', $name, $number, count($entries));
80
-
81
- foreach ($entries as $tag => $entry) {
82
- println();
83
- println('$entry = %s%d->getEntry(%d); // %s', $name, $number, $tag, PelTag::getName($ifd->getType(), $tag));
84
- entryToTest('$entry', $entry);
85
- }
86
-
87
- println();
88
- println('/* Sub IFDs of %s%d. */', $name, $number);
89
-
90
- $sub_ifds = $ifd->getSubIfds();
91
- println('$this->assertEquals(count(%s%d->getSubIfds()), %d);', $name, $number, count($sub_ifds));
92
-
93
- $n = 0;
94
- $sub_name = $name . $number . '_';
95
- foreach ($sub_ifds as $type => $sub_ifd) {
96
- println('%s%d = %s%d->getSubIfd(%d); // IFD %s', $sub_name, $n, $name, $number, $type, $sub_ifd->getName());
97
- println('$this->assertInstanceOf(\'PelIfd\', %s%d);', $sub_name, $n);
98
- ifdToTest($sub_name, $n, $sub_ifd);
99
- $n ++;
100
- }
101
-
102
- println();
103
-
104
- if (strlen($ifd->getThumbnailData()) > 0) {
105
- println('$thumb_data = file_get_contents(dirname(__FILE__) .');
106
- println(' \'/%s\');', $GLOBALS['thumb_filename']);
107
- println('$this->assertEquals(%s%d->getThumbnailData(), $thumb_data);', $name, $number);
108
- } else {
109
- println('$this->assertEquals(%s%d->getThumbnailData(), \'\');', $name, $number);
110
- }
111
-
112
- println();
113
- println('/* Next IFD. */');
114
-
115
- $next = $ifd->getNextIfd();
116
- println('%s%d = %s%d->getNextIfd();', $name, $number + 1, $name, $number);
117
-
118
- if ($next instanceof PelIfd) {
119
- println('$this->assertInstanceOf(\'PelIfd\', %s%d);', $name, $number + 1);
120
- println('/* End of IFD %s%d. */', $name, $number);
121
-
122
- ifdToTest($name, $number + 1, $next);
123
- } else {
124
- println('$this->assertNull(%s%d);', $name, $number + 1);
125
- println('/* End of IFD %s%d. */', $name, $number);
126
- }
127
- }
128
-
129
- function tiffToTest($name, PelTiff $tiff)
130
- {
131
- println();
132
- println('/* The first IFD. */');
133
- println('$ifd0 = %s->getIfd();', $name);
134
- $ifd = $tiff->getIfd();
135
- if ($ifd instanceof PelIfd) {
136
- println('$this->assertInstanceOf(\'PelIfd\', $ifd0);');
137
- ifdToTest('$ifd', 0, $ifd);
138
- } else {
139
- println('$this->assertNull($ifd0);');
140
- }
141
- }
142
-
143
- function jpegContentToTest($name, PelJpegContent $content)
144
- {
145
- if ($content instanceof PelExif) {
146
- println('$this->assertInstanceOf(\'PelExif\', %s);', $name);
147
- $tiff = $content->getTiff();
148
- println();
149
- println('$tiff = %s->getTiff();', $name);
150
- if ($tiff instanceof PelTiff) {
151
- println('$this->assertInstanceOf(\'PelTiff\', $tiff);');
152
- tiffToTest('$tiff', $tiff);
153
- }
154
- }
155
- }
156
-
157
- function jpegToTest($name, PelJpeg $jpeg)
158
- {
159
- $exif = $jpeg->getExif();
160
- println('$exif = %s->getExif();', $name);
161
- if ($exif == null) {
162
- println('$this->assertNull($exif);');
163
- } else {
164
- jpegContentToTest('$exif', $exif);
165
- }
166
- }
167
-
168
- /**
169
- * convert a binary string to a sequence of hexadecimals
170
- */
171
- function binstrencode($field)
172
- {
173
- $field = bin2hex($field);
174
- $field = chunk_split($field, 2, "\\x");
175
- return str_replace('\x00', '\0', "\\x" . substr($field, 0, - 2));
176
- }
177
-
178
- /*
179
- * All output is buffered so that we can dump it in $test_filename at
180
- * the end.
181
- */
182
- ob_start();
183
-
184
- println('<?php
185
-
186
- /* PEL: PHP Exif Library. A library with support for reading and
187
- * writing all Exif headers in JPEG and TIFF images using PHP.
188
- *
189
- * Copyright (C) 2005, 2006 Martin Geisler.
190
- *
191
- * This program is free software; you can redistribute it and/or modify
192
- * it under the terms of the GNU General Public License as published by
193
- * the Free Software Foundation; either version 2 of the License, or
194
- * (at your option) any later version.
195
- *
196
- * This program is distributed in the hope that it will be useful,
197
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
198
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
199
- * GNU General Public License for more details.
200
- *
201
- * You should have received a copy of the GNU General Public License
202
- * along with this program in the file COPYING; if not, write to the
203
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
204
- * Boston, MA 02110-1301 USA
205
- */
206
-
207
-
208
- /* Autogenerated by the make-image-test.php script */
209
-
210
- use lsolesen\pel\PelJpeg;
211
- use PHPUnit\Framework\TestCase;
212
-
213
- class %s extends TestCase
214
- {
215
-
216
- function testRead()
217
- {
218
- Pel::clearExceptions();
219
- Pel::setStrictParsing(false);
220
- $jpeg = new PelJpeg(dirname(__FILE__) . \'/%s\');
221
- ', $test_name, $image_filename, $image_filename);
222
-
223
- require_once(dirname(__FILE__) . '/../../src/PelJpeg.php');
224
- $jpeg = new PelJpeg($image_filename);
225
-
226
- $indent = 2;
227
- jpegToTest('$jpeg', $jpeg);
228
-
229
- println();
230
-
231
- $exceptions = Pel::getExceptions();
232
-
233
- if (count($exceptions) == 0) {
234
- println('$this->assertTrue(count(Pel::getExceptions()) == 0);');
235
- } else {
236
- println('$exceptions = Pel::getExceptions();');
237
- for ($i = 0; $i < count($exceptions); $i ++) {
238
- println('$this->assertInstanceOf(\'%s\', $exceptions[%d]);', $i, get_class($exceptions[$i]));
239
-
240
- println('$this->assertEquals($exceptions[%d]->getMessage(),', $i);
241
- println(' \'%s\');', quote($exceptions[$i]->getMessage()));
242
- }
243
- }
244
-
245
- println('
246
- }
247
- }
248
- ');
249
-
250
- /* The test case is finished -- now dump the output as a PHP file. */
251
- file_put_contents($test_filename, ob_get_clean());
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/AsciiTest.php DELETED
@@ -1,122 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * PEL: PHP Exif Library. A library with support for reading and
5
- * writing all Exif headers in JPEG and TIFF images using PHP.
6
- *
7
- * Copyright (C) 2004, 2006, 2007 Martin Geisler.
8
- *
9
- * This program is free software; you can redistribute it and/or modify
10
- * it under the terms of the GNU General Public License as published by
11
- * the Free Software Foundation; either version 2 of the License, or
12
- * (at your option) any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- * GNU General Public License for more details.
18
- *
19
- * You should have received a copy of the GNU General Public License
20
- * along with this program in the file COPYING; if not, write to the
21
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
22
- * Boston, MA 02110-1301 USA
23
- */
24
-
25
- namespace Pel\Test;
26
-
27
- use lsolesen\pel\PelConvert;
28
- use lsolesen\pel\PelEntryAscii;
29
- use lsolesen\pel\PelEntryCopyright;
30
- use lsolesen\pel\PelEntryTime;
31
- use lsolesen\pel\PelTag;
32
- use PHPUnit\Framework\TestCase;
33
-
34
- class AsciiTest extends TestCase
35
- {
36
- public function testReturnValues()
37
- {
38
- $entry = new PelEntryAscii(42);
39
-
40
- $entry = new PelEntryAscii(42, 'foo bar baz');
41
- $this->assertEquals($entry->getComponents(), 12);
42
- $this->assertEquals($entry->getValue(), 'foo bar baz');
43
- }
44
-
45
- public function testTime()
46
- {
47
- $entry = new PelEntryTime(42, 10);
48
-
49
- $this->assertEquals($entry->getComponents(), 20);
50
- $this->assertEquals($entry->getValue(), 10);
51
- $this->assertEquals($entry->getValue(PelEntryTime::UNIX_TIMESTAMP), 10);
52
- $this->assertEquals($entry->getValue(PelEntryTime::EXIF_STRING), '1970:01:01 00:00:10');
53
- $this->assertEquals($entry->getValue(PelEntryTime::JULIAN_DAY_COUNT), 2440588 + 10 / 86400);
54
- $this->assertEquals($entry->getText(), '1970:01:01 00:00:10');
55
-
56
- // Malformed Exif timestamp.
57
- $entry->setValue('1970!01-01 00 00 30', PelEntryTime::EXIF_STRING);
58
- $this->assertEquals($entry->getValue(), 30);
59
-
60
- $entry->setValue(2415021.75, PelEntryTime::JULIAN_DAY_COUNT);
61
- // This is Jan 1st 1900 at 18:00, outside the range of a UNIX
62
- // timestamp:
63
- $this->assertEquals($entry->getValue(), false);
64
- $this->assertEquals($entry->getValue(PelEntryTime::EXIF_STRING), '1900:01:01 18:00:00');
65
- $this->assertEquals($entry->getValue(PelEntryTime::JULIAN_DAY_COUNT), 2415021.75);
66
-
67
- $entry->setValue('0000:00:00 00:00:00', PelEntryTime::EXIF_STRING);
68
-
69
- $this->assertEquals($entry->getValue(), false);
70
- $this->assertEquals($entry->getValue(PelEntryTime::EXIF_STRING), '0000:00:00 00:00:00');
71
- $this->assertEquals($entry->getValue(PelEntryTime::JULIAN_DAY_COUNT), 0);
72
-
73
- $entry->setValue('9999:12:31 23:59:59', PelEntryTime::EXIF_STRING);
74
-
75
- // this test will fail on 32bit machines
76
- $this->assertEquals($entry->getValue(), 253402300799);
77
- $this->assertEquals($entry->getValue(PelEntryTime::EXIF_STRING), '9999:12:31 23:59:59');
78
- $this->assertEquals($entry->getValue(PelEntryTime::JULIAN_DAY_COUNT), 5373484 + 86399 / 86400);
79
-
80
- // Check day roll-over for SF bug #1699489.
81
- $entry->setValue('2007:04:23 23:30:00', PelEntryTime::EXIF_STRING);
82
- $t = $entry->getValue(PelEntryTime::UNIX_TIMESTAMP);
83
- $entry->setValue($t + 3600);
84
-
85
- $this->assertEquals($entry->getValue(PelEntryTime::EXIF_STRING), '2007:04:24 00:30:00');
86
- }
87
-
88
- public function testCopyright()
89
- {
90
- $entry = new PelEntryCopyright();
91
- $this->assertEquals($entry->getTag(), PelTag::COPYRIGHT);
92
- $value = $entry->getValue();
93
- $this->assertEquals($value[0], '');
94
- $this->assertEquals($value[1], '');
95
- $this->assertEquals($entry->getText(false), '');
96
- $this->assertEquals($entry->getText(true), '');
97
-
98
- $entry->setValue('A');
99
- $value = $entry->getValue();
100
- $this->assertEquals($value[0], 'A');
101
- $this->assertEquals($value[1], '');
102
- $this->assertEquals($entry->getText(false), 'A (Photographer)');
103
- $this->assertEquals($entry->getText(true), 'A');
104
- $this->assertEquals($entry->getBytes(PelConvert::LITTLE_ENDIAN), 'A' . chr(0));
105
-
106
- $entry->setValue('', 'B');
107
- $value = $entry->getValue();
108
- $this->assertEquals($value[0], '');
109
- $this->assertEquals($value[1], 'B');
110
- $this->assertEquals($entry->getText(false), 'B (Editor)');
111
- $this->assertEquals($entry->getText(true), 'B');
112
- $this->assertEquals($entry->getBytes(PelConvert::LITTLE_ENDIAN), ' ' . chr(0) . 'B' . chr(0));
113
-
114
- $entry->setValue('A', 'B');
115
- $value = $entry->getValue();
116
- $this->assertEquals($value[0], 'A');
117
- $this->assertEquals($value[1], 'B');
118
- $this->assertEquals($entry->getText(false), 'A (Photographer) - B (Editor)');
119
- $this->assertEquals($entry->getText(true), 'A - B');
120
- $this->assertEquals($entry->getBytes(PelConvert::LITTLE_ENDIAN), 'A' . chr(0) . 'B' . chr(0));
121
- }
122
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/BrokenImagesTest.php DELETED
@@ -1,55 +0,0 @@
1
- <?php
2
- /**
3
- * PEL: PHP Exif Library.
4
- * A library with support for reading and
5
- * writing all Exif headers in JPEG and TIFF images using PHP.
6
- *
7
- * Copyright (C) 2004, 2006, 2007 Martin Geisler.
8
- *
9
- * This program is free software; you can redistribute it and/or modify
10
- * it under the terms of the GNU General Public License as published by
11
- * the Free Software Foundation; either version 2 of the License, or
12
- * (at your option) any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- * GNU General Public License for more details.
18
- *
19
- * You should have received a copy of the GNU General Public License
20
- * along with this program in the file COPYING; if not, write to the
21
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
22
- * Boston, MA 02110-1301 USA
23
- */
24
-
25
- namespace Pel\Test;
26
-
27
- use lsolesen\pel\PelJpeg;
28
- use PHPUnit\Framework\TestCase;
29
-
30
- class BrokenImagesTest extends TestCase
31
- {
32
- public function testWindowWindowExceptionIsCaught()
33
- {
34
- $jpeg = new PelJpeg(dirname(__FILE__) . '/broken_images/gh-10-a.jpg');
35
- $this->assertInstanceOf('\lsolesen\pel\PelJpeg', $jpeg);
36
- }
37
-
38
- public function testWindowOffsetExceptionIsCaught()
39
- {
40
- $jpeg = new PelJpeg(dirname(__FILE__) . '/broken_images/gh-10-b.jpg');
41
- $this->assertInstanceOf('\lsolesen\pel\PelJpeg', $jpeg);
42
- }
43
-
44
- public function testParsingNotFailingOnRecursingIfd()
45
- {
46
- $jpeg = new PelJpeg(dirname(__FILE__) . '/broken_images/gh-11.jpg');
47
- $this->assertInstanceOf('\lsolesen\pel\PelJpeg', $jpeg);
48
- }
49
-
50
- public function testInvalidIfd()
51
- {
52
- $jpeg = new PelJpeg(dirname(__FILE__) . '/broken_images/gh-156.jpg');
53
- $this->assertInstanceOf('\lsolesen\pel\PelJpeg', $jpeg);
54
- }
55
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/Bug3017880Test.php DELETED
@@ -1,85 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * PEL: PHP Exif Library.
5
- * A library with support for reading and
6
- * writing all Exif headers in JPEG and TIFF images using PHP.
7
- *
8
- * Copyright (C) 2004, 2006, 2007 Martin Geisler.
9
- *
10
- * This program is free software; you can redistribute it and/or modify
11
- * it under the terms of the GNU General Public License as published by
12
- * the Free Software Foundation; either version 2 of the License, or
13
- * (at your option) any later version.
14
- *
15
- * This program is distributed in the hope that it will be useful,
16
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
- * GNU General Public License for more details.
19
- *
20
- * You should have received a copy of the GNU General Public License
21
- * along with this program in the file COPYING; if not, write to the
22
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
23
- * Boston, MA 02110-1301 USA
24
- */
25
-
26
- namespace Pel\Test;
27
-
28
- use lsolesen\pel\PelJpeg;
29
- use lsolesen\pel\PelExif;
30
- use lsolesen\pel\PelTiff;
31
- use lsolesen\pel\PelIfd;
32
- use lsolesen\pel\PelTag;
33
- use lsolesen\pel\PelEntryAscii;
34
- use PHPUnit\Framework\TestCase;
35
-
36
- class Bug3017880Test extends TestCase
37
- {
38
- public function testThisDoesNotWorkAsExpected()
39
- {
40
- $filename = dirname(__FILE__) . '/images/bug3017880.jpg';
41
- try {
42
- $exif = null;
43
- $success = 1; // return true by default, as this function may not resave the file, but it's still success
44
- $resave_file = 0;
45
- $jpeg = new PelJpeg($filename);
46
- $this->assertInstanceOf('\lsolesen\pel\PelJpeg', $jpeg);
47
-
48
- // should all exif data on photo be cleared (gd and iu will always strip it anyway, so only
49
- // force strip if you know the image you're branding is an original)
50
- // $jpeg->clearExif();
51
-
52
- if ($exif === null) {
53
- $exif = new PelExif();
54
- $jpeg->setExif($exif);
55
- $tiff = new PelTiff();
56
- $exif->setTiff($tiff);
57
- }
58
-
59
- $tiff = $exif->getTiff();
60
- $ifd0 = $tiff->getIfd();
61
- if ($ifd0 === null) {
62
- $ifd0 = new PelIfd(PelIfd::IFD0);
63
- $tiff->setIfd($ifd0);
64
- }
65
-
66
- $software_name = 'Example V2';
67
- $software = $ifd0->getEntry(PelTag::SOFTWARE);
68
-
69
- if ($software === null) {
70
- $software = new PelEntryAscii(PelTag::SOFTWARE, $software_name);
71
- $ifd0->addEntry($software);
72
- $resave_file = 1;
73
- } else {
74
- $software->setValue($software_name);
75
- $resave_file = 1;
76
- }
77
-
78
- if ($resave_file == 1 && ! file_put_contents($filename, $jpeg->getBytes())) {
79
- // if it was okay to resave the file, but it did not save correctly
80
- }
81
- } catch (Exception $e) {
82
- $this->fail('Test should not throw an exception');
83
- }
84
- }
85
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/ConvertTest.php DELETED
@@ -1,250 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * PEL: PHP Exif Library.
5
- * A library with support for reading and
6
- * writing all Exif headers in JPEG and TIFF images using PHP.
7
- *
8
- * Copyright (C) 2004 Martin Geisler.
9
- *
10
- * This program is free software; you can redistribute it and/or modify
11
- * it under the terms of the GNU General Public License as published by
12
- * the Free Software Foundation; either version 2 of the License, or
13
- * (at your option) any later version.
14
- *
15
- * This program is distributed in the hope that it will be useful,
16
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
- * GNU General Public License for more details.
19
- *
20
- * You should have received a copy of the GNU General Public License
21
- * along with this program in the file COPYING; if not, write to the
22
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
23
- * Boston, MA 02110-1301 USA
24
- */
25
-
26
- namespace Pel\Test;
27
-
28
- use lsolesen\pel\PelConvert;
29
- use PHPUnit\Framework\TestCase;
30
-
31
- class ConvertTest extends TestCase
32
- {
33
-
34
- private $bytes = "\x00\x00\x00\x00\x01\x23\x45\x67\x89\xAB\xCD\xEF\xFF\xFF\xFF\xFF";
35
-
36
- public function testLongLittle()
37
- {
38
- $o = PelConvert::LITTLE_ENDIAN;
39
-
40
- $this->assertEquals(PelConvert::bytesToLong($this->bytes, 0, $o), 0x00000000);
41
- $this->assertEquals(PelConvert::bytesToLong($this->bytes, 1, $o), 0x01000000);
42
- $this->assertEquals(PelConvert::bytesToLong($this->bytes, 2, $o), 0x23010000);
43
- $this->assertEquals(PelConvert::bytesToLong($this->bytes, 3, $o), 0x45230100);
44
- $this->assertEquals(PelConvert::bytesToLong($this->bytes, 4, $o), 0x67452301);
45
- $this->assertEquals(PelConvert::bytesToLong($this->bytes, 5, $o), 0x89674523);
46
- $this->assertEquals(PelConvert::bytesToLong($this->bytes, 6, $o), 0xAB896745);
47
- $this->assertEquals(PelConvert::bytesToLong($this->bytes, 7, $o), 0xCDAB8967);
48
- $this->assertEquals(PelConvert::bytesToLong($this->bytes, 8, $o), 0xEFCDAB89);
49
- $this->assertEquals(PelConvert::bytesToLong($this->bytes, 9, $o), 0xFFEFCDAB);
50
- $this->assertEquals(PelConvert::bytesToLong($this->bytes, 10, $o), 0xFFFFEFCD);
51
- $this->assertEquals(PelConvert::bytesToLong($this->bytes, 11, $o), 0xFFFFFFEF);
52
- $this->assertEquals(PelConvert::bytesToLong($this->bytes, 12, $o), 0xFFFFFFFF);
53
- }
54
-
55
- public function testLongBig()
56
- {
57
- $o = PelConvert::BIG_ENDIAN;
58
-
59
- $this->assertEquals(PelConvert::bytesToLong($this->bytes, 0, $o), 0x00000000);
60
- $this->assertEquals(PelConvert::bytesToLong($this->bytes, 1, $o), 0x00000001);
61
- $this->assertEquals(PelConvert::bytesToLong($this->bytes, 2, $o), 0x00000123);
62
- $this->assertEquals(PelConvert::bytesToLong($this->bytes, 3, $o), 0x00012345);
63
- $this->assertEquals(PelConvert::bytesToLong($this->bytes, 4, $o), 0x01234567);
64
- $this->assertEquals(PelConvert::bytesToLong($this->bytes, 5, $o), 0x23456789);
65
- $this->assertEquals(PelConvert::bytesToLong($this->bytes, 6, $o), 0x456789AB);
66
- $this->assertEquals(PelConvert::bytesToLong($this->bytes, 7, $o), 0x6789ABCD);
67
- $this->assertEquals(PelConvert::bytesToLong($this->bytes, 8, $o), 0x89ABCDEF);
68
- $this->assertEquals(PelConvert::bytesToLong($this->bytes, 9, $o), 0xABCDEFFF);
69
- $this->assertEquals(PelConvert::bytesToLong($this->bytes, 10, $o), 0xCDEFFFFF);
70
- $this->assertEquals(PelConvert::bytesToLong($this->bytes, 11, $o), 0xEFFFFFFF);
71
- $this->assertEquals(PelConvert::bytesToLong($this->bytes, 12, $o), 0xFFFFFFFF);
72
- }
73
-
74
- public function testSLongLittle()
75
- {
76
- // TODO: Does not work on 64bit systems!
77
- $this->markTestIncomplete(
78
- 'Does not work on 64bit systems!'
79
- );
80
- $o = PelConvert::LITTLE_ENDIAN;
81
-
82
- /*
83
- * The easiest way to calculate the numbers to compare with, is to
84
- * let PHP do the arithmetic for us. When using the bit-wise
85
- * operators PHP will return a proper signed 32 bit integer.
86
- */
87
-
88
- $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 0, $o), 0x00 << 24 | 0x00 << 16 | 0x00 << 8 | 0x00);
89
- $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 1, $o), 0x01 << 24 | 0x00 << 16 | 0x00 << 8 | 0x00);
90
- $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 2, $o), 0x23 << 24 | 0x01 << 16 | 0x00 << 8 | 0x00);
91
- $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 3, $o), 0x45 << 24 | 0x23 << 16 | 0x01 << 8 | 0x00);
92
- $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 4, $o), 0x67 << 24 | 0x45 << 16 | 0x23 << 8 | 0x01);
93
- $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 5, $o), 0x89 << 24 | 0x67 << 16 | 0x45 << 8 | 0x23);
94
- $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 6, $o), 0xAB << 24 | 0x89 << 16 | 0x67 << 8 | 0x45);
95
- $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 7, $o), 0xCD << 24 | 0xAB << 16 | 0x89 << 8 | 0x67);
96
- $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 8, $o), 0xEF << 24 | 0xCD << 16 | 0xAB << 8 | 0x89);
97
- $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 9, $o), 0xFF << 24 | 0xEF << 16 | 0xCD << 8 | 0xAB);
98
- $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 10, $o), 0xFF << 24 | 0xFF << 16 | 0xEF << 8 | 0xCD);
99
- $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 11, $o), 0xFF << 24 | 0xFF << 16 | 0xFF << 8 | 0xEF);
100
- $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 12, $o), 0xFF << 24 | 0xFF << 16 | 0xFF << 8 | 0xFF);
101
- }
102
-
103
- public function testSLongBig()
104
- {
105
- // TODO: Does not work on 64bit systems
106
- $this->markTestIncomplete(
107
- 'Does not work on 64bit systems!'
108
- );
109
-
110
- $o = PelConvert::BIG_ENDIAN;
111
-
112
- $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 0, $o), 0x00 << 24 | 0x00 << 16 | 0x00 << 8 | 0x00);
113
- $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 1, $o), 0x00 << 24 | 0x00 << 16 | 0x00 << 8 | 0x01);
114
- $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 2, $o), 0x00 << 24 | 0x00 << 16 | 0x01 << 8 | 0x23);
115
- $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 3, $o), 0x00 << 24 | 0x01 << 16 | 0x23 << 8 | 0x45);
116
- $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 4, $o), 0x01 << 24 | 0x23 << 16 | 0x45 << 8 | 0x67);
117
- $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 5, $o), 0x23 << 24 | 0x45 << 16 | 0x67 << 8 | 0x89);
118
- $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 6, $o), 0x45 << 24 | 0x67 << 16 | 0x89 << 8 | 0xAB);
119
- $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 7, $o), 0x67 << 24 | 0x89 << 16 | 0xAB << 8 | 0xCD);
120
- $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 8, $o), 0x89 << 24 | 0xAB << 16 | 0xCD << 8 | 0xEF);
121
- $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 9, $o), 0xAB << 24 | 0xCD << 16 | 0xEF << 8 | 0xFF);
122
- $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 10, $o), 0xCD << 24 | 0xEF << 16 | 0xFF << 8 | 0xFF);
123
- $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 11, $o), 0xEF << 24 | 0xFF << 16 | 0xFF << 8 | 0xFF);
124
- $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 12, $o), 0xFF << 24 | 0xFF << 16 | 0xFF << 8 | 0xFF);
125
- }
126
-
127
- public function testShortLittle()
128
- {
129
- $o = PelConvert::LITTLE_ENDIAN;
130
-
131
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 0, $o), 0x0000);
132
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 1, $o), 0x0000);
133
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 2, $o), 0x0000);
134
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 3, $o), 0x0100);
135
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 4, $o), 0x2301);
136
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 5, $o), 0x4523);
137
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 6, $o), 0x6745);
138
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 7, $o), 0x8967);
139
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 8, $o), 0xAB89);
140
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 9, $o), 0xCDAB);
141
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 10, $o), 0xEFCD);
142
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 11, $o), 0xFFEF);
143
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 12, $o), 0xFFFF);
144
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 13, $o), 0xFFFF);
145
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 14, $o), 0xFFFF);
146
- }
147
-
148
- public function testShortBig()
149
- {
150
- $o = PelConvert::BIG_ENDIAN;
151
-
152
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 0, $o), 0x0000);
153
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 1, $o), 0x0000);
154
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 2, $o), 0x0000);
155
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 3, $o), 0x0001);
156
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 4, $o), 0x0123);
157
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 5, $o), 0x2345);
158
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 6, $o), 0x4567);
159
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 7, $o), 0x6789);
160
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 8, $o), 0x89AB);
161
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 9, $o), 0xABCD);
162
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 10, $o), 0xCDEF);
163
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 11, $o), 0xEFFF);
164
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 12, $o), 0xFFFF);
165
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 13, $o), 0xFFFF);
166
- $this->assertEquals(PelConvert::bytesToShort($this->bytes, 14, $o), 0xFFFF);
167
- }
168
-
169
- public function testSShortLittle()
170
- {
171
- $o = PelConvert::LITTLE_ENDIAN;
172
-
173
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 0, $o), 0);
174
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 1, $o), 0);
175
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 2, $o), 0);
176
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 3, $o), 256);
177
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 4, $o), 8961);
178
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 5, $o), 17699);
179
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 6, $o), 26437);
180
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 7, $o), - 30361);
181
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 8, $o), - 21623);
182
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 9, $o), - 12885);
183
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 10, $o), - 4147);
184
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 11, $o), - 17);
185
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 12, $o), - 1);
186
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 13, $o), - 1);
187
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 14, $o), - 1);
188
- }
189
-
190
- public function testSShortBig()
191
- {
192
- $o = PelConvert::BIG_ENDIAN;
193
-
194
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 0, $o), 0);
195
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 1, $o), 0);
196
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 2, $o), 0);
197
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 3, $o), 1);
198
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 4, $o), 291);
199
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 5, $o), 9029);
200
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 6, $o), 17767);
201
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 7, $o), 26505);
202
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 8, $o), - 30293);
203
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 9, $o), - 21555);
204
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 10, $o), - 12817);
205
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 11, $o), - 4097);
206
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 12, $o), - 1);
207
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 13, $o), - 1);
208
- $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 14, $o), - 1);
209
- }
210
-
211
- public function testByte()
212
- {
213
- $this->assertEquals(PelConvert::bytesToByte($this->bytes, 0), 0x00);
214
- $this->assertEquals(PelConvert::bytesToByte($this->bytes, 1), 0x00);
215
- $this->assertEquals(PelConvert::bytesToByte($this->bytes, 2), 0x00);
216
- $this->assertEquals(PelConvert::bytesToByte($this->bytes, 3), 0x00);
217
- $this->assertEquals(PelConvert::bytesToByte($this->bytes, 4), 0x01);
218
- $this->assertEquals(PelConvert::bytesToByte($this->bytes, 5), 0x23);
219
- $this->assertEquals(PelConvert::bytesToByte($this->bytes, 6), 0x45);
220
- $this->assertEquals(PelConvert::bytesToByte($this->bytes, 7), 0x67);
221
- $this->assertEquals(PelConvert::bytesToByte($this->bytes, 8), 0x89);
222
- $this->assertEquals(PelConvert::bytesToByte($this->bytes, 9), 0xAB);
223
- $this->assertEquals(PelConvert::bytesToByte($this->bytes, 10), 0xCD);
224
- $this->assertEquals(PelConvert::bytesToByte($this->bytes, 11), 0xEF);
225
- $this->assertEquals(PelConvert::bytesToByte($this->bytes, 12), 0xFF);
226
- $this->assertEquals(PelConvert::bytesToByte($this->bytes, 13), 0xFF);
227
- $this->assertEquals(PelConvert::bytesToByte($this->bytes, 14), 0xFF);
228
- $this->assertEquals(PelConvert::bytesToByte($this->bytes, 15), 0xFF);
229
- }
230
-
231
- public function testSByte()
232
- {
233
- $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 0), 0);
234
- $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 1), 0);
235
- $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 2), 0);
236
- $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 3), 0);
237
- $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 4), 1);
238
- $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 5), 35);
239
- $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 6), 69);
240
- $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 7), 103);
241
- $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 8), - 119);
242
- $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 9), - 85);
243
- $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 10), - 51);
244
- $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 11), - 17);
245
- $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 12), - 1);
246
- $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 13), - 1);
247
- $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 14), - 1);
248
- $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 15), - 1);
249
- }
250
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/DataWindowTest.php DELETED
@@ -1,143 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * PEL: PHP Exif Library.
5
- * A library with support for reading and
6
- * writing all Exif headers in JPEG and TIFF images using PHP.
7
- *
8
- * Copyright (C) 2004 Martin Geisler.
9
- *
10
- * This program is free software; you can redistribute it and/or modify
11
- * it under the terms of the GNU General Public License as published by
12
- * the Free Software Foundation; either version 2 of the License, or
13
- * (at your option) any later version.
14
- *
15
- * This program is distributed in the hope that it will be useful,
16
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
- * GNU General Public License for more details.
19
- *
20
- * You should have received a copy of the GNU General Public License
21
- * along with this program in the file COPYING; if not, write to the
22
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
23
- * Boston, MA 02110-1301 USA
24
- */
25
-
26
- namespace Pel\Test;
27
-
28
- use lsolesen\pel\PelDataWindow;
29
- use lsolesen\pel\PelConvert;
30
- use lsolesen\pel\PelDataWindowOffsetException;
31
- use PHPUnit\Framework\TestCase;
32
-
33
- class DataWindowTest extends TestCase
34
- {
35
-
36
- public function testReadBytes()
37
- {
38
- $window = new PelDataWindow('abcdefgh');
39
-
40
- $this->assertEquals($window->getSize(), 8);
41
- $this->assertEquals($window->getBytes(), 'abcdefgh');
42
-
43
- $this->assertEquals($window->getBytes(0), 'abcdefgh');
44
- $this->assertEquals($window->getBytes(1), 'bcdefgh');
45
- $this->assertEquals($window->getBytes(7), 'h');
46
- // $this->assertEquals($window->getBytes(8), '');
47
-
48
- $this->assertEquals($window->getBytes(- 1), 'h');
49
- $this->assertEquals($window->getBytes(- 2), 'gh');
50
- $this->assertEquals($window->getBytes(- 7), 'bcdefgh');
51
- $this->assertEquals($window->getBytes(- 8), 'abcdefgh');
52
-
53
- $clone = $window->getClone(2, 4);
54
- $this->assertEquals($clone->getSize(), 4);
55
- $this->assertEquals($clone->getBytes(), 'cdef');
56
-
57
- $this->assertEquals($clone->getBytes(0), 'cdef');
58
- $this->assertEquals($clone->getBytes(1), 'def');
59
- $this->assertEquals($clone->getBytes(3), 'f');
60
- // $this->assertEquals($clone->getBytes(4), '');
61
-
62
- $this->assertEquals($clone->getBytes(- 1), 'f');
63
- $this->assertEquals($clone->getBytes(- 2), 'ef');
64
- $this->assertEquals($clone->getBytes(- 3), 'def');
65
- $this->assertEquals($clone->getBytes(- 4), 'cdef');
66
-
67
- $caught = false;
68
- try {
69
- $clone->getBytes(0, 6);
70
- } catch (PelDataWindowOffsetException $e) {
71
- $caught = true;
72
- }
73
- $this->assertTrue($caught);
74
- }
75
-
76
- public function testReadIntegers()
77
- {
78
- $window = new PelDataWindow("\x01\x02\x03\x04", PelConvert::BIG_ENDIAN);
79
-
80
- $this->assertEquals($window->getSize(), 4);
81
- $this->assertEquals($window->getBytes(), "\x01\x02\x03\x04");
82
-
83
- $this->assertEquals($window->getByte(0), 0x01);
84
- $this->assertEquals($window->getByte(1), 0x02);
85
- $this->assertEquals($window->getByte(2), 0x03);
86
- $this->assertEquals($window->getByte(3), 0x04);
87
-
88
- $this->assertEquals($window->getShort(0), 0x0102);
89
- $this->assertEquals($window->getShort(1), 0x0203);
90
- $this->assertEquals($window->getShort(2), 0x0304);
91
-
92
- $this->assertEquals($window->getLong(0), 0x01020304);
93
-
94
- $window->setByteOrder(PelConvert::LITTLE_ENDIAN);
95
- $this->assertEquals($window->getSize(), 4);
96
- $this->assertEquals($window->getBytes(), "\x01\x02\x03\x04");
97
-
98
- $this->assertEquals($window->getByte(0), 0x01);
99
- $this->assertEquals($window->getByte(1), 0x02);
100
- $this->assertEquals($window->getByte(2), 0x03);
101
- $this->assertEquals($window->getByte(3), 0x04);
102
-
103
- $this->assertEquals($window->getShort(0), 0x0201);
104
- $this->assertEquals($window->getShort(1), 0x0302);
105
- $this->assertEquals($window->getShort(2), 0x0403);
106
-
107
- $this->assertEquals($window->getLong(0), 0x04030201);
108
- }
109
-
110
- public function testReadBigIntegers()
111
- {
112
- $window = new PelDataWindow("\x89\xAB\xCD\xEF", PelConvert::BIG_ENDIAN);
113
-
114
- $this->assertEquals($window->getSize(), 4);
115
- $this->assertEquals($window->getBytes(), "\x89\xAB\xCD\xEF");
116
-
117
- $this->assertEquals($window->getByte(0), 0x89);
118
- $this->assertEquals($window->getByte(1), 0xAB);
119
- $this->assertEquals($window->getByte(2), 0xCD);
120
- $this->assertEquals($window->getByte(3), 0xEF);
121
-
122
- $this->assertEquals($window->getShort(0), 0x89AB);
123
- $this->assertEquals($window->getShort(1), 0xABCD);
124
- $this->assertEquals($window->getShort(2), 0xCDEF);
125
-
126
- $this->assertEquals($window->getLong(0), 0x89ABCDEF);
127
-
128
- $window->setByteOrder(PelConvert::LITTLE_ENDIAN);
129
- $this->assertEquals($window->getSize(), 4);
130
- $this->assertEquals($window->getBytes(), "\x89\xAB\xCD\xEF");
131
-
132
- $this->assertEquals($window->getByte(0), 0x89);
133
- $this->assertEquals($window->getByte(1), 0xAB);
134
- $this->assertEquals($window->getByte(2), 0xCD);
135
- $this->assertEquals($window->getByte(3), 0xEF);
136
-
137
- $this->assertEquals($window->getShort(0), 0xAB89);
138
- $this->assertEquals($window->getShort(1), 0xCDAB);
139
- $this->assertEquals($window->getShort(2), 0xEFCD);
140
-
141
- $this->assertEquals($window->getLong(0), 0xEFCDAB89);
142
- }
143
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/GH16Test.php DELETED
@@ -1,86 +0,0 @@
1
- <?php
2
- /**
3
- * PEL: PHP Exif Library.
4
- * A library with support for reading and
5
- * writing all Exif headers in JPEG and TIFF images using PHP.
6
- *
7
- * Copyright (C) 2004, 2006, 2007 Martin Geisler.
8
- *
9
- * This program is free software; you can redistribute it and/or modify
10
- * it under the terms of the GNU General Public License as published by
11
- * the Free Software Foundation; either version 2 of the License, or
12
- * (at your option) any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- * GNU General Public License for more details.
18
- *
19
- * You should have received a copy of the GNU General Public License
20
- * along with this program in the file COPYING; if not, write to the
21
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
22
- * Boston, MA 02110-1301 USA
23
- */
24
-
25
- namespace Pel\Test;
26
-
27
- use lsolesen\pel\PelDataWindow;
28
- use lsolesen\pel\PelJpeg;
29
- use lsolesen\pel\PelEntryWindowsString;
30
- use lsolesen\pel\PelTag;
31
- use PHPUnit\Framework\TestCase;
32
-
33
- class GH16Test extends TestCase
34
- {
35
- protected $file;
36
-
37
- public function setUp()
38
- {
39
- $this->file = dirname(__FILE__) . '/images/gh-16-tmp.jpg';
40
- $file = dirname(__FILE__) . '/images/gh-16.jpg';
41
- copy($file, $this->file);
42
- }
43
-
44
- public function tearDown()
45
- {
46
- unlink($this->file);
47
- }
48
-
49
- public function testThisDoesNotWorkAsExpected()
50
- {
51
- $subject = "Превед, медвед!";
52
-
53
- $data = new PelDataWindow(file_get_contents($this->file));
54
-
55
- if (PelJpeg::isValid($data)) {
56
- $jpeg = new PelJpeg();
57
- $jpeg->load($data);
58
- $exif = $jpeg->getExif();
59
-
60
- if (null === $exif) {
61
- $exif = new PelExif();
62
- $jpeg->setExif($exif);
63
- $tiff = new PelTiff();
64
- $exif->setTiff($tiff);
65
- }
66
-
67
- $tiff = $exif->getTiff();
68
-
69
- $ifd0 = $tiff->getIfd();
70
- if (null === $ifd0) {
71
- $ifd0 = new PelIfd(PelIfd::IFD0);
72
- $tiff->setIfd($ifd0);
73
- }
74
- }
75
- $ifd0->addEntry(new PelEntryWindowsString(PelTag::XP_SUBJECT, $subject));
76
-
77
- file_put_contents($this->file, $jpeg->getBytes());
78
-
79
- $jpeg = new PelJpeg($this->file);
80
- $exif = $jpeg->getExif();
81
- $tiff = $exif->getTiff();
82
- $ifd0 = $tiff->getIfd();
83
- $written_subject = $ifd0->getEntry(PelTag::XP_SUBJECT);
84
- $this->assertEquals($subject, $written_subject->getValue());
85
- }
86
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/GH21Test.php DELETED
@@ -1,86 +0,0 @@
1
- <?php
2
- /**
3
- * PEL: PHP Exif Library.
4
- * A library with support for reading and
5
- * writing all Exif headers in JPEG and TIFF images using PHP.
6
- *
7
- * Copyright (C) 2004, 2006, 2007 Martin Geisler.
8
- *
9
- * This program is free software; you can redistribute it and/or modify
10
- * it under the terms of the GNU General Public License as published by
11
- * the Free Software Foundation; either version 2 of the License, or
12
- * (at your option) any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- * GNU General Public License for more details.
18
- *
19
- * You should have received a copy of the GNU General Public License
20
- * along with this program in the file COPYING; if not, write to the
21
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
22
- * Boston, MA 02110-1301 USA
23
- */
24
-
25
- namespace Pel\Test;
26
-
27
- use lsolesen\pel\PelJpeg;
28
- use PHPUnit\Framework\TestCase;
29
-
30
- class GH21Test extends TestCase
31
- {
32
- protected $file;
33
-
34
- public function setUp()
35
- {
36
- $this->file = dirname(__FILE__) . '/images/gh-21-tmp.jpg';
37
- $file = dirname(__FILE__) . '/images/gh-21.jpg';
38
- copy($file, $this->file);
39
- }
40
-
41
- public function tearDown()
42
- {
43
- unlink($this->file);
44
- }
45
-
46
- public function testThisDoesNotWorkAsExpected()
47
- {
48
- $scale = 0.75;
49
- $input_jpeg = new PelJpeg($this->file);
50
-
51
- $original = ImageCreateFromString($input_jpeg->getBytes());
52
- $original_w = ImagesX($original);
53
- $original_h = ImagesY($original);
54
-
55
- $scaled_w = $original_w * $scale;
56
- $scaled_h = $original_h * $scale;
57
-
58
- $scaled = ImageCreateTrueColor($scaled_w, $scaled_h);
59
- ImageCopyResampled(
60
- $scaled,
61
- $original,
62
- 0,
63
- 0, /* dst (x,y) */
64
- 0,
65
- 0, /* src (x,y) */
66
- $scaled_w,
67
- $scaled_h,
68
- $original_w,
69
- $original_h
70
- );
71
-
72
- $output_jpeg = new PelJpeg($scaled);
73
-
74
- $exif = $input_jpeg->getExif();
75
-
76
- if ($exif !== null) {
77
- $output_jpeg->setExif($exif);
78
- }
79
-
80
- file_put_contents($this->file, $output_jpeg->getBytes());
81
-
82
- $jpeg = new PelJpeg($this->file);
83
- $exifin = $jpeg->getExif();
84
- $this->assertEquals($exif, $exifin);
85
- }
86
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/GH77Test.php DELETED
@@ -1,52 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * PEL: PHP Exif Library.
5
- * A library with support for reading and
6
- * writing all Exif headers in JPEG and TIFF images using PHP.
7
- *
8
- * Copyright (C) 2004, 2006, 2007 Martin Geisler.
9
- *
10
- * This program is free software; you can redistribute it and/or modify
11
- * it under the terms of the GNU General Public License as published by
12
- * the Free Software Foundation; either version 2 of the License, or
13
- * (at your option) any later version.
14
- *
15
- * This program is distributed in the hope that it will be useful,
16
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
- * GNU General Public License for more details.
19
- *
20
- * You should have received a copy of the GNU General Public License
21
- * along with this program in the file COPYING; if not, write to the
22
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
23
- * Boston, MA 02110-1301 USA
24
- */
25
-
26
- namespace Pel\Test;
27
-
28
- use lsolesen\pel\PelDataWindow;
29
- use lsolesen\pel\PelJpeg;
30
- use lsolesen\pel\PelTiff;
31
- use lsolesen\pel\Pel;
32
- use lsolesen\pel\PelTag;
33
- use PHPUnit\Framework\TestCase;
34
-
35
- class GH77Test extends TestCase
36
- {
37
- public function testReturnModul()
38
- {
39
-
40
- $file = dirname(__FILE__) . '/images/gh-77.jpg';
41
-
42
- $input_jpeg = new PelJpeg($file);
43
- $app1 = $input_jpeg->getExif();
44
-
45
- $tiff = $app1->getTiff();
46
- $ifd0 = $tiff->getIfd();
47
-
48
- $model = $ifd0->getEntry(PelTag::MODEL);
49
-
50
- $this->assertEquals($model->getValue(), "Canon EOS 5D Mark III");
51
- }
52
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/IfdTest.php DELETED
@@ -1,78 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * PEL: PHP Exif Library.
5
- * A library with support for reading and
6
- * writing all Exif headers in JPEG and TIFF images using PHP.
7
- *
8
- * Copyright (C) 2006 Martin Geisler.
9
- *
10
- * This program is free software; you can redistribute it and/or modify
11
- * it under the terms of the GNU General Public License as published by
12
- * the Free Software Foundation; either version 2 of the License, or
13
- * (at your option) any later version.
14
- *
15
- * This program is distributed in the hope that it will be useful,
16
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
- * GNU General Public License for more details.
19
- *
20
- * You should have received a copy of the GNU General Public License
21
- * along with this program in the file COPYING; if not, write to the
22
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
23
- * Boston, MA 02110-1301 USA
24
- */
25
-
26
- namespace Pel\Test;
27
-
28
- use lsolesen\pel\PelIfd;
29
- use lsolesen\pel\PelEntryAscii;
30
- use lsolesen\pel\PelTag;
31
- use lsolesen\pel\PelEntryTime;
32
- use PHPUnit\Framework\TestCase;
33
-
34
- class IfdTest extends TestCase
35
- {
36
- public function testIteratorAggretate()
37
- {
38
- $ifd = new PelIfd(PelIfd::IFD0);
39
-
40
- $this->assertEquals(sizeof($ifd->getIterator()), 0);
41
-
42
- $desc = new PelEntryAscii(PelTag::IMAGE_DESCRIPTION, 'Hello?');
43
- $date = new PelEntryTime(PelTag::DATE_TIME, 12345678);
44
-
45
- $ifd->addEntry($desc);
46
- $ifd->addEntry($date);
47
-
48
- $this->assertEquals(sizeof($ifd->getIterator()), 2);
49
-
50
- $entries = [];
51
- foreach ($ifd as $tag => $entry) {
52
- $entries[$tag] = $entry;
53
- }
54
-
55
- $this->assertSame($entries[PelTag::IMAGE_DESCRIPTION], $desc);
56
- $this->assertSame($entries[PelTag::DATE_TIME], $date);
57
- }
58
-
59
- public function testArrayAccess()
60
- {
61
- $ifd = new PelIfd(PelIfd::IFD0);
62
-
63
- $this->assertEquals(sizeof($ifd->getIterator()), 0);
64
-
65
- $desc = new PelEntryAscii(PelTag::IMAGE_DESCRIPTION, 'Hello?');
66
- $date = new PelEntryTime(PelTag::DATE_TIME, 12345678);
67
-
68
- $ifd[] = $desc;
69
- $ifd[] = $date;
70
-
71
- $this->assertSame($ifd[PelTag::IMAGE_DESCRIPTION], $desc);
72
- $this->assertSame($ifd[PelTag::DATE_TIME], $date);
73
-
74
- unset($ifd[PelTag::DATE_TIME]);
75
-
76
- $this->assertFalse(isset($ifd[PelTag::DATE_TIME]));
77
- }
78
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/MisplacedExifTest.php DELETED
@@ -1,82 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * PEL: PHP Exif Library. A library with support for reading and
5
- * writing all Exif headers in JPEG and TIFF images using PHP.
6
- *
7
- * Copyright (C) 2005, 2006 Martin Geisler.
8
- *
9
- * This program is free software; you can redistribute it and/or modify
10
- * it under the terms of the GNU General Public License as published by
11
- * the Free Software Foundation; either version 2 of the License, or
12
- * (at your option) any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- * GNU General Public License for more details.
18
- *
19
- * You should have received a copy of the GNU General Public License
20
- * along with this program in the file COPYING; if not, write to the
21
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
22
- * Boston, MA 02110-1301 USA
23
- */
24
-
25
- namespace Pel\Test;
26
-
27
- use lsolesen\pel\Pel;
28
- use lsolesen\pel\PelJpeg;
29
- use lsolesen\pel\PelExif;
30
- use lsolesen\pel\PelJpegMarker;
31
- use PHPUnit\Framework\TestCase;
32
-
33
- class MisplacedExifTest extends TestCase
34
- {
35
- // NOTE: this test relies on the assumption that internal PelJpeg::sections order is kept between section
36
- // manipulations. It may fail it this changes.
37
- public function testRead()
38
- {
39
- Pel::clearExceptions();
40
- Pel::setStrictParsing(false);
41
- // Image contains non-EXIF APP1 section ahead of the EXIF one
42
- $jpeg = new PelJpeg(dirname(__FILE__) . '/broken_images/misplaced-exif.jpg');
43
- // Assert we just have loaded correct file for the test
44
- $this->assertNotInstanceOf('\lsolesen\pel\PelExif', $jpeg->getSection(PelJpegMarker::APP1));
45
-
46
- // Manually find exif APP1 section index
47
- $sections1 = $jpeg->getSections();
48
- $exifIdx = null;
49
- $idx = 0;
50
- foreach ($sections1 as $section) {
51
- if (($section[0] == PelJpegMarker::APP1) && ($section[1] instanceof PelExif)) {
52
- $exifIdx = $idx;
53
- break;
54
- }
55
- ++$idx;
56
- }
57
- $this->assertNotNull($exifIdx);
58
- $newExif = new PelExif();
59
- $jpeg->setExif($newExif);
60
- // Ensure EXIF is set to correct position among sections
61
- $sections2 = $jpeg->getSections();
62
- $this->assertSame($sections1[$exifIdx][0], $sections2[$exifIdx][0]);
63
- $this->assertNotSame($sections1[$exifIdx][1], $sections2[$exifIdx][1]);
64
- $this->assertSame($newExif, $sections2[$exifIdx][1]);
65
-
66
- $this->assertInstanceOf('\lsolesen\pel\PelExif', $jpeg->getExif());
67
- $jpeg->clearExif();
68
- // Assert that only EXIF section is gone and all other shifted correctly.
69
- $sections3 = $jpeg->getSections();
70
- $numSections3 = count($sections3);
71
- for ($idx = 0; $idx < $numSections3; ++$idx) {
72
- if ($idx >= $exifIdx) {
73
- $s2idx = $idx + 1;
74
- } else {
75
- $s2idx = $idx;
76
- }
77
- $this->assertSame($sections2[$s2idx][0], $sections3[$idx][0]);
78
- $this->assertSame($sections2[$s2idx][1], $sections3[$idx][1]);
79
- }
80
- $this->assertNotInstanceOf('\lsolesen\pel\PelExif', $jpeg->getExif());
81
- }
82
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/NoExifTest.php DELETED
@@ -1,44 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * PEL: PHP Exif Library. A library with support for reading and
5
- * writing all Exif headers in JPEG and TIFF images using PHP.
6
- *
7
- * Copyright (C) 2005, 2006 Martin Geisler.
8
- *
9
- * This program is free software; you can redistribute it and/or modify
10
- * it under the terms of the GNU General Public License as published by
11
- * the Free Software Foundation; either version 2 of the License, or
12
- * (at your option) any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- * GNU General Public License for more details.
18
- *
19
- * You should have received a copy of the GNU General Public License
20
- * along with this program in the file COPYING; if not, write to the
21
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
22
- * Boston, MA 02110-1301 USA
23
- */
24
-
25
- namespace Pel\Test;
26
-
27
- use lsolesen\pel\Pel;
28
- use lsolesen\pel\PelJpeg;
29
- use PHPUnit\Framework\TestCase;
30
-
31
- class NoExifTest extends TestCase
32
- {
33
- public function testRead()
34
- {
35
- Pel::clearExceptions();
36
- Pel::setStrictParsing(false);
37
- $jpeg = new PelJpeg(dirname(__FILE__) . '/images/no-exif.jpg');
38
-
39
- $exif = $jpeg->getExif();
40
- $this->assertNull($exif);
41
-
42
- $this->assertTrue(count(Pel::getExceptions()) == 0);
43
- }
44
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/NumberByteTest.php DELETED
@@ -1,42 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * PEL: PHP Exif Library.
5
- * A library with support for reading and
6
- * writing all Exif headers in JPEG and TIFF images using PHP.
7
- *
8
- * Copyright (C) 2004, 2005, 2006 Martin Geisler.
9
- *
10
- * This program is free software; you can redistribute it and/or modify
11
- * it under the terms of the GNU General Public License as published by
12
- * the Free Software Foundation; either version 2 of the License, or
13
- * (at your option) any later version.
14
- *
15
- * This program is distributed in the hope that it will be useful,
16
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
- * GNU General Public License for more details.
19
- *
20
- * You should have received a copy of the GNU General Public License
21
- * along with this program in the file COPYING; if not, write to the
22
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
23
- * Boston, MA 02110-1301 USA
24
- */
25
-
26
- namespace Pel\Test;
27
-
28
- use \lsolesen\pel\PelEntryByte;
29
-
30
- class NumberByteTest extends NumberTestCase
31
- {
32
- /**
33
- * {@inheritdoc}
34
- */
35
- public function setUp()
36
- {
37
- parent::setUp();
38
- $this->num = new PelEntryByte(42);
39
- $this->min = 0;
40
- $this->max = 255;
41
- }
42
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/NumberLongTest.php DELETED
@@ -1,42 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * PEL: PHP Exif Library.
5
- * A library with support for reading and
6
- * writing all Exif headers in JPEG and TIFF images using PHP.
7
- *
8
- * Copyright (C) 2004, 2005, 2006 Martin Geisler.
9
- *
10
- * This program is free software; you can redistribute it and/or modify
11
- * it under the terms of the GNU General Public License as published by
12
- * the Free Software Foundation; either version 2 of the License, or
13
- * (at your option) any later version.
14
- *
15
- * This program is distributed in the hope that it will be useful,
16
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
- * GNU General Public License for more details.
19
- *
20
- * You should have received a copy of the GNU General Public License
21
- * along with this program in the file COPYING; if not, write to the
22
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
23
- * Boston, MA 02110-1301 USA
24
- */
25
-
26
- namespace Pel\Test;
27
-
28
- use \lsolesen\pel\PelEntryLong;
29
-
30
- class NumberLongTest extends NumberTestCase
31
- {
32
- /**
33
- * {@inheritdoc}
34
- */
35
- public function setUp()
36
- {
37
- parent::setUp();
38
- $this->num = new PelEntryLong(42);
39
- $this->min = 0;
40
- $this->max = 4294967295;
41
- }
42
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/NumberRationalTest.php DELETED
@@ -1,84 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * PEL: PHP Exif Library.
5
- * A library with support for reading and
6
- * writing all Exif headers in JPEG and TIFF images using PHP.
7
- *
8
- * Copyright (C) 2004, 2005, 2006 Martin Geisler.
9
- *
10
- * This program is free software; you can redistribute it and/or modify
11
- * it under the terms of the GNU General Public License as published by
12
- * the Free Software Foundation; either version 2 of the License, or
13
- * (at your option) any later version.
14
- *
15
- * This program is distributed in the hope that it will be useful,
16
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
- * GNU General Public License for more details.
19
- *
20
- * You should have received a copy of the GNU General Public License
21
- * along with this program in the file COPYING; if not, write to the
22
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
23
- * Boston, MA 02110-1301 USA
24
- */
25
-
26
- namespace Pel\Test;
27
-
28
- use \lsolesen\pel\PelEntryRational;
29
- use \lsolesen\pel\PelOverflowException;
30
-
31
- class NumberRationalTest extends NumberTestCase
32
- {
33
- public function testOverflow()
34
- {
35
- $entry = new PelEntryRational(42, [1, 2]);
36
- $this->assertEquals($entry->getValue(), [1, 2]);
37
-
38
- $caught = false;
39
- try {
40
- $entry->setValue([3, 4], [-1, 2], [7, 8]);
41
- } catch (PelOverflowException $e) {
42
- $caught = true;
43
- }
44
- $this->assertTrue($caught);
45
- $this->assertEquals($entry->getValue(), [1, 2]);
46
-
47
- $caught = false;
48
- try {
49
- $entry->setValue([3, 4], [1, 4294967296]);
50
- } catch (PelOverflowException $e) {
51
- $caught = true;
52
- }
53
- $this->assertTrue($caught);
54
- $this->assertEquals($entry->getValue(), [1, 2]);
55
-
56
- $caught = false;
57
- try {
58
- $entry->setValue([3, 4], [4294967296, 1]);
59
- } catch (PelOverflowException $e) {
60
- $caught = true;
61
- }
62
- $this->assertTrue($caught);
63
- $this->assertEquals($entry->getValue(), [1, 2]);
64
- }
65
-
66
- public function testReturnValues()
67
- {
68
- $entry = new PelEntryRational(42);
69
- $this->assertEquals($entry->getValue(), []);
70
- $this->assertEquals($entry->getText(), '');
71
-
72
- $entry->setValue([1, 2], [3, 4], [5, 6]);
73
- $this->assertEquals($entry->getValue(), [[1, 2], [3, 4], [5, 6]]);
74
- $this->assertEquals($entry->getText(), '1/2, 3/4, 5/6');
75
-
76
- $entry->setValue([7, 8]);
77
- $this->assertEquals($entry->getValue(), [7, 8]);
78
- $this->assertEquals($entry->getText(), '7/8');
79
-
80
- $entry->setValue([0, 4294967295]);
81
- $this->assertEquals($entry->getValue(), [0, 4294967295]);
82
- $this->assertEquals($entry->getText(), '0/4294967295');
83
- }
84
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/NumberSByteTest.php DELETED
@@ -1,42 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * PEL: PHP Exif Library.
5
- * A library with support for reading and
6
- * writing all Exif headers in JPEG and TIFF images using PHP.
7
- *
8
- * Copyright (C) 2004, 2005, 2006 Martin Geisler.
9
- *
10
- * This program is free software; you can redistribute it and/or modify
11
- * it under the terms of the GNU General Public License as published by
12
- * the Free Software Foundation; either version 2 of the License, or
13
- * (at your option) any later version.
14
- *
15
- * This program is distributed in the hope that it will be useful,
16
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
- * GNU General Public License for more details.
19
- *
20
- * You should have received a copy of the GNU General Public License
21
- * along with this program in the file COPYING; if not, write to the
22
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
23
- * Boston, MA 02110-1301 USA
24
- */
25
-
26
- namespace Pel\Test;
27
-
28
- use \lsolesen\pel\PelEntrySByte;
29
-
30
- class NumberSByteTest extends NumberTestCase
31
- {
32
- /**
33
- * {@inheritdoc}
34
- */
35
- public function setUp()
36
- {
37
- parent::setUp();
38
- $this->num = new PelEntrySByte(42);
39
- $this->min = -128;
40
- $this->max = 127;
41
- }
42
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/NumberSLongTest.php DELETED
@@ -1,42 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * PEL: PHP Exif Library.
5
- * A library with support for reading and
6
- * writing all Exif headers in JPEG and TIFF images using PHP.
7
- *
8
- * Copyright (C) 2004, 2005, 2006 Martin Geisler.
9
- *
10
- * This program is free software; you can redistribute it and/or modify
11
- * it under the terms of the GNU General Public License as published by
12
- * the Free Software Foundation; either version 2 of the License, or
13
- * (at your option) any later version.
14
- *
15
- * This program is distributed in the hope that it will be useful,
16
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
- * GNU General Public License for more details.
19
- *
20
- * You should have received a copy of the GNU General Public License
21
- * along with this program in the file COPYING; if not, write to the
22
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
23
- * Boston, MA 02110-1301 USA
24
- */
25
-
26
- namespace Pel\Test;
27
-
28
- use \lsolesen\pel\PelEntrySLong;
29
-
30
- class NumberSLongTest extends NumberTestCase
31
- {
32
- /**
33
- * {@inheritdoc}
34
- */
35
- public function setUp()
36
- {
37
- parent::setUp();
38
- $this->num = new PelEntrySLong(42);
39
- $this->min = -2147483648;
40
- $this->max = 2147483647;
41
- }
42
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/NumberSRationalTest.php DELETED
@@ -1,83 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * PEL: PHP Exif Library.
5
- * A library with support for reading and
6
- * writing all Exif headers in JPEG and TIFF images using PHP.
7
- *
8
- * Copyright (C) 2004, 2005, 2006 Martin Geisler.
9
- *
10
- * This program is free software; you can redistribute it and/or modify
11
- * it under the terms of the GNU General Public License as published by
12
- * the Free Software Foundation; either version 2 of the License, or
13
- * (at your option) any later version.
14
- *
15
- * This program is distributed in the hope that it will be useful,
16
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
- * GNU General Public License for more details.
19
- *
20
- * You should have received a copy of the GNU General Public License
21
- * along with this program in the file COPYING; if not, write to the
22
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
23
- * Boston, MA 02110-1301 USA
24
- */
25
-
26
- namespace Pel\Test;
27
-
28
- use \lsolesen\pel\PelEntrySRational;
29
- use \lsolesen\pel\PelOverflowException;
30
-
31
- class NumberSRationalTest extends NumberTestCase
32
- {
33
- public function testOverflow()
34
- {
35
- $entry = new PelEntrySRational(42, [-1, 2]);
36
- $this->assertEquals($entry->getValue(), [-1, 2]);
37
-
38
- $caught = false;
39
- try {
40
- $entry->setValue([-10, -20], [-1, -2147483649]);
41
- } catch (PelOverflowException $e) {
42
- $caught = true;
43
- }
44
- $this->assertTrue($caught);
45
- $this->assertEquals($entry->getValue(), [-1, 2]);
46
-
47
- $caught = false;
48
- try {
49
- $entry->setValue([3, 4], [1, 2147483648]);
50
- } catch (PelOverflowException $e) {
51
- $caught = true;
52
- }
53
- $this->assertTrue($caught);
54
- $this->assertEquals($entry->getValue(), [-1, 2]);
55
-
56
- $caught = false;
57
- try {
58
- $entry->setValue([3, 4], [4294967296, 1]);
59
- } catch (PelOverflowException $e) {
60
- $caught = true;
61
- }
62
- $this->assertTrue($caught);
63
- $this->assertEquals($entry->getValue(), [-1, 2]);
64
- }
65
-
66
- public function testReturnValues()
67
- {
68
- $entry = new PelEntrySRational(42);
69
- $this->assertEquals($entry->getValue(), []);
70
-
71
- $entry->setValue([-1, 2], [3, 4], [5, -6]);
72
- $this->assertEquals($entry->getValue(), [[-1, 2], [3, 4], [5, -6]]);
73
- $this->assertEquals($entry->getText(), '-1/2, 3/4, -5/6');
74
-
75
- $entry->setValue([-7, -8]);
76
- $this->assertEquals($entry->getValue(), [-7, -8]);
77
- $this->assertEquals($entry->getText(), '7/8');
78
-
79
- $entry->setValue([0, 2147483647]);
80
- $this->assertEquals($entry->getValue(), [0, 2147483647]);
81
- $this->assertEquals($entry->getText(), '0/2147483647');
82
- }
83
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/NumberSShortTest.php DELETED
@@ -1,42 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * PEL: PHP Exif Library.
5
- * A library with support for reading and
6
- * writing all Exif headers in JPEG and TIFF images using PHP.
7
- *
8
- * Copyright (C) 2004, 2005, 2006 Martin Geisler.
9
- *
10
- * This program is free software; you can redistribute it and/or modify
11
- * it under the terms of the GNU General Public License as published by
12
- * the Free Software Foundation; either version 2 of the License, or
13
- * (at your option) any later version.
14
- *
15
- * This program is distributed in the hope that it will be useful,
16
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
- * GNU General Public License for more details.
19
- *
20
- * You should have received a copy of the GNU General Public License
21
- * along with this program in the file COPYING; if not, write to the
22
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
23
- * Boston, MA 02110-1301 USA
24
- */
25
-
26
- namespace Pel\Test;
27
-
28
- use \lsolesen\pel\PelEntrySShort;
29
-
30
- class NumberSShortTest extends NumberTestCase
31
- {
32
- /**
33
- * {@inheritdoc}
34
- */
35
- public function setUp()
36
- {
37
- parent::setUp();
38
- $this->num = new PelEntrySShort(42);
39
- $this->min = -32768;
40
- $this->max = 32767;
41
- }
42
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/NumberShortTest.php DELETED
@@ -1,42 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * PEL: PHP Exif Library.
5
- * A library with support for reading and
6
- * writing all Exif headers in JPEG and TIFF images using PHP.
7
- *
8
- * Copyright (C) 2004, 2005, 2006 Martin Geisler.
9
- *
10
- * This program is free software; you can redistribute it and/or modify
11
- * it under the terms of the GNU General Public License as published by
12
- * the Free Software Foundation; either version 2 of the License, or
13
- * (at your option) any later version.
14
- *
15
- * This program is distributed in the hope that it will be useful,
16
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
- * GNU General Public License for more details.
19
- *
20
- * You should have received a copy of the GNU General Public License
21
- * along with this program in the file COPYING; if not, write to the
22
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
23
- * Boston, MA 02110-1301 USA
24
- */
25
-
26
- namespace Pel\Test;
27
-
28
- use \lsolesen\pel\PelEntryShort;
29
-
30
- class NumberShortTest extends NumberTestCase
31
- {
32
- /**
33
- * {@inheritdoc}
34
- */
35
- public function setUp()
36
- {
37
- parent::setUp();
38
- $this->num = new PelEntryShort(42);
39
- $this->min = 0;
40
- $this->max = 65535;
41
- }
42
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/NumberTestCase.php DELETED
@@ -1,107 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * PEL: PHP Exif Library.
5
- * A library with support for reading and
6
- * writing all Exif headers in JPEG and TIFF images using PHP.
7
- *
8
- * Copyright (C) 2004, 2005, 2006 Martin Geisler.
9
- *
10
- * This program is free software; you can redistribute it and/or modify
11
- * it under the terms of the GNU General Public License as published by
12
- * the Free Software Foundation; either version 2 of the License, or
13
- * (at your option) any later version.
14
- *
15
- * This program is distributed in the hope that it will be useful,
16
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
- * GNU General Public License for more details.
19
- *
20
- * You should have received a copy of the GNU General Public License
21
- * along with this program in the file COPYING; if not, write to the
22
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
23
- * Boston, MA 02110-1301 USA
24
- */
25
-
26
- namespace Pel\Test;
27
-
28
- use \lsolesen\pel\Pel;
29
- use \lsolesen\pel\PelOverflowException;
30
- use PHPUnit\Framework\TestCase;
31
-
32
- abstract class NumberTestCase extends TestCase
33
- {
34
- protected $min;
35
- protected $max;
36
- protected $num;
37
-
38
- /**
39
- * {@inheritdoc}
40
- */
41
- public function setUp()
42
- {
43
- parent::setUp();
44
- Pel::setStrictParsing(true);
45
- }
46
-
47
- public function testOverflow()
48
- {
49
- $this->num->setValue(0);
50
- $this->assertSame(0, $this->num->getValue());
51
-
52
- $caught = false;
53
- try {
54
- $this->num->setValue($this->min - 1);
55
- } catch (PelOverflowException $e) {
56
- $caught = true;
57
- }
58
- $this->assertTrue($caught);
59
- $this->assertSame(0, $this->num->getValue());
60
-
61
- $caught = false;
62
- try {
63
- $this->num->setValue($this->max + 1);
64
- } catch (PelOverflowException $e) {
65
- $caught = true;
66
- }
67
- $this->assertTrue($caught);
68
- $this->assertSame(0, $this->num->getValue());
69
-
70
- $caught = false;
71
- try {
72
- $this->num->setValue(0, $this->max + 1);
73
- } catch (PelOverflowException $e) {
74
- $caught = true;
75
- }
76
- $this->assertTrue($caught);
77
- $this->assertSame(0, $this->num->getValue());
78
-
79
- $caught = false;
80
- try {
81
- $this->num->setValue(0, $this->min - 1);
82
- } catch (PelOverflowException $e) {
83
- $caught = true;
84
- }
85
- $this->assertTrue($caught);
86
- $this->assertSame(0, $this->num->getValue());
87
- }
88
-
89
- public function testReturnValues()
90
- {
91
- $this->num->setValue(1, 2, 3);
92
- $this->assertSame([1, 2, 3], $this->num->getValue());
93
- $this->assertSame('1, 2, 3', $this->num->getText());
94
-
95
- $this->num->setValue(1);
96
- $this->assertSame(1, $this->num->getValue());
97
- $this->assertSame(1, $this->num->getText());
98
-
99
- $this->num->setValue($this->max);
100
- $this->assertSame($this->max, $this->num->getValue());
101
- $this->assertSame($this->max, $this->num->getText());
102
-
103
- $this->num->setValue($this->min);
104
- $this->assertSame($this->min, $this->num->getValue());
105
- $this->assertSame($this->min, $this->num->getText());
106
- }
107
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/PelEntryUndefinedTest.php DELETED
@@ -1,84 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * PEL: PHP Exif Library.
5
- * A library with support for reading and
6
- * writing all Exif headers in JPEG and TIFF images using PHP.
7
- *
8
- * Copyright (C) 2004, 2006 Martin Geisler.
9
- * Copyright (C) 2017 Johannes Weberhofer
10
- *
11
- * This program is free software; you can redistribute it and/or modify
12
- * it under the terms of the GNU General Public License as published by
13
- * the Free Software Foundation; either version 2 of the License, or
14
- * (at your option) any later version.
15
- *
16
- * This program is distributed in the hope that it will be useful,
17
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- * GNU General Public License for more details.
20
- *
21
- * You should have received a copy of the GNU General Public License
22
- * along with this program in the file COPYING; if not, write to the
23
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
24
- * Boston, MA 02110-1301 USA
25
- */
26
-
27
- namespace Pel\Test;
28
-
29
- use lsolesen\pel\PelEntryUndefined;
30
- use lsolesen\pel\PelEntryUserComment;
31
- use lsolesen\pel\PelEntryVersion;
32
- use lsolesen\pel\PelConvert;
33
- use PHPUnit\Framework\TestCase;
34
-
35
- class PelEntryUndefinedTest extends TestCase
36
- {
37
-
38
- public function testReturnValues()
39
- {
40
- new PelEntryUndefined(42);
41
-
42
- $entry = new PelEntryUndefined(42, 'foo bar baz');
43
- $this->assertEquals($entry->getComponents(), 11);
44
- $this->assertEquals($entry->getValue(), 'foo bar baz');
45
- }
46
-
47
- public function testUsercomment()
48
- {
49
- $entry = new PelEntryUserComment();
50
- $this->assertEquals($entry->getComponents(), 8);
51
- $this->assertEquals($entry->getValue(), '');
52
- $this->assertEquals($entry->getEncoding(), 'ASCII');
53
-
54
- $entry->setValue('Hello!');
55
- $this->assertEquals($entry->getComponents(), 14);
56
- $this->assertEquals($entry->getValue(), 'Hello!');
57
- $this->assertEquals($entry->getEncoding(), 'ASCII');
58
- }
59
-
60
- public function testVersion()
61
- {
62
- $entry = new PelEntryVersion(42);
63
-
64
- $this->assertEquals($entry->getValue(), 0.0);
65
-
66
- $entry->setValue(2.0);
67
- $this->assertEquals($entry->getValue(), 2.0);
68
- $this->assertEquals($entry->getText(false), 'Version 2.0');
69
- $this->assertEquals($entry->getText(true), '2.0');
70
- $this->assertEquals($entry->getBytes(PelConvert::LITTLE_ENDIAN), '0200');
71
-
72
- $entry->setValue(2.1);
73
- $this->assertEquals($entry->getValue(), 2.1);
74
- $this->assertEquals($entry->getText(false), 'Version 2.1');
75
- $this->assertEquals($entry->getText(true), '2.1');
76
- $this->assertEquals($entry->getBytes(PelConvert::LITTLE_ENDIAN), '0210');
77
-
78
- $entry->setValue(2.01);
79
- $this->assertEquals($entry->getValue(), 2.01);
80
- $this->assertEquals($entry->getText(false), 'Version 2.01');
81
- $this->assertEquals($entry->getText(true), '2.01');
82
- $this->assertEquals($entry->getBytes(PelConvert::LITTLE_ENDIAN), '0201');
83
- }
84
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/PelEntryUserCommentTest.php DELETED
@@ -1,47 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * PEL: PHP Exif Library.
5
- * A library with support for reading and
6
- * writing all Exif headers in JPEG and TIFF images using PHP.
7
- *
8
- * Copyright (C) 2004, 2006 Martin Geisler.
9
- * Copyright (C) 2017 Johannes Weberhofer
10
- *
11
- * This program is free software; you can redistribute it and/or modify
12
- * it under the terms of the GNU General Public License as published by
13
- * the Free Software Foundation; either version 2 of the License, or
14
- * (at your option) any later version.
15
- *
16
- * This program is distributed in the hope that it will be useful,
17
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- * GNU General Public License for more details.
20
- *
21
- * You should have received a copy of the GNU General Public License
22
- * along with this program in the file COPYING; if not, write to the
23
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
24
- * Boston, MA 02110-1301 USA
25
- */
26
-
27
- namespace Pel\Test;
28
-
29
- use lsolesen\pel\PelEntryUserComment;
30
- use PHPUnit\Framework\TestCase;
31
-
32
- class PelEntryUserCommentTest extends TestCase
33
- {
34
-
35
- public function testUsercomment()
36
- {
37
- $entry = new PelEntryUserComment();
38
- $this->assertEquals($entry->getComponents(), 8);
39
- $this->assertEquals($entry->getValue(), '');
40
- $this->assertEquals($entry->getEncoding(), 'ASCII');
41
-
42
- $entry->setValue('Hello!');
43
- $this->assertEquals($entry->getComponents(), 14);
44
- $this->assertEquals($entry->getValue(), 'Hello!');
45
- $this->assertEquals($entry->getEncoding(), 'ASCII');
46
- }
47
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/PelEntryVersionTest.php DELETED
@@ -1,59 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * PEL: PHP Exif Library.
5
- * A library with support for reading and
6
- * writing all Exif headers in JPEG and TIFF images using PHP.
7
- *
8
- * Copyright (C) 2004, 2006 Martin Geisler.
9
- * Copyright (C) 2017 Johannes Weberhofer
10
- *
11
- * This program is free software; you can redistribute it and/or modify
12
- * it under the terms of the GNU General Public License as published by
13
- * the Free Software Foundation; either version 2 of the License, or
14
- * (at your option) any later version.
15
- *
16
- * This program is distributed in the hope that it will be useful,
17
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- * GNU General Public License for more details.
20
- *
21
- * You should have received a copy of the GNU General Public License
22
- * along with this program in the file COPYING; if not, write to the
23
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
24
- * Boston, MA 02110-1301 USA
25
- */
26
-
27
- namespace Pel\Test;
28
-
29
- use lsolesen\pel\PelEntryVersion;
30
- use lsolesen\pel\PelConvert;
31
- use PHPUnit\Framework\TestCase;
32
-
33
- class PelEntryVersionTest extends TestCase
34
- {
35
- public function testVersion()
36
- {
37
- $entry = new PelEntryVersion(42);
38
-
39
- $this->assertEquals($entry->getValue(), 0.0);
40
-
41
- $entry->setValue(2.0);
42
- $this->assertEquals($entry->getValue(), 2.0);
43
- $this->assertEquals($entry->getText(false), 'Version 2.0');
44
- $this->assertEquals($entry->getText(true), '2.0');
45
- $this->assertEquals($entry->getBytes(PelConvert::LITTLE_ENDIAN), '0200');
46
-
47
- $entry->setValue(2.1);
48
- $this->assertEquals($entry->getValue(), 2.1);
49
- $this->assertEquals($entry->getText(false), 'Version 2.1');
50
- $this->assertEquals($entry->getText(true), '2.1');
51
- $this->assertEquals($entry->getBytes(PelConvert::LITTLE_ENDIAN), '0210');
52
-
53
- $entry->setValue(2.01);
54
- $this->assertEquals($entry->getValue(), 2.01);
55
- $this->assertEquals($entry->getText(false), 'Version 2.01');
56
- $this->assertEquals($entry->getText(true), '2.01');
57
- $this->assertEquals($entry->getBytes(PelConvert::LITTLE_ENDIAN), '0201');
58
- }
59
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/PelEntryWindowsStringTest.php DELETED
@@ -1,60 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * PEL: PHP Exif Library.
5
- * A library with support for reading and
6
- * writing all Exif headers in JPEG and TIFF images using PHP.
7
- *
8
- * Copyright (C) 2004, 2006 Martin Geisler.
9
- * Copyright (C) 2017 Johannes Weberhofer
10
- *
11
- * This program is free software; you can redistribute it and/or modify
12
- * it under the terms of the GNU General Public License as published by
13
- * the Free Software Foundation; either version 2 of the License, or
14
- * (at your option) any later version.
15
- *
16
- * This program is distributed in the hope that it will be useful,
17
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- * GNU General Public License for more details.
20
- *
21
- * You should have received a copy of the GNU General Public License
22
- * along with this program in the file COPYING; if not, write to the
23
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
24
- * Boston, MA 02110-1301 USA
25
- */
26
-
27
- namespace Pel\Test;
28
-
29
- use lsolesen\pel\PelConvert;
30
- use lsolesen\pel\PelEntryWindowsString;
31
- use lsolesen\pel\PelTag;
32
- use PHPUnit\Framework\TestCase;
33
-
34
- class PelEntryWindowsStringTest extends TestCase
35
- {
36
-
37
- public function testWindowsString()
38
- {
39
- $test_str = 'Tést';
40
- $test_str_ucs2 = mb_convert_encoding($test_str, 'UCS-2LE', 'auto');
41
- $test_str_ucs2_zt = $test_str_ucs2 . PelEntryWindowsString::ZEROES;
42
-
43
- $entry = new PelEntryWindowsString(PelTag::XP_TITLE, $test_str);
44
- $this->assertNotEquals($entry->getValue(), $entry->getBytes(PelConvert::LITTLE_ENDIAN));
45
- $this->assertEquals($entry->getValue(), $test_str);
46
- $this->assertEquals($entry->getBytes(PelConvert::LITTLE_ENDIAN), $test_str_ucs2_zt);
47
-
48
- // correct zero-terminated data from the exif
49
- $entry->setValue($test_str_ucs2_zt, true);
50
- $this->assertNotEquals($entry->getValue(), $entry->getBytes(PelConvert::LITTLE_ENDIAN));
51
- $this->assertEquals($entry->getValue(), $test_str);
52
- $this->assertEquals($entry->getBytes(PelConvert::LITTLE_ENDIAN), $test_str_ucs2_zt);
53
-
54
- // incorrect data from exif
55
- $entry->setValue($test_str_ucs2, true);
56
- $this->assertNotEquals($entry->getValue(), $entry->getBytes(PelConvert::LITTLE_ENDIAN));
57
- $this->assertEquals($entry->getValue(), $test_str);
58
- $this->assertEquals($entry->getBytes(PelConvert::LITTLE_ENDIAN), $test_str_ucs2_zt);
59
- }
60
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/PelFormatTest.php DELETED
@@ -1,53 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * PEL: PHP Exif Library.
5
- * A library with support for reading and
6
- * writing all Exif headers in JPEG and TIFF images using PHP.
7
- *
8
- * Copyright (C) 2004, 2006 Martin Geisler.
9
- * Copyright (C) 2017 Johannes Weberhofer
10
- *
11
- * This program is free software; you can redistribute it and/or modify
12
- * it under the terms of the GNU General Public License as published by
13
- * the Free Software Foundation; either version 2 of the License, or
14
- * (at your option) any later version.
15
- *
16
- * This program is distributed in the hope that it will be useful,
17
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- * GNU General Public License for more details.
20
- *
21
- * You should have received a copy of the GNU General Public License
22
- * along with this program in the file COPYING; if not, write to the
23
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
24
- * Boston, MA 02110-1301 USA
25
- */
26
-
27
- namespace Pel\Test;
28
-
29
- use PHPUnit\Framework\TestCase;
30
- use lsolesen\pel\Pel;
31
- use lsolesen\pel\PelFormat;
32
-
33
- class PelFormatTest extends TestCase
34
- {
35
-
36
- public function testNames()
37
- {
38
- $pelFormat = new PelFormat();
39
- $this->assertEquals($pelFormat::getName(PelFormat::ASCII), 'Ascii');
40
- $this->assertEquals($pelFormat::getName(PelFormat::FLOAT), 'Float');
41
- $this->assertEquals($pelFormat::getName(PelFormat::UNDEFINED), 'Undefined');
42
- $this->assertEquals($pelFormat::getName(100), Pel::fmt('Unknown format: 0x%X', 100));
43
- }
44
-
45
- public function testDescriptions()
46
- {
47
- $pelFormat = new PelFormat();
48
- $this->assertEquals($pelFormat::getSize(PelFormat::ASCII), 1);
49
- $this->assertEquals($pelFormat::getSize(PelFormat::FLOAT), 4);
50
- $this->assertEquals($pelFormat::getSize(PelFormat::UNDEFINED), 1);
51
- $this->assertEquals($pelFormat::getSize(100), Pel::fmt('Unknown format: 0x%X', 100));
52
- }
53
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/PelJpegMarkerTest.php DELETED
@@ -1,65 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * PEL: PHP Exif Library.
5
- * A library with support for reading and
6
- * writing all Exif headers in JPEG and TIFF images using PHP.
7
- *
8
- * Copyright (C) 2004, 2006 Martin Geisler.
9
- * Copyright (C) 2017 Johannes Weberhofer
10
- *
11
- * This program is free software; you can redistribute it and/or modify
12
- * it under the terms of the GNU General Public License as published by
13
- * the Free Software Foundation; either version 2 of the License, or
14
- * (at your option) any later version.
15
- *
16
- * This program is distributed in the hope that it will be useful,
17
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- * GNU General Public License for more details.
20
- *
21
- * You should have received a copy of the GNU General Public License
22
- * along with this program in the file COPYING; if not, write to the
23
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
24
- * Boston, MA 02110-1301 USA
25
- */
26
-
27
- namespace Pel\Test;
28
-
29
- use PHPUnit\Framework\TestCase;
30
- use lsolesen\pel\PelJpegMarker;
31
- use lsolesen\pel\Pel;
32
- use lsolesen\pel\PelJpegInvalidMarkerException;
33
-
34
- class PelJpegMarkerTest extends TestCase
35
- {
36
-
37
- public function testNames()
38
- {
39
- $jpegMarker = new PelJpegMarker();
40
- $this->assertEquals($jpegMarker::getName(PelJpegMarker::SOF0), 'SOF0');
41
- $this->assertEquals($jpegMarker::getName(PelJpegMarker::RST3), 'RST3');
42
- $this->assertEquals($jpegMarker::getName(PelJpegMarker::APP3), 'APP3');
43
- $this->assertEquals($jpegMarker::getName(PelJpegMarker::JPG11), 'JPG11');
44
- $this->assertEquals($jpegMarker::getName(100), Pel::fmt('Unknown marker: 0x%02X', 100));
45
- }
46
-
47
- public function testDescriptions()
48
- {
49
- $jpegMarker = new PelJpegMarker();
50
- $this->assertEquals($jpegMarker::getDescription(PelJpegMarker::SOF0), 'Encoding (baseline)');
51
- $this->assertEquals($jpegMarker::getDescription(PelJpegMarker::RST3), Pel::fmt('Restart %d', 3));
52
- $this->assertEquals($jpegMarker::getDescription(PelJpegMarker::APP3), Pel::fmt('Application segment %d', 3));
53
- $this->assertEquals($jpegMarker::getDescription(PelJpegMarker::JPG11), Pel::fmt('Extension %d', 11));
54
- $this->assertEquals($jpegMarker::getDescription(100), Pel::fmt('Unknown marker: 0x%02X', 100));
55
- }
56
-
57
- /**
58
- * @expectedException lsolesen\pel\PelJpegInvalidMarkerException
59
- * @throws PelJpegInvalidMarkerException
60
- */
61
- public function testInvalidMarkerException()
62
- {
63
- throw new PelJpegInvalidMarkerException(1, 2);
64
- }
65
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/PelTagTest.php DELETED
@@ -1,63 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * PEL: PHP Exif Library.
5
- * A library with support for reading and
6
- * writing all Exif headers in JPEG and TIFF images using PHP.
7
- *
8
- * Copyright (C) 2004, 2006 Martin Geisler.
9
- * Copyright (C) 2017 Johannes Weberhofer
10
- *
11
- * This program is free software; you can redistribute it and/or modify
12
- * it under the terms of the GNU General Public License as published by
13
- * the Free Software Foundation; either version 2 of the License, or
14
- * (at your option) any later version.
15
- *
16
- * This program is distributed in the hope that it will be useful,
17
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- * GNU General Public License for more details.
20
- *
21
- * You should have received a copy of the GNU General Public License
22
- * along with this program in the file COPYING; if not, write to the
23
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
24
- * Boston, MA 02110-1301 USA
25
- */
26
-
27
- namespace Pel\Test;
28
-
29
- use lsolesen\pel\PelIfd;
30
- use PHPUnit\Framework\TestCase;
31
- use lsolesen\pel\PelTag;
32
-
33
- class PelTagTest extends TestCase
34
- {
35
- const NONEXISTENT_TAG_NAME = 'nonexistent tag name';
36
- const NONEXISTENT_EXIF_TAG = 0xFCFC;
37
- const NONEXISTENT_GPS_TAG = 0xFCFC;
38
- const EXIF_TAG_NAME = 'ImageDescription';
39
- const GPS_TAG_NAME = 'GPSLongitude';
40
- const EXIF_TAG = PelTag::IMAGE_DESCRIPTION;
41
- const GPS_TAG = PelTag::GPS_LONGITUDE;
42
-
43
- public function testReverseLookup()
44
- {
45
- $this->assertSame(false, PelTag::getExifTagByName(self::NONEXISTENT_TAG_NAME), 'Non-existent EXIF tag name');
46
- $this->assertSame(false, PelTag::getGpsTagByName(self::NONEXISTENT_TAG_NAME), 'Non-existent GPS tag name');
47
- $this->assertStringStartsWith(
48
- 'Unknown: ',
49
- PelTag::getName(PelIfd::IFD0, self::NONEXISTENT_EXIF_TAG),
50
- 'Non-existent EXIF tag'
51
- );
52
- $this->assertStringStartsWith(
53
- 'Unknown: ',
54
- PelTag::getName(PelIfd::GPS, self::NONEXISTENT_GPS_TAG),
55
- 'Non-existent GPS tag'
56
- );
57
-
58
- $this->assertSame(static::EXIF_TAG, PelTag::getExifTagByName(self::EXIF_TAG_NAME), 'EXIF tag name');
59
- $this->assertSame(static::GPS_TAG, PelTag::getGpsTagByName(self::GPS_TAG_NAME), 'GPS tag name');
60
- $this->assertEquals(static::EXIF_TAG_NAME, PelTag::getName(PelIfd::IFD0, self::EXIF_TAG), 'EXIF tag');
61
- $this->assertEquals(static::GPS_TAG_NAME, PelTag::getName(PelIfd::GPS, self::GPS_TAG), 'GPS tag');
62
- }
63
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/README.md DELETED
@@ -1,47 +0,0 @@
1
- # README file for PEL Test Suite
2
-
3
- The tests run automatically on each commit on TravisCI. Status for the
4
- master branch is:
5
-
6
- [![Build Status](https://secure.travis-ci.org/pel/pel.png?branch=master)](http://travis-ci.org/pel/pel)
7
-
8
-
9
- ## PEL Test Suite
10
-
11
- This directory holds the PHPUnit test suite for PEL. The test
12
- suite consists of a number of core tests which exercise the basic
13
- functionality of PEL.
14
-
15
- In addition to the core tests, one can download a set of image tests.
16
- These consist of example images taken from as many different camera
17
- models as possible together with a test case that will ensure that PEL
18
- can read the data in the image, and that it keeps interpreting the
19
- data in the same way. This ensures stability in the development
20
- process by making sure that PEL keeps reading images in the same way.
21
-
22
-
23
- ## Running the Test Suite
24
-
25
- First the make sure PHPUnit is downloaded. You can do so in
26
- the project's top directory via composer
27
-
28
- ```bash
29
- composer update
30
- ```
31
-
32
- Now from the top of the project, you can run
33
-
34
- ```bash
35
- phpunit
36
- ```
37
-
38
- ## Failing Tests
39
-
40
- Should one or more of the tests fail, then first ensure that
41
- SimpleTest is placed correctly so that run-tests.php can find it. If
42
- everything seems correct, then please report the error to the PEL
43
- developers:
44
-
45
- https://github.com/lsolesen/pel/issues
46
-
47
- Remember to include all the output in your bug report.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/ReadWriteTest.php DELETED
@@ -1,246 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * PEL: PHP Exif Library. A library with support for reading and
5
- * writing all Exif headers in JPEG and TIFF images using PHP.
6
- *
7
- * Copyright (C) 2004, 2006, 2007 Martin Geisler.
8
- *
9
- * This program is free software; you can redistribute it and/or modify
10
- * it under the terms of the GNU General Public License as published by
11
- * the Free Software Foundation; either version 2 of the License, or
12
- * (at your option) any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- * GNU General Public License for more details.
18
- *
19
- * You should have received a copy of the GNU General Public License
20
- * along with this program in the file COPYING; if not, write to the
21
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
22
- * Boston, MA 02110-1301 USA
23
- */
24
-
25
- namespace Pel\Test;
26
-
27
- use lsolesen\pel\Pel;
28
- use lsolesen\pel\PelEntryByte;
29
- use lsolesen\pel\PelIfd;
30
- use lsolesen\pel\PelTag;
31
- use lsolesen\pel\PelTiff;
32
- use lsolesen\pel\PelExif;
33
- use lsolesen\pel\PelJpeg;
34
- use lsolesen\pel\PelFormat;
35
- use lsolesen\pel\PelEntrySByte;
36
- use lsolesen\pel\PelEntryShort;
37
- use lsolesen\pel\PelEntrySShort;
38
- use lsolesen\pel\PelEntryLong;
39
- use lsolesen\pel\PelEntrySLong;
40
- use lsolesen\pel\PelEntryAscii;
41
- use PHPUnit\Framework\TestCase;
42
-
43
- class WriteEntryTest extends TestCase
44
- {
45
- /**
46
- * {@inheritdoc}
47
- */
48
- public function setUp()
49
- {
50
- parent::setUp();
51
- Pel::setStrictParsing(true);
52
- }
53
-
54
- /**
55
- * @dataProvider writeEntryProvider
56
- */
57
- public function testWriteRead(array $entries)
58
- {
59
- $ifd = new PelIfd(PelIfd::IFD0);
60
- $this->assertTrue($ifd->isLastIfd());
61
-
62
- foreach ($entries as $entry) {
63
- $ifd->addEntry($entry);
64
- }
65
-
66
- $tiff = new PelTiff();
67
- $this->assertNull($tiff->getIfd());
68
- $tiff->setIfd($ifd);
69
- $this->assertNotNull($tiff->getIfd());
70
-
71
- $exif = new PelExif();
72
- $this->assertNull($exif->getTiff());
73
- $exif->setTiff($tiff);
74
- $this->assertNotNull($exif->getTiff());
75
-
76
- $jpeg = new PelJpeg(dirname(__FILE__) . '/images/no-exif.jpg');
77
- $this->assertNull($jpeg->getExif());
78
- $jpeg->setExif($exif);
79
- $this->assertNotNull($jpeg->getExif());
80
-
81
- $jpeg->saveFile('test-output.jpg');
82
- $this->assertTrue(file_exists('test-output.jpg'));
83
- $this->assertTrue(filesize('test-output.jpg') > 0);
84
-
85
- /* Now read the file and see if the entries are still there. */
86
- $jpeg = new PelJpeg('test-output.jpg');
87
-
88
- $exif = $jpeg->getExif();
89
- $this->assertInstanceOf('lsolesen\pel\PelExif', $exif);
90
-
91
- $tiff = $exif->getTiff();
92
- $this->assertInstanceOf('lsolesen\pel\PelTiff', $tiff);
93
-
94
- $ifd = $tiff->getIfd();
95
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd);
96
-
97
- $this->assertEquals($ifd->getType(), PelIfd::IFD0);
98
- $this->assertTrue($ifd->isLastIfd());
99
-
100
- foreach ($entries as $entry) {
101
- $ifdEntry = $ifd->getEntry($entry->getTag());
102
- if ($ifdEntry->getFormat() == PelFormat::ASCII) {
103
- $ifdValue = $ifd->getEntry($entry->getTag())->getValue();
104
- $entryValue = $entry->getValue();
105
- // cut off after the first nul byte
106
- // since $ifdValue comes from parsed ifd,
107
- // it is already cut off
108
- $canonicalEntry = strstr($entryValue, "\0", true);
109
- // if no nul byte found, use original value
110
- if ($canonicalEntry === false) {
111
- $canonicalEntry = $entryValue;
112
- }
113
- $this->assertEquals($ifdValue, $canonicalEntry);
114
- } else {
115
- $this->assertEquals($ifdEntry
116
- ->getValue(), $entry->getValue());
117
- }
118
- }
119
-
120
- unlink('test-output.jpg');
121
- }
122
-
123
- public function writeEntryProvider()
124
- {
125
- return [
126
- 'PEL Byte Read/Write Tests' => [
127
- [
128
- new PelEntryByte(0xF001, 0),
129
- new PelEntryByte(0xF002, 1),
130
- new PelEntryByte(0xF003, 2),
131
- new PelEntryByte(0xF004, 253),
132
- new PelEntryByte(0xF005, 254),
133
- new PelEntryByte(0xF006, 255),
134
- new PelEntryByte(0xF007, 0, 1, 2, 253, 254, 255),
135
- new PelEntryByte(0xF008),
136
- ],
137
- ],
138
- 'PEL SByte Read/Write Tests' => [
139
- [
140
- new PelEntrySByte(0xF101, - 128),
141
- new PelEntrySByte(0xF102, - 127),
142
- new PelEntrySByte(0xF103, - 1),
143
- new PelEntrySByte(0xF104, 0),
144
- new PelEntrySByte(0xF105, 1),
145
- new PelEntrySByte(0xF106, 126),
146
- new PelEntrySByte(0xF107, 127),
147
- new PelEntrySByte(0xF108, - 128, - 1, 0, 1, 127),
148
- new PelEntrySByte(0xF109),
149
- ],
150
- ],
151
- 'PEL Short Read/Write Tests' => [
152
- [
153
- new PelEntryShort(0xF201, 0),
154
- new PelEntryShort(0xF202, 1),
155
- new PelEntryShort(0xF203, 2),
156
- new PelEntryShort(0xF204, 65533),
157
- new PelEntryShort(0xF205, 65534),
158
- new PelEntryShort(0xF206, 65535),
159
- new PelEntryShort(0xF208, 0, 1, 65534, 65535),
160
- new PelEntryShort(0xF209),
161
- ],
162
- ],
163
- 'PEL SShort Read/Write Tests' => [
164
- [
165
- new PelEntrySShort(0xF301, - 32768),
166
- new PelEntrySShort(0xF302, - 32767),
167
- new PelEntrySShort(0xF303, - 1),
168
- new PelEntrySShort(0xF304, 0),
169
- new PelEntrySShort(0xF305, 1),
170
- new PelEntrySShort(0xF306, 32766),
171
- new PelEntrySShort(0xF307, 32767),
172
- new PelEntrySShort(0xF308, - 32768, - 1, 0, 1, 32767),
173
- new PelEntrySShort(0xF309),
174
- ],
175
- ],
176
- 'PEL Long Read/Write Tests' => [
177
- [
178
- new PelEntryLong(0xF401, 0),
179
- new PelEntryLong(0xF402, 1),
180
- new PelEntryLong(0xF403, 2),
181
- new PelEntryLong(0xF404, 4294967293),
182
- new PelEntryLong(0xF405, 4294967294),
183
- new PelEntryLong(0xF406, 4294967295),
184
- new PelEntryLong(0xF408, 0, 1, 4294967295),
185
- new PelEntryLong(0xF409),
186
- ],
187
- ],
188
- 'PEL SLong Read/Write Tests' => [
189
- [
190
- new PelEntrySLong(0xF501, - 2147483648),
191
- new PelEntrySLong(0xF502, - 2147483647),
192
- new PelEntrySLong(0xF503, - 1),
193
- new PelEntrySLong(0xF504, 0),
194
- new PelEntrySLong(0xF505, 1),
195
- new PelEntrySLong(0xF506, 2147483646),
196
- new PelEntrySLong(0xF507, 2147483647),
197
- new PelEntrySLong(0xF508, - 2147483648, 0, 2147483647),
198
- new PelEntrySLong(0xF509),
199
- ],
200
- ],
201
- 'PEL Ascii Read/Write Tests' => [
202
- [
203
- new PelEntryAscii(0xF601),
204
- new PelEntryAscii(0xF602, ''),
205
- new PelEntryAscii(0xF603, 'Hello World!'),
206
- new PelEntryAscii(0xF604, "\x00\x01\x02...\xFD\xFE\xFF"),
207
- ],
208
- ],
209
- ];
210
- }
211
-
212
- /**
213
- * Tests loading and writing back a TIFF image file.
214
- */
215
- public function testTiffLoadSave()
216
- {
217
- $file_uri = dirname(__FILE__) . '/images/sample-1.tiff';
218
-
219
- $data = @exif_read_data($file_uri);
220
- $this->assertEquals(1, $data['Orientation']);
221
- $this->assertEquals(2, $data['PhotometricInterpretation']);
222
-
223
- $tiff = new PelTiff($file_uri);
224
- $ifd = $tiff->getIfd();
225
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd);
226
- $orientation = $ifd->getEntry(PelTag::ORIENTATION);
227
- $this->assertEquals(1, $orientation->getValue());
228
- $photometric_interpretation = $ifd->getEntry(PelTag::PHOTOMETRIC_INTERPRETATION);
229
- $this->assertEquals(2, $photometric_interpretation->getValue());
230
- $bits_per_sample = $ifd->getEntry(PelTag::BITS_PER_SAMPLE);
231
- $this->assertEquals([8, 8, 8, 8], $bits_per_sample->getValue());
232
-
233
- $orientation->setValue(4);
234
- $photometric_interpretation->setValue(4);
235
- $bits_per_sample->setValueArray([7, 6, 5, 4]);
236
-
237
- $out_uri = dirname(__FILE__) . '/images/output.sample-1.tiff';
238
- $tiff->saveFile($out_uri);
239
-
240
- $data_reload = @exif_read_data($out_uri);
241
- $this->assertEquals(4, $data_reload['Orientation']);
242
- $this->assertEquals(4, $data_reload['PhotometricInterpretation']);
243
- $this->assertEquals([7, 6, 5, 4], $data_reload['BitsPerSample']);
244
- unlink($out_uri);
245
- }
246
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/Tags1Test.php DELETED
@@ -1,67 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * PEL: PHP Exif Library. A library with support for reading and
5
- * writing all Exif headers in JPEG and TIFF images using PHP.
6
- *
7
- * Copyright (C) 2005, 2006 Martin Geisler.
8
- *
9
- * This program is free software; you can redistribute it and/or modify
10
- * it under the terms of the GNU General Public License as published by
11
- * the Free Software Foundation; either version 2 of the License, or
12
- * (at your option) any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- * GNU General Public License for more details.
18
- *
19
- * You should have received a copy of the GNU General Public License
20
- * along with this program in the file COPYING; if not, write to the
21
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
22
- * Boston, MA 02110-1301 USA
23
- */
24
-
25
- namespace Pel\Test\imagetests;
26
-
27
- use lsolesen\pel\Pel;
28
- use lsolesen\pel\PelJpeg;
29
- use PHPUnit\Framework\TestCase;
30
-
31
- class Tags1Test extends TestCase
32
- {
33
- public function testTags()
34
- {
35
- Pel::clearExceptions();
36
- Pel::setStrictParsing(true);
37
- $jpeg = new PelJpeg(dirname(__FILE__) . '/images/test-tags-1.jpg');
38
-
39
- $exif = $jpeg->getExif();
40
- $this->assertInstanceOf('\lsolesen\pel\PelExif', $exif);
41
-
42
- $tiff = $exif->getTiff();
43
- $this->assertInstanceOf('\lsolesen\pel\PelTiff', $tiff);
44
-
45
- $ifd0 = $tiff->getIfd();
46
- $this->assertInstanceOf('\lsolesen\pel\PelIfd', $ifd0);
47
-
48
- $ratingPercent = $ifd0->getEntry(\lsolesen\pel\PelTag::RATING_PERCENT);
49
- $this->assertInstanceOf('\lsolesen\pel\PelEntry', $ratingPercent);
50
- $this->assertEquals(78, $ratingPercent->getValue());
51
-
52
- $exifIfd = $ifd0->getSubIfd(\lsolesen\pel\PelIfd::EXIF);
53
- $this->assertInstanceOf('\lsolesen\pel\PelIfd', $exifIfd);
54
-
55
- $offsetTime = $exifIfd->getEntry(\lsolesen\pel\PelTag::OFFSET_TIME);
56
- $this->assertInstanceOf('\lsolesen\pel\PelEntry', $offsetTime);
57
- $this->assertEquals('-09:00', $offsetTime->getValue());
58
-
59
- $offsetTimeDigitized = $exifIfd->getEntry(\lsolesen\pel\PelTag::OFFSET_TIME_DIGITIZED);
60
- $this->assertInstanceOf('\lsolesen\pel\PelEntry', $offsetTimeDigitized);
61
- $this->assertEquals('-10:00', $offsetTimeDigitized->getValue());
62
-
63
- $offsetTimeOriginal = $exifIfd->getEntry(\lsolesen\pel\PelTag::OFFSET_TIME_ORIGINAL);
64
- $this->assertInstanceOf('\lsolesen\pel\PelEntry', $offsetTimeOriginal);
65
- $this->assertEquals('-11:00', $offsetTimeOriginal->getValue());
66
- }
67
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/broken_images/gh-10-a.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/broken_images/gh-10-b.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/broken_images/gh-11.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/broken_images/gh-156.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/broken_images/misplaced-exif.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/images/bug3017880.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/images/gh-16.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/images/gh-21.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/images/gh-77.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/images/no-exif.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/images/sample-1.tiff DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/images/test-tags-1.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/COPYING DELETED
@@ -1,340 +0,0 @@
1
- GNU GENERAL PUBLIC LICENSE
2
- Version 2, June 1991
3
-
4
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
5
- 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
6
- Everyone is permitted to copy and distribute verbatim copies
7
- of this license document, but changing it is not allowed.
8
-
9
- Preamble
10
-
11
- The licenses for most software are designed to take away your
12
- freedom to share and change it. By contrast, the GNU General Public
13
- License is intended to guarantee your freedom to share and change free
14
- software--to make sure the software is free for all its users. This
15
- General Public License applies to most of the Free Software
16
- Foundation's software and to any other program whose authors commit to
17
- using it. (Some other Free Software Foundation software is covered by
18
- the GNU Library General Public License instead.) You can apply it to
19
- your programs, too.
20
-
21
- When we speak of free software, we are referring to freedom, not
22
- price. Our General Public Licenses are designed to make sure that you
23
- have the freedom to distribute copies of free software (and charge for
24
- this service if you wish), that you receive source code or can get it
25
- if you want it, that you can change the software or use pieces of it
26
- in new free programs; and that you know you can do these things.
27
-
28
- To protect your rights, we need to make restrictions that forbid
29
- anyone to deny you these rights or to ask you to surrender the rights.
30
- These restrictions translate to certain responsibilities for you if you
31
- distribute copies of the software, or if you modify it.
32
-
33
- For example, if you distribute copies of such a program, whether
34
- gratis or for a fee, you must give the recipients all the rights that
35
- you have. You must make sure that they, too, receive or can get the
36
- source code. And you must show them these terms so they know their
37
- rights.
38
-
39
- We protect your rights with two steps: (1) copyright the software, and
40
- (2) offer you this license which gives you legal permission to copy,
41
- distribute and/or modify the software.
42
-
43
- Also, for each author's protection and ours, we want to make certain
44
- that everyone understands that there is no warranty for this free
45
- software. If the software is modified by someone else and passed on, we
46
- want its recipients to know that what they have is not the original, so
47
- that any problems introduced by others will not reflect on the original
48
- authors' reputations.
49
-
50
- Finally, any free program is threatened constantly by software
51
- patents. We wish to avoid the danger that redistributors of a free
52
- program will individually obtain patent licenses, in effect making the
53
- program proprietary. To prevent this, we have made it clear that any
54
- patent must be licensed for everyone's free use or not licensed at all.
55
-
56
- The precise terms and conditions for copying, distribution and
57
- modification follow.
58
-
59
- GNU GENERAL PUBLIC LICENSE
60
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61
-
62
- 0. This License applies to any program or other work which contains
63
- a notice placed by the copyright holder saying it may be distributed
64
- under the terms of this General Public License. The "Program", below,
65
- refers to any such program or work, and a "work based on the Program"
66
- means either the Program or any derivative work under copyright law:
67
- that is to say, a work containing the Program or a portion of it,
68
- either verbatim or with modifications and/or translated into another
69
- language. (Hereinafter, translation is included without limitation in
70
- the term "modification".) Each licensee is addressed as "you".
71
-
72
- Activities other than copying, distribution and modification are not
73
- covered by this License; they are outside its scope. The act of
74
- running the Program is not restricted, and the output from the Program
75
- is covered only if its contents constitute a work based on the
76
- Program (independent of having been made by running the Program).
77
- Whether that is true depends on what the Program does.
78
-
79
- 1. You may copy and distribute verbatim copies of the Program's
80
- source code as you receive it, in any medium, provided that you
81
- conspicuously and appropriately publish on each copy an appropriate
82
- copyright notice and disclaimer of warranty; keep intact all the
83
- notices that refer to this License and to the absence of any warranty;
84
- and give any other recipients of the Program a copy of this License
85
- along with the Program.
86
-
87
- You may charge a fee for the physical act of transferring a copy, and
88
- you may at your option offer warranty protection in exchange for a fee.
89
-
90
- 2. You may modify your copy or copies of the Program or any portion
91
- of it, thus forming a work based on the Program, and copy and
92
- distribute such modifications or work under the terms of Section 1
93
- above, provided that you also meet all of these conditions:
94
-
95
- a) You must cause the modified files to carry prominent notices
96
- stating that you changed the files and the date of any change.
97
-
98
- b) You must cause any work that you distribute or publish, that in
99
- whole or in part contains or is derived from the Program or any
100
- part thereof, to be licensed as a whole at no charge to all third
101
- parties under the terms of this License.
102
-
103
- c) If the modified program normally reads commands interactively
104
- when run, you must cause it, when started running for such
105
- interactive use in the most ordinary way, to print or display an
106
- announcement including an appropriate copyright notice and a
107
- notice that there is no warranty (or else, saying that you provide
108
- a warranty) and that users may redistribute the program under
109
- these conditions, and telling the user how to view a copy of this
110
- License. (Exception: if the Program itself is interactive but
111
- does not normally print such an announcement, your work based on
112
- the Program is not required to print an announcement.)
113
-
114
- These requirements apply to the modified work as a whole. If
115
- identifiable sections of that work are not derived from the Program,
116
- and can be reasonably considered independent and separate works in
117
- themselves, then this License, and its terms, do not apply to those
118
- sections when you distribute them as separate works. But when you
119
- distribute the same sections as part of a whole which is a work based
120
- on the Program, the distribution of the whole must be on the terms of
121
- this License, whose permissions for other licensees extend to the
122
- entire whole, and thus to each and every part regardless of who wrote it.
123
-
124
- Thus, it is not the intent of this section to claim rights or contest
125
- your rights to work written entirely by you; rather, the intent is to
126
- exercise the right to control the distribution of derivative or
127
- collective works based on the Program.
128
-
129
- In addition, mere aggregation of another work not based on the Program
130
- with the Program (or with a work based on the Program) on a volume of
131
- a storage or distribution medium does not bring the other work under
132
- the scope of this License.
133
-
134
- 3. You may copy and distribute the Program (or a work based on it,
135
- under Section 2) in object code or executable form under the terms of
136
- Sections 1 and 2 above provided that you also do one of the following:
137
-
138
- a) Accompany it with the complete corresponding machine-readable
139
- source code, which must be distributed under the terms of Sections
140
- 1 and 2 above on a medium customarily used for software interchange; or,
141
-
142
- b) Accompany it with a written offer, valid for at least three
143
- years, to give any third party, for a charge no more than your
144
- cost of physically performing source distribution, a complete
145
- machine-readable copy of the corresponding source code, to be
146
- distributed under the terms of Sections 1 and 2 above on a medium
147
- customarily used for software interchange; or,
148
-
149
- c) Accompany it with the information you received as to the offer
150
- to distribute corresponding source code. (This alternative is
151
- allowed only for noncommercial distribution and only if you
152
- received the program in object code or executable form with such
153
- an offer, in accord with Subsection b above.)
154
-
155
- The source code for a work means the preferred form of the work for
156
- making modifications to it. For an executable work, complete source
157
- code means all the source code for all modules it contains, plus any
158
- associated interface definition files, plus the scripts used to
159
- control compilation and installation of the executable. However, as a
160
- special exception, the source code distributed need not include
161
- anything that is normally distributed (in either source or binary
162
- form) with the major components (compiler, kernel, and so on) of the
163
- operating system on which the executable runs, unless that component
164
- itself accompanies the executable.
165
-
166
- If distribution of executable or object code is made by offering
167
- access to copy from a designated place, then offering equivalent
168
- access to copy the source code from the same place counts as
169
- distribution of the source code, even though third parties are not
170
- compelled to copy the source along with the object code.
171
-
172
- 4. You may not copy, modify, sublicense, or distribute the Program
173
- except as expressly provided under this License. Any attempt
174
- otherwise to copy, modify, sublicense or distribute the Program is
175
- void, and will automatically terminate your rights under this License.
176
- However, parties who have received copies, or rights, from you under
177
- this License will not have their licenses terminated so long as such
178
- parties remain in full compliance.
179
-
180
- 5. You are not required to accept this License, since you have not
181
- signed it. However, nothing else grants you permission to modify or
182
- distribute the Program or its derivative works. These actions are
183
- prohibited by law if you do not accept this License. Therefore, by
184
- modifying or distributing the Program (or any work based on the
185
- Program), you indicate your acceptance of this License to do so, and
186
- all its terms and conditions for copying, distributing or modifying
187
- the Program or works based on it.
188
-
189
- 6. Each time you redistribute the Program (or any work based on the
190
- Program), the recipient automatically receives a license from the
191
- original licensor to copy, distribute or modify the Program subject to
192
- these terms and conditions. You may not impose any further
193
- restrictions on the recipients' exercise of the rights granted herein.
194
- You are not responsible for enforcing compliance by third parties to
195
- this License.
196
-
197
- 7. If, as a consequence of a court judgment or allegation of patent
198
- infringement or for any other reason (not limited to patent issues),
199
- conditions are imposed on you (whether by court order, agreement or
200
- otherwise) that contradict the conditions of this License, they do not
201
- excuse you from the conditions of this License. If you cannot
202
- distribute so as to satisfy simultaneously your obligations under this
203
- License and any other pertinent obligations, then as a consequence you
204
- may not distribute the Program at all. For example, if a patent
205
- license would not permit royalty-free redistribution of the Program by
206
- all those who receive copies directly or indirectly through you, then
207
- the only way you could satisfy both it and this License would be to
208
- refrain entirely from distribution of the Program.
209
-
210
- If any portion of this section is held invalid or unenforceable under
211
- any particular circumstance, the balance of the section is intended to
212
- apply and the section as a whole is intended to apply in other
213
- circumstances.
214
-
215
- It is not the purpose of this section to induce you to infringe any
216
- patents or other property right claims or to contest validity of any
217
- such claims; this section has the sole purpose of protecting the
218
- integrity of the free software distribution system, which is
219
- implemented by public license practices. Many people have made
220
- generous contributions to the wide range of software distributed
221
- through that system in reliance on consistent application of that
222
- system; it is up to the author/donor to decide if he or she is willing
223
- to distribute software through any other system and a licensee cannot
224
- impose that choice.
225
-
226
- This section is intended to make thoroughly clear what is believed to
227
- be a consequence of the rest of this License.
228
-
229
- 8. If the distribution and/or use of the Program is restricted in
230
- certain countries either by patents or by copyrighted interfaces, the
231
- original copyright holder who places the Program under this License
232
- may add an explicit geographical distribution limitation excluding
233
- those countries, so that distribution is permitted only in or among
234
- countries not thus excluded. In such case, this License incorporates
235
- the limitation as if written in the body of this License.
236
-
237
- 9. The Free Software Foundation may publish revised and/or new versions
238
- of the General Public License from time to time. Such new versions will
239
- be similar in spirit to the present version, but may differ in detail to
240
- address new problems or concerns.
241
-
242
- Each version is given a distinguishing version number. If the Program
243
- specifies a version number of this License which applies to it and "any
244
- later version", you have the option of following the terms and conditions
245
- either of that version or of any later version published by the Free
246
- Software Foundation. If the Program does not specify a version number of
247
- this License, you may choose any version ever published by the Free Software
248
- Foundation.
249
-
250
- 10. If you wish to incorporate parts of the Program into other free
251
- programs whose distribution conditions are different, write to the author
252
- to ask for permission. For software which is copyrighted by the Free
253
- Software Foundation, write to the Free Software Foundation; we sometimes
254
- make exceptions for this. Our decision will be guided by the two goals
255
- of preserving the free status of all derivatives of our free software and
256
- of promoting the sharing and reuse of software generally.
257
-
258
- NO WARRANTY
259
-
260
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261
- FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262
- OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263
- PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264
- OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265
- MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266
- TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267
- PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268
- REPAIR OR CORRECTION.
269
-
270
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271
- WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272
- REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273
- INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274
- OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275
- TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276
- YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277
- PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278
- POSSIBILITY OF SUCH DAMAGES.
279
-
280
- END OF TERMS AND CONDITIONS
281
-
282
- How to Apply These Terms to Your New Programs
283
-
284
- If you develop a new program, and you want it to be of the greatest
285
- possible use to the public, the best way to achieve this is to make it
286
- free software which everyone can redistribute and change under these terms.
287
-
288
- To do so, attach the following notices to the program. It is safest
289
- to attach them to the start of each source file to most effectively
290
- convey the exclusion of warranty; and each file should have at least
291
- the "copyright" line and a pointer to where the full notice is found.
292
-
293
- <one line to give the program's name and a brief idea of what it does.>
294
- Copyright (C) <year> <name of author>
295
-
296
- This program is free software; you can redistribute it and/or modify
297
- it under the terms of the GNU General Public License as published by
298
- the Free Software Foundation; either version 2 of the License, or
299
- (at your option) any later version.
300
-
301
- This program is distributed in the hope that it will be useful,
302
- but WITHOUT ANY WARRANTY; without even the implied warranty of
303
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304
- GNU General Public License for more details.
305
-
306
- You should have received a copy of the GNU General Public License
307
- along with this program; if not, write to the Free Software
308
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
309
-
310
-
311
- Also add information on how to contact you by electronic and paper mail.
312
-
313
- If the program is interactive, make it output a short notice like this
314
- when it starts in an interactive mode:
315
-
316
- Gnomovision version 69, Copyright (C) year name of author
317
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
318
- This is free software, and you are welcome to redistribute it
319
- under certain conditions; type `show c' for details.
320
-
321
- The hypothetical commands `show w' and `show c' should show the appropriate
322
- parts of the General Public License. Of course, the commands you use may
323
- be called something other than `show w' and `show c'; they could even be
324
- mouse-clicks or menu items--whatever suits your program.
325
-
326
- You should also get your employer (if you work as a programmer) or your
327
- school, if any, to sign a "copyright disclaimer" for the program, if
328
- necessary. Here is a sample; alter the names:
329
-
330
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
331
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
332
-
333
- <signature of Ty Coon>, 1 April 1989
334
- Ty Coon, President of Vice
335
-
336
- This General Public License does not permit incorporating your program into
337
- proprietary programs. If your program is a subroutine library, you may
338
- consider it more useful to permit linking proprietary applications with the
339
- library. If this is what you want to do, use the GNU Library General
340
- Public License instead of this License.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/CanonEos650dTest.php DELETED
@@ -1,335 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * PEL: PHP Exif Library. A library with support for reading and
5
- * writing all Exif headers in JPEG and TIFF images using PHP.
6
- *
7
- * Copyright (C) 2005, 2006 Martin Geisler.
8
- *
9
- * This program is free software; you can redistribute it and/or modify
10
- * it under the terms of the GNU General Public License as published by
11
- * the Free Software Foundation; either version 2 of the License, or
12
- * (at your option) any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- * GNU General Public License for more details.
18
- *
19
- * You should have received a copy of the GNU General Public License
20
- * along with this program in the file COPYING; if not, write to the
21
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
22
- * Boston, MA 02110-1301 USA
23
- */
24
-
25
- namespace Pel\Test\imagetests;
26
-
27
- use \lsolesen\pel\Pel;
28
- use \lsolesen\pel\PelJpeg;
29
- use PHPUnit\Framework\TestCase;
30
-
31
- class CanonEos650dTest extends TestCase
32
- {
33
- public function testRead()
34
- {
35
- Pel::clearExceptions();
36
- Pel::setStrictParsing(false);
37
- $jpeg = new PelJpeg(dirname(__FILE__) . '/canon-eos-650d.jpg');
38
-
39
- $exif = $jpeg->getExif();
40
- $this->assertInstanceOf('lsolesen\pel\PelExif', $exif);
41
-
42
- $tiff = $exif->getTiff();
43
- $this->assertInstanceOf('lsolesen\pel\PelTiff', $tiff);
44
-
45
- /* The first IFD. */
46
- $ifd0 = $tiff->getIfd();
47
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0);
48
-
49
- /* Start of IDF $ifd0. */
50
- $this->assertEquals(count($ifd0->getEntries()), 9);
51
-
52
- $entry = $ifd0->getEntry(271); // Make
53
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
54
- $this->assertEquals($entry->getValue(), 'Canon');
55
- $this->assertEquals($entry->getText(), 'Canon');
56
-
57
- $entry = $ifd0->getEntry(272); // Model
58
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
59
- $this->assertEquals($entry->getValue(), 'Canon EOS 650D');
60
- $this->assertEquals($entry->getText(), 'Canon EOS 650D');
61
-
62
- $entry = $ifd0->getEntry(274); // Orientation
63
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
64
- $this->assertEquals($entry->getValue(), 1);
65
- $this->assertEquals($entry->getText(), 'top - left');
66
-
67
- $entry = $ifd0->getEntry(282); // XResolution
68
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
69
- $this->assertEquals($entry->getValue(), [
70
- 0 => 72,
71
- 1 => 1
72
- ]);
73
- $this->assertEquals($entry->getText(), '72/1');
74
-
75
- $entry = $ifd0->getEntry(283); // YResolution
76
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
77
- $this->assertEquals($entry->getValue(), [
78
- 0 => 72,
79
- 1 => 1
80
- ]);
81
- $this->assertEquals($entry->getText(), '72/1');
82
-
83
- $entry = $ifd0->getEntry(296); // ResolutionUnit
84
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
85
- $this->assertEquals($entry->getValue(), 2);
86
- $this->assertEquals($entry->getText(), 'Inch');
87
-
88
- $entry = $ifd0->getEntry(306); // DateTime
89
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
90
- $this->assertEquals($entry->getValue(), 1509974253);
91
- $this->assertEquals($entry->getText(), '2017:11:06 13:17:33');
92
-
93
- /* Sub IFDs of $ifd0. */
94
- $this->assertEquals(count($ifd0->getSubIfds()), 2);
95
- $ifd0_0 = $ifd0->getSubIfd(2); // IFD Exif
96
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_0);
97
-
98
- /* Start of IDF $ifd0_0. */
99
- $this->assertEquals(count($ifd0_0->getEntries()), 29);
100
-
101
- $entry = $ifd0_0->getEntry(33434); // ExposureTime
102
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
103
- $this->assertEquals($entry->getValue(), [
104
- 0 => 1,
105
- 1 => 800
106
- ]);
107
- $this->assertEquals($entry->getText(), '1/800 sec.');
108
-
109
- $entry = $ifd0_0->getEntry(33437); // FNumber
110
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
111
- $this->assertEquals($entry->getValue(), [
112
- 0 => 63,
113
- 1 => 10
114
- ]);
115
- $this->assertEquals($entry->getText(), 'f/6.3');
116
-
117
- $entry = $ifd0_0->getEntry(36864); // ExifVersion
118
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
119
- $this->assertEquals($entry->getValue(), 2.3);
120
- $this->assertEquals($entry->getText(), 'Exif Version 2.3');
121
-
122
- $entry = $ifd0_0->getEntry(36867); // DateTimeOriginal
123
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
124
- $this->assertEquals($entry->getValue(), 1497623444);
125
- $this->assertEquals($entry->getText(), '2017:06:16 14:30:44');
126
-
127
- $entry = $ifd0_0->getEntry(36868); // DateTimeDigitized
128
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
129
- $this->assertEquals($entry->getValue(), 1497623444);
130
- $this->assertEquals($entry->getText(), '2017:06:16 14:30:44');
131
-
132
- $entry = $ifd0_0->getEntry(37121); // ComponentsConfiguration
133
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
134
- $this->assertEquals($entry->getValue(), "\x01\x02\x03\0");
135
- $this->assertEquals($entry->getText(), 'Y Cb Cr -');
136
-
137
- $entry = $ifd0_0->getEntry(37378); // ApertureValue
138
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
139
- $this->assertEquals($entry->getValue(), [
140
- 0 => 352256,
141
- 1 => 65536
142
- ]);
143
- $this->assertEquals($entry->getText(), 'f/6.4');
144
-
145
- $entry = $ifd0_0->getEntry(37380); // ExposureBiasValue
146
- $this->assertInstanceOf('lsolesen\pel\PelEntrySRational', $entry);
147
- $this->assertEquals($entry->getValue(), [
148
- 0 => 0,
149
- 1 => 1
150
- ]);
151
- $this->assertEquals($entry->getText(), '0.0');
152
-
153
- $entry = $ifd0_0->getEntry(37383); // MeteringMode
154
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
155
- $this->assertEquals($entry->getValue(), 5);
156
- $this->assertEquals($entry->getText(), 'Pattern');
157
-
158
- $entry = $ifd0_0->getEntry(37385); // Flash
159
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
160
- $this->assertEquals($entry->getValue(), 16);
161
- $this->assertEquals($entry->getText(), 'Flash did not fire, compulsory flash mode.');
162
-
163
- $entry = $ifd0_0->getEntry(37386); // FocalLength
164
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
165
- $this->assertEquals($entry->getValue(), [
166
- 0 => 600,
167
- 1 => 1
168
- ]);
169
- $this->assertEquals($entry->getText(), '600.0 mm');
170
-
171
- $entry = $ifd0_0->getEntry(37500); // MakerNote
172
- $this->assertNull($entry);
173
-
174
- $entry = $ifd0_0->getEntry(37510); // UserComment
175
- $this->assertInstanceOf('lsolesen\pel\PelEntryUserComment', $entry);
176
-
177
- $expected = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
178
- $this->assertEquals($entry->getValue(), $expected);
179
-
180
- $expected = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
181
- $this->assertEquals($entry->getText(), $expected);
182
-
183
- $entry = $ifd0_0->getEntry(40960); // FlashPixVersion
184
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
185
- $this->assertEquals($entry->getValue(), 1);
186
- $this->assertEquals($entry->getText(), 'FlashPix Version 1.0');
187
-
188
- $entry = $ifd0_0->getEntry(40961); // ColorSpace
189
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
190
- $this->assertEquals($entry->getValue(), 1);
191
- $this->assertEquals($entry->getText(), 'sRGB');
192
-
193
- $entry = $ifd0_0->getEntry(41488); // FocalPlaneResolutionUnit
194
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
195
- $this->assertEquals($entry->getValue(), 2);
196
- $this->assertEquals($entry->getText(), 'Inch');
197
-
198
- $entry = $ifd0_0->getEntry(41985); // CustomRendered
199
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
200
- $this->assertEquals($entry->getValue(), 0);
201
- $this->assertEquals($entry->getText(), 'Normal process');
202
-
203
- $entry = $ifd0_0->getEntry(41986); // ExposureMode
204
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
205
- $this->assertEquals($entry->getValue(), 0);
206
- $this->assertEquals($entry->getText(), 'Auto exposure');
207
-
208
- $entry = $ifd0_0->getEntry(41987); // WhiteBalance
209
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
210
- $this->assertEquals($entry->getValue(), 0);
211
- $this->assertEquals($entry->getText(), 'Auto white balance');
212
-
213
- $entry = $ifd0_0->getEntry(41990); // SceneCaptureType
214
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
215
- $this->assertEquals($entry->getValue(), 0);
216
- $this->assertEquals($entry->getText(), 'Standard');
217
-
218
- /* Sub IFDs of $ifd0_0. */
219
- $this->assertEquals(count($ifd0_0->getSubIfds()), 2);
220
- $ifd0_0_0 = $ifd0_0->getSubIfd(4); // IFD Interoperability
221
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_0_0);
222
-
223
- /* Start of IDF $ifd0_0_0. */
224
- $this->assertEquals(count($ifd0_0_0->getEntries()), 2);
225
-
226
- $entry = $ifd0_0_0->getEntry(1); // InteroperabilityIndex
227
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
228
- $this->assertEquals($entry->getValue(), 'R98');
229
- $this->assertEquals($entry->getText(), 'R98');
230
-
231
- $entry = $ifd0_0_0->getEntry(2); // InteroperabilityVersion
232
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
233
- $this->assertEquals($entry->getValue(), 1);
234
- $this->assertEquals($entry->getText(), 'Interoperability Version 1.0');
235
-
236
- /* Sub IFDs of $ifd0_0_0. */
237
- $this->assertEquals(count($ifd0_0_0->getSubIfds()), 0);
238
-
239
- $this->assertEquals($ifd0_0_0->getThumbnailData(), '');
240
-
241
- /* Next IFD. */
242
- $ifd0_0_1 = $ifd0_0_0->getNextIfd();
243
- $this->assertNull($ifd0_0_1);
244
- /* End of IFD $ifd0_0_0. */
245
-
246
- $this->assertEquals($ifd0_0->getThumbnailData(), '');
247
-
248
- /* Next IFD. */
249
- $ifd0_1 = $ifd0_0->getNextIfd();
250
- $this->assertNull($ifd0_1);
251
- /* End of IFD $ifd0_0. */
252
-
253
- $this->assertEquals($ifd0->getThumbnailData(), '');
254
-
255
- /* Next IFD. */
256
- $ifd1 = $ifd0->getNextIfd();
257
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd1);
258
- /* End of IFD $ifd0. */
259
-
260
- /* Start of IDF $ifd1. */
261
- $this->assertEquals(count($ifd1->getEntries()), 4);
262
-
263
- $entry = $ifd1->getEntry(259); // Compression
264
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
265
- $this->assertEquals($entry->getValue(), 0);
266
- $this->assertEquals($entry->getText(), '0');
267
-
268
- $entry = $ifd1->getEntry(282); // XResolution
269
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
270
- $this->assertEquals($entry->getValue(), [
271
- 0 => 72,
272
- 1 => 1
273
- ]);
274
- $this->assertEquals($entry->getText(), '72/1');
275
-
276
- $entry = $ifd1->getEntry(283); // YResolution
277
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
278
- $this->assertEquals($entry->getValue(), [
279
- 0 => 72,
280
- 1 => 1
281
- ]);
282
- $this->assertEquals($entry->getText(), '72/1');
283
-
284
- $entry = $ifd1->getEntry(296); // ResolutionUnit
285
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
286
- $this->assertEquals($entry->getValue(), 2);
287
- $this->assertEquals($entry->getText(), 'Inch');
288
-
289
- /* Sub IFDs of $ifd1. */
290
- $this->assertEquals(count($ifd1->getSubIfds()), 0);
291
-
292
- $thumb_data = file_get_contents(dirname(__FILE__) . '/canon-eos-650d-thumb.jpg');
293
- $this->assertEquals($ifd1->getThumbnailData(), $thumb_data);
294
-
295
- /* Next IFD. */
296
- $ifd2 = $ifd1->getNextIfd();
297
- $this->assertNull($ifd2);
298
- /* End of IFD $ifd1. */
299
-
300
- /* Start of IDF $ifd0_mn */
301
- $ifd0_mn = $ifd0_0->getSubIfd(5); // IFD MakerNotes
302
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_mn);
303
-
304
- $entry = $ifd0_mn->getEntry(6); // ImageType
305
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
306
- $this->assertEquals($entry->getValue(), 'Canon EOS 650D');
307
-
308
- $entry = $ifd0_mn->getEntry(7); // FirmwareVersion
309
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
310
- $this->assertEquals($entry->getValue(), 'Firmware Version 1.0.4');
311
-
312
- /* Start of IDF $ifd0_mn_cs. */
313
- $ifd0_mn_cs = $ifd0_mn->getSubIfd(6); // CameraSettings
314
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_mn_cs);
315
- $this->assertEquals(count($ifd0_mn_cs->getEntries()), 37);
316
-
317
- $entry = $ifd0_mn_cs->getEntry(1); // MacroMode
318
- $this->assertInstanceOf('lsolesen\pel\PelEntrySShort', $entry);
319
- $this->assertEquals($entry->getValue(), '2');
320
- $this->assertEquals($entry->getText(), 'Normal');
321
-
322
- $entry = $ifd0_mn_cs->getEntry(9); // RecordMode
323
- $this->assertInstanceOf('lsolesen\pel\PelEntrySShort', $entry);
324
- $this->assertEquals($entry->getValue(), '6');
325
- $this->assertEquals($entry->getText(), 'CR2');
326
-
327
- $entry = $ifd0_mn_cs->getEntry(22); // LensModel
328
- $this->assertInstanceOf('lsolesen\pel\PelEntrySShort', $entry);
329
- $this->assertEquals($entry->getValue(), 747);
330
- // Tamron 150-600mm G2
331
- $this->assertEquals($entry->getText(), 'Canon EF 100-400mm f/4.5-5.6L IS II USM or Tamron Lens');
332
-
333
- $this->assertTrue(count(Pel::getExceptions()) == 0);
334
- }
335
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/CanonIxusIITest.php DELETED
@@ -1,416 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * PEL: PHP Exif Library. A library with support for reading and
5
- * writing all Exif headers in JPEG and TIFF images using PHP.
6
- *
7
- * Copyright (C) 2005, 2006 Martin Geisler.
8
- *
9
- * This program is free software; you can redistribute it and/or modify
10
- * it under the terms of the GNU General Public License as published by
11
- * the Free Software Foundation; either version 2 of the License, or
12
- * (at your option) any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- * GNU General Public License for more details.
18
- *
19
- * You should have received a copy of the GNU General Public License
20
- * along with this program in the file COPYING; if not, write to the
21
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
22
- * Boston, MA 02110-1301 USA
23
- */
24
-
25
- namespace Pel\Test\imagetests;
26
-
27
- use \lsolesen\pel\Pel;
28
- use \lsolesen\pel\PelJpeg;
29
- use PHPUnit\Framework\TestCase;
30
-
31
- class CanonIxusIITest extends TestCase
32
- {
33
- public function testRead()
34
- {
35
- Pel::clearExceptions();
36
- Pel::setStrictParsing(false);
37
- $jpeg = new PelJpeg(dirname(__FILE__) . '/canon-ixus-ii.jpg');
38
-
39
- $exif = $jpeg->getExif();
40
- $this->assertInstanceOf('lsolesen\pel\PelExif', $exif);
41
-
42
- $tiff = $exif->getTiff();
43
- $this->assertInstanceOf('lsolesen\pel\PelTiff', $tiff);
44
-
45
- /* The first IFD. */
46
- $ifd0 = $tiff->getIfd();
47
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0);
48
-
49
- /* Start of IDF $ifd0. */
50
- $this->assertEquals(count($ifd0->getEntries()), 8);
51
-
52
- $entry = $ifd0->getEntry(271); // Make
53
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
54
- $this->assertEquals($entry->getValue(), 'Canon');
55
- $this->assertEquals($entry->getText(), 'Canon');
56
-
57
- $entry = $ifd0->getEntry(272); // Model
58
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
59
- $this->assertEquals($entry->getValue(), 'Canon DIGITAL IXUS II');
60
- $this->assertEquals($entry->getText(), 'Canon DIGITAL IXUS II');
61
-
62
- $entry = $ifd0->getEntry(274); // Orientation
63
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
64
- $this->assertEquals($entry->getValue(), 6);
65
- $this->assertEquals($entry->getText(), 'right - top');
66
-
67
- $entry = $ifd0->getEntry(282); // XResolution
68
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
69
- $this->assertEquals($entry->getValue(), [
70
- 0 => 180,
71
- 1 => 1
72
- ]);
73
- $this->assertEquals($entry->getText(), '180/1');
74
-
75
- $entry = $ifd0->getEntry(283); // YResolution
76
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
77
- $this->assertEquals($entry->getValue(), [
78
- 0 => 180,
79
- 1 => 1
80
- ]);
81
- $this->assertEquals($entry->getText(), '180/1');
82
-
83
- $entry = $ifd0->getEntry(296); // ResolutionUnit
84
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
85
- $this->assertEquals($entry->getValue(), 2);
86
- $this->assertEquals($entry->getText(), 'Inch');
87
-
88
- $entry = $ifd0->getEntry(306); // DateTime
89
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
90
- $this->assertEquals($entry->getValue(), 1089488628);
91
- $this->assertEquals($entry->getText(), '2004:07:10 19:43:48');
92
-
93
- $entry = $ifd0->getEntry(531); // YCbCrPositioning
94
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
95
- $this->assertEquals($entry->getValue(), 1);
96
- $this->assertEquals($entry->getText(), 'centered');
97
-
98
- /* Sub IFDs of $ifd0. */
99
- $this->assertEquals(count($ifd0->getSubIfds()), 1);
100
- $ifd0_0 = $ifd0->getSubIfd(2); // IFD Exif
101
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_0);
102
-
103
- /* Start of IDF $ifd0_0. */
104
- $this->assertEquals(count($ifd0_0->getEntries()), 29);
105
-
106
- $entry = $ifd0_0->getEntry(33434); // ExposureTime
107
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
108
- $this->assertEquals($entry->getValue(), [
109
- 0 => 1,
110
- 1 => 30
111
- ]);
112
- $this->assertEquals($entry->getText(), '1/30 sec.');
113
-
114
- $entry = $ifd0_0->getEntry(33437); // FNumber
115
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
116
- $this->assertEquals($entry->getValue(), [
117
- 0 => 32,
118
- 1 => 10
119
- ]);
120
- $this->assertEquals($entry->getText(), 'f/3.2');
121
-
122
- $entry = $ifd0_0->getEntry(36864); // ExifVersion
123
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
124
- $this->assertEquals($entry->getValue(), 2.2);
125
- $this->assertEquals($entry->getText(), 'Exif Version 2.2');
126
-
127
- $entry = $ifd0_0->getEntry(36867); // DateTimeOriginal
128
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
129
- $this->assertEquals($entry->getValue(), 1089488628);
130
- $this->assertEquals($entry->getText(), '2004:07:10 19:43:48');
131
-
132
- $entry = $ifd0_0->getEntry(36868); // DateTimeDigitized
133
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
134
- $this->assertEquals($entry->getValue(), 1089488628);
135
- $this->assertEquals($entry->getText(), '2004:07:10 19:43:48');
136
-
137
- $entry = $ifd0_0->getEntry(37121); // ComponentsConfiguration
138
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
139
- $this->assertEquals($entry->getValue(), "\x01\x02\x03\0");
140
- $this->assertEquals($entry->getText(), 'Y Cb Cr -');
141
-
142
- $entry = $ifd0_0->getEntry(37122); // CompressedBitsPerPixel
143
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
144
- $this->assertEquals($entry->getValue(), [
145
- 0 => 2,
146
- 1 => 1
147
- ]);
148
- $this->assertEquals($entry->getText(), '2/1');
149
-
150
- $entry = $ifd0_0->getEntry(37377); // ShutterSpeedValue
151
- $this->assertInstanceOf('lsolesen\pel\PelEntrySRational', $entry);
152
- $this->assertEquals($entry->getValue(), [
153
- 0 => 157,
154
- 1 => 32
155
- ]);
156
- $this->assertEquals($entry->getText(), '157/32 sec. (APEX: 5)');
157
-
158
- $entry = $ifd0_0->getEntry(37378); // ApertureValue
159
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
160
- $this->assertEquals($entry->getValue(), [
161
- 0 => 107,
162
- 1 => 32
163
- ]);
164
- $this->assertEquals($entry->getText(), 'f/3.2');
165
-
166
- $entry = $ifd0_0->getEntry(37380); // ExposureBiasValue
167
- $this->assertInstanceOf('lsolesen\pel\PelEntrySRational', $entry);
168
- $this->assertEquals($entry->getValue(), [
169
- 0 => - 1,
170
- 1 => 3
171
- ]);
172
- $this->assertEquals($entry->getText(), '-0.3');
173
-
174
- $entry = $ifd0_0->getEntry(37381); // MaxApertureValue
175
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
176
- $this->assertEquals($entry->getValue(), [
177
- 0 => 107,
178
- 1 => 32
179
- ]);
180
- $this->assertEquals($entry->getText(), '107/32');
181
-
182
- $entry = $ifd0_0->getEntry(37383); // MeteringMode
183
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
184
- $this->assertEquals($entry->getValue(), 5);
185
- $this->assertEquals($entry->getText(), 'Pattern');
186
-
187
- $entry = $ifd0_0->getEntry(37385); // Flash
188
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
189
- $this->assertEquals($entry->getValue(), 16);
190
- $this->assertEquals($entry->getText(), 'Flash did not fire, compulsory flash mode.');
191
-
192
- $entry = $ifd0_0->getEntry(37386); // FocalLength
193
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
194
- $this->assertEquals($entry->getValue(), [
195
- 0 => 215,
196
- 1 => 32
197
- ]);
198
- $this->assertEquals($entry->getText(), '6.7 mm');
199
-
200
- $entry = $ifd0_0->getEntry(37500); // MakerNote
201
- $this->assertNull($entry);
202
-
203
- $entry = $ifd0_0->getEntry(37510); // UserComment
204
- $this->assertInstanceOf('lsolesen\pel\PelEntryUserComment', $entry);
205
-
206
- $expected = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
207
- $this->assertEquals($entry->getValue(), $expected);
208
-
209
- $expected = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
210
- $this->assertEquals($entry->getText(), $expected);
211
-
212
- $entry = $ifd0_0->getEntry(40960); // FlashPixVersion
213
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
214
- $this->assertEquals($entry->getValue(), 1);
215
- $this->assertEquals($entry->getText(), 'FlashPix Version 1.0');
216
-
217
- $entry = $ifd0_0->getEntry(40961); // ColorSpace
218
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
219
- $this->assertEquals($entry->getValue(), 1);
220
- $this->assertEquals($entry->getText(), 'sRGB');
221
-
222
- $entry = $ifd0_0->getEntry(40962); // PixelXDimension
223
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
224
- $this->assertEquals($entry->getValue(), 640);
225
- $this->assertEquals($entry->getText(), '640');
226
-
227
- $entry = $ifd0_0->getEntry(40963); // PixelYDimension
228
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
229
- $this->assertEquals($entry->getValue(), 480);
230
- $this->assertEquals($entry->getText(), '480');
231
-
232
- $entry = $ifd0_0->getEntry(41486); // FocalPlaneXResolution
233
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
234
- $this->assertEquals($entry->getValue(), [
235
- 0 => 640000,
236
- 1 => 208
237
- ]);
238
- $this->assertEquals($entry->getText(), '640000/208');
239
-
240
- $entry = $ifd0_0->getEntry(41487); // FocalPlaneYResolution
241
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
242
- $this->assertEquals($entry->getValue(), [
243
- 0 => 480000,
244
- 1 => 156
245
- ]);
246
- $this->assertEquals($entry->getText(), '480000/156');
247
-
248
- $entry = $ifd0_0->getEntry(41488); // FocalPlaneResolutionUnit
249
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
250
- $this->assertEquals($entry->getValue(), 2);
251
- $this->assertEquals($entry->getText(), 'Inch');
252
-
253
- $entry = $ifd0_0->getEntry(41495); // SensingMethod
254
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
255
- $this->assertEquals($entry->getValue(), 2);
256
- $this->assertEquals($entry->getText(), 'One-chip color area sensor');
257
-
258
- $entry = $ifd0_0->getEntry(41728); // FileSource
259
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
260
- $this->assertEquals($entry->getValue(), "\x03");
261
- $this->assertEquals($entry->getText(), 'DSC');
262
-
263
- $entry = $ifd0_0->getEntry(41985); // CustomRendered
264
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
265
- $this->assertEquals($entry->getValue(), 0);
266
- $this->assertEquals($entry->getText(), 'Normal process');
267
-
268
- $entry = $ifd0_0->getEntry(41986); // ExposureMode
269
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
270
- $this->assertEquals($entry->getValue(), 1);
271
- $this->assertEquals($entry->getText(), 'Manual exposure');
272
-
273
- $entry = $ifd0_0->getEntry(41987); // WhiteBalance
274
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
275
- $this->assertEquals($entry->getValue(), 1);
276
- $this->assertEquals($entry->getText(), 'Manual white balance');
277
-
278
- $entry = $ifd0_0->getEntry(41988); // DigitalZoomRatio
279
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
280
- $this->assertEquals($entry->getValue(), [
281
- 0 => 2048,
282
- 1 => 2048
283
- ]);
284
- $this->assertEquals($entry->getText(), '2048/2048');
285
-
286
- $entry = $ifd0_0->getEntry(41990); // SceneCaptureType
287
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
288
- $this->assertEquals($entry->getValue(), 0);
289
- $this->assertEquals($entry->getText(), 'Standard');
290
-
291
- /* Sub IFDs of $ifd0_0. */
292
- $this->assertEquals(count($ifd0_0->getSubIfds()), 2);
293
- $ifd0_0_0 = $ifd0_0->getSubIfd(4); // IFD Interoperability
294
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_0_0);
295
-
296
- /* Start of IDF $ifd0_0_0. */
297
- $this->assertEquals(count($ifd0_0_0->getEntries()), 4);
298
-
299
- $entry = $ifd0_0_0->getEntry(1); // InteroperabilityIndex
300
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
301
- $this->assertEquals($entry->getValue(), 'R98');
302
- $this->assertEquals($entry->getText(), 'R98');
303
-
304
- $entry = $ifd0_0_0->getEntry(2); // InteroperabilityVersion
305
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
306
- $this->assertEquals($entry->getValue(), 1);
307
- $this->assertEquals($entry->getText(), 'Interoperability Version 1.0');
308
-
309
- $entry = $ifd0_0_0->getEntry(4097); // RelatedImageWidth
310
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
311
- $this->assertEquals($entry->getValue(), 640);
312
- $this->assertEquals($entry->getText(), '640');
313
-
314
- $entry = $ifd0_0_0->getEntry(4098); // RelatedImageLength
315
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
316
- $this->assertEquals($entry->getValue(), 480);
317
- $this->assertEquals($entry->getText(), '480');
318
-
319
- /* Sub IFDs of $ifd0_0_0. */
320
- $this->assertEquals(count($ifd0_0_0->getSubIfds()), 0);
321
-
322
- $this->assertEquals($ifd0_0_0->getThumbnailData(), '');
323
-
324
- /* Next IFD. */
325
- $ifd0_0_1 = $ifd0_0_0->getNextIfd();
326
- $this->assertNull($ifd0_0_1);
327
- /* End of IFD $ifd0_0_0. */
328
-
329
- $this->assertEquals($ifd0_0->getThumbnailData(), '');
330
-
331
- /* Next IFD. */
332
- $ifd0_1 = $ifd0_0->getNextIfd();
333
- $this->assertNull($ifd0_1);
334
- /* End of IFD $ifd0_0. */
335
-
336
- $this->assertEquals($ifd0->getThumbnailData(), '');
337
-
338
- /* Next IFD. */
339
- $ifd1 = $ifd0->getNextIfd();
340
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd1);
341
- /* End of IFD $ifd0. */
342
-
343
- /* Start of IDF $ifd1. */
344
- $this->assertEquals(count($ifd1->getEntries()), 4);
345
-
346
- $entry = $ifd1->getEntry(259); // Compression
347
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
348
- $this->assertEquals($entry->getValue(), 6);
349
- $this->assertEquals($entry->getText(), 'JPEG compression');
350
-
351
- $entry = $ifd1->getEntry(282); // XResolution
352
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
353
- $this->assertEquals($entry->getValue(), [
354
- 0 => 180,
355
- 1 => 1
356
- ]);
357
- $this->assertEquals($entry->getText(), '180/1');
358
-
359
- $entry = $ifd1->getEntry(283); // YResolution
360
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
361
- $this->assertEquals($entry->getValue(), [
362
- 0 => 180,
363
- 1 => 1
364
- ]);
365
- $this->assertEquals($entry->getText(), '180/1');
366
-
367
- $entry = $ifd1->getEntry(296); // ResolutionUnit
368
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
369
- $this->assertEquals($entry->getValue(), 2);
370
- $this->assertEquals($entry->getText(), 'Inch');
371
-
372
- /* Sub IFDs of $ifd1. */
373
- $this->assertEquals(count($ifd1->getSubIfds()), 0);
374
-
375
- $thumb_data = file_get_contents(dirname(__FILE__) . '/canon-ixus-ii-thumb.jpg');
376
- $this->assertEquals($ifd1->getThumbnailData(), $thumb_data);
377
-
378
- /* Next IFD. */
379
- $ifd2 = $ifd1->getNextIfd();
380
- $this->assertNull($ifd2);
381
- /* End of IFD $ifd1. */
382
-
383
- /* Start of IDF $ifd0_mn */
384
- $ifd0_mn = $ifd0_0->getSubIfd(5); // IFD MakerNotes
385
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_mn);
386
-
387
- $entry = $ifd0_mn->getEntry(6); // ImageType
388
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
389
- $this->assertEquals($entry->getValue(), 'IMG:DIGITAL IXUS II JPEG');
390
-
391
- $entry = $ifd0_mn->getEntry(7); // FirmwareVersion
392
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
393
- $this->assertEquals($entry->getValue(), 'Firmware Version 1.00');
394
-
395
- $entry = $ifd0_mn->getEntry(8); // FileNumber
396
- $this->assertInstanceOf('lsolesen\pel\PelEntryLong', $entry);
397
- $this->assertEquals($entry->getValue(), '1202044');
398
-
399
- /* Start of IDF $ifd0_mn_cs. */
400
- $ifd0_mn_cs = $ifd0_mn->getSubIfd(6); // CameraSettings
401
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_mn_cs);
402
- $this->assertEquals(count($ifd0_mn_cs->getEntries()), 37);
403
-
404
- $entry = $ifd0_mn_cs->getEntry(1); // MacroMode
405
- $this->assertInstanceOf('lsolesen\pel\PelEntrySShort', $entry);
406
- $this->assertEquals($entry->getValue(), '2');
407
- $this->assertEquals($entry->getText(), 'Normal');
408
-
409
- $entry = $ifd0_mn_cs->getEntry(9); // RecordMode
410
- $this->assertInstanceOf('lsolesen\pel\PelEntrySShort', $entry);
411
- $this->assertEquals($entry->getValue(), '1');
412
- $this->assertEquals($entry->getText(), 'JPEG');
413
-
414
- $this->assertTrue(count(Pel::getExceptions()) == 0);
415
- }
416
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/CanonPowershotS60Test.php DELETED
@@ -1,414 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * PEL: PHP Exif Library. A library with support for reading and
5
- * writing all Exif headers in JPEG and TIFF images using PHP.
6
- *
7
- * Copyright (C) 2005, 2006 Martin Geisler.
8
- *
9
- * This program is free software; you can redistribute it and/or modify
10
- * it under the terms of the GNU General Public License as published by
11
- * the Free Software Foundation; either version 2 of the License, or
12
- * (at your option) any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- * GNU General Public License for more details.
18
- *
19
- * You should have received a copy of the GNU General Public License
20
- * along with this program in the file COPYING; if not, write to the
21
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
22
- * Boston, MA 02110-1301 USA
23
- */
24
-
25
- namespace Pel\Test\imagetests;
26
-
27
- use lsolesen\pel\Pel;
28
- use lsolesen\pel\PelJpeg;
29
- use PHPUnit\Framework\TestCase;
30
-
31
- class CanonPowershotS60Test extends TestCase
32
- {
33
- public function testRead()
34
- {
35
- Pel::clearExceptions();
36
- Pel::setStrictParsing(false);
37
- $jpeg = new PelJpeg(dirname(__FILE__) . '/canon-powershot-s60.jpg');
38
-
39
- $exif = $jpeg->getExif();
40
- $this->assertInstanceOf('lsolesen\pel\PelExif', $exif);
41
-
42
- $tiff = $exif->getTiff();
43
- $this->assertInstanceOf('lsolesen\pel\PelTiff', $tiff);
44
-
45
- /* The first IFD. */
46
- $ifd0 = $tiff->getIfd();
47
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0);
48
-
49
- /* Start of IDF $ifd0. */
50
- $this->assertEquals(count($ifd0->getEntries()), 8);
51
-
52
- $entry = $ifd0->getEntry(271); // Make
53
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
54
- $this->assertEquals($entry->getValue(), 'Canon');
55
- $this->assertEquals($entry->getText(), 'Canon');
56
-
57
- $entry = $ifd0->getEntry(272); // Model
58
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
59
- $this->assertEquals($entry->getValue(), 'Canon PowerShot S60');
60
- $this->assertEquals($entry->getText(), 'Canon PowerShot S60');
61
-
62
- $entry = $ifd0->getEntry(274); // Orientation
63
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
64
- $this->assertEquals($entry->getValue(), 1);
65
- $this->assertEquals($entry->getText(), 'top - left');
66
-
67
- $entry = $ifd0->getEntry(282); // XResolution
68
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
69
- $this->assertEquals($entry->getValue(), [
70
- 0 => 180,
71
- 1 => 1
72
- ]);
73
- $this->assertEquals($entry->getText(), '180/1');
74
-
75
- $entry = $ifd0->getEntry(283); // YResolution
76
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
77
- $this->assertEquals($entry->getValue(), [
78
- 0 => 180,
79
- 1 => 1
80
- ]);
81
- $this->assertEquals($entry->getText(), '180/1');
82
-
83
- $entry = $ifd0->getEntry(296); // ResolutionUnit
84
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
85
- $this->assertEquals($entry->getValue(), 2);
86
- $this->assertEquals($entry->getText(), 'Inch');
87
-
88
- $entry = $ifd0->getEntry(306); // DateTime
89
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
90
- $this->assertEquals($entry->getValue(), 1097316018);
91
- $this->assertEquals($entry->getText(), '2004:10:09 10:00:18');
92
-
93
- $entry = $ifd0->getEntry(531); // YCbCrPositioning
94
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
95
- $this->assertEquals($entry->getValue(), 1);
96
- $this->assertEquals($entry->getText(), 'centered');
97
-
98
- /* Sub IFDs of $ifd0. */
99
- $this->assertEquals(count($ifd0->getSubIfds()), 1);
100
- $ifd0_0 = $ifd0->getSubIfd(2); // IFD Exif
101
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_0);
102
-
103
- /* Start of IDF $ifd0_0. */
104
- $this->assertEquals(count($ifd0_0->getEntries()), 29);
105
-
106
- $entry = $ifd0_0->getEntry(33434); // ExposureTime
107
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
108
- $this->assertEquals($entry->getValue(), [
109
- 0 => 1,
110
- 1 => 8
111
- ]);
112
- $this->assertEquals($entry->getText(), '1/8 sec.');
113
-
114
- $entry = $ifd0_0->getEntry(33437); // FNumber
115
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
116
- $this->assertEquals($entry->getValue(), [
117
- 0 => 53,
118
- 1 => 10
119
- ]);
120
- $this->assertEquals($entry->getText(), 'f/5.3');
121
-
122
- $entry = $ifd0_0->getEntry(36864); // ExifVersion
123
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
124
- $this->assertEquals($entry->getValue(), 2.2);
125
- $this->assertEquals($entry->getText(), 'Exif Version 2.2');
126
-
127
- $entry = $ifd0_0->getEntry(36867); // DateTimeOriginal
128
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
129
- $this->assertEquals($entry->getValue(), 1097316018);
130
- $this->assertEquals($entry->getText(), '2004:10:09 10:00:18');
131
-
132
- $entry = $ifd0_0->getEntry(36868); // DateTimeDigitized
133
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
134
- $this->assertEquals($entry->getValue(), 1097316018);
135
- $this->assertEquals($entry->getText(), '2004:10:09 10:00:18');
136
-
137
- $entry = $ifd0_0->getEntry(37121); // ComponentsConfiguration
138
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
139
- $this->assertEquals($entry->getValue(), "\x01\x02\x03\0");
140
- $this->assertEquals($entry->getText(), 'Y Cb Cr -');
141
-
142
- $entry = $ifd0_0->getEntry(37122); // CompressedBitsPerPixel
143
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
144
- $this->assertEquals($entry->getValue(), [
145
- 0 => 2,
146
- 1 => 1
147
- ]);
148
- $this->assertEquals($entry->getText(), '2/1');
149
-
150
- $entry = $ifd0_0->getEntry(37377); // ShutterSpeedValue
151
- $this->assertInstanceOf('lsolesen\pel\PelEntrySRational', $entry);
152
- $this->assertEquals($entry->getValue(), [
153
- 0 => 96,
154
- 1 => 32
155
- ]);
156
- $this->assertEquals($entry->getText(), '96/32 sec. (APEX: 2)');
157
-
158
- $entry = $ifd0_0->getEntry(37378); // ApertureValue
159
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
160
- $this->assertEquals($entry->getValue(), [
161
- 0 => 154,
162
- 1 => 32
163
- ]);
164
- $this->assertEquals($entry->getText(), 'f/5.3');
165
-
166
- $entry = $ifd0_0->getEntry(37380); // ExposureBiasValue
167
- $this->assertInstanceOf('lsolesen\pel\PelEntrySRational', $entry);
168
- $this->assertEquals($entry->getValue(), [
169
- 0 => 0,
170
- 1 => 3
171
- ]);
172
- $this->assertEquals($entry->getText(), '0.0');
173
-
174
- $entry = $ifd0_0->getEntry(37381); // MaxApertureValue
175
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
176
- $this->assertEquals($entry->getValue(), [
177
- 0 => 154,
178
- 1 => 32
179
- ]);
180
- $this->assertEquals($entry->getText(), '154/32');
181
-
182
- $entry = $ifd0_0->getEntry(37383); // MeteringMode
183
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
184
- $this->assertEquals($entry->getValue(), 5);
185
- $this->assertEquals($entry->getText(), 'Pattern');
186
-
187
- $entry = $ifd0_0->getEntry(37385); // Flash
188
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
189
- $this->assertEquals($entry->getValue(), 16);
190
- $this->assertEquals($entry->getText(), 'Flash did not fire, compulsory flash mode.');
191
-
192
- $entry = $ifd0_0->getEntry(37386); // FocalLength
193
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
194
- $this->assertEquals($entry->getValue(), [
195
- 0 => 662,
196
- 1 => 32
197
- ]);
198
- $this->assertEquals($entry->getText(), '20.7 mm');
199
-
200
- $entry = $ifd0_0->getEntry(37500); // MakerNote
201
- $this->assertNull($entry);
202
-
203
- $entry = $ifd0_0->getEntry(37510); // UserComment
204
- $this->assertInstanceOf('lsolesen\pel\PelEntryUserComment', $entry);
205
- $expected = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
206
- $this->assertEquals($entry->getValue(), $expected);
207
- $expected = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
208
- $this->assertEquals($entry->getText(), $expected);
209
-
210
- $entry = $ifd0_0->getEntry(40960); // FlashPixVersion
211
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
212
- $this->assertEquals($entry->getValue(), 1);
213
- $this->assertEquals($entry->getText(), 'FlashPix Version 1.0');
214
-
215
- $entry = $ifd0_0->getEntry(40961); // ColorSpace
216
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
217
- $this->assertEquals($entry->getValue(), 1);
218
- $this->assertEquals($entry->getText(), 'sRGB');
219
-
220
- $entry = $ifd0_0->getEntry(40962); // PixelXDimension
221
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
222
- $this->assertEquals($entry->getValue(), 640);
223
- $this->assertEquals($entry->getText(), '640');
224
-
225
- $entry = $ifd0_0->getEntry(40963); // PixelYDimension
226
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
227
- $this->assertEquals($entry->getValue(), 480);
228
- $this->assertEquals($entry->getText(), '480');
229
-
230
- $entry = $ifd0_0->getEntry(41486); // FocalPlaneXResolution
231
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
232
- $this->assertEquals($entry->getValue(), [
233
- 0 => 640000,
234
- 1 => 283
235
- ]);
236
- $this->assertEquals($entry->getText(), '640000/283');
237
-
238
- $entry = $ifd0_0->getEntry(41487); // FocalPlaneYResolution
239
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
240
- $this->assertEquals($entry->getValue(), [
241
- 0 => 480000,
242
- 1 => 212
243
- ]);
244
- $this->assertEquals($entry->getText(), '480000/212');
245
-
246
- $entry = $ifd0_0->getEntry(41488); // FocalPlaneResolutionUnit
247
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
248
- $this->assertEquals($entry->getValue(), 2);
249
- $this->assertEquals($entry->getText(), 'Inch');
250
-
251
- $entry = $ifd0_0->getEntry(41495); // SensingMethod
252
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
253
- $this->assertEquals($entry->getValue(), 2);
254
- $this->assertEquals($entry->getText(), 'One-chip color area sensor');
255
-
256
- $entry = $ifd0_0->getEntry(41728); // FileSource
257
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
258
- $this->assertEquals($entry->getValue(), "\x03");
259
- $this->assertEquals($entry->getText(), 'DSC');
260
-
261
- $entry = $ifd0_0->getEntry(41985); // CustomRendered
262
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
263
- $this->assertEquals($entry->getValue(), 0);
264
- $this->assertEquals($entry->getText(), 'Normal process');
265
-
266
- $entry = $ifd0_0->getEntry(41986); // ExposureMode
267
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
268
- $this->assertEquals($entry->getValue(), 0);
269
- $this->assertEquals($entry->getText(), 'Auto exposure');
270
-
271
- $entry = $ifd0_0->getEntry(41987); // WhiteBalance
272
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
273
- $this->assertEquals($entry->getValue(), 0);
274
- $this->assertEquals($entry->getText(), 'Auto white balance');
275
-
276
- $entry = $ifd0_0->getEntry(41988); // DigitalZoomRatio
277
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
278
- $this->assertEquals($entry->getValue(), [
279
- 0 => 2592,
280
- 1 => 2592
281
- ]);
282
- $this->assertEquals($entry->getText(), '2592/2592');
283
-
284
- $entry = $ifd0_0->getEntry(41990); // SceneCaptureType
285
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
286
- $this->assertEquals($entry->getValue(), 0);
287
- $this->assertEquals($entry->getText(), 'Standard');
288
-
289
- /* Sub IFDs of $ifd0_0. */
290
- $this->assertEquals(count($ifd0_0->getSubIfds()), 2);
291
- $ifd0_0_0 = $ifd0_0->getSubIfd(4); // IFD Interoperability
292
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_0_0);
293
-
294
- /* Start of IDF $ifd0_0_0. */
295
- $this->assertEquals(count($ifd0_0_0->getEntries()), 4);
296
-
297
- $entry = $ifd0_0_0->getEntry(1); // InteroperabilityIndex
298
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
299
- $this->assertEquals($entry->getValue(), 'R98');
300
- $this->assertEquals($entry->getText(), 'R98');
301
-
302
- $entry = $ifd0_0_0->getEntry(2); // InteroperabilityVersion
303
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
304
- $this->assertEquals($entry->getValue(), 1);
305
- $this->assertEquals($entry->getText(), 'Interoperability Version 1.0');
306
-
307
- $entry = $ifd0_0_0->getEntry(4097); // RelatedImageWidth
308
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
309
- $this->assertEquals($entry->getValue(), 640);
310
- $this->assertEquals($entry->getText(), '640');
311
-
312
- $entry = $ifd0_0_0->getEntry(4098); // RelatedImageLength
313
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
314
- $this->assertEquals($entry->getValue(), 480);
315
- $this->assertEquals($entry->getText(), '480');
316
-
317
- /* Sub IFDs of $ifd0_0_0. */
318
- $this->assertEquals(count($ifd0_0_0->getSubIfds()), 0);
319
-
320
- $this->assertEquals($ifd0_0_0->getThumbnailData(), '');
321
-
322
- /* Next IFD. */
323
- $ifd0_0_1 = $ifd0_0_0->getNextIfd();
324
- $this->assertNull($ifd0_0_1);
325
- /* End of IFD $ifd0_0_0. */
326
-
327
- $this->assertEquals($ifd0_0->getThumbnailData(), '');
328
-
329
- /* Next IFD. */
330
- $ifd0_1 = $ifd0_0->getNextIfd();
331
- $this->assertNull($ifd0_1);
332
- /* End of IFD $ifd0_0. */
333
-
334
- $this->assertEquals($ifd0->getThumbnailData(), '');
335
-
336
- /* Next IFD. */
337
- $ifd1 = $ifd0->getNextIfd();
338
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd1);
339
- /* End of IFD $ifd0. */
340
-
341
- /* Start of IDF $ifd1. */
342
- $this->assertEquals(count($ifd1->getEntries()), 4);
343
-
344
- $entry = $ifd1->getEntry(259); // Compression
345
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
346
- $this->assertEquals($entry->getValue(), 6);
347
- $this->assertEquals($entry->getText(), 'JPEG compression');
348
-
349
- $entry = $ifd1->getEntry(282); // XResolution
350
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
351
- $this->assertEquals($entry->getValue(), [
352
- 0 => 180,
353
- 1 => 1
354
- ]);
355
- $this->assertEquals($entry->getText(), '180/1');
356
-
357
- $entry = $ifd1->getEntry(283); // YResolution
358
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
359
- $this->assertEquals($entry->getValue(), [
360
- 0 => 180,
361
- 1 => 1
362
- ]);
363
- $this->assertEquals($entry->getText(), '180/1');
364
-
365
- $entry = $ifd1->getEntry(296); // ResolutionUnit
366
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
367
- $this->assertEquals($entry->getValue(), 2);
368
- $this->assertEquals($entry->getText(), 'Inch');
369
-
370
- /* Sub IFDs of $ifd1. */
371
- $this->assertEquals(count($ifd1->getSubIfds()), 0);
372
-
373
- $thumb_data = file_get_contents(dirname(__FILE__) . '/canon-powershot-s60-thumb.jpg');
374
- $this->assertEquals($ifd1->getThumbnailData(), $thumb_data);
375
-
376
- /* Next IFD. */
377
- $ifd2 = $ifd1->getNextIfd();
378
- $this->assertNull($ifd2);
379
- /* End of IFD $ifd1. */
380
-
381
- /* Start of IDF $ifd0_mn */
382
- $ifd0_mn = $ifd0_0->getSubIfd(5); // IFD MakerNotes
383
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_mn);
384
-
385
- $entry = $ifd0_mn->getEntry(6); // ImageType
386
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
387
- $this->assertEquals($entry->getValue(), 'IMG:PowerShot S60 JPEG');
388
-
389
- $entry = $ifd0_mn->getEntry(7); // FirmwareVersion
390
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
391
- $this->assertEquals($entry->getValue(), 'Firmware Version 1.00');
392
-
393
- $entry = $ifd0_mn->getEntry(8); // FileNumber
394
- $this->assertInstanceOf('lsolesen\pel\PelEntryLong', $entry);
395
- $this->assertEquals($entry->getValue(), '1000041');
396
-
397
- /* Start of IDF $ifd0_mn_cs. */
398
- $ifd0_mn_cs = $ifd0_mn->getSubIfd(6); // CameraSettings
399
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_mn_cs);
400
- $this->assertEquals(count($ifd0_mn_cs->getEntries()), 37);
401
-
402
- $entry = $ifd0_mn_cs->getEntry(1); // MacroMode
403
- $this->assertInstanceOf('lsolesen\pel\PelEntrySShort', $entry);
404
- $this->assertEquals($entry->getValue(), '2');
405
- $this->assertEquals($entry->getText(), 'Normal');
406
-
407
- $entry = $ifd0_mn_cs->getEntry(9); // RecordMode
408
- $this->assertInstanceOf('lsolesen\pel\PelEntrySShort', $entry);
409
- $this->assertEquals($entry->getValue(), '1');
410
- $this->assertEquals($entry->getText(), 'JPEG');
411
-
412
- $this->assertTrue(count(Pel::getExceptions()) == 0);
413
- }
414
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/LeicaDLuxTest.php DELETED
@@ -1,419 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * PEL: PHP Exif Library. A library with support for reading and
5
- * writing all Exif headers in JPEG and TIFF images using PHP.
6
- *
7
- * Copyright (C) 2005, 2006 Martin Geisler.
8
- *
9
- * This program is free software; you can redistribute it and/or modify
10
- * it under the terms of the GNU General Public License as published by
11
- * the Free Software Foundation; either version 2 of the License, or
12
- * (at your option) any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- * GNU General Public License for more details.
18
- *
19
- * You should have received a copy of the GNU General Public License
20
- * along with this program in the file COPYING; if not, write to the
21
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
22
- * Boston, MA 02110-1301 USA
23
- */
24
-
25
- namespace Pel\Test\imagetests;
26
-
27
- use lsolesen\pel\Pel;
28
- use lsolesen\pel\PelJpeg;
29
- use PHPUnit\Framework\TestCase;
30
-
31
- class LeicaDLuxTest extends TestCase
32
- {
33
- public function testRead()
34
- {
35
- Pel::clearExceptions();
36
- Pel::setStrictParsing(false);
37
- $jpeg = new PelJpeg(dirname(__FILE__) . '/leica-d-lux.jpg');
38
-
39
- $exif = $jpeg->getExif();
40
- $this->assertInstanceOf('lsolesen\pel\PelExif', $exif);
41
-
42
- $tiff = $exif->getTiff();
43
- $this->assertInstanceOf('lsolesen\pel\PelTiff', $tiff);
44
-
45
- /* The first IFD. */
46
- $ifd0 = $tiff->getIfd();
47
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0);
48
-
49
- /* Start of IDF $ifd0. */
50
- $this->assertEquals(count($ifd0->getEntries()), 10);
51
-
52
- $entry = $ifd0->getEntry(271); // Make
53
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
54
- $this->assertEquals($entry->getValue(), 'LEICA');
55
- $this->assertEquals($entry->getText(), 'LEICA');
56
-
57
- $entry = $ifd0->getEntry(272); // Model
58
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
59
- $this->assertEquals($entry->getValue(), 'D-LUX');
60
- $this->assertEquals($entry->getText(), 'D-LUX');
61
-
62
- $entry = $ifd0->getEntry(274); // Orientation
63
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
64
- $this->assertEquals($entry->getValue(), 1);
65
- $this->assertEquals($entry->getText(), 'top - left');
66
-
67
- $entry = $ifd0->getEntry(282); // XResolution
68
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
69
- $this->assertEquals($entry->getValue(), [
70
- 0 => 72,
71
- 1 => 1
72
- ]);
73
- $this->assertEquals($entry->getText(), '72/1');
74
-
75
- $entry = $ifd0->getEntry(283); // YResolution
76
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
77
- $this->assertEquals($entry->getValue(), [
78
- 0 => 72,
79
- 1 => 1
80
- ]);
81
- $this->assertEquals($entry->getText(), '72/1');
82
-
83
- $entry = $ifd0->getEntry(296); // ResolutionUnit
84
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
85
- $this->assertEquals($entry->getValue(), 2);
86
- $this->assertEquals($entry->getText(), 'Inch');
87
-
88
- $entry = $ifd0->getEntry(305); // Software
89
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
90
- $this->assertEquals($entry->getValue(), 'Ver1.06');
91
- $this->assertEquals($entry->getText(), 'Ver1.06');
92
-
93
- $entry = $ifd0->getEntry(306); // DateTime
94
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
95
- $this->assertEquals($entry->getValue(), 1099994128);
96
- $this->assertEquals($entry->getText(), '2004:11:09 09:55:28');
97
-
98
- $entry = $ifd0->getEntry(531); // YCbCrPositioning
99
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
100
- $this->assertEquals($entry->getValue(), 2);
101
- $this->assertEquals($entry->getText(), 'co-sited');
102
-
103
- $entry = $ifd0->getEntry(50341); // PrintIM
104
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
105
- $expected = "\x50\x72\x69\x6e\x74\x49\x4d\0\x30\x32\x35\x30\0\0\x0e\0\x01\0\x16\0\x16\0\x02\0\0\0\0\0\x03\0\x64\0\0\0\x07\0\0\0\0\0\x08\0\0\0\0\0\x09\0\0\0\0\0\x0a\0\0\0\0\0\x0b\0\xac\0\0\0\x0c\0\0\0\0\0\x0d\0\0\0\0\0\x0e\0\xc4\0\0\0\0\x01\x05\0\0\0\x01\x01\x01\0\0\0\x10\x01\x80\0\0\0\x09\x11\0\0\x10\x27\0\0\x0b\x0f\0\0\x10\x27\0\0\x37\x05\0\0\x10\x27\0\0\xb0\x08\0\0\x10\x27\0\0\x01\x1c\0\0\x10\x27\0\0\x5e\x02\0\0\x10\x27\0\0\x8b\0\0\0\x10\x27\0\0\xcb\x03\0\0\x10\x27\0\0\xe5\x1b\0\0\x10\x27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
106
- $this->assertEquals($entry->getValue(), $expected);
107
- $this->assertEquals($entry->getText(), '(undefined)');
108
-
109
- /* Sub IFDs of $ifd0. */
110
- $this->assertEquals(count($ifd0->getSubIfds()), 1);
111
- $ifd0_0 = $ifd0->getSubIfd(2); // IFD Exif
112
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_0);
113
-
114
- /* Start of IDF $ifd0_0. */
115
- $this->assertEquals(count($ifd0_0->getEntries()), 37);
116
-
117
- $entry = $ifd0_0->getEntry(33434); // ExposureTime
118
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
119
- $this->assertEquals($entry->getValue(), [
120
- 0 => 10,
121
- 1 => 1000
122
- ]);
123
- $this->assertEquals($entry->getText(), '1/100 sec.');
124
-
125
- $entry = $ifd0_0->getEntry(33437); // FNumber
126
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
127
- $this->assertEquals($entry->getValue(), [
128
- 0 => 97,
129
- 1 => 10
130
- ]);
131
- $this->assertEquals($entry->getText(), 'f/9.7');
132
-
133
- $entry = $ifd0_0->getEntry(34850); // ExposureProgram
134
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
135
- $this->assertEquals($entry->getValue(), 2);
136
- $this->assertEquals($entry->getText(), 'Normal program');
137
-
138
- $entry = $ifd0_0->getEntry(34855); // ISOSpeedRatings
139
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
140
- $this->assertEquals($entry->getValue(), 100);
141
- $this->assertEquals($entry->getText(), '100');
142
-
143
- $entry = $ifd0_0->getEntry(36864); // ExifVersion
144
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
145
- $this->assertEquals($entry->getValue(), 2.2);
146
- $this->assertEquals($entry->getText(), 'Exif Version 2.2');
147
-
148
- $entry = $ifd0_0->getEntry(36867); // DateTimeOriginal
149
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
150
- $this->assertEquals($entry->getValue(), 1099994128);
151
- $this->assertEquals($entry->getText(), '2004:11:09 09:55:28');
152
-
153
- $entry = $ifd0_0->getEntry(36868); // DateTimeDigitized
154
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
155
- $this->assertEquals($entry->getValue(), 1099994128);
156
- $this->assertEquals($entry->getText(), '2004:11:09 09:55:28');
157
-
158
- $entry = $ifd0_0->getEntry(37121); // ComponentsConfiguration
159
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
160
- $this->assertEquals($entry->getValue(), "\x01\x02\x03\0" . '');
161
- $this->assertEquals($entry->getText(), 'Y Cb Cr -');
162
-
163
- $entry = $ifd0_0->getEntry(37122); // CompressedBitsPerPixel
164
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
165
- $this->assertEquals($entry->getValue(), [
166
- 0 => 21,
167
- 1 => 10
168
- ]);
169
- $this->assertEquals($entry->getText(), '21/10');
170
-
171
- $entry = $ifd0_0->getEntry(37377); // ShutterSpeedValue
172
- $this->assertInstanceOf('lsolesen\pel\PelEntrySRational', $entry);
173
- $this->assertEquals($entry->getValue(), [
174
- 0 => 6644,
175
- 1 => 1000
176
- ]);
177
- $this->assertEquals($entry->getText(), '6644/1000 sec. (APEX: 10)');
178
-
179
- $entry = $ifd0_0->getEntry(37378); // ApertureValue
180
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
181
- $this->assertEquals($entry->getValue(), [
182
- 0 => 66,
183
- 1 => 10
184
- ]);
185
- $this->assertEquals($entry->getText(), 'f/9.8');
186
-
187
- $entry = $ifd0_0->getEntry(37380); // ExposureBiasValue
188
- $this->assertInstanceOf('lsolesen\pel\PelEntrySRational', $entry);
189
- $this->assertEquals($entry->getValue(), [
190
- 0 => 0,
191
- 1 => 100
192
- ]);
193
- $this->assertEquals($entry->getText(), '0.0');
194
-
195
- $entry = $ifd0_0->getEntry(37381); // MaxApertureValue
196
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
197
- $this->assertEquals($entry->getValue(), [
198
- 0 => 30,
199
- 1 => 10
200
- ]);
201
- $this->assertEquals($entry->getText(), '30/10');
202
-
203
- $entry = $ifd0_0->getEntry(37383); // MeteringMode
204
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
205
- $this->assertEquals($entry->getValue(), 3);
206
- $this->assertEquals($entry->getText(), 'Spot');
207
-
208
- $entry = $ifd0_0->getEntry(37384); // LightSource
209
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
210
- $this->assertEquals($entry->getValue(), 1);
211
- $this->assertEquals($entry->getText(), 'Daylight');
212
-
213
- $entry = $ifd0_0->getEntry(37385); // Flash
214
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
215
- $this->assertEquals($entry->getValue(), 24);
216
- $this->assertEquals($entry->getText(), 'Flash did not fire, auto mode.');
217
-
218
- $entry = $ifd0_0->getEntry(37386); // FocalLength
219
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
220
- $this->assertEquals($entry->getValue(), [
221
- 0 => 88,
222
- 1 => 10
223
- ]);
224
- $this->assertEquals($entry->getText(), '8.8 mm');
225
-
226
- $entry = $ifd0_0->getEntry(37500); // MakerNote
227
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
228
- $expected = "\x4c\x45\x49\x43\x41\0\0\0\x0b\0\x01\0\x03\0\x01\0\0\0\x03\0\0\0\x02\0\x07\0\x04\0\0\0\x30\x31\x30\x30\x03\0\x03\0\x01\0\0\0\x01\0\0\0\x07\0\x03\0\x01\0\0\0\x01\0\0\0\x0f\0\x01\0\x02\0\0\0\0\x10\0\0\x1a\0\x03\0\x01\0\0\0\x02\0\0\0\x1c\0\x03\0\x01\0\0\0\x02\0\0\0\x1f\0\x03\0\x01\0\0\0\x01\0\0\0\x20\0\x03\0\x01\0\0\0\x02\0\0\0\x21\0\x07\0\x72\0\0\0\x5e\x04\0\0\x22\0\x03\0\x01\0\0\0\0\0\0\0\x57\x42\x02\x62\x01\x36\0\xb9\0\x92\0\xa8\0\x8c\0\xdc\0\xa0\0\x4b\x01\x9c\x01\xd5\x02\x3b\x01\x1c\x02\x44\x01\x1d\x0b\xab\x1b\x6c\x16\xb8\0\0\x41\x46\x01\x96\x04\x8e\x20\x06\0\0\x53\x54\0\0\0\0\0\0\x01\x24\0\0\0\0\0\0\0\x05\0\x05\0\0\x41\x45\x06\xa7\0\x4c\0\0\x02\x28\x09\x01\0\x93\x01\x44\0\0\x08\x08\x08\x08\x03\x03\0\0\0\xe0\0\0\x20\x20\0\x0a\0\0\x45\x50\x01\x0a\0\0";
229
- $this->assertEquals($entry->getValue(), $expected);
230
- $this->assertEquals($entry->getText(), '256 bytes unknown MakerNote data');
231
-
232
- $entry = $ifd0_0->getEntry(40960); // FlashPixVersion
233
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
234
- $this->assertEquals($entry->getValue(), 1);
235
- $this->assertEquals($entry->getText(), 'FlashPix Version 1.0');
236
-
237
- $entry = $ifd0_0->getEntry(40961); // ColorSpace
238
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
239
- $this->assertEquals($entry->getValue(), 1);
240
- $this->assertEquals($entry->getText(), 'sRGB');
241
-
242
- $entry = $ifd0_0->getEntry(40962); // PixelXDimension
243
- $this->assertInstanceOf('lsolesen\pel\PelEntryLong', $entry);
244
- $this->assertEquals($entry->getValue(), 640);
245
- $this->assertEquals($entry->getText(), '640');
246
-
247
- $entry = $ifd0_0->getEntry(40963); // PixelYDimension
248
- $this->assertInstanceOf('lsolesen\pel\PelEntryLong', $entry);
249
- $this->assertEquals($entry->getValue(), 480);
250
- $this->assertEquals($entry->getText(), '480');
251
-
252
- $entry = $ifd0_0->getEntry(41495); // SensingMethod
253
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
254
- $this->assertEquals($entry->getValue(), 2);
255
- $this->assertEquals($entry->getText(), 'One-chip color area sensor');
256
-
257
- $entry = $ifd0_0->getEntry(41728); // FileSource
258
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
259
- $this->assertEquals($entry->getValue(), "\x03");
260
- $this->assertEquals($entry->getText(), 'DSC');
261
-
262
- $entry = $ifd0_0->getEntry(41729); // SceneType
263
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
264
- $this->assertEquals($entry->getValue(), "\x01");
265
- $this->assertEquals($entry->getText(), 'Directly photographed');
266
-
267
- $entry = $ifd0_0->getEntry(41730); // CFAPattern
268
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
269
- $this->assertEquals($entry->getValue(), "\0\x02\0\x02\0\x01\x01\x02");
270
- $this->assertEquals($entry->getText(), '(undefined)');
271
-
272
- $entry = $ifd0_0->getEntry(41985); // CustomRendered
273
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
274
- $this->assertEquals($entry->getValue(), 0);
275
- $this->assertEquals($entry->getText(), 'Normal process');
276
-
277
- $entry = $ifd0_0->getEntry(41986); // ExposureMode
278
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
279
- $this->assertEquals($entry->getValue(), 0);
280
- $this->assertEquals($entry->getText(), 'Auto exposure');
281
-
282
- $entry = $ifd0_0->getEntry(41987); // WhiteBalance
283
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
284
- $this->assertEquals($entry->getValue(), 0);
285
- $this->assertEquals($entry->getText(), 'Auto white balance');
286
-
287
- $entry = $ifd0_0->getEntry(41988); // DigitalZoomRatio
288
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
289
- $this->assertEquals($entry->getValue(), [
290
- 0 => 0,
291
- 1 => 10
292
- ]);
293
- $this->assertEquals($entry->getText(), '0/10');
294
-
295
- $entry = $ifd0_0->getEntry(41989); // FocalLengthIn35mmFilm
296
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
297
- $this->assertEquals($entry->getValue(), 53);
298
- $this->assertEquals($entry->getText(), '53');
299
-
300
- $entry = $ifd0_0->getEntry(41990); // SceneCaptureType
301
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
302
- $this->assertEquals($entry->getValue(), 0);
303
- $this->assertEquals($entry->getText(), 'Standard');
304
-
305
- $entry = $ifd0_0->getEntry(41991); // GainControl
306
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
307
- $this->assertEquals($entry->getValue(), 0);
308
- $this->assertEquals($entry->getText(), 'Normal');
309
-
310
- $entry = $ifd0_0->getEntry(41992); // Contrast
311
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
312
- $this->assertEquals($entry->getValue(), 0);
313
- $this->assertEquals($entry->getText(), 'Normal');
314
-
315
- $entry = $ifd0_0->getEntry(41993); // Saturation
316
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
317
- $this->assertEquals($entry->getValue(), 0);
318
- $this->assertEquals($entry->getText(), 'Normal');
319
-
320
- $entry = $ifd0_0->getEntry(41994); // Sharpness
321
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
322
- $this->assertEquals($entry->getValue(), 0);
323
- $this->assertEquals($entry->getText(), 'Normal');
324
-
325
- $entry = $ifd0_0->getEntry(41996); // SubjectDistanceRange
326
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
327
- $this->assertEquals($entry->getValue(), 2);
328
- $this->assertEquals($entry->getText(), 'Close view');
329
-
330
- /* Sub IFDs of $ifd0_0. */
331
- $this->assertEquals(count($ifd0_0->getSubIfds()), 1);
332
- $ifd0_0_0 = $ifd0_0->getSubIfd(4); // IFD Interoperability
333
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_0_0);
334
-
335
- /* Start of IDF $ifd0_0_0. */
336
- $this->assertEquals(count($ifd0_0_0->getEntries()), 2);
337
-
338
- $entry = $ifd0_0_0->getEntry(1); // InteroperabilityIndex
339
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
340
- $this->assertEquals($entry->getValue(), 'R98');
341
- $this->assertEquals($entry->getText(), 'R98');
342
-
343
- $entry = $ifd0_0_0->getEntry(2); // InteroperabilityVersion
344
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
345
- $this->assertEquals($entry->getValue(), 1);
346
- $this->assertEquals($entry->getText(), 'Interoperability Version 1.0');
347
-
348
- /* Sub IFDs of $ifd0_0_0. */
349
- $this->assertEquals(count($ifd0_0_0->getSubIfds()), 0);
350
-
351
- $this->assertEquals($ifd0_0_0->getThumbnailData(), '');
352
-
353
- /* Next IFD. */
354
- $ifd0_0_1 = $ifd0_0_0->getNextIfd();
355
- $this->assertNull($ifd0_0_1);
356
- /* End of IFD $ifd0_0_0. */
357
-
358
- $this->assertEquals($ifd0_0->getThumbnailData(), '');
359
-
360
- /* Next IFD. */
361
- $ifd0_1 = $ifd0_0->getNextIfd();
362
- $this->assertNull($ifd0_1);
363
- /* End of IFD $ifd0_0. */
364
-
365
- $this->assertEquals($ifd0->getThumbnailData(), '');
366
-
367
- /* Next IFD. */
368
- $ifd1 = $ifd0->getNextIfd();
369
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd1);
370
- /* End of IFD $ifd0. */
371
-
372
- /* Start of IDF $ifd1. */
373
- $this->assertEquals(count($ifd1->getEntries()), 5);
374
-
375
- $entry = $ifd1->getEntry(259); // Compression
376
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
377
- $this->assertEquals($entry->getValue(), 6);
378
- $this->assertEquals($entry->getText(), 'JPEG compression');
379
-
380
- $entry = $ifd1->getEntry(282); // XResolution
381
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
382
- $this->assertEquals($entry->getValue(), [
383
- 0 => 72,
384
- 1 => 1
385
- ]);
386
- $this->assertEquals($entry->getText(), '72/1');
387
-
388
- $entry = $ifd1->getEntry(283); // YResolution
389
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
390
- $this->assertEquals($entry->getValue(), [
391
- 0 => 72,
392
- 1 => 1
393
- ]);
394
- $this->assertEquals($entry->getText(), '72/1');
395
-
396
- $entry = $ifd1->getEntry(296); // ResolutionUnit
397
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
398
- $this->assertEquals($entry->getValue(), 2);
399
- $this->assertEquals($entry->getText(), 'Inch');
400
-
401
- $entry = $ifd1->getEntry(531); // YCbCrPositioning
402
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
403
- $this->assertEquals($entry->getValue(), 2);
404
- $this->assertEquals($entry->getText(), 'co-sited');
405
-
406
- /* Sub IFDs of $ifd1. */
407
- $this->assertEquals(count($ifd1->getSubIfds()), 0);
408
-
409
- $thumb_data = file_get_contents(dirname(__FILE__) . '/leica-d-lux-thumb.jpg');
410
- $this->assertEquals($ifd1->getThumbnailData(), $thumb_data);
411
-
412
- /* Next IFD. */
413
- $ifd2 = $ifd1->getNextIfd();
414
- $this->assertNull($ifd2);
415
- /* End of IFD $ifd1. */
416
-
417
- $this->assertTrue(count(Pel::getExceptions()) == 0);
418
- }
419
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/NikonCoolscanIVTest.php DELETED
@@ -1,166 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * PEL: PHP Exif Library. A library with support for reading and
5
- * writing all Exif headers in JPEG and TIFF images using PHP.
6
- *
7
- * Copyright (C) 2005, 2006 Martin Geisler.
8
- *
9
- * This program is free software; you can redistribute it and/or modify
10
- * it under the terms of the GNU General Public License as published by
11
- * the Free Software Foundation; either version 2 of the License, or
12
- * (at your option) any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- * GNU General Public License for more details.
18
- *
19
- * You should have received a copy of the GNU General Public License
20
- * along with this program in the file COPYING; if not, write to the
21
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
22
- * Boston, MA 02110-1301 USA
23
- */
24
-
25
- namespace Pel\Test\imagetests;
26
-
27
- use lsolesen\pel\Pel;
28
- use lsolesen\pel\PelJpeg;
29
- use PHPUnit\Framework\TestCase;
30
-
31
- class NikonCoolscanIVTest extends TestCase
32
- {
33
- public function testRead()
34
- {
35
- Pel::clearExceptions();
36
- Pel::setStrictParsing(false);
37
- $jpeg = new PelJpeg(dirname(__FILE__) . '/nikon-coolscan-iv.jpg');
38
-
39
- $exif = $jpeg->getExif();
40
- $this->assertInstanceOf('lsolesen\pel\PelExif', $exif);
41
-
42
- $tiff = $exif->getTiff();
43
- $this->assertInstanceOf('lsolesen\pel\PelTiff', $tiff);
44
-
45
- /* The first IFD. */
46
- $ifd0 = $tiff->getIfd();
47
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0);
48
-
49
- /* Start of IDF $ifd0. */
50
- $this->assertEquals(count($ifd0->getEntries()), 6);
51
-
52
- $entry = $ifd0->getEntry(271); // Make
53
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
54
- $this->assertEquals($entry->getValue(), 'Nikon');
55
- $this->assertEquals($entry->getText(), 'Nikon');
56
-
57
- $entry = $ifd0->getEntry(282); // XResolution
58
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
59
- $this->assertEquals($entry->getValue(), [
60
- 0 => 2000,
61
- 1 => 1
62
- ]);
63
- $this->assertEquals($entry->getText(), '2000/1');
64
-
65
- $entry = $ifd0->getEntry(283); // YResolution
66
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
67
- $this->assertEquals($entry->getValue(), [
68
- 0 => 2000,
69
- 1 => 1
70
- ]);
71
- $this->assertEquals($entry->getText(), '2000/1');
72
-
73
- $entry = $ifd0->getEntry(296); // ResolutionUnit
74
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
75
- $this->assertEquals($entry->getValue(), 2);
76
- $this->assertEquals($entry->getText(), 'Inch');
77
-
78
- $entry = $ifd0->getEntry(306); // DateTime
79
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
80
- $this->assertEquals($entry->getValue(), 1090023875);
81
- $this->assertEquals($entry->getText(), '2004:07:17 00:24:35');
82
-
83
- $entry = $ifd0->getEntry(531); // YCbCrPositioning
84
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
85
- $this->assertEquals($entry->getValue(), 1);
86
- $this->assertEquals($entry->getText(), 'centered');
87
-
88
- /* Sub IFDs of $ifd0. */
89
- $this->assertEquals(count($ifd0->getSubIfds()), 2);
90
- $ifd0_0 = $ifd0->getSubIfd(2); // IFD Exif
91
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_0);
92
-
93
- /* Start of IDF $ifd0_0. */
94
- $this->assertEquals(count($ifd0_0->getEntries()), 7);
95
-
96
- $entry = $ifd0_0->getEntry(36864); // ExifVersion
97
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
98
- $this->assertEquals($entry->getValue(), 2.1);
99
- $this->assertEquals($entry->getText(), 'Exif Version 2.1');
100
-
101
- $entry = $ifd0_0->getEntry(37121); // ComponentsConfiguration
102
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
103
- $this->assertEquals($entry->getValue(), "\x01\x02\x03\0");
104
- $this->assertEquals($entry->getText(), 'Y Cb Cr -');
105
-
106
- $entry = $ifd0_0->getEntry(37500); // MakerNote
107
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
108
- $expected = "\x02\0\x01\0\x07\0\x04\0\0\0\x30\x31\x30\x30\x10\x0e\x04\0\x01\0\0\0\x16\x01\0\0\0\0\0\0\x05\0";
109
- $this->assertEquals($entry->getValue(), $expected);
110
- $this->assertEquals($entry->getText(), '32 bytes unknown MakerNote data');
111
-
112
- $entry = $ifd0_0->getEntry(40960); // FlashPixVersion
113
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
114
- $this->assertEquals($entry->getValue(), 1);
115
- $this->assertEquals($entry->getText(), 'FlashPix Version 1.0');
116
-
117
- $entry = $ifd0_0->getEntry(40961); // ColorSpace
118
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
119
- $this->assertEquals($entry->getValue(), 1);
120
- $this->assertEquals($entry->getText(), 'sRGB');
121
-
122
- $entry = $ifd0_0->getEntry(40962); // PixelXDimension
123
- $this->assertInstanceOf('lsolesen\pel\PelEntryLong', $entry);
124
- $this->assertEquals($entry->getValue(), 960);
125
- $this->assertEquals($entry->getText(), '960');
126
-
127
- $entry = $ifd0_0->getEntry(40963); // PixelYDimension
128
- $this->assertInstanceOf('lsolesen\pel\PelEntryLong', $entry);
129
- $this->assertEquals($entry->getValue(), 755);
130
- $this->assertEquals($entry->getText(), '755');
131
-
132
- /* Sub IFDs of $ifd0_0. */
133
- $this->assertEquals(count($ifd0_0->getSubIfds()), 0);
134
-
135
- $this->assertEquals($ifd0_0->getThumbnailData(), '');
136
-
137
- /* Next IFD. */
138
- $ifd0_1 = $ifd0_0->getNextIfd();
139
- $this->assertNull($ifd0_1);
140
- /* End of IFD $ifd0_0. */
141
- $ifd0_1 = $ifd0->getSubIfd(3); // IFD GPS
142
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_1);
143
-
144
- /* Start of IDF $ifd0_1. */
145
- $this->assertEquals(count($ifd0_1->getEntries()), 0);
146
-
147
- /* Sub IFDs of $ifd0_1. */
148
- $this->assertEquals(count($ifd0_1->getSubIfds()), 0);
149
-
150
- $this->assertEquals($ifd0_1->getThumbnailData(), '');
151
-
152
- /* Next IFD. */
153
- $ifd0_2 = $ifd0_1->getNextIfd();
154
- $this->assertNull($ifd0_2);
155
- /* End of IFD $ifd0_1. */
156
-
157
- $this->assertEquals($ifd0->getThumbnailData(), '');
158
-
159
- /* Next IFD. */
160
- $ifd1 = $ifd0->getNextIfd();
161
- $this->assertNull($ifd1);
162
- /* End of IFD $ifd0. */
163
-
164
- $this->assertTrue(count(Pel::getExceptions()) == 0);
165
- }
166
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/NikonE5000Test.php DELETED
@@ -1,313 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * PEL: PHP Exif Library. A library with support for reading and
5
- * writing all Exif headers in JPEG and TIFF images using PHP.
6
- *
7
- * Copyright (C) 2005, 2006 Martin Geisler.
8
- *
9
- * This program is free software; you can redistribute it and/or modify
10
- * it under the terms of the GNU General Public License as published by
11
- * the Free Software Foundation; either version 2 of the License, or
12
- * (at your option) any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- * GNU General Public License for more details.
18
- *
19
- * You should have received a copy of the GNU General Public License
20
- * along with this program in the file COPYING; if not, write to the
21
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
22
- * Boston, MA 02110-1301 USA
23
- */
24
-
25
- namespace Pel\Test\imagetests;
26
-
27
- use lsolesen\pel\Pel;
28
- use lsolesen\pel\PelJpeg;
29
- use PHPUnit\Framework\TestCase;
30
-
31
- class NikonE5000Test extends TestCase
32
- {
33
- public function testRead()
34
- {
35
- Pel::clearExceptions();
36
- Pel::setStrictParsing(false);
37
- $jpeg = new PelJpeg(dirname(__FILE__) . '/nikon-e5000.jpg');
38
-
39
- $exif = $jpeg->getExif();
40
- $this->assertInstanceOf('lsolesen\pel\PelExif', $exif);
41
-
42
- $tiff = $exif->getTiff();
43
- $this->assertInstanceOf('lsolesen\pel\PelTiff', $tiff);
44
-
45
- /* The first IFD. */
46
- $ifd0 = $tiff->getIfd();
47
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0);
48
-
49
- /* Start of IDF $ifd0. */
50
- $this->assertEquals(count($ifd0->getEntries()), 9);
51
-
52
- $entry = $ifd0->getEntry(270); // ImageDescription
53
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
54
- $this->assertEquals($entry->getValue(), ' ');
55
- $this->assertEquals($entry->getText(), ' ');
56
-
57
- $entry = $ifd0->getEntry(271); // Make
58
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
59
- $this->assertEquals($entry->getValue(), 'NIKON');
60
- $this->assertEquals($entry->getText(), 'NIKON');
61
-
62
- $entry = $ifd0->getEntry(272); // Model
63
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
64
- $this->assertEquals($entry->getValue(), 'E5000');
65
- $this->assertEquals($entry->getText(), 'E5000');
66
-
67
- $entry = $ifd0->getEntry(282); // XResolution
68
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
69
- $this->assertEquals($entry->getValue(), [
70
- 0 => 300,
71
- 1 => 1
72
- ]);
73
- $this->assertEquals($entry->getText(), '300/1');
74
-
75
- $entry = $ifd0->getEntry(283); // YResolution
76
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
77
- $this->assertEquals($entry->getValue(), [
78
- 0 => 300,
79
- 1 => 1
80
- ]);
81
- $this->assertEquals($entry->getText(), '300/1');
82
-
83
- $entry = $ifd0->getEntry(296); // ResolutionUnit
84
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
85
- $this->assertEquals($entry->getValue(), 2);
86
- $this->assertEquals($entry->getText(), 'Inch');
87
-
88
- $entry = $ifd0->getEntry(305); // Software
89
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
90
- $this->assertEquals($entry->getValue(), 'E5000v1.6');
91
- $this->assertEquals($entry->getText(), 'E5000v1.6');
92
-
93
- $entry = $ifd0->getEntry(306); // DateTime
94
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
95
- $this->assertEquals($entry->getValue(), 1021992832);
96
- $this->assertEquals($entry->getText(), '2002:05:21 14:53:52');
97
-
98
- $entry = $ifd0->getEntry(531); // YCbCrPositioning
99
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
100
- $this->assertEquals($entry->getValue(), 1);
101
- $this->assertEquals($entry->getText(), 'centered');
102
-
103
- /* Sub IFDs of $ifd0. */
104
- $this->assertEquals(count($ifd0->getSubIfds()), 2);
105
- $ifd0_0 = $ifd0->getSubIfd(2); // IFD Exif
106
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_0);
107
-
108
- /* Start of IDF $ifd0_0. */
109
- $this->assertEquals(count($ifd0_0->getEntries()), 22);
110
-
111
- $entry = $ifd0_0->getEntry(33434); // ExposureTime
112
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
113
- $this->assertEquals($entry->getValue(), [
114
- 0 => 1642036,
115
- 1 => 100000000
116
- ]);
117
- $this->assertEquals($entry->getText(), '1/60 sec.');
118
-
119
- $entry = $ifd0_0->getEntry(33437); // FNumber
120
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
121
- $this->assertEquals($entry->getValue(), [
122
- 0 => 28,
123
- 1 => 10
124
- ]);
125
- $this->assertEquals($entry->getText(), 'f/2.8');
126
-
127
- $entry = $ifd0_0->getEntry(34850); // ExposureProgram
128
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
129
- $this->assertEquals($entry->getValue(), 2);
130
- $this->assertEquals($entry->getText(), 'Normal program');
131
-
132
- $entry = $ifd0_0->getEntry(34855); // ISOSpeedRatings
133
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
134
- $this->assertEquals($entry->getValue(), 100);
135
- $this->assertEquals($entry->getText(), '100');
136
-
137
- $entry = $ifd0_0->getEntry(36864); // ExifVersion
138
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
139
- $this->assertEquals($entry->getValue(), 2.1);
140
- $this->assertEquals($entry->getText(), 'Exif Version 2.1');
141
-
142
- $entry = $ifd0_0->getEntry(36867); // DateTimeOriginal
143
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
144
- $this->assertEquals($entry->getValue(), 1021992832);
145
- $this->assertEquals($entry->getText(), '2002:05:21 14:53:52');
146
-
147
- $entry = $ifd0_0->getEntry(36868); // DateTimeDigitized
148
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
149
- $this->assertEquals($entry->getValue(), 1021992832);
150
- $this->assertEquals($entry->getText(), '2002:05:21 14:53:52');
151
-
152
- $entry = $ifd0_0->getEntry(37121); // ComponentsConfiguration
153
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
154
- $this->assertEquals($entry->getValue(), "\x01\x02\x03\0");
155
- $this->assertEquals($entry->getText(), 'Y Cb Cr -');
156
-
157
- $entry = $ifd0_0->getEntry(37380); // ExposureBiasValue
158
- $this->assertInstanceOf('lsolesen\pel\PelEntrySRational', $entry);
159
- $this->assertEquals($entry->getValue(), [
160
- 0 => 0,
161
- 1 => 10
162
- ]);
163
- $this->assertEquals($entry->getText(), '0.0');
164
-
165
- $entry = $ifd0_0->getEntry(37381); // MaxApertureValue
166
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
167
- $this->assertEquals($entry->getValue(), [
168
- 0 => 3,
169
- 1 => 1
170
- ]);
171
- $this->assertEquals($entry->getText(), '3/1');
172
-
173
- $entry = $ifd0_0->getEntry(37383); // MeteringMode
174
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
175
- $this->assertEquals($entry->getValue(), 5);
176
- $this->assertEquals($entry->getText(), 'Pattern');
177
-
178
- $entry = $ifd0_0->getEntry(37384); // LightSource
179
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
180
- $this->assertEquals($entry->getValue(), 0);
181
- $this->assertEquals($entry->getText(), 'Unknown');
182
-
183
- $entry = $ifd0_0->getEntry(37385); // Flash
184
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
185
- $this->assertEquals($entry->getValue(), 0);
186
- $this->assertEquals($entry->getText(), 'Flash did not fire.');
187
-
188
- $entry = $ifd0_0->getEntry(37386); // FocalLength
189
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
190
- $this->assertEquals($entry->getValue(), [
191
- 0 => 71,
192
- 1 => 10
193
- ]);
194
- $this->assertEquals($entry->getText(), '7.1 mm');
195
-
196
- $entry = $ifd0_0->getEntry(37500); // MakerNote
197
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
198
- $expected = "\x15\0\x01\0\x07\0\x04\0\0\0\0\x01\0\0\x02\0\x03\0\x02\0\0\0\0\0\0\0\x03\0\x02\0\x06\0\0\0\xbc\x03\0\0\x04\0\x02\0\x08\0\0\0\xc2\x03\0\0\x05\0\x02\0\x0d\0\0\0\xca\x03\0\0\x06\0\x02\0\x07\0\0\0\xd8\x03\0\0\x07\0\x02\0\x07\0\0\0\xe0\x03\0\0\x08\0\x02\0\x0d\0\0\0\xe8\x03\0\0\x0a\0\x05\0\x01\0\0\0\xf6\x03\0\0\x0f\0\x02\0\x07\0\0\0\xfe\x03\0\0\x11\0\x04\0\x01\0\0\0\x14\x05\0\0\x80\0\x02\0\x0e\0\0\0\x06\x04\0\0\x82\0\x02\0\x0d\0\0\0\x14\x04\0\0\x85\0\x05\0\x01\0\0\0\x22\x04\0\0\x86\0\x05\0\x01\0\0\0\x2a\x04\0\0\x88\0\x07\0\x04\0\0\0\0\0\0\0\x8f\0\x02\0\x11\0\0\0\x32\x04\0\0\x94\0\x08\0\x01\0\0\0\0\0\0\0\x95\0\x02\0\x05\0\0\0\x44\x04\0\0\0\x0e\x07\0\xca\0\0\0\x4a\x04\0\0\x10\x0e\x04\0\x01\0\0\0\x72\x05\0\0\0\0\0\0\x43\x4f\x4c\x4f\x52\0\x46\x49\x4e\x45\x20\x20\x20\0\x41\x55\x54\x4f\x20\x20\x20\x20\x20\x20\x20\x20\0\x31\x41\x55\x54\x4f\x20\x20\0\0\x41\x46\x2d\x43\x20\x20\0\x3a\x4e\x4f\x52\x4d\x41\x4c\x20\x20\x20\x20\x20\x20\0\0\x80\x22\0\0\xe8\x03\0\0\x41\x55\x54\x4f\x20\x20\0\0\x41\x55\x54\x4f\x20\x20\x20\x20\x20\x20\x20\x20\x20\0\x4f\x46\x46\x20\x20\x20\x20\x20\x20\x20\x20\x20\0\x20\0\0\0\0\0\0\0\0\x01\0\0\0\x01\0\0\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\0\x20\x4f\x46\x46\x20\0\x20\x50\x72\x69\x6e\x74\x49\x4d\0\x30\x31\x30\x30\0\0\x0d\0\x01\0\x16\0\x16\0\x02\0\x01\0\0\0\x03\0\x5e\0\0\0\x07\0\0\0\0\0\x08\0\0\0\0\0\x09\0\0\0\0\0\x0a\0\0\0\0\0\x0b\0\xa6\0\0\0\x0c\0\0\0\0\0\x0d\0\0\0\0\0\x0e\0\xbe\0\0\0\0\x01\x05\0\0\0\x01\x01\x01\0\0\0\x09\x11\0\0\x10\x27\0\0\x0b\x0f\0\0\x10\x27\0\0\x97\x05\0\0\x10\x27\0\0\xb0\x08\0\0\x10\x27\0\0\x01\x1c\0\0\x10\x27\0\0\x5e\x02\0\0\x10\x27\0\0\x8b\0\0\0\x10\x27\0\0\xcb\x03\0\0\x10\x27\0\0\xe5\x1b\0\0\x10\x27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x06\0";
199
- $this->assertEquals($entry->getValue(), $expected);
200
- $this->assertEquals($entry->getText(), '604 bytes unknown MakerNote data');
201
-
202
- $entry = $ifd0_0->getEntry(37510); // UserComment
203
- $this->assertInstanceOf('lsolesen\pel\PelEntryUserComment', $entry);
204
- $this->assertEquals($entry->getValue(), ' ');
205
- $this->assertEquals($entry->getText(), ' ');
206
-
207
- $entry = $ifd0_0->getEntry(40960); // FlashPixVersion
208
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
209
- $this->assertEquals($entry->getValue(), 1);
210
- $this->assertEquals($entry->getText(), 'FlashPix Version 1.0');
211
-
212
- $entry = $ifd0_0->getEntry(40961); // ColorSpace
213
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
214
- $this->assertEquals($entry->getValue(), 1);
215
- $this->assertEquals($entry->getText(), 'sRGB');
216
-
217
- $entry = $ifd0_0->getEntry(40962); // PixelXDimension
218
- $this->assertInstanceOf('lsolesen\pel\PelEntryLong', $entry);
219
- $this->assertEquals($entry->getValue(), 1600);
220
- $this->assertEquals($entry->getText(), '1600');
221
-
222
- $entry = $ifd0_0->getEntry(40963); // PixelYDimension
223
- $this->assertInstanceOf('lsolesen\pel\PelEntryLong', $entry);
224
- $this->assertEquals($entry->getValue(), 1200);
225
- $this->assertEquals($entry->getText(), '1200');
226
-
227
- $entry = $ifd0_0->getEntry(41728); // FileSource
228
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
229
- $this->assertEquals($entry->getValue(), "\x03");
230
- $this->assertEquals($entry->getText(), 'DSC');
231
-
232
- $entry = $ifd0_0->getEntry(41729); // SceneType
233
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
234
- $this->assertEquals($entry->getValue(), "\x01");
235
- $this->assertEquals($entry->getText(), 'Directly photographed');
236
-
237
- /* Sub IFDs of $ifd0_0. */
238
- $this->assertEquals(count($ifd0_0->getSubIfds()), 0);
239
-
240
- $this->assertEquals($ifd0_0->getThumbnailData(), '');
241
-
242
- /* Next IFD. */
243
- $ifd0_1 = $ifd0_0->getNextIfd();
244
- $this->assertNull($ifd0_1);
245
- /* End of IFD $ifd0_0. */
246
- $ifd0_1 = $ifd0->getSubIfd(3); // IFD GPS
247
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_1);
248
-
249
- /* Start of IDF $ifd0_1. */
250
- $this->assertEquals(count($ifd0_1->getEntries()), 0);
251
-
252
- /* Sub IFDs of $ifd0_1. */
253
- $this->assertEquals(count($ifd0_1->getSubIfds()), 0);
254
-
255
- $this->assertEquals($ifd0_1->getThumbnailData(), '');
256
-
257
- /* Next IFD. */
258
- $ifd0_2 = $ifd0_1->getNextIfd();
259
- $this->assertNull($ifd0_2);
260
- /* End of IFD $ifd0_1. */
261
-
262
- $this->assertEquals($ifd0->getThumbnailData(), '');
263
-
264
- /* Next IFD. */
265
- $ifd1 = $ifd0->getNextIfd();
266
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd1);
267
- /* End of IFD $ifd0. */
268
-
269
- /* Start of IDF $ifd1. */
270
- $this->assertEquals(count($ifd1->getEntries()), 4);
271
-
272
- $entry = $ifd1->getEntry(259); // Compression
273
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
274
- $this->assertEquals($entry->getValue(), 6);
275
- $this->assertEquals($entry->getText(), 'JPEG compression');
276
-
277
- $entry = $ifd1->getEntry(282); // XResolution
278
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
279
- $this->assertEquals($entry->getValue(), [
280
- 0 => 72,
281
- 1 => 1
282
- ]);
283
- $this->assertEquals($entry->getText(), '72/1');
284
-
285
- $entry = $ifd1->getEntry(283); // YResolution
286
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
287
- $this->assertEquals($entry->getValue(), [
288
- 0 => 72,
289
- 1 => 1
290
- ]);
291
- $this->assertEquals($entry->getText(), '72/1');
292
-
293
- $entry = $ifd1->getEntry(296); // ResolutionUnit
294
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
295
- $this->assertEquals($entry->getValue(), 2);
296
- $this->assertEquals($entry->getText(), 'Inch');
297
-
298
- /* Sub IFDs of $ifd1. */
299
- $this->assertEquals(count($ifd1->getSubIfds()), 0);
300
-
301
- $thumb_data = file_get_contents(dirname(__FILE__) . '/nikon-e5000-thumb.jpg');
302
- $this->assertEquals($ifd1->getThumbnailData(), $thumb_data);
303
-
304
- /* Next IFD. */
305
- $ifd2 = $ifd1->getNextIfd();
306
- $this->assertNull($ifd2);
307
- /* End of IFD $ifd1. */
308
-
309
- $exceptions = Pel::getExceptions();
310
- $this->assertInstanceOf('lsolesen\pel\PelException', $exceptions[0]);
311
- $this->assertEquals($exceptions[0]->getMessage(), 'Found trailing content after EOI: 1396 bytes');
312
- }
313
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/NikonE950Test.php DELETED
@@ -1,334 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * PEL: PHP Exif Library. A library with support for reading and
5
- * writing all Exif headers in JPEG and TIFF images using PHP.
6
- *
7
- * Copyright (C) 2005, 2006 Martin Geisler.
8
- *
9
- * This program is free software; you can redistribute it and/or modify
10
- * it under the terms of the GNU General Public License as published by
11
- * the Free Software Foundation; either version 2 of the License, or
12
- * (at your option) any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- * GNU General Public License for more details.
18
- *
19
- * You should have received a copy of the GNU General Public License
20
- * along with this program in the file COPYING; if not, write to the
21
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
22
- * Boston, MA 02110-1301 USA
23
- */
24
-
25
- namespace Pel\Test\imagetests;
26
-
27
- use lsolesen\pel\Pel;
28
- use lsolesen\pel\PelJpeg;
29
- use PHPUnit\Framework\TestCase;
30
-
31
- class NikonE950Test extends TestCase
32
- {
33
- public function testRead()
34
- {
35
- Pel::clearExceptions();
36
- Pel::setStrictParsing(false);
37
- $jpeg = new PelJpeg(dirname(__FILE__) . '/nikon-e950.jpg');
38
-
39
- $exif = $jpeg->getExif();
40
- $this->assertInstanceOf('lsolesen\pel\PelExif', $exif);
41
-
42
- $tiff = $exif->getTiff();
43
- $this->assertInstanceOf('lsolesen\pel\PelTiff', $tiff);
44
-
45
- /* The first IFD. */
46
- $ifd0 = $tiff->getIfd();
47
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0);
48
-
49
- /* Start of IDF $ifd0. */
50
- $this->assertEquals(count($ifd0->getEntries()), 10);
51
-
52
- $entry = $ifd0->getEntry(270); // ImageDescription
53
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
54
- $this->assertEquals($entry->getValue(), ' ');
55
- $this->assertEquals($entry->getText(), ' ');
56
-
57
- $entry = $ifd0->getEntry(271); // Make
58
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
59
- $this->assertEquals($entry->getValue(), 'NIKON');
60
- $this->assertEquals($entry->getText(), 'NIKON');
61
-
62
- $entry = $ifd0->getEntry(272); // Model
63
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
64
- $this->assertEquals($entry->getValue(), 'E950');
65
- $this->assertEquals($entry->getText(), 'E950');
66
-
67
- $entry = $ifd0->getEntry(274); // Orientation
68
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
69
- $this->assertEquals($entry->getValue(), 1);
70
- $this->assertEquals($entry->getText(), 'top - left');
71
-
72
- $entry = $ifd0->getEntry(282); // XResolution
73
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
74
- $this->assertEquals($entry->getValue(), [
75
- 0 => 300,
76
- 1 => 1
77
- ]);
78
- $this->assertEquals($entry->getText(), '300/1');
79
-
80
- $entry = $ifd0->getEntry(283); // YResolution
81
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
82
- $this->assertEquals($entry->getValue(), [
83
- 0 => 300,
84
- 1 => 1
85
- ]);
86
- $this->assertEquals($entry->getText(), '300/1');
87
-
88
- $entry = $ifd0->getEntry(296); // ResolutionUnit
89
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
90
- $this->assertEquals($entry->getValue(), 2);
91
- $this->assertEquals($entry->getText(), 'Inch');
92
-
93
- $entry = $ifd0->getEntry(305); // Software
94
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
95
- $this->assertEquals($entry->getValue(), 'v981p-78');
96
- $this->assertEquals($entry->getText(), 'v981p-78');
97
-
98
- $entry = $ifd0->getEntry(306); // DateTime
99
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
100
- $this->assertEquals($entry->getValue(), 978276013);
101
- $this->assertEquals($entry->getText(), '2000:12:31 15:20:13');
102
-
103
- $entry = $ifd0->getEntry(531); // YCbCrPositioning
104
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
105
- $this->assertEquals($entry->getValue(), 2);
106
- $this->assertEquals($entry->getText(), 'co-sited');
107
-
108
- /* Sub IFDs of $ifd0. */
109
- $this->assertEquals(count($ifd0->getSubIfds()), 1);
110
- $ifd0_0 = $ifd0->getSubIfd(2); // IFD Exif
111
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_0);
112
-
113
- /* Start of IDF $ifd0_0. */
114
- $this->assertEquals(count($ifd0_0->getEntries()), 23);
115
-
116
- $entry = $ifd0_0->getEntry(33434); // ExposureTime
117
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
118
- $this->assertEquals($entry->getValue(), [
119
- 0 => 10,
120
- 1 => 1120
121
- ]);
122
- $this->assertEquals($entry->getText(), '1/112 sec.');
123
-
124
- $entry = $ifd0_0->getEntry(33437); // FNumber
125
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
126
- $this->assertEquals($entry->getValue(), [
127
- 0 => 60,
128
- 1 => 10
129
- ]);
130
- $this->assertEquals($entry->getText(), 'f/6.0');
131
-
132
- $entry = $ifd0_0->getEntry(34850); // ExposureProgram
133
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
134
- $this->assertEquals($entry->getValue(), 2);
135
- $this->assertEquals($entry->getText(), 'Normal program');
136
-
137
- $entry = $ifd0_0->getEntry(34855); // ISOSpeedRatings
138
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
139
- $this->assertEquals($entry->getValue(), 80);
140
- $this->assertEquals($entry->getText(), '80');
141
-
142
- $entry = $ifd0_0->getEntry(36864); // ExifVersion
143
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
144
- $this->assertEquals($entry->getValue(), 2.1);
145
- $this->assertEquals($entry->getText(), 'Exif Version 2.1');
146
-
147
- $entry = $ifd0_0->getEntry(36867); // DateTimeOriginal
148
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
149
- $this->assertEquals($entry->getValue(), 978276013);
150
- $this->assertEquals($entry->getText(), '2000:12:31 15:20:13');
151
-
152
- $entry = $ifd0_0->getEntry(36868); // DateTimeDigitized
153
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
154
- $this->assertEquals($entry->getValue(), 978276013);
155
- $this->assertEquals($entry->getText(), '2000:12:31 15:20:13');
156
-
157
- $entry = $ifd0_0->getEntry(37121); // ComponentsConfiguration
158
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
159
- $this->assertEquals($entry->getValue(), "\x01\x02\x03\0");
160
- $this->assertEquals($entry->getText(), 'Y Cb Cr -');
161
-
162
- $entry = $ifd0_0->getEntry(37122); // CompressedBitsPerPixel
163
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
164
- $this->assertEquals($entry->getValue(), [
165
- 0 => 4,
166
- 1 => 1
167
- ]);
168
- $this->assertEquals($entry->getText(), '4/1');
169
-
170
- $entry = $ifd0_0->getEntry(37380); // ExposureBiasValue
171
- $this->assertInstanceOf('lsolesen\pel\PelEntrySRational', $entry);
172
- $this->assertEquals($entry->getValue(), [
173
- 0 => 0,
174
- 1 => 10
175
- ]);
176
- $this->assertEquals($entry->getText(), '0.0');
177
-
178
- $entry = $ifd0_0->getEntry(37381); // MaxApertureValue
179
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
180
- $this->assertEquals($entry->getValue(), [
181
- 0 => 26,
182
- 1 => 10
183
- ]);
184
- $this->assertEquals($entry->getText(), '26/10');
185
-
186
- $entry = $ifd0_0->getEntry(37383); // MeteringMode
187
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
188
- $this->assertEquals($entry->getValue(), 5);
189
- $this->assertEquals($entry->getText(), 'Pattern');
190
-
191
- $entry = $ifd0_0->getEntry(37384); // LightSource
192
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
193
- $this->assertEquals($entry->getValue(), 0);
194
- $this->assertEquals($entry->getText(), 'Unknown');
195
-
196
- $entry = $ifd0_0->getEntry(37385); // Flash
197
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
198
- $this->assertEquals($entry->getValue(), 0);
199
- $this->assertEquals($entry->getText(), 'Flash did not fire.');
200
-
201
- $entry = $ifd0_0->getEntry(37386); // FocalLength
202
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
203
- $this->assertEquals($entry->getValue(), [
204
- 0 => 158,
205
- 1 => 10
206
- ]);
207
- $this->assertEquals($entry->getText(), '15.8 mm');
208
-
209
- $entry = $ifd0_0->getEntry(37500); // MakerNote
210
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
211
- $expected = "\x4e\x69\x6b\x6f\x6e\0\x01\0\x0b\0\x02\0\x02\0\x06\0\0\0\x26\x04\0\0\x03\0\x03\0\x01\0\0\0\x0c\0\0\0\x04\0\x03\0\x01\0\0\0\x01\0\0\0\x05\0\x03\0\x01\0\0\0\0\0\0\0\x06\0\x03\0\x01\0\0\0\0\0\0\0\x07\0\x03\0\x01\0\0\0\0\0\0\0\x08\0\x05\0\x01\0\0\0\x2c\x04\0\0\x09\0\x02\0\x14\0\0\0\x34\x04\0\0\x0a\0\x05\0\x01\0\0\0\x48\x04\0\0\x0b\0\x03\0\x01\0\0\0\0\0\0\0\0\x0f\x04\0\x1e\0\0\0\x50\x04\0\0\0\0\0\0\x30\x38\x2e\x30\x30\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x64\0\0\0\x01\x3e\0\x80\x01\x58\0\0\0\0\xff\x01\0\0\0\0\x0c\xe5\x10\x8c\0\0\0\0\x0a\x5b\0\0\x18\x6a\0\0\x23\x04\0\0\x11\x16\0\0\x11\x16\0\0\x1f\x05\x0c\x9f\0\x2f\0\0\0\0\x01\xcb\x02\x27\x02\x7b\x02\xd8\x03\x6a\x08\x5c\0\0\0\0\x10\x0e\x15\0\0\x01\x60\0\0\x30\0\0\0\x10\0\0\x5b\x18\x02\0\x48\x04\x16\x68\0\x0b\x58\x29\0\x3f\0\0\x15\x19\x15\x1a\x0f\xe1\x42\0\xff\0\x4f\x5d\x32\x0c\xa1\x02\0\0";
212
- $this->assertEquals($entry->getValue(), $expected);
213
- $this->assertEquals($entry->getText(), '308 bytes unknown MakerNote data');
214
-
215
- $entry = $ifd0_0->getEntry(37510); // UserComment
216
- $this->assertInstanceOf('lsolesen\pel\PelEntryUserComment', $entry);
217
- $this->assertEquals($entry->getValue(), ' ');
218
- $this->assertEquals($entry->getText(), ' ');
219
-
220
- $entry = $ifd0_0->getEntry(40960); // FlashPixVersion
221
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
222
- $this->assertEquals($entry->getValue(), 1);
223
- $this->assertEquals($entry->getText(), 'FlashPix Version 1.0');
224
-
225
- $entry = $ifd0_0->getEntry(40961); // ColorSpace
226
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
227
- $this->assertEquals($entry->getValue(), 1);
228
- $this->assertEquals($entry->getText(), 'sRGB');
229
-
230
- $entry = $ifd0_0->getEntry(40962); // PixelXDimension
231
- $this->assertInstanceOf('lsolesen\pel\PelEntryLong', $entry);
232
- $this->assertEquals($entry->getValue(), 1600);
233
- $this->assertEquals($entry->getText(), '1600');
234
-
235
- $entry = $ifd0_0->getEntry(40963); // PixelYDimension
236
- $this->assertInstanceOf('lsolesen\pel\PelEntryLong', $entry);
237
- $this->assertEquals($entry->getValue(), 1200);
238
- $this->assertEquals($entry->getText(), '1200');
239
-
240
- $entry = $ifd0_0->getEntry(41728); // FileSource
241
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
242
- $this->assertEquals($entry->getValue(), "\x03");
243
- $this->assertEquals($entry->getText(), 'DSC');
244
-
245
- $entry = $ifd0_0->getEntry(41729); // SceneType
246
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
247
- $this->assertEquals($entry->getValue(), "\x01");
248
- $this->assertEquals($entry->getText(), 'Directly photographed');
249
-
250
- /* Sub IFDs of $ifd0_0. */
251
- $this->assertEquals(count($ifd0_0->getSubIfds()), 1);
252
- $ifd0_0_0 = $ifd0_0->getSubIfd(4); // IFD Interoperability
253
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_0_0);
254
-
255
- /* Start of IDF $ifd0_0_0. */
256
- $this->assertEquals(count($ifd0_0_0->getEntries()), 2);
257
-
258
- $entry = $ifd0_0_0->getEntry(1); // InteroperabilityIndex
259
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
260
- $this->assertEquals($entry->getValue(), 'R98');
261
- $this->assertEquals($entry->getText(), 'R98');
262
-
263
- $entry = $ifd0_0_0->getEntry(2); // InteroperabilityVersion
264
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
265
- $this->assertEquals($entry->getValue(), 1);
266
- $this->assertEquals($entry->getText(), 'Interoperability Version 1.0');
267
-
268
- /* Sub IFDs of $ifd0_0_0. */
269
- $this->assertEquals(count($ifd0_0_0->getSubIfds()), 0);
270
-
271
- $this->assertEquals($ifd0_0_0->getThumbnailData(), '');
272
-
273
- /* Next IFD. */
274
- $ifd0_0_1 = $ifd0_0_0->getNextIfd();
275
- $this->assertNull($ifd0_0_1);
276
- /* End of IFD $ifd0_0_0. */
277
-
278
- $this->assertEquals($ifd0_0->getThumbnailData(), '');
279
-
280
- /* Next IFD. */
281
- $ifd0_1 = $ifd0_0->getNextIfd();
282
- $this->assertNull($ifd0_1);
283
- /* End of IFD $ifd0_0. */
284
-
285
- $this->assertEquals($ifd0->getThumbnailData(), '');
286
-
287
- /* Next IFD. */
288
- $ifd1 = $ifd0->getNextIfd();
289
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd1);
290
- /* End of IFD $ifd0. */
291
-
292
- /* Start of IDF $ifd1. */
293
- $this->assertEquals(count($ifd1->getEntries()), 4);
294
-
295
- $entry = $ifd1->getEntry(259); // Compression
296
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
297
- $this->assertEquals($entry->getValue(), 6);
298
- $this->assertEquals($entry->getText(), 'JPEG compression');
299
-
300
- $entry = $ifd1->getEntry(282); // XResolution
301
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
302
- $this->assertEquals($entry->getValue(), [
303
- 0 => 300,
304
- 1 => 1
305
- ]);
306
- $this->assertEquals($entry->getText(), '300/1');
307
-
308
- $entry = $ifd1->getEntry(283); // YResolution
309
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
310
- $this->assertEquals($entry->getValue(), [
311
- 0 => 300,
312
- 1 => 1
313
- ]);
314
- $this->assertEquals($entry->getText(), '300/1');
315
-
316
- $entry = $ifd1->getEntry(296); // ResolutionUnit
317
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
318
- $this->assertEquals($entry->getValue(), 2);
319
- $this->assertEquals($entry->getText(), 'Inch');
320
-
321
- /* Sub IFDs of $ifd1. */
322
- $this->assertEquals(count($ifd1->getSubIfds()), 0);
323
-
324
- $thumb_data = file_get_contents(dirname(__FILE__) . '/nikon-e950-thumb.jpg');
325
- $this->assertEquals($ifd1->getThumbnailData(), $thumb_data);
326
-
327
- /* Next IFD. */
328
- $ifd2 = $ifd1->getNextIfd();
329
- $this->assertNull($ifd2);
330
- /* End of IFD $ifd1. */
331
-
332
- $this->assertTrue(count(Pel::getExceptions()) == 0);
333
- }
334
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/OlympusC5050zTest.php DELETED
@@ -1,388 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * PEL: PHP Exif Library. A library with support for reading and
5
- * writing all Exif headers in JPEG and TIFF images using PHP.
6
- *
7
- * Copyright (C) 2005, 2006 Martin Geisler.
8
- *
9
- * This program is free software; you can redistribute it and/or modify
10
- * it under the terms of the GNU General Public License as published by
11
- * the Free Software Foundation; either version 2 of the License, or
12
- * (at your option) any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- * GNU General Public License for more details.
18
- *
19
- * You should have received a copy of the GNU General Public License
20
- * along with this program in the file COPYING; if not, write to the
21
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
22
- * Boston, MA 02110-1301 USA
23
- */
24
-
25
- namespace Pel\Test\imagetests;
26
-
27
- use lsolesen\pel\Pel;
28
- use lsolesen\pel\PelJpeg;
29
- use PHPUnit\Framework\TestCase;
30
-
31
- class OlympusC5050zTest extends TestCase
32
- {
33
- public function testRead()
34
- {
35
- Pel::clearExceptions();
36
- Pel::setStrictParsing(false);
37
- $jpeg = new PelJpeg(dirname(__FILE__) . '/olympus-c5050z.jpg');
38
-
39
- $exif = $jpeg->getExif();
40
- $this->assertInstanceOf('lsolesen\pel\PelExif', $exif);
41
-
42
- $tiff = $exif->getTiff();
43
- $this->assertInstanceOf('lsolesen\pel\PelTiff', $tiff);
44
-
45
- /* The first IFD. */
46
- $ifd0 = $tiff->getIfd();
47
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0);
48
-
49
- /* Start of IDF $ifd0. */
50
- $this->assertEquals(count($ifd0->getEntries()), 11);
51
-
52
- $entry = $ifd0->getEntry(270); // ImageDescription
53
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
54
- $this->assertEquals($entry->getValue(), 'OLYMPUS DIGITAL CAMERA ');
55
- $this->assertEquals($entry->getText(), 'OLYMPUS DIGITAL CAMERA ');
56
-
57
- $entry = $ifd0->getEntry(271); // Make
58
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
59
- $this->assertEquals($entry->getValue(), 'OLYMPUS OPTICAL CO.,LTD');
60
- $this->assertEquals($entry->getText(), 'OLYMPUS OPTICAL CO.,LTD');
61
-
62
- $entry = $ifd0->getEntry(272); // Model
63
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
64
- $this->assertEquals($entry->getValue(), 'C5050Z');
65
- $this->assertEquals($entry->getText(), 'C5050Z');
66
-
67
- $entry = $ifd0->getEntry(274); // Orientation
68
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
69
- $this->assertEquals($entry->getValue(), 1);
70
- $this->assertEquals($entry->getText(), 'top - left');
71
-
72
- $entry = $ifd0->getEntry(282); // XResolution
73
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
74
- $this->assertEquals($entry->getValue(), [
75
- 0 => 72,
76
- 1 => 1
77
- ]);
78
- $this->assertEquals($entry->getText(), '72/1');
79
-
80
- $entry = $ifd0->getEntry(283); // YResolution
81
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
82
- $this->assertEquals($entry->getValue(), [
83
- 0 => 72,
84
- 1 => 1
85
- ]);
86
- $this->assertEquals($entry->getText(), '72/1');
87
-
88
- $entry = $ifd0->getEntry(296); // ResolutionUnit
89
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
90
- $this->assertEquals($entry->getValue(), 2);
91
- $this->assertEquals($entry->getText(), 'Inch');
92
-
93
- $entry = $ifd0->getEntry(305); // Software
94
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
95
- $this->assertEquals($entry->getValue(), 'v558-83');
96
- $this->assertEquals($entry->getText(), 'v558-83');
97
-
98
- $entry = $ifd0->getEntry(306); // DateTime
99
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
100
- $this->assertEquals($entry->getValue(), false);
101
- $this->assertEquals($entry->getText(), '0000:00:00 00:00:00');
102
-
103
- $entry = $ifd0->getEntry(531); // YCbCrPositioning
104
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
105
- $this->assertEquals($entry->getValue(), 2);
106
- $this->assertEquals($entry->getText(), 'co-sited');
107
-
108
- $entry = $ifd0->getEntry(50341); // PrintIM
109
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
110
- $expected = "\x50\x72\x69\x6e\x74\x49\x4d\0\x30\x32\x35\x30\0\0\x14\0\x01\0\x14\0\x14\0\x02\0\x01\0\0\0\x03\0\x88\0\0\0\x07\0\0\0\0\0\x08\0\0\0\0\0\x09\0\0\0\0\0\x0a\0\0\0\0\0\x0b\0\xd0\0\0\0\x0c\0\0\0\0\0\x0d\0\0\0\0\0\x0e\0\xe8\0\0\0\0\x01\x01\0\0\0\x01\x01\xff\0\0\0\x02\x01\x83\0\0\0\x03\x01\x83\0\0\0\x04\x01\x80\0\0\0\x05\x01\x83\0\0\0\x06\x01\x83\0\0\0\x07\x01\x80\x80\x80\0\x10\x01\x80\0\0\0\x09\x11\0\0\x10\x27\0\0\x0b\x0f\0\0\x10\x27\0\0\x97\x05\0\0\x10\x27\0\0\xb0\x08\0\0\x10\x27\0\0\x01\x1c\0\0\x10\x27\0\0\x5e\x02\0\0\x10\x27\0\0\x8b\0\0\0\x10\x27\0\0\xcb\x03\0\0\x10\x27\0\0\xe5\x1b\0\0\x10\x27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
111
- $this->assertEquals($entry->getValue(), $expected);
112
- $this->assertEquals($entry->getText(), '(undefined)');
113
-
114
- /* Sub IFDs of $ifd0. */
115
- $this->assertEquals(count($ifd0->getSubIfds()), 1);
116
- $ifd0_0 = $ifd0->getSubIfd(2); // IFD Exif
117
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_0);
118
-
119
- /* Start of IDF $ifd0_0. */
120
- $this->assertEquals(count($ifd0_0->getEntries()), 32);
121
-
122
- $entry = $ifd0_0->getEntry(33434); // ExposureTime
123
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
124
- $this->assertEquals($entry->getValue(), [
125
- 0 => 10,
126
- 1 => 40
127
- ]);
128
- $this->assertEquals($entry->getText(), '1/4 sec.');
129
-
130
- $entry = $ifd0_0->getEntry(33437); // FNumber
131
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
132
- $this->assertEquals($entry->getValue(), [
133
- 0 => 26,
134
- 1 => 10
135
- ]);
136
- $this->assertEquals($entry->getText(), 'f/2.6');
137
-
138
- $entry = $ifd0_0->getEntry(34850); // ExposureProgram
139
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
140
- $this->assertEquals($entry->getValue(), 2);
141
- $this->assertEquals($entry->getText(), 'Normal program');
142
-
143
- $entry = $ifd0_0->getEntry(34855); // ISOSpeedRatings
144
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
145
- $this->assertEquals($entry->getValue(), 64);
146
- $this->assertEquals($entry->getText(), '64');
147
-
148
- $entry = $ifd0_0->getEntry(36864); // ExifVersion
149
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
150
- $this->assertEquals($entry->getValue(), 2.2);
151
- $this->assertEquals($entry->getText(), 'Exif Version 2.2');
152
-
153
- $entry = $ifd0_0->getEntry(36867); // DateTimeOriginal
154
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
155
- $this->assertEquals($entry->getValue(), false);
156
- $this->assertEquals($entry->getText(), '0000:00:00 00:00:00');
157
-
158
- $entry = $ifd0_0->getEntry(36868); // DateTimeDigitized
159
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
160
- $this->assertEquals($entry->getValue(), false);
161
- $this->assertEquals($entry->getText(), '0000:00:00 00:00:00');
162
-
163
- $entry = $ifd0_0->getEntry(37121); // ComponentsConfiguration
164
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
165
- $this->assertEquals($entry->getValue(), "\x01\x02\x03\0");
166
- $this->assertEquals($entry->getText(), 'Y Cb Cr -');
167
-
168
- $entry = $ifd0_0->getEntry(37122); // CompressedBitsPerPixel
169
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
170
- $this->assertEquals($entry->getValue(), [
171
- 0 => 2,
172
- 1 => 1
173
- ]);
174
- $this->assertEquals($entry->getText(), '2/1');
175
-
176
- $entry = $ifd0_0->getEntry(37380); // ExposureBiasValue
177
- $this->assertInstanceOf('lsolesen\pel\PelEntrySRational', $entry);
178
- $this->assertEquals($entry->getValue(), [
179
- 0 => 0,
180
- 1 => 10
181
- ]);
182
- $this->assertEquals($entry->getText(), '0.0');
183
-
184
- $entry = $ifd0_0->getEntry(37381); // MaxApertureValue
185
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
186
- $this->assertEquals($entry->getValue(), [
187
- 0 => 28,
188
- 1 => 10
189
- ]);
190
- $this->assertEquals($entry->getText(), '28/10');
191
-
192
- $entry = $ifd0_0->getEntry(37383); // MeteringMode
193
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
194
- $this->assertEquals($entry->getValue(), 5);
195
- $this->assertEquals($entry->getText(), 'Pattern');
196
-
197
- $entry = $ifd0_0->getEntry(37384); // LightSource
198
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
199
- $this->assertEquals($entry->getValue(), 0);
200
- $this->assertEquals($entry->getText(), 'Unknown');
201
-
202
- $entry = $ifd0_0->getEntry(37385); // Flash
203
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
204
- $this->assertEquals($entry->getValue(), 16);
205
- $this->assertEquals($entry->getText(), 'Flash did not fire, compulsory flash mode.');
206
-
207
- $entry = $ifd0_0->getEntry(37386); // FocalLength
208
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
209
- $this->assertEquals($entry->getValue(), [
210
- 0 => 213,
211
- 1 => 10
212
- ]);
213
- $this->assertEquals($entry->getText(), '21.3 mm');
214
-
215
- $entry = $ifd0_0->getEntry(37500); // MakerNote
216
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
217
- $expected = "\x4f\x4c\x59\x4d\x50\0\x01\0\x10\0\0\x02\x04\0\x03\0\0\0\xd6\x05\0\0\x01\x02\x03\0\x01\0\0\0\x01\0\0\0\x02\x02\x03\0\x01\0\0\0\0\0\0\0\x03\x02\x03\0\x01\0\0\0\0\0\0\0\x04\x02\x05\0\x01\0\0\0\xe2\x05\0\0\x05\x02\x05\0\x01\0\0\0\xea\x05\0\0\x06\x02\x08\0\x06\0\0\0\xf2\x05\0\0\x07\x02\x02\0\x08\0\0\0\xfe\x05\0\0\x08\x02\x02\0\x34\0\0\0\x06\x06\0\0\x09\x02\x07\0\x20\0\0\0\x42\x06\0\0\0\x03\x03\0\x01\0\0\0\0\0\0\0\x01\x03\x03\0\x01\0\0\0\0\0\0\0\x02\x03\x03\0\x01\0\0\0\x01\0\0\0\x03\x03\x03\0\x01\0\0\0\0\0\0\0\x04\x03\x03\0\x01\0\0\0\0\0\0\0\0\x0f\x07\0\xfe\0\0\0\x62\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x64\0\0\0\x64\0\0\0\x88\x03\0\0\x64\0\0\0\x03\0\x0d\0\x12\0\x19\0\x38\0\x49\0\x53\x58\x35\x35\x38\0\0\0\x5b\x70\x69\x63\x74\x75\x72\x65\x49\x6e\x66\x6f\x5d\x20\x52\x65\x73\x6f\x6c\x75\x74\x69\x6f\x6e\x3d\x31\x20\x5b\x43\x61\x6d\x65\x72\x61\x20\x49\x6e\x66\x6f\x5d\x20\x54\x79\x70\x65\x3d\x53\x58\x35\x35\x38\0\0\0\0\0\0\0\0\0\x4f\x4c\x59\x4d\x50\x55\x53\x20\x44\x49\x47\x49\x54\x41\x4c\x20\x43\x41\x4d\x45\x52\x41\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x31\xcf\x13\0\0\0\0\x01\xe8\x48\0\0\x03\xb5\0\x01\xe5\xd3\0\0\x14\x55\0\0\x14\x55\x01\0\x1f\0\x0b\xa9\0\x12\x03\x31\x01\0\x01\xc0\x01\xe6\x01\xfc\x01\xe9\xd0\0\0\xe8\x11\x4a\0\0\x14\x14\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x0b\x1c\0\0\x40\0\x0b\x19\0\0\0\x67\0\0\0\x67\0\xe8\x16\x49\0\0\0\x12\0\x03\xcb\xa6\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x19\x61\x12\x31\0\x76\x01\x3f\x01\xcf\x02\x59\x01\x15\x02\0\x02\x9c\0\x30\x0b\x95\x0d\x14\x02\0\0\xc9\x03\x8b\x02\0\x01\x6e\x03\x93\x03\xed\x01\x72\x01\0\xd0\x5b\0\x0c\0\x0c\0\x02\x03\x52\0\x01\0\0\0\0\0\x09\0\x32\0\x0a\0\0\0\x01\0\x48\0\x87\0\x64\0\x78\x0e\x0e\x0e\x0e\x11\x11\x11\x11\0\0\0\0\0\0\x14\x1d\x0e\x17\0\0\x0a\0\x1b\0\0\x1a\0\0\0\0\x01\0\x32\x0f\x42\x40\x0f\0\0\x64\x2a\x20\0\0";
218
- $this->assertEquals($entry->getValue(), $expected);
219
- $this->assertEquals($entry->getText(), '600 bytes unknown MakerNote data');
220
-
221
- $entry = $ifd0_0->getEntry(37510); // UserComment
222
- $this->assertInstanceOf('lsolesen\pel\PelEntryUserComment', $entry);
223
- $this->assertEquals($entry->getValue(), ' ');
224
- $this->assertEquals($entry->getText(), ' ');
225
-
226
- $entry = $ifd0_0->getEntry(40960); // FlashPixVersion
227
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
228
- $this->assertEquals($entry->getValue(), 1);
229
- $this->assertEquals($entry->getText(), 'FlashPix Version 1.0');
230
-
231
- $entry = $ifd0_0->getEntry(40961); // ColorSpace
232
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
233
- $this->assertEquals($entry->getValue(), 1);
234
- $this->assertEquals($entry->getText(), 'sRGB');
235
-
236
- $entry = $ifd0_0->getEntry(40962); // PixelXDimension
237
- $this->assertInstanceOf('lsolesen\pel\PelEntryLong', $entry);
238
- $this->assertEquals($entry->getValue(), 640);
239
- $this->assertEquals($entry->getText(), '640');
240
-
241
- $entry = $ifd0_0->getEntry(40963); // PixelYDimension
242
- $this->assertInstanceOf('lsolesen\pel\PelEntryLong', $entry);
243
- $this->assertEquals($entry->getValue(), 480);
244
- $this->assertEquals($entry->getText(), '480');
245
-
246
- $entry = $ifd0_0->getEntry(41728); // FileSource
247
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
248
- $this->assertEquals($entry->getValue(), "\x03");
249
- $this->assertEquals($entry->getText(), 'DSC');
250
-
251
- $entry = $ifd0_0->getEntry(41729); // SceneType
252
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
253
- $this->assertEquals($entry->getValue(), "\x01");
254
- $this->assertEquals($entry->getText(), 'Directly photographed');
255
-
256
- $entry = $ifd0_0->getEntry(41985); // CustomRendered
257
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
258
- $this->assertEquals($entry->getValue(), 0);
259
- $this->assertEquals($entry->getText(), 'Normal process');
260
-
261
- $entry = $ifd0_0->getEntry(41986); // ExposureMode
262
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
263
- $this->assertEquals($entry->getValue(), 0);
264
- $this->assertEquals($entry->getText(), 'Auto exposure');
265
-
266
- $entry = $ifd0_0->getEntry(41987); // WhiteBalance
267
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
268
- $this->assertEquals($entry->getValue(), 1);
269
- $this->assertEquals($entry->getText(), 'Manual white balance');
270
-
271
- $entry = $ifd0_0->getEntry(41988); // DigitalZoomRatio
272
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
273
- $this->assertEquals($entry->getValue(), [
274
- 0 => 0,
275
- 1 => 100
276
- ]);
277
- $this->assertEquals($entry->getText(), '0/100');
278
-
279
- $entry = $ifd0_0->getEntry(41990); // SceneCaptureType
280
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
281
- $this->assertEquals($entry->getValue(), 0);
282
- $this->assertEquals($entry->getText(), 'Standard');
283
-
284
- $entry = $ifd0_0->getEntry(41991); // GainControl
285
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
286
- $this->assertEquals($entry->getValue(), 0);
287
- $this->assertEquals($entry->getText(), 'Normal');
288
-
289
- $entry = $ifd0_0->getEntry(41992); // Contrast
290
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
291
- $this->assertEquals($entry->getValue(), 0);
292
- $this->assertEquals($entry->getText(), 'Normal');
293
-
294
- $entry = $ifd0_0->getEntry(41993); // Saturation
295
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
296
- $this->assertEquals($entry->getValue(), 0);
297
- $this->assertEquals($entry->getText(), 'Normal');
298
-
299
- $entry = $ifd0_0->getEntry(41994); // Sharpness
300
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
301
- $this->assertEquals($entry->getValue(), 0);
302
- $this->assertEquals($entry->getText(), 'Normal');
303
-
304
- /* Sub IFDs of $ifd0_0. */
305
- $this->assertEquals(count($ifd0_0->getSubIfds()), 1);
306
- $ifd0_0_0 = $ifd0_0->getSubIfd(4); // IFD Interoperability
307
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_0_0);
308
-
309
- /* Start of IDF $ifd0_0_0. */
310
- $this->assertEquals(count($ifd0_0_0->getEntries()), 2);
311
-
312
- $entry = $ifd0_0_0->getEntry(1); // InteroperabilityIndex
313
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
314
- $this->assertEquals($entry->getValue(), 'R98');
315
- $this->assertEquals($entry->getText(), 'R98');
316
-
317
- $entry = $ifd0_0_0->getEntry(2); // InteroperabilityVersion
318
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
319
- $this->assertEquals($entry->getValue(), 1);
320
- $this->assertEquals($entry->getText(), 'Interoperability Version 1.0');
321
-
322
- /* Sub IFDs of $ifd0_0_0. */
323
- $this->assertEquals(count($ifd0_0_0->getSubIfds()), 0);
324
-
325
- $this->assertEquals($ifd0_0_0->getThumbnailData(), '');
326
-
327
- /* Next IFD. */
328
- $ifd0_0_1 = $ifd0_0_0->getNextIfd();
329
- $this->assertNull($ifd0_0_1);
330
- /* End of IFD $ifd0_0_0. */
331
-
332
- $this->assertEquals($ifd0_0->getThumbnailData(), '');
333
-
334
- /* Next IFD. */
335
- $ifd0_1 = $ifd0_0->getNextIfd();
336
- $this->assertNull($ifd0_1);
337
- /* End of IFD $ifd0_0. */
338
-
339
- $this->assertEquals($ifd0->getThumbnailData(), '');
340
-
341
- /* Next IFD. */
342
- $ifd1 = $ifd0->getNextIfd();
343
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd1);
344
- /* End of IFD $ifd0. */
345
-
346
- /* Start of IDF $ifd1. */
347
- $this->assertEquals(count($ifd1->getEntries()), 4);
348
-
349
- $entry = $ifd1->getEntry(259); // Compression
350
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
351
- $this->assertEquals($entry->getValue(), 6);
352
- $this->assertEquals($entry->getText(), 'JPEG compression');
353
-
354
- $entry = $ifd1->getEntry(282); // XResolution
355
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
356
- $this->assertEquals($entry->getValue(), [
357
- 0 => 72,
358
- 1 => 1
359
- ]);
360
- $this->assertEquals($entry->getText(), '72/1');
361
-
362
- $entry = $ifd1->getEntry(283); // YResolution
363
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
364
- $this->assertEquals($entry->getValue(), [
365
- 0 => 72,
366
- 1 => 1
367
- ]);
368
- $this->assertEquals($entry->getText(), '72/1');
369
-
370
- $entry = $ifd1->getEntry(296); // ResolutionUnit
371
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
372
- $this->assertEquals($entry->getValue(), 2);
373
- $this->assertEquals($entry->getText(), 'Inch');
374
-
375
- /* Sub IFDs of $ifd1. */
376
- $this->assertEquals(count($ifd1->getSubIfds()), 0);
377
-
378
- $thumb_data = file_get_contents(dirname(__FILE__) . '/olympus-c5050z-thumb.jpg');
379
- $this->assertEquals($ifd1->getThumbnailData(), $thumb_data);
380
-
381
- /* Next IFD. */
382
- $ifd2 = $ifd1->getNextIfd();
383
- $this->assertNull($ifd2);
384
- /* End of IFD $ifd1. */
385
-
386
- $this->assertTrue(count(Pel::getExceptions()) == 0);
387
- }
388
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/OlympusC50zTest.php DELETED
@@ -1,376 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * PEL: PHP Exif Library. A library with support for reading and
5
- * writing all Exif headers in JPEG and TIFF images using PHP.
6
- *
7
- * Copyright (C) 2005, 2006 Martin Geisler.
8
- *
9
- * This program is free software; you can redistribute it and/or modify
10
- * it under the terms of the GNU General Public License as published by
11
- * the Free Software Foundation; either version 2 of the License, or
12
- * (at your option) any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- * GNU General Public License for more details.
18
- *
19
- * You should have received a copy of the GNU General Public License
20
- * along with this program in the file COPYING; if not, write to the
21
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
22
- * Boston, MA 02110-1301 USA
23
- */
24
-
25
- namespace Pel\Test\imagetests;
26
-
27
- use lsolesen\pel\Pel;
28
- use lsolesen\pel\PelJpeg;
29
- use PHPUnit\Framework\TestCase;
30
-
31
- class OlympusC50zTest extends TestCase
32
- {
33
-
34
- public function testRead()
35
- {
36
- Pel::clearExceptions();
37
- Pel::setStrictParsing(false);
38
- $jpeg = new PelJpeg(dirname(__FILE__) . '/olympus-c50z.jpg');
39
-
40
- $exif = $jpeg->getExif();
41
- $this->assertInstanceOf('lsolesen\pel\PelExif', $exif);
42
-
43
- $tiff = $exif->getTiff();
44
- $this->assertInstanceOf('lsolesen\pel\PelTiff', $tiff);
45
-
46
- /* The first IFD. */
47
- $ifd0 = $tiff->getIfd();
48
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0);
49
-
50
- /* Start of IDF $ifd0. */
51
- $this->assertEquals(count($ifd0->getEntries()), 11);
52
-
53
- $entry = $ifd0->getEntry(270); // ImageDescription
54
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
55
- $this->assertEquals($entry->getValue(), 'OLYMPUS DIGITAL CAMERA ');
56
- $this->assertEquals($entry->getText(), 'OLYMPUS DIGITAL CAMERA ');
57
-
58
- $entry = $ifd0->getEntry(271); // Make
59
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
60
- $this->assertEquals($entry->getValue(), 'OLYMPUS OPTICAL CO.,LTD');
61
- $this->assertEquals($entry->getText(), 'OLYMPUS OPTICAL CO.,LTD');
62
-
63
- $entry = $ifd0->getEntry(272); // Model
64
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
65
- $this->assertEquals($entry->getValue(), 'X-2,C-50Z ');
66
- $this->assertEquals($entry->getText(), 'X-2,C-50Z ');
67
-
68
- $entry = $ifd0->getEntry(274); // Orientation
69
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
70
- $this->assertEquals($entry->getValue(), 1);
71
- $this->assertEquals($entry->getText(), 'top - left');
72
-
73
- $entry = $ifd0->getEntry(282); // XResolution
74
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
75
- $this->assertEquals($entry->getValue(), [
76
- 0 => 144,
77
- 1 => 1
78
- ]);
79
- $this->assertEquals($entry->getText(), '144/1');
80
-
81
- $entry = $ifd0->getEntry(283); // YResolution
82
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
83
- $this->assertEquals($entry->getValue(), [
84
- 0 => 144,
85
- 1 => 1
86
- ]);
87
- $this->assertEquals($entry->getText(), '144/1');
88
-
89
- $entry = $ifd0->getEntry(296); // ResolutionUnit
90
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
91
- $this->assertEquals($entry->getValue(), 2);
92
- $this->assertEquals($entry->getText(), 'Inch');
93
-
94
- $entry = $ifd0->getEntry(305); // Software
95
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
96
- $this->assertEquals($entry->getValue(), '28-1012 ');
97
- $this->assertEquals($entry->getText(), '28-1012 ');
98
-
99
- $entry = $ifd0->getEntry(306); // DateTime
100
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
101
- $this->assertEquals($entry->getValue(), false);
102
- $this->assertEquals($entry->getText(), '0000:00:00 00:00:00');
103
-
104
- $entry = $ifd0->getEntry(531); // YCbCrPositioning
105
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
106
- $this->assertEquals($entry->getValue(), 2);
107
- $this->assertEquals($entry->getText(), 'co-sited');
108
-
109
- $entry = $ifd0->getEntry(50341); // PrintIM
110
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
111
- $expected = "\x50\x72\x69\x6e\x74\x49\x4d\0\x30\x32\x35\x30\0\0\x14\0\x01\0\x12\0\x12\0\x02\0\x01\0\0\0\x03\0\x88\0\0\0\x07\0\0\0\0\0\x08\0\0\0\0\0\x09\0\0\0\0\0\x0a\0\0\0\0\0\x0b\0\xd0\0\0\0\x0c\0\0\0\0\0\x0d\0\0\0\0\0\x0e\0\xe8\0\0\0\0\x01\x01\0\0\0\x01\x01\xff\0\0\0\x02\x01\x80\0\0\0\x03\x01\x80\0\0\0\x04\x01\x80\0\0\0\x05\x01\x80\0\0\0\x06\x01\x80\0\0\0\x07\x01\x80\x80\x80\0\x10\x01\x80\0\0\0\x09\x11\0\0\x10\x27\0\0\x0b\x0f\0\0\x10\x27\0\0\x97\x05\0\0\x10\x27\0\0\xb0\x08\0\0\x10\x27\0\0\x01\x1c\0\0\x10\x27\0\0\x5e\x02\0\0\x10\x27\0\0\x8b\0\0\0\x10\x27\0\0\xcb\x03\0\0\x10\x27\0\0\xe5\x1b\0\0\x10\x27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
112
- $this->assertEquals($entry->getValue(), $expected);
113
- $this->assertEquals($entry->getText(), '(undefined)');
114
-
115
- /* Sub IFDs of $ifd0. */
116
- $this->assertEquals(count($ifd0->getSubIfds()), 1);
117
- $ifd0_0 = $ifd0->getSubIfd(2); // IFD Exif
118
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_0);
119
-
120
- /* Start of IDF $ifd0_0. */
121
- $this->assertEquals(count($ifd0_0->getEntries()), 30);
122
-
123
- $entry = $ifd0_0->getEntry(33434); // ExposureTime
124
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
125
- $this->assertEquals($entry->getValue(), [
126
- 0 => 1,
127
- 1 => 80
128
- ]);
129
- $this->assertEquals($entry->getText(), '1/80 sec.');
130
-
131
- $entry = $ifd0_0->getEntry(33437); // FNumber
132
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
133
- $this->assertEquals($entry->getValue(), [
134
- 0 => 45,
135
- 1 => 10
136
- ]);
137
- $this->assertEquals($entry->getText(), 'f/4.5');
138
-
139
- $entry = $ifd0_0->getEntry(34850); // ExposureProgram
140
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
141
- $this->assertEquals($entry->getValue(), 5);
142
- $this->assertEquals($entry->getText(), 'Creative program (biased toward depth of field)');
143
-
144
- $entry = $ifd0_0->getEntry(34855); // ISOSpeedRatings
145
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
146
- $this->assertEquals($entry->getValue(), 80);
147
- $this->assertEquals($entry->getText(), '80');
148
-
149
- $entry = $ifd0_0->getEntry(36864); // ExifVersion
150
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
151
- $this->assertEquals($entry->getValue(), 2.2);
152
- $this->assertEquals($entry->getText(), 'Exif Version 2.2');
153
-
154
- $entry = $ifd0_0->getEntry(36867); // DateTimeOriginal
155
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
156
- $this->assertEquals($entry->getValue(), false);
157
- $this->assertEquals($entry->getText(), '0000:00:00 00:00:00');
158
-
159
- $entry = $ifd0_0->getEntry(36868); // DateTimeDigitized
160
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
161
- $this->assertEquals($entry->getValue(), false);
162
- $this->assertEquals($entry->getText(), '0000:00:00 00:00:00');
163
-
164
- $entry = $ifd0_0->getEntry(37121); // ComponentsConfiguration
165
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
166
- $this->assertEquals($entry->getValue(), "\x01\x02\x03\0");
167
- $this->assertEquals($entry->getText(), 'Y Cb Cr -');
168
-
169
- $entry = $ifd0_0->getEntry(37380); // ExposureBiasValue
170
- $this->assertInstanceOf('lsolesen\pel\PelEntrySRational', $entry);
171
- $this->assertEquals($entry->getValue(), [
172
- 0 => 0,
173
- 1 => 10
174
- ]);
175
- $this->assertEquals($entry->getText(), '0.0');
176
-
177
- $entry = $ifd0_0->getEntry(37381); // MaxApertureValue
178
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
179
- $this->assertEquals($entry->getValue(), [
180
- 0 => 300,
181
- 1 => 100
182
- ]);
183
- $this->assertEquals($entry->getText(), '300/100');
184
-
185
- $entry = $ifd0_0->getEntry(37383); // MeteringMode
186
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
187
- $this->assertEquals($entry->getValue(), 5);
188
- $this->assertEquals($entry->getText(), 'Pattern');
189
-
190
- $entry = $ifd0_0->getEntry(37384); // LightSource
191
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
192
- $this->assertEquals($entry->getValue(), 0);
193
- $this->assertEquals($entry->getText(), 'Unknown');
194
-
195
- $entry = $ifd0_0->getEntry(37385); // Flash
196
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
197
- $this->assertEquals($entry->getValue(), 25);
198
- $this->assertEquals($entry->getText(), 'Flash fired, auto mode.');
199
-
200
- $entry = $ifd0_0->getEntry(37386); // FocalLength
201
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
202
- $this->assertEquals($entry->getValue(), [
203
- 0 => 1883,
204
- 1 => 100
205
- ]);
206
- $this->assertEquals($entry->getText(), '18.8 mm');
207
-
208
- $entry = $ifd0_0->getEntry(37500); // MakerNote
209
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
210
- $expected = "\x4f\x4c\x59\x4d\x50\0\x01\0\x3e\0\0\x02\x04\0\x03\0\0\0\x24\x0f\0\0\x01\x02\x03\0\x01\0\0\0\x02\0\0\0\x02\x02\x03\0\x01\0\0\0\0\0\0\0\x03\x02\x03\0\x01\0\0\0\0\0\0\0\x04\x02\x05\0\x01\0\0\0\x38\x0f\0\0\x05\x02\x05\0\x01\0\0\0\x40\x0f\0\0\x06\x02\x08\0\x06\0\0\0\x48\x0f\0\0\x07\x02\x02\0\x06\0\0\0\x54\x0f\0\0\x09\x02\x07\0\x20\0\0\0\x5a\x0f\0\0\0\x10\x0a\0\x01\0\0\0\x7c\x0f\0\0\x01\x10\x0a\0\x01\0\0\0\x84\x0f\0\0\x02\x10\x0a\0\x01\0\0\0\x8c\x0f\0\0\x03\x10\x0a\0\x01\0\0\0\x94\x0f\0\0\x04\x10\x03\0\x01\0\0\0\0\0\0\0\x05\x10\x03\0\x02\0\0\0\0\0\0\0\x06\x10\x0a\0\x01\0\0\0\xa4\x0f\0\0\x09\x10\x03\0\x01\0\0\0\x01\0\0\0\x0a\x10\x03\0\x01\0\0\0\0\0\0\0\x0b\x10\x03\0\x01\0\0\0\0\0\0\0\x0c\x10\x05\0\x01\0\0\0\xb8\x0f\0\0\x0d\x10\x03\0\x01\0\0\0\x1c\0\x51\x01\x0e\x10\x03\0\x01\0\0\0\x51\x01\x02\0\x0f\x10\x03\0\x01\0\0\0\x02\0\0\0\x10\x10\x03\0\x01\0\0\0\0\0\0\0\x11\x10\x03\0\x09\0\0\0\x36\x10\0\0\x12\x10\x03\0\x04\0\0\0\x48\x10\0\0\x13\x10\x03\0\x01\0\0\0\0\0\0\0\x14\x10\x03\0\x01\0\0\0\0\0\x01\0\x15\x10\x03\0\x02\0\0\0\x01\0\0\0\x16\x10\x03\0\x01\0\0\0\0\0\x70\x01\x17\x10\x03\0\x02\0\0\0\x70\x01\x40\0\x18\x10\x03\0\x02\0\0\0\x26\x01\x40\0\x1a\x10\x02\0\x20\0\0\0\xdc\x0f\0\0\x1b\x10\x04\0\x01\0\0\0\0\0\0\0\x1c\x10\x04\0\x01\0\0\0\0\0\0\0\x1d\x10\x04\0\x01\0\0\0\xe8\xb8\x03\0\x1e\x10\x04\0\x01\0\0\0\0\0\0\0\x1f\x10\x04\0\x01\0\0\0\0\0\0\0\x20\x10\x04\0\x01\0\0\0\0\0\0\0\x21\x10\x04\0\x01\0\0\0\xb0\x27\0\0\x22\x10\x04\0\x01\0\0\0\x20\x6e\x0f\x04\x23\x10\x0a\0\x01\0\0\0\x1c\x10\0\0\x24\x10\x03\0\x01\0\0\0\x36\0\0\0\x25\x10\x0a\0\x01\0\0\0\x28\x10\0\0\x26\x10\x03\0\x01\0\0\0\0\0\0\0\x27\x10\x03\0\x01\0\0\0\0\0\0\0\x28\x10\x03\0\x01\0\0\0\0\0\x64\x01\x29\x10\x03\0\x01\0\0\0\x02\0\0\x02\x2a\x10\x03\0\x01\0\0\0\0\x02\x18\0\x2b\x10\x03\0\x06\0\0\0\x54\x10\0\0\x2c\x10\x03\0\x02\0\0\0\x0a\0\0\0\x2d\x10\x03\0\x01\0\0\0\0\x08\0\0\x2e\x10\x04\0\x01\0\0\0\0\x0a\0\0\x2f\x10\x04\0\x01\0\0\0\x80\x07\0\0\x30\x10\x03\0\x01\0\0\0\x02\0\0\0\x31\x10\x04\0\x08\0\0\0\x74\x10\0\0\x33\x10\x04\0\xd0\x02\0\0\xa0\x10\0\0\x38\x10\x03\0\x01\0\0\0\0\0\0\0\x3b\x10\x03\0\x01\0\0\0\x21\x01\xbe\x01\x3c\x10\x03\0\x01\0\0\0\xbe\x01\0\0\x3d\x10\x0a\0\x01\0\0\0\xe4\x1b\0\0\x3e\x10\x0a\0\x01\0\0\0\xec\x1b\0\0\0\0\0\0";
211
- $this->assertEquals($entry->getValue(), $expected);
212
- $this->assertEquals($entry->getText(), '758 bytes unknown MakerNote data');
213
-
214
- $entry = $ifd0_0->getEntry(37510); // UserComment
215
- $this->assertInstanceOf('lsolesen\pel\PelEntryUserComment', $entry);
216
- $this->assertEquals($entry->getValue(), ' ');
217
- $this->assertEquals($entry->getText(), ' ');
218
-
219
- $entry = $ifd0_0->getEntry(40960); // FlashPixVersion
220
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
221
- $this->assertEquals($entry->getValue(), 1);
222
- $this->assertEquals($entry->getText(), 'FlashPix Version 1.0');
223
-
224
- $entry = $ifd0_0->getEntry(40961); // ColorSpace
225
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
226
- $this->assertEquals($entry->getValue(), 1);
227
- $this->assertEquals($entry->getText(), 'sRGB');
228
-
229
- $entry = $ifd0_0->getEntry(40962); // PixelXDimension
230
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
231
- $this->assertEquals($entry->getValue(), 2560);
232
- $this->assertEquals($entry->getText(), '2560');
233
-
234
- $entry = $ifd0_0->getEntry(40963); // PixelYDimension
235
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
236
- $this->assertEquals($entry->getValue(), 1920);
237
- $this->assertEquals($entry->getText(), '1920');
238
-
239
- $entry = $ifd0_0->getEntry(41728); // FileSource
240
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
241
- $this->assertEquals($entry->getValue(), "\x03");
242
- $this->assertEquals($entry->getText(), 'DSC');
243
-
244
- $entry = $ifd0_0->getEntry(41985); // CustomRendered
245
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
246
- $this->assertEquals($entry->getValue(), 0);
247
- $this->assertEquals($entry->getText(), 'Normal process');
248
-
249
- $entry = $ifd0_0->getEntry(41986); // ExposureMode
250
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
251
- $this->assertEquals($entry->getValue(), 0);
252
- $this->assertEquals($entry->getText(), 'Auto exposure');
253
-
254
- $entry = $ifd0_0->getEntry(41987); // WhiteBalance
255
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
256
- $this->assertEquals($entry->getValue(), 0);
257
- $this->assertEquals($entry->getText(), 'Auto white balance');
258
-
259
- $entry = $ifd0_0->getEntry(41988); // DigitalZoomRatio
260
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
261
- $this->assertEquals($entry->getValue(), [
262
- 0 => 100,
263
- 1 => 100
264
- ]);
265
- $this->assertEquals($entry->getText(), '100/100');
266
-
267
- $entry = $ifd0_0->getEntry(41990); // SceneCaptureType
268
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
269
- $this->assertEquals($entry->getValue(), 2);
270
- $this->assertEquals($entry->getText(), 'Portrait');
271
-
272
- $entry = $ifd0_0->getEntry(41991); // GainControl
273
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
274
- $this->assertEquals($entry->getValue(), 0);
275
- $this->assertEquals($entry->getText(), 'Normal');
276
-
277
- $entry = $ifd0_0->getEntry(41992); // Contrast
278
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
279
- $this->assertEquals($entry->getValue(), 0);
280
- $this->assertEquals($entry->getText(), 'Normal');
281
-
282
- $entry = $ifd0_0->getEntry(41993); // Saturation
283
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
284
- $this->assertEquals($entry->getValue(), 0);
285
- $this->assertEquals($entry->getText(), 'Normal');
286
-
287
- $entry = $ifd0_0->getEntry(41994); // Sharpness
288
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
289
- $this->assertEquals($entry->getValue(), 0);
290
- $this->assertEquals($entry->getText(), 'Normal');
291
-
292
- /* Sub IFDs of $ifd0_0. */
293
- $this->assertEquals(count($ifd0_0->getSubIfds()), 1);
294
- $ifd0_0_0 = $ifd0_0->getSubIfd(4); // IFD Interoperability
295
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_0_0);
296
-
297
- /* Start of IDF $ifd0_0_0. */
298
- $this->assertEquals(count($ifd0_0_0->getEntries()), 2);
299
-
300
- $entry = $ifd0_0_0->getEntry(1); // InteroperabilityIndex
301
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
302
- $this->assertEquals($entry->getValue(), 'R98');
303
- $this->assertEquals($entry->getText(), 'R98');
304
-
305
- $entry = $ifd0_0_0->getEntry(2); // InteroperabilityVersion
306
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
307
- $this->assertEquals($entry->getValue(), 1);
308
- $this->assertEquals($entry->getText(), 'Interoperability Version 1.0');
309
-
310
- /* Sub IFDs of $ifd0_0_0. */
311
- $this->assertEquals(count($ifd0_0_0->getSubIfds()), 0);
312
-
313
- $this->assertEquals($ifd0_0_0->getThumbnailData(), '');
314
-
315
- /* Next IFD. */
316
- $ifd0_0_1 = $ifd0_0_0->getNextIfd();
317
- $this->assertNull($ifd0_0_1);
318
- /* End of IFD $ifd0_0_0. */
319
-
320
- $this->assertEquals($ifd0_0->getThumbnailData(), '');
321
-
322
- /* Next IFD. */
323
- $ifd0_1 = $ifd0_0->getNextIfd();
324
- $this->assertNull($ifd0_1);
325
- /* End of IFD $ifd0_0. */
326
-
327
- $this->assertEquals($ifd0->getThumbnailData(), '');
328
-
329
- /* Next IFD. */
330
- $ifd1 = $ifd0->getNextIfd();
331
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd1);
332
- /* End of IFD $ifd0. */
333
-
334
- /* Start of IDF $ifd1. */
335
- $this->assertEquals(count($ifd1->getEntries()), 4);
336
-
337
- $entry = $ifd1->getEntry(259); // Compression
338
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
339
- $this->assertEquals($entry->getValue(), 6);
340
- $this->assertEquals($entry->getText(), 'JPEG compression');
341
-
342
- $entry = $ifd1->getEntry(282); // XResolution
343
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
344
- $this->assertEquals($entry->getValue(), [
345
- 0 => 72,
346
- 1 => 1
347
- ]);
348
- $this->assertEquals($entry->getText(), '72/1');
349
-
350
- $entry = $ifd1->getEntry(283); // YResolution
351
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
352
- $this->assertEquals($entry->getValue(), [
353
- 0 => 72,
354
- 1 => 1
355
- ]);
356
- $this->assertEquals($entry->getText(), '72/1');
357
-
358
- $entry = $ifd1->getEntry(296); // ResolutionUnit
359
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
360
- $this->assertEquals($entry->getValue(), 2);
361
- $this->assertEquals($entry->getText(), 'Inch');
362
-
363
- /* Sub IFDs of $ifd1. */
364
- $this->assertEquals(count($ifd1->getSubIfds()), 0);
365
-
366
- $thumb_data = file_get_contents(dirname(__FILE__) . '/olympus-c50z-thumb.jpg');
367
- $this->assertEquals($ifd1->getThumbnailData(), $thumb_data);
368
-
369
- /* Next IFD. */
370
- $ifd2 = $ifd1->getNextIfd();
371
- $this->assertNull($ifd2);
372
- /* End of IFD $ifd1. */
373
-
374
- $this->assertTrue(count(Pel::getExceptions()) == 0);
375
- }
376
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/OlympusC765uzTest.php DELETED
@@ -1,388 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * PEL: PHP Exif Library. A library with support for reading and
5
- * writing all Exif headers in JPEG and TIFF images using PHP.
6
- *
7
- * Copyright (C) 2005, 2006 Martin Geisler.
8
- *
9
- * This program is free software; you can redistribute it and/or modify
10
- * it under the terms of the GNU General Public License as published by
11
- * the Free Software Foundation; either version 2 of the License, or
12
- * (at your option) any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- * GNU General Public License for more details.
18
- *
19
- * You should have received a copy of the GNU General Public License
20
- * along with this program in the file COPYING; if not, write to the
21
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
22
- * Boston, MA 02110-1301 USA
23
- */
24
-
25
- namespace Pel\Test\imagetests;
26
-
27
- use lsolesen\pel\Pel;
28
- use lsolesen\pel\PelJpeg;
29
- use PHPUnit\Framework\TestCase;
30
-
31
- class OlympusC765uzTest extends TestCase
32
- {
33
- public function testRead()
34
- {
35
- Pel::clearExceptions();
36
- Pel::setStrictParsing(false);
37
- $jpeg = new PelJpeg(dirname(__FILE__) . '/olympus-c765uz.jpg');
38
-
39
- $exif = $jpeg->getExif();
40
- $this->assertInstanceOf('lsolesen\pel\PelExif', $exif);
41
-
42
- $tiff = $exif->getTiff();
43
- $this->assertInstanceOf('lsolesen\pel\PelTiff', $tiff);
44
-
45
- /* The first IFD. */
46
- $ifd0 = $tiff->getIfd();
47
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0);
48
-
49
- /* Start of IDF $ifd0. */
50
- $this->assertEquals(count($ifd0->getEntries()), 11);
51
-
52
- $entry = $ifd0->getEntry(270); // ImageDescription
53
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
54
- $this->assertEquals($entry->getValue(), 'OLYMPUS DIGITAL CAMERA ');
55
- $this->assertEquals($entry->getText(), 'OLYMPUS DIGITAL CAMERA ');
56
-
57
- $entry = $ifd0->getEntry(271); // Make
58
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
59
- $this->assertEquals($entry->getValue(), 'OLYMPUS CORPORATION');
60
- $this->assertEquals($entry->getText(), 'OLYMPUS CORPORATION');
61
-
62
- $entry = $ifd0->getEntry(272); // Model
63
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
64
- $this->assertEquals($entry->getValue(), 'C765UZ');
65
- $this->assertEquals($entry->getText(), 'C765UZ');
66
-
67
- $entry = $ifd0->getEntry(274); // Orientation
68
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
69
- $this->assertEquals($entry->getValue(), 1);
70
- $this->assertEquals($entry->getText(), 'top - left');
71
-
72
- $entry = $ifd0->getEntry(282); // XResolution
73
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
74
- $this->assertEquals($entry->getValue(), [
75
- 0 => 72,
76
- 1 => 1
77
- ]);
78
- $this->assertEquals($entry->getText(), '72/1');
79
-
80
- $entry = $ifd0->getEntry(283); // YResolution
81
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
82
- $this->assertEquals($entry->getValue(), [
83
- 0 => 72,
84
- 1 => 1
85
- ]);
86
- $this->assertEquals($entry->getText(), '72/1');
87
-
88
- $entry = $ifd0->getEntry(296); // ResolutionUnit
89
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
90
- $this->assertEquals($entry->getValue(), 2);
91
- $this->assertEquals($entry->getText(), 'Inch');
92
-
93
- $entry = $ifd0->getEntry(305); // Software
94
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
95
- $this->assertEquals($entry->getValue(), 'v777-76');
96
- $this->assertEquals($entry->getText(), 'v777-76');
97
-
98
- $entry = $ifd0->getEntry(306); // DateTime
99
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
100
- $this->assertEquals($entry->getValue(), 1090073972);
101
- $this->assertEquals($entry->getText(), '2004:07:17 14:19:32');
102
-
103
- $entry = $ifd0->getEntry(531); // YCbCrPositioning
104
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
105
- $this->assertEquals($entry->getValue(), 2);
106
- $this->assertEquals($entry->getText(), 'co-sited');
107
-
108
- $entry = $ifd0->getEntry(50341); // PrintIM
109
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
110
- $expected = "\x50\x72\x69\x6e\x74\x49\x4d\0\x30\x32\x35\x30\0\0\x14\0\x01\0\x12\0\x12\0\x02\0\x01\0\0\0\x03\0\x88\0\0\0\x07\0\0\0\0\0\x08\0\0\0\0\0\x09\0\0\0\0\0\x0a\0\0\0\0\0\x0b\0\xd0\0\0\0\x0c\0\0\0\0\0\x0d\0\0\0\0\0\x0e\0\xe8\0\0\0\0\x01\x01\0\0\0\x01\x01\xff\0\0\0\x02\x01\x80\0\0\0\x03\x01\x80\0\0\0\x04\x01\x80\0\0\0\x05\x01\x80\0\0\0\x06\x01\x80\0\0\0\x07\x01\x80\x80\x80\0\x10\x01\x80\0\0\0\x09\x11\0\0\x10\x27\0\0\x0b\x0f\0\0\x10\x27\0\0\x97\x05\0\0\x10\x27\0\0\xb0\x08\0\0\x10\x27\0\0\x01\x1c\0\0\x10\x27\0\0\x5e\x02\0\0\x10\x27\0\0\x8b\0\0\0\x10\x27\0\0\xcb\x03\0\0\x10\x27\0\0\xe5\x1b\0\0\x10\x27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x21\0\x9a\x82\x05\0\x01\0\0\0\xb8\x03\0\0\x9d\x82";
111
- $this->assertEquals($entry->getValue(), $expected);
112
- $this->assertEquals($entry->getText(), '(undefined)');
113
-
114
- /* Sub IFDs of $ifd0. */
115
- $this->assertEquals(count($ifd0->getSubIfds()), 1);
116
- $ifd0_0 = $ifd0->getSubIfd(2); // IFD Exif
117
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_0);
118
-
119
- /* Start of IDF $ifd0_0. */
120
- $this->assertEquals(count($ifd0_0->getEntries()), 32);
121
-
122
- $entry = $ifd0_0->getEntry(33434); // ExposureTime
123
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
124
- $this->assertEquals($entry->getValue(), [
125
- 0 => 10,
126
- 1 => 2000
127
- ]);
128
- $this->assertEquals($entry->getText(), '1/200 sec.');
129
-
130
- $entry = $ifd0_0->getEntry(33437); // FNumber
131
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
132
- $this->assertEquals($entry->getValue(), [
133
- 0 => 32,
134
- 1 => 10
135
- ]);
136
- $this->assertEquals($entry->getText(), 'f/3.2');
137
-
138
- $entry = $ifd0_0->getEntry(34850); // ExposureProgram
139
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
140
- $this->assertEquals($entry->getValue(), 5);
141
- $this->assertEquals($entry->getText(), 'Creative program (biased toward depth of field)');
142
-
143
- $entry = $ifd0_0->getEntry(34855); // ISOSpeedRatings
144
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
145
- $this->assertEquals($entry->getValue(), 64);
146
- $this->assertEquals($entry->getText(), '64');
147
-
148
- $entry = $ifd0_0->getEntry(36864); // ExifVersion
149
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
150
- $this->assertEquals($entry->getValue(), 2.2);
151
- $this->assertEquals($entry->getText(), 'Exif Version 2.2');
152
-
153
- $entry = $ifd0_0->getEntry(36867); // DateTimeOriginal
154
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
155
- $this->assertEquals($entry->getValue(), 1090073972);
156
- $this->assertEquals($entry->getText(), '2004:07:17 14:19:32');
157
-
158
- $entry = $ifd0_0->getEntry(36868); // DateTimeDigitized
159
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
160
- $this->assertEquals($entry->getValue(), 1090073972);
161
- $this->assertEquals($entry->getText(), '2004:07:17 14:19:32');
162
-
163
- $entry = $ifd0_0->getEntry(37121); // ComponentsConfiguration
164
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
165
- $this->assertEquals($entry->getValue(), "\x01\x02\x03\0");
166
- $this->assertEquals($entry->getText(), 'Y Cb Cr -');
167
-
168
- $entry = $ifd0_0->getEntry(37122); // CompressedBitsPerPixel
169
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
170
- $this->assertEquals($entry->getValue(), [
171
- 0 => 2,
172
- 1 => 1
173
- ]);
174
- $this->assertEquals($entry->getText(), '2/1');
175
-
176
- $entry = $ifd0_0->getEntry(37380); // ExposureBiasValue
177
- $this->assertInstanceOf('lsolesen\pel\PelEntrySRational', $entry);
178
- $this->assertEquals($entry->getValue(), [
179
- 0 => 0,
180
- 1 => 10
181
- ]);
182
- $this->assertEquals($entry->getText(), '0.0');
183
-
184
- $entry = $ifd0_0->getEntry(37381); // MaxApertureValue
185
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
186
- $this->assertEquals($entry->getValue(), [
187
- 0 => 34,
188
- 1 => 10
189
- ]);
190
- $this->assertEquals($entry->getText(), '34/10');
191
-
192
- $entry = $ifd0_0->getEntry(37383); // MeteringMode
193
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
194
- $this->assertEquals($entry->getValue(), 5);
195
- $this->assertEquals($entry->getText(), 'Pattern');
196
-
197
- $entry = $ifd0_0->getEntry(37384); // LightSource
198
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
199
- $this->assertEquals($entry->getValue(), 0);
200
- $this->assertEquals($entry->getText(), 'Unknown');
201
-
202
- $entry = $ifd0_0->getEntry(37385); // Flash
203
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
204
- $this->assertEquals($entry->getValue(), 16);
205
- $this->assertEquals($entry->getText(), 'Flash did not fire, compulsory flash mode.');
206
-
207
- $entry = $ifd0_0->getEntry(37386); // FocalLength
208
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
209
- $this->assertEquals($entry->getValue(), [
210
- 0 => 109,
211
- 1 => 10
212
- ]);
213
- $this->assertEquals($entry->getText(), '10.9 mm');
214
-
215
- $entry = $ifd0_0->getEntry(37500); // MakerNote
216
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
217
- $expected = "\x4f\x4c\x59\x4d\x50\0\x01\0\x10\0\0\x02\x04\0\x03\0\0\0\xe0\x05\0\0\x01\x02\x03\0\x01\0\0\0\x01\0\0\0\x02\x02\x03\0\x01\0\0\0\x02\0\0\0\x03\x02\x03\0\x01\0\0\0\0\0\0\0\x04\x02\x05\0\x01\0\0\0\xec\x05\0\0\x05\x02\x05\0\x01\0\0\0\xf4\x05\0\0\x06\x02\x08\0\x06\0\0\0\xfc\x05\0\0\x07\x02\x02\0\x08\0\0\0\x08\x06\0\0\x08\x02\x02\0\x34\0\0\0\x10\x06\0\0\x09\x02\x07\0\x20\0\0\0\x4c\x06\0\0\0\x03\x03\0\x01\0\0\0\0\0\0\0\x01\x03\x03\0\x01\0\0\0\0\0\0\0\x02\x03\x03\0\x01\0\0\0\0\0\0\0\x03\x03\x03\0\x01\0\0\0\0\0\0\0\x04\x03\x03\0\x01\0\0\0\0\0\0\0\0\x0f\x07\0\xee\x01\0\0\x6c\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x64\0\0\0\x64\0\0\0\xfa\x1b\0\0\xe8\x03\0\0\x90\xff\x0b\xff\xd4\xfe\xd6\xff\xbd\xff\xbd\xff\x53\x58\x37\x37\x37\0\0\0\x5b\x70\x69\x63\x74\x75\x72\x65\x49\x6e\x66\x6f\x5d\x20\x52\x65\x73\x6f\x6c\x75\x74\x69\x6f\x6e\x3d\x31\x20\x5b\x43\x61\x6d\x65\x72\x61\x20\x49\x6e\x66\x6f\x5d\x20\x54\x79\x70\x65\x3d\x53\x58\x37\x37\x37\0\0\0\0\0\0\0\0\0\x4f\x4c\x59\x4d\x50\x55\x53\x20\x44\x49\x47\x49\x54\x41\x4c\x20\x43\x41\x4d\x45\x52\x41\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x34\x02\x05\x02\x9f\0\0\0\0\xff\0\0\x02\x19\x61\x12\x31\0\0\x05\xe3\0\0\x1c\x20\0\0\x06\xfc\0\0\x1b\xf0\0\0\x1b\xf0\0\0\x07\x10\0\0\x16\x90\0\x64\0\xc7\0\x40\0\x1c\0\0\0\0\0\0\0\0\0\0\x2a\x92\0\0\0\0\x2a\x2e\x12\x03\x10\0\0\0\0\0\0\0\0\0\0\0\x13\x1a\0\0\x3c\0\x0f\x4a\0\0\0\0\0\0\0\0\0\0\0\0\0\x64\x06\xfc\0\0\0\0\x22\x22\x22\x22\x22\x22\x22\x22\x22\x22\x22\x22\x22\x22\x22\x22\x22\x22\x22\x22\x11\x11\x11\x11\x01\xa4\x03\x7e\x03\xeb\x01\x7c\x02\x05\x02\x1b\x01\xa1\x02\0\x01\x02\xf0\x59\0\x01\x03\x52\0\x16\0\x0d\0\x16\0\x0d\0\x05\0\x0a\0\x01\0\0\0\0\0\x10\0\0\0\x14\0\x01\0\0\0\xc7\x01\x6f\x02\x17\x02\xc0\x03\x68\x01\x03\x01\x34\x02\x05\x02\x9f\0\0\x0c\x2f\x0d\xe1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x88\x88\x01\0\0\xed\x11\xda\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x40\x01\x1a\0\xb8\x02\x4e\0\x0e\x09\x17\x01\x44\x02\x73\x02\xde\x03\x10\x02\xd4\xd0\0\0\xed\x11\0\0\0\x01\x44\x01\xfc\x04\x53\x08\x48\x09\x17\x05\xc1\x02\x56\0\0\x0a\x84\x12\xcc\x19\x8d\x1b\x37\x16\x68\x0b\x90\x04\x38\0\0\x06\xff\x08\x92\x09\x29\x08\x3f\x06\x26\0\0\0\0\0\0\x1b\xa7\x1b\x24\x17\xe3\x12\xea\x0c\xd7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x77\x77\x77\x77\x13\x27\x13\x1f\x13\x1f\x13\x1f\x0d\x18\x05\0\xe1\x07\0\x07\0\0\x03\0\0\0\x0f\0\x69\0\x4f\x76\x59\x03\x03\0\x12\x24\x37\0\x15\x29\x14\x2a\x01\xfb\x01\x83\x01\xee\x02\x32\0\0\x01\x0d\0\x36\0\x6e\x02\x1b\x01\xa1\x12\x24\x14\x2a\x20\x52\0\x04\0\x0a\x04\x03\x6e\x5f\x01\0";
218
- $this->assertEquals($entry->getValue(), $expected);
219
- $this->assertEquals($entry->getText(), '840 bytes unknown MakerNote data');
220
-
221
- $entry = $ifd0_0->getEntry(37510); // UserComment
222
- $this->assertInstanceOf('lsolesen\pel\PelEntryUserComment', $entry);
223
- $this->assertEquals($entry->getValue(), ' ');
224
- $this->assertEquals($entry->getText(), ' ');
225
-
226
- $entry = $ifd0_0->getEntry(40960); // FlashPixVersion
227
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
228
- $this->assertEquals($entry->getValue(), 1);
229
- $this->assertEquals($entry->getText(), 'FlashPix Version 1.0');
230
-
231
- $entry = $ifd0_0->getEntry(40961); // ColorSpace
232
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
233
- $this->assertEquals($entry->getValue(), 1);
234
- $this->assertEquals($entry->getText(), 'sRGB');
235
-
236
- $entry = $ifd0_0->getEntry(40962); // PixelXDimension
237
- $this->assertInstanceOf('lsolesen\pel\PelEntryLong', $entry);
238
- $this->assertEquals($entry->getValue(), 2288);
239
- $this->assertEquals($entry->getText(), '2288');
240
-
241
- $entry = $ifd0_0->getEntry(40963); // PixelYDimension
242
- $this->assertInstanceOf('lsolesen\pel\PelEntryLong', $entry);
243
- $this->assertEquals($entry->getValue(), 1712);
244
- $this->assertEquals($entry->getText(), '1712');
245
-
246
- $entry = $ifd0_0->getEntry(41728); // FileSource
247
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
248
- $this->assertEquals($entry->getValue(), "\x03");
249
- $this->assertEquals($entry->getText(), 'DSC');
250
-
251
- $entry = $ifd0_0->getEntry(41729); // SceneType
252
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
253
- $this->assertEquals($entry->getValue(), "\x01");
254
- $this->assertEquals($entry->getText(), 'Directly photographed');
255
-
256
- $entry = $ifd0_0->getEntry(41985); // CustomRendered
257
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
258
- $this->assertEquals($entry->getValue(), 0);
259
- $this->assertEquals($entry->getText(), 'Normal process');
260
-
261
- $entry = $ifd0_0->getEntry(41986); // ExposureMode
262
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
263
- $this->assertEquals($entry->getValue(), 0);
264
- $this->assertEquals($entry->getText(), 'Auto exposure');
265
-
266
- $entry = $ifd0_0->getEntry(41987); // WhiteBalance
267
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
268
- $this->assertEquals($entry->getValue(), 0);
269
- $this->assertEquals($entry->getText(), 'Auto white balance');
270
-
271
- $entry = $ifd0_0->getEntry(41988); // DigitalZoomRatio
272
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
273
- $this->assertEquals($entry->getValue(), [
274
- 0 => 0,
275
- 1 => 100
276
- ]);
277
- $this->assertEquals($entry->getText(), '0/100');
278
-
279
- $entry = $ifd0_0->getEntry(41990); // SceneCaptureType
280
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
281
- $this->assertEquals($entry->getValue(), 2);
282
- $this->assertEquals($entry->getText(), 'Portrait');
283
-
284
- $entry = $ifd0_0->getEntry(41991); // GainControl
285
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
286
- $this->assertEquals($entry->getValue(), 0);
287
- $this->assertEquals($entry->getText(), 'Normal');
288
-
289
- $entry = $ifd0_0->getEntry(41992); // Contrast
290
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
291
- $this->assertEquals($entry->getValue(), 0);
292
- $this->assertEquals($entry->getText(), 'Normal');
293
-
294
- $entry = $ifd0_0->getEntry(41993); // Saturation
295
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
296
- $this->assertEquals($entry->getValue(), 0);
297
- $this->assertEquals($entry->getText(), 'Normal');
298
-
299
- $entry = $ifd0_0->getEntry(41994); // Sharpness
300
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
301
- $this->assertEquals($entry->getValue(), 0);
302
- $this->assertEquals($entry->getText(), 'Normal');
303
-
304
- /* Sub IFDs of $ifd0_0. */
305
- $this->assertEquals(count($ifd0_0->getSubIfds()), 1);
306
- $ifd0_0_0 = $ifd0_0->getSubIfd(4); // IFD Interoperability
307
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_0_0);
308
-
309
- /* Start of IDF $ifd0_0_0. */
310
- $this->assertEquals(count($ifd0_0_0->getEntries()), 2);
311
-
312
- $entry = $ifd0_0_0->getEntry(1); // InteroperabilityIndex
313
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
314
- $this->assertEquals($entry->getValue(), 'R98');
315
- $this->assertEquals($entry->getText(), 'R98');
316
-
317
- $entry = $ifd0_0_0->getEntry(2); // InteroperabilityVersion
318
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
319
- $this->assertEquals($entry->getValue(), 1);
320
- $this->assertEquals($entry->getText(), 'Interoperability Version 1.0');
321
-
322
- /* Sub IFDs of $ifd0_0_0. */
323
- $this->assertEquals(count($ifd0_0_0->getSubIfds()), 0);
324
-
325
- $this->assertEquals($ifd0_0_0->getThumbnailData(), '');
326
-
327
- /* Next IFD. */
328
- $ifd0_0_1 = $ifd0_0_0->getNextIfd();
329
- $this->assertNull($ifd0_0_1);
330
- /* End of IFD $ifd0_0_0. */
331
-
332
- $this->assertEquals($ifd0_0->getThumbnailData(), '');
333
-
334
- /* Next IFD. */
335
- $ifd0_1 = $ifd0_0->getNextIfd();
336
- $this->assertNull($ifd0_1);
337
- /* End of IFD $ifd0_0. */
338
-
339
- $this->assertEquals($ifd0->getThumbnailData(), '');
340
-
341
- /* Next IFD. */
342
- $ifd1 = $ifd0->getNextIfd();
343
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd1);
344
- /* End of IFD $ifd0. */
345
-
346
- /* Start of IDF $ifd1. */
347
- $this->assertEquals(count($ifd1->getEntries()), 4);
348
-
349
- $entry = $ifd1->getEntry(259); // Compression
350
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
351
- $this->assertEquals($entry->getValue(), 6);
352
- $this->assertEquals($entry->getText(), 'JPEG compression');
353
-
354
- $entry = $ifd1->getEntry(282); // XResolution
355
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
356
- $this->assertEquals($entry->getValue(), [
357
- 0 => 72,
358
- 1 => 1
359
- ]);
360
- $this->assertEquals($entry->getText(), '72/1');
361
-
362
- $entry = $ifd1->getEntry(283); // YResolution
363
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
364
- $this->assertEquals($entry->getValue(), [
365
- 0 => 72,
366
- 1 => 1
367
- ]);
368
- $this->assertEquals($entry->getText(), '72/1');
369
-
370
- $entry = $ifd1->getEntry(296); // ResolutionUnit
371
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
372
- $this->assertEquals($entry->getValue(), 2);
373
- $this->assertEquals($entry->getText(), 'Inch');
374
-
375
- /* Sub IFDs of $ifd1. */
376
- $this->assertEquals(count($ifd1->getSubIfds()), 0);
377
-
378
- $thumb_data = file_get_contents(dirname(__FILE__) . '/olympus-c765uz-thumb.jpg');
379
- $this->assertEquals($ifd1->getThumbnailData(), $thumb_data);
380
-
381
- /* Next IFD. */
382
- $ifd2 = $ifd1->getNextIfd();
383
- $this->assertNull($ifd2);
384
- /* End of IFD $ifd1. */
385
-
386
- $this->assertTrue(count(Pel::getExceptions()) == 0);
387
- }
388
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/PentaxIstDSTest.php DELETED
@@ -1,429 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * PEL: PHP Exif Library. A library with support for reading and
5
- * writing all Exif headers in JPEG and TIFF images using PHP.
6
- *
7
- * Copyright (C) 2005, 2006 Martin Geisler.
8
- *
9
- * This program is free software; you can redistribute it and/or modify
10
- * it under the terms of the GNU General Public License as published by
11
- * the Free Software Foundation; either version 2 of the License, or
12
- * (at your option) any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- * GNU General Public License for more details.
18
- *
19
- * You should have received a copy of the GNU General Public License
20
- * along with this program in the file COPYING; if not, write to the
21
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
22
- * Boston, MA 02110-1301 USA
23
- */
24
-
25
- namespace Pel\Test\imagetests;
26
-
27
- use lsolesen\pel\Pel;
28
- use lsolesen\pel\PelJpeg;
29
- use PHPUnit\Framework\TestCase;
30
-
31
- class PentaxIstDSTest extends TestCase
32
- {
33
- public function testRead()
34
- {
35
- Pel::clearExceptions();
36
- Pel::setStrictParsing(false);
37
- $jpeg = new PelJpeg(dirname(__FILE__) . '/pentax-istDS.jpg');
38
-
39
- $exif = $jpeg->getExif();
40
- $this->assertInstanceOf('lsolesen\pel\PelExif', $exif);
41
-
42
- $tiff = $exif->getTiff();
43
- $this->assertInstanceOf('lsolesen\pel\PelTiff', $tiff);
44
-
45
- /* The first IFD. */
46
- $ifd0 = $tiff->getIfd();
47
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0);
48
-
49
- /* Start of IDF $ifd0. */
50
- $this->assertEquals(count($ifd0->getEntries()), 13);
51
-
52
- $entry = $ifd0->getEntry(271); // Make
53
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
54
- $this->assertEquals($entry->getValue(), 'PENTAX Corporation ');
55
- $this->assertEquals($entry->getText(), 'PENTAX Corporation ');
56
-
57
- $entry = $ifd0->getEntry(272); // Model
58
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
59
- $this->assertEquals($entry->getValue(), 'PENTAX *ist DS ');
60
- $this->assertEquals($entry->getText(), 'PENTAX *ist DS ');
61
-
62
- $entry = $ifd0->getEntry(274); // Orientation
63
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
64
- $this->assertEquals($entry->getValue(), 1);
65
- $this->assertEquals($entry->getText(), 'top - left');
66
-
67
- $entry = $ifd0->getEntry(282); // XResolution
68
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
69
- $this->assertEquals($entry->getValue(), [
70
- 0 => 72,
71
- 1 => 1
72
- ]);
73
- $this->assertEquals($entry->getText(), '72/1');
74
-
75
- $entry = $ifd0->getEntry(283); // YResolution
76
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
77
- $this->assertEquals($entry->getValue(), [
78
- 0 => 72,
79
- 1 => 1
80
- ]);
81
- $this->assertEquals($entry->getText(), '72/1');
82
-
83
- $entry = $ifd0->getEntry(296); // ResolutionUnit
84
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
85
- $this->assertEquals($entry->getValue(), 2);
86
- $this->assertEquals($entry->getText(), 'Inch');
87
-
88
- $entry = $ifd0->getEntry(305); // Software
89
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
90
- $this->assertEquals($entry->getValue(), '*ist DS Ver 1.00 ');
91
- $this->assertEquals($entry->getText(), '*ist DS Ver 1.00 ');
92
-
93
- $entry = $ifd0->getEntry(306); // DateTime
94
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
95
- $this->assertEquals($entry->getValue(), 1106749970);
96
- $this->assertEquals($entry->getText(), '2005:01:26 14:32:50');
97
-
98
- $entry = $ifd0->getEntry(318); // WhitePoint
99
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
100
- $this->assertEquals($entry->getValue(), [
101
- 0 => [
102
- 0 => 313,
103
- 1 => 1000
104
- ],
105
- 1 => [
106
- 0 => 329,
107
- 1 => 1000
108
- ]
109
- ]);
110
- $this->assertEquals($entry->getText(), '313/1000, 329/1000');
111
-
112
- $entry = $ifd0->getEntry(319); // PrimaryChromaticities
113
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
114
- $this->assertEquals($entry->getValue(), [
115
- 0 => [
116
- 0 => 64,
117
- 1 => 100
118
- ],
119
- 1 => [
120
- 0 => 33,
121
- 1 => 100
122
- ],
123
- 2 => [
124
- 0 => 21,
125
- 1 => 100
126
- ],
127
- 3 => [
128
- 0 => 71,
129
- 1 => 100
130
- ],
131
- 4 => [
132
- 0 => 15,
133
- 1 => 100
134
- ],
135
- 5 => [
136
- 0 => 6,
137
- 1 => 100
138
- ]
139
- ]);
140
- $this->assertEquals($entry->getText(), '64/100, 33/100, 21/100, 71/100, 15/100, 6/100');
141
-
142
- $entry = $ifd0->getEntry(529); // YCbCrCoefficients
143
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
144
- $this->assertEquals($entry->getValue(), [
145
- 0 => [
146
- 0 => 299,
147
- 1 => 1000
148
- ],
149
- 1 => [
150
- 0 => 587,
151
- 1 => 1000
152
- ],
153
- 2 => [
154
- 0 => 114,
155
- 1 => 1000
156
- ]
157
- ]);
158
- $this->assertEquals($entry->getText(), '299/1000, 587/1000, 114/1000');
159
-
160
- $entry = $ifd0->getEntry(531); // YCbCrPositioning
161
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
162
- $this->assertEquals($entry->getValue(), 2);
163
- $this->assertEquals($entry->getText(), 'co-sited');
164
-
165
- $entry = $ifd0->getEntry(50341); // PrintIM
166
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
167
- $expected = "\x50\x72\x69\x6e\x74\x49\x4d\0\x30\x33\x30\x30\0\0\0\x21\0\x01\0\x16\0\x16\0\x02\x01\0\0\0\0\x03\0\0\0\xd6\0\x07\0\0\0\0\0\x08\0\0\0\0\0\x09\0\0\0\0\0\x0a\0\0\0\0\0\x0b\0\0\x01\x1e\0\x0c\0\0\0\0\0\x0d\0\0\0\0\0\x0e\0\0\x01\x34\x01\0\x05\0\0\0\x01\x01\xff\0\0\0\x01\x02\x83\0\0\0\x01\x03\x83\0\0\0\x01\x04\x83\0\0\0\x01\x05\x83\0\0\0\x01\x06\x83\0\0\0\x01\x07\x80\x80\x80\0\x01\x10\x80\0\0\0\x02\0\0\0\0\0\x02\x07\0\0\0\0\x02\x08\0\0\0\0\x02\x09\0\0\0\0\x02\x0a\0\0\0\0\x02\x0b\0\0\x01\x44\x02\x0d\0\0\0\0\x03\0\x05\0\0\0\x03\x01\xff\0\0\0\x03\x02\x83\0\0\0\x03\x03\x83\0\0\0\x03\x06\x83\0\0\0\x03\x10\x80\0\0\0\0\0\x17\xd2\0\0\x27\x10\0\0\x08\x05\0\0\x27\x10\0\0\x05\xd4\0\0\x27\x10\0\0\x0c\x27\0\0\x27\x10\0\0\x18\x71\0\0\x27\x10\0\0\x02\x78\0\0\x27\x10\0\0\0\xc2\0\0\x27\x10\0\0\x02\x61\0\0\x27\x10\0\0\x1d\x18\0\0\x27\x10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
168
- $this->assertEquals($entry->getValue(), $expected);
169
- $this->assertEquals($entry->getText(), '(undefined)');
170
-
171
- /* Sub IFDs of $ifd0. */
172
- $this->assertEquals(count($ifd0->getSubIfds()), 1);
173
- $ifd0_0 = $ifd0->getSubIfd(2); // IFD Exif
174
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_0);
175
-
176
- /* Start of IDF $ifd0_0. */
177
- $this->assertEquals(count($ifd0_0->getEntries()), 30);
178
-
179
- $entry = $ifd0_0->getEntry(33434); // ExposureTime
180
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
181
- $this->assertEquals($entry->getValue(), [
182
- 0 => 1,
183
- 1 => 4
184
- ]);
185
- $this->assertEquals($entry->getText(), '1/4 sec.');
186
-
187
- $entry = $ifd0_0->getEntry(33437); // FNumber
188
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
189
- $this->assertEquals($entry->getValue(), [
190
- 0 => 45,
191
- 1 => 10
192
- ]);
193
- $this->assertEquals($entry->getText(), 'f/4.5');
194
-
195
- $entry = $ifd0_0->getEntry(34850); // ExposureProgram
196
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
197
- $this->assertEquals($entry->getValue(), 2);
198
- $this->assertEquals($entry->getText(), 'Normal program');
199
-
200
- $entry = $ifd0_0->getEntry(34855); // ISOSpeedRatings
201
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
202
- $this->assertEquals($entry->getValue(), 200);
203
- $this->assertEquals($entry->getText(), '200');
204
-
205
- $entry = $ifd0_0->getEntry(36864); // ExifVersion
206
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
207
- $this->assertEquals($entry->getValue(), 2.21);
208
- $this->assertEquals($entry->getText(), 'Exif Version 2.21');
209
-
210
- $entry = $ifd0_0->getEntry(36867); // DateTimeOriginal
211
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
212
- $this->assertEquals($entry->getValue(), 1106749970);
213
- $this->assertEquals($entry->getText(), '2005:01:26 14:32:50');
214
-
215
- $entry = $ifd0_0->getEntry(36868); // DateTimeDigitized
216
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
217
- $this->assertEquals($entry->getValue(), 1106749970);
218
- $this->assertEquals($entry->getText(), '2005:01:26 14:32:50');
219
-
220
- $entry = $ifd0_0->getEntry(37121); // ComponentsConfiguration
221
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
222
- $this->assertEquals($entry->getValue(), "\x01\x02\x03\0");
223
- $this->assertEquals($entry->getText(), 'Y Cb Cr -');
224
-
225
- $entry = $ifd0_0->getEntry(37380); // ExposureBiasValue
226
- $this->assertInstanceOf('lsolesen\pel\PelEntrySRational', $entry);
227
- $this->assertEquals($entry->getValue(), [
228
- 0 => 0,
229
- 1 => 10
230
- ]);
231
- $this->assertEquals($entry->getText(), '0.0');
232
-
233
- $entry = $ifd0_0->getEntry(37383); // MeteringMode
234
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
235
- $this->assertEquals($entry->getValue(), 5);
236
- $this->assertEquals($entry->getText(), 'Pattern');
237
-
238
- $entry = $ifd0_0->getEntry(37385); // Flash
239
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
240
- $this->assertEquals($entry->getValue(), 16);
241
- $this->assertEquals($entry->getText(), 'Flash did not fire, compulsory flash mode.');
242
-
243
- $entry = $ifd0_0->getEntry(37386); // FocalLength
244
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
245
- $this->assertEquals($entry->getValue(), [
246
- 0 => 45,
247
- 1 => 1
248
- ]);
249
- $this->assertEquals($entry->getText(), '45.0 mm');
250
-
251
- $entry = $ifd0_0->getEntry(37500); // MakerNote
252
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
253
- $expected = "\x41\x4f\x43\0\x4d\x4d\0\x48\0\x01\0\x03\0\0\0\x01\0\0\0\0\0\x02\0\x03\0\0\0\x02\x02\x80\x01\xe0\0\x03\0\x04\0\0\0\x01\0\0\x5c\x04\0\x04\0\x04\0\0\0\x01\0\0\x09\x3c\0\x05\0\x04\0\0\0\x01\0\x01\x2a\xa2\0\x06\0\x07\0\0\0\x04\x07\xd5\x01\x1a\0\x07\0\x07\0\0\0\x03\x0e\x20\x32\0\0\x08\0\x03\0\0\0\x01\0\0\0\0\0\x09\0\x03\0\0\0\x02\0\x22\0\x02\0\x0c\0\x03\0\0\0\x01\0\x01\0\0\0\x0d\0\x03\0\0\0\x01\0\x10\0\0\0\x0e\0\x03\0\0\0\x01\xff\xff\0\0\0\x12\0\x04\0\0\0\x01\0\0\x61\xa8\0\x13\0\x03\0\0\0\x01\0\x2d\0\0\0\x14\0\x03\0\0\0\x01\0\x09\0\0\0\x16\0\x03\0\0\0\x01\0\x32\0\0\0\x17\0\x03\0\0\0\x01\0\0\0\0\0\x18\0\x03\0\0\0\x01\0\0\0\0\0\x19\0\x03\0\0\0\x01\0\x04\0\0\0\x1a\0\x03\0\0\0\x01\xff\xff\0\0\0\x1d\0\x04\0\0\0\x01\0\0\x11\x94\0\x1f\0\x03\0\0\0\x02\0\x01\0\0\0\x20\0\x03\0\0\0\x02\0\x01\0\0\0\x21\0\x03\0\0\0\x02\0\x01\0\0\0\x22\0\x03\0\0\0\x01\0\0\0\0\0\x23\0\x03\0\0\0\x01\0\x16\0\0\0\x24\0\x03\0\0\0\x01\0\x16\0\0\0\x25\0\x03\0\0\0\x01\0\x01\0\0\0\x26\0\x03\0\0\0\x01\0\x01\0\0\0\x27\0\x07\0\0\0\x04\xfe\xff\xff\xff\0\x28\0\x07\0\0\0\x04\xfe\xff\xff\xff\0\x29\0\x04\0\0\0\x01\0\0\x05\x46\0\x2b\0\x04\0\0\0\x01\0\x04\x44\0\0\x2c\0\x04\0\0\0\x01\0\0\0\0\0\x2d\0\x03\0\0\0\x01\x16\x80\0\0\0\x32\0\x07\0\0\0\x04\0\0\0\0\0\x33\0\x01\0\0\0\x03\x02\0\x01\0\0\x34\0\x01\0\0\0\x04\0\0\0\0\0\x35\0\x03\0\0\0\x02\x2e\xec\x1f\x33\0\x36\0\x03\0\0\0\x01\0\x80\0\0\0\x37\0\x03\0\0\0\x01\0\x01\0\0\0\x3a\0\x03\0\0\0\x01\x46\x66\0\0\0\x3d\0\x03\0\0\0\x01\x20\0\0\0\0\x3e\0\x01\0\0\0\x04\x1a\x1a\0\0\0\x3f\0\x01\0\0\0\x02\x04\xfc\0\0\0\x41\0\x03\0\0\0\x01\0\0\0\0\0\x47\0\x06\0\0\0\x01\x11\0\0\0\0\x48\0\x03\0\0\0\x01\0\0\0\0\0\x49\0\x03\0\0\0\x01\0\x01\0\0\0\x4f\0\x03\0\0\0\x01\0\x01\0\0\x02\0\0\x03\0\0\0\x04\0\0\x08\x0c\x02\x01\0\x03\0\0\0\x04\0\0\x08\x14\x02\x02\0\x03\0\0\0\x04\0\0\x08\x1c\x02\x05\0\x07\0\0\0\x10\0\0\x08\x24\x02\x06\0\x07\0\0\0\x0e\0\0\x08\x34\x02\x07\0\x07\0\0\0\x24\0\0\x08\x44\x02\x08\0\x07\0\0\0\x1c\0\0\x08\x68\x02\x09\0\x07\0\0\0\x10\0\0\x08\x84\x02\x0a\0\x07\0\0\0\x10\0\0\x08\x94\x02\x0b\0\x07\0\0\0\x10\0\0\x08\xa4\x02\x0d\0\x03\0\0\0\x04\0\0\x08\xb4\x02\x0e\0\x03\0\0\0\x04\0\0\x08\xbc\x02\x0f\0\x03\0\0\0\x04\0\0\x08\xc4\x02\x10\0\x03\0\0\0\x04\0\0\x08\xcc\x02\x11\0\x03\0\0\0\x04\0\0\x08\xd4\x02\x12\0\x03\0\0\0\x04\0\0\x08\xdc\x02\x13\0\x03\0\0\0\x04\0\0\x08\xe4\x02\x14\0\x03\0\0\0\x04\0\0\x08\xec\x02\x15\0\x04\0\0\0\x05\0\0\x08\xf4\x02\x16\0\x07\0\0\0\x06\0\0\x09\x08\x02\x1f\0\x07\0\0\0\x0c\0\0\x09\x10\x03\xff\0\x03\0\0\0\x10\0\0\x09\x1c\0\0\0\0\0\0\0\0\0\0\0\0\x20\xa0\x20\0\x20\0\x43\x20\0\0\0\0\0\0\0\0\x02\x70\x10\x01\0\0\x28\0\x03\0\x70\0\0\0\x60\x10\x53\x6a\x28\x40\0\xa4\x03\0\0\x68\x6a\x94\0\x40\0\0\x04\xfc\0\x70\x28\xd6\x17\x51\x84\x28\x94\x66\x49\x9a\x60\x3c\x01\x4d\x7c\xfb\xff\xff\xff\xfc\x09\x76\x2a\xb1\0\x88\x08\0\0\0\x20\0\0\xf1\x3f\x3b\0\xac\0\xac\xc6\x18\x69\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x58\x58\x56\x55\x54\x56\x54\x59\x57\x5a\x57\x59\x5b\x59\x5b\x56\x5e\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x34\xd8\x20\0\x20\0\x1b\xbc\x3f\xa7\x20\0\x20\0\x15\x19\x39\x2b\x20\0\x20\0\x18\xcf\x1e\x03\x20\0\x20\0\x39\x9a\x3d\xed\x20\0\x20\0\x1c\x21\x33\x49\x20\0\x20\0\x1f\x5e\x2d\x94\x20\0\x20\0\x26\x2a\x37\x01\x20\0\x20\0\x19\xff\0\x01\x2a\xa2\x01\x31\xcd\xa2\0\0\0\x02\0\0\0\x02\0\x5b\x96\x1b\x82\x40\x9a\x90\0\0\0\0\x07\xff\xe0\x22\0\x11\x0c\x7a\x1f\x1f\x05\x0e\x01\xf4\x01\xf4\x01\xf4\0\0\0\x5d\0\x5e\0\x5f\0\0\0\x5a\0\x5a\0\x5b\0\x5b\0\x5c\0\x5c\0\x5d\0\0\xff\xd8\xff\xdb\0\x84\0\x08\x05\x06\x07\x06\x05\x08\x07\x06\x07\x09\x08\x08\x09\x0c\x14\x0d\x0c\x0b\x0b\x0c\x18\x11\x12\x0e\x14\x1d\x19\x1e\x1e\x1c\x19\x1c\x1b\x20\x24\x2e\x27\x20\x22\x2b\x22\x1b\x1c\x28\x36\x28\x2b\x2f\x31\x33\x34\x33\x1f\x26\x38\x3c\x38\x32\x3c\x2e\x32\x33\x31\x01\x08\x09\x09\x0c\x0a\x0c\x17\x0d\x0d\x17\x31\x21\x1c\x21\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\xff\xc0\0\x11\x08\x01\xe0\x02\x80\x03\x01\x21\0\x02\x11\x01\x03\x11\x01\xff\xc4\x01\xa2\0\0\x01\x05\x01\x01\x01\x01\x01\x01\0\0\0\0\0\0\0\0\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x10\0\x02\x01\x03\x03\x02\x04\x03\x05\x05\x04\x04\0\0\x01\x7d\x01\x02\x03\0\x04\x11\x05\x12\x21\x31\x41\x06\x13\x51\x61\x07\x22\x71\x14\x32\x81\x91\xa1\x08\x23\x42\xb1\xc1\x15\x52\xd1\xf0\x24\x33\x62\x72\x82\x09\x0a\x16\x17\x18\x19\x1a\x25\x26\x27\x28\x29\x2a\x34\x35\x36\x37\x38\x39\x3a\x43\x44\x45\x46\x47\x48\x49\x4a\x53\x54\x55\x56\x57\x58\x59\x5a\x63\x64\x65\x66\x67\x68\x69\x6a\x73\x74\x75\x76\x77\x78\x79\x7a\x83\x84\x85\x86\x87\x88\x89\x8a\x92\x93\x94\x95\x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\x01\0\x03\x01\x01\x01\x01\x01\x01\x01\x01\x01\0\0\0\0\0\0\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x11\0\x02\x01\x02\x04\x04\x03\x04\x07\x05\x04\x04\0\x01\x02\x77\0\x01\x02\x03\x11\x04\x05\x21\x31\x06\x12\x41\x51\x07\x61\x71\x13\x22\x32\x81\x08\x14\x42\x91\xa1\xb1\xc1\x09\x23\x33\x52\xf0\x15\x62\x72\xd1\x0a\x16\x24\x34\xe1\x25\xf1\x17\x18\x19\x1a\x26\x27\x28\x29\x2a\x35\x36\x37\x38\x39\x3a\x43\x44\x45\x46\x47\x48\x49\x4a\x53\x54\x55\x56\x57\x58\x59\x5a\x63\x64\x65\x66\x67\x68\x69\x6a\x73\x74\x75\x76\x77\x78\x79\x7a\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x92\x93\x94\x95\x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xff\xda\0\x0c\x03\x01\0\x02\x11\x03\x11\0\x3f\0\xf9\xfe\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x0e\xeb\xfe\x11\xed\x2f\xfe\x7d\x7f\xf2\x23\x7f\x8d\x2f\xfc\x23\xba\x57\xfc\xfa\xff\0\xe4\x46\xff\0\x1a\xe6\xe7\x91\xd1\xc9\x11\x7f\xe1\x1d\xd2\xbf\xe7\xd7\xff\0\x22\x37\xf8\xd2\xff\0\xc2\x3b\xa5\x7f\xcf\xa7\xfe\x44\x7f\xf1\xa3\x9e\x5d\xc7\xc9\x10\xff\0\x84\x73\x49\xff\0\x9f\x4f\xfc\x88\xff\0\xe3\x4a\x3c\x39\xa4\xff\0\xcf\xaf\xfe\x44\x7f\xf1\xa3\xda\x48\x39\x22\x1f\xf0\x8d\xe9\x3f\xf3\xe9\xff\0\x91\x1f\xfc\x69\x7f\xe1\x1b\xd2\x7f\xe7\xd3\xff\0\x22\x3f\xf8\xd1\xcf\x2e\xe1\xc9\x10\xff\0\x84\x6b\x49\xff\0\x9f\x4f\xfc\x88\xff\0\xe3\x4b\xff\0\x08\xd6\x93\xff\0\x3e\x9f\xf9\x11\xff\0\xc6\x8e\x79\x77\x0e\x48\x8b\xff\0\x08\xd6\x91\xff\0\x3e\x9f\xf9\x11\xff\0\xc6\x8f\xf8\x46\xb4\x9f\xf9\xf4\xff\0\xc8\x8f\xfe\x34\x7b\x49\x77\x0e\x48\x87\xfc\x23\x3a\x47\xfc\xfa\x7f\xe4\x47\xff\0\x1a\x5f\xf8\x46\x74\x8f\xf9\xf4\xff\0\xc8\x8f\xfe\x34\x7b\x49\x77\x0e\x48\x8b\xff\0\x08\xce\x91\xff\0\x3e\x7f\xf9\x11\xff\0\xc6\x8f\xf8\x46\x34\x8f\xf9\xf4\xff\0\xc8\x8f\xfe\x34\xbd\xa4\xbb\x87\x24\x43\xfe\x11\x8d\x23\xfe\x7c\xff\0\xf2\x23\xff\0\x8d\x2f\xfc\x23\x1a\x47\xfc\xf9\xff\0\xe4\x47\xff\0\x1a\x3d\xa4\xbb\x87\x24\x40\x78\x63\x48\xff\0\x9f\x3f\xfc\x88\xff\0\xe3\x4b\xff\0\x08\xbe\x8f\xff\0\x3e\x7f\xf9\x11\xff\0\xc6\x8f\x69\x2e\xe1\xc9\x10\xff\0\x84\x5f\x47\xff\0\x9f\x3f\xfc\x88\xff\0\xe3\x4b\xff\0\x08\xbe\x8f\xff\0\x3e\x7f\xf9\x15\xff\0\xc6\x8f\x69\x2e\xe1\xc9\x10\xff\0\x84\x5b\x47\xff\0\x9f\x3f\xfc\x8a\xff\0\xe3\x47\xfc\x22\xda\x3f\xfc\xf9\xff\0\xe4\x57\xff\0\x1a\x3d\xa4\xbb\x87\x24\x7b\x0b\xff\0\x08\xb6\x8f\xff\0\x3e\x7f\xf9\x15\xff\0\xc6\x8f\xf8\x45\xb4\x7f\xf9\xf3\xff\0\xc8\xaf\xfe\x34\x7b\x49\x77\x0e\x48\x87\xfc\x22\xda\x3f\xfc\xf9\xff\0\xe4\x57\xff\0\x1a\x3f\xe1\x15\xd1\xff\0\xe7\xcf\xff\0\x22\xbf\xf8\xd1\xed\x25\xdc\x39\x23\xd8\x5f\xf8\x45\x74\x7f\xf9\xf2\xff\0\xc8\xaf\xfe\x34\x7f\xc2\x29\xa3\xff\0\xcf\x9f\xfe\x45\x7f\xf1\xa5\xed\x25\xdc\x39\x22\x2f\xfc\x22\x9a\x3f\xfc\xf9\x7f\xe4\x57\xff\0\x1a\x3f\xe1\x14\xd1\xff\0\xe7\xcb\xff\0\x22\xbf\xf8\xd1\xed\x25\xdc\x39\x22\x1f\xf0\x8a\x68\xdf\xf3\xe5\xff\0\x91\x5f\xfc\x69\x7f\xe1\x14\xd1\xff\0\xe7\xcb\xff\0\x22\xbf\xf8\xd3\xf6\x92\xee\x1c\x91\x0f\xf8\x45\x34\x7f\xf9\xf2\xff\0\xc8\xaf\xfe\x34\x7f\xc2\x27\xa3\xe3\xfe\x3c\xbf\xf2\x2b\xff\0\x8d\x2f\x69\x2e\xe1\xc9\x10\xff\0\x84\x4f\x47\xff\0\x9f\x2f\xfc\x8a\xff\0\xe3\x47\xfc\x22\x7a\x3f\xfc\xf9\x1f\xfb\xfa\xff\0\xe3\x47\xb4\x97\x70\xe4\x88\x7f\xc2\x27\xa3\xff\0\xcf\x97\xfe\x45\x7f\xf1\xa5\xff\0\x84\x4b\x47\xff\0\x9f\x2f\xfc\x8a\xff\0\xe3\x47\xb4\x97\x70\xe4\x88\x7f\xc2\x23\xa4\x7f\xcf\x89\xff\0\xbf\xaf\xfe\x34\xbf\xf0\x88\xe9\x1f\xf3\xe2\x7f\xef\xeb\xff\0\x8d\x1e\xd2\x5d\xc3\x92\x22\x7f\xc2\x23\xa4\x7f\xcf\x89\xff\0\xbf\xaf\xfe\x34\x7f\xc2\x23\xa4\x7f\xcf\x97\xfe\x45\x7f\xf1\xa3\xda\x4b\xb8\x72\x44\x3f\xe1\x12\xd1\xff\0\xe7\xcb\xff\0\x22\xbf\xf8\xd1\xff\0\x08\x96\x91\xff\0\x3e\x5f\xf9\x15\xff\0\xc6\x8f\x69\x2e\xe1\xc9\x10\xff\0\x84\x47\x48\xff\0\x9f\x3f\xfc\x8a\xff\0\xe3\x47\xfc\x22\x5a\x47\xfc\xf9\x8f\xfb\xfa\xff\0\xe3\x47\xb4\x90\x72\x44\x4f\xf8\x44\xb4\x7e\xd6\x7f\xf9\x15\xff\0\xc6\x8f\xf8\x44\xb4\x8f\xf9\xf3\x1f\xf7\xf5\xff\0\xc6\x8f\x69\x2e\xe1\xc9\x11\x3f\xe1\x13\xd1\xff\0\xe7\xcc\x7f\xdf\xd7\xff\0\x1a\x4f\xf8\x45\x34\x7f\xf9\xf4\x1f\xf7\xf5\xff\0\xc6\x8f\x69\x20\xe4\x88\x7f\xc2\x2b\xa3\x7f\xcf\xa0\xff\0\xbf\xaf\xfe\x34\x7f\xc2\x2b\xa3\x7f\xcf\xa8\xff\0\xbf\xaf\xfe\x34\x7b\x49\x07\x24\x44\xff\0\x84\x5b\x46\xff\0\x9f\x51\xff\0\x7f\x5f\xfc\x69\x3f\xe1\x16\xd1\x87\xfc\xba\xff\0\xe4\x47\xff\0\x1a\x3d\xa4\x83\x92\x21\xff\0\x08\xbe\x8d\xff\0\x3e\xbf\xf9\x11\xff\0\xc6\x8f\xf8\x45\xf4\x5f\xf9\xf5\x3f\xf7\xf1\xff\0\xc6\x8f\x69\x2e\xe1\xc9\x11\x3f\xe1\x17\xd1\x71\xff\0\x1e\xa7\xfe\xfe\x3f\xf8\xd2\x7f\xc2\x31\xa2\xff\0\xcf\xaf\xfe\x44\x7f\xf1\xa3\xda\x48\x39\x22\x1f\xf0\x8c\xe8\xbf\xf3\xe8\x7f\xef\xe3\xff\0\x8d\x27\xfc\x23\x5a\x2f\xfc\xfa\x9f\xfb\xf8\xff\0\xe3\x4f\xda\x4b\xb8\x72\x44\x3f\xe1\x1b\xd1\x7f\xe7\xd0\xff\0\xdf\xd7\xff\0\x1a\x4f\xf8\x46\xf4\x6f\xf9\xf4\x3f\xf7\xf5\xff\0\xc6\x8e\x79\x77\x0e\x48\x89\xff\0\x08\xde\x8d\xff\0\x3e\x87\xfe\xfe\xbf\xf8\xd0\x3c\x39\xa3\x7f\xcf\x99\xff\0\xbf\xaf\xfe\x34\x73\xcb\xb8\x72\x44\x4f\xf8\x47\x34\x6f\xf9\xf4\x3f\xf7\xf5\xff\0\xc6\x8f\xf8\x47\x34\x7f\xf9\xf3\xff\0\xc8\xaf\xfe\x34\x7b\x49\x77\x17\x24\x40\xf8\x73\x47\x1f\xf2\xe7\xff\0\x91\x5f\xfc\x69\x0f\x87\x74\x71\xff\0\x2e\x7f\xf9\x15\xff\0\xc6\x8e\x79\x77\x0e\x48\x89\xff\0\x08\xf6\x91\xff\0\x3e\x7f\xf9\x11\xff\0\xc6\x83\xe1\xed\x23\xfe\x7c\xff\0\xf2\x2b\xff\0\x8d\x1c\xf2\xee\x3e\x48\xf6\x0f\xf8\x47\xb4\x8f\xf9\xf3\xff\0\xc8\x8f\xfe\x34\x9f\xf0\x8f\x69\x1f\xf3\xe7\xff\0\x91\x1f\xfc\x68\xe7\x97\x70\xe4\x88\x1f\x0f\x69\x1f\xf3\xe9\xff\0\x91\x1f\xfc\x68\xff\0\x84\x7b\x49\x3f\xf2\xe9\xff\0\x91\x1f\xfc\x68\xf6\x92\xee\x2e\x48\x89\xff\0\x08\xf6\x93\xff\0\x3e\x9f\xf9\x11\xff\0\xc6\x83\xe1\xed\x27\xfe\x7d\x3f\xf2\x23\xff\0\x8d\x1e\xd2\x41\xc9\x11\x0f\x87\xf4\x9e\xd6\xbf\xf9\x11\xff\0\xc6\x93\xfe\x11\xfd\x27\x3f\xf1\xeb\xff\0\x91\x1f\xfc\x69\xf3\xc8\x39\x22\x6c\x08\xf9\xea\x29\xc2\x1f\x71\x50\x58\xbe\x57\xb8\xa5\xf2\xbd\xc5\x21\x8b\xe4\xfb\x8a\x51\x17\xbd\0\x2f\x92\x3f\xbc\x29\xde\x48\xcf\x5a\0\x5f\x24\x7a\xd2\x88\x57\xd6\x80\x14\x42\xbe\xb4\xbe\x52\xfa\x9a\x04\x28\x89\x69\x7c\xb5\xa0\x62\x88\xd6\x8d\x8b\x48\x05\x08\x94\xbb\x12\x80\x17\x62\x76\xa3\x6a\xf6\x14\0\xbb\x53\xd2\x8d\xab\xe8\x28\0\x01\x7d\x29\x40\x5f\x4a\x04\x1f\x2f\xf7\x45\x2f\xca\x3b\x0a\x06\x1f\x2f\xa5\x1f\x2f\xa0\xa0\x05\xca\xfa\x0a\x01\xe7\xb6\x3e\x94\x58\x42\xe4\x7a\x0f\xca\x82\xc3\xdb\xf2\xa2\xc3\x10\x30\xa5\xdf\x40\x08\x5e\x8d\xfe\xf4\x08\x37\xd1\xbe\x80\x0f\x30\xd2\x79\x94\x0c\x37\xd1\xbc\xe6\x81\x08\x5c\xe6\x90\xb9\xa0\0\xb9\xa4\x2e\x7d\x68\x01\x0b\x1a\x42\xc7\xd6\x80\x10\x92\x4f\x5a\x4a\x60\x21\xa4\xa4\x02\x76\xe2\x92\x98\x09\x45\0\x21\xa4\xe8\x28\x01\x0d\x25\0\x25\x27\xb5\0\x04\x66\x92\x98\x05\x25\x20\x13\x14\x74\xa0\x02\x93\xad\x30\x12\x92\x90\x09\x8a\x4c\xf1\x4c\x02\x8f\xd2\x80\x13\xbd\x14\0\xd3\x49\x40\x16\x06\x69\xc0\x9a\x60\x2e\x69\x45\x20\x1c\x09\xa5\x07\x14\0\xa0\xd2\xe7\x8a\0\x50\x69\x73\x40\x0a\x0f\xa5\x2e\x68\0\x06\x97\x26\x90\x06\x68\xcd\0\x2e\x68\x07\x14\0\xbb\xa8\xcd\0\x2e\x68\xcd\0\x1b\xa8\xcd\0\x19\xa3\x3d\xe8\x01\x69\x73\x8a\0\x33\xc5\x04\xfa\xd0\x01\x9f\x5a\x09\xe6\x80\x0e\x94\x50\x01\x40\x1d\x68\0\x34\xbc\xd2\x01\x28\xa6\x01\x49\xf4\xa4\x02\x51\xf4\xa6\x01\x49\xde\x80\x0a\x4a\0\x28\xf5\xa0\x04\x3d\x69\x0f\x7e\xf4\0\x52\x1a\0\x43\x49\xf5\xa0\x02\x93\xaf\x5a\0\x43\x4d\xa6\x01\xc5\x21\xa0\x62\x1a\x4a\0\x0d\x27\xf2\xa4\x20\xa4\xa6\x02\x7b\x51\xde\x90\x08\x69\x31\x4c\x04\x22\x8a\0\x4f\xe5\x45\0\x21\xa4\xeb\xd2\x80\x10\xfb\x52\x50\x05\x8c\x52\x8e\x29\x80\xe0\x3d\x69\x45\x20\x16\x96\x80\x1c\x07\x34\xa2\x80\x0a\x5e\xf4\0\xa3\xa5\x02\x80\x16\x80\x68\x01\x45\x1f\x41\x48\0\xd2\xd0\x02\x83\x46\x68\x01\x45\x02\x80\x0f\xa5\x14\0\x0a\x5a\0\x05\x1d\x68\x01\x73\x8a\x28\0\xa2\x80\x0a\x5e\xf4\0\x63\xbd\x02\x80\x0c\xd2\x9a\0\x4a\x3a\xd0\x02\x50\x69\0\x74\xa2\x98\x09\x47\xd6\x80\x10\xd1\xde\x90\x09\x8a\x0d\x30\x0a\x6f\xd6\x80\x13\xad\x25\x03\x0e\xf4\x94\x08\x4e\xa6\x93\x19\xa0\0\x8c\x9a\x43\x40\x08\x45\x21\xe2\x80\x0c\x52\x50\0\x45\x25\x03\x12\x90\xd3\x10\x86\x8a\0\x4a\x28\x01\xa6\x83\xf4\xa0\x02\x93\xe9\x40\x08\x69\x28\x01\x29\x38\xc5\0\x59\xc5\x2e\x29\x80\xea\x51\x40\x0b\x40\xa4\x03\x85\x2f\xd6\x80\x16\x81\xed\x40\x0b\x4b\xd6\x80\x0a\x07\x4a\0\x28\xa4\x02\x8a\x5a\0\x3a\xd1\x9e\x68\0\xa7\x50\x02\x52\xe3\x9a\0\x5a\0\xa0\x05\xa0\x50\x01\x4b\x40\x09\x4a\x28\0\xa3\xa5\0\x14\x52\0\xfa\x9a\x3b\x53\x01\x69\x28\0\xef\x49\x40\x01\xa3\xeb\x40\x09\xc5\x14\0\x9d\xe8\xe3\x8a\x40\x2d\x37\x92\x29\x80\x52\x50\x02\x1e\x94\x94\0\x94\x1a\0\x4a\x4a\0\x4c\x52\x11\x40\x07\x7a\x4a\x06\x21\xa4\xef\x40\x01\xa4\xf6\xa0\x41\xf4\xa4\x34\xc0\x4a\x4a\0\x05\x25\0\x25\x1d\x0d\0\x21\xe6\x8c\x50\x02\x1a\x43\xc5\0\x34\xd2\x1a\0\xb5\xde\x94\x0a\0\x51\x4a\x29\x80\xea\x29\0\xa2\x96\x80\x0a\x70\xa0\0\x51\x40\x06\x0d\x14\0\x52\xe3\xbd\x20\x0e\xb4\xea\0\x28\xa0\x05\xa5\xa0\x03\x9a\x3d\xa8\x01\x4f\xd2\x8c\xd0\x02\xd2\x50\x02\xf7\xe6\x8c\x7a\xd0\x01\x4b\xd2\x80\x0a\x31\xcf\x5a\0\x5a\x28\x01\x29\x69\0\x86\x80\x29\x80\xb4\x98\xa0\x04\xa3\x14\x80\x28\xeb\xef\x40\x09\x8e\x28\xa0\x04\x34\x1f\x4c\xd0\x02\x13\x49\x40\x06\x39\xa4\xa0\x04\xfa\x52\x62\x98\x09\x49\x40\x05\x27\xd2\x80\x03\xf4\xa6\xd0\x02\x51\x40\x09\xd2\x92\x80\x0a\x42\x28\x01\x08\xa3\x14\0\x52\x1a\x60\x21\xa4\x14\x80\x28\xc5\x30\x13\x14\x94\0\xd3\x48\x78\xa0\x0b\x58\xa5\xed\x40\x0a\x39\xa5\x1c\x50\x02\xd2\xd0\0\x3a\x52\xe6\x80\0\x29\x68\0\xa5\x1d\x68\0\xa3\xb5\x20\x16\x96\x80\x0e\x94\xa2\x80\x0a\x5e\x94\0\x51\x40\x0b\x4b\xcd\0\x14\x0f\x6a\0\x28\xa0\x05\xcd\x14\0\x1e\x69\x68\0\xef\xcd\x2d\0\x25\x2e\x33\x40\x05\x14\x80\x31\x45\0\x14\x98\xa0\x03\x02\x8e\xd4\0\x52\x67\x9a\x60\x26\x68\xeb\xde\x90\x05\x25\0\x27\x7a\x4a\0\x4a\x0e\x7d\x29\x80\x84\x51\x8a\0\x4a\x43\xd6\x81\x89\x8f\x7a\x4a\0\x0d\x25\0\x25\x26\x28\x10\x94\x1c\xd0\x01\x49\x81\x40\x08\x47\x7a\x43\x40\x01\x14\x94\0\x87\xad\x25\x30\x0e\xd4\x1a\x06\x27\x7a\x69\xe9\x48\x42\x52\x53\x02\xd8\x14\xb4\xc0\x5e\xd4\x50\x02\x8a\x5a\x40\x14\xa2\x80\x14\x75\xa2\x80\x01\x4b\x40\x07\xbd\x03\xa5\0\x2d\x2f\x41\x40\x07\x7a\x5a\x40\x1d\xba\x52\x90\x08\xe6\x80\x01\xc6\x05\x2e\x38\xe6\x80\x0c\x73\x4b\x40\0\xa2\x80\x0a\x5c\x7a\xd0\x02\xd1\x40\x05\x02\x80\x0a\x5a\0\x3e\xb4\x50\x01\x8f\x4a\x0d\x20\x03\x45\x30\x0e\xb4\x52\0\x34\x94\xc0\x4a\x31\x40\x05\x27\x6e\xb4\0\x52\x50\x02\x52\x1a\0\x29\x28\x01\x28\x3e\xf4\x0c\x29\xa6\x80\x12\x8a\x04\x27\x7a\x42\x4d\x30\x12\x8a\0\x43\x45\0\x25\x25\x20\x13\x18\x14\x50\x02\x52\x66\x98\x09\x47\x1d\xa8\0\x3f\x5a\x4c\x50\x02\x1a\x4a\0\x4a\x69\xa0\x0b\x94\x75\xa0\x07\x71\xf8\xd1\x40\x06\x69\x45\0\x2d\x14\0\xbd\x28\xa0\x02\x97\xad\0\0\x51\x40\x0a\x3a\x51\x8a\x40\x28\xf5\xa5\xa0\x05\xa2\x80\x0e\xf4\xb4\0\x52\xf6\xa0\x03\xb7\x14\xbd\xe8\0\x14\x50\x01\xcd\x1f\x8d\0\x28\xeb\x8a\x28\x01\x40\xfc\xa8\xc5\0\x14\x50\x01\x4b\x8a\0\x0d\x14\x80\x4f\xc2\x8a\0\x29\x38\xa0\x02\x8a\x60\x25\x06\x90\x09\x8e\x29\x0d\0\x1d\x07\xd6\x90\xd0\x02\x52\x62\x80\x03\x49\xd2\x98\x09\x48\x78\x14\0\x1a\x42\x28\x18\x94\x94\x08\x3a\x52\x50\x01\x49\xf4\xa0\x04\x34\x1a\0\x69\x14\x62\x80\x12\x8c\x73\x4c\x04\xa4\xed\x40\xc4\x3d\x68\xa0\x42\x7d\x69\x0d\0\x34\xd2\x50\x05\xca\x51\x4c\x05\xa0\x52\x01\x45\x03\xeb\x40\x0a\x38\x14\xb4\0\x7f\x2a\x28\x01\x68\xfa\xf5\xa0\x02\x97\xad\0\x14\x0a\x40\x3a\x8a\0\x29\x68\0\xeb\x4b\x40\x0a\x3f\x5a\x33\x8a\0\x31\xf8\x9a\x5a\0\x28\xfa\x50\x02\xf3\x46\x33\x40\x05\x2d\0\x14\x50\x01\xc5\x2f\x6a\x40\x02\x8a\x60\x14\x76\xa4\x01\x45\0\x25\x27\x5e\x94\0\x1a\x0d\0\x25\x26\x68\0\xef\x45\0\x34\xff\0\x2a\x3a\x74\xa6\x02\x51\x40\x09\x9a\x43\x48\x04\xfc\x69\x0d\x31\x86\x29\x3b\xd0\0\x79\xa4\xc0\xa0\x04\xc5\x06\x81\x0d\xe2\x83\x40\xc4\xcd\x06\x81\x08\x69\x0f\x3d\x28\0\x3e\x94\x82\x80\x10\xd2\x53\0\xa4\x3e\xb4\x86\x25\x21\xe9\x4c\x42\x1a\x43\xd2\x80\x2d\x8a\x51\x4c\x05\xa5\xa4\x01\x47\x51\x40\x0b\x4b\x40\0\xa2\x80\x16\x81\x40\x05\x28\x34\0\x51\x48\x05\x1d\x29\x68\0\xa5\xcd\0\x02\x94\x50\x02\x93\x40\xeb\x40\x05\x14\0\xb4\x50\x01\x4b\xd6\x80\x01\x4b\x40\x07\xe1\x47\x6a\0\x31\x45\0\x2f\x53\x45\0\x02\x8a\x40\x14\x87\xd6\x80\x0a\x28\x01\x31\x40\x14\xc0\x4a\x3d\xa9\0\x66\x9b\x40\x01\xa4\x34\0\x9d\xa8\xa6\x02\x52\x50\x31\x38\xa4\xa0\x02\x93\x34\0\x52\x1a\0\x4a\x43\x40\x80\xd2\x50\x31\x0f\x4a\x4f\x5a\x04\x06\x92\x81\x85\x25\0\x25\x06\x98\x0d\xa4\x34\0\x7d\x7a\xd2\x50\x21\x0d\x21\xa0\x0b\x78\xcd\x3b\xe9\x4c\x02\x97\xa5\x20\x0e\xf4\xb4\0\x52\xf5\xa0\x03\xa5\x14\0\xbf\x4a\x0f\x26\x80\x0a\x5a\0\x3b\x51\x48\x05\xc5\x14\0\xb4\x63\xdf\x8a\0\x5a\x51\x40\0\xe9\x4b\x40\x07\x4a\x5a\0\x07\x7a\x3b\xd0\x02\x8e\x28\xa0\x03\x81\x4b\x40\0\xa2\x80\x16\x93\xb5\0\x2d\x14\0\x51\xd6\x80\x0e\x94\x94\0\x52\x76\xa4\x01\xde\x83\xd2\x98\x08\x4d\x25\0\x1f\x51\x49\x40\x09\x49\x40\x01\xa0\xd0\x02\x52\x50\x02\x1f\x7a\x3f\x95\0\x25\x21\xa0\x62\x51\x40\x84\x34\x98\xcd\x03\x03\x49\xf4\xa0\x04\xa2\x81\x08\x68\xa6\x31\x29\x28\x01\x0d\x21\xa0\x04\x34\x1a\x04\x25\x21\xa0\x06\x93\xcd\x21\xa0\x0b\xa2\x94\x53\x01\x45\x18\xa4\x02\xd1\xde\x80\x01\xd2\x96\x80\x01\x45\0\x14\xb4\0\x52\x8a\0\x31\xcd\x02\x80\x17\x34\x7e\x34\x80\x5a\x3a\x50\x02\x8e\x4d\x1f\x4a\0\x5f\xad\x2d\0\x14\x1a\0\x3b\x52\xd0\0\x3b\x51\x9a\0\x5a\x5a\0\x53\x49\x40\0\x14\xb4\0\x51\xd6\x80\x0a\x29\0\x67\x9f\x7a\x4c\x50\0\x71\x48\x45\x30\x0a\x41\x40\x07\x02\x93\xad\0\x1e\xf9\xa4\x26\x80\x13\x34\x94\0\x94\x50\x31\x05\x14\0\x86\x92\x81\x05\x14\0\x94\x9f\x5a\x06\x21\xa2\x80\x10\xfb\xd2\x62\x80\x0a\x4a\x62\x10\xd0\x68\x18\xd3\x47\xd2\x80\x10\xd2\x76\xa0\x02\x90\xd0\x21\x3e\xb4\xd3\x40\x09\x48\x68\x02\xed\x28\xa6\x02\xd2\xd2\0\xa2\x80\x17\xb5\x14\0\x77\xa3\x34\0\x51\xd2\x80\x0c\xd2\xd0\x02\xf6\xa3\x34\0\x01\x4a\x28\0\x1c\x52\xfd\x68\0\x14\xa3\xda\x90\x05\x2e\x71\x4c\x02\x97\xeb\x48\x03\xeb\x4b\x40\x07\xd2\x8c\x50\x02\x8a\x5a\0\x28\xc7\x34\0\x76\xa3\x8a\0\x5a\x4a\0\x5c\xd1\xef\x40\x09\x45\0\x14\x86\x80\x0e\x29\x0d\0\x26\x68\x26\x80\x1b\x9a\x0f\xbd\x20\x13\xeb\x46\x79\xa6\x02\x73\x8a\x4c\xd0\x01\x9a\x28\x01\x0d\x21\xfa\x66\x80\x12\x82\x68\0\xa4\x34\0\x94\x9f\xa5\x03\x16\x93\xf1\xa0\x42\x52\x50\x02\x66\x92\x98\x09\xd6\x83\xf5\xa4\x03\x68\x34\xc6\x25\x21\x34\x08\x29\xb9\xa0\x04\x34\x94\x01\x78\x51\x4c\x05\xa2\x80\x0f\xa5\x28\xa4\x01\x9a\x28\x01\x7b\xd1\x40\x09\x4b\x9a\0\x29\x68\x01\x69\x0f\x5a\0\x05\x2e\x48\xa0\x03\x39\xa5\xa0\x03\x34\xb4\0\xa3\x81\x47\x4e\x94\0\x03\x4b\xf8\x52\0\xa5\x14\x08\x29\x45\x03\x17\x34\x03\xc5\0\x19\xe6\x8c\xd0\0\x08\xfa\xd0\x0e\x7d\x28\x01\x73\xef\x48\x58\x0e\xa4\x50\x02\xe4\x62\xa1\x7b\xbb\x75\x24\x19\xa3\x04\x71\x8d\xc2\x81\x12\xa9\x04\x64\x10\x47\xb5\x19\xa0\x60\x4e\x29\x91\x4c\x93\x20\x78\x9c\x3a\x9e\xe0\xe4\x50\x04\x69\x75\x03\xdc\x3c\x0b\x22\x99\x50\x65\x90\x1e\x40\xa4\x96\xee\x08\xa7\x48\x5e\x45\x59\x24\xfb\xaa\x4f\x26\x8b\x31\x5c\x44\xbb\x82\x44\x0e\x92\xa9\x52\xdb\x33\x9e\xfe\x95\x26\x7f\x3a\x06\x44\x2e\x62\x37\x26\xdc\x37\xef\x02\xee\x2b\xed\x52\x50\x02\x66\x80\x78\xa0\x03\x3e\x94\xd7\x7d\x88\x58\xf4\x03\x3c\x50\x06\x5b\xeb\xf6\xaa\xea\x9e\x4d\xc1\x66\xe8\x3c\xa3\x93\x56\x2d\xb5\x38\x6e\x26\x48\x95\x64\x47\x91\x4b\x61\xd7\x1c\x03\x8a\xae\x52\x54\x89\xae\x6e\x56\x04\xde\x55\xdf\x90\x30\x83\x27\x9a\x90\xb7\x1d\x69\x58\xa0\xdc\x29\x37\x02\x71\x40\x08\x5c\x6e\xc7\x7a\x18\xe0\x66\x80\x0c\xd2\x9f\xc2\x90\x0d\x66\0\x1c\x9e\x29\xbb\xfb\x90\x71\x4c\x05\xcf\x14\xc2\xf8\x34\0\x33\x63\xa7\x34\x85\xb8\xcd\0\x26\xf1\xd7\xd2\x9a\x1f\x3d\xbf\x1a\0\x52\x71\x48\x1b\x23\x39\xa0\0\x36\x49\xf6\xa4\xcd\0\x26\x7d\x69\x09\xe6\x80\x10\x91\x8a\x32\x0f\x4a\x60\x5d\xa5\xcd\0\x19\xa0\x75\xa4\x02\xd0\x38\xa0\x05\x34\x50\x01\x47\x38\x3e\xb4\x01\x8d\x75\x7d\xa9\xc3\x3c\x31\x79\x30\x6e\x98\x90\xbf\x31\x23\x81\x93\x52\x7f\x68\xcd\x6d\x3c\x31\xea\x1e\x54\x7b\xd1\x99\x8a\x9e\x01\xcf\x02\xaa\xc8\x9b\xbe\xa5\x99\x6f\x91\xe0\x8a\x4b\x69\x62\x65\x69\x15\x49\x63\xf9\x81\xef\x4e\x97\x52\xb4\x86\x61\x0c\x93\xa0\x93\xd3\x3d\x29\x58\x77\x2c\x4f\x21\x4b\x79\x1d\x59\x41\x54\x2c\x0b\x74\x1c\x77\xaa\x63\x54\xb7\x8a\x18\xbe\xd3\x32\xef\x74\x0f\xf2\x82\x77\x7b\x8a\x12\x06\xec\x2a\x6b\x36\x2c\xca\x16\x70\x77\x60\x74\x38\xc9\xf5\x3d\xa9\xd7\x7a\x9d\xb5\xb4\x9e\x5b\xc8\x77\x80\x09\x01\x49\xc0\xf7\xc5\x16\x62\xe6\x42\x4f\xa9\x5b\x44\x91\xb1\x94\x9f\x37\x94\x0a\x0b\x16\x1f\x41\x49\x16\xab\x6c\xf6\xd2\xcc\xb3\x7c\x91\x9d\xac\x48\x23\x1f\xe7\x34\x59\x85\xd0\xb6\x9a\x94\x17\x13\x08\xd1\x9d\x64\xc6\x76\x3a\x90\x48\xf5\xa9\x2f\xae\x0c\x37\x76\x89\xe6\xec\x12\x16\x05\x76\xe7\x76\x07\xaf\x6a\x2d\xa8\x5f\x42\x05\xd6\xad\xde\x54\x5d\x92\x6c\x66\xd8\xb2\xec\x3b\x18\xfa\x66\xae\x4f\x70\x90\x40\xd3\x4e\xdb\x23\x4e\x49\xa1\xa0\xb9\x5a\x1d\x66\x17\x90\xa4\xd1\x4b\x01\xdb\xbc\x79\xa3\x19\x1d\xe9\x21\xd6\x62\x92\x58\xc3\x41\x34\x71\xca\x71\x1c\x8e\xb8\x56\x3d\xbf\x3a\x39\x58\x73\x11\xbe\xba\x81\xe5\xf2\xad\xa7\x91\x20\x25\x64\x60\x06\x17\x07\xad\x5a\x87\x54\x8a\x59\xda\x25\x07\x84\x12\x06\x3d\x19\x4f\x71\x47\x28\x5c\xa8\xda\xf0\x2b\x17\x95\x6d\x24\x8d\x3e\xef\x2d\x46\x39\xc1\xc7\xe1\x4b\x1e\xa4\xb6\xcd\x76\xf2\x79\xd2\x38\x94\x22\xa1\x39\xcb\x11\xc0\x5f\x4a\x39\x45\xcc\x39\x75\x69\x5a\xe1\xad\x6e\x2d\x1e\xde\x43\x11\x70\x77\x06\xfe\x55\x53\x4e\xd5\xa7\x86\xc6\xda\x49\xed\xdd\xa1\x62\x10\xcc\x5f\x24\x92\x71\x9c\x7a\x66\x9f\x28\x5c\xb5\xa6\x5e\x5d\x4b\xab\xde\x47\x24\x78\x89\x36\xe3\xe7\xce\xde\x3f\xad\x4d\xa8\x41\x35\xc5\xda\x87\x98\xc5\x66\x8a\x59\xf6\xbe\xd2\xc7\xb0\xcf\xa5\x2b\x59\x8f\x74\x63\xa5\xec\xc9\x6d\x2d\xbd\xbc\xf2\x34\x13\x5c\xac\x31\x4c\x4f\x21\x4f\x5c\x1a\xb5\x3b\xbe\x91\x79\xb6\x19\x1d\xa2\x92\xdd\xdc\x2b\xb1\x6c\x32\xf3\x9e\x69\xd8\x92\x23\x1b\x59\xd8\xda\x6a\x4b\x24\x8d\x70\xee\x86\x56\x2f\xf7\xd5\xbb\x62\x99\x7c\x23\x97\x51\xbc\x96\xea\xce\xe2\x78\xd3\x6e\x0a\x1c\x05\0\x73\xdf\x9a\x60\x74\x3a\x7c\x91\x4b\x67\x13\x5b\x9f\xdd\x6d\x1b\x7e\x95\xcc\xda\x35\x9f\x9b\x7a\x97\x56\x12\x5c\x49\xe7\xbe\x19\x23\xdd\xc7\xa6\x69\x21\xbb\x68\x5c\xb5\x92\xf2\xc3\x43\x85\x37\x25\xb9\x69\x0e\x5e\x53\xfe\xad\x73\x91\xc7\x73\xed\x4d\x4d\x66\xe0\xda\x5f\x95\x9a\x39\x9e\xd9\x54\xa4\xca\x98\x0d\x93\xe9\x47\x2d\xc2\xf6\x34\xaf\x6e\xe5\x8a\xea\xc5\x11\x80\x49\xc9\x0f\xc7\xb7\x15\x17\x86\x49\x1a\x4a\xf3\xcf\x98\xe0\x7f\xdf\x46\x95\xb4\x1f\x53\x2e\x42\xd6\xde\x22\xb8\xbd\x53\xf2\x24\x89\x1c\x83\xfd\x96\x5e\xbf\x9e\x29\x2e\x0b\x5d\x6b\x91\x5e\x06\xf9\x12\x71\x02\x7e\0\x93\xfa\xd5\x13\xe4\x32\xe1\xa7\xb9\xb5\xb7\x26\x6d\xa5\x6f\xb6\x0d\xaa\x3a\xe4\xe0\xfe\x15\xa0\x0d\xe5\xfc\xf7\x3e\x4d\xdb\x42\x2d\xdb\xcb\x4c\x28\xf9\x98\x0e\x49\xe3\xa5\x21\xea\x56\x10\xdd\x4f\xac\x88\xe6\x9c\xc3\x27\xd9\x86\xf6\x8b\x1c\xfc\xdd\x8d\x24\x5a\x85\xd7\x97\x04\x6d\x2b\x12\x97\x9e\x4b\x31\xea\xeb\xef\x4e\xc8\x5a\xa2\x6b\xfb\xa9\xa3\xd4\x6e\x23\x49\x58\x28\xb3\x67\x03\xb0\x6c\xf5\xaa\xc2\x3b\xc4\x87\x4f\x94\xdf\xcc\x5e\xe9\x82\x37\x23\0\x11\x9e\x3d\xfd\xe9\x59\x0d\xdc\xbd\xa6\x99\x61\xd4\x6e\xec\xda\x69\x25\x8e\x30\xac\xa5\xce\x48\xcf\x5e\x6b\x4b\x9c\x13\xba\x93\x29\x19\x77\xc4\x7f\xc2\x43\xa7\x7f\xbb\x27\xf2\xa8\xb5\x08\x05\xce\xbb\x6f\x19\x76\x55\x31\x36\x76\x9c\x12\x33\xd2\x99\x2f\xa9\x46\xe0\xcb\x0d\xbd\xe4\x2b\x33\x95\x82\x74\x09\x96\x24\x80\x48\xe3\x34\xfb\xe4\x90\x5c\x5c\x4b\x3a\xcb\x3a\x29\xf9\x24\x82\x4e\x62\xc7\x6d\xb9\xea\x29\x88\xdd\xb3\x70\xf6\x91\x3a\xb9\x90\x30\x1f\x31\xea\x7d\xe9\xe0\x61\x8b\x13\xde\xa4\xb0\x1c\xb8\x3d\x73\x4f\x93\xee\xf3\x48\x62\x29\xe4\xd3\x33\xf2\x81\x40\x0b\x80\x72\x29\x1b\x21\x79\xa0\x07\x74\x15\x18\xf9\x86\x73\x40\x07\x73\x4d\xee\x3e\xb4\0\x60\x12\x7d\x31\x48\x4e\x30\x0d\0\x2b\x63\x69\xcd\x33\xab\x28\xf6\xa6\x03\x4f\x1b\x85\x2f\x1c\x11\xde\x81\x08\x46\x54\xd3\x79\x18\x3e\xa2\x80\x10\x8c\x05\xc8\xe2\x8e\xed\x8a\0\xd1\xa2\x81\x87\xd2\x94\x50\x02\xd1\xcd\x20\x0e\x3b\x52\xe6\x80\x0a\x33\x40\x19\x7a\xae\x7f\xb4\xf4\xcf\xf7\xdf\xff\0\x41\xa4\xbc\x89\x64\xd7\x6d\x0b\x28\x6d\xb1\xb1\xe7\xb7\x3f\xfd\x7a\xa4\x49\x42\x64\x09\x24\xe1\x46\0\xbf\x8c\x80\x07\x4e\x94\xdb\x99\x16\x16\xbb\x31\xca\xb9\x67\xcb\x5a\xcc\x99\x2e\xdc\x74\x23\xf4\xaa\x24\xdc\xb8\x25\xb4\xa9\x77\x26\xc2\x61\x6c\xaf\xa7\xcb\x59\x7a\x6a\x13\x7f\x60\x59\x73\x8b\x11\xf8\x73\x52\x8a\x7b\x91\x79\x7b\x7c\x3d\x7a\xa9\x1f\xcd\xe7\x1c\x60\x7f\xb6\x29\xba\x84\xcf\xf6\xbb\x94\x91\x9a\x02\x50\x05\x44\x8f\x26\x5e\x3a\xe6\x99\x22\x69\x6f\xe4\xb5\x9d\xcb\xc6\xef\x08\x80\xc5\x95\x52\x76\xb0\x6a\x67\x95\x25\xdd\xa5\xeb\x45\x13\xa9\x17\x62\x42\x8a\x3e\x6c\x63\xf9\xf3\x9a\x7d\x44\x5c\xd3\xe1\x8e\x6d\x52\x29\x22\x7b\x99\xc4\x6a\x49\x92\x4e\0\xcf\x60\x30\x2a\xf6\xad\x13\xc9\x7d\xa7\xb2\x21\x60\x8e\xfb\x88\x1c\x0f\x97\xbd\x4f\x52\x96\xc6\x4c\x6b\x2c\x52\xa2\xd9\x45\x75\x1c\xa2\x5f\x9e\x16\x1b\xa3\x51\x9e\x79\xad\x8d\x66\xde\x5b\x8d\x32\x44\x89\x77\x3e\x43\x6d\xf5\xc1\xe9\x4d\xbd\x41\x2d\x19\x52\x57\xb8\xd5\x11\xe1\x8a\xd1\xe2\x5f\x29\xb2\xf2\xae\xd2\x1b\xd0\x53\x08\x9e\xf2\x1b\x5b\x3f\xb1\xc9\x13\x45\x22\xb3\xbb\xae\x15\x42\xfa\x1e\xf4\x06\xac\x8a\x09\xa7\x8c\x6a\x50\xc1\x69\x24\xbe\x64\xf2\x2a\xb2\x81\x8c\x9e\x39\xf4\xa5\xd5\x2c\xa6\xb3\xb0\xb3\xf2\x58\x7d\xa0\xaf\xd9\x8f\xb8\x61\xfd\x08\xa2\xe2\xd6\xc6\x80\xb0\x78\xef\x6c\x4c\x51\xfe\xea\x08\xd9\x49\xcf\x4e\x2a\xa5\xed\x94\xe2\x4b\x89\x8e\xd5\xc5\xca\x4b\x16\xf6\0\x39\x03\x18\xcd\x24\xc6\xd0\x91\xbd\xcd\xd6\xbd\x1f\xda\x21\x10\x91\x6e\xc0\x26\xe0\xc4\x73\xd4\xd5\x8f\xec\xeb\x93\xa0\x43\x6d\xb0\x79\xa8\x54\x95\xcf\xa3\x66\x8b\xa4\x16\x6c\x9a\xd2\xd6\xea\xdf\x57\xb8\x7f\x28\x18\x27\x0a\x7c\xcd\xdd\x08\x18\xc6\x29\x35\x9b\x4b\xdb\xab\x98\xbc\xb8\xd2\x5b\x74\x19\x68\xcb\xed\xdc\xdd\xb3\x4a\xea\xe3\xb3\xb0\xd9\xac\xaf\x6e\xec\xbc\xa7\x82\x1b\x67\x81\xd5\xe1\xda\xd9\x52\x45\x2a\x69\xf7\x57\xb7\x06\x6b\xf5\x48\x94\x42\x62\x54\x56\xdd\xd7\xa9\xa2\xe8\x2c\xc8\xa2\xd2\xf5\x09\x22\x82\xd2\xe9\xa2\xfb\x3c\x0e\x1b\x78\x27\x73\x81\xd0\x62\xa7\x9e\xd3\x55\x59\x26\x48\x24\x85\xe2\x94\x9d\xad\x21\x39\x8f\x3d\xbd\xe8\xba\x15\x99\x7f\x4e\xb3\x16\x56\x91\xc0\xad\xbb\x60\xc6\x7d\x6a\x1d\x32\xc6\x4b\x3f\xb4\x97\x65\x63\x34\xcd\x20\xc7\x60\x69\x5c\xab\x0c\xd5\x74\xf9\x2e\x5e\xde\x5b\x76\x8f\xcc\x81\x8b\x05\x90\x65\x5b\x35\x51\x74\x5b\xa9\x0d\xd1\xba\x9d\x0f\xda\xa3\x01\xb6\xae\x36\xb0\xe9\x8f\x6a\x69\x8a\xc3\xc6\x95\x79\x24\xf6\xd3\x5d\xdd\xa3\x7d\x98\xfc\xaa\x89\x80\x78\xc6\x7e\xb5\x6f\x4b\xb2\x36\x76\x82\x1d\xfb\xb0\xc5\xb3\x8c\x75\x39\xa1\xb0\x48\x82\x5d\x1d\x65\x6b\xed\xf2\x71\x76\x14\x63\x1f\x74\x81\xd7\xde\x92\x0d\x1d\x62\xb6\xb4\x88\x4a\x49\xb7\x97\xcc\xdc\x47\x2e\x79\xff\0\x1a\x39\x82\xc3\x64\xd1\x41\xb5\x31\x24\xe5\x1b\xcf\xf3\x95\xf6\xf4\x39\xcf\x4a\x6c\xba\x3c\xbe\x64\x8f\x05\xe3\x44\x26\0\x4a\x02\x83\xb8\xe3\x04\x8f\x4a\x2e\x16\x25\xb5\xd2\x62\xb5\xb9\x59\x63\x76\xf9\x63\x11\x85\x3c\xf1\x9c\xd4\x52\xe8\xb1\xb4\x72\x2a\xca\xe8\xed\x31\x99\x58\x7f\x0b\x51\xcc\x1c\xa2\x45\xa2\x28\x92\x59\x66\xb8\x96\x59\x25\x88\xc6\xc4\xe3\xa1\xa9\xe4\xd3\x63\x78\x6d\x63\xde\xe0\x5a\x95\x64\x39\xeb\x81\x8e\x68\xe6\x0e\x50\x7d\x3a\x36\x96\x79\x44\x92\x2b\xce\xa1\x58\xa9\xc1\x18\xee\x2a\xc4\x71\x6c\x8c\x2e\x4b\x63\xb9\xea\x69\x5c\x76\x21\x9a\xce\x39\xae\x61\xb8\x24\x87\x83\x3b\x70\x78\xe4\x50\xd6\x71\x9b\xa4\xb9\x39\xde\x8a\x54\x73\xeb\x4e\xe1\x62\x29\x74\xbb\x69\x3c\xe0\xc1\xbf\x7c\xc1\xdf\x9e\xe3\xa5\x47\x36\x8d\x6f\x34\xcf\x21\x69\x57\xcc\x39\x75\x57\x20\x37\xd4\x51\xcc\x1c\xa8\xba\x90\xa4\x71\x2c\x68\xb8\x55\x18\0\x7a\x52\xed\x18\x22\x90\xc0\x28\x18\xc7\x6a\x08\xc8\xe9\x40\x08\x54\x66\x9a\x50\x71\x40\x0a\x06\x0e\x45\x1d\x45\0\x21\xa6\x6d\x14\0\x15\x04\xd2\x6d\x18\xc7\x6a\0\x02\x80\x29\x36\x8e\xb4\xee\x02\x37\x23\x9a\x4c\x62\x90\x08\x54\x60\xfb\xd3\x42\xf2\x3d\xbb\xd3\x10\xe3\x4d\x23\x23\x14\x0c\x4c\x64\x60\x8c\xd2\x05\0\xe6\x81\x17\xa9\x68\x18\x51\x40\x0b\x4a\x28\x01\x78\xa4\xfc\x29\0\x51\x40\x08\x42\xb1\x19\0\x91\xd3\xda\x97\0\x9c\xe0\x64\x77\xa0\x04\xda\xa7\xb7\x5e\xb4\x18\xd4\x9d\xc5\x41\x6f\x5c\x73\x40\x0e\x03\xd2\x80\xbc\xf4\x14\0\xb8\xa3\x03\xb8\xfd\x28\x02\xad\xdd\x8f\x9e\xe8\xf1\xcd\x24\x0e\xbc\x65\x0f\x04\x7b\x8a\x7d\x8d\x94\x76\x71\xb2\x21\x66\x2c\xc5\x99\x98\xe4\xb1\xf5\x34\xef\xa0\xad\xa9\x64\x71\x4d\x79\x51\x1d\x11\xdd\x43\x3e\x76\x82\x79\x38\xeb\x48\x07\x8e\x69\x78\xa0\x03\xa5\x2d\0\x47\x05\xb4\x50\x19\x0c\x4b\x8f\x31\xcb\xb7\x3d\x49\xeb\x55\x2e\x5f\x4f\x17\x6f\x71\x39\xfd\xed\xa2\x8d\xc4\xe4\xec\x07\xa7\x14\x03\xb1\xa0\x08\x38\x35\x0d\xd2\xdb\x5c\x0f\xb2\xdc\x6c\x72\xe3\x3b\x0f\x52\x3d\x68\x02\x08\xed\xec\xb4\x98\x5e\x68\xe3\xd8\x0e\x03\x30\xcb\x13\xcf\x15\x66\x2b\xa8\xa4\xb8\x96\x15\x3f\x3c\x58\xdc\x08\xe9\x91\x91\x43\xd4\x36\xd0\x9b\x75\x47\x73\x71\x15\xac\x2d\x34\xcd\xb1\x17\x19\x34\x80\x94\x30\x20\x1c\xf1\x46\x47\x5a\x06\x41\x0d\xec\x72\xde\xcd\x6c\xa0\xef\x84\x29\x63\xd8\xe7\xd2\xac\x64\x67\x19\xa2\xc2\x41\x91\x8c\xe6\xa9\x0d\x4a\x35\x8e\x16\x9e\x36\x88\xcd\x21\x45\x53\xd8\xf3\xd7\xf2\xa2\xc1\x71\x6d\x75\x18\xa6\x79\xd5\xb1\x1f\x93\x29\x8b\xe6\x3f\x78\xf1\xfe\x35\x6f\xb5\x16\x03\x15\x75\x7b\xd9\xde\x7f\xb2\xe9\xde\x6c\x71\x48\xc9\xbb\xcd\x03\x24\x7b\x51\x36\xb8\xc6\xca\xde\x6b\x6b\x7d\xf2\x4d\x27\x95\xb1\x9b\x6e\xd6\xf7\xaa\xe5\x26\xe4\xf6\xd7\x3a\x94\x93\x28\xb8\xb1\x48\xa2\x27\x96\x12\x82\x45\x4b\xa6\x5e\x9b\xd4\x98\x94\x0b\xe5\x4a\xd1\xf0\x7a\xe3\xbd\x26\xbb\x15\x77\xd4\xb6\x78\x06\xb1\xae\xb5\x79\x53\x4e\xb8\xbc\x89\x15\x95\x24\x09\x16\x7f\x8b\x90\x09\xfc\xf3\x42\x57\x06\xec\x36\x5d\x43\x51\xb2\xf2\xe4\xbd\xb7\x80\xc2\xcc\x15\x9a\x36\x39\x5c\xfd\x6a\xd5\xa5\xeb\x4d\x7f\x77\x6e\xe1\x42\xc0\x57\x69\xee\x72\x33\x4e\xcb\xa0\x93\x7d\x48\x27\xd4\xe5\x49\xf5\x08\xd5\x53\x16\xd0\xf9\x8b\xc7\x53\x8c\xf3\x55\x9a\xff\0\x54\x8e\xc1\x2f\x5d\x6d\x5e\x2d\xa1\xca\x8c\x86\xc5\x16\x41\x76\x6c\x45\x28\x96\xdd\x65\x40\x70\xca\x18\x7e\x55\x91\xa6\xdc\xea\xb7\xf6\x89\x70\xb3\x5b\x22\xb6\x46\x0a\x1c\xf0\x71\xeb\x42\xb7\x51\xbb\xf4\x2c\x5f\xdc\x5e\x59\x5b\x43\x39\xd9\x22\xc6\x7f\x7e\x15\x7a\x8f\x51\xf4\xa4\xb6\xbe\x7b\xfb\xf2\x2d\x18\x1b\x48\x97\xe7\x7c\x7d\xe6\x3d\x85\x16\x5b\x8a\xee\xf6\x29\x4d\xaa\x5d\xff\0\x67\x3c\xaa\xea\xb2\x0b\xb3\x08\x3b\x73\x81\x9a\xbd\x6f\x0d\xf0\x99\x4c\xba\x82\x3a\x83\x92\x82\x20\x32\x29\xd9\x02\xbb\x34\x71\x41\xf4\xa8\x28\x29\x0d\0\x44\x58\xe3\xf1\xc5\x04\x91\xc9\x3d\xe9\x80\x87\x24\xfa\x0a\x01\xc3\x6d\x27\x3e\xf4\0\xac\x70\x39\xa6\x86\xcd\0\x30\xb7\xa5\x28\x39\x24\x11\x40\x03\x36\x0f\x4a\x6b\x30\xf4\xa0\x06\x96\xe4\x11\x46\xfe\x32\x78\xa6\0\x1b\x9c\x74\xcd\x1b\xbe\x5a\0\x4e\x69\x33\xc6\x4d\x02\x10\x9c\x1e\x3a\xd2\x6e\xe0\xe6\x80\x2f\x51\xd6\x81\x8b\x45\0\x2d\x2e\x68\0\xef\x46\x69\0\x0c\xd2\xd0\x06\x1f\xdb\xde\xde\x16\x36\xf0\xe5\x9a\xe9\xa2\xc1\x6e\xa7\xd6\x9c\x97\xda\x89\x9a\x5b\x71\x0c\x1e\x6c\x20\x33\x31\x63\xb7\x04\x71\x8f\x7a\xbb\x11\x77\xd0\x7b\xea\x53\xc9\x69\x6f\x2d\xba\x45\x1f\x9a\x32\xcf\x33\x61\x57\xdb\xde\x9b\x16\xb1\x23\xda\x12\xa8\x8d\x3f\x9d\xe4\xae\x0f\xca\x4f\xaf\xd2\x95\x83\x98\x55\xd4\xae\xed\xef\x1e\x1b\xd4\x8c\x2c\x70\xb4\xbb\x93\x3c\xe0\xd4\x51\x6b\x72\x89\x21\x69\x1e\xd9\xe3\x95\x82\x94\x8d\xb2\xc9\x9f\xe7\x4e\xd7\x0e\x66\x69\xea\xf7\x52\x5a\x69\xf2\x5c\x44\xa1\x9d\x71\x80\x7e\xa2\xa8\xbc\xfa\x97\xdb\x63\xb4\xf3\x20\x0d\x2c\x7e\x66\xf0\xa7\xe5\x19\xe4\x63\x3c\xd4\xab\x0d\xde\xfa\x0a\x35\x1b\x9f\xec\xed\xe5\xa2\x8e\x45\x98\xc6\xee\xdf\x74\x01\xdc\x0f\xe9\x50\xc5\xa9\xdd\x3c\x37\x82\x29\x12\x76\xb7\x0b\x22\xb8\x5c\x6e\x53\xd4\x63\xdb\x14\xec\x85\x76\x5e\x8e\xfd\xae\x75\x18\x22\x81\x81\x8b\xc9\xf3\x24\x3e\xb9\xe8\x2a\x1d\x74\x48\xd7\xfa\x6a\xc0\xc1\x24\x2c\xe0\x31\x19\xc7\xcb\xfe\x14\x2d\x18\x3d\x51\x0c\xda\x95\xce\x9b\xf6\x8b\x79\xdc\x4c\xe8\x13\xca\x7d\xb8\xce\xee\x39\x03\xd2\x96\xc3\x50\xb8\x3a\x84\x11\x19\x9e\xe2\x39\x01\xdf\xba\x2d\x9b\x0e\x32\x28\xb2\xdc\x2e\xef\x62\xf6\xb7\x2c\xf1\x2d\xb2\xdb\x4a\x22\x69\x66\x11\x92\x46\x46\x0e\x6a\x8d\xe5\xcc\xc9\x76\xd6\x7e\x7d\xc6\x20\x8d\x72\xf1\xc7\xb9\x9d\x88\xea\x78\xe2\x84\x0d\x84\x17\xd7\xd7\x02\xda\xd5\xdd\xe1\x79\x64\x75\x69\x76\xed\x62\xaa\x33\x90\x0f\x4c\xe6\xab\xcf\xe7\x59\xc9\xac\x7f\xa4\x33\xc8\x91\xc4\x55\xc8\x19\xf6\xa7\xa0\xb5\x2c\xdf\xbd\xc7\xda\x99\xa6\x92\xea\x2b\x70\xa0\xc4\xf0\x2e\x54\x71\xc9\x6e\xfd\x69\x22\x8c\x4f\xad\x59\xca\x6e\xa4\x90\x35\xbe\xed\xca\x70\x1b\x04\x76\xf4\x3e\x94\x86\x41\x19\xb9\xff\0\x84\x7e\x5b\xe6\xbc\x99\xa4\x27\0\x6e\xe1\x46\xfc\x55\x94\xb3\xfb\x66\xb7\x7e\xad\x71\x2c\x41\x56\x33\x88\xdf\x6e\x49\x5e\xa7\xf2\xa6\x21\x9a\x75\xcd\xc4\x97\x3a\x77\x9b\x33\x38\x63\x2a\x13\x9e\x1b\x1d\x0f\xbd\x45\xad\x66\x74\xd5\xc3\xbb\x15\x89\xa3\x2a\x37\x70\x3a\x03\x47\x50\xe9\xfd\x76\x1f\x3a\xcd\x3d\xf9\xb4\x8e\x09\x67\xb7\xb7\x8d\x76\xa8\x9b\x67\x27\xf8\x89\xef\x4d\xb7\x37\x13\x35\xa5\x95\xe3\x91\x0b\x4b\x20\x38\x93\x24\x85\x1c\x29\x22\x97\x40\x2f\x69\x36\xd1\xdb\x6b\xd7\xb1\xc0\x4e\xc1\x1a\x60\x16\xce\x3a\xf1\x4d\xf1\x04\xcf\x61\x76\x97\x6b\x90\x25\x85\xe2\x3f\xef\x63\x2b\x4b\x76\x3d\x91\x47\x4f\x59\x05\xc5\xbe\x93\x29\x2c\xd0\x4e\x65\x27\xfd\x90\x32\x3f\x53\x49\x1d\xb4\x32\xd8\x69\xc6\x64\x0f\xfe\x96\xc8\x49\xf4\xcb\x71\x55\x7b\x08\xb1\x0e\x9d\x6b\x70\xfa\xb4\x92\xc7\xbc\xa4\x8c\x14\x93\xf7\x78\xed\x5a\xfa\x23\x33\xe9\x16\xac\xed\xb8\xf9\x63\x93\xf4\xa9\x6c\xa4\x64\x69\x76\x77\x73\xc9\x7a\x6d\xef\x9a\xde\x31\x74\xe0\xa8\x8c\x1c\x9f\x5c\x9a\x4d\x6a\xc6\x3b\x2b\x4b\x08\x52\x56\x45\x17\x20\xb4\xb9\xc1\x04\xf7\xa7\x7d\x45\x6d\x0b\x76\x29\x6e\x97\x8a\x46\xb0\xf7\x0d\xda\x36\x90\x10\x7f\x0a\x8b\x42\xbc\xb5\xb7\xfb\x6c\x73\x4f\x14\x4d\xf6\x97\x20\x33\x01\xc5\x21\xe8\xba\x9a\xf3\x30\x96\xd1\xda\x06\x0c\x59\x0e\xd2\x0f\x07\x8a\xe7\x27\x01\xbc\x14\x81\x78\xc6\xd1\xc7\xae\xfe\x68\x41\x23\x45\x34\x44\x69\x23\x7b\x8b\xbb\x8b\x80\x84\x30\x57\x6f\x97\x3f\x4a\xa9\x16\x9f\x15\xee\xbb\xa8\xf9\xa6\x45\xd9\xb3\x05\x18\xaf\xf0\xd1\xcc\x1c\xa4\x06\xd5\x2d\x2e\xb5\x68\xa2\x2c\x57\xec\xb9\xf9\x8e\x4f\x43\x56\x34\xed\x0e\x19\xac\x6d\xe4\x9a\x7b\x87\x56\x45\x63\x19\x7f\x97\xa7\x4c\x53\x72\x12\x46\xe1\x50\x23\xda\xa3\0\x0c\x01\x5c\x86\x95\xfd\x90\xb6\x48\xb7\x8d\x22\xcc\x09\xc8\x05\xf1\xd7\xda\x92\xbd\xb4\x1c\xad\xd4\xd7\xbc\xbb\x56\xb0\x82\xdb\x4e\xf9\xda\xe0\x79\x71\xe4\x1f\x94\x0e\x09\x39\xa8\xf4\xb8\xdf\x48\xbc\xfe\xcf\x6c\xbc\x12\x8d\xd1\x3e\x3f\x8b\xb8\x34\xfa\x07\x5b\x94\x64\x81\x9f\x49\x9e\x32\x8c\x73\x7e\x72\x31\xd4\x66\xb7\x6d\x74\xab\x2b\x59\x44\xb0\x40\x15\xd7\xa1\xc9\x38\xa1\xb0\x48\xb9\x8a\x4a\x82\xc4\x3e\xa7\xb5\x34\xb0\x14\xc4\x31\x40\x20\xe7\xd6\x91\xd7\x04\x50\x03\x4f\xde\x39\xe9\x4a\x39\x61\xc7\x02\x80\x15\xc7\x03\x35\x1e\x33\x92\x39\xfa\xd0\x02\x9e\x83\x8a\x13\x3f\x31\xe9\xcd\0\x23\x8e\x2a\x36\x1c\x9c\x83\x4c\x03\x04\x63\x8c\xd2\x37\x39\x38\xa0\x05\x61\xc8\xa6\xf6\xc6\x3a\xd0\x03\xfb\x53\0\xca\x62\x80\x11\x7a\xe4\xf5\xa4\x65\x39\x22\x81\x17\xe9\x68\x18\x66\x8a\0\x29\x7a\x76\xa4\x02\xfd\x28\xa6\x01\x45\x20\x32\x3f\xb3\x26\x38\xc9\x5e\x2e\xcc\xdd\x7b\x55\xa4\xb4\x75\xd4\x6e\x67\x24\x6d\x95\x15\x54\x7b\x81\x55\x72\x52\x33\xd7\x47\xb8\x8d\x6d\x88\x58\x66\x31\x21\x42\x92\x67\x68\x39\xce\x45\x32\x5d\x3e\x4b\x4b\x79\x5e\x79\x63\x8d\x8d\xc2\xcb\x1b\x80\x76\xee\x23\x18\x3e\x82\x9d\xee\x4d\xac\x16\x91\xc9\x7d\xaa\xcb\xe7\xc9\x1c\xaa\x6d\x8a\x33\x45\xca\xae\x4f\x03\x3e\xbd\x4d\x5a\xb6\xd3\xee\xc3\x47\x14\x86\x04\x86\x12\x08\x74\x5f\x9a\x4c\x74\x07\xd2\x87\x64\x34\xba\x97\xf5\x1b\x53\x77\x64\xf0\x2b\x6d\xdd\x8e\x4f\xb1\x07\xfa\x50\x6c\xc9\xd4\x63\xb9\x2c\x36\xa4\x46\x3c\x77\xeb\x9c\xd4\xdc\xab\x14\xe5\xd2\x24\xc0\x68\xa4\x4f\x31\x67\x69\x40\x75\xca\x9c\xf6\x34\xb1\x5a\xc9\x67\x71\x71\x79\x7b\x3a\x3c\x72\x20\x12\0\x84\x63\x1c\x0c\x7b\x73\x4e\xe4\xda\xc2\x78\x6a\xcf\xc8\xb6\x79\x98\x30\x69\x5b\xe5\xdc\x39\x08\x38\x5f\xf3\xef\x56\x75\x4b\x07\xbd\x78\x1e\x29\xbc\x97\x80\x96\x53\xb7\x3c\x9a\x4d\xea\x34\xb4\xb1\x1a\xe8\xe2\x54\x9c\xdd\xcb\xe6\xcf\x36\x3f\x78\x17\x1b\x71\xd3\x15\x25\xa6\x9d\x3a\x5c\x2c\xd7\x77\x66\x72\x80\x85\x50\xbb\x40\xcf\x72\x07\x5a\x2e\x16\x2c\xde\x5a\x2d\xd3\x42\x5d\x88\xf2\x64\x12\x0c\x77\x22\xa1\xbb\xd3\x9e\x4b\xaf\xb4\xdb\x5c\xb5\xbc\xa5\x76\xb9\x0a\x08\x61\xdb\xaf\x7a\x57\x1d\x86\xb6\x8f\x19\x86\x15\x49\xa4\x49\x61\x62\xcb\x2f\x56\xc9\xeb\x9c\xd3\x57\x43\x8b\x65\xd0\x92\x69\x5d\xae\x80\x0e\xc7\x19\xe0\xf6\xa7\x71\x72\x92\x4d\xa5\x07\x9d\xe5\x86\xe6\x68\x0c\x8a\x15\xc2\x11\x86\xf7\xe7\xa1\xa5\xfe\xc7\xb7\x0f\x6c\xd1\x34\x91\x9b\x71\xb5\x76\xb7\x0c\x3d\x0f\xad\x17\x0b\x12\x0d\x26\xdc\x69\x9f\x60\xcb\xf9\x59\xce\x73\xcf\x5c\xd4\x77\x1a\x34\x33\x5c\xbd\xc0\x9a\x78\xa4\x90\0\xc6\x37\xc6\x40\x18\xc5\x17\x0b\x0e\x97\x47\xb5\x7b\x78\x22\x4d\xf1\x79\x1f\xea\xda\x36\xc3\x0c\xf5\xe7\xde\x84\xd1\xad\x12\xde\x78\x42\xb1\x5b\x8c\x79\x84\xb1\x24\x91\xde\x95\xc3\x95\x0b\x26\x8f\x6d\x22\xc7\xf3\x4a\xac\x8b\xb7\x7a\xc8\x43\x11\xe8\x4f\x7a\x7b\xe9\x56\x6d\x69\x1d\xb7\x96\x44\x71\x9c\xa9\x53\x82\x0f\xae\x7d\x68\xb8\x59\x0f\xb2\xd3\xad\xac\xdd\xde\xdd\x08\x77\x03\x71\x2c\x49\x6c\x7d\x6a\x5b\xab\x58\x6e\xd1\x56\xe2\x30\xe1\x18\x30\xcf\x62\x3a\x52\xbe\xb7\x1d\x80\x5a\xc0\xb7\x2d\x70\xb1\x81\x33\x2e\xd2\xdd\xc8\xa8\x9f\x4d\xb3\x7b\x61\x6e\xf0\x29\x8b\x76\xed\xa7\xd7\xd6\x9d\xc2\xc4\x91\xda\xc2\x8b\x22\xa4\x6a\x04\xbf\x7c\x0f\xe2\xa7\xc5\x12\x43\x1a\xc7\x1a\x85\x45\x18\0\x76\xa4\x31\xb1\x43\x1c\x5b\xbc\xa4\x54\xde\xc5\x9b\x03\x19\x3e\xb4\x93\xc1\x0d\xc2\x04\xb8\x89\x24\x50\x72\x03\x2e\x45\0\x43\x1d\x85\x9c\x4e\x1e\x3b\x68\x51\x97\xa1\x08\x01\x14\x36\x9f\x68\xcc\x59\xad\x61\x25\x8e\x49\x28\x39\xa2\xec\x56\x44\xc8\x8a\x8a\x11\x14\x2a\x81\x80\x07\x41\x55\x6d\x74\xf4\xb6\x59\xa3\x18\x68\x64\x7d\xea\x84\x7d\xd3\xdf\xf5\xa0\x76\x2d\x7e\x34\x81\x14\x31\x60\xa0\x13\xd4\xe3\xad\0\x26\xc5\x24\xe4\x0e\x78\x3c\x75\xa5\xc0\x03\0\x70\x3b\x50\x01\x4c\xf2\xd3\xae\xd1\xf9\x50\x02\xe0\x76\x14\x87\x93\xd2\x80\x0c\x01\xd0\x50\x69\x80\x94\x9d\x69\0\x1a\x69\x19\xa0\x62\x50\x69\x88\x4c\x52\x01\x40\xc0\xe3\xa5\x21\xa0\x42\x52\x62\x80\x03\x4d\x34\0\x84\x51\xd2\x80\x1b\x46\x39\xa0\x04\xe2\x93\0\x1a\0\x4c\x0c\xe4\x50\x68\x02\xd9\xa5\x14\xc0\x29\x68\0\x14\xa2\x80\x0c\xd2\xd2\0\xe6\x8c\xd0\x05\x7b\x5b\xa4\xb8\x92\x74\x50\x41\x85\xca\x36\x7b\x91\x49\x73\x78\x2d\xcc\xbb\xa3\x90\x88\xa3\xdf\xbb\x1c\x1f\x61\x4e\xc2\xb9\x34\x13\x2c\xb1\xab\xa9\xfb\xc0\x1c\x53\x9b\xcb\x7f\x91\xf6\xb6\xef\xe1\x3d\xe8\x01\xb0\x79\x08\x4a\x42\x11\x7d\x97\x02\x9c\x65\x8c\x1c\x17\x5c\xf6\xe6\x90\x0b\x24\x9b\x17\xe5\xc1\x72\x09\x55\x27\x1b\x8d\x32\xc6\xe9\x2e\xed\x96\x54\x04\x67\xa8\x3d\x41\x1d\x45\0\x49\x34\xf1\x43\x83\x2c\x8a\x99\xe9\xb8\xe2\x92\x49\xe2\x45\x05\xe4\x55\x53\xd0\x93\x8c\xd0\x03\xd1\x95\xd0\x32\x10\x54\x8c\x82\x3a\x1a\x89\x2f\x2d\x9e\x53\x12\x4f\x1b\x49\xd3\x68\x60\x4d\0\x24\x9a\x85\xa4\x6c\x55\xee\x22\x52\x0e\x08\x2e\x06\x0d\x4c\x93\x44\xd2\x34\x6a\xea\xce\xa0\x12\x01\xe4\x67\xa5\x16\x0b\xa1\x62\x96\x39\x41\x31\xba\xb8\x04\x82\x54\xe7\x9a\x86\x6d\x46\xce\x09\xc4\x32\xce\x8b\x27\xf7\x73\xd3\xeb\xe9\x45\x82\xe4\x12\x6a\xf0\xc7\xa8\xfd\x8c\x11\xb8\xc7\xb8\x36\x7b\xfa\x7e\x5c\xd4\x7a\x66\xb9\x6f\x71\x14\x2b\x3c\xa8\xb3\xc9\xc1\x51\x9c\x67\xd2\x9d\xb4\x17\x36\xa5\xbb\x9d\x52\xce\xd2\x5f\x2e\x79\x82\xbe\x33\x8c\x13\x81\xef\x8e\x94\x5d\x6a\xd6\x76\xa1\x0c\xb2\x81\xe6\x2e\xe5\xc0\x27\x70\xf6\xc5\x2b\x30\xba\x1f\xa8\xce\x61\xb0\x96\x74\x70\x85\x57\x21\x98\x12\x07\xe1\x50\xcf\xab\xda\x5a\xb8\x8e\x57\x26\x40\xa1\x8a\xaa\x92\x70\x7b\xd0\x95\xc7\x7b\x09\x1e\xbb\x63\x2c\x88\xa9\x21\x21\xc8\x55\x6d\xa4\x2e\x7d\x33\xeb\x4b\x75\xac\xdb\x5b\x4c\xf1\xb0\x91\xfc\xbe\x64\x64\x42\xc1\x3e\xa6\x9f\x2b\x17\x32\x1f\x71\xaa\xdb\xc2\x63\0\x3c\xcd\x20\xdc\xab\x12\xee\x38\xf5\xfa\x53\x62\xd6\xad\x24\xb4\x92\xe5\x4b\x6c\x47\xf2\xf1\xb7\x92\xde\x80\x7e\x34\xac\x17\x44\x96\x3a\xac\x37\x73\x34\x21\x24\x86\x60\x37\x6c\x91\x70\x48\xf5\xa6\x6a\x77\x12\xc3\xa8\x69\xf1\xc6\xc4\x24\xac\xe1\xc0\x1d\x70\xb4\x58\x2f\xa1\x99\x26\xab\x24\x51\x69\xf2\xc7\x24\xf3\x24\x92\xba\xb0\xda\x03\x3f\x5c\x0c\x7d\x6a\xf1\xd7\x62\x48\x67\x69\xe1\x96\x29\x60\x50\xcd\x13\0\x09\x07\xb8\xa6\xd0\xae\x3d\xb5\x7c\x5a\x2c\xdf\x65\x9b\x32\x3e\xd8\xd3\x03\x2f\xc6\x73\xec\x29\x83\x5b\x55\x82\xe9\xa5\x82\x48\xe5\xb6\x50\xcf\x19\xc7\x43\xd3\x06\x8b\x0e\xe2\x43\xac\xf9\x8f\x6f\xe6\x5b\x49\x14\x77\x0e\x56\x37\x7e\x33\xc7\x19\x1e\xf5\x6a\xde\xf0\x5c\x5d\xdc\x42\xa8\x76\xc0\x40\x2f\x9e\x09\x3d\xa9\x58\x69\x99\x73\x4b\x33\xf8\x9c\x2c\x91\xb8\x86\x28\xb7\x0f\xde\x60\x01\x93\xf3\x63\xbf\xa5\x4a\x75\xa9\x04\x42\xe5\xac\xd8\x59\x96\xc7\x9b\xbc\x67\x19\xc0\x3b\x7d\x29\xd8\x57\xb1\x34\x7a\x94\xb3\x6a\x72\xda\x43\x6d\xb9\x62\x2b\xbe\x4d\xfc\0\x46\x6a\x3f\x12\x5c\x5c\xdb\x5b\x44\x6d\x47\x26\x55\x05\xb7\x63\x1c\xf4\xfc\x68\x4b\x50\x6f\x46\x54\x5b\x8b\xf5\xd6\x6e\x56\x08\x15\x9d\xa2\x42\xca\xcf\x85\x4e\x2a\x56\xd7\x37\x59\x40\xd1\xa2\xad\xc4\xcc\x50\x23\xb6\x15\x48\xea\x49\xf4\xa2\xc2\xbb\x44\xda\x5e\xa4\xf7\x37\x12\x5b\x5c\x22\x2c\xa8\x37\x03\x1b\x6e\x56\x1e\xb4\x6a\x37\xd7\x30\xdf\xdb\xda\xda\xc4\x8e\xd3\x2b\x1c\xb1\xc0\x5c\x51\x6d\x47\x7d\x0a\xad\xac\x4f\x0c\x53\x25\xc4\x48\x2e\x61\x91\x15\x80\x3f\x2b\x06\x3d\x45\x5e\xba\xbc\x78\xb5\x0b\x6b\x65\x50\x56\x65\x72\x49\xea\x30\x28\xb0\x5c\xcb\x5d\x5b\x50\x3a\x4b\xdf\xbc\x70\x2a\xe0\x6c\x1c\xe4\x9d\xd8\xff\0\x1a\xb0\x35\x0b\xdb\x6b\x98\x45\xfc\x71\x08\xae\x0e\xd5\x28\x4e\x50\xe3\x80\x69\xd9\x05\xd9\x13\x6a\x5a\x87\xd8\xce\xa2\xb1\xc5\xf6\x5c\xe4\x46\x73\xb8\xae\x71\x9c\xd3\x6e\x75\x59\x9a\xf6\x48\x61\x9e\x1b\x70\xaa\xac\x9e\x68\x3f\xbc\xc8\xcf\x5e\xd4\x59\x0a\xec\x5b\xdd\x5a\x55\x68\x21\x32\x45\x6d\x2b\xc5\xe6\x3b\xb7\xcc\xa3\xd0\x0c\x7a\xd4\x69\xac\x5c\x36\x9f\x70\xc0\x2c\xb2\x42\xe1\x4c\x88\x0e\xd2\xa7\xf8\xb1\xd7\x8a\x2c\x1c\xcc\xb5\xa4\x5d\xcb\x3c\xcc\x8d\x75\x0d\xd4\x7b\x72\x19\x46\xd6\x07\xd0\x8a\xd4\xa4\xca\x5b\x08\x78\xed\x9a\x43\x52\x31\x0f\xbd\x14\xc6\x04\x53\x68\x10\x94\x74\xa0\x62\x52\x74\xa0\x04\x22\x92\x80\x10\xf4\xa4\xed\x40\x82\x90\xd0\x02\x52\x50\x05\xbc\xe6\x94\x71\x4c\x05\xed\xc5\x25\0\x28\xa2\x80\x16\x8f\xe7\x40\x0b\x45\x20\x32\x74\x86\x54\xbb\xd4\x43\x10\x3f\xd2\x0f\xf2\xa8\x75\x26\x2d\x79\x7b\x83\x91\xf6\x4e\x9f\x9d\x57\x52\x3a\x10\xac\x30\xdb\xdb\xe9\xb3\xda\x16\x13\x49\x22\x2b\x36\xee\x5c\x11\xce\x45\x3e\xc2\x38\xa2\xb6\xbf\xbb\x9b\x7e\xf4\x79\x17\x2a\x79\x51\xe8\x3f\x1a\x62\xb1\x04\x11\x9b\x7b\xed\x3f\x6c\x2b\x01\x76\x39\xc4\x9b\x99\x86\x3b\xd4\xf6\x1a\x74\x57\x5a\x75\xdb\x05\x3e\x73\x33\x85\x6c\xf2\x30\x78\x03\xf2\x14\x37\xd4\x12\x25\xd2\xa7\x6d\x4a\xfe\x39\x9b\xa5\xac\x41\x71\xdb\x79\xeb\x8f\xc2\xac\xe8\x99\x17\x1a\x80\x07\xe5\x17\x2d\x8f\xaf\x14\x98\xd1\x13\xad\xbc\xba\xcd\xd8\xd4\x02\x32\xa2\x20\x8c\x49\xd0\x29\xea\x47\xe3\x59\xf6\xd1\x2d\xcf\xf6\x74\x52\xae\xeb\x7f\x3e\x5f\x2c\x37\x74\x03\x23\xf9\x53\x11\xd2\x4b\xb6\x0b\x49\x0a\xae\x11\x10\x9d\xab\xc7\0\x76\xae\x51\x58\x05\xb1\x97\xfd\x1a\x30\x67\x42\x16\x3f\xbe\x06\x79\xdc\x69\x44\x72\x34\x60\xb7\x8a\x4b\x6d\x69\xde\x35\x67\xf3\x64\xe4\x8e\x78\x19\x14\xc9\xe4\x7d\x3a\xda\xcb\x51\x0a\x4e\xeb\x6f\x29\xbf\xde\xdb\x95\x3f\x9d\x1b\xe8\x1b\x6a\x6d\xe8\xf6\xdf\x64\xd3\xe2\x88\xfd\xe0\x32\xc7\xdc\xf2\x6b\x1e\x29\x6d\xa1\xd3\xaf\xed\xee\x82\xfd\xa9\xdd\xc1\x46\x1c\xbb\x1f\xbb\x81\xf9\x51\xb8\x3d\x37\x1f\x08\x16\xfa\x9d\xaa\x5d\x1f\x9c\xd8\x84\x39\xee\xd9\xfe\x74\xc5\x89\x57\xc2\x91\x32\x26\x0e\xf5\x6c\x81\xce\x77\xf5\xfa\xd3\x11\x14\xa0\xdb\xdd\xdf\xa5\xcd\xe3\x5b\xf9\x8e\x58\x27\x94\x1b\xcc\x52\x38\xc6\x7a\xfa\x62\xad\xd9\x5a\x88\xaf\x34\xc5\x28\xe4\x2c\x2c\x47\x98\x39\x5e\x46\x3e\x9d\x68\x03\x4b\x5e\x52\xda\x3d\xd2\xa8\xc9\x29\xc0\xfc\x6a\xb5\x94\x4c\x35\x89\xd9\x93\x8f\xb3\xa0\x07\x1f\x5c\x8a\x95\xb1\x4f\x72\x9c\x30\x38\xf0\xf5\x92\x88\xd8\x30\xb9\x52\x46\xde\x71\xbc\xf3\x51\xde\x79\xd2\x4b\x7f\x14\xa6\xe1\x24\x62\x44\x70\xc1\x1f\x0e\x31\xc1\x27\x1c\xd3\x24\x93\x4e\x69\x2c\xe5\xb5\xba\x78\x25\x92\x27\xb5\x58\xfe\x44\x25\x95\x87\x51\x8a\xac\x90\x4d\x75\x69\x71\x2a\x45\x2a\xf9\x77\xed\x23\xa2\x1f\x9c\x0c\x73\x8f\x71\x4f\x60\xf2\x34\xf4\x88\x12\x4d\x4b\xcf\x8e\x2b\xa6\x54\x8f\x1e\x6d\xc3\x1e\xa7\xb0\x06\xae\x6a\x50\x4b\x26\xa7\xa7\x3a\x21\x64\x8d\x9c\xb1\x1f\xc3\xf2\xf1\x53\xd4\xae\x86\x42\xdb\x5d\xdb\xdb\x58\x32\xda\xc9\x21\x86\x79\x1d\xd3\x1c\xe3\x27\xfa\x54\x97\xf6\xd7\x1a\x9f\xdb\x2e\x96\xda\x48\xc1\x80\x45\x12\x38\xc3\x37\xcd\x92\x71\x4f\x4d\xc5\x67\xb1\x6f\x5b\x8e\xe8\xc1\x6a\x23\x59\x5a\x05\x3f\xbf\x48\x4e\x18\x8c\x71\x59\xd1\xd8\x5c\x1f\xed\x14\x8a\xca\x48\xa3\xb9\x84\x18\xc3\x36\x72\x47\xa9\xcf\x5f\x6a\x13\xd0\x1a\x77\x34\xf5\xa8\x4f\xf6\x2e\xf3\xb5\x65\xb7\x0b\x22\x13\xd9\x96\xa4\xd0\x2d\xde\x2d\x3d\x5e\x6f\xf5\xd3\x93\x2b\xfd\x4d\x4f\x41\xf5\x1b\x2d\x93\xc9\xac\x49\x2b\x2f\xee\x5e\xd7\xca\xdd\x9e\xf9\xac\xf3\x6d\xa8\xc9\xa7\x0d\x2e\x4b\x60\x14\x61\x4c\xfb\x86\x36\x83\xd7\x1d\x7a\x53\xba\x06\x99\xa3\xa7\xd9\xc9\x6f\xa8\xde\xc8\xcb\x88\xe5\xf2\xf6\x1c\xf5\xc2\xe2\x8d\x76\xda\x6b\x9b\x1d\x96\xc0\x34\x8a\xea\xc0\x13\x8c\xe0\xd2\xbe\xa3\xb6\x83\x2c\xad\x67\x5d\x46\xe2\xea\x64\x09\xe7\x46\x83\x01\xb3\x82\x3a\xd6\x73\x68\x93\x2c\x10\xb9\x8e\x39\xa4\x86\x57\x6f\x29\xcf\x0e\xac\x7d\x7d\x69\xdc\x56\x2f\x69\x36\x72\x45\x3c\x93\xc9\x6f\x0d\xb0\x61\xb5\x63\x8c\x02\x40\xee\x49\x15\x5f\x56\xf3\xc6\xb9\x62\xd6\xaa\xad\x20\x47\x3b\x58\xe0\x11\xc7\x7a\x3a\x83\xbd\x88\xe4\xd2\x6e\xee\x60\xbb\x96\x53\x1a\x5c\xce\xca\xca\xa3\x90\xa1\x7a\x0c\xd4\xc9\x69\x7f\x3e\xa5\x05\xd5\xd0\x8a\x34\x89\x59\x76\x2b\x64\xf2\x3a\xd3\xba\x0b\x32\xbe\xa1\x67\x25\x9f\x85\x1a\xd9\xc8\x32\x20\x19\x23\xa7\xdf\xcd\x4a\xb6\x17\xb7\x73\xc0\xda\x83\x44\x63\x83\xe6\x01\x33\x97\x6e\xc4\xd1\x75\x6b\x8a\xce\xf6\x18\xba\x5d\xff\0\xd9\x06\x9e\x65\x8b\xec\xb9\xc6\xfe\x77\xed\xce\x71\xe9\x4f\xbc\xd3\xaf\x1e\x67\x58\x4d\xb4\x96\xec\0\x54\x99\x73\xe5\xe0\x63\x8a\x2e\x87\x66\x34\x68\xf2\xda\xfd\x9a\x4b\x39\x63\x69\x62\x8f\xcb\x7f\x34\x64\x30\xce\x7f\x9d\x4b\xfd\x9d\x76\x6d\x5f\x37\x65\x6e\x19\xc3\x82\xa3\xe5\x18\xed\x8f\x4a\x2f\x70\xb3\x0d\x3f\x4e\x9a\x2b\xe6\xbb\xba\x68\xcc\x85\x36\x01\x12\xe0\x7e\x3e\xb5\xa5\x49\xea\x34\xac\x21\xa4\xa4\x31\x28\xa0\x62\x1a\x4a\0\x4a\x43\xc5\0\x19\xa4\xa0\x04\xa4\xcf\xa5\x02\x10\xd1\xd6\x80\x1a\x78\xa0\xd0\x02\x52\x1a\0\xb6\x3a\x52\xd3\0\xa2\x80\x16\x8a\0\x29\x69\0\xa2\x96\x80\x33\xe7\xd1\xac\xa7\x99\xe5\x92\x22\x5d\xce\x49\xdc\x6a\x54\xd3\xad\x11\x0a\x88\xc6\x0a\x79\x67\x93\xf7\x7d\x29\xdd\x93\xca\x86\xc1\xa5\xd9\xdb\xca\x25\x8a\x20\xac\x3a\x1c\x93\x8f\xa5\x4e\x96\xd0\xac\x72\x20\x45\xdb\x21\x25\x87\xa9\x3d\x68\xbb\x63\xb2\x20\x8f\x48\xb1\x8c\x0d\xb0\x01\x87\x0e\x0e\x4e\x41\x1d\x39\xab\x0d\x09\x86\x07\x5b\x35\x45\x7e\x4a\x86\xe9\x9f\x7a\x1b\x6c\x2d\x6d\x88\x74\xbb\x33\x69\x6c\xe0\x94\x33\x3b\x17\x72\x3a\x6e\x35\x2e\x9f\x6a\x2d\x2d\x84\x6c\xdb\xdc\x92\xce\xde\xac\x79\x34\x5c\x2c\x2d\xcd\x95\xb5\xd1\x06\xe2\x15\x90\x8e\x84\x8a\x94\x41\x10\xf2\xf1\x1a\xfe\xef\xee\xf1\xf7\x7b\x71\x4a\xec\x09\x0f\xbd\x57\x4d\x3a\xcd\x43\x81\x6d\x16\x1c\xe4\x8d\xa3\x14\x5d\x85\x89\xd6\x28\xd4\x30\x54\x50\x1f\x25\x86\x3a\xfa\xe6\xaa\x5e\x58\xfd\xaa\x78\x03\x4a\xa2\xde\x22\x1b\xc9\x0b\xd4\x8e\x9f\x85\x17\x06\x5e\x1c\x71\xe9\x48\x62\x8c\xbe\xf2\x8a\x5c\x7f\x16\x39\xa4\x31\xe4\x29\x20\x90\x32\x3a\x52\x02\x8e\xbc\x60\xaf\x4e\x28\x01\x4a\xab\x11\x90\x32\x3a\x67\xb5\x38\xd0\x22\x1b\x9b\xab\x6b\x5c\x7d\xa2\x64\x8b\x77\x4d\xcc\x06\x69\x62\xb8\x82\x48\x4c\xc9\x2a\x34\x60\x64\xb0\x23\x18\xa0\x2e\x46\x9a\x95\x93\xb8\x54\xba\x84\x92\x70\0\x71\xc9\xa9\xc4\xd1\x99\xfc\x90\xeb\xe6\xed\xdd\xb7\x3c\xe3\xd6\x8d\x42\xe4\x17\xba\x6c\x57\x72\x89\x7c\xc9\x61\x94\x0d\xbb\xe2\x6d\xa7\x1e\x95\x2d\x95\xa4\x56\x50\x08\xa1\x18\x5c\x92\x49\x39\x24\xfa\x9a\x77\x0b\x16\x3a\x52\xd2\x18\x62\x83\x40\x08\x7d\xa9\x28\x02\x0b\xab\x38\x2e\xc2\x8b\x88\xc4\x81\x0e\x40\x35\x36\0\xe8\x28\x01\x30\x31\x46\x29\0\x94\x86\x98\x08\x78\xa0\xd0\x02\x62\x98\xf1\x46\xd2\x2c\xa5\x14\xc8\x80\x85\x6c\x72\x28\x01\xd8\xa4\xfc\x28\x01\xae\x8a\xca\x43\0\x47\x70\x69\x31\xed\x40\x07\x7a\x28\x01\x09\0\x7a\xd3\x77\xf1\xc0\xa0\0\x9f\x5a\x6e\xf1\xe9\x40\x0d\x77\xc7\x63\x41\x61\xc7\x7c\xd3\x01\x03\x64\x1e\xb4\x06\xc9\xc6\x28\0\x63\x81\x93\x4c\xdc\x4f\x24\x71\x40\x0e\x38\x3c\x8a\x69\x23\x38\xcd\0\x14\x84\x8c\x50\x02\x13\xda\x90\x91\xeb\x40\x09\x9c\x0e\xb4\x13\x81\x40\x0c\x2d\xd0\x0e\xa6\x93\x24\x1f\x9b\x03\xd2\x98\x0a\x78\xa4\x2c\x3b\x52\x02\xdf\x7a\x5e\xf4\xc0\x28\xcd\0\x28\xa5\x34\0\x66\x97\x34\0\x52\xfb\xd2\x03\x36\x6d\x59\x51\xe5\xd9\x04\xb2\x45\x09\xc3\xc8\xa3\x20\x1e\xf5\x59\xae\xe5\xb8\xd7\x61\x8d\x0c\xbe\x40\x88\x38\xda\x46\xd6\xcf\x73\xea\x2a\xac\x43\x64\xfa\xd5\xe5\xc5\xb3\xda\x8b\x74\x2c\x1e\x40\x1b\x18\xe7\xdb\x9a\x59\x75\x57\x56\x90\x43\x6a\xf2\xac\x3f\xeb\x18\x10\x30\x7b\x81\xeb\x45\x87\x7d\x44\x9b\x57\xc8\x89\x6c\xe1\x33\xc9\x2c\x7e\x60\x19\x0b\x85\xce\x3b\xd4\x37\x3a\x9d\xdb\x49\x62\x61\xb7\x71\xe6\x31\x0c\x8c\x40\x24\x80\x78\xfc\x3a\xd1\x61\x5f\xb0\xe1\xa9\x1b\x54\x98\xac\x52\xca\xcd\x76\xd1\x05\x2f\xdf\xdb\xdb\xda\xa6\x1a\xc3\x41\xe7\x8b\xdb\x73\x0b\xc4\x81\xf0\x18\x36\xe0\x4e\x3a\xfd\x68\xb0\x5c\x23\xd4\xee\x85\xcd\xb4\x57\x16\x82\x21\x70\x4e\x0e\xfc\xe3\x03\xf9\xd6\xbd\x4b\xd0\x69\x94\xe1\xbd\x32\x6a\x37\x36\xdb\0\x16\xe1\x4e\xec\xf5\xc8\xcd\x51\x5d\x66\xe2\x68\xed\x3c\x9b\x75\x67\xba\x2e\0\x2f\xc0\xda\x7e\x94\xec\x17\x1f\xfd\xb1\x34\x50\xcc\x93\xc2\xa2\xea\x39\x16\x25\x55\x6f\x95\x89\xe8\x7e\x95\x01\xb8\xb9\x87\x5a\x12\x5f\xaa\x2f\x95\x6a\xcd\xfb\xb3\x90\xc3\x23\xd6\x9d\x85\x71\x61\xd7\x65\xf3\x21\x79\x3e\xce\xd1\x4c\xe1\x76\x46\xf9\x74\xcf\x42\x7d\x6a\xee\x9b\x7d\x77\x79\x77\x38\xd9\x1a\xdb\xc3\x2b\x21\x39\x3b\x8e\x3a\x50\xd5\x81\x32\x3d\x61\xee\xc6\xb1\xa7\xa4\x2c\x8a\x8e\x5f\0\xe7\x9e\x39\xcf\xe1\xd2\xa8\xd9\xcf\x7d\x6d\xa7\xdd\x5c\xc1\xe4\xf9\x51\x4c\xe4\x87\xc9\x2f\xcf\x3c\xf6\xa3\x4b\x06\xb7\x2d\x5d\x6b\x4e\x6e\x8c\x31\xcd\x0d\xb8\x44\x56\x2d\x28\x24\x92\x46\x70\x31\x57\xf4\x4b\xe6\xd4\x2c\x56\x69\x14\x07\x04\xab\x01\xd3\x23\xd2\x93\x56\x1a\x77\x65\x1d\x36\x38\xae\xa4\xbf\xbd\xba\x8b\xed\x12\x24\xac\x8a\xa5\x43\x10\xaa\x38\0\x7e\x35\x0d\xb4\xb6\xb8\xd4\xa2\xb7\xb7\x9e\xd9\x9a\x02\xed\x14\x8a\x02\x8e\x0f\x20\x76\xa6\x22\xaa\x46\x2e\x34\x68\xa0\x87\x48\x73\x33\xc6\xa0\x4c\x50\x01\x9c\x7d\xec\xd6\xad\xba\x34\x7e\x23\x89\x24\x62\xec\xb6\x20\x16\xf5\x3b\xba\xd0\xc1\x1b\x62\x96\xa0\xb0\xa5\xa0\x02\x90\xd2\x01\x28\xa6\x01\xcd\x27\x43\x48\x04\xa2\x80\x12\x90\xd3\x01\x28\xa4\x02\x52\x76\xa0\0\xd2\x53\x02\x37\xe5\x80\xed\x4d\0\x73\xc9\xe2\x80\x01\xcb\x0f\xa5\x21\x38\x18\x3e\xb8\xa6\0\x30\x1b\x81\xd6\x93\xee\x9c\xe7\x8a\0\x53\xd3\x8a\x63\x63\x60\xa0\x06\x83\xb9\x98\x13\xd3\xb5\x26\x70\x57\x9e\x3a\x50\x02\x12\x41\x62\x29\x71\x82\x0e\x68\x01\x32\xc0\x1c\x8e\x29\x4e\x36\xf1\xd2\x80\x11\x07\xc8\x33\x51\x9e\x7a\x0f\xa9\xa0\x07\x0f\xbc\x69\x98\x19\x19\xe9\x40\x08\xdf\xc5\x8a\x52\xbf\x30\xa6\x03\x70\x30\x40\xed\x48\x7e\x60\x4f\xb5\x02\x10\x70\x46\x7b\x8c\x50\xd8\x3c\x77\xa0\x05\x6f\xba\x69\x84\x70\xb4\x01\x78\x51\x40\xc5\xed\x45\0\x2e\x69\x7a\xd0\x01\x8e\x7d\x69\x68\x01\x47\xbd\x27\x73\x40\x18\x48\x97\x76\x90\xdc\xd9\xad\xab\xc9\xe6\x96\xd9\x20\xfb\xa4\x37\xaf\xa5\x58\xb3\xb0\x92\xda\xfe\x1c\x02\x63\x8e\xd4\x46\x5b\xd4\xe6\x9b\x21\x26\x4d\xad\xc3\x2c\xb1\x5b\xbc\x11\xf9\x8d\x0c\xca\xe5\x41\xc6\x40\xcd\x66\xcb\xa7\x34\x73\xdc\x96\xb0\x6b\x86\x99\x8b\xc6\xe1\xf0\x06\x7b\x1e\x7b\x50\x98\x34\x4d\x73\x60\xe9\x1d\xba\x35\x82\xce\x89\x1e\x3f\x76\xc5\x59\x1b\xdb\x9e\x94\x89\x63\x7f\x1c\x16\x72\x32\x19\xa4\x86\x56\x72\x8c\xfc\x80\x7a\x0c\xf7\xa7\x70\xb3\x25\x1a\x75\xc9\x60\x76\x0f\xf8\xfe\x33\x75\x1f\x77\xd6\x97\x59\xb1\x79\xa5\xba\x91\xd9\x52\x16\xb7\x0b\xbd\x8f\x01\x83\x67\xfc\xfd\x69\x5c\x2d\xa1\x01\x96\xea\x6d\x4f\x4e\x59\xd2\x35\xda\xcc\x40\x46\xdd\x9f\x97\xef\x7b\x0a\xd9\xb0\xb8\x7b\x81\x31\x75\x55\x09\x29\x45\x20\xe7\x70\x1d\xe8\x63\x45\x39\xed\xaf\x21\xd4\x6e\x27\xb5\x89\x24\x5b\x95\x50\x4b\x36\x36\x10\x31\x9f\x7a\x6e\x9f\xa4\xcf\x6f\xfd\x9f\xbc\xa9\xfb\x3f\x99\xbf\x07\xae\xee\x94\x5d\x58\x56\x63\xee\x74\x99\xe5\xb9\xb8\x99\x1d\x43\x19\x63\x96\x2c\xf4\xca\x8c\x60\xd2\x0d\x3a\xee\xf2\xed\xa6\xbd\xf2\x91\x1a\x06\x8b\x62\x12\x48\xcf\x7a\x2e\x16\x63\x6d\xb4\xab\xa5\x78\x22\x78\xed\x63\x8e\x22\x0b\x4a\x8a\x0b\x38\x1f\x87\x1e\xf5\xa3\xa6\x59\xbd\x99\xba\x2e\x54\xf9\xb3\xb4\x83\x69\xec\x71\x49\xb1\xa4\x33\x52\xb3\x9a\x7b\xab\x4b\x8b\x66\x40\xf6\xec\xc4\x87\xce\x08\x23\x07\xa5\x46\x9a\x5b\x8d\x2e\xe6\xd0\xba\xee\x99\x9c\x82\x07\x03\x26\x8b\xe8\x16\x1b\x26\x99\x73\x14\xa6\x7b\x27\x87\x7c\x88\xab\x22\xca\x09\x19\x03\0\x8c\x55\xed\x3e\xdd\xed\xad\xd6\x39\x65\x33\x3f\x25\x98\x8c\x64\x9a\x4c\x69\x58\xa7\x2e\x9b\x73\x15\xcc\xb3\x69\xd7\x09\x10\x98\xee\x78\xdd\x72\x33\xea\x29\xb0\x68\xd2\xac\xd7\x12\xcd\x73\xe6\xc9\x71\x09\x8d\xc9\x5c\x73\xea\x07\xa5\x3b\x8a\xc6\x8d\x8d\xbf\xd9\x6d\x22\xb7\xdd\xbb\xca\x40\xb9\xc6\x33\x81\x8a\xa9\xa8\x69\x93\x4f\x7c\xb7\x56\xd7\x66\xdd\xc4\x7e\x59\xc2\x06\xc8\xce\x7b\xfe\x14\x93\x1d\xb4\x25\x82\xce\xf1\x23\x51\x2d\xf9\x91\x84\x81\x8b\x79\x60\x65\x7f\xbb\xff\0\xd7\xab\xd8\xe2\x90\x0a\x29\x7b\x71\x40\xc2\x93\x9c\xd0\x01\xfa\xd2\x50\x02\x50\x7a\xd0\x02\x13\x49\x9a\0\x3a\x72\x69\xb4\0\x52\x1a\0\x4f\x4a\x28\x18\x71\x49\x40\x0d\x2a\x38\xf6\xa4\0\x73\xef\x40\x84\xd8\x31\xf4\xa4\x2a\x31\x83\x4c\x04\xda\0\xa4\xd8\xa0\x74\xe2\x80\x17\xa7\x4a\x66\xc1\x9c\xe2\x80\x02\xa3\x39\xa4\x2a\x08\xe9\xc5\0\x26\xc0\x06\x31\x40\x50\x3b\x73\x40\x07\xb1\xa4\xda\x07\x6a\x06\x14\xd2\x80\x9e\x94\x08\x0a\x83\xd6\x90\xa8\xc6\x28\x01\xa1\x71\x9f\x4a\x31\x40\x06\x05\x34\x2e\x33\x9e\x94\0\x11\xc5\x34\0\x0f\x4a\0\x5c\x7a\xd2\x10\x28\x02\xcd\x28\xfa\x73\x4c\x42\xd1\x40\x0b\x4b\x40\xc0\x52\xd0\x01\x9e\x28\x14\0\x71\x4b\x8a\x42\x17\xb5\0\xd0\x31\x71\x46\x28\x01\x47\x14\x32\xab\xa9\x47\x50\xca\xdc\x10\x46\x41\xa0\x08\x2d\xb4\xfb\x4b\x57\xdf\x04\x08\x8d\xea\x07\x35\x64\0\x28\xbd\xc4\xb4\x17\x14\xa3\xad\x03\x17\xb5\x14\x84\x38\x52\xf4\xa0\x02\x97\x8a\x06\x27\x53\x4a\x28\0\xa5\x1d\x28\x10\x62\x96\x81\x87\xb5\x14\0\xbc\xd1\x9a\0\x4a\x29\0\x94\x66\x98\x08\x68\xed\x48\x04\xa2\x98\x05\x21\xa0\x04\xa6\xd0\x01\x41\xa0\x62\x75\xa3\xeb\x40\x09\x48\x28\x10\x52\x74\xa0\x04\xc5\x27\xf2\xa0\x04\x22\x83\x40\xc4\x34\x98\xa0\x04\x22\x8a\x60\x27\xd2\x8a\0\x4f\x6a\x4a\0\x4a\x4a\0\x4a\x4a\0\x0d\x27\x4a\x04\x21\xf5\xa4\x34\0\x94\x94\x01\x62\x9c\x29\x88\x5a\x3b\x50\x30\xa5\xc5\0\x14\xb4\x80\x5f\xa5\x14\0\x76\xa5\xa0\x02\x94\x50\x02\xd1\xd6\x80\x14\x74\xcd\x2d\x20\x0e\xd4\xa2\x98\x85\xa0\x52\x18\xea\x5e\xd4\0\x01\x4b\x9a\0\x5a\x28\x10\xb4\x94\x0c\x5a\x51\x40\x07\x7a\x28\x01\x68\xa0\x02\x94\x50\x02\x52\x50\x01\xc5\x1d\x3b\x52\x01\x33\x48\x7a\xd0\x01\x49\x9a\0\x29\x09\xcf\x4a\0\x4e\xfe\xd4\x94\xc0\x3b\xd1\x40\x09\x49\x40\x07\x19\xa3\x82\x68\x01\x31\x8a\x4e\x82\x80\x0a\x43\x40\xc4\x34\xd3\xd6\x80\x03\xc5\x14\0\x94\x77\xa0\x04\x3d\x69\x0d\0\x36\x94\xd0\x03\x7e\xb4\x50\x02\x1a\x6d\x30\x0c\xf1\x49\x40\x09\x9a\x43\x40\x84\xa4\xa0\x0b\x02\x97\xa5\x30\x17\x34\xb4\x08\x29\x68\0\xed\x4b\x9a\x06\x02\x96\x80\x0a\x29\0\xa2\x96\x80\0\x33\x4b\x9c\xd0\x21\x68\xa0\x61\x4e\x14\0\xb4\x0e\x94\x80\x70\xe6\x94\x50\x20\xe6\x8f\xad\x03\x14\x11\x46\x79\x1c\xd0\x01\xd6\x94\x50\x01\xf8\xd2\xd0\x02\xd1\x9a\0\x4c\x8f\x5a\x70\xf6\xa0\0\x9a\x6e\xf5\x1c\x64\x0a\0\x5c\x8c\x67\x34\xcf\x31\x18\xe1\x58\x13\xf5\xa0\x07\x9a\x4a\0\x09\xa6\x86\x07\x90\x41\xa4\x02\x06\x0c\x48\x52\x0e\x0f\x3e\xd4\x53\x01\xaf\x22\x20\xcb\x30\x50\x4e\x39\x3d\xe9\x49\xe2\x80\x12\x82\xd8\xff\0\x1a\0\xab\x16\xa3\x69\x2c\xa2\x38\xee\x23\x67\x3c\x60\x30\x24\xd4\x9f\x69\x87\xcf\xf2\x3c\xc5\xf3\x71\x9d\x9b\xb9\xc7\xd2\x9d\x98\x5d\x04\xd7\x10\xc0\x54\x4d\x2a\x21\x73\x85\xdc\x71\x93\xed\x51\x5d\xdf\xda\xda\x60\x5c\x4c\x88\x4f\x40\x4f\x34\x59\xb0\xba\x16\x3b\xdb\x79\x20\x69\xd2\x54\x31\x28\x24\xb0\x3c\x0a\x86\x3d\x5e\xc1\xd8\x2a\xdd\x46\x49\xe9\xf3\x75\xa2\xcc\x57\x45\xce\x31\x9a\xa1\x26\xb3\xa7\xa3\xb2\x35\xca\x06\x53\x82\x3d\x0d\x09\x5c\x6d\xa4\x5b\x8e\x54\x95\x03\xc4\xea\xea\x7a\x10\x72\x0d\x45\x6f\x79\x05\xc4\x92\x47\x0c\x81\x9e\x23\x87\x03\xb5\x01\x72\x6a\x4e\xdc\xd2\x18\x51\x9a\0\x4a\x4a\0\x29\x0d\0\x25\x06\x80\x12\x92\x98\x08\x69\xb8\xcd\0\x14\x9f\x5a\0\x4a\x43\x40\x84\xa4\x34\x01\x60\x1a\x51\xc7\x41\x4c\x05\xe9\x47\xd6\x81\x06\x69\x45\x03\x01\x4b\x40\x85\xa3\xa5\x20\x32\x2e\xb5\x76\xb5\x9e\xf4\x48\xaa\x56\0\x9b\x07\x23\x71\x20\x9e\x4d\x68\x59\x5d\x25\xdd\xaa\x4f\x19\xf9\x58\x77\x15\x4d\x75\x12\x7a\xd8\xab\x0e\xab\x14\x76\x71\xcb\x71\x32\xb3\x39\x20\x6c\x53\xf3\x60\xf6\x1d\x6a\xed\xa5\xd4\x57\x71\x09\x21\x6d\xcb\x9c\x7d\x29\x34\x09\x94\xe0\xd5\xe3\x93\x50\xb9\xb7\x6e\x12\x11\x90\xd8\x3c\xf1\xcd\x49\x6f\xac\x5a\x5c\x4e\xb1\x46\xe4\x33\xfd\xdd\xca\x46\xef\xa6\x69\xf2\x87\x31\x0e\x9d\xaa\x7f\xa2\xa3\x5d\x36\x65\x79\x59\x14\x28\xe4\xe0\xfa\x55\x8b\x9d\x5e\xd6\xde\x56\x8d\xcb\xb6\xcf\xbe\x55\x49\x09\xf5\x22\x8b\x05\xc2\x7d\x5a\xda\x09\x63\x8c\x07\x91\xe4\x4d\xe8\x23\x52\xdb\x87\xb5\x59\xb0\xbb\x8a\xf6\x1f\x36\x12\x48\xc9\x04\x11\x82\x0f\xa1\x14\xac\x3b\xf4\x20\x9b\x56\xb7\x8a\x09\xe6\x7d\xc1\x6d\xe4\xf2\xdc\x63\x9c\xd4\x7a\xae\xa4\x89\x6f\x24\x68\xee\x8f\xe5\x09\x44\x88\xbb\xb6\x8d\xc0\x50\x90\x9b\x2b\x4b\xab\xdc\x7d\xaa\xf6\x01\x13\xa8\x8e\x12\xc8\xdb\x3e\xe9\xda\x4e\x49\xf4\xe3\x8a\x9f\x4e\xd6\x84\x91\xda\xa4\xd1\x4c\x0c\xaa\x14\x4a\xc9\x85\x66\xc7\xad\x3b\x0b\x98\xd2\xbd\xba\x8e\xce\xd9\xe7\x93\x3b\x50\x76\x1c\x9a\xad\x65\xaa\x0b\x9b\x9f\xb3\xc9\x04\xb0\x4a\x57\x78\x12\x0e\xa3\xda\x95\x8a\xb9\x07\x89\x26\x68\x85\x9a\xac\xed\x02\xc9\x30\x56\x75\x6c\x10\x2a\xac\x53\xb5\xbe\xab\x6d\x15\xae\xa0\xd7\x71\x4b\xbb\xcc\x57\x60\xdb\x40\x19\xce\x7b\x53\x5b\x12\xf7\x2d\x1d\x79\x54\x79\xc6\xde\x41\x67\xbb\x6f\x9f\xdb\xeb\x8e\xb8\xf7\xa7\xcf\xab\xca\x2e\x6e\x21\xb7\xb3\x79\xcd\xb8\x05\x88\x60\x06\x08\xcd\x2b\x0f\x98\x82\x6d\x5a\xe2\x5b\xbd\x39\xac\xe2\x2d\x04\xe1\x89\x19\x03\x77\x1c\x8f\x6c\x54\xb7\x5a\xd4\xb0\xf9\xb2\x0b\x27\x36\xf0\xb6\xd7\x90\xb0\x07\xf0\x1d\xe9\xf2\x8a\xec\x9a\xef\x59\x8e\xd2\x67\x4b\x95\xd8\xbe\x5e\xf8\xdb\x3f\xeb\x3d\xbe\xbe\xd5\x76\xd2\x49\x26\xb6\x49\x25\x8f\xca\x77\x19\xd9\x9c\xed\xa9\x68\xab\x99\x11\x41\xa8\x40\x2f\xe6\xbd\x95\xe4\x80\xc6\xcc\xaa\x08\x1d\x06\x3f\x03\x80\x0f\x1e\xb4\xab\xaa\xcc\x16\xd6\xde\xce\x15\x67\x30\x2c\x84\x4b\x26\x38\xc7\x40\x7b\x9a\x7a\x32\x75\x43\x2e\xaf\xef\xa4\xbe\xd3\x4c\x50\x34\x6b\x26\xed\xd1\xb3\x63\x24\x0e\x41\xfa\x75\xa6\x69\x9a\x65\xb5\xf4\xd7\xed\x74\x1d\xdd\x2e\x59\x43\x07\x23\x03\xf3\xa7\xb2\xd0\x37\x7a\x8c\x63\x77\xfd\x9f\xa9\xd8\x40\xf2\x4a\xf6\xee\x02\x12\x72\xc5\x0f\x38\xcf\x73\x8c\xd4\x50\x7f\x66\x89\xad\x84\x0b\x2e\x9f\x72\xae\x3e\xfa\xb7\xcc\x3b\x83\xce\x39\xa3\xd0\x5e\xa7\x53\x9e\x2b\x36\xf3\x52\x7b\x5b\xe9\x21\x91\x54\x46\x2d\xcc\xaa\x7d\x48\xed\x50\x95\xcb\x6e\xc5\x4b\x5d\x6a\x6b\x9b\x6b\x5c\x46\xa2\xe2\x59\x8c\x6e\x98\x3f\x28\x1c\x93\xf9\x62\xb3\xfc\xfb\xa6\x8a\xc9\xac\xd6\x38\x50\xdc\xb0\x0a\x4b\x60\xb6\x4f\x5f\x6a\xbb\x24\x4d\xee\x4f\x6c\xfa\x8a\x4b\xa9\x3d\x9f\x91\xb5\x26\x2c\xde\x66\x79\x38\xe8\x31\x5b\x76\x77\x0d\x77\x63\x1c\xe0\x6d\x69\x13\x38\xeb\x83\x8a\x4e\xc3\x57\x39\x86\x37\x7f\xd9\x92\xb4\x8e\x92\x95\xbd\xc2\x81\x9f\xbd\xbb\xf9\x56\x9f\xdb\xee\xec\x2e\x5e\x2b\xf6\x49\x54\xc2\xd2\x83\x18\xc6\x31\xd4\x53\xb2\x62\x57\x45\x38\xf5\xd9\x95\xa0\x95\xe7\x82\x45\x95\x86\xe8\x50\x1c\xa0\x3e\xf5\xb7\xab\xc3\x25\xc6\x9d\x34\x50\xbe\xc7\x75\xc0\x24\xe2\x93\x56\x63\x4e\xe8\xc2\x95\xa2\x8e\xd6\x28\x75\x0d\x3a\x4b\x51\x1e\x3f\x7f\x10\x07\x69\x04\x73\x91\x49\xa9\x96\x87\x5f\xfb\x6c\x64\x91\x04\x68\xed\x8e\xea\x4e\x0f\xe8\x6a\x91\x2c\x6e\xba\xed\x77\xa8\xa4\x88\x7f\x77\x6a\xc8\xb9\xf5\x66\x3f\xe0\x2a\xfe\x8b\x1c\x77\x37\x77\xd7\x37\x0a\x1e\x65\x98\xc6\x37\x73\xb5\x47\x4a\x36\x43\xfb\x41\xa8\xdb\xda\x5b\xda\xea\x5f\x67\x60\x24\x92\x12\xcf\x18\x23\x03\x8e\xb8\xaa\x05\x26\xbb\xd2\xa2\xb7\x83\x4a\x2a\xce\x8a\x3c\xd6\0\x0e\x83\xe6\xa1\x3e\xe0\xd7\x63\x67\xed\xf6\xf6\xf2\x47\x64\xec\xc6\x50\x15\x38\x43\x8c\xfd\x6a\xa6\x83\x0c\x52\xc5\x7d\xe6\x46\x8d\x9b\xa9\x07\xcc\xa0\xf1\x9a\x9d\x90\xfa\x90\x59\xdc\x2e\x9f\x0e\xab\xb3\x1e\x4c\x32\x66\x31\xdb\x71\x1c\x8f\xcf\x02\xa9\x68\xd3\xc7\x6b\x7d\x68\xc3\x76\xf9\xd4\xa4\xc5\x94\x80\x58\x9c\x83\xfd\x2a\xba\x32\x6e\x75\x74\x98\xac\xcd\x42\x8c\x62\x80\x12\x90\xf1\x4c\0\xd2\x52\x01\x0d\x25\x30\x10\xd1\xf5\xa0\x04\xa4\xeb\x40\x01\xa6\x63\xde\x80\x0a\x43\x9a\x04\x21\xa4\xa0\x0b\x19\x34\x67\x8a\x62\x14\x1a\x3e\xb4\0\xb9\xa5\xcf\x3e\xd4\0\x52\x8a\x06\x1f\x5a\x5a\0\xc0\xbc\x89\xde\xe7\x58\xc0\xce\x62\x4c\x60\x7b\x56\xbe\x9d\x22\x4d\x63\x13\xc7\xf7\x4a\xe3\x38\xc5\x37\xb1\x0b\x73\x02\x15\x48\x6c\xac\xde\x46\x96\xdd\xc6\xf0\xb2\x85\xdc\x07\xcc\x78\x22\xb5\x74\x06\x91\xe0\x95\xdd\x57\x0d\x21\xda\xea\xbb\x7c\xc1\xfd\xec\x53\x62\x5b\x95\x6f\x1d\xe1\xbe\xd4\xf6\x44\x64\x79\x63\x42\x80\xae\x41\0\x60\xff\0\x3a\xab\x03\x66\xf7\x4f\x90\x4b\x34\xc8\xad\xb4\x93\x16\xd5\x52\x46\0\x1c\x50\x03\xac\x2d\x66\xb3\x78\xaf\xf6\x48\xfb\xa4\x64\x91\x31\xca\xa9\x3c\x10\x3e\xb4\x3d\xbb\x41\x25\xdc\x73\x35\xde\xf9\x1d\x8a\xa4\x43\xe5\x90\x1f\xc0\xd3\x15\x8d\x0b\x0b\x46\x87\x54\xb7\xfd\xdb\x04\x8e\xcf\x66\x5b\x9c\x1d\xdd\x33\x56\x74\x58\xde\x2f\xb6\x6f\x42\x9b\xae\x5d\x86\x46\x32\x38\xe6\xa5\x96\x91\x4e\xff\0\x4e\x96\x7d\x6b\xcb\x28\x4d\xa4\xd8\x92\x43\x8e\x01\0\x8c\x7f\x2a\xaf\x6f\x63\x74\xda\x2d\xeb\x4b\x0b\x99\xd9\x56\x28\xd7\x07\x3b\x57\x1d\xbf\x3a\x77\x26\xcc\xb7\x73\x0d\xc2\xde\xdd\x81\x04\x8c\xb7\x16\xbb\x55\x82\xe4\x02\x01\xe0\xd4\xd2\xda\xca\xfa\x6e\x96\x82\x32\x5a\x29\x22\x2e\x3f\xba\0\xe7\x34\x87\x66\x5b\xd6\xd2\xe1\xb4\xe6\x16\xa1\x99\xf2\x37\x04\xfb\xc5\x7b\xe3\xde\xb2\xb4\xeb\x79\x63\xd5\xed\xe6\x5b\x5b\x94\x89\xa3\x64\x2f\x33\x64\xe7\xae\x4f\xa7\x4a\x16\xc0\xf7\x34\x75\xcb\x47\xbb\xfb\x1a\xa2\x09\x15\x27\x0c\xe0\x8c\x8d\xbd\xf3\x56\x57\x4f\xb5\x44\x75\x86\x18\xe2\x2e\xa5\x4b\x22\x80\x70\x6a\x6e\x3b\x1c\xec\x3a\x4b\x84\x5b\x56\xd3\xdd\xa6\x07\x06\x56\x90\xf9\x78\xcf\x5e\x0f\xa7\x6a\xda\xb3\xb3\x96\x2b\xcd\x41\xf6\x61\x65\xdb\xb3\xdf\x0b\x54\xd8\x92\x29\x5b\xd8\x5d\xdb\xc5\xa5\xb7\x91\xb9\xad\xcb\x89\x14\x30\xca\xee\xef\x55\x2e\x74\xab\xc9\xe2\x9d\x24\xb4\x32\xdc\xb1\x3f\xbf\x69\x78\x23\x3c\x60\x67\xf0\xa2\xe8\x56\x76\x2f\x5d\xe9\xd7\x9a\x9b\x29\x94\x7d\x9d\x60\x8c\x18\x86\x41\x26\x4e\xb9\x3d\x78\xe3\x15\xb1\x64\x66\x6b\x64\x37\x09\xb2\x5c\x7c\xca\x0e\x46\x69\x32\x92\xd4\x5b\xe8\x9a\x7b\x19\xe1\x8f\xef\x3c\x6c\xab\xf5\x22\xb1\x6e\x74\xdb\x93\x14\x11\xcb\x67\x15\xe4\x6b\x0a\xa6\x37\x04\x68\xd8\x0f\x5e\xe2\x84\x0d\x0b\x1e\x97\x7d\x04\x5a\x73\x29\x49\x65\xb6\x66\xdc\x19\xbb\x37\x18\xcf\xb0\xa9\x22\xb5\xd5\x2d\x25\xbb\xfb\x32\x40\x56\x79\x9a\x45\x66\x63\x91\x9f\x6a\x77\x4c\x56\x68\x74\x7a\x45\xc2\xe9\xf3\x01\x72\x56\xf6\x67\xf3\x5a\x45\x38\x19\xf4\xfa\x54\x77\x16\x5a\x96\xa2\x91\xdb\xde\xc7\x6f\x1c\x4a\xc1\x9d\xd4\xee\x27\x1e\x9e\x94\xae\x82\xcc\xd0\xb5\x9a\x77\xbc\xb9\x8e\x40\xbe\x54\x7b\x42\x10\x0e\x7a\x72\x0d\x41\xad\xe9\x67\x51\x10\x6c\x70\x8d\x1b\x7c\xc4\xf7\x53\xd4\x52\xd9\x95\xba\x19\x6f\xa4\x79\x3a\xc4\xb7\x7b\x97\xca\x23\xe4\x41\xd9\x88\0\x9f\xd2\xa0\x6d\x1e\xe5\x2c\x6d\xd2\x19\x22\xf3\xa1\x9c\xca\x37\x67\x69\xe4\xff\0\x8d\x3b\x8b\x94\xb5\x6b\x60\xf1\x0b\xd0\xec\xa4\xdc\x39\x60\x47\x60\x46\x2a\x7d\x3a\xdd\xad\x6c\x61\xb7\x72\x19\xa3\x50\x09\x14\x98\xec\x66\x0d\x1a\xe0\xac\x91\x34\xf1\xf9\x6d\x71\xe7\x29\xc7\xcc\x0e\x79\xab\x77\xba\x68\xbb\xbc\x49\x1d\xbf\x76\x22\x68\xd9\x7b\x9c\xd3\xb8\xac\x55\xb7\xd3\x2f\x55\xe2\x8a\x4b\x98\xc5\xbc\x24\x10\x51\x70\xee\x07\x63\x5a\x37\xd6\xa9\x79\x69\x25\xbc\x84\x85\x71\x8c\xfa\x1f\x5a\x1b\xd4\x69\x77\x33\x24\xd2\xaf\xee\x22\x16\xf7\x57\xca\xd0\x71\xbb\x6a\x61\x98\x55\x93\xa6\x2b\x5c\xca\xec\xc3\xcb\x78\x04\x1b\x71\xce\x3d\x73\x45\xfb\x0b\x95\xf5\x20\x8b\x43\x11\xe9\xab\x6b\xe7\x12\xc2\x51\x29\x7c\x75\xc7\xff\0\xaa\x9d\x73\xa5\xcc\xb7\x8d\x71\x61\x73\xf6\x76\x97\xfd\x62\x95\xdc\x18\xfa\xe2\x8b\x87\x28\xb1\x68\xe0\x5a\xdc\xa4\xb2\x99\x27\xb9\x52\x1e\x52\x3a\x7d\x05\x5f\xb6\x8b\xc8\xb7\x8a\x2d\xd9\xf2\xd4\x2e\x71\xe8\x29\x5e\xe3\x4a\xc3\xc8\x15\x90\xba\x3c\xd1\xb4\xbe\x4e\xa1\x24\x69\x2c\x8c\xe5\x55\x07\x04\xf5\xe6\x84\xec\x0d\x5c\x90\xe8\xf0\xfd\x92\x3b\x65\x76\x08\xb2\x09\x1f\x3c\x99\x0f\xbd\x58\xd4\x6c\x92\xf6\xdf\xca\x66\x29\x86\x0c\xac\xbd\x41\x14\xef\xa8\x58\xb1\xdb\xd6\x8a\x92\x83\xe9\x49\x40\x09\x45\0\x27\x7a\x4a\x60\x21\xa4\x34\x80\x4a\x46\xa6\x01\x49\x40\x08\x69\x0d\0\x27\x7a\x4a\x04\x25\x21\x1c\xd3\x02\x7c\xd1\x9a\x62\x14\x52\xd2\0\xef\x4b\xf5\xa0\x02\x94\x50\x02\xd2\xd0\x02\x12\xa3\xae\x01\x34\x8c\xc9\x10\xcb\x10\xab\xef\xc5\0\x39\x4a\x3a\x82\xb8\x60\x69\x1e\x48\xe3\x03\x73\x05\xcf\x4c\xd0\x02\x79\xb1\x14\x32\x6f\x5d\xa3\xf8\xb3\xc5\x24\x32\x43\x29\xc4\x6e\xac\x47\xf7\x4d\x01\x71\xed\x24\x69\x22\x23\x32\x86\x7c\xed\x04\xf2\x71\xd7\x15\x2f\x18\xa4\x01\xda\x9d\x40\x0b\x43\x30\x8d\x4b\x31\xc2\xa8\xc9\x3e\x82\x80\x23\x86\xee\x19\x52\x36\x49\x01\x12\xfd\xcf\xf6\xaa\x73\xc7\x5a\x2c\x04\x73\xcd\x1d\xbc\x2f\x2c\xad\x84\x41\x92\x7a\xe0\x53\x92\x45\x91\x15\x94\xe4\x30\xc8\xa0\x07\x70\x0d\x2d\x20\x21\x9e\xea\x38\x66\x86\x27\x3f\x3c\xc4\x84\x18\xeb\x81\x93\x4b\x77\x75\x15\xa5\xbb\xcf\x3b\x6d\x8d\x31\x93\x8c\xf7\xc5\x3b\x05\xc7\xc9\x2a\xc7\x0b\x4a\xd9\xda\xaa\x58\xe0\x76\x14\xdb\x69\xe3\xb8\x82\x39\x63\x3f\x24\x8a\x18\x7d\x0d\x2b\x01\x21\x38\x34\xea\x06\x45\x6b\x70\xb7\x10\x2c\xa1\x59\x01\xcf\x0e\x30\x78\x3e\x95\x30\x20\xd0\x22\x17\xbb\x89\x2e\x56\xdc\xb7\xef\x1d\x4b\x01\x8e\xc2\x99\x61\x7d\x15\xf5\xb8\x96\x3d\xc1\x49\x23\x0d\xd7\x83\x8a\x76\x0b\x96\x0b\x0c\xf5\xa3\x83\xcd\x21\x94\x35\x8d\x52\x2d\x2e\x24\x79\x55\x9b\x7b\x60\x2a\xf5\xfa\xd5\xb4\x91\x5e\x15\x91\x5b\x2a\xc3\x20\xd3\xb6\x82\xbe\xb6\x2b\x35\xf4\x63\x51\x8e\xd0\x72\xce\x85\xc1\xcf\xa5\x59\xf3\x10\xb6\x37\x02\x45\x2b\x05\xca\xb0\x5f\xa4\xb7\x37\x10\xb0\xd8\x61\x60\xa4\x93\xd7\x23\x35\x65\xdd\x15\x37\x33\0\xa3\xb9\xa1\xa1\xdc\xaf\x7d\x78\xb6\xd6\x32\x5c\xa8\xf3\x02\x2e\x70\x0f\x5f\xc6\xb3\x9b\x57\xbd\x8a\x0f\xb4\x4d\xa6\xba\xc3\x8d\xc5\x84\x80\x90\x3d\x71\x54\x90\x9b\xb1\x3d\xde\xa9\xb4\x40\x96\x91\x19\xe7\xb8\x1b\x91\x01\xc7\x1e\xa4\xf6\xa6\x41\xa9\x5c\xc7\x79\x15\xbd\xfd\xaf\x92\x65\xfb\x8e\xaf\xb8\x13\xe9\x45\x82\xe4\x5f\xda\x97\xb2\xdd\x5c\x45\x6d\x64\x25\x58\x5f\x6e\xe3\x28\x5f\xe7\x53\xdb\x6a\xc8\xfa\x74\xb7\x33\x21\x89\xa0\x25\x24\x43\xc9\x0c\x3b\x51\x61\x73\x0c\x9f\x54\x9a\x33\x04\x11\xdb\x19\x6e\xe5\x4d\xe6\x35\x6c\x05\x1e\xe4\xd3\x5b\x5a\x09\x64\xf2\xbc\x2c\x26\x49\x04\x6d\x16\x79\xdc\x7b\x66\x8e\x50\xe6\x1d\x69\xa9\x4d\x25\xc9\xb5\xba\xb6\x30\x4c\x53\x7a\x7c\xdb\x83\x0a\xb1\xa6\x5e\x7d\xb2\xdc\xb3\x2e\xc9\x11\x8a\x48\xbf\xdd\x61\x43\x43\x4c\x7d\xd5\xdc\x16\xa0\x79\xf2\xa4\x79\xe9\xb8\xe3\x34\x8f\x79\x6c\x90\x09\xda\x68\xfc\xa3\xd1\xb7\x70\x69\x59\x8e\xe8\xaf\x7b\xa9\x22\xe9\x92\xdd\x5a\xbc\x72\xec\xe9\xce\x47\x5a\x92\x7d\x42\xda\xd9\x50\xcf\x32\xa1\x71\x90\x09\xa2\xc2\xb8\xb2\x5f\xdb\x47\x14\x72\x3c\xc8\x23\x90\xe1\x5b\x3c\x1a\x92\x19\x52\x68\x56\x58\x9b\x72\x30\xc8\x3e\xb4\x58\x77\x1f\x9a\x0f\x4a\x43\x12\x8e\xb4\0\x87\x14\x94\0\x86\x92\x98\x08\x69\x28\x01\x29\x28\0\x38\xa4\xa0\x42\x71\x49\x8a\0\x43\x49\x40\x13\xd1\x54\x21\x69\x7a\x0a\x40\x14\x50\x02\xd2\x8c\xd0\x02\xd1\x40\x18\xba\xda\xce\x97\xf6\x72\x19\x89\x89\xa7\x50\x23\x03\xa7\xe3\x46\xb2\x03\x6a\x76\xea\xf0\x9b\xa4\xf2\xcf\xee\x53\xa8\x39\xfb\xdf\xd2\xa9\x12\xc4\xd1\x2e\xa2\xb4\xb1\x94\xdc\x49\xe5\xa8\x99\x94\x46\x72\x7c\xbf\xf6\x69\x75\x55\x6b\xfb\xab\x59\x20\xb6\xfb\x54\x21\x18\xfd\xed\xa0\x93\xef\x47\x5b\x87\x4b\x11\x33\x2d\xd6\x92\x6d\xed\x2c\xf6\xba\xce\x16\x48\x81\xe3\x23\x93\xcf\xe1\x57\x34\xb7\x8a\x0b\xe7\xb5\x7b\x35\xb5\x98\xa6\xf1\xb4\xe4\x32\xfd\x69\x30\x43\xf5\x56\xf2\xf5\x5d\x3d\x89\xf9\x47\x98\x79\xff\0\x76\xb3\x4e\xb1\x70\xd1\x7d\xa9\x2e\x0b\x3e\x73\xf6\x61\x09\xc6\x33\xd3\x77\xd2\x84\x81\xbb\x32\xfe\xeb\xdb\xcd\x4a\xea\x08\xae\xbc\x88\xe2\x54\x23\xe4\x04\xe4\x8c\xd5\x73\xa8\xdd\x4d\x65\x69\x23\xbb\x45\x1b\x86\x12\xcb\x1a\x6e\x20\x83\x8e\x9d\xba\x51\x64\x17\x66\xae\x89\x39\x9e\xd4\xb3\x4e\x97\x18\x62\x03\xa8\xc1\xc7\xb8\xec\x6a\xdd\xe7\xfc\x7a\x4f\xff\0\x5c\xdb\xf9\x54\xb2\xba\x1c\xd4\x10\x3b\x9d\x10\xac\xcd\x18\x65\x6c\x60\x0e\x08\x19\x27\xf1\xad\xed\x61\xae\x13\x4f\x73\x68\x18\xc9\xc7\xdd\x19\x6c\x67\x9c\x0f\x5a\xa7\xb9\x2b\x63\x17\xed\x3e\x6d\x8d\xf4\x62\xea\x49\x07\x90\x49\x8a\x75\xc3\xa9\xf5\xf7\x15\x3c\x4b\x71\x64\xfa\x6b\xfd\xaa\x49\x04\xf8\x47\x8d\xb1\xb7\xee\xf6\x1d\xa9\x88\x6a\x3d\xd5\xc6\x99\x2e\xaa\x2f\x24\x8d\xd7\x73\x24\x63\x1b\0\x07\xa1\x1d\xea\xee\x9b\x77\x2c\xfa\xa4\xa1\x99\x82\x18\x23\x70\x84\xfd\xd2\x41\xa4\xc6\x8c\xf8\x26\x79\x1f\x4e\x96\x57\x67\x22\x79\xb0\xc4\xf3\x80\x0f\xf8\x54\x77\xd0\xc9\x73\xe1\xd9\x2f\xe5\xbb\x94\xc8\xfc\x94\xdd\xf2\x01\xbb\xa6\x29\x88\xe8\xae\xf9\xd3\x27\xed\xfb\x96\xeb\xfe\xe9\xae\x7a\x28\x9e\xd3\x46\xb3\xbe\x8a\xea\x56\x94\x14\x1b\x0b\x7c\x84\x1e\x36\xe2\xa5\x0d\x8a\xf2\x5d\xde\x49\x76\xe6\x3b\xb2\xc9\x23\x2c\x6d\x1c\x81\x55\x31\xd3\x23\xf9\xd7\x45\xa6\x34\xcf\x61\x0b\xdc\x63\xcc\x28\x37\x11\xdc\xd0\xf6\x04\x73\xb6\xcd\x2d\xcc\x7a\x54\x6f\x71\x30\xf3\x24\x98\x3b\x07\x39\x20\x13\xde\xb4\xf4\x90\x6d\xb5\x6b\xeb\x44\x91\xda\x14\x08\xc8\xac\xc5\xb6\xe4\x73\xc9\xa6\xc1\x11\xdf\xda\xc4\xfe\x25\xb4\x76\x2d\x93\x1b\x36\x37\x11\x82\x31\x59\xb0\x59\xa2\xe8\x37\x17\xa1\xa4\x13\xc6\xec\x63\x60\xe4\x6c\xc3\x76\x1f\x9d\x09\x89\xa2\x4b\xaf\xb4\x5f\xea\x73\xc6\xd6\xdf\x69\x8e\x34\x40\xab\xe7\x6c\x0b\x91\x9c\xfb\xd6\xb7\x87\x4c\xff\0\xd9\xdb\x6e\x18\x31\x46\x2a\xa4\x38\x6e\x3b\x64\x8e\xfd\xa9\x3d\x86\xb7\xb9\x9f\xa8\x19\xaf\x75\xb7\xf2\x2d\x4d\xd4\x76\xf1\x18\xd8\x6f\x0b\x82\xc3\x9e\x4f\xb7\x15\x59\x65\x91\xb4\x6b\x7b\x3b\x8d\xc8\x63\xba\x16\xf3\x60\xff\0\x0f\xf9\xc5\x3d\x04\x4d\x34\x10\x58\x6b\x2c\x74\xf5\xda\xe2\xd1\xdb\x60\xe7\x04\x74\xa8\x9e\x0b\x78\x74\x38\x2f\xad\xdb\xfd\x37\xe5\x22\x40\xc4\xb3\x31\x23\x20\xfa\xf7\xa0\x7a\x13\xdb\xd9\xd9\xdd\xeb\x1a\x97\xdb\x10\x3b\x2e\xcc\x02\x4f\0\xaf\x26\xa8\x5b\xfd\xa2\xe7\xec\x31\x3a\xa4\xd0\xed\x72\x8b\x33\x10\xaf\x83\x81\x9f\x5c\x0a\x7e\xa2\x27\x31\x3c\x5a\x7e\xad\x1e\xe8\x42\0\x08\x8a\x22\x48\x8c\xe3\x9e\xa3\xe9\x4e\xbd\xb2\xd4\x3f\xb1\x4c\x8f\x7f\xbe\x21\x10\x63\x1f\x96\x06\x47\xa6\x45\x17\x57\x0b\x32\x68\x25\x8e\xdb\x58\xb5\x9e\x40\x22\x86\x7b\x45\x48\xc9\x3c\x29\xeb\x8c\xd3\x2f\x6e\xee\x20\xd5\xad\xe2\x4b\xf1\x28\x96\x60\x0c\x42\x35\xf9\x54\x9f\x5a\x56\x1d\xec\x43\x04\x50\xb6\xa3\xa8\xf9\xb7\xef\x69\xfb\xdc\xe1\x64\x0b\x9e\x3d\xea\xba\x16\xfe\xc9\x9a\x20\x7c\xcb\x78\xee\xd7\xf7\xb8\xff\0\x58\x33\xc9\x3e\xbd\xb9\xa6\x23\x57\x55\x02\x3d\x52\x09\xa0\x9d\x20\xb9\xf2\xca\xe2\x55\x3b\x5d\x7e\xbe\xb5\x8f\x22\xbf\xd9\xae\xe4\x9a\x45\x92\x3b\x8b\x94\x43\x30\x1c\x2e\x3a\xb0\xfa\x74\xa4\x81\x9a\x16\x51\xa5\xbe\xbd\x0a\xc3\x70\xd7\x7e\x64\x44\x3b\x39\xdc\x63\xc7\x23\x9f\x7a\xb7\xa3\x02\x35\x1d\x4f\x6f\xfa\xbf\x35\x71\xf5\xc7\x34\x31\xa2\x29\x5a\x04\xf1\x0c\x86\xfb\x60\x5f\x24\x08\x8b\xf4\xf7\xeb\xde\xa9\x23\x5a\x2d\xed\x93\xaa\x14\xb2\x0f\x21\x5d\xff\0\x77\x77\x63\xf4\xf4\xa3\x50\xd0\x2f\x76\x49\xfd\xac\xf6\xa0\x79\x26\x25\x04\xaf\x42\xf9\xed\x53\xda\xcb\x0c\x1a\xb4\xcf\x7a\x42\x6f\x85\x3c\xa3\x27\x1f\x2e\x39\x1f\x9d\x3e\x80\x52\x8a\x10\xe2\xd8\x94\xff\0\x47\x92\xfc\x98\xd4\x8e\x36\xf3\xdb\xd2\xba\x90\xa1\x46\0\xc0\xf6\xa9\x90\xe2\x1d\xe8\xa9\x2c\x43\x45\0\x21\xa4\xa0\x04\xa4\x34\0\x86\x90\xd3\x01\x29\x28\x01\x28\x34\0\x9d\xa9\x38\xe9\x40\x84\x34\x86\x80\x26\x1d\x28\xaa\x10\xa3\xde\x96\x90\x0a\x68\xa0\x05\xa2\x80\x16\x81\x40\x15\xaf\xed\x0d\xd1\x80\xab\x05\xf2\xa5\x0f\xf5\xc5\x45\x79\x65\x39\xbb\x5b\xbb\x39\x11\x65\x0b\xb1\x83\x8e\x08\xfc\x29\xa6\x26\x89\x34\xfb\x1f\xb3\xac\xad\x3b\x09\x65\x99\xf7\xb9\xc7\x19\xf4\xa2\xf2\xd2\xe0\xcc\xb3\x59\xce\x23\x21\x76\x98\xdc\x12\x87\xdf\x8e\xf4\x5f\x50\xb6\x84\x29\xa4\xca\x96\xed\xb6\xe9\x96\xe1\xa5\xf3\x4c\x80\x70\x4f\xa1\x1e\x95\x2d\x9d\x8c\xab\x76\xd7\x57\x72\x89\x66\xdb\xb1\x70\xb8\x0a\x28\xb8\x58\x9e\xea\xcc\x5c\x5d\x5b\xcc\xcd\x81\x0e\xef\x97\x1d\x72\x31\x55\x23\xd2\xa6\x8d\x44\x09\x78\xc2\xd4\x36\x76\x05\xc3\x63\x39\xc6\xef\x4a\x57\x0b\x17\xad\xed\x04\x37\x97\x17\x01\x8e\x66\xdb\x91\xe9\x81\x8a\xaa\x9a\x4b\xc1\x04\x2b\x6b\x74\xd1\xbc\x59\xe7\x6e\x55\x81\x39\xe4\x51\x70\xb1\x2d\xb6\x98\xd0\x43\xb5\x2e\x18\x3b\x4d\xe6\xc8\xe0\x01\xb8\xf7\x18\xec\x2a\xfb\xa0\x92\x26\x43\xd1\x94\x8f\xd2\x86\xee\x34\x8c\xf6\xd2\x14\x45\x68\xa9\x33\x23\xda\x9f\x95\x80\xea\x0f\x51\x56\xaf\xed\x16\xf2\xdf\xca\x2e\xd1\x90\x43\x2b\xaf\x55\x23\xa1\xa2\xe2\xb1\x55\x34\x75\x71\x21\xbb\x9d\xe7\x96\x48\xfc\xad\xf8\x03\x6a\xf5\xe0\x0a\xb5\x25\x8c\x72\x7d\x9b\x71\x6c\x5b\x9c\xaf\xbf\x18\xe6\x8b\x85\x8a\x9f\xd8\x71\x7c\xf1\xac\xf2\x8b\x67\x6d\xc6\x01\x8d\xbd\x73\x8c\xf5\xc5\x4f\x75\xa5\xa4\xd7\x2b\x3c\x73\x4b\x6f\x26\xdd\x8d\xe5\xe0\x6e\x5a\x2e\x16\x0b\x7d\x1e\xda\x01\x6e\xa8\x64\xc5\xbb\xb3\xa6\x4f\xf7\xba\xe6\xa1\x97\xc3\xf6\xd2\x23\xc5\xe7\x4e\xb0\x31\xdc\x22\x0f\xf2\xa9\xce\x78\xe2\x8e\x60\xe5\x46\x94\x91\xac\x90\xb4\x4d\xf7\x59\x4a\x9f\xa6\x2b\x3e\xdb\x42\xb6\x81\xe3\x22\x49\x9e\x38\xce\xe5\x89\xdf\x2a\x0f\xae\x29\x5c\x6d\x5c\x92\x7d\x1a\xda\x69\x9d\xf7\xcb\x18\x90\xe6\x48\xe3\x7d\xaa\xe7\xd4\x8a\xbf\x1c\x6b\x1c\x6a\x88\xa1\x55\x46\0\xf4\x14\x5c\x12\xb1\x56\x1d\x32\xda\x2f\x23\x62\xb0\xf2\x0b\x14\xe7\xa6\xee\xb5\x32\x5b\x44\x97\x12\x5c\x2a\xe2\x49\x40\x0c\x7d\x71\xd2\x8b\x85\x86\x5d\x58\xc3\x73\x34\x32\xc8\x18\x49\x09\xca\xb2\x9c\x7e\x06\x91\x74\xfb\x65\xb3\x7b\x5d\x87\xc9\x72\x49\x5c\xfa\x9c\xf5\xa2\xe1\x61\x97\x5a\x5d\xad\xc3\xab\xb8\x65\x75\x5d\xbb\x91\xc8\x24\x7a\x1a\xb1\x6f\x04\x56\xd1\x2c\x50\xa0\x44\x51\xc2\x8a\x2e\x16\x08\x2d\xa2\xb7\x2e\x62\x5d\xa6\x46\x2e\xc7\x3d\x4d\x45\x26\x9f\x6b\x2f\x9d\xbe\x20\xde\x7e\x3c\xcc\xe7\xe6\xc7\x4a\x2e\x16\x1b\x6f\xa6\x59\xdb\x4a\x24\x86\x1c\x48\x38\xdd\xb8\x93\xfa\xd4\x71\x69\x16\x31\x4e\x25\x8e\xdd\x43\x83\xb8\x72\x70\x0f\xb0\xe8\x28\xbb\x0b\x21\x6e\x74\xab\x1b\x99\x4c\x93\x5b\xab\x39\xea\xd9\x23\x3f\x91\xa7\xcf\x61\x6b\x71\x6e\x90\x4b\x0a\xb4\x69\xf7\x57\xa6\x28\xbb\x0b\x20\x8a\xc6\xda\x2b\x73\x6f\x1c\x2a\x22\x6c\xe5\x7d\x7e\xb5\x23\x41\x1b\x40\x61\x64\x06\x3d\xbb\x76\x91\xc6\x28\xb8\xec\x47\x25\x9d\xb4\xb0\x2c\x12\x42\x8d\x1a\xf0\x14\x8e\x94\xc8\x34\xdb\x2b\x70\x04\x56\xd1\xae\x18\x30\x38\xe7\x23\xde\x8b\xb0\xb2\x16\x4d\x3e\xce\x59\x0b\xc9\x6b\x13\x39\xea\xc5\x01\xcd\x13\xd9\xc1\x35\xa3\xda\x94\x0b\x13\x0c\x6d\x50\x06\x3d\xc5\x17\x61\x64\x30\x59\x24\xd6\xb1\x45\x7c\x89\x3b\xa0\xc1\x62\x3b\xd4\xa2\xde\x15\x83\xc8\x11\x27\x94\x06\x36\x63\x8c\x51\x70\xb0\xdb\x7b\x38\x2d\x43\x7d\x9a\x14\x8c\x9e\xa4\x0a\x6d\x85\xaa\xda\x5b\x94\xdd\xbd\xd9\x8b\xbb\x7f\x79\x8f\x5a\x2e\x16\x1f\x35\xbc\x37\x18\x13\xc4\x92\x01\xd3\x72\x83\x8a\x1e\x08\x9e\x3f\x2d\xa2\x43\x18\xfe\x12\xa3\x1f\x95\0\x0b\x0c\x49\x1f\x96\x91\xa2\xa7\xf7\x40\xc0\xa6\xcb\x04\x33\x63\xcd\x89\x24\xdb\xd3\x72\x83\x8a\0\x7e\xc5\x20\x0d\xa3\x0b\xd3\x8e\x94\x1e\x29\0\x99\xa0\xd0\x31\x29\x29\x80\x77\xa4\xa0\x04\xed\xc5\x25\0\x21\xe9\x49\x40\x08\x79\xa4\xa0\x03\x8a\x4a\x04\x25\x21\xa0\x04\xa4\x22\x80\x25\xa5\xa6\x21\x68\xef\x4c\x05\x14\xb4\x86\x1d\x29\x7e\xb4\0\x52\x8a\0\x6b\x4d\x1a\x38\x56\x75\x04\xf4\x04\xf2\x68\x92\x68\xe3\xce\xf7\x55\xc7\x5c\x9a\x04\x2b\xcb\x1a\x46\x64\x77\x55\x4f\x52\x78\xa2\x29\xe2\x95\x37\xc6\xea\xca\x3b\x83\x9a\0\x48\x6e\xa0\x99\x8a\xc5\x2a\x39\x5e\xa1\x58\x1c\x50\xb7\x96\xed\x2f\x94\x93\x46\xcf\xfd\xd0\xc3\x34\x59\x85\xd1\x38\xa5\x1e\xf4\x86\x2d\x2f\x34\0\xa2\x9c\x33\x48\x02\x94\x53\0\xed\x4b\x9c\x52\0\xa5\x14\0\x80\xe4\x52\xd0\x02\x52\xf6\xa0\x05\xa3\xbd\0\x03\xeb\x45\0\x2d\x25\0\x07\xad\x02\x80\x0f\x6a\x08\xcd\0\x26\x68\xcd\0\x26\x79\xe6\x90\x50\x01\x9e\x68\x3d\x28\x01\x28\xa0\x02\x93\xf0\xa0\x02\x92\x81\x85\x25\0\x27\x4a\x4a\0\x29\x28\0\x38\xa4\xa0\x04\xfa\x52\x53\0\x14\x50\x02\x52\x52\x01\x29\x31\x4c\x06\xf7\xa2\x80\x0f\xc2\x90\xd0\x02\x1a\x4a\0\x43\x48\x7d\xe8\x10\x94\x9d\x68\x02\x5a\x70\xaa\x10\x52\xd2\0\xcd\x14\0\xb9\xa2\x80\x16\x81\xd6\x80\x39\xdb\xd8\x57\xce\xbc\x93\x64\x57\x28\x18\x97\xcb\x6d\x92\x3f\x61\x9a\x96\xdc\x5b\x5c\xeb\x04\xdc\xa8\x21\xad\xd0\xaa\xc9\xfa\xfe\x35\x7d\x08\x2b\xa6\xd3\x6d\x1c\x0a\x82\x44\x7b\x97\xf2\x37\xb1\x08\x14\x7a\xfa\xf7\xa6\x21\x74\x83\x53\x44\x28\x3e\xe6\x44\x39\xda\x07\x7c\x53\x11\x7e\xe9\x6c\xd3\x06\xc9\x40\xb8\xf2\x1f\x6f\x95\xd0\x8c\x77\xfe\x95\x42\x18\x8b\xc5\x65\x89\x6d\x51\xb7\x21\x5f\x29\x4e\xff\0\xc7\xfa\xe6\x92\xf3\x07\xe4\x75\x50\xcd\x1c\x8c\xca\x8e\x19\x90\xe1\x80\x3d\x0d\x4a\x38\x15\x99\xa8\xa3\xda\x94\x1a\x04\x38\x0e\x69\x72\x05\x03\x0c\xe2\x8c\xf1\x48\x05\xa4\x06\x80\x17\x34\x7b\xd3\x01\x68\xa4\0\x29\x73\x40\0\xa0\x9f\x6a\0\x51\xd2\x8e\x28\x01\x3b\xd2\xf1\x40\x09\x9c\xd1\xdb\xad\0\x14\x1a\0\x41\x41\xf5\xa0\x04\xf6\xa3\x39\x3c\x50\x01\x45\0\x27\x7a\x4c\xd0\x01\xf5\xa2\x80\x10\x9a\x3b\x50\x30\xa4\x34\x08\x0d\x21\xe2\x80\x13\xe9\x49\x40\xc0\xd2\x1a\0\x4a\x40\x69\x80\x50\x4d\x20\x1a\x4d\x14\xc0\x43\x8a\x6d\0\x14\x84\xf3\xeb\x40\x09\x49\x40\x05\x27\x14\0\x84\xd2\x1a\x04\x21\xa4\xa0\x09\x46\x3d\x68\xe9\xd2\xa8\x42\xd2\xd2\0\xeb\x4b\x40\x07\x5a\x51\xd6\x80\x0e\xbd\x29\x45\x03\x2b\xcb\x61\x6b\x3c\xc2\x59\x60\x46\x7f\x5f\x5f\xad\x43\x26\x97\x1c\xfa\x83\xcf\x3c\x71\xbc\x6c\x8a\xa0\x11\xc8\x22\x9a\x64\xd9\x16\xa4\xb3\xb7\x96\x11\x0c\x90\xa1\x8c\x74\x5c\x70\x3e\x94\x45\x67\x6d\x11\x26\x38\x11\x49\x5d\xbc\x0e\xa3\xd2\x95\xc7\x61\x6d\xac\xed\xad\xd9\x8c\x10\xa2\x16\xea\x54\x51\x1d\x9d\xb4\x72\x99\x63\x82\x35\x73\xfc\x41\x46\x68\xb8\x58\x99\x23\x44\x2c\x55\x55\x4b\x72\x48\x18\xc9\xa7\x83\xe9\x48\x05\x27\xde\x95\x68\x18\xf1\xd2\x8a\0\x0f\xeb\x40\xa4\x01\x40\x3e\x94\xc0\x5e\x69\x73\x48\x02\x8c\xd0\0\x4f\x34\xbd\xa8\0\xe9\x45\0\x2d\x1d\xba\xd0\x01\x40\xc5\0\x27\xb5\x14\0\x7e\x34\x13\x40\x06\x69\x28\0\xef\x49\x40\x0b\xd3\xa5\x27\x6e\x68\0\xce\x69\x28\x01\x0d\x14\x0c\x28\xa0\x03\xb5\x25\0\x25\x27\x14\0\x52\x1a\0\x4a\x4a\x60\x04\x50\x29\0\x9d\xe9\x0d\x30\x10\xd2\x1a\x40\x21\xa2\x98\x84\xa4\xa0\x60\x78\xa4\xa0\x04\xa4\x34\0\x7d\x69\xbd\xa8\x10\x9d\x69\x28\x02\x41\x4b\x54\x21\x69\x69\0\x66\x97\xbd\0\x19\xf7\xa5\xa0\x02\x94\x50\x02\xd0\x28\x18\x67\x9a\x5a\x04\x28\xeb\x4b\x9f\x6a\x43\x0a\x50\x68\0\xcd\x3d\x68\x01\xfd\xfa\x50\x4d\0\x19\xa4\xe8\x68\0\xcd\x2e\x69\0\x66\x97\x3c\x53\0\xc8\xf5\xa2\x90\x0b\xc0\xa5\xa0\x04\xfa\x52\xd0\x01\xd6\x8c\xf3\x40\x05\x26\x78\xa0\x03\x34\xbf\x5a\0\x4c\xd1\x9c\xd0\x02\x66\x8e\xb4\0\x74\xa2\x80\x0a\x4c\xd0\x02\x71\x40\xa0\x02\x8e\xbd\x68\x18\x1a\x4c\xd0\x01\x9a\x4a\0\x3b\x52\x1a\0\x0d\x37\xbd\0\x14\x94\0\x94\x50\x02\x51\x4c\x04\xeb\x49\x48\x02\x92\x80\x1b\x47\x7a\x60\x21\xf5\xa0\xd0\x02\x1a\x43\x40\x09\xde\x90\x8a\x04\x36\x8a\0\x92\x97\x35\x42\x16\x8a\0\x29\x73\x48\0\x75\xa5\x06\x80\x14\x73\xda\x8a\0\x28\xa0\x05\xa5\x14\0\xb9\xa2\x81\x8b\x9a\x33\xda\x80\x14\x72\x70\x2a\x51\xd2\x90\x85\xcd\x19\xe2\x81\x89\x46\x68\0\xcd\x14\0\xb9\xa5\x34\0\x62\x80\x69\0\xbc\xe6\x8e\xf4\xc0\x5a\x4a\x40\x2d\x14\0\xb4\x94\0\x64\x52\x50\x01\x9a\x38\xa0\x02\x93\x3e\xb4\0\x66\x8c\xd0\x01\x48\x68\0\xfc\x28\xa0\x05\xa4\x3e\xd4\x0c\x43\xd3\x9a\x33\x40\x09\x47\x4a\0\x43\x45\0\x21\xa4\xef\x40\x07\x6a\x6d\0\x14\x50\x02\x52\x53\x01\x28\xa0\0\x7b\xd2\x52\x01\x29\x3b\xd3\x01\x0d\x07\xde\x80\x12\x92\x81\x09\x4d\x3e\xd4\0\x94\x94\x01\x2f\xe3\x46\x6a\x84\x2f\xd6\x8a\0\x5a\x28\0\x14\xbe\xd4\0\xa2\x97\x34\x80\x81\x2e\x62\x6b\xa9\x2d\xd4\x9f\x31\0\x24\x63\xb1\xa0\x5d\x44\x6e\xda\xd8\x13\xe6\x2a\xee\x3c\x76\xa7\x60\xb9\x3e\xe1\xd3\x34\xb9\x18\xeb\x48\x61\xb8\x0e\xa4\x53\xb3\xf9\x50\x21\x37\x0c\xf5\xc5\x28\xe7\x9a\x06\x3d\x0a\xfa\xd3\x2d\xee\x04\xc6\x40\x51\xd3\xcb\x72\xbf\x30\xc6\xef\x71\xed\x48\x09\x77\x29\xe8\x69\x03\x02\x78\x34\0\xa4\x80\x32\x4d\x56\x4b\xd8\xde\xf9\xed\x80\x3b\x95\x03\xe7\xb1\x04\xd0\x22\xc0\x91\x49\xc0\x23\x3f\x5a\x50\xc3\x19\xcf\x14\x0c\x78\xe7\xa5\x1d\xe8\0\xa3\xe9\x40\x0a\x38\xcd\x28\xeb\x40\0\x34\x67\xd2\x90\x07\x34\xb4\xc0\x33\x49\xf5\xa0\x02\x8c\xd2\x01\x09\xfd\x68\xf7\xa0\x02\x92\x80\x0f\xa5\x19\xa0\x03\xbd\x19\xa0\x03\xf1\xa3\x34\x0c\x29\x28\x01\x0f\x34\x0a\0\x28\x3c\x50\x03\x4d\x1d\xf9\xa0\0\xd2\x1c\x53\x01\x0d\x25\0\x21\xcd\x14\0\x52\x50\x02\x75\xa3\xb7\x34\0\x1a\x43\x8a\0\x43\x49\x40\x09\x49\x40\x05\x34\x9a\0\x4a\x4e\x94\xc4\x27\xd6\x90\xf4\xa0\x09\x29\x45\x31\x0a\x68\xa0\x02\x96\x90\x0a\x28\x1e\xd4\xc0\x51\x46\x69\x01\x89\x20\xba\x3a\xf5\xc0\xb4\x68\x83\x18\xd7\x26\x40\x7f\xa5\x46\x1a\x78\x35\x3b\xa7\xba\x92\x35\x90\x5b\xe7\x7a\x03\x80\x3f\x1a\xa2\x35\x22\x81\xe5\x4b\xbb\x37\x1f\x69\x51\x2b\x15\x76\x95\xb8\x7e\x3d\x33\x52\x99\xa7\x11\xb6\x9b\xe6\x37\x9c\x67\xda\x18\xb7\xcd\xb3\xef\x67\xf2\xa6\x22\x39\x1a\xea\xe6\xe2\xeb\x31\x4c\xde\x53\x94\x52\x92\xed\x09\x81\xfa\xd6\xde\x94\xd2\xbe\x9f\x13\x5c\x10\x64\xdb\xc9\x07\x39\xf7\xcd\x27\xb1\x4a\xf7\x30\x6f\x9d\x9a\xde\xe2\xee\x05\x9e\x42\xaf\x95\xb8\x67\xda\x07\x3d\x97\x3c\x8a\xe9\x2e\x1b\x1a\x7c\xcd\x9c\x1f\x2d\x8e\x7f\x0a\x18\x23\x15\x2d\x84\x16\x1a\x7d\xda\x49\x20\x9d\xe4\x8c\x33\x16\x27\x70\x6e\xd8\xa0\xcb\x26\x66\x8b\x7b\x2a\x4b\x7e\x51\x98\x1c\x60\x71\xc7\xe3\x4c\x5b\x12\x6a\x68\xba\x74\x33\x0d\x3e\x72\xa5\xd5\x73\x10\x6f\xbb\xce\x37\x64\xf4\xa6\xd8\x41\x35\xb6\xa7\x6f\xb6\x11\x6e\xaf\x9d\xe0\xce\x1f\xcc\x18\xf4\xf5\x14\xba\x07\x52\xf6\xb7\x99\x26\xb3\xb6\x72\x56\x09\xa4\x22\x42\x0e\x33\x81\xc0\xfc\x6a\x88\x8e\xda\xc3\x53\xbd\x30\x96\x48\x96\xdb\x24\x29\xc9\x4c\x9e\xdf\xcf\xf1\xa1\x6c\x37\xb9\x0d\xb4\x46\x0b\xeb\x06\x16\xe2\xdf\xcc\x62\x09\x32\x6e\x69\x06\x3b\x8a\x91\x87\x97\xbf\x46\x07\x97\xb8\x18\xc7\xfc\xf3\x3f\x31\xfe\xb4\xc4\x74\x88\xcb\x92\x80\x8c\xaf\x51\xe9\x4f\xac\xcd\x02\x97\x3d\xa8\0\xa5\xfa\x50\x01\xd6\x94\x52\0\x14\x7e\x34\0\x51\x9a\x60\x19\xa4\xcd\x20\x0c\xf3\x41\xa0\x04\xc5\x04\xd3\0\xa4\xfc\x29\0\x67\x14\x66\x80\x16\x8a\0\x4c\x66\x93\x34\x0c\x33\xe9\x45\0\x07\xad\x27\x7a\0\x4c\xd2\x1f\x6a\x60\x18\xa4\x3d\x28\x01\x0f\xa5\x04\x50\x02\x13\x49\xda\x80\x0a\x28\0\xa4\x26\x80\x03\xd6\x9b\x40\x07\x5a\x43\x40\x08\x69\x0d\0\x25\x21\xa0\x42\x52\x50\0\x69\xb4\x01\x20\xa5\xce\x2a\x84\x19\xa2\x80\x16\x96\x90\x05\x14\0\xb9\xa7\x50\x04\x0b\x6a\x8b\x74\xd7\x20\x9d\xec\xa1\x4f\xa7\x14\xd9\x2c\x20\x96\x69\x25\x75\x24\xc8\x9b\x08\xcf\x6a\x77\x15\x8a\xc3\x47\x84\x18\xc9\x96\x66\x68\xc8\x28\x59\xf3\xb7\xda\xad\xfd\x8a\x1f\xb6\x0b\xb2\xbf\xbd\x0b\xb7\x3e\xd4\x5c\x14\x51\x1d\xc6\x99\x6f\x3c\xa6\x42\x64\x42\xdc\x38\x46\xc0\x7f\xad\x5c\x8a\x34\x8e\x35\x8e\x30\x15\x54\x60\x01\x45\xc7\x62\x93\xe8\xd6\x6e\x5c\x32\xbe\xc6\xcf\xc9\xbc\xed\x52\x7b\x81\x57\x56\x25\x10\xf9\x27\x25\x36\xed\xe4\xf3\x8f\xad\x0d\xdc\x12\x48\x69\xb3\x81\xa1\x8a\x12\x9f\x24\x44\x14\x19\xe8\x47\x4a\x6b\x69\xf6\xcf\x1c\xb1\xbc\x40\xac\xaf\xbd\x86\x4f\x5f\x5f\x6a\x57\x0b\x09\x0e\x9b\x6b\x12\x48\x82\x32\xfe\x68\xc3\x97\x62\xc5\x87\xd4\xd2\xdb\x69\xd6\xd6\xb2\x79\x91\x21\xdd\x8c\x02\xcc\x5b\x03\xd0\x66\x8b\x8a\xc8\x9a\xe6\xde\x2b\xa8\xbc\xb9\xd0\x3a\xf5\xc7\xa1\xf5\xa8\x62\xd2\xec\xe1\x0c\x12\x11\x97\x5d\xac\x49\x27\x23\xdf\x34\x5d\x8e\xc8\x64\x7a\x35\x8a\x6d\x22\x1e\x55\x83\x29\x2c\x49\x18\xe9\x8f\x6a\x6d\xb5\x9c\x8d\xaa\x49\x7b\x70\xa8\xa4\x2f\x97\x18\x53\x9c\x8f\x53\x45\xc5\x62\xea\x41\x1a\xce\xf3\x2a\x01\x24\x98\xdc\xde\xb8\xe9\x52\x0f\x6a\x43\x17\x34\x7d\x68\x18\x52\x8e\x94\0\xb4\x99\xcd\0\x28\xeb\x47\xe3\x48\x02\x92\x80\x0e\xd4\x7d\x69\x80\x51\xda\x90\x01\x3e\xf4\x94\xc0\x28\xcd\x20\x12\x94\x74\xe6\x80\x0a\x3a\x50\x02\x1a\x28\x18\x76\xa4\x38\xc5\0\x07\x9a\x43\x4c\x42\x52\x13\xc5\x03\x0f\xc2\x90\xf1\x40\x05\x21\xa0\x02\x92\x80\x0a\x28\0\xfa\xd2\x50\x02\x52\x66\x80\x03\x48\x7a\x50\x02\x52\x50\x21\x29\xa6\x80\x0a\x4a\0\x4a\x43\x40\x12\x76\xa2\xa8\x42\xd1\x40\x0b\xed\x45\x20\x17\x22\x97\xa9\xa0\x05\x14\x50\0\x29\xc7\xd2\x80\x13\x14\xa2\x80\x16\x94\x7b\x50\x02\xd0\x0d\x03\x16\x96\x90\x80\x7d\x69\x73\xcd\0\x28\xa3\x34\x0c\x3a\xd2\x8a\x04\x14\x50\x31\x69\x33\x40\x0b\xde\x8f\xa5\0\x2f\xb5\x26\x45\0\x2e\x68\xa4\x01\x9a\x33\x9a\0\x4e\xd4\x53\0\xcd\x14\x80\x3b\x52\x74\xa0\x02\x8a\0\x28\x34\0\x03\x47\xd6\x81\x81\xa4\xa0\x41\x9a\x4a\x63\x0a\x42\x69\0\x77\xa4\xa6\x01\x49\xc5\0\x19\xa4\x34\0\x7d\x29\x28\0\xe8\x28\xa0\x04\xe7\xd6\x8a\0\x42\x45\x26\x7d\x68\x01\x09\xa4\xcf\xbd\0\x21\xa4\xe9\x40\x05\x27\x6a\x04\x27\x7a\x0d\0\x37\xe9\x45\x30\x1d\xda\x8a\x62\x14\xd2\xd0\x01\x4b\x48\0\x52\xf4\xa0\x05\xa5\xa0\0\x51\x40\x0a\x05\x2d\0\x28\xa5\x14\x0c\x29\x45\x02\x16\x96\x90\0\xa5\xa0\x04\xcd\x2f\x5a\x06\x2f\x14\xbd\xa8\0\xef\x41\xc5\0\x14\x50\0\x0d\x28\xa0\x02\x8a\0\x3b\xd1\x9a\0\x28\xa0\x02\x8c\xf6\xa4\x01\x49\x40\x07\x6a\x0f\x4a\0\x0f\x5a\x29\x80\x52\x0a\x40\x2d\x26\x69\x80\x13\x49\x9e\x69\x0c\x28\xc5\0\x21\xeb\x49\x4c\x03\x38\xa3\x39\xa0\x04\xa4\x34\0\x51\x8a\0\x29\x28\0\xa4\x34\0\x52\x50\x02\x52\x1e\x94\0\x86\x93\xf0\xa0\x41\x49\x40\x01\xa6\xe7\x8a\0\x3b\x52\x1e\x94\0\x94\x94\0\xff\0\xc6\x94\x55\x08\x29\x68\0\xa5\x14\0\xa2\x96\x90\0\xf6\xa5\x14\0\xa3\x8a\x0f\x4a\0\x05\x2d\0\x28\xa3\xbd\x03\x17\xbd\x2d\0\x2f\x5a\x3a\x52\0\xf6\xa0\x50\x02\xd2\x8a\0\x51\xcd\x14\0\x99\xa0\x7e\xb4\0\xb4\x50\x01\x4b\x40\x06\x68\xcd\0\x1f\x4a\x28\0\xa0\xd0\x01\x49\x40\x0b\x9e\x29\x3b\x74\xa0\x02\x8e\xbd\x68\0\x14\x1e\x69\0\x7d\x29\x29\x80\x51\x48\x04\xcd\x14\x0c\x0d\x29\x34\xc0\x4a\x42\x7f\x3a\x40\x27\x7a\x29\x80\x76\xa4\xfa\x50\x01\x46\x68\x01\x3b\xd1\xf4\xa4\x02\x51\x9a\x60\x21\xe9\x46\x68\x01\xa4\xd2\x1a\x04\x25\x14\0\x1a\x69\x34\0\x76\xa4\xa0\x04\xa4\xa0\x04\xc7\x34\x1a\0\x7d\x2d\x50\x83\xeb\x40\xe9\x40\x0a\x29\x45\0\x2d\x2d\x20\x01\xd3\x34\xb4\0\xa0\xd0\x4d\0\x02\x96\x80\x0e\x94\xa2\x80\x01\x4e\x14\x0c\x5a\x33\xcd\x20\x13\x34\xa2\x80\x17\x14\xb4\0\x66\x8a\x04\x14\x50\x31\x41\xa3\x34\0\x51\xd2\x80\x0c\x8c\x51\x9e\x68\0\xfa\x52\xd0\x02\x77\xa3\x34\0\x51\x40\x05\x06\x80\x13\x34\x67\x34\0\x51\x40\x01\xa3\xbd\0\x25\x14\0\x1a\x4c\xd0\x30\xa5\xcd\0\x27\x7a\x43\xcd\x02\x0a\x4c\xfa\x50\x01\x49\x40\xc5\xf5\xa6\xf6\xa0\x05\xfa\x52\x62\x80\x13\x34\x50\x21\x0d\x25\x03\x02\x79\xa6\xe6\x81\x05\x25\0\x14\x94\0\x9f\x4a\x28\x01\x33\x49\x4c\x02\x92\x80\x1f\x45\x31\x0b\xd2\x96\x80\x0a\x51\x40\x07\x7a\x5a\0\x5e\xd4\xa2\x90\x05\x21\xa0\x05\x14\xbf\x4a\0\x05\x3a\x81\x87\x14\xb4\0\xb8\xa3\xf1\xa4\x02\x8a\x29\x80\xbd\x68\xdd\x48\x41\xd2\x82\x68\x18\x66\x81\x40\x0b\x46\x79\xa0\x02\x8a\0\x33\x45\0\x1f\x85\x2d\0\x25\x14\0\x51\x40\x0b\x41\xe2\x80\x12\x92\x80\x01\x4b\xde\x80\x13\x3c\xd1\x9a\0\x29\x28\0\xa3\xa5\0\x14\x99\xfa\xd0\x30\x34\x94\0\x52\x7d\x68\0\xa3\x34\0\x12\x69\x33\x40\0\xa4\xcd\0\x1e\x94\x66\x80\x1a\x69\x09\xa0\x42\x13\x49\x9a\x60\x06\x93\xb5\x20\x0c\xfa\xd2\x50\x02\x66\x8f\xe5\x4c\x04\xa3\xbd\x20\x10\x9a\x4a\x60\x3e\x96\x98\x82\x9c\x28\0\xa5\xa0\x05\x1c\x51\x48\x05\x07\xda\x8e\xf4\0\x51\x40\x0b\xf5\xa5\x1d\x28\x18\xa2\x8a\0\x51\x4b\x9a\0\x29\x45\x21\x0b\x46\x28\x18\x76\xc5\x03\x14\0\x1f\xad\x14\0\x77\xa0\x1a\0\x5c\xd1\xd2\x80\x12\x96\x80\x0a\x3b\xf3\x40\x05\x2f\x6a\0\x29\x0f\xa5\0\x2f\x7a\x28\x01\x33\x41\x38\xa0\x03\xb5\x1c\xd0\x01\xda\x8c\xfa\xd0\x02\x74\xa3\xb5\0\x19\xa2\x80\x10\x9a\x28\0\xef\x49\x9a\x06\x1d\x68\xa0\x02\x92\x80\x0a\x42\x79\xa0\x02\x8c\x8a\0\x4f\x7a\x4c\xd0\x01\xd2\x92\x81\x01\xeb\x4d\x34\0\x94\x9d\x28\x01\x73\x48\x68\x01\xa4\xd1\x40\x05\x25\0\x14\x9f\x4a\x60\x25\x14\x01\x25\x14\xc4\x14\xa0\x8a\0\x5e\xf4\xa2\x80\x0c\xe2\x80\x79\xa4\x03\x87\xb5\x25\0\x19\xa5\xcd\0\x14\xe1\x40\x0b\x45\x03\x17\x34\xb4\0\x52\xe7\x23\x14\0\x1a\x4a\x40\x2e\x68\xfa\x53\x01\x7a\x50\x38\xa4\x01\x49\xd2\x80\x17\x3e\x94\x66\x80\x0a\x28\0\x1c\x51\x9a\0\x5a\x28\0\xa2\x80\x0e\xf4\x03\xef\x40\x06\x69\x0d\0\x14\x12\x7a\x50\x02\xd2\x1a\0\x4c\xd1\x9f\x5a\0\x4f\xad\x14\0\x51\x9e\x68\0\xcd\x25\x03\x0a\x43\xd6\x80\x17\x3e\xb4\x50\x02\x13\xe9\x47\xb5\0\x21\xa4\x34\0\x1a\x4a\0\x3e\x94\x9d\xe8\x01\x33\x48\x4d\x02\x10\x9a\x4a\0\x5e\x82\x92\x98\x09\xf4\xa2\x90\x09\x9a\x29\x80\x94\x99\xa0\x03\x34\x99\xa0\x09\x29\x7b\x53\x10\x52\x8a\0\x5a\x28\x01\x41\xa0\x50\x02\xe7\xd2\x8c\xd2\0\x14\xb4\0\x0a\x51\x40\x0a\x39\xa5\xa0\x05\x14\x74\xa0\x61\x4b\x40\x05\x14\0\x74\xa2\x80\x0c\xf3\x46\x68\x01\x69\x29\0\xb4\x74\xa0\x02\x96\x80\x10\x9e\x3d\xe8\xa0\x05\xa3\x34\0\x0e\x7b\xd1\xd2\x80\x0a\x39\xa0\x03\xa5\x14\0\x84\xfe\x34\x66\x80\x03\xde\x93\x39\xa0\x02\x8e\xb4\0\x1f\xca\x82\x7d\x28\x01\x33\xef\x41\xe2\x80\x13\x34\x13\xd2\x80\x17\xeb\x49\x9f\x6a\0\x29\x28\x18\x52\x7d\x68\0\xa0\xd0\x02\x52\x50\x01\x9a\x4a\x04\x21\x34\x84\xd3\x01\x38\xa3\x34\0\x66\x9b\x9f\x4a\0\x29\x28\0\x3c\x51\x9a\0\x43\xd3\x9a\x05\0\x26\x68\xcd\0\x49\x40\xa6\x21\x69\x45\0\x14\xa2\x80\x03\x4b\x48\x03\x34\xb4\0\x50\x28\x01\xd4\x50\x02\xd1\x9a\0\x51\xd2\x94\x50\x02\xfd\x28\x34\x0c\x4a\x5c\x50\x01\xd2\x8c\xe6\x80\x0a\x3b\x52\0\x14\x76\xa6\0\x68\xa0\x05\xa3\xf1\xa4\0\x05\x19\xa0\x02\x8a\0\x5c\xd1\x9a\0\x4a\x33\x40\x05\x1d\xa8\x01\x33\x45\0\x06\x93\xbd\0\x04\xd1\x9e\x68\0\xcd\x26\x7d\x28\x18\x51\x40\x06\x69\x28\x10\x13\x45\0\x06\x92\x80\x03\xfe\x4d\x1f\x4a\0\x4c\xf1\x8a\x43\x40\x06\x69\x09\xa0\x02\x9a\x7a\x50\x01\xda\x90\xd0\x02\x51\x40\x06\x69\x3b\x53\x01\x0f\x5a\x28\x01\x0d\x19\xa0\x04\xcd\x14\0\x84\xd0\x4d\0\x4b\x40\xa6\x21\x68\xa0\0\x52\x8a\0\x5a\x28\x01\x69\x7a\x76\xa0\0\x50\x29\0\xbf\xca\x8a\0\x53\x4a\x3a\x50\x31\x47\xbd\x2d\0\x04\xd2\xe6\x80\x13\x8a\x5a\0\x3a\x52\x66\x80\x0a\x33\x40\0\xa5\xfa\x50\x01\xdf\x9a\x3b\xd0\x01\x45\0\x2d\x1c\x52\x01\x28\xa0\x05\xa2\x80\x13\xd6\x8a\0\x28\xa0\x04\x34\x50\0\x4d\x19\xe2\x80\x0e\x82\x92\x80\x17\x34\x99\xa0\x03\x34\x9d\xe8\0\x3d\x28\xcd\x03\x0a\x28\x10\x1f\x5a\x4c\xd0\x01\x9a\x4e\xd4\0\x99\xa4\xa0\0\xd1\x9a\0\x43\x48\x69\x80\x99\xa3\xbd\0\x25\x26\x28\0\x34\x7a\x50\x03\x68\xed\x40\x07\x7a\x43\x40\x09\x45\0\x25\x21\xcd\x02\x26\xcd\x2e\x69\x80\xb4\x0a\0\x29\x47\xb5\0\x14\x7d\x68\x01\xd4\x76\xa0\x05\xed\x45\x20\x0a\x5c\xd0\0\x0d\0\xe6\x81\x8e\x14\xb4\0\x0e\xb9\xa5\xa0\x03\x34\x7d\x68\0\x3c\xd2\x50\x01\x93\xeb\x45\0\x28\xa3\xeb\x40\x07\x4e\xb4\x66\x80\x0a\x3a\x50\x02\xe6\x8c\xfa\x50\x01\x49\x40\x05\x2d\0\x20\x34\xbe\xf4\x80\x42\x68\xcd\x30\x0c\xfa\x52\x77\xa0\x03\xbd\x26\x69\0\x0a\x33\x4c\x03\x34\x94\x80\x09\xa2\x98\x06\x68\xcd\0\x1d\xe8\xcd\x20\x12\x83\x40\x05\x21\x34\0\x86\x92\x98\x05\x25\0\x25\x1f\x5a\0\x43\x45\0\x25\x26\x68\0\xcd\x25\0\x14\x94\0\x52\x67\x8a\0\x4c\xd2\x66\x81\x01\xa4\xed\x40\x13\xd1\xd6\x98\x0b\xde\x96\x80\x12\x96\x80\x0c\xe2\x97\x39\xa0\x05\xce\x28\xdd\x48\x05\xcf\x6a\x33\x40\x06\x7a\xd2\xd0\0\x3a\xd2\xd0\x03\xb3\x40\xa0\x03\x34\xe1\xef\x40\xc0\x51\x40\x84\x34\x86\x81\x8b\x49\x9a\0\x5a\x5e\x94\0\x7d\x69\x3e\x94\x80\x29\x7b\xd3\x01\x29\x71\x48\x04\xa2\x98\x0a\x0d\x14\x80\x33\x9a\x28\x01\x28\xa0\x04\xcd\x14\0\x77\xa3\xeb\x40\x06\x68\x26\x80\x13\xb5\x14\0\x52\x53\0\xa2\x90\x07\x6c\x51\x9a\0\x29\x33\x40\x05\x26\x69\x80\x80\xf3\x48\x4d\0\x14\x99\xa0\x04\xcd\x14\0\x86\x8a\0\x0d\x26\x79\xa0\x04\xa3\x3c\x50\0\x3a\xd2\x50\x20\x27\x34\xda\0\x4a\x28\x01\x01\xa4\xcd\0\x54\xff\0\x84\x83\x4c\xff\0\x9f\xaf\xfc\x86\xdf\xe1\x47\xfc\x24\x1a\x5f\xfc\xfd\x7f\xe4\x36\xff\0\x0a\xbe\x46\x47\x3a\x17\xfe\x12\x1d\x2f\xfe\x7e\xbf\xf2\x1b\x7f\x85\x1f\xf0\x90\xe9\x7f\xf3\xf5\xff\0\x90\xdb\xfc\x29\xf2\x48\x39\xd0\x7f\xc2\x41\xa5\xff\0\xcf\xd7\xfe\x43\x6f\xf0\xa3\xfe\x12\x1d\x2f\x3f\xf1\xf5\xff\0\x90\xdb\xfc\x28\xe4\x90\x73\xa1\x7f\xe1\x21\xd2\xff\0\xe7\xeb\xff\0\x21\xb7\xf8\x50\x7c\x43\xa5\xff\0\xcf\xcf\xfe\x43\x6f\xf0\xa5\xc9\x20\xe7\x41\xff\0\x09\x0e\x97\xff\0\x3f\x5f\xf9\x0d\xff\0\xc2\x81\xe2\x1d\x2f\xfe\x7e\xbf\xf2\x1b\x7f\x85\x1c\x92\x0e\x78\x8b\xff\0\x09\x16\x95\xff\0\x3f\x5f\xf9\x0d\xbf\xc2\x8f\xf8\x48\xb4\xbf\xf9\xfa\xff\0\xc8\x6d\xfe\x14\x72\x48\x39\xe2\x03\xc4\x5a\x57\xfc\xfd\x7f\xe4\x37\xff\0\x0a\x5f\xf8\x48\xf4\xaf\xf9\xfa\xff\0\xc8\x6f\xfe\x14\x72\x48\x39\xd0\x0f\x11\x69\x5f\xf3\xf5\xff\0\x90\xdf\xfc\x29\x7f\xe1\x23\xd2\xbf\xe7\xeb\xff\0\x21\xbf\xf8\x51\xc9\x20\xe7\x42\x8f\x11\xe9\x3f\xf3\xf5\xff\0\x90\xdf\xfc\x28\xff\0\x84\x93\x49\xff\0\x9f\xaf\xfc\x86\xff\0\xe1\x47\x24\x87\xcf\x10\xff\0\x84\x93\x4a\xff\0\x9f\xbf\xfc\x86\xff\0\xe1\x4b\xff\0\x09\x26\x93\xff\0\x3f\x5f\xf9\x0d\xff\0\xc2\x8e\x49\x07\x3c\x43\xfe\x12\x5d\x27\xbd\xd7\xfe\x43\x7f\xf0\xa5\xff\0\x84\x93\x48\xff\0\x9f\xbf\xfc\x86\xff\0\xe1\x47\x24\x83\x9e\x21\xff\0\x09\x26\x93\xff\0\x3f\x7f\xf9\x0d\xff\0\xc2\x93\xfe\x12\x4d\x27\xfe\x7e\xff\0\xf2\x1b\xff\0\x85\x1c\x92\x0e\x78\x87\xfc\x24\x9a\x4e\x3f\xe3\xef\xff\0\x21\xbf\xf8\x51\xff\0\x09\x26\x92\x7f\xe5\xef\xff\0\x21\xbf\xf8\x51\xc9\x20\xe7\x88\x0f\x12\x69\x3f\xf3\xf7\xff\0\x90\xdf\xfc\x29\x7f\xe1\x24\xd2\x7f\xe7\xef\xff\0\x21\xbf\xf8\x51\xc9\x20\xe7\x88\x7f\xc2\x49\xa4\xff\0\xcf\xdf\xfe\x43\x7f\xf0\xa3\xfe\x12\x5d\x27\xfe\x7e\xff\0\xf2\x1b\xff\0\x85\x1c\x92\xec\x1c\xf1\x0f\xf8\x49\x34\x9f\xf9\xfb\xff\0\xc8\x6f\xfe\x14\x7f\xc2\x49\xa4\xff\0\xcf\xdf\xfe\x43\x7f\xf0\xa3\x92\x41\xcf\x10\xff\0\x84\x93\x49\xff\0\x9f\xbf\xfc\x86\xff\0\xe1\x47\xfc\x24\x9a\x4f\xfc\xfd\xff\0\xe4\x37\xff\0\x0a\x5c\x92\x0e\x78\x89\xff\0\x09\x26\x93\xff\0\x3f\x7f\xf9\x0d\xff\0\xc2\x8f\xf8\x49\x34\x9c\xff\0\xc7\xdf\xfe\x43\x7f\xf0\xa7\xc9\x20\xe7\x88\xbf\xf0\x92\xe9\x3f\xf3\xf7\xff\0\x90\xdf\xfc\x28\xff\0\x84\x97\x49\xff\0\x9f\xaf\xfc\x86\xff\0\xe1\x4b\x92\x41\xcf\x10\xff\0\x84\x97\x49\xed\x77\xff\0\x90\xdf\xfc\x29\x3f\xe1\x24\xd2\x7f\xe7\xef\xff\0\x21\xbf\xf8\x51\xc9\x20\xe7\x88\x7f\xc2\x49\xa4\xff\0\xcf\xdf\xfe\x43\x7f\xf0\xa3\xfe\x12\x4d\x27\xfe\x7e\xff\0\xf2\x1b\xff\0\x85\x1c\x92\xec\x1c\xf1\x0f\xf8\x49\x34\x9f\xf9\xfb\xff\0\xc8\x6f\xfe\x14\x7f\xc2\x49\xa4\xff\0\xcf\xd7\xfe\x43\x7f\xf0\xa3\x92\x41\xcf\x11\x3f\xe1\x24\xd2\xb3\xff\0\x1f\x7c\x7f\xd7\x37\xff\0\x0a\x5f\xf8\x49\x34\x91\xd2\xef\xff\0\x21\xbf\xf8\x51\xc9\x20\xe7\x88\x87\xc4\x7a\x4f\xfc\xfd\xff\0\xe4\x37\xff\0\x0a\x0f\x88\xf4\xaf\xf9\xfb\xff\0\xc8\x6f\xfe\x14\x72\x48\x39\xe2\x1f\xf0\x91\xe9\x3f\xf3\xf7\xff\0\x90\xdf\xfc\x28\xff\0\x84\x8f\x49\xff\0\x9f\xbf\xfc\x86\xff\0\xe1\x4f\x92\x41\xcf\x11\x3f\xe1\x23\xd2\xbf\xe7\xef\xff\0\x21\xbf\xf8\x51\xff\0\x09\x1e\x95\xff\0\x3f\x5f\xf9\x0d\xff\0\xc2\x8e\x49\x07\x3c\x43\xfe\x12\x3d\x2b\xfe\x7e\xff\0\xf2\x1b\xff\0\x85\x07\xc4\x7a\x57\xfc\xfd\x7f\xe4\x37\xff\0\x0a\x5c\x92\xec\x1c\xf1\x0f\xf8\x48\xb4\x9f\xf9\xfb\xff\0\xc8\x6f\xfe\x14\x1f\x11\xe9\x5f\xf3\xf5\xff\0\x90\xdf\xfc\x28\xe4\x90\x73\xc4\x3f\xe1\x23\xd2\xbf\xe7\xeb\xff\0\x21\xb7\xf8\x51\xff\0\x09\x1e\x95\xff\0\x3f\x5f\xf9\x0d\xff\0\xc2\x8e\x49\x07\x3c\x44\xff\0\x84\x8b\x4a\xc7\xfc\x7d\x7f\xe4\x37\xff\0\x0a\x43\xe2\x2d\x2b\xfe\x7e\xbf\xf2\x1b\x7f\x85\x3e\x49\x07\x3c\x43\xfe\x12\x2d\x2f\xfe\x7e\xbf\xf2\x1b\xff\0\x85\x27\xfc\x24\x3a\x57\xfc\xfd\x7f\xe4\x37\xff\0\x0a\x39\x24\x1c\xf1\x0f\xf8\x48\x74\xbf\xf9\xfa\xff\0\xc8\x6d\xfe\x14\x7f\xc2\x43\xa5\xff\0\xcf\xd7\xfe\x43\x6f\xf0\xa3\x92\x41\xcf\x11\x3f\xe1\x21\xd2\xff\0\xe7\xeb\xff\0\x21\xb7\xf8\x51\xff\0\x09\x0e\x97\xff\0\x3f\x5f\xf9\x0d\xbf\xc2\x8e\x49\x07\x3c\x44\x3e\x20\xd2\xfb\x5d\x7f\xe4\x36\xff\0\x0a\x3f\xe1\x20\xd3\x3f\xe7\xeb\xff\0\x21\xb7\xf8\x51\xc9\x2e\xc1\xce\x83\xfb\x7f\x4b\xff\0\x9f\xaf\xfc\x86\xdf\xe1\x49\xff\0\x09\x06\x99\xff\0\x3f\x3f\xf9\x0d\xbf\xc2\x8e\x49\x76\x0e\x78\x87\xfc\x24\x1a\x67\xfc\xfc\xff\0\xe4\x36\xff\0\x0a\x4f\xed\xfd\x33\xfe\x7e\x7f\xf2\x1b\x7f\x85\x1c\x92\x0e\x74\x1f\xdb\xfa\x67\xfc\xfc\xff\0\xe4\x36\xff\0\x0a\x3f\xb7\xf4\xcc\x7f\xc7\xcf\xfe\x43\x6f\xf0\xa3\x92\x41\xce\x84\xfe\xde\xd3\x3f\xe7\xe7\xff\0\x21\xb7\xf8\x52\x1d\x7b\x4d\xcf\xfc\x7c\xff\0\xe4\x36\xff\0\x0a\x39\x24\x1c\xe8\x0e\xbd\xa6\xff\0\xcf\xcf\xfe\x38\xdf\xe1\x49\xfd\xbb\xa6\xff\0\xcf\xcf\xfe\x38\xdf\xe1\x47\x24\x85\xce\x83\xfb\x77\x4d\xff\0\x9f\x8f\xfc\x71\xbf\xc2\x93\xfb\x77\x4e\xff\0\x9f\x9f\xfc\x71\xbf\xc2\x8e\x49\x07\x3a\x38\xda\x2b\xa0\xc0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x02\x8a\0\x28\xa0\x0f\xff\xd9\x9f\xbf\xfc\x86\xff\0\xe1\x47\xfc\x24\x9a\x4f\xfc\xfd\xff\0\xe4\x37\xff\0\x0a\x5c\x92\x0e\x78\x89\xff\0\x09\x26\x93\xff\0\x3f\x7f\xf9\x0d\xff\0\xc2\x8f\xf8\x49\x34\x9c\xff\0\xc7\xdf\xfe\x43\x7f\xf0\xa7\xc9\x20\xe7\x88\xbf\xf0\x92\xe9\x3f\xf3\xf7\xff\0\x90\xdf\xfc\x28\xff\0\x84\x97\x49\xff\0\x9f\xaf\xfc\x86\xff\0\xe1\x4b\x92\x41\xcf\x10\xff\0\x84\x97\x49\xed\x77\xff\0\x90\xdf\xfc\x29\x3f\xe1\x24\xd2\x7f\xe7\xef\xff\0\x21\xbf\xf8\x51\xc9\x20\xe7\x88\x7f\xc2\x49\xa4\xff\0\xcf\xdf\xfe\x43\x7f\xf0\xa3\xfe\x12\x4d\x27\xfe\x7e\xff\0\xf2\x1b\xff\0\x85\x1c\x92\xec\x1c\xf1\x0f\xf8\x49\x34\x9f\xf9\xfb\xff\0\xc8\x6f\xfe\x14\x7f\xc2\x49\xa4\xff\0\xcf\xd7\xfe\x43\x7f\xf0\xa3\x92\x41\xcf\x11\x3f\xe1\x24\xd2\xb3\xff\0\x1f\x7c\x7f\xd7\x37\xff\0\x0a\x5f\xf8\x49\x34\x91\xd2\xef\xff\0\x21\xbf\xf8\x51\xc9\x20\xe7\x88\x87\xc4\x7a\x4f\xfc\xfd\xff\0\xe4\x37\xff\0\x0a\x0f\x88\xf4\xaf\xf9\xfb\xff\0\xc8\x6f\xfe\x14\x72\x48\x39\xe2\x1f\xf0\x91\xe9\x3f\xf3\xf7\xff\0\x90\xdf\xfc\x28\xff\0\x84\x8f\x49\xff\0\x9f\xbf\xfc\x86\xff\0\xe1\x4f\x92\x41\xcf\x11\x3f\xe1\x23\xd2\xbf\xe7\xef\xff\0\x21\xbf\xf8\x51\xff\0\x09\x1e\x95\xff\0\x3f\x5f\xf9\x0d\xff\0\xc2\x8e\x49\x07\x3c\x43\xfe\x12\x3d\x2b\xfe\x7e\xff\0\xf2\x1b\xff\0\x85\x07\xc4\x7a\x57\xfc\xfd\x7f\xe4\x37\xff\0\x0a\x5c\x92\xec\x1c\xf1\x0f\xf8\x48\xb4\x9f\xf9\xfb\xff\0\xc8\x6f\xfe\x14\x1f\x11\xe9\x5f\xf3\xf5\xff\0\x90\xdf\xfc\x28\xe4\x90\x73\xc4\x3f\xe1\x23\xd2\xbf\xe7\xeb\xff\0\x21\xb7\xf8\x51\xff\0\x09\x1e\x95\xff\0\x3f\x5f\xf9\x0d\xff\0\xc2\x8e\x49\x07\x3c\x44\xff\0\x84\x8b\x4a\xc7\xfc\x7d\x7f\xe4\x37\xff\0\x0a\x43\xe2\x2d\x2b\xfe\x7e\xbf\xf2\x1b\x7f\x85\x3e\x49\x07\x3c\x43\xfe\x12\x2d\x2f\xfe\x7e\xbf\xf2\x1b\xff\0\x85\x27\xfc\x24\x3a\x57\xfc\xfd\x7f\xe4\x37\xff\0\x0a\x39\x24\x1c\xf1\x0f\xf8\x48\x74\xbf\xf9\xfa\xff\0\xc8\x6d\xfe\x14\x7f\xc2\x43\xa5\xff\0\xcf\xd7\xfe\x43\x6f\xf0\xa3\x92\x41\xcf\x11\x3f\xe1\x21\xd2\xff\0\xe7\xeb\xff\0\x21\xb7\xf8\x51\xff\0\x09\x0e\x97\xff\0\x3f\x5f\xf9\x80\x0a\x28\0\xa2\x80\x0a\x28\0\xa2\x80\x0a\x28\0\xa2\x80\x0a\x28\0\xa2\x80\x0a\x28\0\xa2\x80\x0a\x28\0\xa2\x80\x0a\x28\0\xa2\x80\x0a\x28\0\xa2\x80\x0a\x28\0\xa2\x80\x0a\x28\0\xa2\x80\x0a\x28\0\xa2\x80\x0a\x28\0\xa2\x80\x0a\x28\0\xa2\x80\x0a\x28\0\xa2\x80\x0a\x28\0\xa2\x80\x0a\x28\0\xa2\x80\x0a\x28\0\xa2\x80\x3f\xff\xd9\xff\xfc\x28\xe4\x90\x73\xc4\x3f\xe1\x25\xd2\x7f\xe7\xef\xff\0\x21\xbf\xf8\x51\xff\0\x09\x2e\x93\xff\0\x3f\x7f\xf9\x0d\xff\0\xc2\x9f\x24\xbb\x07\x3c\x43\xfe\x12\x5d\x27\xfe\x7e\xff\0\xf2\x1b\xff\0\x85\x1f\xf0\x92\x69\x19\xff\0\x8f\xbf\xfc\x86\xff\0\xe1\x4b\x92\x41\xcf\x11\x7f\xe1\x25\xd2\x3f\xe7\xef\xff\0\x21\xbf\xf8\x51\xff\0\x09\x2e\x93\xff\0\x3f\x7f\xf9\x0d\xff\0\xc2\x8e\x49\x07\x3c\x43\xfe\x12\x5d\x23\xfe\x7e\xff\0\xf2\x1b\xff\0\x85\x27\xfc\x24\xba\x47\xfc\xfd\xff\0\xe4\x37\xff\0\x0a\x3d\x9c\x83\x9e\x21\xff\0\x09\x2e\x93\xff\0\x3f\x7f\xf9\x0d\xff\0\xc2\x8f\xf8\x49\x74\x9f\xf9\xfb\xff\0\xc8\x6f\xfe\x14\x72\x4b\xb0\x73\xc4\x3f\xe1\x24\xd2\x7f\xe7\xef\xff\0\x21\xbf\xf8\x52\x1f\x12\xe9\x3f\xf3\xf7\xff\0\x90\xdf\xfc\x28\xe4\x90\x73\xc4\x3f\xe1\x24\xd2\x7f\xe7\xef\xff\0\x21\xbf\xf8\x51\xff\0\x09\x26\x93\xff\0\x3f\x7f\xf9\x0d\xff\0\xc2\x8e\x49\x07\x3c\x43\xfe\x12\x4d\x27\xfe\x7e\xff\0\xf2\x1b\xff\0\x85\x27\xfc\x24\x7a\x4e\x3f\xe3\xef\xff\0\x21\xbf\xf8\x51\xc9\x20\xe7\x88\x7f\xc2\x49\xa4\xe3\xfe\x3e\xff\0\xf2\x1b\xff\0\x85\x2f\xfc\x24\x9a\x4f\xfc\xfd\x7f\xe4\x37\xff\0\x0a\x39\x24\x1c\xf1\x13\xfe\x12\x3d\x27\xfe\x7e\xff\0\xf2\x1b\xff\0\x85\x1f\xf0\x92\x69\x3f\xf3\xf7\xff\0\x90\xdf\xfc\x28\xe4\x90\x73\xc4\x3f\xe1\x23\xd2\x7f\xe7\xef\xff\0\x21\xbf\xf8\x52\x1f\x11\xe9\x27\xad\xdf\xfe\x43\x7f\xf0\xa3\x92\x41\xcf\x11\x7f\xe1\x23\xd2\x7f\xe7\xeb\xff\0\x21\xbf\xf8\x52\x7f\xc2\x47\xa5\x7f\xcf\xd7\xfe\x43\x7f\xf0\xa7\xc9\x20\xe7\x88\x7f\xc2\x47\xa5\x7f\xcf\xd7\xfe\x43\x7f\xf0\xa4\x3e\x22\xd2\xbf\xe7\xeb\xff\0\x21\xb7\xf8\x51\xc9\x20\xe7\x88\x7f\xc2\x45\xa5\x76\xba\xff\0\xc8\x6d\xfe\x14\x9f\xf0\x91\x69\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff";
254
- $this->assertEquals($entry->getValue(), $expected);
255
- $this->assertEquals($entry->getText(), '55296 bytes unknown MakerNote data');
256
-
257
- $entry = $ifd0_0->getEntry(40960); // FlashPixVersion
258
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
259
- $this->assertEquals($entry->getValue(), 1);
260
- $this->assertEquals($entry->getText(), 'FlashPix Version 1.0');
261
-
262
- $entry = $ifd0_0->getEntry(40961); // ColorSpace
263
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
264
- $this->assertEquals($entry->getValue(), 65535);
265
- $this->assertEquals($entry->getText(), 'Uncalibrated');
266
-
267
- $entry = $ifd0_0->getEntry(40962); // PixelXDimension
268
- $this->assertInstanceOf('lsolesen\pel\PelEntryLong', $entry);
269
- $this->assertEquals($entry->getValue(), 1536);
270
- $this->assertEquals($entry->getText(), '1536');
271
-
272
- $entry = $ifd0_0->getEntry(40963); // PixelYDimension
273
- $this->assertInstanceOf('lsolesen\pel\PelEntryLong', $entry);
274
- $this->assertEquals($entry->getValue(), 1024);
275
- $this->assertEquals($entry->getText(), '1024');
276
-
277
- $entry = $ifd0_0->getEntry(41495); // SensingMethod
278
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
279
- $this->assertEquals($entry->getValue(), 2);
280
- $this->assertEquals($entry->getText(), 'One-chip color area sensor');
281
-
282
- $entry = $ifd0_0->getEntry(41728); // FileSource
283
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
284
- $this->assertEquals($entry->getValue(), "\x03");
285
- $this->assertEquals($entry->getText(), 'DSC');
286
-
287
- $entry = $ifd0_0->getEntry(41729); // SceneType
288
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
289
- $this->assertEquals($entry->getValue(), "\x01");
290
- $this->assertEquals($entry->getText(), 'Directly photographed');
291
-
292
- $entry = $ifd0_0->getEntry(41985); // CustomRendered
293
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
294
- $this->assertEquals($entry->getValue(), 0);
295
- $this->assertEquals($entry->getText(), 'Normal process');
296
-
297
- $entry = $ifd0_0->getEntry(41986); // ExposureMode
298
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
299
- $this->assertEquals($entry->getValue(), 0);
300
- $this->assertEquals($entry->getText(), 'Auto exposure');
301
-
302
- $entry = $ifd0_0->getEntry(41987); // WhiteBalance
303
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
304
- $this->assertEquals($entry->getValue(), 1);
305
- $this->assertEquals($entry->getText(), 'Manual white balance');
306
-
307
- $entry = $ifd0_0->getEntry(41989); // FocalLengthIn35mmFilm
308
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
309
- $this->assertEquals($entry->getValue(), 67);
310
- $this->assertEquals($entry->getText(), '67');
311
-
312
- $entry = $ifd0_0->getEntry(41990); // SceneCaptureType
313
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
314
- $this->assertEquals($entry->getValue(), 0);
315
- $this->assertEquals($entry->getText(), 'Standard');
316
-
317
- $entry = $ifd0_0->getEntry(41992); // Contrast
318
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
319
- $this->assertEquals($entry->getValue(), 0);
320
- $this->assertEquals($entry->getText(), 'Normal');
321
-
322
- $entry = $ifd0_0->getEntry(41993); // Saturation
323
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
324
- $this->assertEquals($entry->getValue(), 0);
325
- $this->assertEquals($entry->getText(), 'Normal');
326
-
327
- $entry = $ifd0_0->getEntry(41994); // Sharpness
328
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
329
- $this->assertEquals($entry->getValue(), 0);
330
- $this->assertEquals($entry->getText(), 'Normal');
331
-
332
- $entry = $ifd0_0->getEntry(41996); // SubjectDistanceRange
333
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
334
- $this->assertEquals($entry->getValue(), 1);
335
- $this->assertEquals($entry->getText(), 'Macro');
336
-
337
- $entry = $ifd0_0->getEntry(42240); // Gamma
338
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
339
- $this->assertEquals($entry->getValue(), [
340
- 0 => 22,
341
- 1 => 10
342
- ]);
343
- $this->assertEquals($entry->getText(), '22/10');
344
-
345
- /* Sub IFDs of $ifd0_0. */
346
- $this->assertEquals(count($ifd0_0->getSubIfds()), 1);
347
- $ifd0_0_0 = $ifd0_0->getSubIfd(4); // IFD Interoperability
348
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_0_0);
349
-
350
- /* Start of IDF $ifd0_0_0. */
351
- $this->assertEquals(count($ifd0_0_0->getEntries()), 2);
352
-
353
- $entry = $ifd0_0_0->getEntry(1); // InteroperabilityIndex
354
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
355
- $this->assertEquals($entry->getValue(), 'R03');
356
- $this->assertEquals($entry->getText(), 'R03');
357
-
358
- $entry = $ifd0_0_0->getEntry(2); // InteroperabilityVersion
359
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
360
- $this->assertEquals($entry->getValue(), 1);
361
- $this->assertEquals($entry->getText(), 'Interoperability Version 1.0');
362
-
363
- /* Sub IFDs of $ifd0_0_0. */
364
- $this->assertEquals(count($ifd0_0_0->getSubIfds()), 0);
365
-
366
- $this->assertEquals($ifd0_0_0->getThumbnailData(), '');
367
-
368
- /* Next IFD. */
369
- $ifd0_0_1 = $ifd0_0_0->getNextIfd();
370
- $this->assertNull($ifd0_0_1);
371
- /* End of IFD $ifd0_0_0. */
372
-
373
- $this->assertEquals($ifd0_0->getThumbnailData(), '');
374
-
375
- /* Next IFD. */
376
- $ifd0_1 = $ifd0_0->getNextIfd();
377
- $this->assertNull($ifd0_1);
378
- /* End of IFD $ifd0_0. */
379
-
380
- $this->assertEquals($ifd0->getThumbnailData(), '');
381
-
382
- /* Next IFD. */
383
- $ifd1 = $ifd0->getNextIfd();
384
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd1);
385
- /* End of IFD $ifd0. */
386
-
387
- /* Start of IDF $ifd1. */
388
- $this->assertEquals(count($ifd1->getEntries()), 4);
389
-
390
- $entry = $ifd1->getEntry(259); // Compression
391
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
392
- $this->assertEquals($entry->getValue(), 6);
393
- $this->assertEquals($entry->getText(), 'JPEG compression');
394
-
395
- $entry = $ifd1->getEntry(282); // XResolution
396
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
397
- $this->assertEquals($entry->getValue(), [
398
- 0 => 72,
399
- 1 => 1
400
- ]);
401
- $this->assertEquals($entry->getText(), '72/1');
402
-
403
- $entry = $ifd1->getEntry(283); // YResolution
404
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
405
- $this->assertEquals($entry->getValue(), [
406
- 0 => 72,
407
- 1 => 1
408
- ]);
409
- $this->assertEquals($entry->getText(), '72/1');
410
-
411
- $entry = $ifd1->getEntry(296); // ResolutionUnit
412
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
413
- $this->assertEquals($entry->getValue(), 2);
414
- $this->assertEquals($entry->getText(), 'Inch');
415
-
416
- /* Sub IFDs of $ifd1. */
417
- $this->assertEquals(count($ifd1->getSubIfds()), 0);
418
-
419
- $thumb_data = file_get_contents(dirname(__FILE__) . '/pentax-istDS-thumb.jpg');
420
- $this->assertEquals($ifd1->getThumbnailData(), $thumb_data);
421
-
422
- /* Next IFD. */
423
- $ifd2 = $ifd1->getNextIfd();
424
- $this->assertNull($ifd2);
425
- /* End of IFD $ifd1. */
426
-
427
- $this->assertTrue(count(Pel::getExceptions()) == 0);
428
- }
429
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/README DELETED
@@ -1,61 +0,0 @@
1
- README file for PEL Test Images.
2
-
3
- Copyright (C) 2004, 2005, 2006 Martin Geisler.
4
- Licensed under the GNU GPL, see COPYING for details.
5
-
6
-
7
- PEL Test Images
8
- ***************
9
-
10
- The images contained in this directory are test images collected for
11
- use with PEL: PHP Exif Library. One can download PEL from:
12
-
13
- http://github.com/lsolesen/pel/
14
-
15
- All images except no-exif.jpg contain Exif information, and the
16
- corresponding PHP files contain SimpleTest (http://simpletest.sf.net/)
17
- unit tests.
18
-
19
- To use those files with PEL, first place this directory (the
20
- image-tests directory) under the test directory in an unpacked PEL
21
- source tree. Install SimpleTest using the instructions found in the
22
- README file in the test directory.
23
-
24
- Now run the run-tests.php script in the test directory. It should
25
- automatically pickup the new tests.
26
-
27
- The images can be used by anybody, but may only be redistributed under
28
- the GNU GPL. See the file COPYING for the details.
29
-
30
-
31
- Contributing Test Images
32
- ************************
33
-
34
- If you own a camera model from which there are no test image, then
35
- please contribute one. The image should
36
-
37
- * contain as much interesting Exif tags as possible. The camera
38
- should therefore be set to a manual mode, and the settings should be
39
- changed from their defaults,
40
-
41
- * have as small a file size as possible, so use a resolution of
42
- 640x480 or less, if possible. Also, use the poorest image quality
43
- (the best compression) to reduce the file size.
44
-
45
- * come from the camera unaltered. Do not resize the image using an
46
- image manipulation program, for then it is this program that will be
47
- tested, not the camera that took the image,
48
-
49
- * be of something which wont protest to be widely published on the
50
- net. Things like a flower, a mountain, or a cat springs to mind,
51
- whereas pictures from a private party are no good,
52
-
53
- * be licensed under the GNU GPL as the rest of PEL Test Images, so
54
- that it can be redistributed with it.
55
-
56
- Submit your test image(s) by forking the repository found at
57
-
58
- http://github.com/lsolesen/pel/
59
-
60
- All image contributers will be given full credit in the AUTHORS file
61
- distributed with PEL.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/SonyDscV1Test.php DELETED
@@ -1,369 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * PEL: PHP Exif Library. A library with support for reading and
5
- * writing all Exif headers in JPEG and TIFF images using PHP.
6
- *
7
- * Copyright (C) 2005, 2006 Martin Geisler.
8
- *
9
- * This program is free software; you can redistribute it and/or modify
10
- * it under the terms of the GNU General Public License as published by
11
- * the Free Software Foundation; either version 2 of the License, or
12
- * (at your option) any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- * GNU General Public License for more details.
18
- *
19
- * You should have received a copy of the GNU General Public License
20
- * along with this program in the file COPYING; if not, write to the
21
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
22
- * Boston, MA 02110-1301 USA
23
- */
24
-
25
- namespace Pel\Test\imagetests;
26
-
27
- use lsolesen\pel\Pel;
28
- use lsolesen\pel\PelJpeg;
29
- use PHPUnit\Framework\TestCase;
30
-
31
- class SonyDscV1Test extends TestCase
32
- {
33
- public function testRead()
34
- {
35
- Pel::clearExceptions();
36
- Pel::setStrictParsing(false);
37
- $jpeg = new PelJpeg(dirname(__FILE__) . '/sony-dsc-v1.jpg');
38
-
39
- $exif = $jpeg->getExif();
40
- $this->assertInstanceOf('lsolesen\pel\PelExif', $exif);
41
-
42
- $tiff = $exif->getTiff();
43
- $this->assertInstanceOf('lsolesen\pel\PelTiff', $tiff);
44
-
45
- /* The first IFD. */
46
- $ifd0 = $tiff->getIfd();
47
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0);
48
-
49
- /* Start of IDF $ifd0. */
50
- $this->assertEquals(count($ifd0->getEntries()), 10);
51
-
52
- $entry = $ifd0->getEntry(270); // ImageDescription
53
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
54
- $this->assertEquals($entry->getValue(), ' ');
55
- $this->assertEquals($entry->getText(), ' ');
56
-
57
- $entry = $ifd0->getEntry(271); // Make
58
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
59
- $this->assertEquals($entry->getValue(), 'SONY');
60
- $this->assertEquals($entry->getText(), 'SONY');
61
-
62
- $entry = $ifd0->getEntry(272); // Model
63
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
64
- $this->assertEquals($entry->getValue(), 'DSC-V1');
65
- $this->assertEquals($entry->getText(), 'DSC-V1');
66
-
67
- $entry = $ifd0->getEntry(274); // Orientation
68
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
69
- $this->assertEquals($entry->getValue(), 6);
70
- $this->assertEquals($entry->getText(), 'right - top');
71
-
72
- $entry = $ifd0->getEntry(282); // XResolution
73
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
74
- $this->assertEquals($entry->getValue(), [
75
- 0 => 72,
76
- 1 => 1
77
- ]);
78
- $this->assertEquals($entry->getText(), '72/1');
79
-
80
- $entry = $ifd0->getEntry(283); // YResolution
81
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
82
- $this->assertEquals($entry->getValue(), [
83
- 0 => 72,
84
- 1 => 1
85
- ]);
86
- $this->assertEquals($entry->getText(), '72/1');
87
-
88
- $entry = $ifd0->getEntry(296); // ResolutionUnit
89
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
90
- $this->assertEquals($entry->getValue(), 2);
91
- $this->assertEquals($entry->getText(), 'Inch');
92
-
93
- $entry = $ifd0->getEntry(306); // DateTime
94
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
95
- $this->assertEquals($entry->getValue(), 1089482993);
96
- $this->assertEquals($entry->getText(), '2004:07:10 18:09:53');
97
-
98
- $entry = $ifd0->getEntry(531); // YCbCrPositioning
99
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
100
- $this->assertEquals($entry->getValue(), 2);
101
- $this->assertEquals($entry->getText(), 'co-sited');
102
-
103
- $entry = $ifd0->getEntry(50341); // PrintIM
104
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
105
- $this->assertEquals($entry->getValue(), "\x50\x72\x69\x6e\x74\x49\x4d\0\x30\x32\x35\x30\0\0\x02\0\x02\0\x01\0\0\0\x01\x01\0\0\0\0");
106
- $this->assertEquals($entry->getText(), '(undefined)');
107
-
108
- /* Sub IFDs of $ifd0. */
109
- $this->assertEquals(count($ifd0->getSubIfds()), 1);
110
- $ifd0_0 = $ifd0->getSubIfd(2); // IFD Exif
111
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_0);
112
-
113
- /* Start of IDF $ifd0_0. */
114
- $this->assertEquals(count($ifd0_0->getEntries()), 26);
115
-
116
- $entry = $ifd0_0->getEntry(33434); // ExposureTime
117
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
118
- $this->assertEquals($entry->getValue(), [
119
- 0 => 10,
120
- 1 => 600
121
- ]);
122
- $this->assertEquals($entry->getText(), '1/60 sec.');
123
-
124
- $entry = $ifd0_0->getEntry(33437); // FNumber
125
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
126
- $this->assertEquals($entry->getValue(), [
127
- 0 => 32,
128
- 1 => 10
129
- ]);
130
- $this->assertEquals($entry->getText(), 'f/3.2');
131
-
132
- $entry = $ifd0_0->getEntry(34850); // ExposureProgram
133
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
134
- $this->assertEquals($entry->getValue(), 2);
135
- $this->assertEquals($entry->getText(), 'Normal program');
136
-
137
- $entry = $ifd0_0->getEntry(34855); // ISOSpeedRatings
138
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
139
- $this->assertEquals($entry->getValue(), 100);
140
- $this->assertEquals($entry->getText(), '100');
141
-
142
- $entry = $ifd0_0->getEntry(36864); // ExifVersion
143
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
144
- $this->assertEquals($entry->getValue(), 2.2);
145
- $this->assertEquals($entry->getText(), 'Exif Version 2.2');
146
-
147
- $entry = $ifd0_0->getEntry(36867); // DateTimeOriginal
148
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
149
- $this->assertEquals($entry->getValue(), 1089482993);
150
- $this->assertEquals($entry->getText(), '2004:07:10 18:09:53');
151
-
152
- $entry = $ifd0_0->getEntry(36868); // DateTimeDigitized
153
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
154
- $this->assertEquals($entry->getValue(), 1089482993);
155
- $this->assertEquals($entry->getText(), '2004:07:10 18:09:53');
156
-
157
- $entry = $ifd0_0->getEntry(37121); // ComponentsConfiguration
158
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
159
- $this->assertEquals($entry->getValue(), "\x01\x02\x03\0");
160
- $this->assertEquals($entry->getText(), 'Y Cb Cr -');
161
-
162
- $entry = $ifd0_0->getEntry(37122); // CompressedBitsPerPixel
163
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
164
- $this->assertEquals($entry->getValue(), [
165
- 0 => 2,
166
- 1 => 1
167
- ]);
168
- $this->assertEquals($entry->getText(), '2/1');
169
-
170
- $entry = $ifd0_0->getEntry(37380); // ExposureBiasValue
171
- $this->assertInstanceOf('lsolesen\pel\PelEntrySRational', $entry);
172
- $this->assertEquals($entry->getValue(), [
173
- 0 => 7,
174
- 1 => 10
175
- ]);
176
- $this->assertEquals($entry->getText(), '+0.7');
177
-
178
- $entry = $ifd0_0->getEntry(37381); // MaxApertureValue
179
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
180
- $this->assertEquals($entry->getValue(), [
181
- 0 => 48,
182
- 1 => 16
183
- ]);
184
- $this->assertEquals($entry->getText(), '48/16');
185
-
186
- $entry = $ifd0_0->getEntry(37383); // MeteringMode
187
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
188
- $this->assertEquals($entry->getValue(), 2);
189
- $this->assertEquals($entry->getText(), 'Center-Weighted Average');
190
-
191
- $entry = $ifd0_0->getEntry(37384); // LightSource
192
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
193
- $this->assertEquals($entry->getValue(), 0);
194
- $this->assertEquals($entry->getText(), 'Unknown');
195
-
196
- $entry = $ifd0_0->getEntry(37385); // Flash
197
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
198
- $this->assertEquals($entry->getValue(), 31);
199
- $this->assertEquals($entry->getText(), 'Flash fired, auto mode, return light detected.');
200
-
201
- $entry = $ifd0_0->getEntry(37386); // FocalLength
202
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
203
- $this->assertEquals($entry->getValue(), [
204
- 0 => 139,
205
- 1 => 10
206
- ]);
207
- $this->assertEquals($entry->getText(), '13.9 mm');
208
-
209
- $entry = $ifd0_0->getEntry(37500); // MakerNote
210
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
211
- $expected = "\x53\x4f\x4e\x59\x20\x44\x53\x43\x20\0\0\0\x0c\0\x01\x90\x07\0\x94\0\0\0\x40\x03\0\0\x02\x90\x07\0\xc8\0\0\0\xd4\x03\0\0\x03\x90\x07\0\xc8\0\0\0\x9c\x04\0\0\x04\x90\x07\0\x1a\0\0\0\x64\x05\0\0\x05\x90\x07\0\x78\0\0\0\x7e\x05\0\0\x06\x90\x07\0\xfc\0\0\0\xf6\x05\0\0\x07\x90\x07\0\xc8\0\0\0\xf2\x06\0\0\x08\x90\x07\0\xc8\0\0\0\xba\x07\0\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xdf\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\x0c\0\0\0\x05\0\x6e\x7e\xa0\0\xe4\x89\x2c\0\xe7\x8f\0\0\0\0\x0c\0\0\0\0\0\0\0\x0c\0\x01\xe7\x41\xff\0\0\0\0\0\x08\x07\x02\x09\xfe\0\x60\x1f\x08\xdf\x5e\xf0\xff\x4a\xfe\0\0\0\0\x4a\x30\0\x88\x1f\x05\x4a\x30\x4a\x88\0\x70\0\0\x70\0\0\x01\xb8\0\x5e\0\x81\0\0\x56\x0d\0\0\0\x63\0\0\xd8\xc4\0\0\xd2\x90\x88\x1f\xbe\0\x70\0\0\xc8\0\xbe\x5e\0\xd8\x6f\0\0\x40\x50\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\x04\0\x1b\0\0\0\x07\0\0\x01\xb8\x08\0\x8a\xb7\0\x74\x91\xf0\0\x8c\x75\x3d\0\0\0\xd8\0\0\0\0\0\0\0\0\0\0\0\0\x05\xc4\0\0\xd3\0\xc3\x74\xd7\x93\xd8\x67\x05\xc4\xd7\x22\x30\x63\0\0\0\0\xd7\xa7\xbe\x21\0\0\0\0\0\0\0\0\0\0\x01\x14\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\x14\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x0e\x08\xe3\0\x7d\0\x28\x8a\x0e\0\x5e\0\0\xa8\0\xbe\xc0\xbe\xc0\xd7\x93\x40\0\0\0\xdc\xdc\x73\x46\0\x92\0\xb7\0\x23\0\x23\0\x47\0\x82\0\x06\0\x55\xef\x10\x24\x31\xef\xc3\x79\x73\xef\x10\x79\x8a\x79\x05\xc4\xef\x5b\xc5\x18\xc5\x18\x7d\xa5\x88\xb7\xcf\0\0\x01\x69\0\0\0\0\0\0\0\0\xff\0\0\xf1\0\x07\0\x47\xff\0\x01\x15\0\x6a\0\x20\x23\0\x5e\0\0\0\x56\0\x08\xdd\x01\xc5\x01\0\x01\0\x04\x80\x1b\xf2\x45\xdd\x38\x54\0\x69\x24\xdc\x0c\x63\xf0\xde\xec\x23\x28\x47\xf0\xa8\x92\x45\xef\x21\xc5\x49\x58\x2f\0\xc3\x46\xfe\x59\x5a\x9f\xfe\0\x07\xf3\x52\xa0\x6e\x51\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\x20\x08\x1b\0\x01\xdc\xdc\xbc\x5f\x10\0\0\x08\xec\x08\xe7\x08\x04\x08\x51\0\xdc\0\xe3\0\xe3\0\xc2\0\0\0\0\0\0\0\0\x01\x01\0\0\0\0\0\x7d\0\0\0\0\0\x7b\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\x01\0\0\0\0\0\x01\0\x01\0\x08\0\x01\0\x01\xe5\x91\x51\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xff\xff\0\xff\0\0\0\0\0\0\0\0\xb3\xe5\0\0\xff\xff\0\0\xcd\x95\x51\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7d\0\x40\0\x1b\0\0\0\x01\xd8\x2b\xd8\x47\x5e\xa7\xbb\x9e\x0e\x8b\x20\x08\xa0\xfd\xd8\xf4\x5e\x2b\x56\x69\x88\xe8\xd8\xaa\xb6\x60\x6a\x98\x0e\x53\x56\x8e\x56\x8d\x05\xe1\xd8\x5d\x20\xcc\xd3\x58\x5e\xb6\x04\xb7\xe7\xe9\xcd\x57\x7d\x2c\xd7\x24\x5d\xbc\x5e\xd3\x04\xdc\xd8\x8f\xea\x4f\x7d\x6e\x30\x28\xd3\x4b\x7d\xf7\xe7\xf8\x7d\x09\x8a\x26\x7d\xc4\x88\x24\xa0\x9e\x40\x94\x7d\xf1\x7d\x95\x5e\x46\x40\xd3\x70\x44\xbe\xfb\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\x1b\0\x1b\0\0\0\x7d\0\x5e\0\0\0\0\0\x08\0\x40\0\0\0\xd8\0\xe7\0\0\0\0\0\x08\0\x40\0\0\0\x0e\0\x0e\0\0\0\0\0\x08\0\x7d\0\0\0\xe7\0\x08\0\x7d\0\x1b\0\0\0\x01\0\0\0\xd8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x40\x43\xd8\xe0\x5e\xd1\x04\xf7\x8a\xde\x30\xf4\x20\x39\x05\x45\x05\xce\xb6\x31\x88\xbf\x30\x24\x30\x77\x30\xb7\x88\x65\0\xa3\x7d\xdd\xd8\xd6\x0e\x43\xea\x11\x69\x6c\x81\xb9\xec\x45\x28\x13\xb6\xe6\x20\xdc\xbe\x5b\x81\x3e\x0c\xc3\xec\x9e\x6c\x35\0\0\0\0\x08\x4a\x08\x22\x1b\xe2\x40\x9e\x5e\x4b\xb6\x8b\x05\xa0\xd8\x41\x5e\xa9\x56\xdd\x8a\x43\x69\x80\x69\x5b\x70\xe0\xea\x88\0\xa3\x08\x8d\x1b\xc4\x1b\xa8\x7d\x57\x56\xa7\x69\x8c\x88\xe6\x69\x94\x56\xa9\x8a\x08\xb6\xba\x69\x23\x69\xba\x88\x94\xbe\x81\0\0\0\0\x40\x43\x7d\x40\x7d\x54\xd8\x54\xe7\xea\x70\xc7\x05\x07\x5e\xe1\x0e\xa8\x56\xa4\x05\x80\x70\xc7\x70\xc7\x05\x80\x56\x0d\0\xa3\x30\x63\xbe\xd8\xbe\x5b\xbe\x9e\xbe\x21\xd7\x96\xd7\x86\xd7\x22\xbe\x21\xd7\xb6\xd7\xef\xd7\x74\xd7\xd4\xd7\xb3\xd7\xa7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
212
- $this->assertEquals($entry->getValue(), $expected);
213
- $this->assertEquals($entry->getText(), '1504 bytes unknown MakerNote data');
214
-
215
- $entry = $ifd0_0->getEntry(40960); // FlashPixVersion
216
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
217
- $this->assertEquals($entry->getValue(), 1);
218
- $this->assertEquals($entry->getText(), 'FlashPix Version 1.0');
219
-
220
- $entry = $ifd0_0->getEntry(40961); // ColorSpace
221
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
222
- $this->assertEquals($entry->getValue(), 1);
223
- $this->assertEquals($entry->getText(), 'sRGB');
224
-
225
- $entry = $ifd0_0->getEntry(40962); // PixelXDimension
226
- $this->assertInstanceOf('lsolesen\pel\PelEntryLong', $entry);
227
- $this->assertEquals($entry->getValue(), 640);
228
- $this->assertEquals($entry->getText(), '640');
229
-
230
- $entry = $ifd0_0->getEntry(40963); // PixelYDimension
231
- $this->assertInstanceOf('lsolesen\pel\PelEntryLong', $entry);
232
- $this->assertEquals($entry->getValue(), 480);
233
- $this->assertEquals($entry->getText(), '480');
234
-
235
- $entry = $ifd0_0->getEntry(41728); // FileSource
236
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
237
- $this->assertEquals($entry->getValue(), "\x03");
238
- $this->assertEquals($entry->getText(), 'DSC');
239
-
240
- $entry = $ifd0_0->getEntry(41729); // SceneType
241
- $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
242
- $this->assertEquals($entry->getValue(), "\x01");
243
- $this->assertEquals($entry->getText(), 'Directly photographed');
244
-
245
- $entry = $ifd0_0->getEntry(41985); // CustomRendered
246
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
247
- $this->assertEquals($entry->getValue(), 0);
248
- $this->assertEquals($entry->getText(), 'Normal process');
249
-
250
- $entry = $ifd0_0->getEntry(41986); // ExposureMode
251
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
252
- $this->assertEquals($entry->getValue(), 1);
253
- $this->assertEquals($entry->getText(), 'Manual exposure');
254
-
255
- $entry = $ifd0_0->getEntry(41987); // WhiteBalance
256
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
257
- $this->assertEquals($entry->getValue(), 0);
258
- $this->assertEquals($entry->getText(), 'Auto white balance');
259
-
260
- $entry = $ifd0_0->getEntry(41990); // SceneCaptureType
261
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
262
- $this->assertEquals($entry->getValue(), 0);
263
- $this->assertEquals($entry->getText(), 'Standard');
264
-
265
- /* Sub IFDs of $ifd0_0. */
266
- $this->assertEquals(count($ifd0_0->getSubIfds()), 1);
267
- $ifd0_0_0 = $ifd0_0->getSubIfd(4); // IFD Interoperability
268
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_0_0);
269
-
270
- /* Start of IDF $ifd0_0_0. */
271
- $this->assertEquals(count($ifd0_0_0->getEntries()), 2);
272
-
273
- $entry = $ifd0_0_0->getEntry(1); // InteroperabilityIndex
274
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
275
- $this->assertEquals($entry->getValue(), 'R98');
276
- $this->assertEquals($entry->getText(), 'R98');
277
-
278
- $entry = $ifd0_0_0->getEntry(2); // InteroperabilityVersion
279
- $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
280
- $this->assertEquals($entry->getValue(), 1);
281
- $this->assertEquals($entry->getText(), 'Interoperability Version 1.0');
282
-
283
- /* Sub IFDs of $ifd0_0_0. */
284
- $this->assertEquals(count($ifd0_0_0->getSubIfds()), 0);
285
-
286
- $this->assertEquals($ifd0_0_0->getThumbnailData(), '');
287
-
288
- /* Next IFD. */
289
- $ifd0_0_1 = $ifd0_0_0->getNextIfd();
290
- $this->assertNull($ifd0_0_1);
291
- /* End of IFD $ifd0_0_0. */
292
-
293
- $this->assertEquals($ifd0_0->getThumbnailData(), '');
294
-
295
- /* Next IFD. */
296
- $ifd0_1 = $ifd0_0->getNextIfd();
297
- $this->assertNull($ifd0_1);
298
- /* End of IFD $ifd0_0. */
299
-
300
- $this->assertEquals($ifd0->getThumbnailData(), '');
301
-
302
- /* Next IFD. */
303
- $ifd1 = $ifd0->getNextIfd();
304
- $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd1);
305
- /* End of IFD $ifd0. */
306
-
307
- /* Start of IDF $ifd1. */
308
- $this->assertEquals(count($ifd1->getEntries()), 8);
309
-
310
- $entry = $ifd1->getEntry(259); // Compression
311
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
312
- $this->assertEquals($entry->getValue(), 6);
313
- $this->assertEquals($entry->getText(), 'JPEG compression');
314
-
315
- $entry = $ifd1->getEntry(271); // Make
316
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
317
- $this->assertEquals($entry->getValue(), 'SONY');
318
- $this->assertEquals($entry->getText(), 'SONY');
319
-
320
- $entry = $ifd1->getEntry(272); // Model
321
- $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
322
- $this->assertEquals($entry->getValue(), 'DSC-V1');
323
- $this->assertEquals($entry->getText(), 'DSC-V1');
324
-
325
- $entry = $ifd1->getEntry(274); // Orientation
326
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
327
- $this->assertEquals($entry->getValue(), 6);
328
- $this->assertEquals($entry->getText(), 'right - top');
329
-
330
- $entry = $ifd1->getEntry(282); // XResolution
331
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
332
- $this->assertEquals($entry->getValue(), [
333
- 0 => 72,
334
- 1 => 1
335
- ]);
336
- $this->assertEquals($entry->getText(), '72/1');
337
-
338
- $entry = $ifd1->getEntry(283); // YResolution
339
- $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
340
- $this->assertEquals($entry->getValue(), [
341
- 0 => 72,
342
- 1 => 1
343
- ]);
344
- $this->assertEquals($entry->getText(), '72/1');
345
-
346
- $entry = $ifd1->getEntry(296); // ResolutionUnit
347
- $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
348
- $this->assertEquals($entry->getValue(), 2);
349
- $this->assertEquals($entry->getText(), 'Inch');
350
-
351
- $entry = $ifd1->getEntry(306); // DateTime
352
- $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
353
- $this->assertEquals($entry->getValue(), 1089482993);
354
- $this->assertEquals($entry->getText(), '2004:07:10 18:09:53');
355
-
356
- /* Sub IFDs of $ifd1. */
357
- $this->assertEquals(count($ifd1->getSubIfds()), 0);
358
-
359
- $thumb_data = file_get_contents(dirname(__FILE__) . '/sony-dsc-v1-thumb.jpg');
360
- $this->assertEquals($ifd1->getThumbnailData(), $thumb_data);
361
-
362
- /* Next IFD. */
363
- $ifd2 = $ifd1->getNextIfd();
364
- $this->assertNull($ifd2);
365
- /* End of IFD $ifd1. */
366
-
367
- $this->assertTrue(count(Pel::getExceptions()) == 0);
368
- }
369
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/canon-eos-650d-thumb.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/canon-eos-650d.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/canon-ixus-ii-thumb.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/canon-ixus-ii.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/canon-powershot-s60-thumb.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/canon-powershot-s60.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/fujifilm_x_a5.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/leica-d-lux-thumb.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/leica-d-lux.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/nikon-coolscan-iv.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/nikon-e5000-thumb.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/nikon-e5000.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/nikon-e950-thumb.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/nikon-e950.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/olympus-c5050z-thumb.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/olympus-c5050z.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/olympus-c50z-thumb.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/olympus-c50z.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/olympus-c765uz-thumb.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/olympus-c765uz.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/pentax-istDS-thumb.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/pentax-istDS.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/sony-dsc-v1-thumb.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/test/imagetests/sony-dsc-v1.jpg DELETED
Binary file
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/tutorials/PEL/PEL.pkg DELETED
@@ -1,60 +0,0 @@
1
- <refentry id="{@id}">
2
- <refnamediv>
3
- <refname>PHP Exif Library</refname>
4
- <refpurpose>Overview of PEL</refpurpose>
5
- </refnamediv>
6
- <refsynopsisdiv>
7
- <authorblurb>
8
- <para>
9
- <author>
10
- <firstname>Martin</firstname>
11
- <surname>Geisler</surname>
12
- </author>
13
- {@link mailto:mgeisler@users.sourceforge.net
14
- mgeisler@users.sourceforge.net}
15
- </para>
16
- </authorblurb>
17
- </refsynopsisdiv>
18
-
19
- <refsect1 id="{@id intro}">
20
- <title>What is the PHP Exif Library?</title>
21
-
22
- <para>The PHP Exif Library (called PEL for short) is a library
23
- written in {@link http://www.php.net/ PHP} which will allow you to
24
- manipulate {@link http://www.exif.org/ Exif} data. This is the
25
- data that digital cameras place in their images, such as the date
26
- and time, shutter speed, ISO value and so on.</para>
27
-
28
- <para>PEL makes it easy to parse Exif data stored in JPEG and TIFF
29
- images. Once an image has been loaded, the data can be changed at
30
- will by manipulating the objects representing the data. The
31
- objects can be saved again to produce a valid image.</para>
32
-
33
- <para>This documentation contains:</para>
34
- <itemizedlist>
35
-
36
- <listitem>
37
- <para>Full details on all classes and methods in PEL. Begin
38
- with {@link PelJpeg}.</para>
39
- </listitem>
40
-
41
- <listitem>
42
- <para>Instructions on {@tutorial using.pkg}.</para>
43
- </listitem>
44
-
45
- <listitem>
46
- <para>A list of {@tutorial faq.pkg}.</para>
47
- </listitem>
48
-
49
- </itemizedlist>
50
-
51
- <warning>
52
- <para>Please note that PEL <emphasis>requires</emphasis> PHP
53
- version 5. It will not run on PHP 4. See
54
- {@tutorial faq.pkg#why-php5 the FAQ} for more
55
- information.</para>
56
- </warning>
57
-
58
- </refsect1>
59
-
60
- </refentry>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/tutorials/PEL/PEL.pkg.ini DELETED
@@ -1,3 +0,0 @@
1
- [Linked Tutorials]
2
- using
3
- faq
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/tutorials/PEL/faq.pkg DELETED
@@ -1,273 +0,0 @@
1
- <refentry id="{@id}">
2
- <refnamediv>
3
- <refname>Frequently Asked Questions (FAQ)</refname>
4
- <refpurpose>Quick answers to common questions</refpurpose>
5
- </refnamediv>
6
- <refsynopsisdiv>
7
- <authorblurb>
8
- <para>
9
- <author>
10
- <firstname>Martin</firstname>
11
- <surname>Geisler</surname>
12
- </author>
13
- {@link mailto:mgeisler@users.sourceforge.net
14
- mgeisler@users.sourceforge.net}
15
- </para>
16
- </authorblurb>
17
- </refsynopsisdiv>
18
-
19
- {@toc}
20
-
21
- <refsect1 id="{@id pel-acronym}">
22
-
23
- <title>What does PEL stand for?</title>
24
-
25
- <para>PEL is an acronym for "PHP Exif Library". Sound simple
26
- enough, doesn't it?</para>
27
-
28
- <para>But did you realise that PEL is an acronym consisting of two
29
- acronyms, one of which is recursive! So "PEL" actually stands for
30
- "PHP Hypertext Preprocessor Exchangeable image file format Library".
31
- Pyh!</para>
32
- </refsect1>
33
-
34
-
35
- <refsect1 id="{@id exif-vs-exif}">
36
-
37
- <title>What's the business with EXIF vs. Exif?</title>
38
-
39
- <para>Well, since Exif is an acronym for "Exchangeable image file
40
- format" and thus you would expect it to be spelled "EXIF", just like
41
- "JPEG" which is an acronym for Joint Photographic Experts
42
- Group.</para>
43
-
44
- <para>But the Exif standards spell Exif as "Exif" and so does PEL,
45
- at least since version 0.9. But should they ever decide to update
46
- their acronym to "EXIF" then PEL will revert... Luckily it does not
47
- affect the acronym PEL itself :-)</para>
48
-
49
- </refsect1>
50
-
51
-
52
- <refsect1 id="{@id why-php5}">
53
- <title>Why does PEL require PHP version 5?</title>
54
-
55
- <para>The support for object-oriented programming was completely
56
- overhauled with the introduction of PHP 5 in July 2004. The changes
57
- included both semantic changes and syntaxtical changes to the PHP
58
- language.</para>
59
-
60
- <para>The semantic change was the use of object references per
61
- default. This change means that when you do</para>
62
-
63
- <programlisting role="php">
64
- <![CDATA[
65
- $object_a = $ifd->getEntry(PelTag::IMAGE_DESCRIPTION);
66
- $object_a->setValue('This is my new description.');
67
- $object_b = $ifd->getEntry(PelTag::IMAGE_DESCRIPTION);
68
- ]]>
69
- </programlisting>
70
-
71
- <para>then <literal>$object_a</literal> and
72
- <literal>$object_b</literal> will both reference <emphasis>the
73
- same</emphasis> element. In particular, you will see that
74
- <literal>$object_b->getValue()</literal> returns the string just
75
- stored in <literal>$object_a</literal> (since they are the same
76
- object). With PHP 4 you would have gotten two different objects,
77
- which is generally not what you want.</para>
78
-
79
- <para>The syntaxtical changes from PHP 5 to PHP 4 include the
80
- addition of access modifiers to object fields (the private,
81
- protected, and public keywords), object constants, constructors
82
- named <literal>__construct()</literal>, interfaces and abstract
83
- classes, and exceptions. PEL uses all these new features to the
84
- fullest, which means that PHP 4 doesn't understand the code.</para>
85
-
86
- <para>If your provider is still using PHP 4, then you should ask
87
- them to upgrade. PHP 5 has been declared stable since July 2004 and
88
- all major PHP applications ({@link http://www.wordpress.org
89
- WordPress}, {@link http://gallery.menalto.com/ Gallery},
90
- {@link http://phpwiki.sourceforge.net/ PhpWiki},
91
- {@link http://www.phpmyadmin.net/ phpMyAdmin}, etc...), have been
92
- upgraded to work with PHP 5, so an upgrade should not bring you any
93
- problems, just more features and better performance.</para>
94
-
95
- </refsect1>
96
-
97
-
98
- <refsect1 id="{@id fatal-php4-errors}">
99
-
100
- <title>Why do I get fatal errors from PHP?</title>
101
-
102
- <para>If you get a fatal error when trying to use PEL, then your
103
- installation of PHP might be too old. PEL requires PHP version 5.
104
- Please see the question "{@tutorial faq.pkg#why-php5}" for more
105
- information.</para>
106
-
107
- </refsect1>
108
-
109
-
110
- <refsect1 id="{@id call-on-non-object}">
111
- <title>What does "<literal>Call to a member function
112
- <function>f</function> on a non-object</literal>" (where
113
- <function>f</function> is <literal>getTiff()</literal> or
114
- <literal>setValue()</literal>) mean?</title>
115
-
116
- <para>This is the error PHP gives when you call a method on a
117
- variable which is not an object.</para>
118
-
119
- <para>PEL uses objects to represent the entire structure of a JPEG
120
- image, and many of the methods defined on those objects return other
121
- objects. In particular, the method {@link PelJpeg::getExif()}
122
- returns a {@link PelExif} object and {@link PelIfd::getEntry()}
123
- returns a {@link PelEntry} object.</para>
124
-
125
- <para>But both methods can return <literal>null</literal> if no such
126
- section or entry exist. The correct way to use them is thus
127
- something along the lines of:</para>
128
-
129
- <programlisting role="php">
130
- <![CDATA[
131
- $exif = $jpeg->getExif();
132
- if ($exif != null) {
133
- $tiff = $exif->getTiff();
134
- /* Do something with the TIFF data. */
135
- } else {
136
- /* Sorry --- no Exif data found. */
137
- }
138
- ]]>
139
- </programlisting>
140
-
141
- <para>The same principle applies to the return values of
142
- {@link PelIfd::getEntry()} and all other methods which return
143
- objects.</para>
144
-
145
- </refsect1>
146
-
147
-
148
- <refsect1 id="{@id IPTC-entries}">
149
-
150
- <title>Does PEL handle IPTC entries?</title>
151
-
152
- <para>No, PEL only deals with Exif data, and no such extension is
153
- planned. Try taking at look at the
154
- {@link http://www.ozhiker.com/electronics/pjmt/ PHP JPEG Metadata
155
- Toolkit} which should handle IPTC along with a huge number of other
156
- metadata formats.</para>
157
-
158
- </refsect1>
159
-
160
-
161
- <refsect1 id="{@id missing-Gettext}">
162
-
163
- <title>Why does Gettext not work?</title>
164
-
165
- <para>PEL uses Gettext for localization, and thus your system must
166
- fulfill a few requirements:</para>
167
-
168
- <orderedlist>
169
-
170
- <listitem>
171
- <para>PHP must have support for the
172
- {@link http://www.php.net/manual/en/ref.gettext.php Gettext
173
- extension}. Most installations of PHP already has this, but
174
- please double-check with <function>
175
- {@link http://www.php.net/manual/en/function.phpinfo.php
176
- phpinfo}</function> before asking for help on the
177
- mailinglist.</para>
178
- </listitem>
179
-
180
- <listitem>
181
- <para>The system must be setup to generate locales for the
182
- languages into which PEL has been translated. Again, most
183
- commercial webhosts would have their systems configured to deal
184
- with all locales, but if you're installing PEL on your own
185
- server you'll probably have to reconfigure it.</para>
186
-
187
- <para>How to configure the locales differ from system to system.
188
- With the {@link http://www.debian.net/ Debian GNU/Linux}
189
- distribution you should run</para>
190
-
191
- <programlisting>
192
- dpkg-reconfigure locales
193
- </programlisting>
194
-
195
- <para>and then select all locales that you want your system to
196
- support.</para>
197
-
198
- <para>Restart your webserver after changing the locale setup to
199
- make the changes effective.</para>
200
-
201
- </listitem>
202
-
203
- </orderedlist>
204
-
205
- </refsect1>
206
-
207
-
208
- <refsect1 id="{@id error-handling}">
209
-
210
- <title>How to deal with broken images?</title>
211
-
212
- <para>By default PEL will try to load as much from an image as
213
- possible and continue dispite any errors found. The Exif standard
214
- mandates certain formats and lengths for some entries, and sometimes
215
- these requirements are violated.</para>
216
-
217
- <para>The strictness of PEL is controlled by the the method
218
- {@link Pel::setStrictParsing()}. The default is non-strict parsing.
219
- In this mode, PEL will not throw exceptions for parse errors but
220
- instead store them for later inspection via the
221
- {@link Pel::getExceptions()} method.</para>
222
-
223
- <para>With an argument of <literal>true</literal> to
224
- {@link Pel::setStrictParsing()} you make PEL throw exceptions upon
225
- parse errors.</para>
226
-
227
- <para>This may all sound very complex, but it is actually fairly
228
- simple for most uses: have PEL load your images in non-strict mode
229
- and check for errors afterwards, if necessary.</para>
230
-
231
- <para>Please note that even if PEL is in non-strict mode it might
232
- throw exceptions while parsing an image, for example if the image
233
- cannot be recognized a JPEG or TIFF image. So it is always
234
- necessary to wrap calls to PEL in a try-catch block.</para>
235
-
236
- </refsect1>
237
-
238
-
239
- <refsect1 id="{@id commercial-use}">
240
-
241
- <title>Can I use PEL for a commercial application?</title>
242
-
243
- <para>Yes, no problem as long as you do not distribute your
244
- application under another license than the GNU GPL.</para>
245
-
246
- <para>As you should know, PEL is licensed to you under the
247
- conditions of the GNU GPL. The license deals
248
- <emphasis>only</emphasis> with the distribution of PEL and any
249
- derivative works based on PEL, the license has nothing to say over
250
- how you may use PEL.</para>
251
-
252
- <para>So if you do not distribute your code, then you can use it for
253
- whatever you want, including writing a website (commercial or not)
254
- that integrates PEL. Please see
255
- {@link http://www.gnu.org/licenses/gpl-faq.html#GPLRequireSourcePostedPublic
256
- this question} in the GPL FAQ.</para>
257
-
258
- </refsect1>
259
-
260
-
261
- <refsect1 id="{@id unanswered-question}">
262
-
263
- <title>My question is not answered here!</title>
264
-
265
- <para>Please ask your questions on the
266
- {@link http://lists.sourceforge.net/lists/listinfo/pel-devel PEL
267
- Development List}. If an answer is found, then the FAQ will be
268
- updated.</para>
269
-
270
- </refsect1>
271
-
272
-
273
- </refentry>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/tutorials/PEL/schemas.xml DELETED
@@ -1,4 +0,0 @@
1
- <?xml version="1.0"?>
2
- <locatingRules xmlns="http://thaiopensource.com/ns/locating-rules/1.0">
3
- <uri pattern="*.pkg" uri="/usr/share/emacs/site-lisp/nxml-mode/schema/docbook.rnc"/>
4
- </locatingRules>
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/tutorials/PEL/using.pkg DELETED
@@ -1,176 +0,0 @@
1
- <refentry id="{@id}">
2
- <refnamediv>
3
- <refname>Using PEL in applications</refname>
4
- <refpurpose>Learn how to load, edit, and save images</refpurpose>
5
- </refnamediv>
6
- <refsynopsisdiv>
7
- <authorblurb>
8
- <para>
9
- <author>
10
- <firstname>Martin</firstname>
11
- <surname>Geisler</surname>
12
- </author>
13
- {@link mailto:mgeisler@users.sourceforge.net
14
- mgeisler@users.sourceforge.net}
15
- </para>
16
- </authorblurb>
17
- </refsynopsisdiv>
18
-
19
- {@toc}
20
-
21
- <refsect1 id="{@id jpeg}">
22
- <title>Loading a JPEG image</title>
23
-
24
- <para>The typical use for PEL is to read and write data from JPEG
25
- images. Such an image is represented in PEL using an object of
26
- the <classname>PelJpeg</classname> class. With the filename of a
27
- JPEG image stored in the variable <varname>$filename</varname>,
28
- then it is a simple matter of creating a {@link PelJpeg}
29
- object:</para>
30
-
31
- <programlisting role="php">
32
- <![CDATA[
33
- $jpeg = new PelJpeg($filename);
34
- ]]>
35
- </programlisting>
36
-
37
- <para>If this succeeded without any exceptions being thrown, one
38
- can proceed to find the Exif data itself. The Exif data is
39
- retrieved using the {@link PelJpeg::getExif()} method:</para>
40
-
41
- <programlisting role="php">
42
- <![CDATA[
43
- $exif = $jpeg->getExif();
44
- ]]>
45
- </programlisting>
46
-
47
- <para>The section stored in <varname>$exif</varname> is now a
48
- {@link PelExif} object.</para>
49
-
50
- <warning>
51
- <para>If the JPEG image does not contain Exif information, then
52
- the <varname>$exif</varname> variable will be
53
- <literal>null</literal>.</para>
54
- </warning>
55
-
56
- </refsect1>
57
-
58
-
59
- <refsect1 id="{@id tiff}">
60
- <title>Obtaining the TIFF data</title>
61
-
62
- <para>The Exif data is not stored directly in this object, instead
63
- it is stored in a {@link PelTiff} object, which can be retrieved
64
- using the {@link PelExif::getTiff() getTiff()} method:</para>
65
-
66
- <programlisting role="php">
67
- <![CDATA[
68
- $tiff = $exif->getTiff();
69
- ]]>
70
- </programlisting>
71
-
72
- <para>This peculiar step is necessary because what one normally
73
- thinks of as Exif data is really just an extension of the TIFF
74
- standard. PEL models this by having the {@link PelExif} object
75
- contain a {@link PelTiff} object.</para>
76
-
77
- <para>TIFF data is organized as a chain of Image File Directories
78
- (IFDs), each represented by a {@link PelIfd} object. Each IFD has
79
- a number of entries ({@link PelEntry} objects) which one can get
80
- hold of using the {@link PelIfd::getEntry() getEntry()}
81
- method.</para>
82
-
83
- <para>The first IFD, number zero, will normally contain the
84
- {@link PelTag::IMAGE_DESCRIPTION IMAGE_DESCRIPTION} tag. The
85
- following code will initialize <varname>$ifd0</varname> with the
86
- first IFD, and <varname>$desc</varname> with the
87
- description:</para>
88
-
89
- <programlisting role="php">
90
- <![CDATA[
91
- $ifd0 = $tiff->getIfd();
92
- $desc = $ifd0->getEntry(PelTag::IMAGE_DESCRIPTION);
93
- ]]>
94
- </programlisting>
95
-
96
- <para>Now <varname>$desc</varname> will contain a
97
- {@link PelEntryAscii} object holding the description. Each entry
98
- is represented using an object of a class descendent of
99
- {@link PelEntry}. There are classes for numbers such as
100
- {@link PelEntryShort} for small numbers and {@link PelEntryLong}
101
- for big numbers, and more specialized classes, such as
102
- {@link PelEntryVersion} for version numbers, {@link PelEntryTime}
103
- for date and time, and so on.</para>
104
-
105
- </refsect1>
106
-
107
- <refsect1 id="{@id reading}">
108
- <title>Reading Values</title>
109
-
110
- <para>The value of any entry can be retrieved by calling the
111
- {@link PelEntry::getValue() getValue()} method on the object.
112
- Doing this on <varname>$desc</varname> will return a string, while
113
- doing it on a {@link PelEntryShort} will normally return an
114
- integer (see {@link PelEntryNumber::getValue() the documentation}
115
- for the full story). So to echo the description one simply
116
- does:</para>
117
-
118
- <programlisting role="php">
119
- <![CDATA[
120
- echo 'The description: ' . $desc->getValue();
121
- ]]>
122
- </programlisting>
123
-
124
- </refsect1>
125
-
126
- <refsect1 id="{@id writing}">
127
-
128
- <title>Writing Values</title>
129
-
130
- <para>Writing new values (changing values) to an entry is just as
131
- easy as reading values, one just uses the
132
- {@link PelEntry::setValue() setValue()} method on the entry in
133
- question.</para>
134
-
135
- <para>Continuing on our example from before where
136
- <varname>$desc</varname> contains a {@link PelEntryAscii} object
137
- with the description for the image, one changes the description
138
- with:</para>
139
-
140
- <programlisting role="php">
141
- <![CDATA[
142
- $desc->setValue('The new description.');
143
- ]]>
144
- </programlisting>
145
-
146
- <para>The object is now updated and is ready to be turned back
147
- into bytes, so that the image can be saved with the new, updated
148
- description.</para>
149
-
150
- </refsect1>
151
-
152
- <refsect1 id="{@id saving}">
153
-
154
- <title>Saving an Image</title>
155
-
156
- <para>After having changed an image, one would probably want to
157
- save it to keep the changes.</para>
158
-
159
- <para>{@link PelJpeg} objects (and {@link PelTiff} objects) can be
160
- turned back into bytes with the {@link PelJpeg::getBytes()
161
- getBytes} method. This will turn the object and all the objects
162
- within it into bytes, which can then be saved in a file to produce
163
- a JPEG image.</para>
164
-
165
- <para>With the image loaded into <varname>$jpeg</varname> it is a
166
- simple matter to write the new JPEG file:</para>
167
-
168
- <programlisting role="php">
169
- <![CDATA[
170
- $jpeg->saveFile('new-' . $filename);
171
- ]]>
172
- </programlisting>
173
-
174
- </refsect1>
175
-
176
- </refentry>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/update-locales.sh DELETED
@@ -1,37 +0,0 @@
1
- #!/bin/sh
2
- #
3
- # PEL: PHP Exif Library. A library with support for reading and
4
- # writing all Exif headers in JPEG and TIFF images using PHP.
5
- #
6
- # Copyright (C) 2004 Martin Geisler.
7
- #
8
- # This program is free software; you can redistribute it and/or modify
9
- # it under the terms of the GNU General Public License as published by
10
- # the Free Software Foundation; either version 2 of the License, or
11
- # (at your option) any later version.
12
- #
13
- # This program is distributed in the hope that it will be useful,
14
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
- # GNU General Public License for more details.
17
- #
18
- # You should have received a copy of the GNU General Public License
19
- # along with this program in the file COPYING; if not, write to the
20
- # Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
21
- # Boston, MA 02110-1301 USA
22
-
23
- # $Id$
24
-
25
-
26
- # This script will generate the binary MO files from the PO files
27
- # found in the po subdirectory.
28
-
29
- cd po
30
- echo -n "Generating MO files... "
31
- for lang in *.po; do
32
- dir=../locale/${lang%.po}/LC_MESSAGES
33
- mkdir -p $dir
34
- msgfmt --output-file $dir/pel.mo $lang
35
- done
36
- echo "done."
37
- cd ..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/pel-0.9.9/update-pot.sh DELETED
@@ -1,40 +0,0 @@
1
- #!/bin/sh
2
- #
3
- # PEL: PHP Exif Library. A library with support for reading and
4
- # writing all Exif headers in JPEG and TIFF images using PHP.
5
- #
6
- # Copyright (C) 2004 Martin Geisler.
7
- #
8
- # This program is free software; you can redistribute it and/or modify
9
- # it under the terms of the GNU General Public License as published by
10
- # the Free Software Foundation; either version 2 of the License, or
11
- # (at your option) any later version.
12
- #
13
- # This program is distributed in the hope that it will be useful,
14
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
- # GNU General Public License for more details.
17
- #
18
- # You should have received a copy of the GNU General Public License
19
- # along with this program in the file COPYING; if not, write to the
20
- # Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
21
- # Boston, MA 02110-1301 USA
22
-
23
- # $Id$
24
-
25
-
26
- # This small script will update the pel.pot template file in the po
27
- # directory so that it contains the all the strings used in PEL.
28
-
29
- echo -n Extracting translatable strings...
30
- xgettext --output=po/pel.pot \
31
- --keyword=tra \
32
- --keyword=fmt \
33
- --flag=fmt:1:php-format \
34
- Pel*.php
35
- echo done.
36
-
37
- for po in po/*.po; do
38
- echo -n Updating $po:
39
- msgmerge -v -U $po po/pel.pot
40
- done
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php CHANGED
@@ -798,8 +798,8 @@ class Mixin_Displayed_Gallery_Validation extends Mixin
798
  $this->object->add_error(__('Source not compatible with selected display type', 'nggallery'), 'display_type');
799
  }
800
  }
801
- // Allow ONLY recent & random galleries to have their own maximum_entity_count
802
- if (!empty($this->object->display_settings['maximum_entity_count']) && in_array($this->object->source, array('random_images', 'recent_images', 'random', 'recent'))) {
803
  $this->object->maximum_entity_count = $this->object->display_settings['maximum_entity_count'];
804
  }
805
  // If no maximum_entity_count has been given, then set a maximum
@@ -1116,7 +1116,11 @@ class Mixin_Displayed_Gallery_Queries extends Mixin
1116
  $container_ids = $this->object->container_ids;
1117
  if ($container_ids) {
1118
  if ($container_ids !== array('0') && $container_ids !== array('')) {
 
1119
  $album_mapper->where(array("{$album_key} IN %s", $container_ids));
 
 
 
1120
  foreach ($album_mapper->run_query() as $album) {
1121
  $entity_ids = array_merge($entity_ids, (array) $album->sortorder);
1122
  }
798
  $this->object->add_error(__('Source not compatible with selected display type', 'nggallery'), 'display_type');
799
  }
800
  }
801
+ // Only some sources should have their own maximum_entity_count
802
+ if (!empty($this->object->display_settings['maximum_entity_count']) && in_array($this->object->source, array('tag', 'tags', 'random_images', 'recent_images', 'random', 'recent'))) {
803
  $this->object->maximum_entity_count = $this->object->display_settings['maximum_entity_count'];
804
  }
805
  // If no maximum_entity_count has been given, then set a maximum
1116
  $container_ids = $this->object->container_ids;
1117
  if ($container_ids) {
1118
  if ($container_ids !== array('0') && $container_ids !== array('')) {
1119
+ $container_ids = array_map('intval', $container_ids);
1120
  $album_mapper->where(array("{$album_key} IN %s", $container_ids));
1121
+ // This order_by is necessary for albums to be ordered correctly given the WHERE .. IN() above
1122
+ $order_string = implode(',', $container_ids);
1123
+ $album_mapper->order_by("FIELD('id', {$order_string})");
1124
  foreach ($album_mapper->run_query() as $album) {
1125
  $entity_ids = array_merge($entity_ids, (array) $album->sortorder);
1126
  }
products/photocrati_nextgen/modules/nextgen_pagination/module.nextgen_pagination.php CHANGED
@@ -19,7 +19,7 @@ class M_NextGen_Pagination extends C_Base_Module
19
  'photocrati-nextgen_pagination',
20
  "Pagination",
21
  "Provides pagination for display types",
22
- '3.3.21',
23
  "https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/",
24
  "Imagely",
25
  "https://www.imagely.com"
19
  'photocrati-nextgen_pagination',
20
  "Pagination",
21
  "Provides pagination for display types",
22
+ '3.4.8',
23
  "https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/",
24
  "Imagely",
25
  "https://www.imagely.com"
products/photocrati_nextgen/modules/nextgen_pagination/package.module.nextgen_pagination.php CHANGED
@@ -7,13 +7,13 @@ class Mixin_NextGen_Basic_Pagination extends Mixin
7
  /**
8
  * Returns a formatted HTML string of a pagination widget
9
  *
10
- * @param mixed $page
11
- * @param int $totalElement
12
- * @param int $maxElement
13
  * @param string|null $current_url (optional)
14
  * @return array Of data holding prev & next url locations and a formatted HTML string
15
  */
16
- public function create_pagination($page, $totalElement, $maxElement = 0, $current_url = NULL)
17
  {
18
  $prev_symbol = apply_filters('ngg_prev_symbol', '&#9668;');
19
  $next_symbol = apply_filters('ngg_next_symbol', '&#9658;');
@@ -30,42 +30,60 @@ class Mixin_NextGen_Basic_Pagination extends Mixin
30
  }
31
  }
32
  }
33
- $return = array('prev' => '', 'next' => '', 'output' => '');
34
- if ($maxElement <= 0) {
35
- $return['output'] = "<div class='ngg-clear'></div>";
36
  return $return;
37
  }
38
- $total = $totalElement;
39
- // create navigation
40
- if ($total > $maxElement) {
41
- $r = '';
42
- if (1 < $page) {
43
- $newpage = 1 == $page - 1 ? 1 : $page - 1;
44
- $return['prev'] = $this->object->set_param_for($current_url, 'nggpage', $newpage);
45
- $r .= '<a class="prev" data-pageid="' . $newpage . '" id="ngg-prev-' . $newpage . '" href="' . $return['prev'] . '">' . $prev_symbol . '</a>';
46
- }
47
- $total_pages = ceil($total / $maxElement);
48
- if ($total_pages > 1) {
49
- for ($page_num = 1; $page_num <= $total_pages; $page_num++) {
50
- if ($page == $page_num) {
51
- $r .= '<span class="current">' . $page_num . '</span>';
 
 
52
  } else {
53
- if ($page_num < 3 || $page_num >= $page - 3 && $page_num <= $page + 3 || $page_num > $total_pages - 3) {
54
- $newpage = 1 == $page_num ? 1 : $page_num;
55
- $link = $this->object->set_param_for($current_url, 'nggpage', $newpage);
56
- $r .= '<a class="page-numbers" data-pageid="' . $newpage . '" href="' . $link . '">' . $page_num . '</a>';
 
 
 
 
 
57
  }
58
  }
59
  }
 
 
 
 
60
  }
61
- if ($page * $maxElement < $total || -1 == $total) {
62
- $newpage = $page + 1;
63
- $return['next'] = $this->object->set_param_for($current_url, 'nggpage', $newpage);
64
- $r .= '<a class="next" data-pageid="' . $newpage . '" id="ngg-next-' . $newpage . '" href="' . $return['next'] . '">' . $next_symbol . '</a>';
65
- }
66
- $return['output'] = "<div class='ngg-navigation'>{$r}</div>";
67
- } else {
68
- $return['output'] = "<div class='ngg-clear'></div>";
 
 
 
 
 
 
 
69
  }
70
  return $return;
71
  }
7
  /**
8
  * Returns a formatted HTML string of a pagination widget
9
  *
10
+ * @param mixed $selected_page
11
+ * @param int $number_of_entities
12
+ * @param int $entities_per_page
13
  * @param string|null $current_url (optional)
14
  * @return array Of data holding prev & next url locations and a formatted HTML string
15
  */
16
+ public function create_pagination($selected_page, $number_of_entities, $entities_per_page = 0, $current_url = NULL)
17
  {
18
  $prev_symbol = apply_filters('ngg_prev_symbol', '&#9668;');
19
  $next_symbol = apply_filters('ngg_next_symbol', '&#9658;');
30
  }
31
  }
32
  }
33
+ // Early exit
34
+ $return = array('prev' => '', 'next' => '', 'output' => "<div class='ngg-clear'></div>");
35
+ if ($entities_per_page <= 0 || $number_of_entities <= 0) {
36
  return $return;
37
  }
38
+ // Construct array of page urls
39
+ $ending_ellipsis = $starting_ellipsis = FALSE;
40
+ $number_of_pages = ceil($number_of_entities / $entities_per_page);
41
+ $pages = [];
42
+ for ($i = 1; $i <= $number_of_pages; $i++) {
43
+ if ($selected_page === $i) {
44
+ $pages[] = "<span class='current'>{$i}</span>";
45
+ } else {
46
+ $add = TRUE;
47
+ // We always show the first and last pages
48
+ // However, if the number of pages is created than 4
49
+ // then an ellipsis will sometimes appear after the first page
50
+ // or before the last page, depending on what the current page is
51
+ if ($number_of_pages > 4) {
52
+ if ($i == 1 || $i == $number_of_pages || $i == $selected_page - 1 || $i == $selected_page + 1) {
53
+ $add = TRUE;
54
  } else {
55
+ $add = FALSE;
56
+ if ($ending_ellipsis < 0 && $i > $selected_page) {
57
+ $pages[] = "<span class='ellipsis'>...</span>";
58
+ $ending_ellipsis = $i;
59
+ } else {
60
+ if ($starting_ellipsis < 0 && $i < $selected_page) {
61
+ $pages[] = "<span class='ellipsis'>...</span>";
62
+ $starting_ellipsis = $i;
63
+ }
64
  }
65
  }
66
  }
67
+ if ($add) {
68
+ $link = esc_attr($this->object->set_param_for($current_url, 'nggpage', $i));
69
+ $pages[] = "<a class='page-numbers' data-pageid='{$i}' href='{$link}'>{$i}</a>";
70
+ }
71
  }
72
+ }
73
+ // Next page
74
+ if ($selected_page + 1 <= $number_of_pages) {
75
+ $next_page = $selected_page + 1;
76
+ $link = $return['next'] = $this->object->set_param_for($current_url, 'nggpage', $next_page);
77
+ $pages[] = "<a class='prev' data-pageid={$next_page}>{$next_symbol}</a>";
78
+ }
79
+ // Prev page
80
+ if ($selected_page - 1 > 0) {
81
+ $prev_page = $selected_page - 1;
82
+ $link = $return['next'] = $this->object->set_param_for($current_url, 'nggpage', $prev_page);
83
+ array_unshift($pages, "<a class='next' data-pageid={$prev_page}>{$prev_symbol}</a>");
84
+ }
85
+ if ($pages) {
86
+ $return['output'] = "<div class='ngg-navigation'>" . implode("\n", $pages) . "</div>";
87
  }
88
  return $return;
89
  }
products/photocrati_nextgen/modules/nextgen_pagination/static/style.css CHANGED
@@ -29,6 +29,20 @@
29
  cursor: pointer !important;
30
  }
31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  .ngg-navigation span.current {
33
  background: #666;
34
  }
29
  cursor: pointer !important;
30
  }
31
 
32
+ .ngg-navigation .ellipsis {
33
+ background: #BBB;
34
+ border: none;
35
+ border-radius: 2px;
36
+ box-shadow: none;
37
+ color: #fff;
38
+ display:inline;
39
+ font-size: 14px;
40
+ font-weight: bold;
41
+ margin-right: 3px;
42
+ padding: 4px 8px;
43
+ text-decoration: none;
44
+ }
45
+
46
  .ngg-navigation span.current {
47
  background: #666;
48
  }
products/photocrati_nextgen/modules/nextgen_pagination/static/style.min.css CHANGED
@@ -1 +1 @@
1
- .ngg-navigation{font-size:.9em!important;clear:both!important;display:block!important;padding-top:24px;padding-bottom:3px;text-align:center}.ngg-navigation a.next,.ngg-navigation a.page-numbers,.ngg-navigation a.prev,.ngg-navigation span.current,.ngg-navigation span.next,.ngg-navigation span.page-numbers,.ngg-navigation span.prev{background:#BBB;border:none;border-radius:2px;box-shadow:none;color:#fff;display:inline;font-size:14px;font-weight:700;margin-right:3px;padding:4px 8px;text-decoration:none;cursor:pointer!important}.ngg-navigation span.current{background:#666}.ngg-navigation a.next,.ngg-navigation a.prev,.ngg-navigation span.next,.ngg-navigation span.prev{background:0 0;color:#BBB;padding:2px;border:none}.ngg-navigation a.page-numbers:hover,.ngg-navigation span.current:hover,.ngg-navigation span.page-numbers:hover{background:#666;color:#FFF!important;text-decoration:none!important}.ngg-navigation a.next:hover,.ngg-navigation a.prev:hover,.ngg-navigation span.next,.ngg-navigation span.prev{color:#666!important}.ngg-navigation a.page-numbers{display:inline}.ngg-clear{clear:both}
1
+ .ngg-navigation{font-size:.9em!important;clear:both!important;display:block!important;padding-top:24px;padding-bottom:3px;text-align:center}.ngg-navigation a.next,.ngg-navigation a.page-numbers,.ngg-navigation a.prev,.ngg-navigation span.current,.ngg-navigation span.next,.ngg-navigation span.page-numbers,.ngg-navigation span.prev{background:#BBB;border:none;border-radius:2px;box-shadow:none;color:#fff;display:inline;font-size:14px;font-weight:700;margin-right:3px;padding:4px 8px;text-decoration:none;cursor:pointer!important}.ngg-navigation .ellipsis{background:#BBB;border:none;border-radius:2px;box-shadow:none;color:#fff;display:inline;font-size:14px;font-weight:700;margin-right:3px;padding:4px 8px;text-decoration:none}.ngg-navigation span.current{background:#666}.ngg-navigation a.next,.ngg-navigation a.prev,.ngg-navigation span.next,.ngg-navigation span.prev{background:0 0;color:#BBB;padding:2px;border:none}.ngg-navigation a.page-numbers:hover,.ngg-navigation span.current:hover,.ngg-navigation span.page-numbers:hover{background:#666;color:#FFF!important;text-decoration:none!important}.ngg-navigation a.next:hover,.ngg-navigation a.prev:hover,.ngg-navigation span.next,.ngg-navigation span.prev{color:#666!important}.ngg-navigation a.page-numbers{display:inline}.ngg-clear{clear:both}
products/photocrati_nextgen/modules/ngglegacy/admin/ajax.php CHANGED
@@ -57,7 +57,22 @@ function ngg_ajax_operation() {
57
  break;
58
  case 'get_image_ids' :
59
  $result = nggAdmin::get_image_ids( $id );
60
- break;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
  default :
62
  do_action( 'ngg_ajax_' . $_POST['operation'] );
63
  die('-1');
57
  break;
58
  case 'get_image_ids' :
59
  $result = nggAdmin::get_image_ids( $id );
60
+ break;
61
+
62
+ // This will read the EXIF and then write it with the Orientation tag reset
63
+ case 'strip_orientation_tag':
64
+ $storage = C_Gallery_Storage::get_instance();
65
+ $image_path = $storage->get_image_abspath($id);
66
+ $backup_path = $image_path . '_backup';
67
+ $exif_abspath = @file_exists($backup_path) ? $backup_path : $image_path;
68
+ $exif_iptc = @C_Exif_Writer::read_metadata($exif_abspath);
69
+ foreach ($storage->get_image_sizes($id) as $size) {
70
+ if ($size === 'backup')
71
+ continue;
72
+ @C_Exif_Writer::write_metadata($storage->get_image_abspath($id, $size), $exif_iptc);
73
+ }
74
+ $result = '1';
75
+ break;
76
  default :
77
  do_action( 'ngg_ajax_' . $_POST['operation'] );
78
  die('-1');
products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php CHANGED
@@ -501,6 +501,7 @@ function nggallery_picturelist($controller)
501
  <option value="add_tags"><?php _e("Add tags",'nggallery'); ?></option>
502
  <option value="delete_tags"><?php _e("Delete tags",'nggallery'); ?></option>
503
  <option value="overwrite_tags"><?php _e("Overwrite tags",'nggallery'); ?></option>
 
504
  </select>
505
  <input class="button-primary"
506
  type="submit"
501
  <option value="add_tags"><?php _e("Add tags",'nggallery'); ?></option>
502
  <option value="delete_tags"><?php _e("Delete tags",'nggallery'); ?></option>
503
  <option value="overwrite_tags"><?php _e("Overwrite tags",'nggallery'); ?></option>
504
+ <option value="strip_orientation_tag"><?php _e("Remove EXIF Orientation",'nggallery'); ?></option>
505
  </select>
506
  <input class="button-primary"
507
  type="submit"
products/photocrati_nextgen/modules/ngglegacy/admin/manage.php CHANGED
@@ -689,6 +689,9 @@ class nggManageGallery {
689
  case 'set_watermark':
690
  nggAdmin::do_ajax_operation( 'set_watermark' , $_POST['doaction'], __('Set watermark', 'nggallery') );
691
  break;
 
 
 
692
  case 'delete_images':
693
  if ( is_array($_POST['doaction']) ) {
694
  foreach ( $_POST['doaction'] as $imageID ) {
689
  case 'set_watermark':
690
  nggAdmin::do_ajax_operation( 'set_watermark' , $_POST['doaction'], __('Set watermark', 'nggallery') );
691
  break;
692
+ case 'strip_orientation_tag':
693
+ nggAdmin::do_ajax_operation( 'strip_orientation_tag' , $_POST['doaction'], __('Remove EXIF Orientation', 'nggallery') );
694
+ break;
695
  case 'delete_images':
696
  if ( is_array($_POST['doaction']) ) {
697
  foreach ( $_POST['doaction'] as $imageID ) {
products/photocrati_nextgen/modules/ngglegacy/lib/core.php CHANGED
@@ -230,15 +230,4 @@ class nggGallery {
230
 
231
  return true;
232
  }
233
-
234
- /**
235
- * Show NextGEN Version in header
236
- * @since 1.9.0
237
- *
238
- * @return void
239
- */
240
- static function nextgen_version() {
241
- global $ngg;
242
- echo apply_filters('show_nextgen_version', '<!-- <meta name="NextGEN" version="'. $ngg->version . '" /> -->' . "\n");
243
- }
244
  }
230
 
231
  return true;
232
  }
 
 
 
 
 
 
 
 
 
 
 
233
  }
products/photocrati_nextgen/modules/ngglegacy/nggallery.php CHANGED
@@ -48,9 +48,6 @@ class nggLoader
48
 
49
  // Check for the header / footer
50
  add_action( 'init', array(&$this, 'test_head_footer_init' ) );
51
-
52
- // Show NextGEN version in header
53
- add_action('wp_head', array('nggGallery', 'nextgen_version') );
54
  }
55
 
56
  function start_plugin() {
48
 
49
  // Check for the header / footer
50
  add_action( 'init', array(&$this, 'test_head_footer_init' ) );
 
 
 
51
  }
52
 
53
  function start_plugin() {
readme.txt CHANGED
@@ -1,13 +1,13 @@
1
  === WordPress Gallery Plugin - NextGEN Gallery ===
2
  Contributors: photocrati, imagely
3
  Tags: wordpress gallery plugin, gallery, nextgen, nextgen gallery, photo gallery, image gallery, photography, slideshow, images, photo, photo album, watermark
4
- Requires at least: 5.2.0
5
- Stable tag: 3.5.0
6
- Tested up to: 5.6.0
7
  License: GPLv3
8
  Requires PHP: 5.6
9
 
10
- The most popular WordPress gallery plugin and one of the most popular plugins of all time with over 30 million downloads.
11
 
12
  == Description ==
13
 
@@ -180,6 +180,22 @@ For more information, feel free to visit the official website for the NextGEN Ga
180
 
181
  == Changelog ==
182
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
183
  = v3.5.0 - 12.17.2020 =
184
  * Changed: Deprecated legacy template functionality
185
  * Changed: Deprecated built-in custom style / CSS mechanism
1
  === WordPress Gallery Plugin - NextGEN Gallery ===
2
  Contributors: photocrati, imagely
3
  Tags: wordpress gallery plugin, gallery, nextgen, nextgen gallery, photo gallery, image gallery, photography, slideshow, images, photo, photo album, watermark
4
+ Requires at least: 5.4.0
5
+ Stable tag: 3.6.0
6
+ Tested up to: 5.6.1
7
  License: GPLv3
8
  Requires PHP: 5.6
9
 
10
+ The most popular WordPress gallery plugin and one of the most popular plugins of all time with over 31 million downloads.
11
 
12
  == Description ==
13
 
180
 
181
  == Changelog ==
182
 
183
+ = V3.6.0 - 02.10.2020 =
184
+ * NEW: Added new 'Bulk actions' option to remove EXIF Orientation from existing images (1137)
185
+ * NEW: Allow maximum_entity_limit display setting regardless of source (1146)
186
+ * NEW: Provide hooks to customize Uppy settings (1139)
187
+ * NEW: Recreated legacy templates as modern "views" (1127)
188
+ * Fixed: A compatibility warning with NextGEN Plus would appear when users had NextGEN Starter (1097)
189
+ * Fixed: Compatibility issue with Topscorer Theme (344171)
190
+ * Fixed: Compatibility with Custom Post Types UI (1076)
191
+ * Fixed: Compatibility with jQuery.mmenu (1140)
192
+ * Fixed: Disable marketing additions for users with NextGEN Starter enabled
193
+ * Fixed: Error responses from the server when uploading images failed were not specific (1121)
194
+ * Fixed: Image rotation not reliable (1137)
195
+ * Fixed: Imagebrowser pagination broke on images with UTF8 characters in their title (1135)
196
+ * Fixed: Shortcodes displaying albums did not appear in the order listed (1128)
197
+ * Fixed: Transient tracker was calling update_option() on every page (1074)
198
+
199
  = v3.5.0 - 12.17.2020 =
200
  * Changed: Deprecated legacy template functionality
201
  * Changed: Deprecated built-in custom style / CSS mechanism
vendor/bin/php-parse DELETED
@@ -1,205 +0,0 @@
1
- #!/usr/bin/env php
2
- <?php
3
-
4
- foreach ([__DIR__ . '/../../../autoload.php', __DIR__ . '/../vendor/autoload.php'] as $file) {
5
- if (file_exists($file)) {
6
- require $file;
7
- break;
8
- }
9
- }
10
-
11
- ini_set('xdebug.max_nesting_level', 3000);
12
-
13
- // Disable XDebug var_dump() output truncation
14
- ini_set('xdebug.var_display_max_children', -1);
15
- ini_set('xdebug.var_display_max_data', -1);
16
- ini_set('xdebug.var_display_max_depth', -1);
17
-
18
- list($operations, $files, $attributes) = parseArgs($argv);
19
-
20
- /* Dump nodes by default */
21
- if (empty($operations)) {
22
- $operations[] = 'dump';
23
- }
24
-
25
- if (empty($files)) {
26
- showHelp("Must specify at least one file.");
27
- }
28
-
29
- $lexer = new PhpParser\Lexer\Emulative(['usedAttributes' => [
30
- 'startLine', 'endLine', 'startFilePos', 'endFilePos', 'comments'
31
- ]]);
32
- $parser = (new PhpParser\ParserFactory)->create(
33
- PhpParser\ParserFactory::PREFER_PHP7,
34
- $lexer
35
- );
36
- $dumper = new PhpParser\NodeDumper([
37
- 'dumpComments' => true,
38
- 'dumpPositions' => $attributes['with-positions'],
39
- ]);
40
- $prettyPrinter = new PhpParser\PrettyPrinter\Standard;
41
-
42
- $traverser = new PhpParser\NodeTraverser();
43
- $traverser->addVisitor(new PhpParser\NodeVisitor\NameResolver);
44
-
45
- foreach ($files as $file) {
46
- if (strpos($file, '<?php') === 0) {
47
- $code = $file;
48
- fwrite(STDERR, "====> Code $code\n");
49
- } else {
50
- if (!file_exists($file)) {
51
- fwrite(STDERR, "File $file does not exist.\n");
52
- exit(1);
53
- }
54
-
55
- $code = file_get_contents($file);
56
- fwrite(STDERR, "====> File $file:\n");
57
- }
58
-
59
- if ($attributes['with-recovery']) {
60
- $errorHandler = new PhpParser\ErrorHandler\Collecting;
61
- $stmts = $parser->parse($code, $errorHandler);
62
- foreach ($errorHandler->getErrors() as $error) {
63
- $message = formatErrorMessage($error, $code, $attributes['with-column-info']);
64
- fwrite(STDERR, $message . "\n");
65
- }
66
- if (null === $stmts) {
67
- continue;
68
- }
69
- } else {
70
- try {
71
- $stmts = $parser->parse($code);
72
- } catch (PhpParser\Error $error) {
73
- $message = formatErrorMessage($error, $code, $attributes['with-column-info']);
74
- fwrite(STDERR, $message . "\n");
75
- exit(1);
76
- }
77
- }
78
-
79
- foreach ($operations as $operation) {
80
- if ('dump' === $operation) {
81
- fwrite(STDERR, "==> Node dump:\n");
82
- echo $dumper->dump($stmts, $code), "\n";
83
- } elseif ('pretty-print' === $operation) {
84
- fwrite(STDERR, "==> Pretty print:\n");
85
- echo $prettyPrinter->prettyPrintFile($stmts), "\n";
86
- } elseif ('json-dump' === $operation) {
87
- fwrite(STDERR, "==> JSON dump:\n");
88
- echo json_encode($stmts, JSON_PRETTY_PRINT), "\n";
89
- } elseif ('var-dump' === $operation) {
90
- fwrite(STDERR, "==> var_dump():\n");
91
- var_dump($stmts);
92
- } elseif ('resolve-names' === $operation) {
93
- fwrite(STDERR, "==> Resolved names.\n");
94
- $stmts = $traverser->traverse($stmts);
95
- }
96
- }
97
- }
98
-
99
- function formatErrorMessage(PhpParser\Error $e, $code, $withColumnInfo) {
100
- if ($withColumnInfo && $e->hasColumnInfo()) {
101
- return $e->getMessageWithColumnInfo($code);
102
- } else {
103
- return $e->getMessage();
104
- }
105
- }
106
-
107
- function showHelp($error = '') {
108
- if ($error) {
109
- fwrite(STDERR, $error . "\n\n");
110
- }
111
- fwrite($error ? STDERR : STDOUT, <<<OUTPUT
112
- Usage: php-parse [operations] file1.php [file2.php ...]
113
- or: php-parse [operations] "<?php code"
114
- Turn PHP source code into an abstract syntax tree.
115
-
116
- Operations is a list of the following options (--dump by default):
117
-
118
- -d, --dump Dump nodes using NodeDumper
119
- -p, --pretty-print Pretty print file using PrettyPrinter\Standard
120
- -j, --json-dump Print json_encode() result
121
- --var-dump var_dump() nodes (for exact structure)
122
- -N, --resolve-names Resolve names using NodeVisitor\NameResolver
123
- -c, --with-column-info Show column-numbers for errors (if available)
124
- -P, --with-positions Show positions in node dumps
125
- -r, --with-recovery Use parsing with error recovery
126
- -h, --help Display this page
127
-
128
- Example:
129
- php-parse -d -p -N -d file.php
130
-
131
- Dumps nodes, pretty prints them, then resolves names and dumps them again.
132
-
133
-
134
- OUTPUT
135
- );
136
- exit($error ? 1 : 0);
137
- }
138
-
139
- function parseArgs($args) {
140
- $operations = [];
141
- $files = [];
142
- $attributes = [
143
- 'with-column-info' => false,
144
- 'with-positions' => false,
145
- 'with-recovery' => false,
146
- ];
147
-
148
- array_shift($args);
149
- $parseOptions = true;
150
- foreach ($args as $arg) {
151
- if (!$parseOptions) {
152
- $files[] = $arg;
153
- continue;
154
- }
155
-
156
- switch ($arg) {
157
- case '--dump':
158
- case '-d':
159
- $operations[] = 'dump';
160
- break;
161
- case '--pretty-print':
162
- case '-p':
163
- $operations[] = 'pretty-print';
164
- break;
165
- case '--json-dump':
166
- case '-j':
167
- $operations[] = 'json-dump';
168
- break;
169
- case '--var-dump':
170
- $operations[] = 'var-dump';
171
- break;
172
- case '--resolve-names':
173
- case '-N';
174
- $operations[] = 'resolve-names';
175
- break;
176
- case '--with-column-info':
177
- case '-c';
178
- $attributes['with-column-info'] = true;
179
- break;
180
- case '--with-positions':
181
- case '-P':
182
- $attributes['with-positions'] = true;
183
- break;
184
- case '--with-recovery':
185
- case '-r':
186
- $attributes['with-recovery'] = true;
187
- break;
188
- case '--help':
189
- case '-h';
190
- showHelp();
191
- break;
192
- case '--':
193
- $parseOptions = false;
194
- break;
195
- default:
196
- if ($arg[0] === '-') {
197
- showHelp("Invalid operation $arg.");
198
- } else {
199
- $files[] = $arg;
200
- }
201
- }
202
- }
203
-
204
- return [$operations, $files, $attributes];
205
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/composer/autoload_psr4.php CHANGED
@@ -6,5 +6,4 @@ $vendorDir = dirname(dirname(__FILE__));
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
9
- 'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'),
10
  );
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
 
9
  );
vendor/composer/autoload_static.php CHANGED
@@ -11,20 +11,6 @@ class ComposerStaticInitd944cb3ad10f834222db970b76dd976d
11
  'a5dbe7df96665c0b6c16ae8d91231502' => __DIR__ . '/..' . '/imagely/pope-framework/lib/autoload.php',
12
  );
13
 
14
- public static $prefixLengthsPsr4 = array (
15
- 'P' =>
16
- array (
17
- 'PhpParser\\' => 10,
18
- ),
19
- );
20
-
21
- public static $prefixDirsPsr4 = array (
22
- 'PhpParser\\' =>
23
- array (
24
- 0 => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser',
25
- ),
26
- );
27
-
28
  public static $prefixesPsr0 = array (
29
  'H' =>
30
  array (
@@ -38,8 +24,6 @@ class ComposerStaticInitd944cb3ad10f834222db970b76dd976d
38
  public static function getInitializer(ClassLoader $loader)
39
  {
40
  return \Closure::bind(function () use ($loader) {
41
- $loader->prefixLengthsPsr4 = ComposerStaticInitd944cb3ad10f834222db970b76dd976d::$prefixLengthsPsr4;
42
- $loader->prefixDirsPsr4 = ComposerStaticInitd944cb3ad10f834222db970b76dd976d::$prefixDirsPsr4;
43
  $loader->prefixesPsr0 = ComposerStaticInitd944cb3ad10f834222db970b76dd976d::$prefixesPsr0;
44
 
45
  }, null, ClassLoader::class);
11
  'a5dbe7df96665c0b6c16ae8d91231502' => __DIR__ . '/..' . '/imagely/pope-framework/lib/autoload.php',
12
  );
13
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  public static $prefixesPsr0 = array (
15
  'H' =>
16
  array (
24
  public static function getInitializer(ClassLoader $loader)
25
  {
26
  return \Closure::bind(function () use ($loader) {
 
 
27
  $loader->prefixesPsr0 = ComposerStaticInitd944cb3ad10f834222db970b76dd976d::$prefixesPsr0;
28
 
29
  }, null, ClassLoader::class);
vendor/composer/installed.json CHANGED
@@ -15,7 +15,7 @@
15
  "shasum": "",
16
  "mirrors": [
17
  {
18
- "url": "https://repo.packagist.com/imagely/dists/%package%/%version%/%reference%.%type%",
19
  "preferred": true
20
  }
21
  ]
@@ -59,26 +59,26 @@
59
  },
60
  {
61
  "name": "imagely/pope-framework",
62
- "version": "v0.16",
63
- "version_normalized": "0.16.0.0",
64
  "source": {
65
  "type": "git",
66
  "url": "https://github.com/imagely/pope-framework.git",
67
- "reference": "a14bdc1f5153664770df00d53577a9954f1e691c"
68
  },
69
  "dist": {
70
  "type": "zip",
71
- "url": "https://api.github.com/repos/imagely/pope-framework/zipball/a14bdc1f5153664770df00d53577a9954f1e691c",
72
- "reference": "a14bdc1f5153664770df00d53577a9954f1e691c",
73
  "shasum": "",
74
  "mirrors": [
75
  {
76
- "url": "https://repo.packagist.com/imagely/dists/%package%/%version%/%reference%.%type%",
77
  "preferred": true
78
  }
79
  ]
80
  },
81
- "time": "2020-06-11T20:23:55+00:00",
82
  "type": "library",
83
  "installation-source": "dist",
84
  "autoload": {
@@ -98,68 +98,8 @@
98
  ],
99
  "description": "A component framework inspired by Zope 3. Pope is \"PHP's Zope\".",
100
  "support": {
101
- "source": "https://github.com/imagely/pope-framework/tree/v0.16",
102
  "issues": "https://github.com/imagely/pope-framework/issues"
103
  }
104
- },
105
- {
106
- "name": "nikic/php-parser",
107
- "version": "v4.5.0",
108
- "version_normalized": "4.5.0.0",
109
- "source": {
110
- "type": "git",
111
- "url": "https://github.com/nikic/PHP-Parser.git",
112
- "reference": "53c2753d756f5adb586dca79c2ec0e2654dd9463"
113
- },
114
- "dist": {
115
- "type": "zip",
116
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/53c2753d756f5adb586dca79c2ec0e2654dd9463",
117
- "reference": "53c2753d756f5adb586dca79c2ec0e2654dd9463",
118
- "shasum": "",
119
- "mirrors": [
120
- {
121
- "url": "https://repo.packagist.com/imagely/dists/%package%/%version%/%reference%.%type%",
122
- "preferred": true
123
- }
124
- ]
125
- },
126
- "require": {
127
- "ext-tokenizer": "*",
128
- "php": ">=7.0"
129
- },
130
- "require-dev": {
131
- "ircmaxell/php-yacc": "0.0.5",
132
- "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0"
133
- },
134
- "time": "2020-06-03T07:24:19+00:00",
135
- "bin": [
136
- "bin/php-parse"
137
- ],
138
- "type": "library",
139
- "extra": {
140
- "branch-alias": {
141
- "dev-master": "4.3-dev"
142
- }
143
- },
144
- "installation-source": "dist",
145
- "autoload": {
146
- "psr-4": {
147
- "PhpParser\\": "lib/PhpParser"
148
- }
149
- },
150
- "notification-url": "https://repo.packagist.com/imagely/downloads/",
151
- "license": [
152
- "BSD-3-Clause"
153
- ],
154
- "authors": [
155
- {
156
- "name": "Nikita Popov"
157
- }
158
- ],
159
- "description": "A PHP parser written in PHP",
160
- "keywords": [
161
- "parser",
162
- "php"
163
- ]
164
  }
165
  ]
15
  "shasum": "",
16
  "mirrors": [
17
  {
18
+ "url": "https://repo.packagist.com/imagely/dists/%package%/%version%/r%reference%.%type%",
19
  "preferred": true
20
  }
21
  ]
59
  },
60
  {
61
  "name": "imagely/pope-framework",
62
+ "version": "v0.17",
63
+ "version_normalized": "0.17.0.0",
64
  "source": {
65
  "type": "git",
66
  "url": "https://github.com/imagely/pope-framework.git",
67
+ "reference": "13da4d47779a91fbf07a68062e64974eb1427ef2"
68
  },
69
  "dist": {
70
  "type": "zip",
71
+ "url": "https://api.github.com/repos/imagely/pope-framework/zipball/13da4d47779a91fbf07a68062e64974eb1427ef2",
72
+ "reference": "13da4d47779a91fbf07a68062e64974eb1427ef2",
73
  "shasum": "",
74
  "mirrors": [
75
  {
76
+ "url": "https://repo.packagist.com/imagely/dists/%package%/%version%/r%reference%.%type%",
77
  "preferred": true
78
  }
79
  ]
80
  },
81
+ "time": "2020-10-22T19:43:52+00:00",
82
  "type": "library",
83
  "installation-source": "dist",
84
  "autoload": {
98
  ],
99
  "description": "A component framework inspired by Zope 3. Pope is \"PHP's Zope\".",
100
  "support": {
101
+ "source": "https://github.com/imagely/pope-framework/tree/v0.17",
102
  "issues": "https://github.com/imagely/pope-framework/issues"
103
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
  }
105
  ]
vendor/imagely/pope-framework/.gitignore ADDED
@@ -0,0 +1 @@
 
1
+ /vendor/
vendor/imagely/pope-framework/lib/autoload.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
 
3
  if (!defined('POPE_VERSION')) {
4
- define('POPE_VERSION', '0.14');
5
  require_once('class.pope_cache.php');
6
  require_once('class.extensibleobject.php');
7
  require_once('interface.component.php');
1
  <?php
2
 
3
  if (!defined('POPE_VERSION')) {
4
+ define('POPE_VERSION', '0.17');
5
  require_once('class.pope_cache.php');
6
  require_once('class.extensibleobject.php');
7
  require_once('interface.component.php');
vendor/imagely/pope-framework/lib/class.component_registry.php CHANGED
@@ -789,7 +789,7 @@ class C_Component_Registry
789
  {
790
  $retval = array();
791
  static $recursive_level = 0;
792
- static $exclusions = array('..', '.', 'error_log', 'README', 'CHANGELOG', 'readme.txt', 'changelog.txt', 'LICENSE');
793
  $recursive_level++;
794
 
795
  $abspath = str_replace(array('\\', '/'), DIRECTORY_SEPARATOR, $abspath);
@@ -910,4 +910,4 @@ class C_Component_Registry
910
  }
911
  }
912
  }
913
- }
789
  {
790
  $retval = array();
791
  static $recursive_level = 0;
792
+ static $exclusions = array('..', '.', 'error_log', 'README', 'CHANGELOG', 'readme.txt', 'changelog.txt', 'LICENSE', 'node_modules', 'vendor');
793
  $recursive_level++;
794
 
795
  $abspath = str_replace(array('\\', '/'), DIRECTORY_SEPARATOR, $abspath);
910
  }
911
  }
912
  }
913
+ }
vendor/nikic/php-parser/LICENSE DELETED
@@ -1,31 +0,0 @@
1
- Copyright (c) 2011-2018 by Nikita Popov.
2
-
3
- Some rights reserved.
4
-
5
- Redistribution and use in source and binary forms, with or without
6
- modification, are permitted provided that the following conditions are
7
- met:
8
-
9
- * Redistributions of source code must retain the above copyright
10
- notice, this list of conditions and the following disclaimer.
11
-
12
- * Redistributions in binary form must reproduce the above
13
- copyright notice, this list of conditions and the following
14
- disclaimer in the documentation and/or other materials provided
15
- with the distribution.
16
-
17
- * The names of the contributors may not be used to endorse or
18
- promote products derived from this software without specific
19
- prior written permission.
20
-
21
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/nikic/php-parser/README.md DELETED
@@ -1,225 +0,0 @@
1
- PHP Parser
2
- ==========
3
-
4
- [![Build Status](https://travis-ci.org/nikic/PHP-Parser.svg?branch=master)](https://travis-ci.org/nikic/PHP-Parser) [![Coverage Status](https://coveralls.io/repos/github/nikic/PHP-Parser/badge.svg?branch=master)](https://coveralls.io/github/nikic/PHP-Parser?branch=master)
5
-
6
- This is a PHP 5.2 to PHP 7.4 parser written in PHP. Its purpose is to simplify static code analysis and
7
- manipulation.
8
-
9
- [**Documentation for version 4.x**][doc_master] (stable; for running on PHP >= 7.0; for parsing PHP 5.2 to PHP 7.4).
10
-
11
- [Documentation for version 3.x][doc_3_x] (unsupported; for running on PHP >= 5.5; for parsing PHP 5.2 to PHP 7.2).
12
-
13
- Features
14
- --------
15
-
16
- The main features provided by this library are:
17
-
18
- * Parsing PHP 5 and PHP 7 code into an abstract syntax tree (AST).
19
- * Invalid code can be parsed into a partial AST.
20
- * The AST contains accurate location information.
21
- * Dumping the AST in human-readable form.
22
- * Converting an AST back to PHP code.
23
- * Experimental: Formatting can be preserved for partially changed ASTs.
24
- * Infrastructure to traverse and modify ASTs.
25
- * Resolution of namespaced names.
26
- * Evaluation of constant expressions.
27
- * Builders to simplify AST construction for code generation.
28
- * Converting an AST into JSON and back.
29
-
30
- Quick Start
31
- -----------
32
-
33
- Install the library using [composer](https://getcomposer.org):
34
-
35
- php composer.phar require nikic/php-parser
36
-
37
- Parse some PHP code into an AST and dump the result in human-readable form:
38
-
39
- ```php
40
- <?php
41
- use PhpParser\Error;
42
- use PhpParser\NodeDumper;
43
- use PhpParser\ParserFactory;
44
-
45
- $code = <<<'CODE'
46
- <?php
47
-
48
- function test($foo)
49
- {
50
- var_dump($foo);
51
- }
52
- CODE;
53
-
54
- $parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);
55
- try {
56
- $ast = $parser->parse($code);
57
- } catch (Error $error) {
58
- echo "Parse error: {$error->getMessage()}\n";
59
- return;
60
- }
61
-
62
- $dumper = new NodeDumper;
63
- echo $dumper->dump($ast) . "\n";
64
- ```
65
-
66
- This dumps an AST looking something like this:
67
-
68
- ```
69
- array(
70
- 0: Stmt_Function(
71
- byRef: false
72
- name: Identifier(
73
- name: test
74
- )
75
- params: array(
76
- 0: Param(
77
- type: null
78
- byRef: false
79
- variadic: false
80
- var: Expr_Variable(
81
- name: foo
82
- )
83
- default: null
84
- )
85
- )
86
- returnType: null
87
- stmts: array(
88
- 0: Stmt_Expression(
89
- expr: Expr_FuncCall(
90
- name: Name(
91
- parts: array(
92
- 0: var_dump
93
- )
94
- )
95
- args: array(
96
- 0: Arg(
97
- value: Expr_Variable(
98
- name: foo
99
- )
100
- byRef: false
101
- unpack: false
102
- )
103
- )
104
- )
105
- )
106
- )
107
- )
108
- )
109
- ```
110
-
111
- Let's traverse the AST and perform some kind of modification. For example, drop all function bodies:
112
-
113
- ```php
114
- use PhpParser\Node;
115
- use PhpParser\Node\Stmt\Function_;
116
- use PhpParser\NodeTraverser;
117
- use PhpParser\NodeVisitorAbstract;
118
-
119
- $traverser = new NodeTraverser();
120
- $traverser->addVisitor(new class extends NodeVisitorAbstract {
121
- public function enterNode(Node $node) {
122
- if ($node instanceof Function_) {
123
- // Clean out the function body
124
- $node->stmts = [];
125
- }
126
- }
127
- });
128
-
129
- $ast = $traverser->traverse($ast);
130
- echo $dumper->dump($ast) . "\n";
131
- ```
132
-
133
- This gives us an AST where the `Function_::$stmts` are empty:
134
-
135
- ```
136
- array(
137
- 0: Stmt_Function(
138
- byRef: false
139
- name: Identifier(
140
- name: test
141
- )
142
- params: array(
143
- 0: Param(
144
- type: null
145
- byRef: false
146
- variadic: false
147
- var: Expr_Variable(
148
- name: foo
149
- )
150
- default: null
151
- )
152
- )
153
- returnType: null
154
- stmts: array(
155
- )
156
- )
157
- )
158
- ```
159
-
160
- Finally, we can convert the new AST back to PHP code:
161
-
162
- ```php
163
- use PhpParser\PrettyPrinter;
164
-
165
- $prettyPrinter = new PrettyPrinter\Standard;
166
- echo $prettyPrinter->prettyPrintFile($ast);
167
- ```
168
-
169
- This gives us our original code, minus the `var_dump()` call inside the function:
170
-
171
- ```php
172
- <?php
173
-
174
- function test($foo)
175
- {
176
- }
177
- ```
178
-
179
- For a more comprehensive introduction, see the documentation.
180
-
181
- Documentation
182
- -------------
183
-
184
- 1. [Introduction](doc/0_Introduction.markdown)
185
- 2. [Usage of basic components](doc/2_Usage_of_basic_components.markdown)
186
-
187
- Component documentation:
188
-
189
- * [Walking the AST](doc/component/Walking_the_AST.markdown)
190
- * Node visitors
191
- * Modifying the AST from a visitor
192
- * Short-circuiting traversals
193
- * Interleaved visitors
194
- * Simple node finding API
195
- * Parent and sibling references
196
- * [Name resolution](doc/component/Name_resolution.markdown)
197
- * Name resolver options
198
- * Name resolution context
199
- * [Pretty printing](doc/component/Pretty_printing.markdown)
200
- * Converting AST back to PHP code
201
- * Customizing formatting
202
- * Formatting-preserving code transformations
203
- * [AST builders](doc/component/AST_builders.markdown)
204
- * Fluent builders for AST nodes
205
- * [Lexer](doc/component/Lexer.markdown)
206
- * Lexer options
207
- * Token and file positions for nodes
208
- * Custom attributes
209
- * [Error handling](doc/component/Error_handling.markdown)
210
- * Column information for errors
211
- * Error recovery (parsing of syntactically incorrect code)
212
- * [Constant expression evaluation](doc/component/Constant_expression_evaluation.markdown)
213
- * Evaluating constant/property/etc initializers
214
- * Handling errors and unsupported expressions
215
- * [JSON representation](doc/component/JSON_representation.markdown)
216
- * JSON encoding and decoding of ASTs
217
- * [Performance](doc/component/Performance.markdown)
218
- * Disabling XDebug
219
- * Reusing objects
220
- * Garbage collection impact
221
- * [Frequently asked questions](doc/component/FAQ.markdown)
222
- * Parent and sibling references
223
-
224
- [doc_3_x]: https://github.com/nikic/PHP-Parser/tree/3.x/doc
225
- [doc_master]: https://github.com/nikic/PHP-Parser/tree/master/doc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/nikic/php-parser/bin/php-parse DELETED
@@ -1,205 +0,0 @@
1
- #!/usr/bin/env php
2
- <?php
3
-
4
- foreach ([__DIR__ . '/../../../autoload.php', __DIR__ . '/../vendor/autoload.php'] as $file) {
5
- if (file_exists($file)) {
6
- require $file;
7
- break;
8
- }
9
- }
10
-
11
- ini_set('xdebug.max_nesting_level', 3000);
12
-
13
- // Disable XDebug var_dump() output truncation
14
- ini_set('xdebug.var_display_max_children', -1);
15
- ini_set('xdebug.var_display_max_data', -1);
16
- ini_set('xdebug.var_display_max_depth', -1);
17
-
18
- list($operations, $files, $attributes) = parseArgs($argv);
19
-
20
- /* Dump nodes by default */
21
- if (empty($operations)) {
22
- $operations[] = 'dump';
23
- }
24
-
25
- if (empty($files)) {
26
- showHelp("Must specify at least one file.");
27
- }
28
-
29
- $lexer = new PhpParser\Lexer\Emulative(['usedAttributes' => [
30
- 'startLine', 'endLine', 'startFilePos', 'endFilePos', 'comments'
31
- ]]);
32
- $parser = (new PhpParser\ParserFactory)->create(
33
- PhpParser\ParserFactory::PREFER_PHP7,
34
- $lexer
35
- );
36
- $dumper = new PhpParser\NodeDumper([
37
- 'dumpComments' => true,
38
- 'dumpPositions' => $attributes['with-positions'],
39
- ]);
40
- $prettyPrinter = new PhpParser\PrettyPrinter\Standard;
41
-
42
- $traverser = new PhpParser\NodeTraverser();
43
- $traverser->addVisitor(new PhpParser\NodeVisitor\NameResolver);
44
-
45
- foreach ($files as $file) {
46
- if (strpos($file, '<?php') === 0) {
47
- $code = $file;
48
- fwrite(STDERR, "====> Code $code\n");
49
- } else {
50
- if (!file_exists($file)) {
51
- fwrite(STDERR, "File $file does not exist.\n");
52
- exit(1);
53
- }
54
-
55
- $code = file_get_contents($file);
56
- fwrite(STDERR, "====> File $file:\n");
57
- }
58
-
59
- if ($attributes['with-recovery']) {
60
- $errorHandler = new PhpParser\ErrorHandler\Collecting;
61
- $stmts = $parser->parse($code, $errorHandler);
62
- foreach ($errorHandler->getErrors() as $error) {
63
- $message = formatErrorMessage($error, $code, $attributes['with-column-info']);
64
- fwrite(STDERR, $message . "\n");
65
- }
66
- if (null === $stmts) {
67
- continue;
68
- }
69
- } else {
70
- try {
71
- $stmts = $parser->parse($code);
72
- } catch (PhpParser\Error $error) {
73
- $message = formatErrorMessage($error, $code, $attributes['with-column-info']);
74
- fwrite(STDERR, $message . "\n");
75
- exit(1);
76
- }
77
- }
78
-
79
- foreach ($operations as $operation) {
80
- if ('dump' === $operation) {
81
- fwrite(STDERR, "==> Node dump:\n");
82
- echo $dumper->dump($stmts, $code), "\n";
83
- } elseif ('pretty-print' === $operation) {
84
- fwrite(STDERR, "==> Pretty print:\n");
85
- echo $prettyPrinter->prettyPrintFile($stmts), "\n";
86
- } elseif ('json-dump' === $operation) {
87
- fwrite(STDERR, "==> JSON dump:\n");
88
- echo json_encode($stmts, JSON_PRETTY_PRINT), "\n";
89
- } elseif ('var-dump' === $operation) {
90
- fwrite(STDERR, "==> var_dump():\n");
91
- var_dump($stmts);
92
- } elseif ('resolve-names' === $operation) {
93
- fwrite(STDERR, "==> Resolved names.\n");
94
- $stmts = $traverser->traverse($stmts);
95
- }
96
- }
97
- }
98
-
99
- function formatErrorMessage(PhpParser\Error $e, $code, $withColumnInfo) {
100
- if ($withColumnInfo && $e->hasColumnInfo()) {
101
- return $e->getMessageWithColumnInfo($code);
102
- } else {
103
- return $e->getMessage();
104
- }
105
- }
106
-
107
- function showHelp($error = '') {
108
- if ($error) {
109
- fwrite(STDERR, $error . "\n\n");
110
- }
111
- fwrite($error ? STDERR : STDOUT, <<<OUTPUT
112
- Usage: php-parse [operations] file1.php [file2.php ...]
113
- or: php-parse [operations] "<?php code"
114
- Turn PHP source code into an abstract syntax tree.
115
-
116
- Operations is a list of the following options (--dump by default):
117
-
118
- -d, --dump Dump nodes using NodeDumper
119
- -p, --pretty-print Pretty print file using PrettyPrinter\Standard
120
- -j, --json-dump Print json_encode() result
121
- --var-dump var_dump() nodes (for exact structure)
122
- -N, --resolve-names Resolve names using NodeVisitor\NameResolver
123
- -c, --with-column-info Show column-numbers for errors (if available)
124
- -P, --with-positions Show positions in node dumps
125
- -r, --with-recovery Use parsing with error recovery
126
- -h, --help Display this page
127
-
128
- Example:
129
- php-parse -d -p -N -d file.php
130
-
131
- Dumps nodes, pretty prints them, then resolves names and dumps them again.
132
-
133
-
134
- OUTPUT
135
- );
136
- exit($error ? 1 : 0);
137
- }
138
-
139
- function parseArgs($args) {
140
- $operations = [];
141
- $files = [];
142
- $attributes = [
143
- 'with-column-info' => false,
144
- 'with-positions' => false,
145
- 'with-recovery' => false,
146
- ];
147
-
148
- array_shift($args);
149
- $parseOptions = true;
150
- foreach ($args as $arg) {
151
- if (!$parseOptions) {
152
- $files[] = $arg;
153
- continue;
154
- }
155
-
156
- switch ($arg) {
157
- case '--dump':
158
- case '-d':
159
- $operations[] = 'dump';
160
- break;
161
- case '--pretty-print':
162
- case '-p':
163
- $operations[] = 'pretty-print';
164
- break;
165
- case '--json-dump':
166
- case '-j':
167
- $operations[] = 'json-dump';
168
- break;
169
- case '--var-dump':
170
- $operations[] = 'var-dump';
171
- break;
172
- case '--resolve-names':
173
- case '-N';
174
- $operations[] = 'resolve-names';
175
- break;
176
- case '--with-column-info':
177
- case '-c';
178
- $attributes['with-column-info'] = true;
179
- break;
180
- case '--with-positions':
181
- case '-P':
182
- $attributes['with-positions'] = true;
183
- break;
184
- case '--with-recovery':
185
- case '-r':
186
- $attributes['with-recovery'] = true;
187
- break;
188
- case '--help':
189
- case '-h';
190
- showHelp();
191
- break;
192
- case '--':
193
- $parseOptions = false;
194
- break;
195
- default:
196
- if ($arg[0] === '-') {
197
- showHelp("Invalid operation $arg.");
198
- } else {
199
- $files[] = $arg;
200
- }
201
- }
202
- }
203
-
204
- return [$operations, $files, $attributes];
205
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/nikic/php-parser/composer.json DELETED
@@ -1,41 +0,0 @@
1
- {
2
- "name": "nikic/php-parser",
3
- "type": "library",
4
- "description": "A PHP parser written in PHP",
5
- "keywords": [
6
- "php",
7
- "parser"
8
- ],
9
- "license": "BSD-3-Clause",
10
- "authors": [
11
- {
12
- "name": "Nikita Popov"
13
- }
14
- ],
15
- "require": {
16
- "php": ">=7.0",
17
- "ext-tokenizer": "*"
18
- },
19
- "require-dev": {
20
- "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0",
21
- "ircmaxell/php-yacc": "0.0.5"
22
- },
23
- "extra": {
24
- "branch-alias": {
25
- "dev-master": "4.3-dev"
26
- }
27
- },
28
- "autoload": {
29
- "psr-4": {
30
- "PhpParser\\": "lib/PhpParser"
31
- }
32
- },
33
- "autoload-dev": {
34
- "psr-4": {
35
- "PhpParser\\": "test/PhpParser/"
36
- }
37
- },
38
- "bin": [
39
- "bin/php-parse"
40
- ]
41
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/nikic/php-parser/grammar/README.md DELETED
@@ -1,30 +0,0 @@
1
- What do all those files mean?
2
- =============================
3
-
4
- * `php5.y`: PHP 5 grammar written in a pseudo language
5
- * `php7.y`: PHP 7 grammar written in a pseudo language
6
- * `tokens.y`: Tokens definition shared between PHP 5 and PHP 7 grammars
7
- * `parser.template`: A `kmyacc` parser prototype file for PHP
8
- * `tokens.template`: A `kmyacc` prototype file for the `Tokens` class
9
- * `rebuildParsers.php`: Preprocesses the grammar and builds the parser using `kmyacc`
10
-
11
- .phpy pseudo language
12
- =====================
13
-
14
- The `.y` file is a normal grammar in `kmyacc` (`yacc`) style, with some transformations
15
- applied to it:
16
-
17
- * Nodes are created using the syntax `Name[..., ...]`. This is transformed into
18
- `new Name(..., ..., attributes())`
19
- * Some function-like constructs are resolved (see `rebuildParsers.php` for a list)
20
-
21
- Building the parser
22
- ===================
23
-
24
- Run `php grammar/rebuildParsers.php` to rebuild the parsers. Additional options:
25
-
26
- * The `KMYACC` environment variable can be used to specify an alternative `kmyacc` binary.
27
- By default the `phpyacc` dev dependency will be used. To use the original `kmyacc`, you
28
- need to compile [moriyoshi's fork](https://github.com/moriyoshi/kmyacc-forked).
29
- * The `--debug` option enables emission of debug symbols and creates the `y.output` file.
30
- * The `--keep-tmp-grammar` option preserves the preprocessed grammar file.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/nikic/php-parser/grammar/parser.template DELETED
@@ -1,106 +0,0 @@
1
- <?php
2
- $meta #
3
- #semval($) $this->semValue
4
- #semval($,%t) $this->semValue
5
- #semval(%n) $stackPos-(%l-%n)
6
- #semval(%n,%t) $stackPos-(%l-%n)
7
-
8
- namespace PhpParser\Parser;
9
-
10
- use PhpParser\Error;
11
- use PhpParser\Node;
12
- use PhpParser\Node\Expr;
13
- use PhpParser\Node\Name;
14
- use PhpParser\Node\Scalar;
15
- use PhpParser\Node\Stmt;
16
- #include;
17
-
18
- /* This is an automatically GENERATED file, which should not be manually edited.
19
- * Instead edit one of the following:
20
- * * the grammar files grammar/php5.y or grammar/php7.y
21
- * * the skeleton file grammar/parser.template
22
- * * the preprocessing script grammar/rebuildParsers.php
23
- */
24
- class #(-p) extends \PhpParser\ParserAbstract
25
- {
26
- protected $tokenToSymbolMapSize = #(YYMAXLEX);
27
- protected $actionTableSize = #(YYLAST);
28
- protected $gotoTableSize = #(YYGLAST);
29
-
30
- protected $invalidSymbol = #(YYBADCH);
31
- protected $errorSymbol = #(YYINTERRTOK);
32
- protected $defaultAction = #(YYDEFAULT);
33
- protected $unexpectedTokenRule = #(YYUNEXPECTED);
34
-
35
- protected $YY2TBLSTATE = #(YY2TBLSTATE);
36
- protected $numNonLeafStates = #(YYNLSTATES);
37
-
38
- protected $symbolToName = array(
39
- #listvar terminals
40
- );
41
-
42
- protected $tokenToSymbol = array(
43
- #listvar yytranslate
44
- );
45
-
46
- protected $action = array(
47
- #listvar yyaction
48
- );
49
-
50
- protected $actionCheck = array(
51
- #listvar yycheck
52
- );
53
-
54
- protected $actionBase = array(
55
- #listvar yybase
56
- );
57
-
58
- protected $actionDefault = array(
59
- #listvar yydefault
60
- );
61
-
62
- protected $goto = array(
63
- #listvar yygoto
64
- );
65
-
66
- protected $gotoCheck = array(
67
- #listvar yygcheck
68
- );
69
-
70
- protected $gotoBase = array(
71
- #listvar yygbase
72
- );
73
-
74
- protected $gotoDefault = array(
75
- #listvar yygdefault
76
- );
77
-
78
- protected $ruleToNonTerminal = array(
79
- #listvar yylhs
80
- );
81
-
82
- protected $ruleToLength = array(
83
- #listvar yylen
84
- );
85
- #if -t
86
-
87
- protected $productions = array(
88
- #production-strings;
89
- );
90
- #endif
91
-
92
- protected function initReduceCallbacks() {
93
- $this->reduceCallbacks = [
94
- #reduce
95
- %n => function ($stackPos) {
96
- %b
97
- },
98
- #noact
99
- %n => function ($stackPos) {
100
- $this->semValue = $this->semStack[$stackPos];
101
- },
102
- #endreduce
103
- ];
104
- }
105
- }
106
- #tailcode;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/nikic/php-parser/grammar/php5.y DELETED
@@ -1,1026 +0,0 @@
1
- %pure_parser
2
- %expect 6
3
-
4
- %tokens
5
-
6
- %%
7
-
8
- start:
9
- top_statement_list { $$ = $this->handleNamespaces($1); }
10
- ;
11
-
12
- top_statement_list_ex:
13
- top_statement_list_ex top_statement { pushNormalizing($1, $2); }
14
- | /* empty */ { init(); }
15
- ;
16
-
17
- top_statement_list:
18
- top_statement_list_ex
19
- { makeZeroLengthNop($nop, $this->lookaheadStartAttributes);
20
- if ($nop !== null) { $1[] = $nop; } $$ = $1; }
21
- ;
22
-
23
- reserved_non_modifiers:
24
- T_INCLUDE | T_INCLUDE_ONCE | T_EVAL | T_REQUIRE | T_REQUIRE_ONCE | T_LOGICAL_OR | T_LOGICAL_XOR | T_LOGICAL_AND
25
- | T_INSTANCEOF | T_NEW | T_CLONE | T_EXIT | T_IF | T_ELSEIF | T_ELSE | T_ENDIF | T_ECHO | T_DO | T_WHILE
26
- | T_ENDWHILE | T_FOR | T_ENDFOR | T_FOREACH | T_ENDFOREACH | T_DECLARE | T_ENDDECLARE | T_AS | T_TRY | T_CATCH
27
- | T_FINALLY | T_THROW | T_USE | T_INSTEADOF | T_GLOBAL | T_VAR | T_UNSET | T_ISSET | T_EMPTY | T_CONTINUE | T_GOTO
28
- | T_FUNCTION | T_CONST | T_RETURN | T_PRINT | T_YIELD | T_LIST | T_SWITCH | T_ENDSWITCH | T_CASE | T_DEFAULT
29
- | T_BREAK | T_ARRAY | T_CALLABLE | T_EXTENDS | T_IMPLEMENTS | T_NAMESPACE | T_TRAIT | T_INTERFACE | T_CLASS
30
- | T_CLASS_C | T_TRAIT_C | T_FUNC_C | T_METHOD_C | T_LINE | T_FILE | T_DIR | T_NS_C | T_HALT_COMPILER | T_FN
31
- ;
32
-
33
- semi_reserved:
34
- reserved_non_modifiers
35
- | T_STATIC | T_ABSTRACT | T_FINAL | T_PRIVATE | T_PROTECTED | T_PUBLIC
36
- ;
37
-
38
- identifier_ex:
39
- T_STRING { $$ = Node\Identifier[$1]; }
40
- | semi_reserved { $$ = Node\Identifier[$1]; }
41
- ;
42
-
43
- identifier:
44
- T_STRING { $$ = Node\Identifier[$1]; }
45
- ;
46
-
47
- reserved_non_modifiers_identifier:
48
- reserved_non_modifiers { $$ = Node\Identifier[$1]; }
49
- ;
50
-
51
- namespace_name_parts:
52
- T_STRING { init($1); }
53
- | namespace_name_parts T_NS_SEPARATOR T_STRING { push($1, $3); }
54
- ;
55
-
56
- namespace_name:
57
- namespace_name_parts { $$ = Name[$1]; }
58
- ;
59
-
60
- plain_variable:
61
- T_VARIABLE { $$ = Expr\Variable[parseVar($1)]; }
62
- ;
63
-
64
- top_statement:
65
- statement { $$ = $1; }
66
- | function_declaration_statement { $$ = $1; }
67
- | class_declaration_statement { $$ = $1; }
68
- | T_HALT_COMPILER
69
- { $$ = Stmt\HaltCompiler[$this->lexer->handleHaltCompiler()]; }
70
- | T_NAMESPACE namespace_name ';'
71
- { $$ = Stmt\Namespace_[$2, null];
72
- $$->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON);
73
- $this->checkNamespace($$); }
74
- | T_NAMESPACE namespace_name '{' top_statement_list '}'
75
- { $$ = Stmt\Namespace_[$2, $4];
76
- $$->setAttribute('kind', Stmt\Namespace_::KIND_BRACED);
77
- $this->checkNamespace($$); }
78
- | T_NAMESPACE '{' top_statement_list '}'
79
- { $$ = Stmt\Namespace_[null, $3];
80
- $$->setAttribute('kind', Stmt\Namespace_::KIND_BRACED);
81
- $this->checkNamespace($$); }
82
- | T_USE use_declarations ';' { $$ = Stmt\Use_[$2, Stmt\Use_::TYPE_NORMAL]; }
83
- | T_USE use_type use_declarations ';' { $$ = Stmt\Use_[$3, $2]; }
84
- | group_use_declaration ';' { $$ = $1; }
85
- | T_CONST constant_declaration_list ';' { $$ = Stmt\Const_[$2]; }
86
- ;
87
-
88
- use_type:
89
- T_FUNCTION { $$ = Stmt\Use_::TYPE_FUNCTION; }
90
- | T_CONST { $$ = Stmt\Use_::TYPE_CONSTANT; }
91
- ;
92
-
93
- /* Using namespace_name_parts here to avoid s/r conflict on T_NS_SEPARATOR */
94
- group_use_declaration:
95
- T_USE use_type namespace_name_parts T_NS_SEPARATOR '{' unprefixed_use_declarations '}'
96
- { $$ = Stmt\GroupUse[new Name($3, stackAttributes(#3)), $6, $2]; }
97
- | T_USE use_type T_NS_SEPARATOR namespace_name_parts T_NS_SEPARATOR '{' unprefixed_use_declarations '}'
98
- { $$ = Stmt\GroupUse[new Name($4, stackAttributes(#4)), $7, $2]; }
99
- | T_USE namespace_name_parts T_NS_SEPARATOR '{' inline_use_declarations '}'
100
- { $$ = Stmt\GroupUse[new Name($2, stackAttributes(#2)), $5, Stmt\Use_::TYPE_UNKNOWN]; }
101
- | T_USE T_NS_SEPARATOR namespace_name_parts T_NS_SEPARATOR '{' inline_use_declarations '}'
102
- { $$ = Stmt\GroupUse[new Name($3, stackAttributes(#3)), $6, Stmt\Use_::TYPE_UNKNOWN]; }
103
- ;
104
-
105
- unprefixed_use_declarations:
106
- unprefixed_use_declarations ',' unprefixed_use_declaration
107
- { push($1, $3); }
108
- | unprefixed_use_declaration { init($1); }
109
- ;
110
-
111
- use_declarations:
112
- use_declarations ',' use_declaration { push($1, $3); }
113
- | use_declaration { init($1); }
114
- ;
115
-
116
- inline_use_declarations:
117
- inline_use_declarations ',' inline_use_declaration { push($1, $3); }
118
- | inline_use_declaration { init($1); }
119
- ;
120
-
121
- unprefixed_use_declaration:
122
- namespace_name
123
- { $$ = Stmt\UseUse[$1, null, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #1); }
124
- | namespace_name T_AS identifier
125
- { $$ = Stmt\UseUse[$1, $3, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #3); }
126
- ;
127
-
128
- use_declaration:
129
- unprefixed_use_declaration { $$ = $1; }
130
- | T_NS_SEPARATOR unprefixed_use_declaration { $$ = $2; }
131
- ;
132
-
133
- inline_use_declaration:
134
- unprefixed_use_declaration { $$ = $1; $$->type = Stmt\Use_::TYPE_NORMAL; }
135
- | use_type unprefixed_use_declaration { $$ = $2; $$->type = $1; }
136
- ;
137
-
138
- constant_declaration_list:
139
- constant_declaration_list ',' constant_declaration { push($1, $3); }
140
- | constant_declaration { init($1); }
141
- ;
142
-
143
- constant_declaration:
144
- identifier '=' static_scalar { $$ = Node\Const_[$1, $3]; }
145
- ;
146
-
147
- class_const_list:
148
- class_const_list ',' class_const { push($1, $3); }
149
- | class_const { init($1); }
150
- ;
151
-
152
- class_const:
153
- identifier_ex '=' static_scalar { $$ = Node\Const_[$1, $3]; }
154
- ;
155
-
156
- inner_statement_list_ex:
157
- inner_statement_list_ex inner_statement { pushNormalizing($1, $2); }
158
- | /* empty */ { init(); }
159
- ;
160
-
161
- inner_statement_list:
162
- inner_statement_list_ex
163
- { makeZeroLengthNop($nop, $this->lookaheadStartAttributes);
164
- if ($nop !== null) { $1[] = $nop; } $$ = $1; }
165
- ;
166
-
167
- inner_statement:
168
- statement { $$ = $1; }
169
- | function_declaration_statement { $$ = $1; }
170
- | class_declaration_statement { $$ = $1; }
171
- | T_HALT_COMPILER
172
- { throw new Error('__HALT_COMPILER() can only be used from the outermost scope', attributes()); }
173
- ;
174
-
175
- non_empty_statement:
176
- '{' inner_statement_list '}'
177
- {
178
- if ($2) {
179
- $$ = $2; prependLeadingComments($$);
180
- } else {
181
- makeNop($$, $this->startAttributeStack[#1], $this->endAttributes);
182
- if (null === $$) { $$ = array(); }
183
- }
184
- }
185
- | T_IF parentheses_expr statement elseif_list else_single
186
- { $$ = Stmt\If_[$2, ['stmts' => toArray($3), 'elseifs' => $4, 'else' => $5]]; }
187
- | T_IF parentheses_expr ':' inner_statement_list new_elseif_list new_else_single T_ENDIF ';'
188
- { $$ = Stmt\If_[$2, ['stmts' => $4, 'elseifs' => $5, 'else' => $6]]; }
189
- | T_WHILE parentheses_expr while_statement { $$ = Stmt\While_[$2, $3]; }
190
- | T_DO statement T_WHILE parentheses_expr ';' { $$ = Stmt\Do_ [$4, toArray($2)]; }
191
- | T_FOR '(' for_expr ';' for_expr ';' for_expr ')' for_statement
192
- { $$ = Stmt\For_[['init' => $3, 'cond' => $5, 'loop' => $7, 'stmts' => $9]]; }
193
- | T_SWITCH parentheses_expr switch_case_list { $$ = Stmt\Switch_[$2, $3]; }
194
- | T_BREAK ';' { $$ = Stmt\Break_[null]; }
195
- | T_BREAK expr ';' { $$ = Stmt\Break_[$2]; }
196
- | T_CONTINUE ';' { $$ = Stmt\Continue_[null]; }
197
- | T_CONTINUE expr ';' { $$ = Stmt\Continue_[$2]; }
198
- | T_RETURN ';' { $$ = Stmt\Return_[null]; }
199
- | T_RETURN expr ';' { $$ = Stmt\Return_[$2]; }
200
- | T_GLOBAL global_var_list ';' { $$ = Stmt\Global_[$2]; }
201
- | T_STATIC static_var_list ';' { $$ = Stmt\Static_[$2]; }
202
- | T_ECHO expr_list ';' { $$ = Stmt\Echo_[$2]; }
203
- | T_INLINE_HTML { $$ = Stmt\InlineHTML[$1]; }
204
- | yield_expr ';' { $$ = Stmt\Expression[$1]; }
205
- | expr ';' { $$ = Stmt\Expression[$1]; }
206
- | T_UNSET '(' variables_list ')' ';' { $$ = Stmt\Unset_[$3]; }
207
- | T_FOREACH '(' expr T_AS foreach_variable ')' foreach_statement
208
- { $$ = Stmt\Foreach_[$3, $5[0], ['keyVar' => null, 'byRef' => $5[1], 'stmts' => $7]]; }
209
- | T_FOREACH '(' expr T_AS variable T_DOUBLE_ARROW foreach_variable ')' foreach_statement
210
- { $$ = Stmt\Foreach_[$3, $7[0], ['keyVar' => $5, 'byRef' => $7[1], 'stmts' => $9]]; }
211
- | T_DECLARE '(' declare_list ')' declare_statement { $$ = Stmt\Declare_[$3, $5]; }
212
- | T_TRY '{' inner_statement_list '}' catches optional_finally
213
- { $$ = Stmt\TryCatch[$3, $5, $6]; $this->checkTryCatch($$); }
214
- | T_THROW expr ';' { $$ = Stmt\Throw_[$2]; }
215
- | T_GOTO identifier ';' { $$ = Stmt\Goto_[$2]; }
216
- | identifier ':' { $$ = Stmt\Label[$1]; }
217
- | expr error { $$ = Stmt\Expression[$1]; }
218
- | error { $$ = array(); /* means: no statement */ }
219
- ;
220
-
221
- statement:
222
- non_empty_statement { $$ = $1; }
223
- | ';'
224
- { makeNop($$, $this->startAttributeStack[#1], $this->endAttributes);
225
- if ($$ === null) $$ = array(); /* means: no statement */ }
226
- ;
227
-
228
- catches:
229
- /* empty */ { init(); }
230
- | catches catch { push($1, $2); }
231
- ;
232
-
233
- catch:
234
- T_CATCH '(' name plain_variable ')' '{' inner_statement_list '}'
235
- { $$ = Stmt\Catch_[array($3), $4, $7]; }
236
- ;
237
-
238
- optional_finally:
239
- /* empty */ { $$ = null; }
240
- | T_FINALLY '{' inner_statement_list '}' { $$ = Stmt\Finally_[$3]; }
241
- ;
242
-
243
- variables_list:
244
- variable { init($1); }
245
- | variables_list ',' variable { push($1, $3); }
246
- ;
247
-
248
- optional_ref:
249
- /* empty */ { $$ = false; }
250
- | '&' { $$ = true; }
251
- ;
252
-
253
- optional_ellipsis:
254
- /* empty */ { $$ = false; }
255
- | T_ELLIPSIS { $$ = true; }
256
- ;
257
-
258
- function_declaration_statement:
259
- T_FUNCTION optional_ref identifier '(' parameter_list ')' optional_return_type '{' inner_statement_list '}'
260
- { $$ = Stmt\Function_[$3, ['byRef' => $2, 'params' => $5, 'returnType' => $7, 'stmts' => $9]]; }
261
- ;
262
-
263
- class_declaration_statement:
264
- class_entry_type identifier extends_from implements_list '{' class_statement_list '}'
265
- { $$ = Stmt\Class_[$2, ['type' => $1, 'extends' => $3, 'implements' => $4, 'stmts' => $6]];
266
- $this->checkClass($$, #2); }
267
- | T_INTERFACE identifier interface_extends_list '{' class_statement_list '}'
268
- { $$ = Stmt\Interface_[$2, ['extends' => $3, 'stmts' => $5]];
269
- $this->checkInterface($$, #2); }
270
- | T_TRAIT identifier '{' class_statement_list '}'
271
- { $$ = Stmt\Trait_[$2, ['stmts' => $4]]; }
272
- ;
273
-
274
- class_entry_type:
275
- T_CLASS { $$ = 0; }
276
- | T_ABSTRACT T_CLASS { $$ = Stmt\Class_::MODIFIER_ABSTRACT; }
277
- | T_FINAL T_CLASS { $$ = Stmt\Class_::MODIFIER_FINAL; }
278
- ;
279
-
280
- extends_from:
281
- /* empty */ { $$ = null; }
282
- | T_EXTENDS class_name { $$ = $2; }
283
- ;
284
-
285
- interface_extends_list:
286
- /* empty */ { $$ = array(); }
287
- | T_EXTENDS class_name_list { $$ = $2; }
288
- ;
289
-
290
- implements_list:
291
- /* empty */ { $$ = array(); }
292
- | T_IMPLEMENTS class_name_list { $$ = $2; }
293
- ;
294
-
295
- class_name_list:
296
- class_name { init($1); }
297
- | class_name_list ',' class_name { push($1, $3); }
298
- ;
299
-
300
- for_statement:
301
- statement { $$ = toArray($1); }
302
- | ':' inner_statement_list T_ENDFOR ';' { $$ = $2; }
303
- ;
304
-
305
- foreach_statement:
306
- statement { $$ = toArray($1); }
307
- | ':' inner_statement_list T_ENDFOREACH ';' { $$ = $2; }
308
- ;
309
-
310
- declare_statement:
311
- non_empty_statement { $$ = toArray($1); }
312
- | ';' { $$ = null; }
313
- | ':' inner_statement_list T_ENDDECLARE ';' { $$ = $2; }
314
- ;
315
-
316
- declare_list:
317
- declare_list_element { init($1); }
318
- | declare_list ',' declare_list_element { push($1, $3); }
319
- ;
320
-
321
- declare_list_element:
322
- identifier '=' static_scalar { $$ = Stmt\DeclareDeclare[$1, $3]; }
323
- ;
324
-
325
- switch_case_list:
326
- '{' case_list '}' { $$ = $2; }
327
- | '{' ';' case_list '}' { $$ = $3; }
328
- | ':' case_list T_ENDSWITCH ';' { $$ = $2; }
329
- | ':' ';' case_list T_ENDSWITCH ';' { $$ = $3; }
330
- ;
331
-
332
- case_list:
333
- /* empty */ { init(); }
334
- | case_list case { push($1, $2); }
335
- ;
336
-
337
- case:
338
- T_CASE expr case_separator inner_statement_list_ex { $$ = Stmt\Case_[$2, $4]; }
339
- | T_DEFAULT case_separator inner_statement_list_ex { $$ = Stmt\Case_[null, $3]; }
340
- ;
341
-
342
- case_separator:
343
- ':'
344
- | ';'
345
- ;
346
-
347
- while_statement:
348
- statement { $$ = toArray($1); }
349
- | ':' inner_statement_list T_ENDWHILE ';' { $$ = $2; }
350
- ;
351
-
352
- elseif_list:
353
- /* empty */ { init(); }
354
- | elseif_list elseif { push($1, $2); }
355
- ;
356
-
357
- elseif:
358
- T_ELSEIF parentheses_expr statement { $$ = Stmt\ElseIf_[$2, toArray($3)]; }
359
- ;
360
-
361
- new_elseif_list:
362
- /* empty */ { init(); }
363
- | new_elseif_list new_elseif { push($1, $2); }
364
- ;
365
-
366
- new_elseif:
367
- T_ELSEIF parentheses_expr ':' inner_statement_list { $$ = Stmt\ElseIf_[$2, $4]; }
368
- ;
369
-
370
- else_single:
371
- /* empty */ { $$ = null; }
372
- | T_ELSE statement { $$ = Stmt\Else_[toArray($2)]; }
373
- ;
374
-
375
- new_else_single:
376
- /* empty */ { $$ = null; }
377
- | T_ELSE ':' inner_statement_list { $$ = Stmt\Else_[$3]; }
378
- ;
379
-
380
- foreach_variable:
381
- variable { $$ = array($1, false); }
382
- | '&' variable { $$ = array($2, true); }
383
- | list_expr { $$ = array($1, false); }
384
- ;
385
-
386
- parameter_list:
387
- non_empty_parameter_list { $$ = $1; }
388
- | /* empty */ { $$ = array(); }
389
- ;
390
-
391
- non_empty_parameter_list:
392
- parameter { init($1); }
393
- | non_empty_parameter_list ',' parameter { push($1, $3); }
394
- ;
395
-
396
- parameter:
397
- optional_param_type optional_ref optional_ellipsis plain_variable
398
- { $$ = Node\Param[$4, null, $1, $2, $3]; $this->checkParam($$); }
399
- | optional_param_type optional_ref optional_ellipsis plain_variable '=' static_scalar
400
- { $$ = Node\Param[$4, $6, $1, $2, $3]; $this->checkParam($$); }
401
- ;
402
-
403
- type:
404
- name { $$ = $1; }
405
- | T_ARRAY { $$ = Node\Identifier['array']; }
406
- | T_CALLABLE { $$ = Node\Identifier['callable']; }
407
- ;
408
-
409
- optional_param_type:
410
- /* empty */ { $$ = null; }
411
- | type { $$ = $1; }
412
- ;
413
-
414
- optional_return_type:
415
- /* empty */ { $$ = null; }
416
- | ':' type { $$ = $2; }
417
- ;
418
-
419
- argument_list:
420
- '(' ')' { $$ = array(); }
421
- | '(' non_empty_argument_list ')' { $$ = $2; }
422
- | '(' yield_expr ')' { $$ = array(Node\Arg[$2, false, false]); }
423
- ;
424
-
425
- non_empty_argument_list:
426
- argument { init($1); }
427
- | non_empty_argument_list ',' argument { push($1, $3); }
428
- ;
429
-
430
- argument:
431
- expr { $$ = Node\Arg[$1, false, false]; }
432
- | '&' variable { $$ = Node\Arg[$2, true, false]; }
433
- | T_ELLIPSIS expr { $$ = Node\Arg[$2, false, true]; }
434
- ;
435
-
436
- global_var_list:
437
- global_var_list ',' global_var { push($1, $3); }
438
- | global_var { init($1); }
439
- ;
440
-
441
- global_var:
442
- plain_variable { $$ = $1; }
443
- | '$' variable { $$ = Expr\Variable[$2]; }
444
- | '$' '{' expr '}' { $$ = Expr\Variable[$3]; }
445
- ;
446
-
447
- static_var_list:
448
- static_var_list ',' static_var { push($1, $3); }
449
- | static_var { init($1); }
450
- ;
451
-
452
- static_var:
453
- plain_variable { $$ = Stmt\StaticVar[$1, null]; }
454
- | plain_variable '=' static_scalar { $$ = Stmt\StaticVar[$1, $3]; }
455
- ;
456
-
457
- class_statement_list_ex:
458
- class_statement_list_ex class_statement { if ($2 !== null) { push($1, $2); } }
459
- | /* empty */ { init(); }
460
- ;
461
-
462
- class_statement_list:
463
- class_statement_list_ex
464
- { makeZeroLengthNop($nop, $this->lookaheadStartAttributes);
465
- if ($nop !== null) { $1[] = $nop; } $$ = $1; }
466
- ;
467
-
468
- class_statement:
469
- variable_modifiers property_declaration_list ';'
470
- { $$ = Stmt\Property[$1, $2]; $this->checkProperty($$, #1); }
471
- | T_CONST class_const_list ';' { $$ = Stmt\ClassConst[$2, 0]; }
472
- | method_modifiers T_FUNCTION optional_ref identifier_ex '(' parameter_list ')' optional_return_type method_body
473
- { $$ = Stmt\ClassMethod[$4, ['type' => $1, 'byRef' => $3, 'params' => $6, 'returnType' => $8, 'stmts' => $9]];
474
- $this->checkClassMethod($$, #1); }
475
- | T_USE class_name_list trait_adaptations { $$ = Stmt\TraitUse[$2, $3]; }
476
- ;
477
-
478
- trait_adaptations:
479
- ';' { $$ = array(); }
480
- | '{' trait_adaptation_list '}' { $$ = $2; }
481
- ;
482
-
483
- trait_adaptation_list:
484
- /* empty */ { init(); }
485
- | trait_adaptation_list trait_adaptation { push($1, $2); }
486
- ;
487
-
488
- trait_adaptation:
489
- trait_method_reference_fully_qualified T_INSTEADOF class_name_list ';'
490
- { $$ = Stmt\TraitUseAdaptation\Precedence[$1[0], $1[1], $3]; }
491
- | trait_method_reference T_AS member_modifier identifier_ex ';'
492
- { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, $4]; }
493
- | trait_method_reference T_AS member_modifier ';'
494
- { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, null]; }
495
- | trait_method_reference T_AS identifier ';'
496
- { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; }
497
- | trait_method_reference T_AS reserved_non_modifiers_identifier ';'
498
- { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; }
499
- ;
500
-
501
- trait_method_reference_fully_qualified:
502
- name T_PAAMAYIM_NEKUDOTAYIM identifier_ex { $$ = array($1, $3); }
503
- ;
504
- trait_method_reference:
505
- trait_method_reference_fully_qualified { $$ = $1; }
506
- | identifier_ex { $$ = array(null, $1); }
507
- ;
508
-
509
- method_body:
510
- ';' /* abstract method */ { $$ = null; }
511
- | '{' inner_statement_list '}' { $$ = $2; }
512
- ;
513
-
514
- variable_modifiers:
515
- non_empty_member_modifiers { $$ = $1; }
516
- | T_VAR { $$ = 0; }
517
- ;
518
-
519
- method_modifiers:
520
- /* empty */ { $$ = 0; }
521
- | non_empty_member_modifiers { $$ = $1; }
522
- ;
523
-
524
- non_empty_member_modifiers:
525
- member_modifier { $$ = $1; }
526
- | non_empty_member_modifiers member_modifier { $this->checkModifier($1, $2, #2); $$ = $1 | $2; }
527
- ;
528
-
529
- member_modifier:
530
- T_PUBLIC { $$ = Stmt\Class_::MODIFIER_PUBLIC; }
531
- | T_PROTECTED { $$ = Stmt\Class_::MODIFIER_PROTECTED; }
532
- | T_PRIVATE { $$ = Stmt\Class_::MODIFIER_PRIVATE; }
533
- | T_STATIC { $$ = Stmt\Class_::MODIFIER_STATIC; }
534
- | T_ABSTRACT { $$ = Stmt\Class_::MODIFIER_ABSTRACT; }
535
- | T_FINAL { $$ = Stmt\Class_::MODIFIER_FINAL; }
536
- ;
537
-
538
- property_declaration_list:
539
- property_declaration { init($1); }
540
- | property_declaration_list ',' property_declaration { push($1, $3); }
541
- ;
542
-
543
- property_decl_name:
544
- T_VARIABLE { $$ = Node\VarLikeIdentifier[parseVar($1)]; }
545
- ;
546
-
547
- property_declaration:
548
- property_decl_name { $$ = Stmt\PropertyProperty[$1, null]; }
549
- | property_decl_name '=' static_scalar { $$ = Stmt\PropertyProperty[$1, $3]; }
550
- ;
551
-
552
- expr_list:
553
- expr_list ',' expr { push($1, $3); }
554
- | expr { init($1); }
555
- ;
556
-
557
- for_expr:
558
- /* empty */ { $$ = array(); }
559
- | expr_list { $$ = $1; }
560
- ;
561
-
562
- expr:
563
- variable { $$ = $1; }
564
- | list_expr '=' expr { $$ = Expr\Assign[$1, $3]; }
565
- | variable '=' expr { $$ = Expr\Assign[$1, $3]; }
566
- | variable '=' '&' variable { $$ = Expr\AssignRef[$1, $4]; }
567
- | variable '=' '&' new_expr { $$ = Expr\AssignRef[$1, $4]; }
568
- | new_expr { $$ = $1; }
569
- | T_CLONE expr { $$ = Expr\Clone_[$2]; }
570
- | variable T_PLUS_EQUAL expr { $$ = Expr\AssignOp\Plus [$1, $3]; }
571
- | variable T_MINUS_EQUAL expr { $$ = Expr\AssignOp\Minus [$1, $3]; }
572
- | variable T_MUL_EQUAL expr { $$ = Expr\AssignOp\Mul [$1, $3]; }
573
- | variable T_DIV_EQUAL expr { $$ = Expr\AssignOp\Div [$1, $3]; }
574
- | variable T_CONCAT_EQUAL expr { $$ = Expr\AssignOp\Concat [$1, $3]; }
575
- | variable T_MOD_EQUAL expr { $$ = Expr\AssignOp\Mod [$1, $3]; }
576
- | variable T_AND_EQUAL expr { $$ = Expr\AssignOp\BitwiseAnd[$1, $3]; }
577
- | variable T_OR_EQUAL expr { $$ = Expr\AssignOp\BitwiseOr [$1, $3]; }
578
- | variable T_XOR_EQUAL expr { $$ = Expr\AssignOp\BitwiseXor[$1, $3]; }
579
- | variable T_SL_EQUAL expr { $$ = Expr\AssignOp\ShiftLeft [$1, $3]; }
580
- | variable T_SR_EQUAL expr { $$ = Expr\AssignOp\ShiftRight[$1, $3]; }
581
- | variable T_POW_EQUAL expr { $$ = Expr\AssignOp\Pow [$1, $3]; }
582
- | variable T_COALESCE_EQUAL expr { $$ = Expr\AssignOp\Coalesce [$1, $3]; }
583
- | variable T_INC { $$ = Expr\PostInc[$1]; }
584
- | T_INC variable { $$ = Expr\PreInc [$2]; }
585
- | variable T_DEC { $$ = Expr\PostDec[$1]; }
586
- | T_DEC variable { $$ = Expr\PreDec [$2]; }
587
- | expr T_BOOLEAN_OR expr { $$ = Expr\BinaryOp\BooleanOr [$1, $3]; }
588
- | expr T_BOOLEAN_AND expr { $$ = Expr\BinaryOp\BooleanAnd[$1, $3]; }
589
- | expr T_LOGICAL_OR expr { $$ = Expr\BinaryOp\LogicalOr [$1, $3]; }
590
- | expr T_LOGICAL_AND expr { $$ = Expr\BinaryOp\LogicalAnd[$1, $3]; }
591
- | expr T_LOGICAL_XOR expr { $$ = Expr\BinaryOp\LogicalXor[$1, $3]; }
592
- | expr '|' expr { $$ = Expr\BinaryOp\BitwiseOr [$1, $3]; }
593
- | expr '&' expr { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; }
594
- | expr '^' expr { $$ = Expr\BinaryOp\BitwiseXor[$1, $3]; }
595
- | expr '.' expr { $$ = Expr\BinaryOp\Concat [$1, $3]; }
596
- | expr '+' expr { $$ = Expr\BinaryOp\Plus [$1, $3]; }
597
- | expr '-' expr { $$ = Expr\BinaryOp\Minus [$1, $3]; }
598
- | expr '*' expr { $$ = Expr\BinaryOp\Mul [$1, $3]; }
599
- | expr '/' expr { $$ = Expr\BinaryOp\Div [$1, $3]; }
600
- | expr '%' expr { $$ = Expr\BinaryOp\Mod [$1, $3]; }
601
- | expr T_SL expr { $$ = Expr\BinaryOp\ShiftLeft [$1, $3]; }
602
- | expr T_SR expr { $$ = Expr\BinaryOp\ShiftRight[$1, $3]; }
603
- | expr T_POW expr { $$ = Expr\BinaryOp\Pow [$1, $3]; }
604
- | '+' expr %prec T_INC { $$ = Expr\UnaryPlus [$2]; }
605
- | '-' expr %prec T_INC { $$ = Expr\UnaryMinus[$2]; }
606
- | '!' expr { $$ = Expr\BooleanNot[$2]; }
607
- | '~' expr { $$ = Expr\BitwiseNot[$2]; }
608
- | expr T_IS_IDENTICAL expr { $$ = Expr\BinaryOp\Identical [$1, $3]; }
609
- | expr T_IS_NOT_IDENTICAL expr { $$ = Expr\BinaryOp\NotIdentical [$1, $3]; }
610
- | expr T_IS_EQUAL expr { $$ = Expr\BinaryOp\Equal [$1, $3]; }
611
- | expr T_IS_NOT_EQUAL expr { $$ = Expr\BinaryOp\NotEqual [$1, $3]; }
612
- | expr T_SPACESHIP expr { $$ = Expr\BinaryOp\Spaceship [$1, $3]; }
613
- | expr '<' expr { $$ = Expr\BinaryOp\Smaller [$1, $3]; }
614
- | expr T_IS_SMALLER_OR_EQUAL expr { $$ = Expr\BinaryOp\SmallerOrEqual[$1, $3]; }
615
- | expr '>' expr { $$ = Expr\BinaryOp\Greater [$1, $3]; }
616
- | expr T_IS_GREATER_OR_EQUAL expr { $$ = Expr\BinaryOp\GreaterOrEqual[$1, $3]; }
617
- | expr T_INSTANCEOF class_name_reference { $$ = Expr\Instanceof_[$1, $3]; }
618
- | parentheses_expr { $$ = $1; }
619
- /* we need a separate '(' new_expr ')' rule to avoid problems caused by a s/r conflict */
620
- | '(' new_expr ')' { $$ = $2; }
621
- | expr '?' expr ':' expr { $$ = Expr\Ternary[$1, $3, $5]; }
622
- | expr '?' ':' expr { $$ = Expr\Ternary[$1, null, $4]; }
623
- | expr T_COALESCE expr { $$ = Expr\BinaryOp\Coalesce[$1, $3]; }
624
- | T_ISSET '(' variables_list ')' { $$ = Expr\Isset_[$3]; }
625
- | T_EMPTY '(' expr ')' { $$ = Expr\Empty_[$3]; }
626
- | T_INCLUDE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE]; }
627
- | T_INCLUDE_ONCE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE_ONCE]; }
628
- | T_EVAL parentheses_expr { $$ = Expr\Eval_[$2]; }
629
- | T_REQUIRE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE]; }
630
- | T_REQUIRE_ONCE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE_ONCE]; }
631
- | T_INT_CAST expr { $$ = Expr\Cast\Int_ [$2]; }
632
- | T_DOUBLE_CAST expr
633
- { $attrs = attributes();
634
- $attrs['kind'] = $this->getFloatCastKind($1);
635
- $$ = new Expr\Cast\Double($2, $attrs); }
636
- | T_STRING_CAST expr { $$ = Expr\Cast\String_ [$2]; }
637
- | T_ARRAY_CAST expr { $$ = Expr\Cast\Array_ [$2]; }
638
- | T_OBJECT_CAST expr { $$ = Expr\Cast\Object_ [$2]; }
639
- | T_BOOL_CAST expr { $$ = Expr\Cast\Bool_ [$2]; }
640
- | T_UNSET_CAST expr { $$ = Expr\Cast\Unset_ [$2]; }
641
- | T_EXIT exit_expr
642
- { $attrs = attributes();
643
- $attrs['kind'] = strtolower($1) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE;
644
- $$ = new Expr\Exit_($2, $attrs); }
645
- | '@' expr { $$ = Expr\ErrorSuppress[$2]; }
646
- | scalar { $$ = $1; }
647
- | array_expr { $$ = $1; }
648
- | scalar_dereference { $$ = $1; }
649
- | '`' backticks_expr '`' { $$ = Expr\ShellExec[$2]; }
650
- | T_PRINT expr { $$ = Expr\Print_[$2]; }
651
- | T_YIELD { $$ = Expr\Yield_[null, null]; }
652
- | T_YIELD_FROM expr { $$ = Expr\YieldFrom[$2]; }
653
- | T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type
654
- '{' inner_statement_list '}'
655
- { $$ = Expr\Closure[['static' => false, 'byRef' => $2, 'params' => $4, 'uses' => $6, 'returnType' => $7, 'stmts' => $9]]; }
656
- | T_STATIC T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type
657
- '{' inner_statement_list '}'
658
- { $$ = Expr\Closure[['static' => true, 'byRef' => $3, 'params' => $5, 'uses' => $7, 'returnType' => $8, 'stmts' => $10]]; }
659
- ;
660
-
661
- parentheses_expr:
662
- '(' expr ')' { $$ = $2; }
663
- | '(' yield_expr ')' { $$ = $2; }
664
- ;
665
-
666
- yield_expr:
667
- T_YIELD expr { $$ = Expr\Yield_[$2, null]; }
668
- | T_YIELD expr T_DOUBLE_ARROW expr { $$ = Expr\Yield_[$4, $2]; }
669
- ;
670
-
671
- array_expr:
672
- T_ARRAY '(' array_pair_list ')'
673
- { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_LONG;
674
- $$ = new Expr\Array_($3, $attrs); }
675
- | '[' array_pair_list ']'
676
- { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_SHORT;
677
- $$ = new Expr\Array_($2, $attrs); }
678
- ;
679
-
680
- scalar_dereference:
681
- array_expr '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; }
682
- | T_CONSTANT_ENCAPSED_STRING '[' dim_offset ']'
683
- { $attrs = attributes(); $attrs['kind'] = strKind($1);
684
- $$ = Expr\ArrayDimFetch[new Scalar\String_(Scalar\String_::parse($1), $attrs), $3]; }
685
- | constant '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; }
686
- | scalar_dereference '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; }
687
- /* alternative array syntax missing intentionally */
688
- ;
689
-
690
- anonymous_class:
691
- T_CLASS ctor_arguments extends_from implements_list '{' class_statement_list '}'
692
- { $$ = array(Stmt\Class_[null, ['type' => 0, 'extends' => $3, 'implements' => $4, 'stmts' => $6]], $2);
693
- $this->checkClass($$[0], -1); }
694
- ;
695
-
696
- new_expr:
697
- T_NEW class_name_reference ctor_arguments { $$ = Expr\New_[$2, $3]; }
698
- | T_NEW anonymous_class
699
- { list($class, $ctorArgs) = $2; $$ = Expr\New_[$class, $ctorArgs]; }
700
- ;
701
-
702
- lexical_vars:
703
- /* empty */ { $$ = array(); }
704
- | T_USE '(' lexical_var_list ')' { $$ = $3; }
705
- ;
706
-
707
- lexical_var_list:
708
- lexical_var { init($1); }
709
- | lexical_var_list ',' lexical_var { push($1, $3); }
710
- ;
711
-
712
- lexical_var:
713
- optional_ref plain_variable { $$ = Expr\ClosureUse[$2, $1]; }
714
- ;
715
-
716
- function_call:
717
- name argument_list { $$ = Expr\FuncCall[$1, $2]; }
718
- | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM identifier_ex argument_list
719
- { $$ = Expr\StaticCall[$1, $3, $4]; }
720
- | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM '{' expr '}' argument_list
721
- { $$ = Expr\StaticCall[$1, $4, $6]; }
722
- | static_property argument_list
723
- { $$ = $this->fixupPhp5StaticPropCall($1, $2, attributes()); }
724
- | variable_without_objects argument_list
725
- { $$ = Expr\FuncCall[$1, $2]; }
726
- | function_call '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; }
727
- /* alternative array syntax missing intentionally */
728
- ;
729
-
730
- class_name:
731
- T_STATIC { $$ = Name[$1]; }
732
- | name { $$ = $1; }
733
- ;
734
-
735
- name:
736
- namespace_name_parts { $$ = Name[$1]; }
737
- | T_NS_SEPARATOR namespace_name_parts { $$ = Name\FullyQualified[$2]; }
738
- | T_NAMESPACE T_NS_SEPARATOR namespace_name_parts { $$ = Name\Relative[$3]; }
739
- ;
740
-
741
- class_name_reference:
742
- class_name { $$ = $1; }
743
- | dynamic_class_name_reference { $$ = $1; }
744
- ;
745
-
746
- dynamic_class_name_reference:
747
- object_access_for_dcnr { $$ = $1; }
748
- | base_variable { $$ = $1; }
749
- ;
750
-
751
- class_name_or_var:
752
- class_name { $$ = $1; }
753
- | reference_variable { $$ = $1; }
754
- ;
755
-
756
- object_access_for_dcnr:
757
- base_variable T_OBJECT_OPERATOR object_property
758
- { $$ = Expr\PropertyFetch[$1, $3]; }
759
- | object_access_for_dcnr T_OBJECT_OPERATOR object_property
760
- { $$ = Expr\PropertyFetch[$1, $3]; }
761
- | object_access_for_dcnr '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; }
762
- | object_access_for_dcnr '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; }
763
- ;
764
-
765
- exit_expr:
766
- /* empty */ { $$ = null; }
767
- | '(' ')' { $$ = null; }
768
- | parentheses_expr { $$ = $1; }
769
- ;
770
-
771
- backticks_expr:
772
- /* empty */ { $$ = array(); }
773
- | T_ENCAPSED_AND_WHITESPACE
774
- { $$ = array(Scalar\EncapsedStringPart[Scalar\String_::parseEscapeSequences($1, '`', false)]); }
775
- | encaps_list { parseEncapsed($1, '`', false); $$ = $1; }
776
- ;
777
-
778
- ctor_arguments:
779
- /* empty */ { $$ = array(); }
780
- | argument_list { $$ = $1; }
781
- ;
782
-
783
- common_scalar:
784
- T_LNUMBER { $$ = $this->parseLNumber($1, attributes(), true); }
785
- | T_DNUMBER { $$ = Scalar\DNumber[Scalar\DNumber::parse($1)]; }
786
- | T_CONSTANT_ENCAPSED_STRING
787
- { $attrs = attributes(); $attrs['kind'] = strKind($1);
788
- $$ = new Scalar\String_(Scalar\String_::parse($1, false), $attrs); }
789
- | T_LINE { $$ = Scalar\MagicConst\Line[]; }
790
- | T_FILE { $$ = Scalar\MagicConst\File[]; }
791
- | T_DIR { $$ = Scalar\MagicConst\Dir[]; }
792
- | T_CLASS_C { $$ = Scalar\MagicConst\Class_[]; }
793
- | T_TRAIT_C { $$ = Scalar\MagicConst\Trait_[]; }
794
- | T_METHOD_C { $$ = Scalar\MagicConst\Method[]; }
795
- | T_FUNC_C { $$ = Scalar\MagicConst\Function_[]; }
796
- | T_NS_C { $$ = Scalar\MagicConst\Namespace_[]; }
797
- | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE T_END_HEREDOC
798
- { $$ = $this->parseDocString($1, $2, $3, attributes(), stackAttributes(#3), false); }
799
- | T_START_HEREDOC T_END_HEREDOC
800
- { $$ = $this->parseDocString($1, '', $2, attributes(), stackAttributes(#2), false); }
801
- ;
802
-
803
- static_scalar:
804
- common_scalar { $$ = $1; }
805
- | class_name T_PAAMAYIM_NEKUDOTAYIM identifier_ex { $$ = Expr\ClassConstFetch[$1, $3]; }
806
- | name { $$ = Expr\ConstFetch[$1]; }
807
- | T_ARRAY '(' static_array_pair_list ')' { $$ = Expr\Array_[$3]; }
808
- | '[' static_array_pair_list ']' { $$ = Expr\Array_[$2]; }
809
- | static_operation { $$ = $1; }
810
- ;
811
-
812
- static_operation:
813
- static_scalar T_BOOLEAN_OR static_scalar { $$ = Expr\BinaryOp\BooleanOr [$1, $3]; }
814
- | static_scalar T_BOOLEAN_AND static_scalar { $$ = Expr\BinaryOp\BooleanAnd[$1, $3]; }
815
- | static_scalar T_LOGICAL_OR static_scalar { $$ = Expr\BinaryOp\LogicalOr [$1, $3]; }
816
- | static_scalar T_LOGICAL_AND static_scalar { $$ = Expr\BinaryOp\LogicalAnd[$1, $3]; }
817
- | static_scalar T_LOGICAL_XOR static_scalar { $$ = Expr\BinaryOp\LogicalXor[$1, $3]; }
818
- | static_scalar '|' static_scalar { $$ = Expr\BinaryOp\BitwiseOr [$1, $3]; }
819
- | static_scalar '&' static_scalar { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; }
820
- | static_scalar '^' static_scalar { $$ = Expr\BinaryOp\BitwiseXor[$1, $3]; }
821
- | static_scalar '.' static_scalar