index.html revision 8b3fae3cc7f7b249884b16f95b1599d7e5bce775
1c81d5b6205bf762093632de2cd7125de3d10eed5Dmitry Shmidt<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 2c81d5b6205bf762093632de2cd7125de3d10eed5Dmitry Shmidt "http://www.w3.org/TR/html4/strict.dtd"> 3c81d5b6205bf762093632de2cd7125de3d10eed5Dmitry Shmidt<!-- Material used from: HTML 4.01 specs: http://www.w3.org/TR/html401/ --> 4c81d5b6205bf762093632de2cd7125de3d10eed5Dmitry Shmidt<html> 5c81d5b6205bf762093632de2cd7125de3d10eed5Dmitry Shmidt<head> 6c81d5b6205bf762093632de2cd7125de3d10eed5Dmitry Shmidt <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <title>"libc++" C++ Standard Library</title> 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <link type="text/css" rel="stylesheet" href="menu.css"> 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <link type="text/css" rel="stylesheet" href="content.css"> 10bbda627478b0e9a312fea4662cd7cd8d6bdf82bfJeff Brown</head> 11bbda627478b0e9a312fea4662cd7cd8d6bdf82bfJeff Brown 12bbda627478b0e9a312fea4662cd7cd8d6bdf82bfJeff Brown<body> 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt<div id="menu"> 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <div> 15e61a2d6db6113da5fad91660764afdb0596dbc46Dmitry Shmidt <a href="http://llvm.org/">LLVM Home</a> 16e61a2d6db6113da5fad91660764afdb0596dbc46Dmitry Shmidt </div> 177dd0f2072342a04eeead17ed975b639d89eb4589Dmitry Shmidt 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <div class="submenu"> 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <label>libc++ Info</label> 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <a href="/index.html">About</a> 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt </div> 2295613e49a5d2b830b45757efdb7144fd668f23aeDmitry Shmidt 2395613e49a5d2b830b45757efdb7144fd668f23aeDmitry Shmidt <div class="submenu"> 24648b7492d15bb4efaeebdfdd8bd261563a5f6227Dmitry Shmidt <label>Quick Links</label> 25648b7492d15bb4efaeebdfdd8bd261563a5f6227Dmitry Shmidt <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev">cfe-dev</a> 26648b7492d15bb4efaeebdfdd8bd261563a5f6227Dmitry Shmidt <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits">cfe-commits</a> 27f9bdef99ce3b2858f2812c745a3d6bb093fb0e5dDmitry Shmidt <a href="http://llvm.org/bugs/">Bug Reports</a> 28f9bdef99ce3b2858f2812c745a3d6bb093fb0e5dDmitry Shmidt <a href="http://llvm.org/svn/llvm-project/libcxx/trunk/">Browse SVN</a> 29f9bdef99ce3b2858f2812c745a3d6bb093fb0e5dDmitry Shmidt <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/">Browse ViewVC</a> 30b58836ed5520bf4b769f76ef7dcb802af8c900b8Dmitry Shmidt </div> 310cc49e8db007f71888bf706420edfc530cf4fbffMike J. Chen</div> 32b58836ed5520bf4b769f76ef7dcb802af8c900b8Dmitry Shmidt 33b58836ed5520bf4b769f76ef7dcb802af8c900b8Dmitry Shmidt<div id="content"> 340cc49e8db007f71888bf706420edfc530cf4fbffMike J. Chen <!--*********************************************************************--> 350cc49e8db007f71888bf706420edfc530cf4fbffMike J. Chen <h1>"libc++" C++ Standard Library</h1> 36205f2142134d2f3475fe1f893575df8f809eede4Jeff Johnson <!--*********************************************************************--> 37205f2142134d2f3475fe1f893575df8f809eede4Jeff Johnson 38205f2142134d2f3475fe1f893575df8f809eede4Jeff Johnson <p>libc++ is a new implementation of the C++ standard library, targeting 39205f2142134d2f3475fe1f893575df8f809eede4Jeff Johnson C++0X.</p> 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <p>All of the code in libc++ is <a 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt href="http://llvm.org/docs/DeveloperPolicy.html#license">dual licensed</a> 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt under the MIT license and the UIUC License (a BSD-like license).</p> 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <!--=====================================================================--> 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <h2 id="goals">Features and Goals</h2> 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <!--=====================================================================--> 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 49f1396b4ebf0d67866b9fba2655c3f9f3327fb0a2Stephen Smalley <ul> 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <li>Correctness as defined by the (currently draft) C++0X standard.</li> 51cd44645b48dc2161fa6c018235aaf4b6a804d576Dmitry Shmidt <li>Fast execution.</li> 52d620e6d0ba63c86303e656e844f89102588ffdb6Dmitry Shmidt <li>Minimal memory use.</li> 53cd44645b48dc2161fa6c018235aaf4b6a804d576Dmitry Shmidt <li>Fast compile times.</li> 54cd44645b48dc2161fa6c018235aaf4b6a804d576Dmitry Shmidt <li>ABI compatibility with gcc's libstdc++ for some low-level features 55cd44645b48dc2161fa6c018235aaf4b6a804d576Dmitry Shmidt such as exception objects, rtti and memory allocation.</li> 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <li>Extensive unit tests.</li> 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt </ul> 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <!--=====================================================================--> 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <h2 id="why">Why a new C++ Standard Library for C++'0x?</h2> 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <!--=====================================================================--> 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <p>After its initial introduction, many people have asked "why start a new 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt library instead of contributing to an existing library?" (like Apache's 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt libstdcxx, GNU's libstdc++, STLport, etc). There are many contributing 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reasons, but some of the major ones are:</p> 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <ul> 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <li><p>From years of experience (including having implemented the standard 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt library before), we've learned many things about implementing 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt the standard containers which require ABI breakage and fundamental changes 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt to how they are implemented. For example, it is generally accepted that 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt building std::string using the "short string optimization" instead of 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt using Copy On Write (COW) is a superior approach for multicore 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt machines (particularly in C++'0x, which has rvalue references). Breaking 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ABI compatibility with old versions of the library was 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt determined to be critical to achieving the performance goals of 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt libc++.</p></li> 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <li><p>Mainline libstdc++ has switched to GPL3, a license which the developers 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt of libc++ cannot use. libstdc++ 4.2 (the last GPL2 version) could be 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt independently extended to support C++'0x, but this would be a fork of the 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt codebase (which is often seen as worse for a project than starting a new 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt independent one). Another problem with libstdc++ is that it is tightly 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt integrated with G++ development, tending to be tied fairly closely to the 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt matching version of G++.</p> 87d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt </li> 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <li><p>STLport and the Apache libstdcxx library are two other popular 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt candidates, but both lack C++'0x support. Our experience (and the 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt experience of libstdc++ developers) is that adding support for C++0x (in 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt particular rvalue references and move-only types) requires changes to 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt almost every class and function, essentially amounting to a rewrite. 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Faced with a rewrite, we decided to start from scratch and evaluate every 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt design decision from first principles based on experience.</p> 961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt <p>Further, both projects are apparently abandoned: STLport 5.2.1 was 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt released in Oct'08, and STDCXX 4.2.1 in May'08.</p> 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt </ul> 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <!--=====================================================================--> 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <h2 id="requirements">Platform Support</h2> 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <!--=====================================================================--> 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <p>libc++ is known to work on the following platforms, using g++-4.2 and 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt clang (lack of C++0X language support disables some functionality).</p> 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <ul> 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <li>Mac OS X i386</li> 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <li>Mac OS X x86_64</li> 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt </ul> 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <!--=====================================================================--> 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <h2 id="dir-structure">Current Status</h2> 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <!--=====================================================================--> 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <p>libc++ is still under development. It has about 98% of 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3126.pdf">N3126</a> 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt implemented/tested. C++'98 support is fully featured, and most of C++'0x 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt support is as well. The only major missing piece of C++'0x support is 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <code><atomic></code>.</p> 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <p><a href="libcxx_by_chapter.pdf">Here</a> is a by-chapter breakdown of what 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt is passing tests and what isn't. This chart is currently based on testing 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt against g++-4.4.0 with -std=c++0x. </p> 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <!--=====================================================================--> 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <h2>Get it and get involved!</h2> 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <!--=====================================================================--> 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <p>To check out the code, use:</p> 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <ul> 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <li><code>svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx</code></li> 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt </ul> 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <p>To build on Mac OS X 10.6, you need a helper library and header 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <a href="http://home.roadrunner.com/~hinnant/libcppabi.zip">found here</a>. 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cp cxxabi.h to /usr/include, and cp libc++abi.dylib to /usr/lib. 141fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt <p> 142fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 143fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt <p> 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Next: 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt </p> 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <ul> 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <li><code>cd libcxx/lib</code></li> 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <li><code>export TRIPLE=-apple-</code></li> 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <li><code>/buildit</code></li> 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt </ul> 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <p> 15461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt That should result in a libc++.1.dylib. To install it I like to use links 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt instead of copying, but either should work: 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt </p> 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <ul> 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <li><code>cd /usr/lib</code></li> 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <li><code>sudo ln -sf path-to-libcxx/lib/libc++.1.dylib libc++.1.dylib</code></li> 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <li><code>sudo ln -sf libc++.1.dylib libc++.dylib</code></li> 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <li><code>cd /usr/include/c++</code></li> 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <li><code>sudo ln -sf path-to-libcxx/include v1</code></li> 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt </ul> 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <p> 16761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt To use with clang you can: 16861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt </p> 16961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 17061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt <ul> 17161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt <li><code>clang++ -stdlib=libc++ test.cpp</code></li> 17261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt <li><code>clang++ -std=c++0x -stdlib=libc++ test.cpp</code></li> 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt </ul> 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <p>To run the libc++ test suit (recommended):</p> 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <ul> 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <li><code>cd libcxx/test</code></li> 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <li><code>/testit</code></li> 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <ul> 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <li>On Mac OS 10.6, to work around bugs in libc headers like 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt math.h and inttypes.h, add "-U__STRICT_ANSI__" and 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "-D__STDC_FORMAT_MACROS" to the command line with: 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <blockquote> 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <pre>export OPTIONS="-std=c++0x -stdlib=libc++ -U__STRICT_ANSI__ -D__STDC_FORMAT_MACROS"</pre> 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt </blockquote></li> 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <li>People porting libc++ to other OSes will likely have to 1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt define similar macros.</li> 1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt </ul> 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt </ul> 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <p>Send discussions to the 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev">clang mailing list</a>).</p> 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <!--=====================================================================--> 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <h2>Design Documents</h2> 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt <!--=====================================================================--> 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt<ul> 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt<li><a href="atomic_design.html"><tt><atomic></tt></a></li> 201f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt<li><a href="type_traits_design.html"><tt><type_traits></tt></a></li> 202f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt</ul> 203f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 204f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt</div> 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt</body> 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt</html> 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt