Jay Berkenbilt
af2a71aa2c
Handle bitstream overflow errors more gracefully ( fixes #581 )
...
* Make it a runtime error, not a logic error
* Include additional information
* Capture it properly in checkLinearization
2021-12-10 15:37:35 -05:00
Jay Berkenbilt
ec09b91443
Add QIntC::range_check_subtract
2021-11-04 13:53:46 -04:00
Jay Berkenbilt
1886673d7e
Spell check
2021-02-23 10:38:05 -05:00
Jay Berkenbilt
0b1623d07d
Add QUtil::path_basename
2021-02-18 09:59:03 -05:00
Jay Berkenbilt
07f40bd254
QUtil::double_to_string: trim trailing zeroes with option to disable
2021-02-13 02:30:00 -05:00
Jay Berkenbilt
8fbc8579f2
Allow zone information to be omitted from timestamp strings
2021-02-11 14:26:55 -05:00
Jay Berkenbilt
bf0e6eb302
Add QUtil methods for dealing with PDF timestamp strings
2021-02-09 17:50:24 -05:00
Jay Berkenbilt
bfbeec5497
Make newly created name/number trees indirect objects
2021-02-08 06:49:56 -05:00
Jay Berkenbilt
553ac7f353
Add QUtil::pipe_file and QUtil::file_provider
2021-02-07 19:41:34 -05:00
Jay Berkenbilt
63e5cb533d
Use new QPDF{Name,Number}TreeObjectHelper API
2021-01-24 03:27:28 -05:00
Jay Berkenbilt
5f0708418a
Add iterators to name/number tree helpers
2021-01-24 03:22:59 -05:00
Jay Berkenbilt
4a1cce0a47
Reimplement name and number tree object helpers
...
Create a computationally and memory efficient implementation of name
and number trees that does binary searches as intended by the data
structure rather than loading into a map, which can use a great deal
of memory and can be very slow.
2021-01-24 03:22:51 -05:00
Jay Berkenbilt
4cbe2abcc0
Test empty function detection
2020-12-28 12:58:19 -05:00
Jay Berkenbilt
9d64481571
Handle negative numbers in QIntC::range_check (fuzz issue 26994)
2020-11-21 13:43:04 -05:00
Jay Berkenbilt
bcea54fcaa
Revert removal of unreadCh change for performance
...
Turns out unreadCh is much more efficient than seek(-1, SEEK_CUR).
Update comments and code to reflect this.
2020-10-27 11:57:48 -04:00
Jay Berkenbilt
026330ebcd
Make libtests depend on qpdf
...
We need to run qpdf --show-crypto.
2020-10-24 19:16:46 -04:00
Jay Berkenbilt
98f6c00dad
Protect numeric conversion against user's locale ( fixes #459 )
2020-10-21 16:42:51 -04:00
Jay Berkenbilt
bed165c9fc
Stop using InputSource::unreadCh
2020-10-18 07:43:05 -04:00
Jay Berkenbilt
18b34a5649
InputSource::unreadCh -- only unread most recently read character
...
This is all that ever worked. The test suite was trying to do
something different from ClosedFileInputSource.
2020-10-16 17:15:39 -04:00
Jay Berkenbilt
578c5ac66c
Use more references when iterating
...
When possible, use `for (auto&` or `for (auto const&` when iterating
using C++-11 style iterators.
2020-04-10 13:30:33 -04:00
Jay Berkenbilt
77198d5310
Delegate random number generation to crypto provider ( fixes #418 )
2020-04-06 11:23:02 -04:00
Jay Berkenbilt
7246404177
JSON: implement pattern keys in schema
2020-04-04 18:06:32 -04:00
Jay Berkenbilt
2100b4ce15
Allow qpdf to be built on systems without wchar_t ( fixes #406 )
2020-04-03 21:39:44 -04:00
Fabrice Fontaine
d043c6b828
libtests/cxx11.cc: fix build with gcc 4.8
...
Build fails on gcc 4.8 since version 9.1.1 and commit
7524165540
:
libtests/cxx11.cc: In function 'void do_regex()':
libtests/cxx11.cc:347:42: error: 'strlen' is not a member of 'std'
std::cregex_iterator m3(str7, str7 + std::strlen(str7), expr4);
^
To fix the build failure, add missing include on cstring
Fixes:
- http://autobuild.buildroot.org/results/ad7fb68ae87850a85509eed80fd0cae8721b10c5
Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
2020-02-18 11:01:33 -05:00
Jay Berkenbilt
a44b5a34a0
Pull wmain -> main code from qpdf.cc into QUtil.cc
2020-01-14 11:40:51 -05:00
Jay Berkenbilt
211a7f57be
QUtil::read_lines_from_file: optional EOL preservation
2020-01-13 11:26:18 -05:00
Jay Berkenbilt
9a398504ca
Refactor QUtil::read_lines_from_file
...
This commit adds the preserve_eol flags but doesn't implement EOL
preservation yet.
2020-01-13 09:19:53 -05:00
Jay Berkenbilt
7524165540
Add std::regex to c++11 feature tests
2020-01-13 09:19:03 -05:00
Jay Berkenbilt
c4478e5249
Allow odd/even modifiers in numeric range ( fixes #364 )
2019-11-09 13:23:12 -05:00
Jay Berkenbilt
1639d972ea
Run libtests for crypto with all available providers
...
If QPDF_CRYPTO_PROVIDER is set, just run the tests for the given
provider. This is to support cases of running the entire test suite
for each provider. If QPDF_CRYPTO_PROVIDER is not set, run the tests
that exercise the cyrpto provider for each available provider.
2019-11-09 09:53:42 -05:00
Jay Berkenbilt
fb4c6c1503
Increase coverage for RC4 testing
2019-11-09 09:53:42 -05:00
Jay Berkenbilt
30c1f856d4
See if C++11 features work
2019-11-09 08:18:02 -05:00
Jay Berkenbilt
6d81f01476
Don't assume char is signed in int conversion tests ( fixes #361 )
2019-09-17 12:18:09 -04:00
Jay Berkenbilt
4fa7b1eb60
Add remove_file and rename_file to QUtil
2019-08-31 15:51:04 -04:00
Jay Berkenbilt
0787ec9620
spell check
2019-08-31 08:43:18 -04:00
Jay Berkenbilt
8c69f8495d
Add getRefcount to PointerHolder test
2019-08-30 11:58:33 -04:00
Jay Berkenbilt
e83f3308fb
SparseOHArray
2019-08-17 23:02:41 -04:00
Jay Berkenbilt
1bde5c68a3
Add QUtil::read_file_into_memory
...
This code was essentially duplicated between test_driver and
standalone_fuzz_target_runner.
2019-06-22 10:14:25 -04:00
Jay Berkenbilt
79f6b4823b
Convert remaining public classes to use Members pattern
...
Have classes contain only a single private member of type
PointerHolder<Members>. This makes it safe to change the structure of
the Members class without breaking binary compatibility. Many of the
classes already follow this pattern quite successfully. This brings in
the rest of the class that are part of the public API.
2019-06-22 10:13:27 -04:00
Jay Berkenbilt
848351f1fc
Add missing #include <cstring>
2019-06-21 22:29:31 -04:00
Jay Berkenbilt
a35d4ce9cc
Fix bounds error in utf16_to_utf8 conversion
2019-06-21 17:40:24 -04:00
Jay Berkenbilt
d71f05ca07
Fix sign and conversion warnings (major)
...
This makes all integer type conversions that have potential data loss
explicit with calls that do range checks and raise an exception. After
this commit, qpdf builds with no warnings when -Wsign-conversion
-Wconversion is used with gcc or clang or when -W3 -Wd4800 is used
with MSVC. This significantly reduces the likelihood of potential
crashes from bogus integer values.
There are some parts of the code that take int when they should take
size_t or an offset. Such places would make qpdf not support files
with more than 2^31 of something that usually wouldn't be so large. In
the event that such a file shows up and is valid, at least qpdf would
raise an error in the right spot so the issue could be legitimately
addressed rather than failing in some weird way because of a silent
overflow condition.
2019-06-21 13:17:21 -04:00
Jay Berkenbilt
42306e2ff8
QUtil: add unsigned int/string functions
2019-06-21 13:17:21 -04:00
Jay Berkenbilt
a66828caff
New safe type converters in QIntC
2019-06-21 13:17:21 -04:00
Jay Berkenbilt
da7c2c0ee9
Fix json serialization for {x | -1 < x < 1} ( fixes #308 )
...
JSON serialization was preserving the value as presented, but JSON
doesn't accept decimal values without a 0 before the decimal point.
2019-03-11 16:22:59 -04:00
Jay Berkenbilt
623f5b664e
Convert pages to form XObjects
...
Support conversion of pages to form XObjects and placement of form
XObjects on pages.
2019-01-27 07:50:30 -05:00
Jay Berkenbilt
68ccd87c9e
Move rectangle transformation into QPDFMatrix
2019-01-27 07:50:30 -05:00
Jay Berkenbilt
e87d149918
Add QUtil::possible_repaired_encodings
2019-01-17 11:43:56 -05:00
Jay Berkenbilt
4630377731
Add status-reporting transcoders to QUtil
2019-01-17 11:43:56 -05:00
Jay Berkenbilt
8f389f14c0
QUtil::analyze_encoding
2019-01-17 11:43:56 -05:00
Jay Berkenbilt
6817ca585a
Bidirectional transcoding for win, mac, pdf, utf8, utf16
2019-01-17 11:43:56 -05:00
Jay Berkenbilt
b341d742db
Add WinAnsi and MacRoman encoding
2019-01-05 23:01:44 -05:00
Jay Berkenbilt
3ef1b77304
Refactor QUtil::utf8_to_ascii
2019-01-05 22:59:29 -05:00
Jay Berkenbilt
02281632cc
Add QUtil::utf8_to_ascii
2019-01-03 23:18:13 -05:00
Jay Berkenbilt
5059ec0d35
Add Matrix class under QPDFObjectHandle
2018-12-31 23:02:43 -05:00
Jay Berkenbilt
daeb5a85b6
Transformation matrix
2018-12-31 18:23:47 -05:00
Jay Berkenbilt
3440ea7d3c
JSON::serialize -> unparse
...
Unparse is admittedly strange, but I'd rather be strange and
consistent, and everything else in the qpdf library uses unparse to
serialize. (If you're reading this, the convention of using "unparse"
comes from the "clu" programming language.)
2018-12-25 11:52:21 -05:00
Jay Berkenbilt
fa3664357b
Move numrange code from qpdf.cc to QUtil.cc
...
Also move tests to libtests.
2018-12-21 19:11:57 -05:00
Jay Berkenbilt
651179b5da
Add simple JSON serializer
2018-12-21 18:34:56 -05:00
Jay Berkenbilt
b4bdc42b4f
New exception class QPDFSystemError ( fixes #221 )
2018-08-13 20:01:51 -04:00
Jay Berkenbilt
a2f62935b3
Catch exceptions as const references ( fixes #236 )
...
This fix allows qpdf to compile/test cleanly with gcc 8.
2018-08-12 21:57:52 -04:00
Jay Berkenbilt
4f4c627b77
ClosedFileInputSource: add method to keep file open
...
During periods of intensive operation on a specific file, this method
can reduce the overhead of repeated open/close operations.
2018-08-04 19:52:46 -04:00
Jay Berkenbilt
3fe5236d54
Fix typo
2018-06-22 19:28:18 -04:00
Jay Berkenbilt
c543c1e4e5
Windows test workaround
2018-06-22 17:19:34 -04:00
Jay Berkenbilt
4ccc8b1a44
Add ClosedFileInputSource
...
ClosedFileInputSource is an input source that keeps the file closed
when not reading it.
2018-06-22 12:52:45 -04:00
Jay Berkenbilt
e44c395c51
QUtil::toUTF16
2018-06-21 15:57:13 -04:00
Jay Berkenbilt
44674a3e58
Label qutil test output
2018-06-21 15:57:13 -04:00
Jay Berkenbilt
b096e99649
buffer test: fix memory leak in test code
...
Forgot to delete a buffer in the test driver. There was no memory leak
or memory error in any installed code.
2018-05-05 17:43:44 -04:00
Jay Berkenbilt
1a4dcb4aaf
Pl_Buffer starts in a ready state
2018-03-06 11:31:03 -05:00
Jay Berkenbilt
95ba7125ff
Fix link order ( fixes #176 )
...
Specify qpdf libraries before external ones.
Specify LDFLAGS before libraries.
This should eliminate remaining cases of qpdf builds favoring
previously installed versions.
2018-02-04 14:19:00 -05:00
Jay Berkenbilt
3e306ae64c
Add QUtil::hex_decode
2018-01-14 09:04:13 -05:00
Jay Berkenbilt
6299c64cf3
Use correct link directory order ( fixes #158 )
...
Make sure to link from the source tree before linking from the system.
In many environments, this is necessary to allow a newly built qpdf to
link properly instead of trying to link or resolve libraries from an
older installed version.
2018-01-13 19:53:52 -05:00
Jay Berkenbilt
53971d50be
Add Pl_TIFFPredictor
2018-01-13 19:49:42 -05:00
Jay Berkenbilt
d9c9049708
Add signed support to BitStream and BitWriter
2018-01-13 19:49:42 -05:00
Jay Berkenbilt
bf2fb239d7
Rename png_filter -> predictors
2018-01-13 19:49:42 -05:00
Jay Berkenbilt
4edfe1f41d
Add tests for new PNG filters
2017-12-25 18:20:52 -05:00
Jay Berkenbilt
38bdbc0719
PNG filter test images
2017-12-25 14:24:48 -05:00
Jay Berkenbilt
a3a55be9cd
Correct errors in PNG filters and make use from library
2017-12-25 14:24:48 -05:00
Jay Berkenbilt
40ecba4172
Pl_DCT: Use custom source and destination managers ( fixes #153 )
...
Avoid calling jpeg_mem_src and jpeg_mem_dest. The custom destination
manager writes to the pipeline in smaller chunks to avoid having the
whole image in memory at once. The source manager works directly with
the Buffer object. Using customer managers avoids use of memory source
and destination managers, which are not present in older versions of
libjpeg still in use by some Linux distributions.
2017-09-07 22:59:11 -04:00
Jay Berkenbilt
1868a10f8b
Replace all atoi calls with QUtil::string_to_int
...
The latter catches underflow/overflow.
2017-08-29 12:28:32 -04:00
Jay Berkenbilt
6d46346eb9
Detect integer overflow/underflow
2017-08-29 12:28:32 -04:00
Jay Berkenbilt
caf5e39c2e
Fix compiler warnings for clang/mac OS X
2017-08-22 14:13:10 -04:00
Jay Berkenbilt
ae90d2c485
Implement Pl_DCT pipeline
...
Additional testing is added in later commits to be supported by
additional changes in the library.
2017-08-21 17:44:02 -04:00
Jay Berkenbilt
2d2f619665
Implement Pl_RunLength pipeline
2017-08-19 14:50:55 -04:00
Jay Berkenbilt
9a96e233b0
Remove PCRE
2017-08-10 21:30:32 -04:00
Jay Berkenbilt
296b679d6e
Implement findFirst and findLast in InputSource
...
Preparing to refactor some pattern searching code to use these instead
of their own memchr loops. This should simplify the code that replaces
PCRE.
2017-08-10 21:30:32 -04:00
Jay Berkenbilt
2d5b854468
Allow reading command-line args from files ( fixes #16 )
2017-07-29 22:23:21 -04:00
Jay Berkenbilt
5993c3e83c
Detect input file = output file ( fixes #29 )
2017-07-29 20:58:01 -04:00
Thorsten Schöning
bfb9341310
Use RM_WS_ONLY_LINES in test
...
Some compilers output extra newlines in some cases.
2016-01-24 12:05:22 -05:00
Thorsten Schöning
953e6f641f
Include stdlib.h to provide exit
2016-01-24 12:05:02 -05:00
Jay Berkenbilt
b8bdef0ad1
Implement deterministic ID
...
For non-encrypted files, determinstic ID generation uses file contents
instead of timestamp and file name. At a small runtime cost, this
enables generation of the same /ID if the same inputs are converted in
the same way multiple times.
2015-10-31 18:56:42 -04:00
Jay Berkenbilt
6067608d93
Remove needless #ifdef _WIN32 from getWhoami
2013-12-16 16:21:28 -05:00
Jay Berkenbilt
235d8f28f8
Increase random data provider support
...
Add a method to get the current random data provider, and document and
test the method for resetting it.
2013-12-16 16:21:28 -05:00
Jay Berkenbilt
30287d2d65
Allow OS-provided secure random to be disabled
2013-12-14 15:17:36 -05:00
Jay Berkenbilt
5e3bad2f86
Refactor random data generation
...
Add new RandomDataProvider object and implement existing random number
generation in terms of that. This enables end users to supply their
own random data providers.
2013-12-14 15:17:35 -05:00
Jay Berkenbilt
212812d837
Fix errors reported by Coverity
...
Thanks to Jiri Popelka from Red Hat for sending the output of a
Coverity run over qpdf.
2013-07-07 15:36:51 -04:00
Jay Berkenbilt
ac4deac187
Call QUtil::safe_fopen in place of fopen
...
fopen was previuosly called wrapped by QUtil::fopen_wrapper, but
QUtil::safe_fopen does this itself, which is less cumbersome.
2013-03-05 13:35:46 -05:00
Jay Berkenbilt
a51ae10b8d
Remove all calls to sprintf
2013-03-05 13:35:46 -05:00
Jay Berkenbilt
66c3c8fdf7
Use portable versions of some UNIX-specific calls
...
Remove needless calls to open, close, and fileno; call remove instead
of unlink.
2013-03-05 13:35:46 -05:00
Jay Berkenbilt
6b9297882e
Mark secure CRT warnings with comment
...
Put a specific comment marker next to every piece of code that MSVC
gives warning 4996 for. This warning is generated for calls to
functions that Microsoft considers insecure or deprecated. This
change is in preparation for fixing all these cases even though none
of them are actually incorrect or insecure as used in qpdf. The
comment marker makes them easier to find so they can be fixed in
subsequent commits.
2013-03-05 13:33:32 -05:00
Jay Berkenbilt
8be8277613
Rewrite QUtil::int_to_string and QUtil::double_to_string
...
Make them safer by avoiding any internal limits and replacing sprintf
with std::ostringstream.
2013-03-04 16:45:16 -05:00
Jay Berkenbilt
ed19516aa7
Fix unused local variable warnings
2013-03-04 16:45:16 -05:00
Jay Berkenbilt
30027481f7
Remove all old-style casts from C++ code
2013-03-04 16:45:16 -05:00
Jay Berkenbilt
0873e42300
SHA2 pipeline with support for 256, 384, and 512 bits
...
Implemented pipeline around sph sha calls using standard test vectors
for full-byte values. Did not test or support partial byte values.
2012-12-31 05:36:51 -05:00
Jay Berkenbilt
9b42f526df
Update AES classes to work with 256-bit keys
2012-12-31 05:36:50 -05:00
Jay Berkenbilt
d6cb2b9418
Add test code for Pl_Concatenate
2012-06-27 10:20:47 -04:00
Jay Berkenbilt
5d4cad9c02
ABI change: fix use of off_t, size_t, and integer types
...
Significantly improve the code's use of off_t for file offsets, size_t
for memory sizes, and integer types in cases where there has to be
compatibility with external interfaces. Rework sections of the code
that would have prevented qpdf from working on files larger than 2 (or
maybe 4) GB in size.
2012-06-20 15:20:26 -04:00
Jay Berkenbilt
81fc594342
Remove extraneous execute bits
2012-06-20 15:18:08 -04:00
Jay Berkenbilt
76b1659177
enhance PointerHolder so that it can explicitly be told to use delete [] instead of delete, thus making it useful to run valgrind over qpdf during its test suite
2011-08-11 11:57:37 -04:00
Jay Berkenbilt
de05cfb508
add test case to buffer test suite
...
git-svn-id: svn+q:///qpdf/trunk@1038 71b93d88-0707-0410-a8cf-f5a4172ac649
2010-10-01 11:19:36 +00:00
Jay Berkenbilt
aa035961b3
add * and -> operators
...
git-svn-id: svn+q:///qpdf/trunk@1029 71b93d88-0707-0410-a8cf-f5a4172ac649
2010-09-24 19:09:22 +00:00
Jay Berkenbilt
d469111aa2
minor tweaks so rpm creation works properly in rhel5
...
git-svn-id: svn+q:///qpdf/trunk@911 71b93d88-0707-0410-a8cf-f5a4172ac649
2009-10-27 01:51:56 +00:00
Jay Berkenbilt
7d6d22db7b
remove embedded external libs; replace with different mechanism
...
git-svn-id: svn+q:///qpdf/trunk@868 71b93d88-0707-0410-a8cf-f5a4172ac649
2009-10-23 03:20:03 +00:00
Jay Berkenbilt
aaeb71093d
test aes
...
git-svn-id: svn+q:///qpdf/trunk@813 71b93d88-0707-0410-a8cf-f5a4172ac649
2009-10-17 23:58:59 +00:00
Jay Berkenbilt
846c9f6bcc
checkpoint -- started doing some R4 encryption support
...
git-svn-id: svn+q:///qpdf/trunk@807 71b93d88-0707-0410-a8cf-f5a4172ac649
2009-10-17 03:14:47 +00:00
Jay Berkenbilt
601e52823c
use binmode so test suite works with ActivePerl
...
git-svn-id: svn+q:///qpdf/trunk@801 71b93d88-0707-0410-a8cf-f5a4172ac649
2009-10-14 00:31:52 +00:00
Jay Berkenbilt
2b5ac676ed
generalize build
...
git-svn-id: svn+q:///qpdf/trunk@776 71b93d88-0707-0410-a8cf-f5a4172ac649
2009-10-11 00:24:22 +00:00
Jay Berkenbilt
ccd7ab7a45
fix
...
git-svn-id: svn+q:///qpdf/trunk@765 71b93d88-0707-0410-a8cf-f5a4172ac649
2009-10-10 17:39:23 +00:00
Jay Berkenbilt
caa397ed15
generalize build rules, add experimental support for manual compilation without libtool
...
git-svn-id: svn+q:///qpdf/trunk@753 71b93d88-0707-0410-a8cf-f5a4172ac649
2009-10-10 14:15:09 +00:00
Jay Berkenbilt
f3d7c26de1
removed qexc; non-compatible ABI change
...
git-svn-id: svn+q:///qpdf/trunk@709 71b93d88-0707-0410-a8cf-f5a4172ac649
2009-09-26 18:36:04 +00:00
Jay Berkenbilt
0ded90eff9
fix problems or otherwise improve code based on issues raised by Klocwork
...
git-svn-id: svn+q:///qpdf/trunk@690 71b93d88-0707-0410-a8cf-f5a4172ac649
2009-09-14 01:31:46 +00:00
Jay Berkenbilt
fe18385ffa
clean up windows portability code, make remaining test suite pass
...
git-svn-id: svn+q:///qpdf/trunk@686 71b93d88-0707-0410-a8cf-f5a4172ac649
2009-07-15 04:26:32 +00:00
Jay Berkenbilt
86f2d3449c
windows fixes; okay for modern compilers
...
git-svn-id: svn+q:///qpdf/trunk@685 71b93d88-0707-0410-a8cf-f5a4172ac649
2009-07-15 04:01:52 +00:00
Jay Berkenbilt
a9987ab570
Fix a few compiler errors reported correctly my MSVC 9.0.
...
Fix libtests test suites to pass on Windows, mostly by dealing with
ascii vs. binary and NL vs. CRNL change ($td->NORMALIZE_NEWLINES).
Convert some test suites to use fread instead of read.
PCRE.hh: define PCRE_STATIC if on Windows.
Provide cross-platform function for getting current time instead of
using time(0).
git-svn-id: svn+q:///qpdf/trunk@678 71b93d88-0707-0410-a8cf-f5a4172ac649
2009-07-12 22:52:13 +00:00
Jay Berkenbilt
da7166bead
fix problem with lzw decoder when run without early code change, now that we actually have test input
...
git-svn-id: svn+q:///qpdf/trunk@646 71b93d88-0707-0410-a8cf-f5a4172ac649
2009-02-20 02:27:36 +00:00
Jay Berkenbilt
07dc592182
gcc 4.4 fixes
...
git-svn-id: svn+q:///qpdf/trunk@642 71b93d88-0707-0410-a8cf-f5a4172ac649
2008-11-23 19:11:24 +00:00
Jay Berkenbilt
76bf91765e
missing header files for gcc 4.3
...
git-svn-id: svn+q:///qpdf/trunk@607 71b93d88-0707-0410-a8cf-f5a4172ac649
2008-05-04 16:02:53 +00:00
Jay Berkenbilt
9a0b88bf77
update release date to actual date
...
git-svn-id: svn+q:///qpdf/trunk@599 71b93d88-0707-0410-a8cf-f5a4172ac649
2008-04-29 12:55:25 +00:00