]>
granicus.if.org Git - taglib/log
Lukáš Lalinský [Thu, 22 Nov 2007 13:17:15 +0000 (13:17 +0000)]
Revert r735160 and r735161, and set BUILD_TESTS to OFF if CppUnit is not found.
CCMAIL:michael.pyne@kdemail.net
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@740071
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Tue, 20 Nov 2007 21:14:20 +0000 (21:14 +0000)]
Do this the way the other BIC notes are listed.
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@739325
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Mon, 19 Nov 2007 14:44:09 +0000 (14:44 +0000)]
Ran my whitespace fixing script -- tabs -> spaces, removes trailing spaces.
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@738725
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Mon, 19 Nov 2007 13:59:33 +0000 (13:59 +0000)]
These were missing private copy constructors / assignment operators to make them non-copyable.
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@738702
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Michael Pyne [Sun, 11 Nov 2007 03:30:44 +0000 (03:30 +0000)]
This also breaks compilation of kdesupport. CppUnit won't be found since I commented
out the configure check is fixed. Once the configure check is fixed this can be
commented back in.
CCMAIL:lalinsky@gmail.com
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@735161
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Michael Pyne [Sun, 11 Nov 2007 03:24:31 +0000 (03:24 +0000)]
Unbreak compilation for kdesupport users with CppUnit by commenting out the test suite.
This needs to be fixed to fail gracefully for users without CppUnit available.
CCMAIL:lalinsky@gmail.com
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@735160
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Lukáš Lalinský [Sat, 10 Nov 2007 22:55:14 +0000 (22:55 +0000)]
TrueAudio support.
This is last of the three formats implemented for libtunepimp, now used also by various players.
BUG:114982
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@735116
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Lukáš Lalinský [Sat, 10 Nov 2007 22:20:33 +0000 (22:20 +0000)]
Fix ID3v2::UniqueFileIdentifier frame parsing.
According to the spec, the identifier contains arbitrary binary data (which
includes \0). That means splitting it on \0 and checking if we have only
two parts is wrong, because it rejects valid frames.
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@735109
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Lukáš Lalinský [Sat, 10 Nov 2007 22:16:56 +0000 (22:16 +0000)]
Fix off-by-one error in ByteVector::find.
In case where the pattern has the same length as the bytevector, it should
degrade to A == B, not just return "not found" (e.g. A.find(A) should
return 0, not -1).
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@735107
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Lukáš Lalinský [Sat, 10 Nov 2007 21:32:32 +0000 (21:32 +0000)]
Add methods RelativeVolumeFrame::identification and RelativeVolumeFrame::setIdentification.
BUG:150481
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@735098
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Lukáš Lalinský [Sat, 10 Nov 2007 18:03:25 +0000 (18:03 +0000)]
- Fixed crash in AttachedPictureFrame and GeneralEncapsulatedObjectFrame
caused by using uninitialized pointer. (BUG:151078)
- Make Frame::readStringField to actually read the string field.
- Fixed parsing of APIC frames -- there is one-byte type between mime type
and description. The code worked only thanks to the previous bug.
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@735035
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Lukáš Lalinský [Sat, 10 Nov 2007 16:46:04 +0000 (16:46 +0000)]
Add a CppUnit-based test suite (only very few things is covered for now, but it's a start).
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@734995
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Lukáš Lalinský [Sat, 10 Nov 2007 16:07:09 +0000 (16:07 +0000)]
Speex support.
BUG:129196
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@734977
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Lukáš Lalinský [Sat, 10 Nov 2007 16:06:16 +0000 (16:06 +0000)]
Use Unicode filenames on Windows (this time the correct patch).
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@734975
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Lukáš Lalinský [Sat, 10 Nov 2007 16:05:18 +0000 (16:05 +0000)]
Revert r734944 -- this one wasn't meant to go in.
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@734973
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Lukáš Lalinský [Sat, 10 Nov 2007 15:58:10 +0000 (15:58 +0000)]
Ignore all autotools and cmake generated files.
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@734971
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Lukáš Lalinský [Sat, 10 Nov 2007 15:16:49 +0000 (15:16 +0000)]
Use Unicode filenames on Windows.
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@734944
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Lukáš Lalinský [Tue, 6 Nov 2007 18:50:09 +0000 (18:50 +0000)]
WavPack support.
CCBUG:114982
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@733568
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Lukáš Lalinský [Tue, 6 Nov 2007 18:27:47 +0000 (18:27 +0000)]
Decode unsynch-encoded tag (ID3v2.3) and frame (ID3v2.4) data before parsing them.
BUG:138829
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@733565
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Lukáš Lalinský [Mon, 5 Nov 2007 02:04:10 +0000 (02:04 +0000)]
Use separate DLL export macro for libtag_c and use the right DEFINE_SYMBOL.
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@732908
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Lukáš Lalinský [Mon, 5 Nov 2007 01:58:56 +0000 (01:58 +0000)]
Remove duplicate check for zlib and make zlib optional.
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@732907
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Sun, 21 Oct 2007 17:37:28 +0000 (17:37 +0000)]
SVN_SILENT didn't mean for that to go in
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@727756
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Sun, 21 Oct 2007 17:35:40 +0000 (17:35 +0000)]
More TAGLIB_EXPORTs from Lukas.
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@727755
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Wed, 10 Oct 2007 18:22:58 +0000 (18:22 +0000)]
Got permission from all (non-trivial) contributors to dual license under the MPL.
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@723791
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Tue, 9 Oct 2007 17:46:48 +0000 (17:46 +0000)]
Install header.
CCMAIL:taglib-devel@kde.org
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@723447
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Thu, 27 Sep 2007 21:41:12 +0000 (21:41 +0000)]
Note OGA as the new extension for Ogg FLAC.
(Note: for the bug report, this won't actually make things work in Amarok, in fact, this change
wasn't needed at all for it to work there.)
BUG:149987
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@717998
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Thu, 27 Sep 2007 20:52:50 +0000 (20:52 +0000)]
Add a few checks to make sure that we don't blow up when trying to read zero-byte
values.
BUG:150250
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@717984
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Christian Ehrlicher [Sat, 15 Sep 2007 16:01:02 +0000 (16:01 +0000)]
more win32 fixes
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@712894
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Christian Ehrlicher [Sat, 15 Sep 2007 10:12:27 +0000 (10:12 +0000)]
win32 install fixes
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@712787
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Christian Ehrlicher [Sat, 15 Sep 2007 09:03:22 +0000 (09:03 +0000)]
we also need config.h on win32!
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@712779
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Kevin Krammer [Wed, 29 Aug 2007 23:33:30 +0000 (23:33 +0000)]
Unfix compiler warning. Compiler warnings good, BIC changes bad.
Make it a bit more obvious for the next poor fellow
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@706333
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Kevin Krammer [Wed, 29 Aug 2007 22:57:23 +0000 (22:57 +0000)]
Fixing compiler warning about missing virtual destructor in class with virtual methods
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@706328
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Adriaan de Groot [Mon, 27 Aug 2007 20:05:44 +0000 (20:05 +0000)]
Still need the C++ runtime for the C bindings on Solaris; need stdlib.h for various prototypes.
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@705364
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Adriaan de Groot [Mon, 27 Aug 2007 19:41:38 +0000 (19:41 +0000)]
Need ostream for std::ostream in some STLs
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@705359
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Adriaan de Groot [Mon, 27 Aug 2007 13:58:19 +0000 (13:58 +0000)]
Actually, forcing a particular STL implementation on the C bindings is a bad idea.
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@705222
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Laurent Montel [Mon, 27 Aug 2007 07:04:18 +0000 (07:04 +0000)]
Don't hardcode version
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@705092
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Laurent Montel [Mon, 27 Aug 2007 07:02:29 +0000 (07:02 +0000)]
Don't hardcode version number
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@705090
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Adriaan de Groot [Tue, 21 Aug 2007 09:41:41 +0000 (09:41 +0000)]
Want div_t
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@702849
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Mon, 20 Aug 2007 11:59:02 +0000 (11:59 +0000)]
Fix the automake build.
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@702323
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Christian Ehrlicher [Sun, 19 Aug 2007 15:16:35 +0000 (15:16 +0000)]
more exports from Serhiy Kachaniuk
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@701861
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Adriaan de Groot [Thu, 16 Aug 2007 12:05:50 +0000 (12:05 +0000)]
The C bindings use the C++ library which uses the C++ runtime. On Solaris, this doesn't automatically mean that applications linking to the C bindings get the C++ runtime; add the C++ runtime explicitly to the bindings library so that the runtime gets pulled in by apps. aka. make-it-link.
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@700769
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Adriaan de Groot [Thu, 16 Aug 2007 11:47:08 +0000 (11:47 +0000)]
Somewhat hackish; might be better off as a downstream patch.
Sun Studio fails on taglib because Map specializes in too many ways;
adding the class keyword reduces the specializations to one and it's ok,
but not all specializations of Map actually use T as a template class
parameter. So introduce a #define to switch that around.
Original patch from Stefan Teleman, pared down by me.
CCMAIL: kde-solaris@kde.org
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@700759
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Laurent Montel [Tue, 14 Aug 2007 07:33:36 +0000 (07:33 +0000)]
Not generate/install pkgconfig file on windows we can't use it
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@699889
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Christian Ehrlicher [Sat, 11 Aug 2007 08:33:49 +0000 (08:33 +0000)]
exported the rest of the classes (hope I got all)
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@698836
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Christian Ehrlicher [Sat, 11 Aug 2007 08:29:23 +0000 (08:29 +0000)]
(initial) win32 export support
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@698835
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Laurent Montel [Sun, 29 Jul 2007 09:38:17 +0000 (09:38 +0000)]
Fix pc filesx
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@693853
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Thu, 19 Jul 2007 15:20:10 +0000 (15:20 +0000)]
Work around the fact that iTunes can't properly parse ID3v2.4 numerical genres.
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@689932
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Thu, 19 Jul 2007 00:44:37 +0000 (00:44 +0000)]
Don't include empty strings in the text field list. This is a slight deviation
from the standard, but major editors (i.e. iTunes) mess up ID3v2 text frames with
null termination (which technically indicates a field with content, plus an empty
field).
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@689739
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Thu, 19 Jul 2007 00:04:37 +0000 (00:04 +0000)]
This didn't work in the case of an empty buffer read since subtracting 1
from a unsigned value, well, left a lot of room at the end.
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@689729
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Wed, 18 Jul 2007 17:08:09 +0000 (17:08 +0000)]
Update APE location after adding new tags.
BUG:122700
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@689608
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Wed, 18 Jul 2007 16:41:10 +0000 (16:41 +0000)]
Make sure that we only write the number of bytes that we read.
BUG:122698
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@689596
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Wed, 18 Jul 2007 15:50:52 +0000 (15:50 +0000)]
Fix SV4 MPC file length. (Read the length at the correct offset.)
BUG:133959
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@689576
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Wed, 18 Jul 2007 15:23:18 +0000 (15:23 +0000)]
Add a string reading function to the frame base class and then use that to read strings
(thus making them unicode safe).
BUG:135123
BUG:135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123135123
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@689562
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Wed, 18 Jul 2007 14:38:40 +0000 (14:38 +0000)]
Brian is right. It makes more sense to compute the alignment based on the offset than the the beginning of the vector.
CCBUG:135123
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@689545
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Wed, 18 Jul 2007 12:52:07 +0000 (12:52 +0000)]
Promote the int to a float so that the calcualtion works properly. Patch from Stephen Booth.
BUG:143938
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@689510
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Wed, 18 Jul 2007 12:48:24 +0000 (12:48 +0000)]
Spelling fixes (first part of a patch from Lucas Lalinsky)
CCBUG:138829
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@689506
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Wed, 18 Jul 2007 11:36:26 +0000 (11:36 +0000)]
Fix RVA setting / parsing. Patch from Stephen Booth.
BUG:107025
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@689477
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Martin Aumüller [Wed, 4 Jul 2007 10:12:22 +0000 (10:12 +0000)]
set correct install_name for os x
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@683171
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Fri, 8 Jun 2007 11:02:49 +0000 (11:02 +0000)]
Remove empty Xiph comments. Patch from Stephan Booth.
BUG:145532
CCMAIL:taglib-devel@kde.org
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@672863
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Michael Pyne [Wed, 6 Jun 2007 03:56:38 +0000 (03:56 +0000)]
Fix another MSVC 2007 STL bug (our bug, not theirs) by not resizing a buffer in
writeBlock. It was possible to resize it to 0 and although it would not be written to
again, the address would be taken of the buffer and MSVC 2007's STL implementation is
strict and will not allow the address of an empty buffer to be taken.
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@672039
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Dirk Mueller [Thu, 31 May 2007 20:51:55 +0000 (20:51 +0000)]
the usual daily unbreak compilation
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@670244
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Michael Pyne [Sat, 26 May 2007 23:03:17 +0000 (23:03 +0000)]
Don't allow address of zero-length array to be taken to prevent run-time errors with
strict STL implementations.
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@668610
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Dirk Mueller [Fri, 4 May 2007 16:15:11 +0000 (16:15 +0000)]
the usual "daily unbreak compilation"
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@661112
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Christian Ehrlicher [Sat, 28 Apr 2007 16:31:29 +0000 (16:31 +0000)]
win32 compile / warnings--
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@658841
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Christian Ehrlicher [Sat, 28 Apr 2007 16:17:30 +0000 (16:17 +0000)]
win32 compile / warnings--
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@658838
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Stephan Kulow [Wed, 11 Apr 2007 20:35:37 +0000 (20:35 +0000)]
don't dereference d twice (CID 3444)
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@652702
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Stephan Kulow [Wed, 11 Apr 2007 20:34:57 +0000 (20:34 +0000)]
don't deref d twice (CID 3445)
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@652701
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Sun, 1 Apr 2007 22:22:53 +0000 (22:22 +0000)]
Check for CBR Info headers also.
BUG:141681
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@649037
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Sun, 1 Apr 2007 22:21:44 +0000 (22:21 +0000)]
SVN_SILENT too many emacs modes...
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@649036
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Sun, 1 Apr 2007 22:08:44 +0000 (22:08 +0000)]
Strip nulls from the end of ID3v2 text fields.
Simplified version of the patch from Xavier Duret.
BUG:141680
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@649032
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Sun, 1 Apr 2007 21:07:08 +0000 (21:07 +0000)]
Add a comment about valid encoding types for ID3v2 tags.
CCBUG:135122
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@649003
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Sun, 1 Apr 2007 20:54:13 +0000 (20:54 +0000)]
Switch to using a list of genres and checking for membership in there to avoid repeated values.
Based on a patch from Xavier Duret.
BUG:141679
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@648998
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Sun, 1 Apr 2007 20:49:15 +0000 (20:49 +0000)]
SVN_SILENT grr, accidentally inserted tabs
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@648997
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Sun, 1 Apr 2007 20:31:03 +0000 (20:31 +0000)]
Strip whitespaces from the end of ID3v1 fields on the way into TagLib.
BUG:141678
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@648986
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Sun, 1 Apr 2007 20:25:54 +0000 (20:25 +0000)]
Delete APE tag.
BUG:141682
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@648984
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Thu, 22 Mar 2007 17:30:29 +0000 (17:30 +0000)]
Fix signature.
BUG:143103
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@645468
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Mon, 26 Feb 2007 11:40:05 +0000 (11:40 +0000)]
SVN_SILENT tabs -> spaces
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@637415
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Fri, 16 Feb 2007 16:15:55 +0000 (16:15 +0000)]
SVN_SILENT whoops, those were tabs
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@634206
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Fri, 16 Feb 2007 14:29:40 +0000 (14:29 +0000)]
Delete d-pointer.
CCBUG:141682
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@634161
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Tue, 13 Feb 2007 10:19:20 +0000 (10:19 +0000)]
SVN_SILENT whoops
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@633141
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Tue, 13 Feb 2007 10:18:30 +0000 (10:18 +0000)]
Read the frame data length as a synch-safe int. (Mostly only relevant to
compressed frames)
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@633140
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Tue, 13 Feb 2007 09:55:56 +0000 (09:55 +0000)]
Don't try to parse invalid frames.
BUG:137635
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@633133
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Tue, 13 Feb 2007 09:26:31 +0000 (09:26 +0000)]
Add another sanity check -- don't let invalid frames try to allocate anything
larger than the tag size.
BUG:140515
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@633123
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Tue, 13 Feb 2007 08:40:58 +0000 (08:40 +0000)]
Fix the byte ordering for UTF16BE
BUG:135121
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@633110
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Tue, 13 Feb 2007 07:21:45 +0000 (07:21 +0000)]
Rework the read-only check so that it gets along better with networked file systems.
CCMAIL:apoikos@gmail.com
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@633092
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Tue, 13 Feb 2007 05:43:10 +0000 (05:43 +0000)]
Actually overwrite the value, as documented.
BUG:141496
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@633078
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Sun, 7 Jan 2007 15:33:21 +0000 (15:33 +0000)]
correct docs
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@620852
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Sun, 7 Jan 2007 15:31:01 +0000 (15:31 +0000)]
Revert this as this change isn't BC
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@620850
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Brad Hards [Tue, 2 Jan 2007 11:54:03 +0000 (11:54 +0000)]
A few spelling fixes, identified using krazy.
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@618883
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Jeff Mitchell [Sat, 23 Dec 2006 01:34:01 +0000 (01:34 +0000)]
Remove check as condition will always be true (checked in the if condition, above).
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@615877
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Laurent Montel [Thu, 7 Dec 2006 14:13:46 +0000 (14:13 +0000)]
Fix warning
Fix create HAVE_ZLIB variable
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@611286
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
André Wöbbeking [Mon, 27 Nov 2006 18:17:05 +0000 (18:17 +0000)]
-pedantic
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@608497
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
André Wöbbeking [Mon, 27 Nov 2006 18:15:11 +0000 (18:15 +0000)]
copied gcc compile flags from FindKDE4Internal.cmake
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@608496
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Laurent Montel [Fri, 10 Nov 2006 10:43:59 +0000 (10:43 +0000)]
Fix compile under windows
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@603814
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Sun, 15 Oct 2006 17:24:13 +0000 (17:24 +0000)]
Uhh, no. Once again, TagLib is not part of KDE and is still used by a lot more things
than JuK, most of which still use Qt 3. If you want to fix the defines to check for the version
that's fine. I'm not too worried about it since the code still works with Qt 4.
CCMAIL:Tim Beaulen <tbscope@gmail.com>
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@595794
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Tim Beaulen [Sun, 15 Oct 2006 08:04:12 +0000 (08:04 +0000)]
replace uft8() with toUtf8() to silence warnings in Juk.
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@595632
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Thu, 12 Oct 2006 21:11:48 +0000 (21:11 +0000)]
Don't dereference the iterator before checking its validity.
CCMAIL:taglib-devel@kde.org
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@594940
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
David Faure [Thu, 12 Oct 2006 10:50:45 +0000 (10:50 +0000)]
fix make install - I guess examples shouldn't actually be installed
(I see that Makefile.am required "make examples" explicitly)
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@594795
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Scott Wheeler [Mon, 9 Oct 2006 02:51:52 +0000 (02:51 +0000)]
SVN_SILENT spacing
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@593781
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da
Brad Hards [Sun, 8 Oct 2006 06:28:19 +0000 (06:28 +0000)]
Change the taglib build system to use relative include paths.
This allows you to build taglib either as part of kdesupport
(i.e. with a source directory of kdesupport/) or by itself
(i.e. with a source directory of kdesupport/taglib/).
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@593544
283d02a7 -25f6-0310-bc7c-
ecb5cbfe19da