summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin')
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/LICENSE201
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/MANIFEST354
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/PKG-INFO316
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/README.chromium16
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/README.rst153
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/__init__.py39
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/include/cext.h244
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/__init__.py27
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/commands.py267
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/data.py165
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/dist.py51
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/ext.py254
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/setup.py419
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/shell.py478
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/term/__init__.py28
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/term/_term.py115
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/util.py73
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/__init__.py27
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/commands.py266
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/data.py165
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/dist.py51
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/ext.py253
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/setup.py420
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/shell.py351
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/term/__init__.py28
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/term/_term.py116
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/util.py63
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/LICENSE.cssmin64
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/__init__.py30
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/cssmin.py246
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/main.py236
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/wikipedia.css3861
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/wikipedia.min.css1
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/write.py344
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/BENCHMARKS61
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/CHANGES42
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/CLASSIFIERS19
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/DESCRIPTION85
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/PROVIDES1
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/SUMMARY1
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/api-objects.txt6
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/crarr.pngbin0 -> 340 bytes
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/epydoc.css322
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/epydoc.js293
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/help.html261
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/identifier-index.html163
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/index.html224
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/module-tree.html94
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/rcssmin-module.html224
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/rcssmin-pysrc.html477
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/redirect.html38
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/package.cfg84
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/rcssmin.c1163
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/rcssmin.py374
-rwxr-xr-xchromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/run_tests.py166
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/setup.py42
56 files changed, 13862 insertions, 0 deletions
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/LICENSE b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/LICENSE
new file mode 100644
index 00000000000..261eeb9e9f8
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/MANIFEST b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/MANIFEST
new file mode 100644
index 00000000000..a0384d9c1b4
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/MANIFEST
@@ -0,0 +1,354 @@
+LICENSE
+MANIFEST
+PKG-INFO
+README.rst
+_setup/__init__.py
+_setup/include/cext.h
+_setup/py2/__init__.py
+_setup/py2/commands.py
+_setup/py2/data.py
+_setup/py2/dist.py
+_setup/py2/ext.py
+_setup/py2/setup.py
+_setup/py2/shell.py
+_setup/py2/term/__init__.py
+_setup/py2/term/_term.py
+_setup/py2/util.py
+_setup/py3/__init__.py
+_setup/py3/commands.py
+_setup/py3/data.py
+_setup/py3/dist.py
+_setup/py3/ext.py
+_setup/py3/setup.py
+_setup/py3/shell.py
+_setup/py3/term/__init__.py
+_setup/py3/term/_term.py
+_setup/py3/util.py
+bench
+bench.sh
+bench/LICENSE.cssmin
+bench/__init__.py
+bench/cssmin.py
+bench/main.py
+bench/wikipedia.css
+bench/wikipedia.min.css
+bench/write.py
+docs/BENCHMARKS
+docs/CHANGES
+docs/CLASSIFIERS
+docs/DESCRIPTION
+docs/PROVIDES
+docs/SUMMARY
+docs/apidoc/api-objects.txt
+docs/apidoc/crarr.png
+docs/apidoc/epydoc.css
+docs/apidoc/epydoc.js
+docs/apidoc/help.html
+docs/apidoc/identifier-index.html
+docs/apidoc/index.html
+docs/apidoc/module-tree.html
+docs/apidoc/rcssmin-module.html
+docs/apidoc/rcssmin-pysrc.html
+docs/apidoc/redirect.html
+package.cfg
+rcssmin.c
+rcssmin.py
+run_tests.py
+setup.py
+tests
+tests/main/atgroup_00.css
+tests/main/atgroup_01.css
+tests/main/atgroup_02.css
+tests/main/atgroup_03.css
+tests/main/atgroup_04.css
+tests/main/atgroup_05.css
+tests/main/atgroup_06.css
+tests/main/atgroup_07.css
+tests/main/atgroup_08.css
+tests/main/atgroup_09.css
+tests/main/atgroup_10.css
+tests/main/atgroup_11.css
+tests/main/comment_00.css
+tests/main/comment_01.css
+tests/main/comment_02.css
+tests/main/comment_03.css
+tests/main/comment_04.css
+tests/main/escape_00.css
+tests/main/escape_01.css
+tests/main/escape_02.css
+tests/main/escape_03.css
+tests/main/escape_04.css
+tests/main/escape_05.css
+tests/main/escape_06.css
+tests/main/first_00.css
+tests/main/first_01.css
+tests/main/first_02.css
+tests/main/out/atgroup_00.out
+tests/main/out/atgroup_00.out.b
+tests/main/out/atgroup_01.out
+tests/main/out/atgroup_01.out.b
+tests/main/out/atgroup_02.out
+tests/main/out/atgroup_02.out.b
+tests/main/out/atgroup_03.out
+tests/main/out/atgroup_03.out.b
+tests/main/out/atgroup_04.out
+tests/main/out/atgroup_04.out.b
+tests/main/out/atgroup_05.out
+tests/main/out/atgroup_05.out.b
+tests/main/out/atgroup_06.out
+tests/main/out/atgroup_06.out.b
+tests/main/out/atgroup_07.out
+tests/main/out/atgroup_07.out.b
+tests/main/out/atgroup_08.out
+tests/main/out/atgroup_08.out.b
+tests/main/out/atgroup_09.out
+tests/main/out/atgroup_09.out.b
+tests/main/out/atgroup_10.out
+tests/main/out/atgroup_10.out.b
+tests/main/out/atgroup_11.out
+tests/main/out/atgroup_11.out.b
+tests/main/out/comment_00.out
+tests/main/out/comment_00.out.b
+tests/main/out/comment_01.out
+tests/main/out/comment_01.out.b
+tests/main/out/comment_02.out
+tests/main/out/comment_02.out.b
+tests/main/out/comment_03.out
+tests/main/out/comment_03.out.b
+tests/main/out/comment_04.out
+tests/main/out/comment_04.out.b
+tests/main/out/escape_00.out
+tests/main/out/escape_00.out.b
+tests/main/out/escape_01.out
+tests/main/out/escape_01.out.b
+tests/main/out/escape_02.out
+tests/main/out/escape_02.out.b
+tests/main/out/escape_03.out
+tests/main/out/escape_03.out.b
+tests/main/out/escape_04.out
+tests/main/out/escape_04.out.b
+tests/main/out/escape_05.out
+tests/main/out/escape_05.out.b
+tests/main/out/escape_06.out
+tests/main/out/escape_06.out.b
+tests/main/out/first_00.out
+tests/main/out/first_00.out.b
+tests/main/out/first_01.out
+tests/main/out/first_01.out.b
+tests/main/out/first_02.out
+tests/main/out/first_02.out.b
+tests/main/out/url_00.out
+tests/main/out/url_00.out.b
+tests/main/out/url_01.out
+tests/main/out/url_01.out.b
+tests/main/out/url_02.out
+tests/main/out/url_02.out.b
+tests/main/out/url_03.out
+tests/main/out/url_03.out.b
+tests/main/out/url_04.out
+tests/main/out/url_04.out.b
+tests/main/out/url_05.out
+tests/main/out/url_05.out.b
+tests/main/out/url_06.out
+tests/main/out/url_06.out.b
+tests/main/out/url_07.out
+tests/main/out/url_07.out.b
+tests/main/out/url_08.out
+tests/main/out/url_08.out.b
+tests/main/out/url_09.out
+tests/main/out/url_09.out.b
+tests/main/url_00.css
+tests/main/url_01.css
+tests/main/url_02.css
+tests/main/url_03.css
+tests/main/url_04.css
+tests/main/url_05.css
+tests/main/url_06.css
+tests/main/url_07.css
+tests/main/url_08.css
+tests/main/url_09.css
+tests/yui/README
+tests/yui/background-position.css
+tests/yui/background-position.css.min
+tests/yui/border-none.css
+tests/yui/border-none.css.min
+tests/yui/box-model-hack.css
+tests/yui/box-model-hack.css.min
+tests/yui/bug2527974.css
+tests/yui/bug2527974.css.min
+tests/yui/bug2527991.css
+tests/yui/bug2527991.css.min
+tests/yui/bug2527998.css
+tests/yui/bug2527998.css.min
+tests/yui/bug2528034.css
+tests/yui/bug2528034.css.min
+tests/yui/charset-media.css
+tests/yui/charset-media.css.min
+tests/yui/color-simple.css
+tests/yui/color-simple.css.min
+tests/yui/color.css
+tests/yui/color.css.min
+tests/yui/comment.css
+tests/yui/comment.css.min
+tests/yui/concat-charset.css
+tests/yui/concat-charset.css.min
+tests/yui/dataurl-base64-doublequotes.css
+tests/yui/dataurl-base64-doublequotes.css.min
+tests/yui/dataurl-base64-eof.css
+tests/yui/dataurl-base64-eof.css.min
+tests/yui/dataurl-base64-linebreakindata.css
+tests/yui/dataurl-base64-linebreakindata.css.min
+tests/yui/dataurl-base64-noquotes.css
+tests/yui/dataurl-base64-noquotes.css.min
+tests/yui/dataurl-base64-singlequotes.css
+tests/yui/dataurl-base64-singlequotes.css.min
+tests/yui/dataurl-base64-twourls.css
+tests/yui/dataurl-base64-twourls.css.min
+tests/yui/dataurl-dbquote-font.css
+tests/yui/dataurl-dbquote-font.css.min
+tests/yui/dataurl-nonbase64-doublequotes.css
+tests/yui/dataurl-nonbase64-doublequotes.css.min
+tests/yui/dataurl-nonbase64-noquotes.css
+tests/yui/dataurl-nonbase64-noquotes.css.min
+tests/yui/dataurl-nonbase64-singlequotes.css
+tests/yui/dataurl-nonbase64-singlequotes.css.min
+tests/yui/dataurl-noquote-multiline-font.css
+tests/yui/dataurl-noquote-multiline-font.css.min
+tests/yui/dataurl-realdata-doublequotes.css
+tests/yui/dataurl-realdata-doublequotes.css.min
+tests/yui/dataurl-realdata-noquotes.css
+tests/yui/dataurl-realdata-noquotes.css.min
+tests/yui/dataurl-realdata-singlequotes.css
+tests/yui/dataurl-realdata-singlequotes.css.min
+tests/yui/dataurl-realdata-yuiapp.css
+tests/yui/dataurl-realdata-yuiapp.css.min
+tests/yui/dataurl-singlequote-font.css
+tests/yui/dataurl-singlequote-font.css.min
+tests/yui/decimals.css
+tests/yui/decimals.css.min
+tests/yui/dollar-header.css
+tests/yui/dollar-header.css.min
+tests/yui/font-face.css
+tests/yui/font-face.css.min
+tests/yui/ie5mac.css
+tests/yui/ie5mac.css.min
+tests/yui/media-empty-class.css
+tests/yui/media-empty-class.css.min
+tests/yui/media-multi.css
+tests/yui/media-multi.css.min
+tests/yui/media-test.css
+tests/yui/media-test.css.min
+tests/yui/opacity-filter.css
+tests/yui/opacity-filter.css.min
+tests/yui/out/background-position.out
+tests/yui/out/background-position.out.b
+tests/yui/out/border-none.out
+tests/yui/out/border-none.out.b
+tests/yui/out/box-model-hack.out
+tests/yui/out/box-model-hack.out.b
+tests/yui/out/bug2527974.out
+tests/yui/out/bug2527974.out.b
+tests/yui/out/bug2527991.out
+tests/yui/out/bug2527991.out.b
+tests/yui/out/bug2527998.out
+tests/yui/out/bug2527998.out.b
+tests/yui/out/bug2528034.out
+tests/yui/out/bug2528034.out.b
+tests/yui/out/charset-media.out
+tests/yui/out/charset-media.out.b
+tests/yui/out/color-simple.out
+tests/yui/out/color-simple.out.b
+tests/yui/out/color.out
+tests/yui/out/color.out.b
+tests/yui/out/comment.out
+tests/yui/out/comment.out.b
+tests/yui/out/concat-charset.out
+tests/yui/out/concat-charset.out.b
+tests/yui/out/dataurl-base64-doublequotes.out
+tests/yui/out/dataurl-base64-doublequotes.out.b
+tests/yui/out/dataurl-base64-eof.out
+tests/yui/out/dataurl-base64-eof.out.b
+tests/yui/out/dataurl-base64-linebreakindata.out
+tests/yui/out/dataurl-base64-linebreakindata.out.b
+tests/yui/out/dataurl-base64-noquotes.out
+tests/yui/out/dataurl-base64-noquotes.out.b
+tests/yui/out/dataurl-base64-singlequotes.out
+tests/yui/out/dataurl-base64-singlequotes.out.b
+tests/yui/out/dataurl-base64-twourls.out
+tests/yui/out/dataurl-base64-twourls.out.b
+tests/yui/out/dataurl-dbquote-font.out
+tests/yui/out/dataurl-dbquote-font.out.b
+tests/yui/out/dataurl-nonbase64-doublequotes.out
+tests/yui/out/dataurl-nonbase64-doublequotes.out.b
+tests/yui/out/dataurl-nonbase64-noquotes.out
+tests/yui/out/dataurl-nonbase64-noquotes.out.b
+tests/yui/out/dataurl-nonbase64-singlequotes.out
+tests/yui/out/dataurl-nonbase64-singlequotes.out.b
+tests/yui/out/dataurl-noquote-multiline-font.out
+tests/yui/out/dataurl-noquote-multiline-font.out.b
+tests/yui/out/dataurl-realdata-doublequotes.out
+tests/yui/out/dataurl-realdata-doublequotes.out.b
+tests/yui/out/dataurl-realdata-noquotes.out
+tests/yui/out/dataurl-realdata-noquotes.out.b
+tests/yui/out/dataurl-realdata-singlequotes.out
+tests/yui/out/dataurl-realdata-singlequotes.out.b
+tests/yui/out/dataurl-realdata-yuiapp.out
+tests/yui/out/dataurl-realdata-yuiapp.out.b
+tests/yui/out/dataurl-singlequote-font.out
+tests/yui/out/dataurl-singlequote-font.out.b
+tests/yui/out/decimals.out
+tests/yui/out/decimals.out.b
+tests/yui/out/dollar-header.out
+tests/yui/out/dollar-header.out.b
+tests/yui/out/font-face.out
+tests/yui/out/font-face.out.b
+tests/yui/out/ie5mac.out
+tests/yui/out/ie5mac.out.b
+tests/yui/out/media-empty-class.out
+tests/yui/out/media-empty-class.out.b
+tests/yui/out/media-multi.out
+tests/yui/out/media-multi.out.b
+tests/yui/out/media-test.out
+tests/yui/out/media-test.out.b
+tests/yui/out/opacity-filter.out
+tests/yui/out/opacity-filter.out.b
+tests/yui/out/preserve-case.out
+tests/yui/out/preserve-case.out.b
+tests/yui/out/preserve-new-line.out
+tests/yui/out/preserve-new-line.out.b
+tests/yui/out/preserve-strings.out
+tests/yui/out/preserve-strings.out.b
+tests/yui/out/pseudo-first.out
+tests/yui/out/pseudo-first.out.b
+tests/yui/out/pseudo.out
+tests/yui/out/pseudo.out.b
+tests/yui/out/special-comments.out
+tests/yui/out/special-comments.out.b
+tests/yui/out/star-underscore-hacks.out
+tests/yui/out/star-underscore-hacks.out.b
+tests/yui/out/string-in-comment.out
+tests/yui/out/string-in-comment.out.b
+tests/yui/out/webkit-transform.out
+tests/yui/out/webkit-transform.out.b
+tests/yui/out/zeros.out
+tests/yui/out/zeros.out.b
+tests/yui/preserve-case.css
+tests/yui/preserve-case.css.min
+tests/yui/preserve-new-line.css
+tests/yui/preserve-new-line.css.min
+tests/yui/preserve-strings.css
+tests/yui/preserve-strings.css.min
+tests/yui/pseudo-first.css
+tests/yui/pseudo-first.css.min
+tests/yui/pseudo.css
+tests/yui/pseudo.css.min
+tests/yui/special-comments.css
+tests/yui/special-comments.css.min
+tests/yui/star-underscore-hacks.css
+tests/yui/star-underscore-hacks.css.min
+tests/yui/string-in-comment.css
+tests/yui/string-in-comment.css.min
+tests/yui/webkit-transform.css
+tests/yui/webkit-transform.css.min
+tests/yui/zeros.css
+tests/yui/zeros.css.min
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/PKG-INFO b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/PKG-INFO
new file mode 100644
index 00000000000..d4ee866c986
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/PKG-INFO
@@ -0,0 +1,316 @@
+Metadata-Version: 1.1
+Name: rcssmin
+Version: 1.0.5
+Summary: CSS Minifier
+Home-page: http://opensource.perlig.de/rcssmin/
+Author: André Malo
+Author-email: nd@perlig.de
+License: Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+Download-URL: http://storage.perlig.de/rcssmin/
+Description: ==============
+ CSS Minifier
+ ==============
+
+ RCSSmin is a CSS minifier.
+
+ The minifier is based on the semantics of the `YUI compressor`_\, which itself
+ is based on `the rule list by Isaac Schlueter`_\.
+
+ This module is a re-implementation aiming for speed instead of maximum
+ compression, so it can be used at runtime (rather than during a preprocessing
+ step). RCSSmin does syntactical compression only (removing spaces, comments
+ and possibly semicolons). It does not provide semantic compression (like
+ removing empty blocks, collapsing redundant properties etc). It does, however,
+ support various CSS hacks (by keeping them working as intended).
+
+ Here's a feature list:
+
+ - Strings are kept, except that escaped newlines are stripped
+ - Space/Comments before the very end or before various characters are
+ stripped: ``:{});=>+],!`` (The colon (``:``) is a special case, a single
+ space is kept if it's outside a ruleset.)
+ - Space/Comments at the very beginning or after various characters are
+ stripped: ``{}(=:>+[,!``
+ - Optional space after unicode escapes is kept, resp. replaced by a simple
+ space
+ - whitespaces inside ``url()`` definitions are stripped
+ - Comments starting with an exclamation mark (``!``) can be kept optionally.
+ - All other comments and/or whitespace characters are replaced by a single
+ space.
+ - Multiple consecutive semicolons are reduced to one
+ - The last semicolon within a ruleset is stripped
+ - CSS Hacks supported:
+
+ - IE7 hack (``>/**/``)
+ - Mac-IE5 hack (``/*\*/.../**/``)
+ - The boxmodelhack is supported naturally because it relies on valid CSS2
+ strings
+ - Between ``:first-line`` and the following comma or curly brace a space is
+ inserted. (apparently it's needed for IE6)
+ - Same for ``:first-letter``
+
+ rcssmin.c is a reimplementation of rcssmin.py in C and improves runtime up to
+ factor 100 or so (depending on the input). docs/BENCHMARKS in the source
+ distribution contains the details.
+
+ Both python 2 (>= 2.4) and python 3 are supported.
+
+ .. _YUI compressor: https://github.com/yui/yuicompressor/
+
+ .. _the rule list by Isaac Schlueter: https://github.com/isaacs/cssmin/
+
+
+ Copyright and License
+ ~~~~~~~~~~~~~~~~~~~~~
+
+ Copyright 2011 - 2014
+ André Malo or his licensors, as applicable.
+
+ The whole package (except for the files in the bench/ directory) is
+ distributed under the Apache License Version 2.0. You'll find a copy in the
+ root directory of the distribution or online at:
+ <http://www.apache.org/licenses/LICENSE-2.0>.
+
+
+ Bugs
+ ~~~~
+
+ No bugs, of course. ;-)
+ But if you've found one or have an idea how to improve rcssmin, feel free
+ to send a pull request on `github <https://github.com/ndparker/rcssmin>`_
+ or send a mail to <rcssmin-bugs@perlig.de>.
+
+
+ Author Information
+ ~~~~~~~~~~~~~~~~~~
+
+ André "nd" Malo <nd perlig.de>
+ GPG: 0x8103A37E
+
+
+ If God intended people to be naked, they would be born that way.
+ -- Oscar Wilde
+
+ .. vim:tw=72 syntax=rest
+Keywords: CSS,Minimization
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Web Environment
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved
+Classifier: License :: OSI Approved :: Apache License, Version 2.0
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: C
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: Jython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
+Classifier: Topic :: Software Development :: Libraries
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Topic :: Text Processing
+Classifier: Topic :: Text Processing :: Filters
+Classifier: Topic :: Utilities
+Provides: rcssmin (1.0)
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/README.chromium b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/README.chromium
new file mode 100644
index 00000000000..b1350fc9fa4
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/README.chromium
@@ -0,0 +1,16 @@
+Name: rCSSmin
+Short Name: rcssmin
+URL: http://opensource.perlig.de/rcssmin/
+Version: 1.0.5
+License: Apache 2.0
+License File: NOT_SHIPPED
+Security Critical: no
+
+Description:
+rCSSmin is a CSS minifier written in python.
+The minifier is based on the semantics of the YUI compressor, which itself is
+based on the rule list by Isaac Schlueter.
+
+Modifications made:
+ - Removed the bench.sh since the file doesn't have the licensing info and
+ caused license checker to fail.
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/README.rst b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/README.rst
new file mode 100644
index 00000000000..95fb3083a89
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/README.rst
@@ -0,0 +1,153 @@
+.. -*- coding: utf-8 -*-
+
+=====================================
+ rCSSmin - A CSS Minifier For Python
+=====================================
+
+TABLE OF CONTENTS
+-----------------
+
+1. Introduction
+2. Copyright and License
+3. System Requirements
+4. Installation
+5. Documentation
+6. Bugs
+7. Author Information
+
+
+INTRODUCTION
+------------
+
+RCSSmin is a CSS minifier written in python.
+
+The minifier is based on the semantics of the `YUI compressor`_\, which itself
+is based on `the rule list by Isaac Schlueter`_\.
+
+This module is a re-implementation aiming for speed instead of maximum
+compression, so it can be used at runtime (rather than during a preprocessing
+step). RCSSmin does syntactical compression only (removing spaces, comments
+and possibly semicolons). It does not provide semantic compression (like
+removing empty blocks, collapsing redundant properties etc). It does, however,
+support various CSS hacks (by keeping them working as intended).
+
+Here's a feature list:
+
+- Strings are kept, except that escaped newlines are stripped
+- Space/Comments before the very end or before various characters are
+ stripped: ``:{});=>+],!`` (The colon (``:``) is a special case, a single
+ space is kept if it's outside a ruleset.)
+- Space/Comments at the very beginning or after various characters are
+ stripped: ``{}(=:>+[,!``
+- Optional space after unicode escapes is kept, resp. replaced by a simple
+ space
+- whitespaces inside ``url()`` definitions are stripped
+- Comments starting with an exclamation mark (``!``) can be kept optionally.
+- All other comments and/or whitespace characters are replaced by a single
+ space.
+- Multiple consecutive semicolons are reduced to one
+- The last semicolon within a ruleset is stripped
+- CSS Hacks supported:
+
+ - IE7 hack (``>/**/``)
+ - Mac-IE5 hack (``/*\*/.../**/``)
+ - The boxmodelhack is supported naturally because it relies on valid CSS2
+ strings
+ - Between ``:first-line`` and the following comma or curly brace a space is
+ inserted. (apparently it's needed for IE6)
+ - Same for ``:first-letter``
+
+rcssmin.c is a reimplementation of rcssmin.py in C and improves runtime up to
+factor 100 or so (depending on the input). docs/BENCHMARKS in the source
+distribution contains the details.
+
+.. _YUI compressor: https://github.com/yui/yuicompressor/
+
+.. _the rule list by Isaac Schlueter: https://github.com/isaacs/cssmin/
+
+
+COPYRIGHT AND LICENSE
+---------------------
+
+Copyright 2011 - 2014
+André Malo or his licensors, as applicable.
+
+The whole package (except for the files in the bench/ directory)
+is distributed under the Apache License Version 2.0. You'll find a copy in the
+root directory of the distribution or online at:
+<http://www.apache.org/licenses/LICENSE-2.0>.
+
+
+SYSTEM REQUIREMENTS
+-------------------
+
+Both python 2 (>=2.4) and python 3 are supported.
+
+
+INSTALLATION
+------------
+
+Using pip
+~~~~~~~~~
+
+$ pip install rcssmin
+
+
+Using distutils
+~~~~~~~~~~~~~~~
+
+$ python setup.py install
+
+The following extra options to the install command may be of interest:
+
+ --without-c-extensions Don't install C extensions
+ --without-docs Do not install documentation files
+
+
+Drop-in
+~~~~~~~
+
+rCSSmin effectively consists of two files: rcssmin.py and rcssmin.c, the
+latter being entirely optional. So, for simple integration you can just
+copy rcssmin.py into your project and use it.
+
+
+DOCUMENTATION
+-------------
+
+A generated API documentation is available in the docs/apidoc/ directory.
+But you can just look into the module. It provides a simple function,
+called cssmin which takes the CSS as a string and returns the minified
+CSS as a string.
+
+The module additionally provides a "streamy" interface:
+
+$ python -mrcssmin <css >minified
+
+It takes two options:
+
+ -b Keep bang-comments (Comments starting with an exclamation mark)
+ -p Force using the python implementation (not the C implementation)
+
+The latest documentation is also available online at
+<http://opensource.perlig.de/rcssmin/>.
+
+
+BUGS
+----
+
+No bugs, of course. ;-)
+But if you've found one or have an idea how to improve rcssmin, feel free to
+send a pull request on `github <https://github.com/ndparker/rcssmin>`_ or
+send a mail to <rcssmin-bugs@perlig.de>.
+
+
+AUTHOR INFORMATION
+------------------
+
+André "nd" Malo <nd@perlig.de>
+GPG: 0x8103A37E
+
+
+ If God intended people to be naked, they would be born that way.
+ -- Oscar Wilde
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/__init__.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/__init__.py
new file mode 100644
index 00000000000..77dc23c8412
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/__init__.py
@@ -0,0 +1,39 @@
+# -*- coding: ascii -*-
+#
+# Copyright 2007, 2008, 2009, 2010, 2011
+# Andr\xe9 Malo or his licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+================
+ Package _setup
+================
+
+This package provides tools for main package setup.
+"""
+__author__ = "Andr\xe9 Malo"
+__docformat__ = "restructuredtext en"
+
+import os as _os
+import sys as _sys
+
+if _sys.version_info[0] == 2:
+ __path__ = [_os.path.join(__path__[0], 'py2')]
+ __author__ = __author__.decode('latin-1')
+elif _sys.version_info[0] == 3:
+ __path__ = [_os.path.join(__path__[0], 'py3')]
+else:
+ raise RuntimeError("Unsupported python version")
+del _os, _sys
+
+from _setup.setup import run # pylint: disable = W0611
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/include/cext.h b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/include/cext.h
new file mode 100644
index 00000000000..47b6f5b9c11
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/include/cext.h
@@ -0,0 +1,244 @@
+/*
+ * Copyright 2006 - 2014
+ * Andr\xe9 Malo or his licensors, as applicable
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * central naming stuff
+ */
+
+#ifndef SETUP_CEXT_H
+#define SETUP_CEXT_H
+
+#ifndef EXT_MODULE
+#error EXT_MODULE must be defined outside of this file (-DEXT_MODULE=...)
+#endif
+
+/*
+ * include core header files
+ */
+#define PY_SSIZE_T_CLEAN
+
+#include "Python.h"
+#include "structmember.h"
+
+/*
+ * define our helper macros depending on the stuff above
+ */
+#define STRINGIFY(n) STRINGIFY_HELPER(n)
+#define STRINGIFY_HELPER(n) #n
+#define CONCATENATE(first, second) CONCATENATE_HELPER(first, second)
+#define CONCATENATE_HELPER(first, second) first##second
+
+#define EXT_MODULE_NAME STRINGIFY(EXT_MODULE)
+#ifdef EXT_PACKAGE
+#define EXT_PACKAGE_NAME STRINGIFY(EXT_PACKAGE)
+#define EXT_MODULE_PATH EXT_PACKAGE_NAME "." EXT_MODULE_NAME
+#else
+#define EXT_PACKAGE_NAME ""
+#define EXT_MODULE_PATH EXT_MODULE_NAME
+#endif
+
+#define EXT_DOCS_VAR CONCATENATE(var, CONCATENATE(EXT_MODULE, __doc__))
+#define EXT_METHODS_VAR CONCATENATE(var, CONCATENATE(EXT_MODULE, _methods))
+#define EXT_METHODS static PyMethodDef EXT_METHODS_VAR[]
+
+#define EXT_DEFINE_VAR CONCATENATE(var, CONCATENATE(EXT_MODULE, _module))
+
+/* Py3K Support */
+#if PY_MAJOR_VERSION >= 3
+
+#define EXT3
+
+#ifndef PyMODINIT_FUNC
+#define EXT_INIT_FUNC PyObject *CONCATENATE(PyInit_, EXT_MODULE)(void)
+#else
+#define EXT_INIT_FUNC PyMODINIT_FUNC CONCATENATE(PyInit_, EXT_MODULE)(void)
+#endif
+
+#define EXT_DEFINE(name, methods, doc) \
+static struct PyModuleDef EXT_DEFINE_VAR = { \
+ PyModuleDef_HEAD_INIT, \
+ name, \
+ doc, \
+ -1, \
+ methods, \
+ NULL, \
+ NULL, \
+ NULL, \
+ NULL \
+}
+
+#define EXT_CREATE(def) (PyModule_Create(def))
+#define EXT_INIT_ERROR(module) do {Py_XDECREF(module); return NULL;} while(0)
+#define EXT_INIT_RETURN(module) return module
+
+#else /* end py3k */
+
+#define EXT2
+
+#ifndef PyMODINIT_FUNC
+#define EXT_INIT_FUNC void CONCATENATE(init, EXT_MODULE)(void)
+#else
+#define EXT_INIT_FUNC PyMODINIT_FUNC CONCATENATE(init, EXT_MODULE)(void)
+#endif
+
+#define EXT_DEFINE__STRUCT \
+ CONCATENATE(struct, CONCATENATE(EXT_MODULE, _module))
+
+struct EXT_DEFINE__STRUCT {
+ char *m_name;
+ char *m_doc;
+ PyMethodDef *m_methods;
+};
+#define EXT_DEFINE(name, methods, doc) \
+static struct EXT_DEFINE__STRUCT EXT_DEFINE_VAR = { \
+ name, \
+ doc, \
+ methods \
+}
+
+#define EXT_CREATE(def) ((def)->m_doc \
+ ? Py_InitModule3((def)->m_name, (def)->m_methods, (def)->m_doc) \
+ : Py_InitModule((def)->m_name, (def)->m_methods) \
+)
+#define EXT_INIT_ERROR(module) return
+#define EXT_INIT_RETURN(module) return
+
+#endif /* end py2K */
+
+#define EXT_INIT_TYPE(module, type) do { \
+ if (PyType_Ready(type) < 0) \
+ EXT_INIT_ERROR(module); \
+} while (0)
+
+#define EXT_ADD_TYPE(module, name, type) do { \
+ Py_INCREF(type); \
+ if (PyModule_AddObject(module, name, (PyObject *)(type)) < 0) \
+ EXT_INIT_ERROR(module); \
+} while (0)
+
+#define EXT_ADD_UNICODE(module, name, string, encoding) do { \
+ if (PyModule_AddObject( \
+ module, \
+ name, \
+ PyUnicode_Decode( \
+ string, \
+ sizeof(string) - 1, \
+ encoding, \
+ "strict" \
+ )) < 0) \
+ EXT_INIT_ERROR(module); \
+} while (0)
+
+#define EXT_ADD_STRING(module, name, string) do { \
+ if (PyModule_AddStringConstant(module, name, string) < 0) \
+ EXT_INIT_ERROR(module); \
+} while (0)
+
+#define EXT_ADD_INT(module, name, number) do { \
+ if (PyModule_AddIntConstant(module, name, number) < 0) \
+ EXT_INIT_ERROR(module); \
+} while (0)
+
+
+/* PEP 353 support, implemented as of python 2.5 */
+#if PY_VERSION_HEX < 0x02050000
+typedef int Py_ssize_t;
+#define PyInt_FromSsize_t(arg) PyInt_FromLong((long)arg)
+#define PyInt_AsSsize_t(arg) (int)PyInt_AsLong(arg)
+#define PY_SSIZE_T_MAX ((Py_ssize_t)INT_MAX)
+#endif
+
+/*
+ * some helper macros (Python 2.4)
+ */
+#ifndef Py_VISIT
+#define Py_VISIT(op) do { \
+ if (op) { \
+ int vret = visit((op), arg); \
+ if (vret) return vret; \
+ } \
+} while (0)
+#endif
+
+#ifdef Py_CLEAR
+#undef Py_CLEAR
+#endif
+#define Py_CLEAR(op) do { \
+ if (op) { \
+ PyObject *tmp__ = (PyObject *)(op); \
+ (op) = NULL; \
+ Py_DECREF(tmp__); \
+ } \
+} while (0)
+
+#ifndef Py_RETURN_NONE
+#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None
+#endif
+
+#ifndef Py_RETURN_FALSE
+#define Py_RETURN_FALSE return Py_INCREF(Py_False), Py_False
+#endif
+
+#ifndef Py_RETURN_TRUE
+#define Py_RETURN_TRUE return Py_INCREF(Py_True), Py_True
+#endif
+
+/* Macros for inline documentation. (Python 2.3) */
+#ifndef PyDoc_VAR
+#define PyDoc_VAR(name) static char name[]
+#endif
+
+#ifndef PyDoc_STRVAR
+#define PyDoc_STRVAR(name,str) PyDoc_VAR(name) = PyDoc_STR(str)
+#endif
+
+#ifndef PyDoc_STR
+#ifdef WITH_DOC_STRINGS
+#define PyDoc_STR(str) str
+#else
+#define PyDoc_STR(str) ""
+#endif
+#endif
+
+/* Basestring check (basestring introduced in Python 2.3) */
+#if PY_VERSION_HEX < 0x02030000
+#define BaseString_Check(type) ( \
+ PyObject_TypeCheck((type), &PyString_Type) \
+ || PyObject_TypeCheck((type), &PyUnicode_Type) \
+)
+#else
+#define BaseString_Check(type) PyObject_TypeCheck((type), &PyBaseString_Type)
+#endif
+
+#define GENERIC_ALLOC(type) \
+ ((void *)((PyTypeObject *)type)->tp_alloc(type, (Py_ssize_t)0))
+
+/* PyPy doesn't define it */
+#ifndef PyType_IS_GC
+#define PyType_IS_GC(t) PyType_HasFeature((t), Py_TPFLAGS_HAVE_GC)
+#endif
+
+#define DEFINE_GENERIC_DEALLOC(prefix) \
+static void prefix##_dealloc(void *self) \
+{ \
+ if (PyType_IS_GC(((PyObject *)self)->ob_type)) \
+ PyObject_GC_UnTrack(self); \
+ (void)prefix##_clear(self); \
+ ((PyObject *)self)->ob_type->tp_free((PyObject *)self); \
+}
+
+#endif /* SETUP_CEXT_H */
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/__init__.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/__init__.py
new file mode 100644
index 00000000000..9582ecc1087
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/__init__.py
@@ -0,0 +1,27 @@
+# -*- coding: ascii -*-
+#
+# Copyright 2007, 2008, 2009, 2010, 2011
+# Andr\xe9 Malo or his licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+================
+ Package _setup
+================
+
+This package provides tools for main package setup.
+"""
+__author__ = u"Andr\xe9 Malo"
+__docformat__ = "restructuredtext en"
+
+from _setup.setup import run # pylint: disable = W0611
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/commands.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/commands.py
new file mode 100644
index 00000000000..a41b166e0a5
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/commands.py
@@ -0,0 +1,267 @@
+# -*- coding: ascii -*-
+#
+# Copyright 2007, 2008, 2009, 2010, 2011
+# Andr\xe9 Malo or his licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+===================
+ Command extenders
+===================
+
+Command extenders.
+"""
+__author__ = u"Andr\xe9 Malo"
+__docformat__ = "restructuredtext en"
+__test__ = False
+
+from distutils import fancy_getopt as _fancy_getopt
+from distutils.command import build as _build
+from distutils.command import build_ext as _build_ext
+from distutils.command import install as _install
+from distutils.command import install_data as _install_data
+from distutils.command import install_lib as _install_lib
+import os as _os
+
+from _setup.util import log
+
+_option_defaults = {}
+_option_inherits = {}
+_option_finalizers = {}
+_command_mapping = {
+ 'install': 'Install',
+ 'install_data': 'InstallData',
+ 'install_lib': 'InstallLib',
+ 'build': 'Build',
+ 'build_ext': 'BuildExt',
+}
+
+
+def add_option(command, long_name, help_text, short_name=None, default=None,
+ inherit=None):
+ """ Add an option """
+ try:
+ command_class = globals()[_command_mapping[command]]
+ except KeyError:
+ raise ValueError("Unknown command %r" % (command,))
+ for opt in command_class.user_options:
+ if opt[0] == long_name:
+ break
+ else:
+ opt = (long_name, short_name, help_text)
+ command_class.user_options.append(opt)
+ if not long_name.endswith('='):
+ command_class.boolean_options.append(long_name)
+ attr_name = _fancy_getopt.translate_longopt(long_name)
+ else:
+ attr_name = _fancy_getopt.translate_longopt(long_name[:-1])
+ if not _option_defaults.has_key(command):
+ _option_defaults[command] = []
+ if inherit is not None:
+ if isinstance(inherit, (str, unicode)):
+ inherit = [inherit]
+ for i_inherit in inherit:
+ add_option(
+ i_inherit, long_name, help_text, short_name, default
+ )
+ default = None
+ if not _option_inherits.has_key(command):
+ _option_inherits[command] = []
+ for i_inherit in inherit:
+ for i_command, opt_name in _option_inherits[command]:
+ if i_command == i_inherit and opt_name == attr_name:
+ break
+ else:
+ _option_inherits[command].append((i_inherit, attr_name))
+ _option_defaults[command].append((attr_name, default))
+
+
+def add_finalizer(command, key, func):
+ """ Add finalizer """
+ if not _option_finalizers.has_key(command):
+ _option_finalizers[command] = {}
+ if not _option_finalizers[command].has_key(key):
+ _option_finalizers[command][key] = func
+
+
+class Install(_install.install):
+ """ Extended installer to reflect the additional data options """
+ user_options = _install.install.user_options + [
+ ('single-version-externally-managed', None,
+ "Compat option. Does not a thing."),
+ ]
+ boolean_options = _install.install.boolean_options + [
+ 'single-version-externally-managed'
+ ]
+
+ def initialize_options(self):
+ """ Prepare for new options """
+ _install.install.initialize_options(self)
+ self.single_version_externally_managed = None
+ if _option_defaults.has_key('install'):
+ for opt_name, default in _option_defaults['install']:
+ setattr(self, opt_name, default)
+
+ def finalize_options(self):
+ """ Finalize options """
+ _install.install.finalize_options(self)
+ if _option_inherits.has_key('install'):
+ for parent, opt_name in _option_inherits['install']:
+ self.set_undefined_options(parent, (opt_name, opt_name))
+ if _option_finalizers.has_key('install'):
+ for func in _option_finalizers['install'].values():
+ func(self)
+
+
+class InstallData(_install_data.install_data):
+ """ Extended data installer """
+ user_options = _install_data.install_data.user_options + []
+ boolean_options = _install_data.install_data.boolean_options + []
+
+ def initialize_options(self):
+ """ Prepare for new options """
+ _install_data.install_data.initialize_options(self)
+ if _option_defaults.has_key('install_data'):
+ for opt_name, default in _option_defaults['install_data']:
+ setattr(self, opt_name, default)
+
+ def finalize_options(self):
+ """ Finalize options """
+ _install_data.install_data.finalize_options(self)
+ if _option_inherits.has_key('install_data'):
+ for parent, opt_name in _option_inherits['install_data']:
+ self.set_undefined_options(parent, (opt_name, opt_name))
+ if _option_finalizers.has_key('install_data'):
+ for func in _option_finalizers['install_data'].values():
+ func(self)
+
+
+class InstallLib(_install_lib.install_lib):
+ """ Extended lib installer """
+ user_options = _install_lib.install_lib.user_options + []
+ boolean_options = _install_lib.install_lib.boolean_options + []
+
+ def initialize_options(self):
+ """ Prepare for new options """
+ _install_lib.install_lib.initialize_options(self)
+ if _option_defaults.has_key('install_lib'):
+ for opt_name, default in _option_defaults['install_lib']:
+ setattr(self, opt_name, default)
+
+ def finalize_options(self):
+ """ Finalize options """
+ _install_lib.install_lib.finalize_options(self)
+ if _option_inherits.has_key('install_lib'):
+ for parent, opt_name in _option_inherits['install_lib']:
+ self.set_undefined_options(parent, (opt_name, opt_name))
+ if _option_finalizers.has_key('install_lib'):
+ for func in _option_finalizers['install_lib'].values():
+ func(self)
+
+
+class BuildExt(_build_ext.build_ext):
+ """
+ Extended extension builder class
+
+ This class allows extensions to provide a ``check_prerequisites`` method
+ which is called before actually building it. The method takes the
+ `BuildExt` instance and returns whether the extension should be skipped or
+ not.
+ """
+
+ def initialize_options(self):
+ """ Prepare for new options """
+ _build_ext.build_ext.initialize_options(self)
+ if _option_defaults.has_key('build_ext'):
+ for opt_name, default in _option_defaults['build_ext']:
+ setattr(self, opt_name, default)
+
+ def finalize_options(self):
+ """ Finalize options """
+ _build_ext.build_ext.finalize_options(self)
+ if _option_inherits.has_key('build_ext'):
+ for parent, opt_name in _option_inherits['build_ext']:
+ self.set_undefined_options(parent, (opt_name, opt_name))
+ if _option_finalizers.has_key('build_ext'):
+ for func in _option_finalizers['build_ext'].values():
+ func(self)
+
+ def build_extension(self, ext):
+ """
+ Build C extension - with extended functionality
+
+ The following features are added here:
+
+ - ``ext.check_prerequisites`` is called before the extension is being
+ built. See `Extension` for details. If the method does not exist,
+ simply no check will be run.
+ - The macros ``EXT_PACKAGE`` and ``EXT_MODULE`` will be filled (or
+ unset) depending on the extensions name, but only if they are not
+ already defined.
+
+ :Parameters:
+ `ext` : `Extension`
+ The extension to build. If it's a pure
+ ``distutils.core.Extension``, simply no prequisites check is
+ applied.
+
+ :Return: whatever ``distutils.command.build_ext.build_ext`` returns
+ :Rtype: any
+ """
+ # handle name macros
+ macros = dict(ext.define_macros or ())
+ tup = ext.name.split('.')
+ if len(tup) == 1:
+ pkg, mod = None, tup[0]
+ else:
+ pkg, mod = '.'.join(tup[:-1]), tup[-1]
+ if pkg is not None and 'EXT_PACKAGE' not in macros:
+ ext.define_macros.append(('EXT_PACKAGE', pkg))
+ if 'EXT_MODULE' not in macros:
+ ext.define_macros.append(('EXT_MODULE', mod))
+ if pkg is None:
+ macros = dict(ext.undef_macros or ())
+ if 'EXT_PACKAGE' not in macros:
+ ext.undef_macros.append('EXT_PACKAGE')
+
+ # handle prereq checks
+ try:
+ checker = ext.check_prerequisites
+ except AttributeError:
+ pass
+ else:
+ if checker(self):
+ log.info("Skipping %s extension" % ext.name)
+ return
+
+ return _build_ext.build_ext.build_extension(self, ext)
+
+
+class Build(_build.build):
+
+ def initialize_options(self):
+ """ Prepare for new options """
+ _build.build.initialize_options(self)
+ if _option_defaults.has_key('build'):
+ for opt_name, default in _option_defaults['build']:
+ setattr(self, opt_name, default)
+
+ def finalize_options(self):
+ """ Finalize options """
+ _build.build.finalize_options(self)
+ if _option_inherits.has_key('build'):
+ for parent, opt_name in _option_inherits['build']:
+ self.set_undefined_options(parent, (opt_name, opt_name))
+ if _option_finalizers.has_key('build'):
+ for func in _option_finalizers['build'].values():
+ func(self)
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/data.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/data.py
new file mode 100644
index 00000000000..9cf04e104c2
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/data.py
@@ -0,0 +1,165 @@
+# -*- coding: ascii -*-
+#
+# Copyright 2007, 2008, 2009, 2010, 2011
+# Andr\xe9 Malo or his licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+===================
+ Data distribution
+===================
+
+This module provides tools to simplify data distribution.
+"""
+__author__ = u"Andr\xe9 Malo"
+__docformat__ = "restructuredtext en"
+
+from distutils import filelist as _filelist
+import os as _os
+import posixpath as _posixpath
+import sys as _sys
+
+from _setup import commands as _commands
+
+
+def splitpath(path):
+ """ Split a path """
+ drive, path = '', _os.path.normpath(path)
+ try:
+ splitunc = _os.path.splitunc
+ except AttributeError:
+ pass
+ else:
+ drive, path = splitunc(path)
+ if not drive:
+ drive, path = _os.path.splitdrive(path)
+ elems = []
+ try:
+ sep = _os.path.sep
+ except AttributeError:
+ sep = _os.path.join('1', '2')[1:-1]
+ while 1:
+ prefix, path = _os.path.split(path)
+ elems.append(path)
+ if prefix in ('', sep):
+ drive = _os.path.join(drive, prefix)
+ break
+ path = prefix
+ elems.reverse()
+ return drive, elems
+
+
+def finalizer(installer):
+ """ Finalize install_data """
+ data_files = []
+ for item in installer.data_files:
+ if not isinstance(item, Data):
+ data_files.append(item)
+ continue
+ data_files.extend(item.flatten(installer))
+ installer.data_files = data_files
+
+
+class Data(object):
+ """ File list container """
+
+ def __init__(self, files, target=None, preserve=0, strip=0,
+ prefix=None):
+ """ Initialization """
+ self._files = files
+ self._target = target
+ self._preserve = preserve
+ self._strip = strip
+ self._prefix = prefix
+ self.fixup_commands()
+
+ def fixup_commands(self):
+ pass
+
+ def from_templates(cls, *templates, **kwargs):
+ """ Initialize from template """
+ files = _filelist.FileList()
+ for tpl in templates:
+ for line in tpl.split(';'):
+ files.process_template_line(line.strip())
+ files.sort()
+ files.remove_duplicates()
+ result = []
+ for filename in files.files:
+ _, elems = splitpath(filename)
+ if '.svn' in elems or '.git' in elems:
+ continue
+ result.append(filename)
+ return cls(result, **kwargs)
+ from_templates = classmethod(from_templates)
+
+ def flatten(self, installer):
+ """ Flatten the file list to (target, file) tuples """
+ # pylint: disable = W0613
+ if self._prefix:
+ _, prefix = splitpath(self._prefix)
+ telems = prefix
+ else:
+ telems = []
+
+ tmap = {}
+ for fname in self._files:
+ (_, name), target = splitpath(fname), telems
+ if self._preserve:
+ if self._strip:
+ name = name[max(0, min(self._strip, len(name) - 1)):]
+ if len(name) > 1:
+ target = telems + name[:-1]
+ tmap.setdefault(_posixpath.join(*target), []).append(fname)
+ return tmap.items()
+
+
+class Documentation(Data):
+ """ Documentation container """
+
+ def fixup_commands(self):
+ _commands.add_option('install_data', 'without-docs',
+ help_text='Do not install documentation files',
+ inherit='install',
+ )
+ _commands.add_finalizer('install_data', 'documentation', finalizer)
+
+ def flatten(self, installer):
+ """ Check if docs should be installed at all """
+ if installer.without_docs:
+ return []
+ return Data.flatten(self, installer)
+
+
+class Manpages(Documentation):
+ """ Manpages container """
+
+ def dispatch(cls, files):
+ """ Automatically dispatch manpages to their target directories """
+ mpmap = {}
+ for manpage in files:
+ normalized = _os.path.normpath(manpage)
+ _, ext = _os.path.splitext(normalized)
+ if ext.startswith(_os.path.extsep):
+ ext = ext[len(_os.path.extsep):]
+ mpmap.setdefault(ext, []).append(manpage)
+ return [cls(manpages, prefix=_posixpath.join(
+ 'share', 'man', 'man%s' % section,
+ )) for section, manpages in mpmap.items()]
+ dispatch = classmethod(dispatch)
+
+ def flatten(self, installer):
+ """ Check if manpages are suitable """
+ if _sys.platform == 'win32':
+ return []
+ return Documentation.flatten(self, installer)
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/dist.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/dist.py
new file mode 100644
index 00000000000..21a65415185
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/dist.py
@@ -0,0 +1,51 @@
+# -*- coding: ascii -*-
+#
+# Copyright 2007, 2008, 2009, 2010, 2011
+# Andr\xe9 Malo or his licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+================
+ dist utilities
+================
+
+dist utilities.
+"""
+__author__ = u"Andr\xe9 Malo"
+__docformat__ = "restructuredtext en"
+
+import sys as _sys
+
+from _setup import shell as _shell
+
+
+def run_setup(*args, **kwargs):
+ """ Run setup """
+ if 'setup' in kwargs:
+ script = kwargs.get('setup') or 'setup.py'
+ del kwargs['setup']
+ else:
+ script = 'setup.py'
+ if 'fakeroot' in kwargs:
+ fakeroot = kwargs['fakeroot']
+ del kwargs['fakeroot']
+ else:
+ fakeroot = None
+ if kwargs:
+ raise TypeError("Unrecognized keyword parameters")
+
+ script = _shell.native(script)
+ argv = [_sys.executable, script] + list(args)
+ if fakeroot:
+ argv.insert(0, fakeroot)
+ return not _shell.spawn(*argv)
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/ext.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/ext.py
new file mode 100644
index 00000000000..bcc0209a53a
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/ext.py
@@ -0,0 +1,254 @@
+# -*- coding: ascii -*-
+#
+# Copyright 2007, 2008, 2009, 2010, 2011
+# Andr\xe9 Malo or his licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+===================
+ C extension tools
+===================
+
+C extension tools.
+"""
+__author__ = u"Andr\xe9 Malo"
+__docformat__ = "restructuredtext en"
+__test__ = False
+
+from distutils import core as _core
+from distutils import errors as _distutils_errors
+import os as _os
+import posixpath as _posixpath
+import shutil as _shutil
+import tempfile as _tempfile
+
+from _setup import commands as _commands
+from _setup.util import log
+
+
+def _install_finalizer(installer):
+ if installer.without_c_extensions:
+ installer.distribution.ext_modules = []
+
+def _build_finalizer(builder):
+ if builder.without_c_extensions:
+ builder.extensions = []
+
+
+class Extension(_core.Extension):
+ """
+ Extension with prerequisite check interface
+
+ If your check is cacheable (during the setup run), override
+ `cached_check_prerequisites`, `check_prerequisites` otherwise.
+
+ :IVariables:
+ `cached_check` : ``bool``
+ The cached check result
+ """
+ cached_check = None
+
+ def __init__(self, *args, **kwargs):
+ """ Initialization """
+ if kwargs.has_key('depends'):
+ self.depends = kwargs['depends'] or []
+ else:
+ self.depends = []
+ _core.Extension.__init__(self, *args, **kwargs)
+
+ # add include path
+ included = _posixpath.join('_setup', 'include')
+ if included not in self.include_dirs:
+ self.include_dirs.append(included)
+
+ # add cext.h to the dependencies
+ cext_h = _posixpath.join(included, 'cext.h')
+ if cext_h not in self.depends:
+ self.depends.append(cext_h)
+
+ _commands.add_option('install_lib', 'without-c-extensions',
+ help_text='Don\'t install C extensions',
+ inherit='install',
+ )
+ _commands.add_finalizer('install_lib', 'c-extensions',
+ _install_finalizer
+ )
+ _commands.add_option('build_ext', 'without-c-extensions',
+ help_text='Don\'t build C extensions',
+ inherit=('build', 'install_lib'),
+ )
+ _commands.add_finalizer('build_ext', 'c-extensions', _build_finalizer)
+
+ def check_prerequisites(self, build):
+ """
+ Check prerequisites
+
+ The check should cover all dependencies needed for the extension to
+ be built and run. The method can do the following:
+
+ - return a false value: the extension will be built
+ - return a true value: the extension will be skipped. This is useful
+ for optional extensions
+ - raise an exception. This is useful for mandatory extensions
+
+ If the check result is cacheable (during the setup run), override
+ `cached_check_prerequisites` instead.
+
+ :Parameters:
+ `build` : `BuildExt`
+ The extension builder
+
+ :Return: Skip the extension?
+ :Rtype: ``bool``
+ """
+ if self.cached_check is None:
+ log.debug("PREREQ check for %s" % self.name)
+ self.cached_check = self.cached_check_prerequisites(build)
+ else:
+ log.debug("PREREQ check for %s (cached)" % self.name)
+ return self.cached_check
+
+ def cached_check_prerequisites(self, build):
+ """
+ Check prerequisites
+
+ The check should cover all dependencies needed for the extension to
+ be built and run. The method can do the following:
+
+ - return a false value: the extension will be built
+ - return a true value: the extension will be skipped. This is useful
+ for optional extensions
+ - raise an exception. This is useful for mandatory extensions
+
+ If the check result is *not* cacheable (during the setup run),
+ override `check_prerequisites` instead.
+
+ :Parameters:
+ `build` : `BuildExt`
+ The extension builder
+
+ :Return: Skip the extension?
+ :Rtype: ``bool``
+ """
+ # pylint: disable = W0613
+ log.debug("Nothing to check for %s!" % self.name)
+ return False
+
+
+class ConfTest(object):
+ """
+ Single conftest abstraction
+
+ :IVariables:
+ `_tempdir` : ``str``
+ The tempdir created for this test
+
+ `src` : ``str``
+ Name of the source file
+
+ `target` : ``str``
+ Target filename
+
+ `compiler` : ``CCompiler``
+ compiler instance
+
+ `obj` : ``list``
+ List of object filenames (``[str, ...]``)
+ """
+ _tempdir = None
+
+ def __init__(self, build, source):
+ """
+ Initialization
+
+ :Parameters:
+ `build` : ``distuils.command.build_ext.build_ext``
+ builder instance
+
+ `source` : ``str``
+ Source of the file to compile
+ """
+ self._tempdir = tempdir = _tempfile.mkdtemp()
+ src = _os.path.join(tempdir, 'conftest.c')
+ fp = open(src, 'w')
+ try:
+ fp.write(source)
+ finally:
+ fp.close()
+ self.src = src
+ self.compiler = compiler = build.compiler
+ self.target = _os.path.join(tempdir, 'conftest')
+ self.obj = compiler.object_filenames([src], output_dir=tempdir)
+
+ def __del__(self):
+ """ Destruction """
+ self.destroy()
+
+ def destroy(self):
+ """ Destroy the conftest leftovers on disk """
+ tempdir, self._tempdir = self._tempdir, None
+ if tempdir is not None:
+ _shutil.rmtree(tempdir)
+
+ def compile(self, **kwargs):
+ """
+ Compile the conftest
+
+ :Parameters:
+ `kwargs` : ``dict``
+ Optional keyword parameters for the compiler call
+
+ :Return: Was the compilation successful?
+ :Rtype: ``bool``
+ """
+ kwargs['output_dir'] = self._tempdir
+ try:
+ self.compiler.compile([self.src], **kwargs)
+ except _distutils_errors.CompileError:
+ return False
+ return True
+
+ def link(self, **kwargs):
+ r"""
+ Link the conftest
+
+ Before you can link the conftest objects they need to be `compile`\d.
+
+ :Parameters:
+ `kwargs` : ``dict``
+ Optional keyword parameters for the linker call
+
+ :Return: Was the linking successful?
+ :Rtype: ``bool``
+ """
+ try:
+ self.compiler.link_executable(self.obj, self.target, **kwargs)
+ except _distutils_errors.LinkError:
+ return False
+ return True
+
+ def pipe(self, mode="r"):
+ r"""
+ Execute the conftest binary and connect to it using a pipe
+
+ Before you can pipe to or from the conftest binary it needs to
+ be `link`\ed.
+
+ :Parameters:
+ `mode` : ``str``
+ Pipe mode - r/w
+
+ :Return: The open pipe
+ :Rtype: ``file``
+ """
+ return _os.popen(self.compiler.executable_filename(self.target), mode)
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/setup.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/setup.py
new file mode 100644
index 00000000000..fd86f62f9bc
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/setup.py
@@ -0,0 +1,419 @@
+# -*- coding: ascii -*-
+#
+# Copyright 2007 - 2013
+# Andr\xe9 Malo or his licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+===================
+ Main setup runner
+===================
+
+This module provides a wrapper around the distutils core setup.
+"""
+__author__ = u"Andr\xe9 Malo"
+__docformat__ = "restructuredtext en"
+
+import ConfigParser as _config_parser
+from distutils import core as _core
+import os as _os
+import posixpath as _posixpath
+import sys as _sys
+
+from _setup import commands as _commands
+from _setup import data as _data
+from _setup import ext as _ext
+from _setup import util as _util
+from _setup import shell as _shell
+
+
+def check_python_version(impl, version_min, version_max):
+ """ Check python version """
+ if impl == 'python':
+ version_info = _sys.version_info
+ elif impl == 'pypy':
+ version_info = getattr(_sys, 'pypy_version_info', None)
+ if not version_info:
+ return
+ elif impl == 'jython':
+ if not 'java' in _sys.platform.lower():
+ return
+ version_info = _sys.version_info
+ else:
+ raise AssertionError("impl not in ('python', 'pypy', 'jython')")
+
+ pyversion = map(int, version_info[:3])
+ if version_min:
+ min_required = \
+ map(int, '.'.join((version_min, '0.0.0')).split('.')[:3])
+ if pyversion < min_required:
+ raise EnvironmentError("Need at least %s %s (vs. %s)" % (
+ impl, version_min, '.'.join(map(str, pyversion))
+ ))
+ if version_max:
+ max_required = map(int, version_max.split('.'))
+ max_required[-1] += 1
+ if pyversion >= max_required:
+ raise EnvironmentError("Need at max %s %s (vs. %s)" % (
+ impl,
+ version_max,
+ '.'.join(map(str, pyversion))
+ ))
+
+
+def find_description(docs):
+ """
+ Determine the package description from DESCRIPTION
+
+ :Parameters:
+ `docs` : ``dict``
+ Docs config section
+
+ :Return: Tuple of summary, description and license
+ (``('summary', 'description', 'license')``)
+ (all may be ``None``)
+ :Rtype: ``tuple``
+ """
+ summary = None
+ filename = docs.get('meta.summary', 'SUMMARY').strip()
+ if filename and _os.path.isfile(filename):
+ fp = open(filename)
+ try:
+ try:
+ summary = fp.read().strip().splitlines()[0].rstrip()
+ except IndexError:
+ summary = ''
+ finally:
+ fp.close()
+
+ description = None
+ filename = docs.get('meta.description', 'DESCRIPTION').strip()
+ if filename and _os.path.isfile(filename):
+ fp = open(filename)
+ try:
+ description = fp.read().rstrip()
+ finally:
+ fp.close()
+
+ if summary is None and description:
+ from docutils import core
+ summary = core.publish_parts(
+ source=description,
+ source_path=filename,
+ writer_name='html',
+ )['title'].encode('utf-8')
+
+ return summary, description
+
+
+def find_classifiers(docs):
+ """
+ Determine classifiers from CLASSIFIERS
+
+ :return: List of classifiers (``['classifier', ...]``)
+ :rtype: ``list``
+ """
+ filename = docs.get('meta.classifiers', 'CLASSIFIERS').strip()
+ if filename and _os.path.isfile(filename):
+ fp = open(filename)
+ try:
+ content = fp.read()
+ finally:
+ fp.close()
+ content = [item.strip() for item in content.splitlines()]
+ return [item for item in content if item and not item.startswith('#')]
+ return []
+
+
+def find_provides(docs):
+ """
+ Determine provides from PROVIDES
+
+ :return: List of provides (``['provides', ...]``)
+ :rtype: ``list``
+ """
+ filename = docs.get('meta.provides', 'PROVIDES').strip()
+ if filename and _os.path.isfile(filename):
+ fp = open(filename)
+ try:
+ content = fp.read()
+ finally:
+ fp.close()
+ content = [item.strip() for item in content.splitlines()]
+ return [item for item in content if item and not item.startswith('#')]
+ return []
+
+
+def find_license(docs):
+ """
+ Determine license from LICENSE
+
+ :return: License text
+ :rtype: ``str``
+ """
+ filename = docs.get('meta.license', 'LICENSE').strip()
+ if filename and _os.path.isfile(filename):
+ fp = open(filename)
+ try:
+ return fp.read().rstrip()
+ finally:
+ fp.close()
+ return None
+
+
+def find_packages(manifest):
+ """ Determine packages and subpackages """
+ packages = {}
+ collect = manifest.get('packages.collect', '').split()
+ lib = manifest.get('packages.lib', '.')
+ try:
+ sep = _os.path.sep
+ except AttributeError:
+ sep = _os.path.join('1', '2')[1:-1]
+ for root in collect:
+ for dirpath, _, filenames in _shell.walk(_os.path.join(lib, root)):
+ if dirpath.find('.svn') >= 0 or dirpath.find('.git') >= 0:
+ continue
+ if '__init__.py' in filenames:
+ packages[
+ _os.path.normpath(dirpath).replace(sep, '.')
+ ] = None
+ packages = packages.keys()
+ packages.sort()
+ return packages
+
+
+def find_data(name, docs):
+ """ Determine data files """
+ result = []
+ if docs.get('extra', '').strip():
+ result.append(_data.Documentation(docs['extra'].split(),
+ prefix='share/doc/%s' % name,
+ ))
+ if docs.get('examples.dir', '').strip():
+ tpl = ['recursive-include %s *' % docs['examples.dir']]
+ if docs.get('examples.ignore', '').strip():
+ tpl.extend(["global-exclude %s" % item
+ for item in docs['examples.ignore'].split()
+ ])
+ strip = int(docs.get('examples.strip', '') or 0)
+ result.append(_data.Documentation.from_templates(*tpl, **{
+ 'strip': strip,
+ 'prefix': 'share/doc/%s' % name,
+ 'preserve': 1,
+ }))
+ if docs.get('userdoc.dir', '').strip():
+ tpl = ['recursive-include %s *' % docs['userdoc.dir']]
+ if docs.get('userdoc.ignore', '').strip():
+ tpl.extend(["global-exclude %s" % item
+ for item in docs['userdoc.ignore'].split()
+ ])
+ strip = int(docs.get('userdoc.strip', '') or 0)
+ result.append(_data.Documentation.from_templates(*tpl, **{
+ 'strip': strip,
+ 'prefix': 'share/doc/%s' % name,
+ 'preserve': 1,
+ }))
+ if docs.get('apidoc.dir', '').strip():
+ tpl = ['recursive-include %s *' % docs['apidoc.dir']]
+ if docs.get('apidoc.ignore', '').strip():
+ tpl.extend(["global-exclude %s" % item
+ for item in docs['apidoc.ignore'].split()
+ ])
+ strip = int(docs.get('apidoc.strip', '') or 0)
+ result.append(_data.Documentation.from_templates(*tpl, **{
+ 'strip': strip,
+ 'prefix': 'share/doc/%s' % name,
+ 'preserve': 1,
+ }))
+ if docs.get('man', '').strip():
+ result.extend(_data.Manpages.dispatch(docs['man'].split()))
+ return result
+
+
+def make_manifest(manifest, config, docs, kwargs):
+ """ Create file list to pack up """
+ # pylint: disable = R0912
+ kwargs = kwargs.copy()
+ kwargs['script_args'] = ['install']
+ kwargs['packages'] = list(kwargs.get('packages') or ()) + [
+ '_setup', '_setup.py2', '_setup.py3',
+ ] + list(manifest.get('packages.extra', '').split() or ())
+ _core._setup_stop_after = "commandline"
+ try:
+ dist = _core.setup(**kwargs)
+ finally:
+ _core._setup_stop_after = None
+
+ result = ['MANIFEST', 'PKG-INFO', 'setup.py'] + list(config)
+ # TODO: work with default values:
+ for key in ('classifiers', 'description', 'summary', 'provides',
+ 'license'):
+ filename = docs.get('meta.' + key, '').strip()
+ if filename and _os.path.isfile(filename):
+ result.append(filename)
+
+ cmd = dist.get_command_obj("build_py")
+ cmd.ensure_finalized()
+ #from pprint import pprint; pprint(("build_py", cmd.get_source_files()))
+ for item in cmd.get_source_files():
+ result.append(_posixpath.sep.join(
+ _os.path.normpath(item).split(_os.path.sep)
+ ))
+
+ cmd = dist.get_command_obj("build_ext")
+ cmd.ensure_finalized()
+ #from pprint import pprint; pprint(("build_ext", cmd.get_source_files()))
+ for item in cmd.get_source_files():
+ result.append(_posixpath.sep.join(
+ _os.path.normpath(item).split(_os.path.sep)
+ ))
+ for ext in cmd.extensions:
+ if ext.depends:
+ result.extend([_posixpath.sep.join(
+ _os.path.normpath(item).split(_os.path.sep)
+ ) for item in ext.depends])
+
+ cmd = dist.get_command_obj("build_clib")
+ cmd.ensure_finalized()
+ if cmd.libraries:
+ #import pprint; pprint.pprint(("build_clib", cmd.get_source_files()))
+ for item in cmd.get_source_files():
+ result.append(_posixpath.sep.join(
+ _os.path.normpath(item).split(_os.path.sep)
+ ))
+ for lib in cmd.libraries:
+ if lib[1].get('depends'):
+ result.extend([_posixpath.sep.join(
+ _os.path.normpath(item).split(_os.path.sep)
+ ) for item in lib[1]['depends']])
+
+ cmd = dist.get_command_obj("build_scripts")
+ cmd.ensure_finalized()
+ #import pprint; pprint.pprint(("build_scripts", cmd.get_source_files()))
+ if cmd.get_source_files():
+ for item in cmd.get_source_files():
+ result.append(_posixpath.sep.join(
+ _os.path.normpath(item).split(_os.path.sep)
+ ))
+
+ cmd = dist.get_command_obj("install_data")
+ cmd.ensure_finalized()
+ #from pprint import pprint; pprint(("install_data", cmd.get_inputs()))
+ try:
+ strings = basestring
+ except NameError:
+ strings = (str, unicode)
+
+ for item in cmd.get_inputs():
+ if isinstance(item, strings):
+ result.append(item)
+ else:
+ result.extend(item[1])
+
+ for item in manifest.get('dist', '').split():
+ result.append(item)
+ if _os.path.isdir(item):
+ for filename in _shell.files(item):
+ result.append(filename)
+
+ result = dict([(item, None) for item in result]).keys()
+ result.sort()
+ return result
+
+
+def run(config=('package.cfg',), ext=None, script_args=None, manifest_only=0):
+ """ Main runner """
+ if ext is None:
+ ext = []
+
+ cfg = _util.SafeConfigParser()
+ cfg.read(config)
+ pkg = dict(cfg.items('package'))
+ python_min = pkg.get('python.min') or None
+ python_max = pkg.get('python.max') or None
+ check_python_version('python', python_min, python_max)
+ pypy_min = pkg.get('pypy.min') or None
+ pypy_max = pkg.get('pypy.max') or None
+ check_python_version('pypy', pypy_min, pypy_max)
+ jython_min = pkg.get('jython.min') or None
+ jython_max = pkg.get('jython.max') or None
+ check_python_version('jython', jython_min, jython_max)
+
+ manifest = dict(cfg.items('manifest'))
+ try:
+ docs = dict(cfg.items('docs'))
+ except _config_parser.NoSectionError:
+ docs = {}
+
+ summary, description = find_description(docs)
+ scripts = manifest.get('scripts', '').strip() or None
+ if scripts:
+ scripts = scripts.split()
+ modules = manifest.get('modules', '').strip() or None
+ if modules:
+ modules = modules.split()
+ keywords = docs.get('meta.keywords', '').strip() or None
+ if keywords:
+ keywords = keywords.split()
+ revision = pkg.get('version.revision', '').strip()
+ if revision:
+ revision = "-r%s" % (revision,)
+
+ kwargs = {
+ 'name': pkg['name'],
+ 'version': "%s%s" % (
+ pkg['version.number'],
+ ["", "-dev%s" % (revision,)][_util.humanbool(
+ 'version.dev', pkg.get('version.dev', 'false')
+ )],
+ ),
+ 'provides': find_provides(docs),
+ 'description': summary,
+ 'long_description': description,
+ 'classifiers': find_classifiers(docs),
+ 'keywords': keywords,
+ 'author': pkg['author.name'],
+ 'author_email': pkg['author.email'],
+ 'maintainer': pkg.get('maintainer.name'),
+ 'maintainer_email': pkg.get('maintainer.email'),
+ 'url': pkg.get('url.homepage'),
+ 'download_url': pkg.get('url.download'),
+ 'license': find_license(docs),
+ 'package_dir': {'': manifest.get('packages.lib', '.')},
+ 'packages': find_packages(manifest),
+ 'py_modules': modules,
+ 'ext_modules': ext,
+ 'scripts': scripts,
+ 'script_args': script_args,
+ 'data_files': find_data(pkg['name'], docs),
+ 'cmdclass': {
+ 'build' : _commands.Build,
+ 'build_ext' : _commands.BuildExt,
+ 'install' : _commands.Install,
+ 'install_data': _commands.InstallData,
+ 'install_lib' : _commands.InstallLib,
+ }
+ }
+ for key in ('provides',):
+ if key not in _core.setup_keywords:
+ del kwargs[key]
+
+ if manifest_only:
+ return make_manifest(manifest, config, docs, kwargs)
+
+ # monkey-patch crappy manifest writer away.
+ from distutils.command import sdist
+ sdist.sdist.get_file_list = sdist.sdist.read_manifest
+
+ return _core.setup(**kwargs)
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/shell.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/shell.py
new file mode 100644
index 00000000000..4eafb9c8647
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/shell.py
@@ -0,0 +1,478 @@
+# -*- coding: ascii -*-
+#
+# Copyright 2007 - 2013
+# Andr\xe9 Malo or his licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+=================
+ Shell utilities
+=================
+
+Shell utilities.
+"""
+from __future__ import generators
+
+__author__ = u"Andr\xe9 Malo"
+__docformat__ = "restructuredtext en"
+
+import errno as _errno
+import fnmatch as _fnmatch
+import os as _os
+import shutil as _shutil
+import sys as _sys
+import tempfile as _tempfile
+
+cwd = _os.path.dirname(_os.path.abspath(_sys.argv[0]))
+
+class ExitError(RuntimeError):
+ """ Exit error """
+ def __init__(self, code):
+ RuntimeError.__init__(self, code)
+ self.code = code
+ self.signal = None
+
+
+class SignalError(ExitError):
+ """ Signal error """
+ def __init__(self, code, signal):
+ ExitError.__init__(self, code)
+ import signal as _signal
+ self.signal = signal
+ for key, val in vars(_signal).iteritems():
+ if key.startswith('SIG') and not key.startswith('SIG_'):
+ if val == signal:
+ self.signalstr = key[3:]
+ break
+ else:
+ self.signalstr = '%04d' % signal
+
+
+def native(path):
+ """ Convert slash path to native """
+ path = _os.path.sep.join(path.split('/'))
+ return _os.path.normpath(_os.path.join(cwd, path))
+
+
+def cp(src, dest):
+ """ Copy src to dest """
+ _shutil.copy2(native(src), native(dest))
+
+
+def cp_r(src, dest):
+ """ Copy -r src to dest """
+ _shutil.copytree(native(src), native(dest))
+
+
+def rm(dest):
+ """ Remove a file """
+ try:
+ _os.unlink(native(dest))
+ except OSError, e:
+ if _errno.ENOENT != e.errno:
+ raise
+
+def rm_rf(dest):
+ """ Remove a tree """
+ dest = native(dest)
+ if _os.path.exists(dest):
+ for path in files(dest, '*'):
+ _os.chmod(native(path), 0644)
+ _shutil.rmtree(dest)
+
+
+try:
+ mkstemp = _tempfile.mkstemp
+except AttributeError:
+ # helpers stolen from 2.4 tempfile module
+ try:
+ import fcntl as _fcntl
+ except ImportError:
+ def _set_cloexec(fd):
+ """ Set close-on-exec (not implemented, but not an error) """
+ # pylint: disable = W0613
+ pass
+ else:
+ def _set_cloexec(fd):
+ """ Set close-on-exec """
+ try:
+ flags = _fcntl.fcntl(fd, _fcntl.F_GETFD, 0)
+ except IOError:
+ pass
+ else:
+ # flags read successfully, modify
+ flags |= _fcntl.FD_CLOEXEC
+ _fcntl.fcntl(fd, _fcntl.F_SETFD, flags)
+
+ _text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL
+ _text_openflags |= getattr(_os, 'O_NOINHERIT', 0)
+ _text_openflags |= getattr(_os, 'O_NOFOLLOW', 0)
+
+ _bin_openflags = _text_openflags
+ _bin_openflags |= getattr(_os, 'O_BINARY', 0)
+
+ def mkstemp(suffix="", prefix=_tempfile.gettempprefix(), dir=None,
+ text=False):
+ """ Create secure temp file """
+ # pylint: disable = W0622
+ if dir is None:
+ dir = _tempfile.gettempdir()
+ if text:
+ flags = _text_openflags
+ else:
+ flags = _bin_openflags
+ count = 100
+ while count > 0:
+ j = _tempfile._counter.get_next() # pylint: disable = E1101, W0212
+ fname = _os.path.join(dir, prefix + str(j) + suffix)
+ try:
+ fd = _os.open(fname, flags, 0600)
+ except OSError, e:
+ if e.errno == _errno.EEXIST:
+ count -= 1
+ continue
+ raise
+ _set_cloexec(fd)
+ return fd, _os.path.abspath(fname)
+ raise IOError, (_errno.EEXIST, "No usable temporary file name found")
+
+
+def _pipespawn(argv, env):
+ """ Pipe spawn """
+ # pylint: disable = R0912
+ import pickle as _pickle
+ fd, name = mkstemp('.py')
+ try:
+ _os.write(fd, (r"""
+import os
+import pickle
+try:
+ import subprocess
+except ImportError:
+ subprocess = None
+import sys
+
+argv = pickle.loads(%(argv)s)
+env = pickle.loads(%(env)s)
+if 'X_JYTHON_WA_PATH' in env:
+ env['PATH'] = env['X_JYTHON_WA_PATH']
+
+if subprocess is None:
+ pid = os.spawnve(os.P_NOWAIT, argv[0], argv, env)
+ result = os.waitpid(pid, 0)[1]
+else:
+ p = subprocess.Popen(argv, env=env)
+ result = p.wait()
+ if result < 0:
+ print "\n%%d 1" %% (-result)
+ sys.exit(2)
+
+if result == 0:
+ sys.exit(0)
+signalled = getattr(os, 'WIFSIGNALED', None)
+if signalled is not None:
+ if signalled(result):
+ print "\n%%d %%d" %% (os.WTERMSIG(result), result & 7)
+ sys.exit(2)
+print "\n%%d" %% (result & 7,)
+sys.exit(3)
+ """.strip() + "\n") % {
+ 'argv': repr(_pickle.dumps(argv)),
+ 'env': repr(_pickle.dumps(env)),
+ })
+ fd, _ = None, _os.close(fd)
+ if _sys.platform == 'win32':
+ argv = []
+ for arg in [_sys.executable, name]:
+ if ' ' in arg or arg.startswith('"'):
+ arg = '"%s"' % arg.replace('"', '\\"')
+ argv.append(arg)
+ argv = ' '.join(argv)
+ shell = True
+ close_fds = False
+ else:
+ argv = [_sys.executable, name]
+ shell = False
+ close_fds = True
+
+ res = 0
+ try:
+ import subprocess
+ except ImportError:
+ import popen2 as _popen2
+ proc = _popen2.Popen3(argv, False)
+ try:
+ proc.tochild.close()
+ result = proc.fromchild.read()
+ finally:
+ res = proc.wait()
+ else:
+ if 'X_JYTHON_WA_PATH' in env:
+ env['PATH'] = env['X_JYTHON_WA_PATH']
+
+ proc = subprocess.Popen(argv,
+ shell=shell,
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE,
+ close_fds=close_fds,
+ env=env,
+ )
+ try:
+ proc.stdin.close()
+ result = proc.stdout.read()
+ finally:
+ res = proc.wait()
+ if res != 0:
+ if res == 2:
+ signal, code = map(int, result.splitlines()[-1].split())
+ raise SignalError(code, signal)
+ elif res == 3:
+ code = int(result.splitlines()[-1].strip())
+ raise ExitError(code)
+ raise ExitError(res)
+
+ return result
+ finally:
+ try:
+ if fd is not None:
+ _os.close(fd)
+ finally:
+ _os.unlink(name)
+
+
+def _filepipespawn(infile, outfile, argv, env):
+ """ File Pipe spawn """
+ try:
+ import subprocess
+ except ImportError:
+ subprocess = None
+ import pickle as _pickle
+ fd, name = mkstemp('.py')
+ try:
+ _os.write(fd, ("""
+import os
+import pickle
+import sys
+
+infile = pickle.loads(%(infile)s)
+outfile = pickle.loads(%(outfile)s)
+argv = pickle.loads(%(argv)s)
+env = pickle.loads(%(env)s)
+
+if infile is not None:
+ infile = open(infile, 'rb')
+ os.dup2(infile.fileno(), 0)
+ infile.close()
+if outfile is not None:
+ outfile = open(outfile, 'wb')
+ os.dup2(outfile.fileno(), 1)
+ outfile.close()
+
+pid = os.spawnve(os.P_NOWAIT, argv[0], argv, env)
+result = os.waitpid(pid, 0)[1]
+sys.exit(result & 7)
+ """.strip() + "\n") % {
+ 'infile': repr(_pickle.dumps(_os.path.abspath(infile))),
+ 'outfile': repr(_pickle.dumps(_os.path.abspath(outfile))),
+ 'argv': repr(_pickle.dumps(argv)),
+ 'env': repr(_pickle.dumps(env)),
+ })
+ fd, _ = None, _os.close(fd)
+ if _sys.platform == 'win32':
+ argv = []
+ for arg in [_sys.executable, name]:
+ if ' ' in arg or arg.startswith('"'):
+ arg = '"%s"' % arg.replace('"', '\\"')
+ argv.append(arg)
+ argv = ' '.join(argv)
+ close_fds = False
+ shell = True
+ else:
+ argv = [_sys.executable, name]
+ close_fds = True
+ shell = False
+
+ if subprocess is None:
+ pid = _os.spawnve(_os.P_NOWAIT, argv[0], argv, env)
+ return _os.waitpid(pid, 0)[1]
+ else:
+ p = subprocess.Popen(
+ argv, env=env, shell=shell, close_fds=close_fds
+ )
+ return p.wait()
+ finally:
+ try:
+ if fd is not None:
+ _os.close(fd)
+ finally:
+ _os.unlink(name)
+
+
+def spawn(*argv, **kwargs):
+ """ Spawn a process """
+ try:
+ import subprocess
+ except ImportError:
+ subprocess = None
+
+ if _sys.platform == 'win32':
+ newargv = []
+ for arg in argv:
+ if not arg or ' ' in arg or arg.startswith('"'):
+ arg = '"%s"' % arg.replace('"', '\\"')
+ newargv.append(arg)
+ argv = newargv
+ close_fds = False
+ shell = True
+ else:
+ close_fds = True
+ shell = False
+
+ env = kwargs.get('env')
+ if env is None:
+ env = dict(_os.environ)
+ if 'X_JYTHON_WA_PATH' in env:
+ env['PATH'] = env['X_JYTHON_WA_PATH']
+
+ echo = kwargs.get('echo')
+ if echo:
+ print ' '.join(argv)
+ filepipe = kwargs.get('filepipe')
+ if filepipe:
+ return _filepipespawn(
+ kwargs.get('stdin'), kwargs.get('stdout'), argv, env
+ )
+ pipe = kwargs.get('stdout')
+ if pipe:
+ return _pipespawn(argv, env)
+
+ if subprocess is None:
+ pid = _os.spawnve(_os.P_NOWAIT, argv[0], argv, env)
+ return _os.waitpid(pid, 0)[1]
+ else:
+ p = subprocess.Popen(argv, env=env, shell=shell, close_fds=close_fds)
+ return p.wait()
+
+
+try:
+ walk = _os.walk
+except AttributeError:
+ # copy from python 2.4 sources (modulo docs and comments)
+ def walk(top, topdown=True, onerror=None):
+ """ directory tree walker """
+ # pylint: disable = C0103
+ join, isdir, islink = _os.path.join, _os.path.isdir, _os.path.islink
+ listdir, error = _os.listdir, _os.error
+
+ try:
+ names = listdir(top)
+ except error, err:
+ if onerror is not None:
+ onerror(err)
+ return
+
+ dirs, nondirs = [], []
+ for name in names:
+ if isdir(join(top, name)):
+ dirs.append(name)
+ else:
+ nondirs.append(name)
+
+ if topdown:
+ yield top, dirs, nondirs
+ for name in dirs:
+ path = join(top, name)
+ if not islink(path):
+ for x in walk(path, topdown, onerror):
+ yield x
+ if not topdown:
+ yield top, dirs, nondirs
+
+
+def files(base, wildcard='[!.]*', recursive=1, prune=('.git', '.svn', 'CVS')):
+ """ Determine a filelist """
+ for dirpath, dirnames, filenames in walk(native(base)):
+ for item in prune:
+ if item in dirnames:
+ dirnames.remove(item)
+
+ filenames.sort()
+ for name in _fnmatch.filter(filenames, wildcard):
+ dest = _os.path.join(dirpath, name)
+ if dest.startswith(cwd):
+ dest = dest.replace(cwd, '', 1)
+ aslist = []
+ head, tail = _os.path.split(dest)
+ while tail:
+ aslist.append(tail)
+ head, tail = _os.path.split(head)
+ aslist.reverse()
+ dest = '/'.join(aslist)
+ yield dest
+
+ if not recursive:
+ break
+ dirnames.sort()
+
+
+def dirs(base, wildcard='[!.]*', recursive=1, prune=('.git', '.svn', 'CVS')):
+ """ Determine a filelist """
+ for dirpath, dirnames, filenames in walk(native(base)):
+ for item in prune:
+ if item in dirnames:
+ dirnames.remove(item)
+
+ dirnames.sort()
+ for name in _fnmatch.filter(dirnames, wildcard):
+ dest = _os.path.join(dirpath, name)
+ if dest.startswith(cwd):
+ dest = dest.replace(cwd, '', 1)
+ aslist = []
+ head, tail = _os.path.split(dest)
+ while tail:
+ aslist.append(tail)
+ head, tail = _os.path.split(head)
+ aslist.reverse()
+ dest = '/'.join(aslist)
+ yield dest
+
+ if not recursive:
+ break
+
+
+def frompath(executable):
+ """ Find executable in PATH """
+ # Based on distutils.spawn.find_executable.
+ path = _os.environ.get('PATH', '')
+ paths = [
+ _os.path.expanduser(item)
+ for item in path.split(_os.pathsep)
+ ]
+ ext = _os.path.splitext(executable)[1]
+ exts = ['']
+ if _sys.platform == 'win32' or _os.name == 'os2':
+ eext = ['.exe', '.bat', '.py']
+ if ext not in eext:
+ exts.extend(eext)
+
+ for ext in exts:
+ if not _os.path.isfile(executable + ext):
+ for path in paths:
+ fname = _os.path.join(path, executable + ext)
+ if _os.path.isfile(fname):
+ # the file exists, we have a shot at spawn working
+ return fname
+ else:
+ return executable + ext
+
+ return None
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/term/__init__.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/term/__init__.py
new file mode 100644
index 00000000000..4e50ec37493
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/term/__init__.py
@@ -0,0 +1,28 @@
+# -*- coding: ascii -*-
+#
+# Copyright 2010, 2011
+# Andr\xe9 Malo or his licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+=====================
+ Package _setup.term
+=====================
+
+Terminal tools, not distributed.
+"""
+__author__ = u"Andr\xe9 Malo"
+__docformat__ = "restructuredtext en"
+
+# pylint: disable = W0611
+from _setup.term._term import terminfo, write, green, red, yellow, announce
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/term/_term.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/term/_term.py
new file mode 100644
index 00000000000..72b727c1a95
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/term/_term.py
@@ -0,0 +1,115 @@
+# -*- coding: ascii -*-
+#
+# Copyright 2007, 2008, 2009, 2010, 2011
+# Andr\xe9 Malo or his licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+=================
+ Terminal writer
+=================
+"""
+__author__ = u"Andr\xe9 Malo"
+__docformat__ = "restructuredtext en"
+
+import sys as _sys
+
+
+class _INFO(dict):
+ """ Terminal info dict """
+
+ def __init__(self):
+ """ Initialization """
+ dict.__init__(self, {
+ 'NORMAL': '',
+ 'BOLD': '',
+ 'ERASE': '\n',
+ 'RED': '',
+ 'YELLOW': '',
+ 'GREEN': '',
+ })
+ try:
+ import curses as _curses
+ except ImportError:
+ # fixup if a submodule of curses failed.
+ if 'curses' in _sys.modules:
+ del _sys.modules['curses']
+ else:
+ try:
+ _curses.setupterm()
+ except (TypeError, _curses.error):
+ pass
+ else:
+ def make_color(color):
+ """ Make color control string """
+ seq = _curses.tigetstr('setaf')
+ if seq is not None:
+ # XXX may fail - need better logic
+ seq = seq.replace("%p1", "") % color
+ return seq
+
+ self['NORMAL'] = _curses.tigetstr('sgr0')
+ self['BOLD'] = _curses.tigetstr('bold')
+
+ erase = _curses.tigetstr('el1')
+ if erase is not None:
+ self['ERASE'] = erase + _curses.tigetstr('cr')
+
+ self['RED'] = make_color(_curses.COLOR_RED)
+ self['YELLOW'] = make_color(_curses.COLOR_YELLOW)
+ self['GREEN'] = make_color(_curses.COLOR_GREEN)
+
+ def __getitem__(self, key):
+ """ Deliver always """
+ dict.get(self, key) or ""
+
+
+def terminfo():
+ """ Get info singleton """
+ # pylint: disable = E1101, W0612
+ if terminfo.info is None:
+ terminfo.info = _INFO()
+ return terminfo.info
+terminfo.info = None
+
+
+def write(fmt, **kwargs):
+ """ Write stuff on the terminal """
+ parm = dict(terminfo())
+ parm.update(kwargs)
+ _sys.stdout.write(fmt % parm)
+ _sys.stdout.flush()
+
+
+def green(bmt, **kwargs):
+ """ Write something in green on screen """
+ announce("%%(GREEN)s%s%%(NORMAL)s" % bmt, **kwargs)
+
+
+def red(bmt, **kwargs):
+ """ Write something in red on the screen """
+ announce("%%(BOLD)s%%(RED)s%s%%(NORMAL)s" % bmt, **kwargs)
+
+
+def yellow(fmt, **kwargs):
+ """ Write something in yellow on the screen """
+ announce("%%(BOLD)s%%(YELLOW)s%s%%(NORMAL)s" % fmt, **kwargs)
+
+
+def announce(fmt, **kwargs):
+ """ Announce something """
+ write(fmt, **kwargs)
+ _sys.stdout.write("\n")
+ _sys.stdout.flush()
+
+
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/util.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/util.py
new file mode 100644
index 00000000000..5c05fac6e4c
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/util.py
@@ -0,0 +1,73 @@
+# -*- coding: ascii -*-
+#
+# Copyright 2007, 2008, 2009, 2010, 2011
+# Andr\xe9 Malo or his licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+=================
+ Setup utilities
+=================
+
+Setup utilities.
+"""
+__author__ = u"Andr\xe9 Malo"
+__docformat__ = "restructuredtext en"
+
+try:
+ from distutils import log
+except ImportError:
+ class log(object):
+ def info(self, value):
+ print value
+ def debug(self, value):
+ pass
+ log = log()
+
+from distutils import util as _util
+try:
+ from ConfigParser import SafeConfigParser
+except ImportError:
+ import ConfigParser as _config_parser
+ class SafeConfigParser(_config_parser.ConfigParser):
+ """ Safe config parser """
+ def _interpolate(self, section, option, rawval, vars):
+ return rawval
+
+ def items(self, section):
+ return [(key, self.get(section, key))
+ for key in self.options(section)
+ ]
+
+
+def humanbool(name, value):
+ """
+ Determine human boolean value
+
+ :Parameters:
+ `name` : ``str``
+ The config key (used for error message)
+
+ `value` : ``str``
+ The config value
+
+ :Return: The boolean value
+ :Rtype: ``bool``
+
+ :Exceptions:
+ - `ValueError` : The value could not be recognized
+ """
+ try:
+ return _util.strtobool(str(value).strip().lower() or 'no')
+ except ValueError:
+ raise ValueError("Unrecognized config value: %s = %s" % (name, value))
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/__init__.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/__init__.py
new file mode 100644
index 00000000000..6139d510a10
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/__init__.py
@@ -0,0 +1,27 @@
+# -*- coding: ascii -*-
+#
+# Copyright 2007, 2008, 2009, 2010, 2011
+# Andr\xe9 Malo or his licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+================
+ Package _setup
+================
+
+This package provides tools for main package setup.
+"""
+__author__ = "Andr\xe9 Malo"
+__docformat__ = "restructuredtext en"
+
+from _setup.setup import run # pylint: disable = W0611
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/commands.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/commands.py
new file mode 100644
index 00000000000..7bfacbc86ef
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/commands.py
@@ -0,0 +1,266 @@
+# -*- coding: ascii -*-
+#
+# Copyright 2007, 2008, 2009, 2010, 2011
+# Andr\xe9 Malo or his licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+===================
+ Command extenders
+===================
+
+Command extenders.
+"""
+__author__ = "Andr\xe9 Malo"
+__docformat__ = "restructuredtext en"
+__test__ = False
+
+from distutils import fancy_getopt as _fancy_getopt
+from distutils import log
+from distutils.command import build as _build
+from distutils.command import build_ext as _build_ext
+from distutils.command import install as _install
+from distutils.command import install_data as _install_data
+from distutils.command import install_lib as _install_lib
+import os as _os
+
+_option_defaults = {}
+_option_inherits = {}
+_option_finalizers = {}
+_command_mapping = {
+ 'install': 'Install',
+ 'install_data': 'InstallData',
+ 'install_lib': 'InstallLib',
+ 'build': 'Build',
+ 'build_ext': 'BuildExt',
+}
+
+
+def add_option(command, long_name, help_text, short_name=None, default=None,
+ inherit=None):
+ """ Add an option """
+ try:
+ command_class = globals()[_command_mapping[command]]
+ except KeyError:
+ raise ValueError("Unknown command %r" % (command,))
+ for opt in command_class.user_options:
+ if opt[0] == long_name:
+ break
+ else:
+ opt = (long_name, short_name, help_text)
+ command_class.user_options.append(opt)
+ if not long_name.endswith('='):
+ command_class.boolean_options.append(long_name)
+ attr_name = _fancy_getopt.translate_longopt(long_name)
+ else:
+ attr_name = _fancy_getopt.translate_longopt(long_name[:-1])
+ if command not in _option_defaults:
+ _option_defaults[command] = []
+ if inherit is not None:
+ if isinstance(inherit, str):
+ inherit = [inherit]
+ for i_inherit in inherit:
+ add_option(
+ i_inherit, long_name, help_text, short_name, default
+ )
+ default = None
+ if command not in _option_inherits:
+ _option_inherits[command] = []
+ for i_inherit in inherit:
+ for i_command, opt_name in _option_inherits[command]:
+ if i_command == i_inherit and opt_name == attr_name:
+ break
+ else:
+ _option_inherits[command].append((i_inherit, attr_name))
+ _option_defaults[command].append((attr_name, default))
+
+
+def add_finalizer(command, key, func):
+ """ Add finalizer """
+ if command not in _option_finalizers:
+ _option_finalizers[command] = {}
+ if key not in _option_finalizers[command]:
+ _option_finalizers[command][key] = func
+
+
+class Install(_install.install):
+ """ Extended installer to reflect the additional data options """
+ user_options = _install.install.user_options + [
+ ('single-version-externally-managed', None,
+ "Compat option. Does not a thing."),
+ ]
+ boolean_options = _install.install.boolean_options + [
+ 'single-version-externally-managed'
+ ]
+
+ def initialize_options(self):
+ """ Prepare for new options """
+ _install.install.initialize_options(self)
+ self.single_version_externally_managed = None
+ if 'install' in _option_defaults:
+ for opt_name, default in _option_defaults['install']:
+ setattr(self, opt_name, default)
+
+ def finalize_options(self):
+ """ Finalize options """
+ _install.install.finalize_options(self)
+ if 'install' in _option_inherits:
+ for parent, opt_name in _option_inherits['install']:
+ self.set_undefined_options(parent, (opt_name, opt_name))
+ if 'install' in _option_finalizers:
+ for func in list(_option_finalizers['install'].values()):
+ func(self)
+
+
+class InstallData(_install_data.install_data):
+ """ Extended data installer """
+ user_options = _install_data.install_data.user_options + []
+ boolean_options = _install_data.install_data.boolean_options + []
+
+ def initialize_options(self):
+ """ Prepare for new options """
+ _install_data.install_data.initialize_options(self)
+ if 'install_data' in _option_defaults:
+ for opt_name, default in _option_defaults['install_data']:
+ setattr(self, opt_name, default)
+
+ def finalize_options(self):
+ """ Finalize options """
+ _install_data.install_data.finalize_options(self)
+ if 'install_data' in _option_inherits:
+ for parent, opt_name in _option_inherits['install_data']:
+ self.set_undefined_options(parent, (opt_name, opt_name))
+ if 'install_data' in _option_finalizers:
+ for func in list(_option_finalizers['install_data'].values()):
+ func(self)
+
+
+class InstallLib(_install_lib.install_lib):
+ """ Extended lib installer """
+ user_options = _install_lib.install_lib.user_options + []
+ boolean_options = _install_lib.install_lib.boolean_options + []
+
+ def initialize_options(self):
+ """ Prepare for new options """
+ _install_lib.install_lib.initialize_options(self)
+ if 'install_lib' in _option_defaults:
+ for opt_name, default in _option_defaults['install_lib']:
+ setattr(self, opt_name, default)
+
+ def finalize_options(self):
+ """ Finalize options """
+ _install_lib.install_lib.finalize_options(self)
+ if 'install_lib' in _option_inherits:
+ for parent, opt_name in _option_inherits['install_lib']:
+ self.set_undefined_options(parent, (opt_name, opt_name))
+ if 'install_lib' in _option_finalizers:
+ for func in list(_option_finalizers['install_lib'].values()):
+ func(self)
+
+
+class BuildExt(_build_ext.build_ext):
+ """
+ Extended extension builder class
+
+ This class allows extensions to provide a ``check_prerequisites`` method
+ which is called before actually building it. The method takes the
+ `BuildExt` instance and returns whether the extension should be skipped or
+ not.
+ """
+
+ def initialize_options(self):
+ """ Prepare for new options """
+ _build_ext.build_ext.initialize_options(self)
+ if 'build_ext' in _option_defaults:
+ for opt_name, default in _option_defaults['build_ext']:
+ setattr(self, opt_name, default)
+
+ def finalize_options(self):
+ """ Finalize options """
+ _build_ext.build_ext.finalize_options(self)
+ if 'build_ext' in _option_inherits:
+ for parent, opt_name in _option_inherits['build_ext']:
+ self.set_undefined_options(parent, (opt_name, opt_name))
+ if 'build_ext' in _option_finalizers:
+ for func in list(_option_finalizers['build_ext'].values()):
+ func(self)
+
+ def build_extension(self, ext):
+ """
+ Build C extension - with extended functionality
+
+ The following features are added here:
+
+ - ``ext.check_prerequisites`` is called before the extension is being
+ built. See `Extension` for details. If the method does not exist,
+ simply no check will be run.
+ - The macros ``EXT_PACKAGE`` and ``EXT_MODULE`` will be filled (or
+ unset) depending on the extensions name, but only if they are not
+ already defined.
+
+ :Parameters:
+ `ext` : `Extension`
+ The extension to build. If it's a pure
+ ``distutils.core.Extension``, simply no prequisites check is
+ applied.
+
+ :Return: whatever ``distutils.command.build_ext.build_ext`` returns
+ :Rtype: any
+ """
+ # handle name macros
+ macros = dict(ext.define_macros or ())
+ tup = ext.name.split('.')
+ if len(tup) == 1:
+ pkg, mod = None, tup[0]
+ else:
+ pkg, mod = '.'.join(tup[:-1]), tup[-1]
+ if pkg is not None and 'EXT_PACKAGE' not in macros:
+ ext.define_macros.append(('EXT_PACKAGE', pkg))
+ if 'EXT_MODULE' not in macros:
+ ext.define_macros.append(('EXT_MODULE', mod))
+ if pkg is None:
+ macros = dict(ext.undef_macros or ())
+ if 'EXT_PACKAGE' not in macros:
+ ext.undef_macros.append('EXT_PACKAGE')
+
+ # handle prereq checks
+ try:
+ checker = ext.check_prerequisites
+ except AttributeError:
+ pass
+ else:
+ if checker(self):
+ log.info("Skipping %s extension" % ext.name)
+ return
+
+ return _build_ext.build_ext.build_extension(self, ext)
+
+
+class Build(_build.build):
+
+ def initialize_options(self):
+ """ Prepare for new options """
+ _build.build.initialize_options(self)
+ if 'build' in _option_defaults:
+ for opt_name, default in _option_defaults['build']:
+ setattr(self, opt_name, default)
+
+ def finalize_options(self):
+ """ Finalize options """
+ _build.build.finalize_options(self)
+ if 'build' in _option_inherits:
+ for parent, opt_name in _option_inherits['build']:
+ self.set_undefined_options(parent, (opt_name, opt_name))
+ if 'build' in _option_finalizers:
+ for func in list(_option_finalizers['build'].values()):
+ func(self)
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/data.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/data.py
new file mode 100644
index 00000000000..d4221735768
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/data.py
@@ -0,0 +1,165 @@
+# -*- coding: ascii -*-
+#
+# Copyright 2007, 2008, 2009, 2010, 2011
+# Andr\xe9 Malo or his licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+===================
+ Data distribution
+===================
+
+This module provides tools to simplify data distribution.
+"""
+__author__ = "Andr\xe9 Malo"
+__docformat__ = "restructuredtext en"
+
+from distutils import filelist as _filelist
+import os as _os
+import posixpath as _posixpath
+import sys as _sys
+
+from _setup import commands as _commands
+
+
+def splitpath(path):
+ """ Split a path """
+ drive, path = '', _os.path.normpath(path)
+ try:
+ splitunc = _os.path.splitunc
+ except AttributeError:
+ pass
+ else:
+ drive, path = splitunc(path)
+ if not drive:
+ drive, path = _os.path.splitdrive(path)
+ elems = []
+ try:
+ sep = _os.path.sep
+ except AttributeError:
+ sep = _os.path.join('1', '2')[1:-1]
+ while 1:
+ prefix, path = _os.path.split(path)
+ elems.append(path)
+ if prefix in ('', sep):
+ drive = _os.path.join(drive, prefix)
+ break
+ path = prefix
+ elems.reverse()
+ return drive, elems
+
+
+def finalizer(installer):
+ """ Finalize install_data """
+ data_files = []
+ for item in installer.data_files:
+ if not isinstance(item, Data):
+ data_files.append(item)
+ continue
+ data_files.extend(item.flatten(installer))
+ installer.data_files = data_files
+
+
+class Data(object):
+ """ File list container """
+
+ def __init__(self, files, target=None, preserve=0, strip=0,
+ prefix=None):
+ """ Initialization """
+ self._files = files
+ self._target = target
+ self._preserve = preserve
+ self._strip = strip
+ self._prefix = prefix
+ self.fixup_commands()
+
+ def fixup_commands(self):
+ pass
+
+ def from_templates(cls, *templates, **kwargs):
+ """ Initialize from template """
+ files = _filelist.FileList()
+ for tpl in templates:
+ for line in tpl.split(';'):
+ files.process_template_line(line.strip())
+ files.sort()
+ files.remove_duplicates()
+ result = []
+ for filename in files.files:
+ _, elems = splitpath(filename)
+ if '.svn' in elems or '.git' in elems:
+ continue
+ result.append(filename)
+ return cls(result, **kwargs)
+ from_templates = classmethod(from_templates)
+
+ def flatten(self, installer):
+ """ Flatten the file list to (target, file) tuples """
+ # pylint: disable = W0613
+ if self._prefix:
+ _, prefix = splitpath(self._prefix)
+ telems = prefix
+ else:
+ telems = []
+
+ tmap = {}
+ for fname in self._files:
+ (_, name), target = splitpath(fname), telems
+ if self._preserve:
+ if self._strip:
+ name = name[max(0, min(self._strip, len(name) - 1)):]
+ if len(name) > 1:
+ target = telems + name[:-1]
+ tmap.setdefault(_posixpath.join(*target), []).append(fname)
+ return list(tmap.items())
+
+
+class Documentation(Data):
+ """ Documentation container """
+
+ def fixup_commands(self):
+ _commands.add_option('install_data', 'without-docs',
+ help_text='Do not install documentation files',
+ inherit='install',
+ )
+ _commands.add_finalizer('install_data', 'documentation', finalizer)
+
+ def flatten(self, installer):
+ """ Check if docs should be installed at all """
+ if installer.without_docs:
+ return []
+ return Data.flatten(self, installer)
+
+
+class Manpages(Documentation):
+ """ Manpages container """
+
+ def dispatch(cls, files):
+ """ Automatically dispatch manpages to their target directories """
+ mpmap = {}
+ for manpage in files:
+ normalized = _os.path.normpath(manpage)
+ _, ext = _os.path.splitext(normalized)
+ if ext.startswith(_os.path.extsep):
+ ext = ext[len(_os.path.extsep):]
+ mpmap.setdefault(ext, []).append(manpage)
+ return [cls(manpages, prefix=_posixpath.join(
+ 'share', 'man', 'man%s' % section,
+ )) for section, manpages in list(mpmap.items())]
+ dispatch = classmethod(dispatch)
+
+ def flatten(self, installer):
+ """ Check if manpages are suitable """
+ if _sys.platform == 'win32':
+ return []
+ return Documentation.flatten(self, installer)
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/dist.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/dist.py
new file mode 100644
index 00000000000..cce21e57a63
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/dist.py
@@ -0,0 +1,51 @@
+# -*- coding: ascii -*-
+#
+# Copyright 2007, 2008, 2009, 2010, 2011
+# Andr\xe9 Malo or his licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+================
+ dist utilities
+================
+
+dist utilities.
+"""
+__author__ = "Andr\xe9 Malo"
+__docformat__ = "restructuredtext en"
+
+import sys as _sys
+
+from _setup import shell as _shell
+
+
+def run_setup(*args, **kwargs):
+ """ Run setup """
+ if 'setup' in kwargs:
+ script = kwargs.get('setup') or 'setup.py'
+ del kwargs['setup']
+ else:
+ script = 'setup.py'
+ if 'fakeroot' in kwargs:
+ fakeroot = kwargs['fakeroot']
+ del kwargs['fakeroot']
+ else:
+ fakeroot = None
+ if kwargs:
+ raise TypeError("Unrecognized keyword parameters")
+
+ script = _shell.native(script)
+ argv = [_sys.executable, script] + list(args)
+ if fakeroot:
+ argv.insert(0, fakeroot)
+ return not _shell.spawn(*argv)
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/ext.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/ext.py
new file mode 100644
index 00000000000..852c466547e
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/ext.py
@@ -0,0 +1,253 @@
+# -*- coding: ascii -*-
+#
+# Copyright 2007, 2008, 2009, 2010, 2011
+# Andr\xe9 Malo or his licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+===================
+ C extension tools
+===================
+
+C extension tools.
+"""
+__author__ = "Andr\xe9 Malo"
+__docformat__ = "restructuredtext en"
+__test__ = False
+
+from distutils import core as _core
+from distutils import errors as _distutils_errors
+from distutils import log
+import os as _os
+import posixpath as _posixpath
+import shutil as _shutil
+import tempfile as _tempfile
+
+from _setup import commands as _commands
+
+def _install_finalizer(installer):
+ if installer.without_c_extensions:
+ installer.distribution.ext_modules = []
+
+def _build_finalizer(builder):
+ if builder.without_c_extensions:
+ builder.extensions = []
+
+
+class Extension(_core.Extension):
+ """
+ Extension with prerequisite check interface
+
+ If your check is cacheable (during the setup run), override
+ `cached_check_prerequisites`, `check_prerequisites` otherwise.
+
+ :IVariables:
+ `cached_check` : ``bool``
+ The cached check result
+ """
+ cached_check = None
+
+ def __init__(self, *args, **kwargs):
+ """ Initialization """
+ if 'depends' in kwargs:
+ self.depends = kwargs['depends'] or []
+ else:
+ self.depends = []
+ _core.Extension.__init__(self, *args, **kwargs)
+
+ # add include path
+ included = _posixpath.join('_setup', 'include')
+ if included not in self.include_dirs:
+ self.include_dirs.append(included)
+
+ # add cext.h to the dependencies
+ cext_h = _posixpath.join(included, 'cext.h')
+ if cext_h not in self.depends:
+ self.depends.append(cext_h)
+
+ _commands.add_option('install_lib', 'without-c-extensions',
+ help_text='Don\'t install C extensions',
+ inherit='install',
+ )
+ _commands.add_finalizer('install_lib', 'c-extensions',
+ _install_finalizer
+ )
+ _commands.add_option('build_ext', 'without-c-extensions',
+ help_text='Don\'t build C extensions',
+ inherit=('build', 'install_lib'),
+ )
+ _commands.add_finalizer('build_ext', 'c-extensions', _build_finalizer)
+
+ def check_prerequisites(self, build):
+ """
+ Check prerequisites
+
+ The check should cover all dependencies needed for the extension to
+ be built and run. The method can do the following:
+
+ - return a false value: the extension will be built
+ - return a true value: the extension will be skipped. This is useful
+ for optional extensions
+ - raise an exception. This is useful for mandatory extensions
+
+ If the check result is cacheable (during the setup run), override
+ `cached_check_prerequisites` instead.
+
+ :Parameters:
+ `build` : `BuildExt`
+ The extension builder
+
+ :Return: Skip the extension?
+ :Rtype: ``bool``
+ """
+ if self.cached_check is None:
+ log.debug("PREREQ check for %s" % self.name)
+ self.cached_check = self.cached_check_prerequisites(build)
+ else:
+ log.debug("PREREQ check for %s (cached)" % self.name)
+ return self.cached_check
+
+ def cached_check_prerequisites(self, build):
+ """
+ Check prerequisites
+
+ The check should cover all dependencies needed for the extension to
+ be built and run. The method can do the following:
+
+ - return a false value: the extension will be built
+ - return a true value: the extension will be skipped. This is useful
+ for optional extensions
+ - raise an exception. This is useful for mandatory extensions
+
+ If the check result is *not* cacheable (during the setup run),
+ override `check_prerequisites` instead.
+
+ :Parameters:
+ `build` : `BuildExt`
+ The extension builder
+
+ :Return: Skip the extension?
+ :Rtype: ``bool``
+ """
+ # pylint: disable = W0613
+ log.debug("Nothing to check for %s!" % self.name)
+ return False
+
+
+class ConfTest(object):
+ """
+ Single conftest abstraction
+
+ :IVariables:
+ `_tempdir` : ``str``
+ The tempdir created for this test
+
+ `src` : ``str``
+ Name of the source file
+
+ `target` : ``str``
+ Target filename
+
+ `compiler` : ``CCompiler``
+ compiler instance
+
+ `obj` : ``list``
+ List of object filenames (``[str, ...]``)
+ """
+ _tempdir = None
+
+ def __init__(self, build, source):
+ """
+ Initialization
+
+ :Parameters:
+ `build` : ``distuils.command.build_ext.build_ext``
+ builder instance
+
+ `source` : ``str``
+ Source of the file to compile
+ """
+ self._tempdir = tempdir = _tempfile.mkdtemp()
+ src = _os.path.join(tempdir, 'conftest.c')
+ fp = open(src, 'w', encoding='utf-8')
+ try:
+ fp.write(source)
+ finally:
+ fp.close()
+ self.src = src
+ self.compiler = compiler = build.compiler
+ self.target = _os.path.join(tempdir, 'conftest')
+ self.obj = compiler.object_filenames([src], output_dir=tempdir)
+
+ def __del__(self):
+ """ Destruction """
+ self.destroy()
+
+ def destroy(self):
+ """ Destroy the conftest leftovers on disk """
+ tempdir, self._tempdir = self._tempdir, None
+ if tempdir is not None:
+ _shutil.rmtree(tempdir)
+
+ def compile(self, **kwargs):
+ """
+ Compile the conftest
+
+ :Parameters:
+ `kwargs` : ``dict``
+ Optional keyword parameters for the compiler call
+
+ :Return: Was the compilation successful?
+ :Rtype: ``bool``
+ """
+ kwargs['output_dir'] = self._tempdir
+ try:
+ self.compiler.compile([self.src], **kwargs)
+ except _distutils_errors.CompileError:
+ return False
+ return True
+
+ def link(self, **kwargs):
+ r"""
+ Link the conftest
+
+ Before you can link the conftest objects they need to be `compile`\d.
+
+ :Parameters:
+ `kwargs` : ``dict``
+ Optional keyword parameters for the linker call
+
+ :Return: Was the linking successful?
+ :Rtype: ``bool``
+ """
+ try:
+ self.compiler.link_executable(self.obj, self.target, **kwargs)
+ except _distutils_errors.LinkError:
+ return False
+ return True
+
+ def pipe(self, mode="r"):
+ r"""
+ Execute the conftest binary and connect to it using a pipe
+
+ Before you can pipe to or from the conftest binary it needs to
+ be `link`\ed.
+
+ :Parameters:
+ `mode` : ``str``
+ Pipe mode - r/w
+
+ :Return: The open pipe
+ :Rtype: ``file``
+ """
+ return _os.popen(self.compiler.executable_filename(self.target), mode)
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/setup.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/setup.py
new file mode 100644
index 00000000000..83f1c21d544
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/setup.py
@@ -0,0 +1,420 @@
+# -*- coding: ascii -*-
+#
+# Copyright 2007 - 2013
+# Andr\xe9 Malo or his licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+===================
+ Main setup runner
+===================
+
+This module provides a wrapper around the distutils core setup.
+"""
+__author__ = "Andr\xe9 Malo"
+__docformat__ = "restructuredtext en"
+
+import configparser as _config_parser
+from distutils import core as _core
+import os as _os
+import posixpath as _posixpath
+import sys as _sys
+
+from _setup import commands as _commands
+from _setup import data as _data
+from _setup import ext as _ext
+from _setup import util as _util
+from _setup import shell as _shell
+
+
+def check_python_version(impl, version_min, version_max):
+ """ Check python version """
+ if impl == 'python':
+ version_info = _sys.version_info
+ elif impl == 'pypy':
+ version_info = getattr(_sys, 'pypy_version_info', None)
+ if not version_info:
+ return
+ elif impl == 'jython':
+ if not 'java' in _sys.platform.lower():
+ return
+ version_info = _sys.version_info
+ else:
+ raise AssertionError("impl not in ('python', 'pypy', 'jython')")
+
+ pyversion = list(map(int, version_info[:3]))
+ if version_min:
+ min_required = list(
+ map(int, '.'.join((version_min, '0.0.0')).split('.')[:3])
+ )
+ if pyversion < min_required:
+ raise EnvironmentError("Need at least %s %s (vs. %s)" % (
+ impl, version_min, '.'.join(map(str, pyversion))
+ ))
+ if version_max:
+ max_required = list(map(int, version_max.split('.')))
+ max_required[-1] += 1
+ if pyversion >= max_required:
+ raise EnvironmentError("Need at max %s %s (vs. %s)" % (
+ impl,
+ version_max,
+ '.'.join(map(str, pyversion))
+ ))
+
+
+def find_description(docs):
+ """
+ Determine the package description from DESCRIPTION
+
+ :Parameters:
+ `docs` : ``dict``
+ Docs config section
+
+ :Return: Tuple of summary, description and license
+ (``('summary', 'description', 'license')``)
+ (all may be ``None``)
+ :Rtype: ``tuple``
+ """
+ summary = None
+ filename = docs.get('meta.summary', 'SUMMARY').strip()
+ if filename and _os.path.isfile(filename):
+ fp = open(filename, encoding='utf-8')
+ try:
+ try:
+ summary = fp.read().strip().splitlines()[0].rstrip()
+ except IndexError:
+ summary = ''
+ finally:
+ fp.close()
+
+ description = None
+ filename = docs.get('meta.description', 'DESCRIPTION').strip()
+ if filename and _os.path.isfile(filename):
+ fp = open(filename, encoding='utf-8')
+ try:
+ description = fp.read().rstrip()
+ finally:
+ fp.close()
+
+ if summary is None and description:
+ from docutils import core
+ summary = core.publish_parts(
+ source=description,
+ source_path=filename,
+ writer_name='html',
+ )['title'].encode('utf-8')
+
+ return summary, description
+
+
+def find_classifiers(docs):
+ """
+ Determine classifiers from CLASSIFIERS
+
+ :return: List of classifiers (``['classifier', ...]``)
+ :rtype: ``list``
+ """
+ filename = docs.get('meta.classifiers', 'CLASSIFIERS').strip()
+ if filename and _os.path.isfile(filename):
+ fp = open(filename, encoding='utf-8')
+ try:
+ content = fp.read()
+ finally:
+ fp.close()
+ content = [item.strip() for item in content.splitlines()]
+ return [item for item in content if item and not item.startswith('#')]
+ return []
+
+
+def find_provides(docs):
+ """
+ Determine provides from PROVIDES
+
+ :return: List of provides (``['provides', ...]``)
+ :rtype: ``list``
+ """
+ filename = docs.get('meta.provides', 'PROVIDES').strip()
+ if filename and _os.path.isfile(filename):
+ fp = open(filename, encoding='utf-8')
+ try:
+ content = fp.read()
+ finally:
+ fp.close()
+ content = [item.strip() for item in content.splitlines()]
+ return [item for item in content if item and not item.startswith('#')]
+ return []
+
+
+def find_license(docs):
+ """
+ Determine license from LICENSE
+
+ :return: License text
+ :rtype: ``str``
+ """
+ filename = docs.get('meta.license', 'LICENSE').strip()
+ if filename and _os.path.isfile(filename):
+ fp = open(filename, encoding='utf-8')
+ try:
+ return fp.read().rstrip()
+ finally:
+ fp.close()
+ return None
+
+
+def find_packages(manifest):
+ """ Determine packages and subpackages """
+ packages = {}
+ collect = manifest.get('packages.collect', '').split()
+ lib = manifest.get('packages.lib', '.')
+ try:
+ sep = _os.path.sep
+ except AttributeError:
+ sep = _os.path.join('1', '2')[1:-1]
+ for root in collect:
+ for dirpath, _, filenames in _shell.walk(_os.path.join(lib, root)):
+ if dirpath.find('.svn') >= 0 or dirpath.find('.git') >= 0:
+ continue
+ if '__init__.py' in filenames:
+ packages[
+ _os.path.normpath(dirpath).replace(sep, '.')
+ ] = None
+ packages = list(packages.keys())
+ packages.sort()
+ return packages
+
+
+def find_data(name, docs):
+ """ Determine data files """
+ result = []
+ if docs.get('extra', '').strip():
+ result.append(_data.Documentation(docs['extra'].split(),
+ prefix='share/doc/%s' % name,
+ ))
+ if docs.get('examples.dir', '').strip():
+ tpl = ['recursive-include %s *' % docs['examples.dir']]
+ if docs.get('examples.ignore', '').strip():
+ tpl.extend(["global-exclude %s" % item
+ for item in docs['examples.ignore'].split()
+ ])
+ strip = int(docs.get('examples.strip', '') or 0)
+ result.append(_data.Documentation.from_templates(*tpl, **{
+ 'strip': strip,
+ 'prefix': 'share/doc/%s' % name,
+ 'preserve': 1,
+ }))
+ if docs.get('userdoc.dir', '').strip():
+ tpl = ['recursive-include %s *' % docs['userdoc.dir']]
+ if docs.get('userdoc.ignore', '').strip():
+ tpl.extend(["global-exclude %s" % item
+ for item in docs['userdoc.ignore'].split()
+ ])
+ strip = int(docs.get('userdoc.strip', '') or 0)
+ result.append(_data.Documentation.from_templates(*tpl, **{
+ 'strip': strip,
+ 'prefix': 'share/doc/%s' % name,
+ 'preserve': 1,
+ }))
+ if docs.get('apidoc.dir', '').strip():
+ tpl = ['recursive-include %s *' % docs['apidoc.dir']]
+ if docs.get('apidoc.ignore', '').strip():
+ tpl.extend(["global-exclude %s" % item
+ for item in docs['apidoc.ignore'].split()
+ ])
+ strip = int(docs.get('apidoc.strip', '') or 0)
+ result.append(_data.Documentation.from_templates(*tpl, **{
+ 'strip': strip,
+ 'prefix': 'share/doc/%s' % name,
+ 'preserve': 1,
+ }))
+ if docs.get('man', '').strip():
+ result.extend(_data.Manpages.dispatch(docs['man'].split()))
+ return result
+
+
+def make_manifest(manifest, config, docs, kwargs):
+ """ Create file list to pack up """
+ # pylint: disable = R0912
+ kwargs = kwargs.copy()
+ kwargs['script_args'] = ['install']
+ kwargs['packages'] = list(kwargs.get('packages') or ()) + [
+ '_setup', '_setup.py2', '_setup.py3',
+ ] + list(manifest.get('packages.extra', '').split() or ())
+ _core._setup_stop_after = "commandline"
+ try:
+ dist = _core.setup(**kwargs)
+ finally:
+ _core._setup_stop_after = None
+
+ result = ['MANIFEST', 'PKG-INFO', 'setup.py'] + list(config)
+ # TODO: work with default values:
+ for key in ('classifiers', 'description', 'summary', 'provides',
+ 'license'):
+ filename = docs.get('meta.' + key, '').strip()
+ if filename and _os.path.isfile(filename):
+ result.append(filename)
+
+ cmd = dist.get_command_obj("build_py")
+ cmd.ensure_finalized()
+ #from pprint import pprint; pprint(("build_py", cmd.get_source_files()))
+ for item in cmd.get_source_files():
+ result.append(_posixpath.sep.join(
+ _os.path.normpath(item).split(_os.path.sep)
+ ))
+
+ cmd = dist.get_command_obj("build_ext")
+ cmd.ensure_finalized()
+ #from pprint import pprint; pprint(("build_ext", cmd.get_source_files()))
+ for item in cmd.get_source_files():
+ result.append(_posixpath.sep.join(
+ _os.path.normpath(item).split(_os.path.sep)
+ ))
+ for ext in cmd.extensions:
+ if ext.depends:
+ result.extend([_posixpath.sep.join(
+ _os.path.normpath(item).split(_os.path.sep)
+ ) for item in ext.depends])
+
+ cmd = dist.get_command_obj("build_clib")
+ cmd.ensure_finalized()
+ if cmd.libraries:
+ #import pprint; pprint.pprint(("build_clib", cmd.get_source_files()))
+ for item in cmd.get_source_files():
+ result.append(_posixpath.sep.join(
+ _os.path.normpath(item).split(_os.path.sep)
+ ))
+ for lib in cmd.libraries:
+ if lib[1].get('depends'):
+ result.extend([_posixpath.sep.join(
+ _os.path.normpath(item).split(_os.path.sep)
+ ) for item in lib[1]['depends']])
+
+ cmd = dist.get_command_obj("build_scripts")
+ cmd.ensure_finalized()
+ #import pprint; pprint.pprint(("build_scripts", cmd.get_source_files()))
+ if cmd.get_source_files():
+ for item in cmd.get_source_files():
+ result.append(_posixpath.sep.join(
+ _os.path.normpath(item).split(_os.path.sep)
+ ))
+
+ cmd = dist.get_command_obj("install_data")
+ cmd.ensure_finalized()
+ #from pprint import pprint; pprint(("install_data", cmd.get_inputs()))
+ try:
+ strings = str
+ except NameError:
+ strings = (str, str)
+
+ for item in cmd.get_inputs():
+ if isinstance(item, strings):
+ result.append(item)
+ else:
+ result.extend(item[1])
+
+ for item in manifest.get('dist', '').split():
+ result.append(item)
+ if _os.path.isdir(item):
+ for filename in _shell.files(item):
+ result.append(filename)
+
+ result = list(dict([(item, None) for item in result]).keys())
+ result.sort()
+ return result
+
+
+def run(config=('package.cfg',), ext=None, script_args=None, manifest_only=0):
+ """ Main runner """
+ if ext is None:
+ ext = []
+
+ cfg = _util.SafeConfigParser()
+ cfg.read(config, encoding='utf-8')
+ pkg = dict(cfg.items('package'))
+ python_min = pkg.get('python.min') or None
+ python_max = pkg.get('python.max') or None
+ check_python_version('python', python_min, python_max)
+ pypy_min = pkg.get('pypy.min') or None
+ pypy_max = pkg.get('pypy.max') or None
+ check_python_version('pypy', pypy_min, pypy_max)
+ jython_min = pkg.get('jython.min') or None
+ jython_max = pkg.get('jython.max') or None
+ check_python_version('jython', jython_min, jython_max)
+
+ manifest = dict(cfg.items('manifest'))
+ try:
+ docs = dict(cfg.items('docs'))
+ except _config_parser.NoSectionError:
+ docs = {}
+
+ summary, description = find_description(docs)
+ scripts = manifest.get('scripts', '').strip() or None
+ if scripts:
+ scripts = scripts.split()
+ modules = manifest.get('modules', '').strip() or None
+ if modules:
+ modules = modules.split()
+ keywords = docs.get('meta.keywords', '').strip() or None
+ if keywords:
+ keywords = keywords.split()
+ revision = pkg.get('version.revision', '').strip()
+ if revision:
+ revision = "-r%s" % (revision,)
+
+ kwargs = {
+ 'name': pkg['name'],
+ 'version': "%s%s" % (
+ pkg['version.number'],
+ ["", "-dev%s" % (revision,)][_util.humanbool(
+ 'version.dev', pkg.get('version.dev', 'false')
+ )],
+ ),
+ 'provides': find_provides(docs),
+ 'description': summary,
+ 'long_description': description,
+ 'classifiers': find_classifiers(docs),
+ 'keywords': keywords,
+ 'author': pkg['author.name'],
+ 'author_email': pkg['author.email'],
+ 'maintainer': pkg.get('maintainer.name'),
+ 'maintainer_email': pkg.get('maintainer.email'),
+ 'url': pkg.get('url.homepage'),
+ 'download_url': pkg.get('url.download'),
+ 'license': find_license(docs),
+ 'package_dir': {'': manifest.get('packages.lib', '.')},
+ 'packages': find_packages(manifest),
+ 'py_modules': modules,
+ 'ext_modules': ext,
+ 'scripts': scripts,
+ 'script_args': script_args,
+ 'data_files': find_data(pkg['name'], docs),
+ 'cmdclass': {
+ 'build' : _commands.Build,
+ 'build_ext' : _commands.BuildExt,
+ 'install' : _commands.Install,
+ 'install_data': _commands.InstallData,
+ 'install_lib' : _commands.InstallLib,
+ }
+ }
+ for key in ('provides',):
+ if key not in _core.setup_keywords:
+ del kwargs[key]
+
+ if manifest_only:
+ return make_manifest(manifest, config, docs, kwargs)
+
+ # monkey-patch crappy manifest writer away.
+ from distutils.command import sdist
+ sdist.sdist.get_file_list = sdist.sdist.read_manifest
+
+ return _core.setup(**kwargs)
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/shell.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/shell.py
new file mode 100644
index 00000000000..91f2ebc5b40
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/shell.py
@@ -0,0 +1,351 @@
+# -*- coding: ascii -*-
+#
+# Copyright 2007 - 2013
+# Andr\xe9 Malo or his licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+=================
+ Shell utilities
+=================
+
+Shell utilities.
+"""
+__author__ = "Andr\xe9 Malo"
+__docformat__ = "restructuredtext en"
+
+import errno as _errno
+import fnmatch as _fnmatch
+import os as _os
+import shutil as _shutil
+import subprocess as _subprocess
+import sys as _sys
+import tempfile as _tempfile
+
+cwd = _os.path.dirname(_os.path.abspath(_sys.argv[0]))
+
+class ExitError(RuntimeError):
+ """ Exit error """
+ def __init__(self, code):
+ RuntimeError.__init__(self, code)
+ self.code = code
+ self.signal = None
+
+
+class SignalError(ExitError):
+ """ Signal error """
+ def __init__(self, code, signal):
+ ExitError.__init__(self, code)
+ import signal as _signal
+ self.signal = signal
+ for key, val in vars(_signal).items():
+ if key.startswith('SIG') and not key.startswith('SIG_'):
+ if val == signal:
+ self.signalstr = key[3:]
+ break
+ else:
+ self.signalstr = '%04d' % signal
+
+
+def native(path):
+ """ Convert slash path to native """
+ path = _os.path.sep.join(path.split('/'))
+ return _os.path.normpath(_os.path.join(cwd, path))
+
+
+def cp(src, dest):
+ """ Copy src to dest """
+ _shutil.copy2(native(src), native(dest))
+
+
+def cp_r(src, dest):
+ """ Copy -r src to dest """
+ _shutil.copytree(native(src), native(dest))
+
+
+def rm(dest):
+ """ Remove a file """
+ try:
+ _os.unlink(native(dest))
+ except OSError as e:
+ if _errno.ENOENT != e.errno:
+ raise
+
+def rm_rf(dest):
+ """ Remove a tree """
+ dest = native(dest)
+ if _os.path.exists(dest):
+ for path in files(dest, '*'):
+ _os.chmod(native(path), 0o644)
+ _shutil.rmtree(dest)
+
+
+mkstemp = _tempfile.mkstemp
+
+
+def _pipespawn(argv, env):
+ """ Pipe spawn """
+ # pylint: disable = R0912
+ import pickle as _pickle
+ fd, name = mkstemp('.py')
+ try:
+ _os.write(fd, ((r"""
+import os
+import pickle
+import subprocess
+import sys
+
+argv = pickle.loads(%(argv)s)
+env = pickle.loads(%(env)s)
+if 'X_JYTHON_WA_PATH' in env:
+ env['PATH'] = env['X_JYTHON_WA_PATH']
+
+p = subprocess.Popen(argv, env=env)
+result = p.wait()
+if result < 0:
+ print("\n%%d 1" %% (-result))
+ sys.exit(2)
+if result == 0:
+ sys.exit(0)
+print("\n%%d" %% (result & 7,))
+sys.exit(3)
+ """.strip() + "\n") % {
+ 'argv': repr(_pickle.dumps(argv)),
+ 'env': repr(_pickle.dumps(dict(env))),
+ }).encode('utf-8'))
+ fd, _ = None, _os.close(fd)
+ if _sys.platform == 'win32':
+ argv = []
+ for arg in [_sys.executable, name]:
+ if ' ' in arg or arg.startswith('"'):
+ arg = '"%s"' % arg.replace('"', '\\"')
+ argv.append(arg)
+ argv = ' '.join(argv)
+ shell = True
+ close_fds = False
+ else:
+ argv = [_sys.executable, name]
+ shell = False
+ close_fds = True
+
+ res = 0
+ if 'X_JYTHON_WA_PATH' in env:
+ env['PATH'] = env['X_JYTHON_WA_PATH']
+
+ proc = _subprocess.Popen(argv,
+ shell=shell,
+ stdin=_subprocess.PIPE,
+ stdout=_subprocess.PIPE,
+ close_fds=close_fds,
+ env=env,
+ )
+ try:
+ proc.stdin.close()
+ result = proc.stdout.read()
+ finally:
+ res = proc.wait()
+ if res != 0:
+ if res == 2:
+ signal, code = list(map(int, result.splitlines()[-1].split()))
+ raise SignalError(code, signal)
+ elif res == 3:
+ code = int(result.splitlines()[-1].strip())
+ raise ExitError(code)
+ raise ExitError(res)
+
+ return result.decode('latin-1')
+ finally:
+ try:
+ if fd is not None:
+ _os.close(fd)
+ finally:
+ _os.unlink(name)
+
+
+def _filepipespawn(infile, outfile, argv, env):
+ """ File Pipe spawn """
+ import pickle as _pickle
+ fd, name = mkstemp('.py')
+ try:
+ _os.write(fd, (("""
+import os
+import pickle
+import sys
+
+infile = pickle.loads(%(infile)s)
+outfile = pickle.loads(%(outfile)s)
+argv = pickle.loads(%(argv)s)
+env = pickle.loads(%(env)s)
+
+if infile is not None:
+ infile = open(infile, 'rb')
+ os.dup2(infile.fileno(), 0)
+ infile.close()
+if outfile is not None:
+ outfile = open(outfile, 'wb')
+ os.dup2(outfile.fileno(), 1)
+ outfile.close()
+
+pid = os.spawnve(os.P_NOWAIT, argv[0], argv, env)
+result = os.waitpid(pid, 0)[1]
+sys.exit(result & 7)
+ """.strip() + "\n") % {
+ 'infile': repr(_pickle.dumps(_os.path.abspath(infile))),
+ 'outfile': repr(_pickle.dumps(_os.path.abspath(outfile))),
+ 'argv': repr(_pickle.dumps(argv)),
+ 'env': repr(_pickle.dumps(env)),
+ }).encode('utf-8'))
+ fd, _ = None, _os.close(fd)
+ if _sys.platform == 'win32':
+ argv = []
+ for arg in [_sys.executable, name]:
+ if ' ' in arg or arg.startswith('"'):
+ arg = '"%s"' % arg.replace('"', '\\"')
+ argv.append(arg)
+ argv = ' '.join(argv)
+ close_fds = False
+ shell = True
+ else:
+ argv = [_sys.executable, name]
+ close_fds = True
+ shell = False
+
+ p = _subprocess.Popen(
+ argv, env=env, shell=shell, close_fds=close_fds
+ )
+ return p.wait()
+ finally:
+ try:
+ if fd is not None:
+ _os.close(fd)
+ finally:
+ _os.unlink(name)
+
+
+def spawn(*argv, **kwargs):
+ """ Spawn a process """
+ if _sys.platform == 'win32':
+ newargv = []
+ for arg in argv:
+ if not arg or ' ' in arg or arg.startswith('"'):
+ arg = '"%s"' % arg.replace('"', '\\"')
+ newargv.append(arg)
+ argv = newargv
+ close_fds = False
+ shell = True
+ else:
+ close_fds = True
+ shell = False
+
+ env = kwargs.get('env')
+ if env is None:
+ env = dict(_os.environ)
+ if 'X_JYTHON_WA_PATH' in env:
+ env['PATH'] = env['X_JYTHON_WA_PATH']
+
+ echo = kwargs.get('echo')
+ if echo:
+ print(' '.join(argv))
+ filepipe = kwargs.get('filepipe')
+ if filepipe:
+ return _filepipespawn(
+ kwargs.get('stdin'), kwargs.get('stdout'), argv, env
+ )
+ pipe = kwargs.get('stdout')
+ if pipe:
+ return _pipespawn(argv, env)
+
+ p = _subprocess.Popen(argv, env=env, shell=shell, close_fds=close_fds)
+ return p.wait()
+
+
+walk = _os.walk
+
+
+def files(base, wildcard='[!.]*', recursive=1, prune=('.git', '.svn', 'CVS')):
+ """ Determine a filelist """
+ for dirpath, dirnames, filenames in walk(native(base)):
+ for item in prune:
+ if item in dirnames:
+ dirnames.remove(item)
+
+ filenames.sort()
+ for name in _fnmatch.filter(filenames, wildcard):
+ dest = _os.path.join(dirpath, name)
+ if dest.startswith(cwd):
+ dest = dest.replace(cwd, '', 1)
+ aslist = []
+ head, tail = _os.path.split(dest)
+ while tail:
+ aslist.append(tail)
+ head, tail = _os.path.split(head)
+ aslist.reverse()
+ dest = '/'.join(aslist)
+ yield dest
+
+ if not recursive:
+ break
+ dirnames.sort()
+
+
+def dirs(base, wildcard='[!.]*', recursive=1, prune=('.git', '.svn', 'CVS')):
+ """ Determine a filelist """
+ for dirpath, dirnames, filenames in walk(native(base)):
+ for item in prune:
+ if item in dirnames:
+ dirnames.remove(item)
+
+ dirnames.sort()
+ for name in _fnmatch.filter(dirnames, wildcard):
+ dest = _os.path.join(dirpath, name)
+ if dest.startswith(cwd):
+ dest = dest.replace(cwd, '', 1)
+ aslist = []
+ head, tail = _os.path.split(dest)
+ while tail:
+ aslist.append(tail)
+ head, tail = _os.path.split(head)
+ aslist.reverse()
+ dest = '/'.join(aslist)
+ yield dest
+
+ if not recursive:
+ break
+
+
+def frompath(executable):
+ """ Find executable in PATH """
+ # Based on distutils.spawn.find_executable.
+ path = _os.environ.get('PATH', '')
+ paths = [
+ _os.path.expanduser(item)
+ for item in path.split(_os.pathsep)
+ ]
+ ext = _os.path.splitext(executable)[1]
+ exts = ['']
+ if _sys.platform == 'win32' or _os.name == 'os2':
+ eext = ['.exe', '.bat', '.py']
+ if ext not in eext:
+ exts.extend(eext)
+
+ for ext in exts:
+ if not _os.path.isfile(executable + ext):
+ for path in paths:
+ fname = _os.path.join(path, executable + ext)
+ if _os.path.isfile(fname):
+ # the file exists, we have a shot at spawn working
+ return fname
+ else:
+ return executable + ext
+
+ return None
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/term/__init__.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/term/__init__.py
new file mode 100644
index 00000000000..5459454514b
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/term/__init__.py
@@ -0,0 +1,28 @@
+# -*- coding: ascii -*-
+#
+# Copyright 2010, 2011
+# Andr\xe9 Malo or his licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+=====================
+ Package _setup.term
+=====================
+
+Terminal tools, not distributed.
+"""
+__author__ = "Andr\xe9 Malo"
+__docformat__ = "restructuredtext en"
+
+# pylint: disable = W0611
+from _setup.term._term import terminfo, write, green, red, yellow, announce
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/term/_term.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/term/_term.py
new file mode 100644
index 00000000000..b94f58e27f1
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/term/_term.py
@@ -0,0 +1,116 @@
+# -*- coding: ascii -*-
+#
+# Copyright 2007, 2008, 2009, 2010, 2011
+# Andr\xe9 Malo or his licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+=================
+ Terminal writer
+=================
+"""
+__author__ = "Andr\xe9 Malo"
+__docformat__ = "restructuredtext en"
+
+import sys as _sys
+
+
+class _INFO(dict):
+ """ Terminal info dict """
+
+ def __init__(self):
+ """ Initialization """
+ dict.__init__(self, {
+ 'NORMAL': '',
+ 'BOLD': '',
+ 'ERASE': '\n',
+ 'RED': '',
+ 'YELLOW': '',
+ 'GREEN': '',
+ })
+ try:
+ import curses as _curses
+ except ImportError:
+ # fixup if a submodule of curses failed.
+ if 'curses' in _sys.modules:
+ del _sys.modules['curses']
+ else:
+ try:
+ _curses.setupterm()
+ except (TypeError, _curses.error):
+ pass
+ else:
+ def make_color(color):
+ """ Make color control string """
+ seq = _curses.tigetstr('setaf').decode('ascii')
+ if seq is not None:
+ # XXX may fail - need better logic
+ seq = seq.replace("%p1", "") % color
+ return seq
+
+ self['NORMAL'] = _curses.tigetstr('sgr0').decode('ascii')
+ self['BOLD'] = _curses.tigetstr('bold').decode('ascii')
+
+ erase = _curses.tigetstr('el1').decode('ascii')
+ if erase is not None:
+ self['ERASE'] = erase + \
+ _curses.tigetstr('cr').decode('ascii')
+
+ self['RED'] = make_color(_curses.COLOR_RED)
+ self['YELLOW'] = make_color(_curses.COLOR_YELLOW)
+ self['GREEN'] = make_color(_curses.COLOR_GREEN)
+
+ def __getitem__(self, key):
+ """ Deliver always """
+ dict.get(self, key) or ""
+
+
+def terminfo():
+ """ Get info singleton """
+ # pylint: disable = E1101, W0612
+ if terminfo.info is None:
+ terminfo.info = _INFO()
+ return terminfo.info
+terminfo.info = None
+
+
+def write(fmt, **kwargs):
+ """ Write stuff on the terminal """
+ parm = dict(terminfo())
+ parm.update(kwargs)
+ _sys.stdout.write(fmt % parm)
+ _sys.stdout.flush()
+
+
+def green(bmt, **kwargs):
+ """ Write something in green on screen """
+ announce("%%(GREEN)s%s%%(NORMAL)s" % bmt, **kwargs)
+
+
+def red(bmt, **kwargs):
+ """ Write something in red on the screen """
+ announce("%%(BOLD)s%%(RED)s%s%%(NORMAL)s" % bmt, **kwargs)
+
+
+def yellow(fmt, **kwargs):
+ """ Write something in yellow on the screen """
+ announce("%%(BOLD)s%%(YELLOW)s%s%%(NORMAL)s" % fmt, **kwargs)
+
+
+def announce(fmt, **kwargs):
+ """ Announce something """
+ write(fmt, **kwargs)
+ _sys.stdout.write("\n")
+ _sys.stdout.flush()
+
+
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/util.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/util.py
new file mode 100644
index 00000000000..a07daa812fe
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/util.py
@@ -0,0 +1,63 @@
+# -*- coding: ascii -*-
+#
+# Copyright 2007, 2008, 2009, 2010, 2011
+# Andr\xe9 Malo or his licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+=================
+ Setup utilities
+=================
+
+Setup utilities.
+"""
+__author__ = "Andr\xe9 Malo"
+__docformat__ = "restructuredtext en"
+
+from distutils import util as _util
+try:
+ from configparser import SafeConfigParser
+except ImportError:
+ import configparser as _config_parser
+ class SafeConfigParser(_config_parser.ConfigParser):
+ """ Safe config parser """
+ def _interpolate(self, section, option, rawval, vars):
+ return rawval
+
+ def items(self, section):
+ return [(key, self.get(section, key))
+ for key in self.options(section)
+ ]
+
+
+def humanbool(name, value):
+ """
+ Determine human boolean value
+
+ :Parameters:
+ `name` : ``str``
+ The config key (used for error message)
+
+ `value` : ``str``
+ The config value
+
+ :Return: The boolean value
+ :Rtype: ``bool``
+
+ :Exceptions:
+ - `ValueError` : The value could not be recognized
+ """
+ try:
+ return _util.strtobool(str(value).strip().lower() or 'no')
+ except ValueError:
+ raise ValueError("Unrecognized config value: %s = %s" % (name, value))
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/LICENSE.cssmin b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/LICENSE.cssmin
new file mode 100644
index 00000000000..c10ccb05c7a
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/LICENSE.cssmin
@@ -0,0 +1,64 @@
+`cssmin.py` - A Python port of the YUI CSS compressor.
+
+Copyright (c) 2010 Zachary Voase
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+-------------------------------------------------------------------------------
+
+This software contains portions of the YUI CSS Compressor, notably some regular
+expressions for reducing the size of CSS. The YUI Compressor source code can be
+found at <http://github.com/yui/yuicompressor>, and is licensed as follows:
+
+> YUI Compressor Copyright License Agreement (BSD License)
+>
+> Copyright (c) 2009, Yahoo! Inc.
+> All rights reserved.
+>
+> Redistribution and use of this software in source and binary forms,
+> with or without modification, are permitted provided that the following
+> conditions are met:
+>
+> * Redistributions of source code must retain the above
+> copyright notice, this list of conditions and the
+> following disclaimer.
+>
+> * Redistributions in binary form must reproduce the above
+> copyright notice, this list of conditions and the
+> following disclaimer in the documentation and/or other
+> materials provided with the distribution.
+>
+> * Neither the name of Yahoo! Inc. nor the names of its
+> contributors may be used to endorse or promote products
+> derived from this software without specific prior
+> written permission of Yahoo! Inc.
+>
+> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+> AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+> IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+> DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+> FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+> DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+> SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+> CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+> OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+> OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/__init__.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/__init__.py
new file mode 100644
index 00000000000..705dd0ccd1b
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/__init__.py
@@ -0,0 +1,30 @@
+# -*- coding: ascii -*-
+r"""
+=================================
+ Benchmark cssmin implementations
+=================================
+
+Benchmark cssmin implementations.
+
+:Copyright:
+
+ Copyright 2011 - 2014
+ Andr\xe9 Malo or his licensors, as applicable
+
+:License:
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+"""
+if __doc__:
+ __doc__ = __doc__.encode('ascii').decode('unicode_escape')
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/cssmin.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/cssmin.py
new file mode 100644
index 00000000000..cbfbf8d4966
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/cssmin.py
@@ -0,0 +1,246 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""`cssmin` - A Python port of the YUI CSS compressor.
+
+:Copyright:
+
+ Copyright 2011 - 2014
+ Andr\xe9 Malo or his licensors, as applicable
+
+:License:
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+"""
+
+try:
+ from StringIO import StringIO # The pure-Python StringIO supports unicode.
+except ImportError:
+ from io import StringIO
+import re
+
+
+__version__ = '0.2.0'
+
+
+def remove_comments(css):
+ """Remove all CSS comment blocks."""
+
+ iemac = False
+ preserve = False
+ comment_start = css.find("/*")
+ while comment_start >= 0:
+ # Preserve comments that look like `/*!...*/`.
+ # Slicing is used to make sure we don"t get an IndexError.
+ preserve = css[comment_start + 2:comment_start + 3] == "!"
+
+ comment_end = css.find("*/", comment_start + 2)
+ if comment_end < 0:
+ if not preserve:
+ css = css[:comment_start]
+ break
+ elif comment_end >= (comment_start + 2):
+ if css[comment_end - 1] == "\\":
+ # This is an IE Mac-specific comment; leave this one and the
+ # following one alone.
+ comment_start = comment_end + 2
+ iemac = True
+ elif iemac:
+ comment_start = comment_end + 2
+ iemac = False
+ elif not preserve:
+ css = css[:comment_start] + css[comment_end + 2:]
+ else:
+ comment_start = comment_end + 2
+ comment_start = css.find("/*", comment_start)
+
+ return css
+
+
+def remove_unnecessary_whitespace(css):
+ """Remove unnecessary whitespace characters."""
+
+ def pseudoclasscolon(css):
+
+ """
+ Prevents 'p :link' from becoming 'p:link'.
+
+ Translates 'p :link' into 'p ___PSEUDOCLASSCOLON___link'; this is
+ translated back again later.
+ """
+
+ regex = re.compile(r"(^|\})(([^\{\:])+\:)+([^\{]*\{)")
+ match = regex.search(css)
+ while match:
+ css = ''.join([
+ css[:match.start()],
+ match.group().replace(":", "___PSEUDOCLASSCOLON___"),
+ css[match.end():]])
+ match = regex.search(css)
+ return css
+
+ css = pseudoclasscolon(css)
+ # Remove spaces from before things.
+ css = re.sub(r"\s+([!{};:>+\(\)\],])", r"\1", css)
+
+ # If there is a `@charset`, then only allow one, and move to the beginning.
+ css = re.sub(r"^(.*)(@charset \"[^\"]*\";)", r"\2\1", css)
+ css = re.sub(r"^(\s*@charset [^;]+;\s*)+", r"\1", css)
+
+ # Put the space back in for a few cases, such as `@media screen` and
+ # `(-webkit-min-device-pixel-ratio:0)`.
+ css = re.sub(r"\band\(", "and (", css)
+
+ # Put the colons back.
+ css = css.replace('___PSEUDOCLASSCOLON___', ':')
+
+ # Remove spaces from after things.
+ css = re.sub(r"([!{}:;>+\(\[,])\s+", r"\1", css)
+
+ return css
+
+
+def remove_unnecessary_semicolons(css):
+ """Remove unnecessary semicolons."""
+
+ return re.sub(r";+\}", "}", css)
+
+
+def remove_empty_rules(css):
+ """Remove empty rules."""
+
+ return re.sub(r"[^\}\{]+\{\}", "", css)
+
+
+def normalize_rgb_colors_to_hex(css):
+ """Convert `rgb(51,102,153)` to `#336699`."""
+
+ regex = re.compile(r"rgb\s*\(\s*([0-9,\s]+)\s*\)")
+ match = regex.search(css)
+ while match:
+ colors = map(lambda s: s.strip(), match.group(1).split(","))
+ hexcolor = '#%.2x%.2x%.2x' % tuple(map(int, colors))
+ css = css.replace(match.group(), hexcolor)
+ match = regex.search(css)
+ return css
+
+
+def condense_zero_units(css):
+ """Replace `0(px, em, %, etc)` with `0`."""
+
+ return re.sub(r"([\s:])(0)(px|em|%|in|cm|mm|pc|pt|ex)", r"\1\2", css)
+
+
+def condense_multidimensional_zeros(css):
+ """Replace `:0 0 0 0;`, `:0 0 0;` etc. with `:0;`."""
+
+ css = css.replace(":0 0 0 0;", ":0;")
+ css = css.replace(":0 0 0;", ":0;")
+ css = css.replace(":0 0;", ":0;")
+
+ # Revert `background-position:0;` to the valid `background-position:0 0;`.
+ css = css.replace("background-position:0;", "background-position:0 0;")
+
+ return css
+
+
+def condense_floating_points(css):
+ """Replace `0.6` with `.6` where possible."""
+
+ return re.sub(r"(:|\s)0+\.(\d+)", r"\1.\2", css)
+
+
+def condense_hex_colors(css):
+ """Shorten colors from #AABBCC to #ABC where possible."""
+
+ regex = re.compile(r"([^\"'=\s])(\s*)#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])")
+ match = regex.search(css)
+ while match:
+ first = match.group(3) + match.group(5) + match.group(7)
+ second = match.group(4) + match.group(6) + match.group(8)
+ if first.lower() == second.lower():
+ css = css.replace(match.group(), match.group(1) + match.group(2) + '#' + first)
+ match = regex.search(css, match.end() - 3)
+ else:
+ match = regex.search(css, match.end())
+ return css
+
+
+def condense_whitespace(css):
+ """Condense multiple adjacent whitespace characters into one."""
+
+ return re.sub(r"\s+", " ", css)
+
+
+def condense_semicolons(css):
+ """Condense multiple adjacent semicolon characters into one."""
+
+ return re.sub(r";;+", ";", css)
+
+
+def wrap_css_lines(css, line_length):
+ """Wrap the lines of the given CSS to an approximate length."""
+
+ lines = []
+ line_start = 0
+ for i, char in enumerate(css):
+ # It's safe to break after `}` characters.
+ if char == '}' and (i - line_start >= line_length):
+ lines.append(css[line_start:i + 1])
+ line_start = i + 1
+
+ if line_start < len(css):
+ lines.append(css[line_start:])
+ return '\n'.join(lines)
+
+
+def cssmin(css, wrap=None):
+ css = remove_comments(css)
+ css = condense_whitespace(css)
+ # A pseudo class for the Box Model Hack
+ # (see http://tantek.com/CSS/Examples/boxmodelhack.html)
+ css = css.replace('"\\"}\\""', "___PSEUDOCLASSBMH___")
+ css = remove_unnecessary_whitespace(css)
+ css = remove_unnecessary_semicolons(css)
+ css = condense_zero_units(css)
+ css = condense_multidimensional_zeros(css)
+ css = condense_floating_points(css)
+ css = normalize_rgb_colors_to_hex(css)
+ css = condense_hex_colors(css)
+ if wrap is not None:
+ css = wrap_css_lines(css, wrap)
+ css = css.replace("___PSEUDOCLASSBMH___", '"\\"}\\""')
+ css = condense_semicolons(css)
+ return css.strip()
+
+
+def main():
+ import optparse
+ import sys
+
+ p = optparse.OptionParser(
+ prog="cssmin", version=__version__,
+ usage="%prog [--wrap N]",
+ description="""Reads raw CSS from stdin, and writes compressed CSS to stdout.""")
+
+ p.add_option(
+ '-w', '--wrap', type='int', default=None, metavar='N',
+ help="Wrap output to approximately N chars per line.")
+
+ options, args = p.parse_args()
+ sys.stdout.write(cssmin(sys.stdin.read(), wrap=options.wrap))
+
+
+if __name__ == '__main__':
+ main()
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/main.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/main.py
new file mode 100644
index 00000000000..078150629f2
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/main.py
@@ -0,0 +1,236 @@
+#!/usr/bin/env python
+# -*- coding: ascii -*-
+r"""
+==================================
+ Benchmark cssmin implementations
+==================================
+
+Benchmark cssmin implementations.
+
+:Copyright:
+
+ Copyright 2011 - 2014
+ Andr\xe9 Malo or his licensors, as applicable
+
+:License:
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+Usage::
+
+ python -mbench.main [-c COUNT] [-p file] cssfile ...
+
+ -c COUNT number of runs per cssfile and minifier. Defaults to 10.
+ -p file File to write the benchmark results in (pickled)
+
+"""
+if __doc__:
+ __doc__ = __doc__.encode('ascii').decode('unicode_escape')
+__author__ = r"Andr\xe9 Malo".encode('ascii').decode('unicode_escape')
+__docformat__ = "restructuredtext en"
+__license__ = "Apache License, Version 2.0"
+__version__ = "1.0.0"
+
+import sys as _sys
+import time as _time
+
+import_notes = []
+class _p_02__rcssmin(object):
+ def __init__(self):
+ import rcssmin
+ cssmin = rcssmin._make_cssmin(python_only=True)
+ self.cssmin = lambda x: cssmin(x, keep_bang_comments=True)
+
+class _p_03__rcssmin(object):
+ def __init__(self):
+ import _rcssmin
+ cssmin = _rcssmin.cssmin
+ self.cssmin = lambda x: cssmin(x, keep_bang_comments=True)
+
+class cssmins(object):
+ from bench import cssmin as p_01_cssmin
+ p_02_rcssmin = _p_02__rcssmin()
+ try:
+ p_03__rcssmin = _p_03__rcssmin()
+ except ImportError:
+ import_notes.append("_rcssmin (C-Port) not available")
+ print(import_notes[-1])
+
+print("Python Release: %s" % ".".join(map(str, _sys.version_info[:3])))
+print("")
+
+
+def slurp(filename):
+ """ Load a file """
+ fp = open(filename)
+ try:
+ return fp.read()
+ finally:
+ fp.close()
+
+
+def print_(*value, **kwargs):
+ """ Print stuff """
+ (kwargs.get('file') or _sys.stdout).write(
+ ''.join(value) + kwargs.get('end', '\n')
+ )
+
+
+def bench(filenames, count):
+ """
+ Benchmark the minifiers with given css samples
+
+ :Parameters:
+ `filenames` : sequence
+ List of filenames
+
+ `count` : ``int``
+ Number of runs per css file and minifier
+
+ :Exceptions:
+ - `RuntimeError` : empty filenames sequence
+ """
+ if not filenames:
+ raise RuntimeError("Missing files to benchmark")
+ try:
+ xrange
+ except NameError:
+ xrange = range
+ try:
+ cmp
+ except NameError:
+ cmp = lambda a, b: (a > b) - (a < b)
+
+ ports = [item for item in dir(cssmins) if item.startswith('p_')]
+ ports.sort()
+ space = max(map(len, ports)) - 4
+ ports = [(item[5:], getattr(cssmins, item).cssmin) for item in ports]
+ flush = _sys.stdout.flush
+
+ struct = []
+ inputs = [(filename, slurp(filename)) for filename in filenames]
+ for filename, style in inputs:
+ print_("Benchmarking %r..." % filename, end=" ")
+ flush()
+ outputs = []
+ for _, cssmin in ports:
+ try:
+ outputs.append(cssmin(style))
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except:
+ outputs.append(None)
+ struct.append(dict(
+ filename=filename,
+ sizes=[
+ (item is not None and len(item) or None) for item in outputs
+ ],
+ size=len(style),
+ messages=[],
+ times=[],
+ ))
+ print_("(%.1f KiB)" % (struct[-1]['size'] / 1024.0,))
+ flush()
+ times = []
+ for idx, (name, cssmin) in enumerate(ports):
+ if outputs[idx] is None:
+ print_(" FAILED %s" % (name,))
+ struct[-1]['times'].append((name, None))
+ else:
+ print_(" Timing %s%s... (%5.1f KiB %s)" % (
+ name,
+ " " * (space - len(name)),
+ len(outputs[idx]) / 1024.0,
+ idx == 0 and '*' or ['=', '>', '<'][
+ cmp(len(outputs[idx]), len(outputs[0]))
+ ],
+ ), end=" ")
+ flush()
+
+ xcount = count
+ while True:
+ counted = [None for _ in xrange(xcount)]
+ start = _time.time()
+ for _ in counted:
+ cssmin(style)
+ end = _time.time()
+ result = (end - start) * 1000
+ if result < 10: # avoid measuring within the error range
+ xcount *= 10
+ continue
+ times.append(result / xcount)
+ break
+
+ print_("%8.2f ms" % times[-1], end=" ")
+ flush()
+ if len(times) <= 1:
+ print_()
+ else:
+ print_("(factor: %s)" % (', '.join([
+ '%.2f' % (timed / times[-1]) for timed in times[:-1]
+ ])))
+ struct[-1]['times'].append((name, times[-1]))
+
+ flush()
+ print_()
+
+ return struct
+
+
+def main(argv=None):
+ """ Main """
+ import getopt as _getopt
+ import os as _os
+ import pickle as _pickle
+
+ if argv is None:
+ argv = _sys.argv[1:]
+ try:
+ opts, args = _getopt.getopt(argv, "hc:p:", ["help"])
+ except getopt.GetoptError:
+ e = _sys.exc_info()[0](_sys.exc_info()[1])
+ print >> _sys.stderr, "%s\nTry %s -mbench.main --help" % (
+ e,
+ _os.path.basename(_sys.executable),
+ )
+ _sys.exit(2)
+
+ count, pickle = 10, None
+ for key, value in opts:
+ if key in ("-h", "--help"):
+ print >> _sys.stderr, (
+ "%s -mbench.main [-c count] [-p file] cssfile ..." % (
+ _os.path.basename(_sys.executable),
+ )
+ )
+ _sys.exit(0)
+ elif key == '-c':
+ count = int(value)
+ elif key == '-p':
+ pickle = str(value)
+
+ struct = bench(args, count)
+ if pickle:
+ fp = open(pickle, 'wb')
+ try:
+ fp.write(_pickle.dumps((
+ ".".join(map(str, _sys.version_info[:3])),
+ import_notes,
+ struct,
+ ), 0))
+ finally:
+ fp.close()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/wikipedia.css b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/wikipedia.css
new file mode 100644
index 00000000000..03079e35a6f
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/wikipedia.css
@@ -0,0 +1,3861 @@
+/*
+ * This CSS is taken from wikipedia / mediawiki, it's the combined files of
+ * the vector skin described at:
+ *
+ * http://en.wikipedia.org/wiki/Wikipedia:Catalogue_of_CSS_classes
+ */
+
+/*
+ * Any rules which should not be flipped automatically in right-to-left situations should be
+ * prepended with @noflip in a comment block. Images that should be embedded as base64 data-URLs
+ * should be prepended with @embed in a comment block.
+ *
+ * This style-sheet employs a few CSS trick to accomplish compatibility with a wide range of web
+ * browsers. The most common trick is to use some styles in IE6 only. This is accomplished by using
+ * a rule that makes things work in IE6, and then following it with a rule that begins with
+ * "html > body" or use a child selector ">", which is ignored by IE6 because it does not support
+ * the child selector. You can spot this by looking for the "OVERRIDDEN BY COMPLIANT BROWSERS" and
+ * "IGNORED BY IE6" comments.
+ */
+
+/* Framework */
+html,
+body {
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ font-family: sans-serif;
+ font-size: 1em;
+}
+body {
+ background-color: #f3f3f3;
+ /* @embed */
+ background-image: url(images/page-base.png);
+}
+/* Content */
+div#content {
+ margin-left: 10em;
+ padding: 1em;
+ /* @embed */
+ background-image: url(images/border.png);
+ background-position: top left;
+ background-repeat: repeat-y;
+ background-color: white;
+ color: black;
+ direction: ltr;
+}
+/* Head */
+#mw-page-base {
+ height: 5em;
+ background-color: white;
+ /* @embed */
+ background-image: url(images/page-fade.png);
+ background-position: bottom left;
+ background-repeat: repeat-x;
+}
+#mw-head-base {
+ margin-top: -5em;
+ margin-left: 10em;
+ height: 5em;
+ /* @embed */
+ background-image: url(images/border.png);
+ background-position: bottom left;
+ background-repeat: repeat-x;
+}
+div#mw-head {
+ position: absolute;
+ top: 0;
+ right: 0;
+ width: 100%;
+}
+div#mw-head h5 {
+ margin: 0;
+ padding: 0;
+}
+/* Hide empty portlets */
+div.emptyPortlet {
+ display: none;
+}
+/* Personal */
+#p-personal {
+ position: absolute;
+ top: 0;
+ right: 0.75em;
+}
+#p-personal h5 {
+ display: none;
+}
+#p-personal ul {
+ list-style: none;
+ margin: 0;
+ padding-left: 10em; /* Keep from overlapping logo */
+}
+/* @noflip */
+#p-personal li {
+ line-height: 1.125em;
+ float: left;
+}
+/* This one flips! */
+#p-personal li {
+ margin-left: 0.75em;
+ margin-top: 0.5em;
+ font-size: 0.75em;
+ white-space: nowrap;
+}
+/* Navigation Containers */
+#left-navigation {
+ position: absolute;
+ left: 10em;
+ top: 2.5em;
+}
+#right-navigation {
+ float: right;
+ margin-top: 2.5em;
+}
+/* Navigation Labels */
+div.vectorTabs h5,
+div.vectorMenu h5 span {
+ display: none;
+}
+/* Namespaces and Views */
+/* @noflip */
+div.vectorTabs {
+ float: left;
+ height: 2.5em;
+}
+div.vectorTabs {
+ /* @embed */
+ background-image: url(images/tab-break.png);
+ background-position: bottom left;
+ background-repeat: no-repeat;
+ padding-left: 1px;
+}
+/* @noflip */
+div.vectorTabs ul {
+ float: left;
+}
+div.vectorTabs ul {
+ height: 100%;
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+/* @noflip */
+div.vectorTabs ul li {
+ float: left;
+}
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div.vectorTabs ul li {
+ line-height: 1.125em;
+ display: inline-block;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ background-color: #f3f3f3;
+ /* @embed */
+ background-image: url(images/tab-normal-fade.png);
+ background-position: bottom left;
+ background-repeat: repeat-x;
+ white-space:nowrap;
+}
+/* IGNORED BY IE6 */
+div.vectorTabs ul > li {
+ display: block;
+}
+div.vectorTabs li.selected {
+ /* @embed */
+ background-image: url(images/tab-current-fade.png);
+}
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div.vectorTabs li a {
+ display: inline-block;
+ height: 1.9em;
+ padding-left: 0.5em;
+ padding-right: 0.5em;
+ color: #0645ad;
+ cursor: pointer;
+ font-size: 0.8em;
+}
+/* IGNORED BY IE6 */
+div.vectorTabs li > a {
+ display: block;
+}
+div.vectorTabs li.icon a {
+ background-position: bottom right;
+ background-repeat: no-repeat;
+}
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div.vectorTabs span a {
+ display: inline-block;
+ padding-top: 1.25em;
+}
+/* IGNORED BY IE6 */
+/* @noflip */
+div.vectorTabs span > a {
+ float: left;
+ display: block;
+}
+div.vectorTabs span {
+ display: inline-block;
+ /* @embed */
+ background-image: url(images/tab-break.png);
+ background-position: bottom right;
+ background-repeat: no-repeat;
+}
+div.vectorTabs li.selected a,
+div.vectorTabs li.selected a:visited{
+ color: #333333;
+ text-decoration: none;
+}
+div.vectorTabs li.new a,
+div.vectorTabs li.new a:visited{
+ color: #a55858;
+}
+/* Variants and Actions */
+/* @noflip */
+div.vectorMenu {
+ direction: ltr;
+ float: left;
+ /* @embed */
+ background-image: url(images/arrow-down-icon.png);
+ background-position: 100% 60%;
+ background-repeat: no-repeat;
+ cursor: pointer;
+}
+div.vectorMenuFocus {
+ /* @embed */
+ background-image: url(images/arrow-down-focus-icon.png);
+ background-position: 100% 60%;
+}
+/* @noflip */
+body.rtl div.vectorMenu {
+ direction: rtl;
+}
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+/* @noflip */
+div#mw-head div.vectorMenu h5 {
+ float: left;
+ /* @embed */
+ background-image: url(images/tab-break.png);
+ background-repeat: no-repeat;
+}
+/* This will be flipped - unlike the one above it */
+div#mw-head div.vectorMenu h5 {
+ background-position: bottom left;
+ margin-left: -1px;
+}
+/* IGNORED BY IE6 */
+div#mw-head div.vectorMenu > h5 {
+ background-image: none;
+}
+div#mw-head div.vectorMenu h4 {
+ display: inline-block;
+ float: left;
+ font-size: 0.8em;
+ padding-left: 0.5em;
+ padding-top: 1.375em;
+ font-weight: normal;
+ border: none;
+}
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+/* @noflip */
+div.vectorMenu h5 a {
+ display: inline-block;
+ width: 24px;
+ height: 2.5em;
+ text-decoration: none;
+ /* @embed */
+ background-image: url(images/tab-break.png);
+ background-repeat: no-repeat;
+}
+/* This will be flipped - unlike the one above it */
+div.vectorMenu h5 a {
+ background-position: bottom right;
+}
+/* IGNORED BY IE6 */
+div.vectorMenu h5 > a {
+ display: block;
+}
+div.vectorMenu div.menu {
+ position: relative;
+ display: none;
+ clear: both;
+ text-align: left;
+}
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+/* @noflip */
+body.rtl div.vectorMenu div.menu {
+ margin-left: 24px;
+}
+/* IGNORED BY IE6 */
+/* @noflip */
+body.rtl div.vectorMenu > div.menu {
+ margin-left: auto;
+}
+/* IGNORED BY IE6 */
+/* Also fixes old versions of FireFox */
+/* @noflip */
+body.rtl div.vectorMenu > div.menu,
+x:-moz-any-link {
+ margin-left: 23px;
+}
+/* Enable forcing showing of the menu for accessibility */
+div.vectorMenu:hover div.menu,
+div.vectorMenu div.menuForceShow {
+ display: block;
+}
+div.vectorMenu ul {
+ position: absolute;
+ background-color: white;
+ border: solid 1px silver;
+ border-top-width: 0;
+ list-style: none;
+ list-style-image: none;
+ list-style-type: none;
+ padding: 0;
+ margin: 0;
+ margin-left: -1px;
+ text-align: left;
+}
+/* Fixes old versions of FireFox */
+div.vectorMenu ul,
+x:-moz-any-link {
+ min-width: 5em;
+}
+/* Returns things back to normal in modern versions of FireFox */
+div.vectorMenu ul,
+x:-moz-any-link,
+x:default {
+ min-width: 0;
+}
+div.vectorMenu li {
+ padding: 0;
+ margin: 0;
+ text-align: left;
+ line-height: 1em;
+}
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div.vectorMenu li a {
+ display: inline-block;
+ padding: 0.5em;
+ white-space: nowrap;
+ color: #0645ad;
+ cursor: pointer;
+ font-size: 0.8em;
+}
+/* IGNORED BY IE6 */
+div.vectorMenu li > a {
+ display: block;
+}
+div.vectorMenu li.selected a,
+div.vectorMenu li.selected a:visited {
+ color: #333333;
+ text-decoration: none;
+}
+/* Search */
+#p-search h5 {
+ display: none;
+}
+/* @noflip */
+#p-search {
+ float: left;
+}
+#p-search {
+ margin-right: 0.5em;
+ margin-left: 0.5em;
+}
+#p-search form,
+#p-search input {
+ margin: 0;
+ margin-top: 0.4em;
+}
+div#simpleSearch {
+ display: block;
+ width: 14em;
+ height: 1.4em;
+ margin-top: 0.65em;
+ position: relative;
+ min-height: 1px; /* Gotta trigger hasLayout for IE7 */
+ border: solid 1px #AAAAAA;
+ color: black;
+ background-color: white;
+ /* @embed */
+ background-image: url(images/search-fade.png);
+ background-position: top left;
+ background-repeat: repeat-x;
+}
+div#simpleSearch label {
+ /*
+ * DON'T PANIC! Browsers that won't scale this properly are the same browsers that have JS issues that prevent
+ * this from ever being shown anyways.
+ */
+ font-size: 13px;
+ top: 0.25em;
+ direction: ltr;
+}
+div#simpleSearch input {
+ color: black;
+ direction: ltr;
+}
+div#simpleSearch input:focus {
+ outline: none;
+}
+div#simpleSearch input.placeholder {
+ color: #999999;
+}
+div#simpleSearch input::-webkit-input-placeholder {
+ color: #999999;
+}
+div#simpleSearch input#searchInput {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 90%;
+ margin: 0;
+ padding: 0;
+ padding-left: 0.2em;
+ padding-top: 0.2em;
+ padding-bottom: 0.2em;
+ outline: none;
+ border: none;
+ /*
+ * DON'T PANIC! Browsers that won't scale this properly are the same browsers that have JS issues that prevent
+ * this from ever being shown anyways.
+ */
+ font-size: 13px;
+ background-color: transparent;
+ direction: ltr;
+}
+div#simpleSearch button#searchButton {
+ position: absolute;
+ width: 10%;
+ right: 0;
+ top: 0;
+ padding: 0;
+ padding-top: 0.3em;
+ padding-bottom: 0.2em;
+ padding-right: 0.4em;
+ margin: 0;
+ border: none;
+ cursor: pointer;
+ background-color: transparent;
+ background-image: none;
+}
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div#simpleSearch button#searchButton img {
+ border: none;
+ margin: 0;
+ margin-top: -3px;
+ padding: 0;
+}
+/* IGNORED BY IE6 */
+div#simpleSearch button#searchButton > img {
+ margin: 0;
+}
+/* Panel */
+div#mw-panel {
+ position: absolute;
+ top: 160px;
+ padding-top: 1em;
+ width: 10em;
+ left: 0;
+}
+div#mw-panel div.portal {
+ padding-bottom: 1.5em;
+ direction: ltr;
+}
+div#mw-panel div.portal h5 {
+ font-weight: normal;
+ color: #444444;
+ padding: 0.25em;
+ padding-top: 0;
+ padding-left: 1.75em;
+ cursor: default;
+ border: none;
+ font-size: 0.75em;
+}
+div#mw-panel div.portal div.body {
+ margin: 0;
+ padding-top: 0.5em;
+ margin-left: 1.25em;
+ /* @embed */
+ background-image: url(images/portal-break.png);
+ background-repeat: no-repeat;
+ background-position: top left;
+}
+div#mw-panel div.portal div.body ul {
+ list-style: none;
+ list-style-image: none;
+ list-style-type: none;
+ padding: 0;
+ margin: 0;
+}
+div#mw-panel div.portal div.body ul li {
+ line-height: 1.125em;
+ padding: 0;
+ padding-bottom: 0.5em;
+ margin: 0;
+ overflow: hidden;
+ font-size: 0.75em;
+}
+div#mw-panel div.portal div.body ul li a {
+ color: #0645ad;
+}
+div#mw-panel div.portal div.body ul li a:visited {
+ color: #0b0080;
+}
+/* Footer */
+div#footer {
+ margin-left: 10em;
+ margin-top: 0;
+ padding: 0.75em;
+ /* @embed */
+ background-image: url(images/border.png);
+ background-position: top left;
+ background-repeat: repeat-x;
+ direction: ltr;
+}
+div#footer ul {
+ list-style: none;
+ list-style-image: none;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+div#footer ul li {
+ margin: 0;
+ padding: 0;
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ color: #333333;
+ font-size: 0.7em;
+}
+div#footer #footer-icons {
+ float: right;
+}
+/* @noflip */
+body.ltr div#footer #footer-places {
+ float: left;
+}
+div#footer #footer-info li {
+ line-height: 1.4em;
+}
+div#footer #footer-icons li {
+ float: left;
+ margin-left: 0.5em;
+ line-height: 2em;
+ text-align: right;
+}
+div#footer #footer-places li {
+ float: left;
+ margin-right: 1em;
+ line-height: 2em;
+}
+/* Logo */
+#p-logo {
+ position: absolute;
+ top: -160px;
+ left: 0;
+ width: 10em;
+ height: 160px;
+}
+#p-logo a {
+ display: block;
+ width: 10em;
+ height: 160px;
+ background-repeat: no-repeat;
+ background-position: center center;
+ text-decoration: none;
+}
+
+/*
+ *
+ * The following code is highly modified from monobook. It would be nice if the
+ * preftoc id was more human readable like preferences-toc for instance,
+ * howerver this would require backporting the other skins.
+ */
+
+/* Preferences */
+#preftoc {
+ /* Tabs */
+ width: 100%;
+ float: left;
+ clear: both;
+ margin: 0 !important;
+ padding: 0 !important;
+ /* @embed */
+ background-image: url(images/preferences-break.png);
+ background-position: bottom left;
+ background-repeat: no-repeat;
+}
+ #preftoc li {
+ /* Tab */
+ float: left;
+ margin: 0;
+ padding: 0;
+ padding-right: 1px;
+ height: 2.25em;
+ white-space: nowrap;
+ list-style-type: none;
+ list-style-image: none;
+ /* @embed */
+ background-image: url(images/preferences-break.png);
+ background-position: bottom right;
+ background-repeat: no-repeat;
+ }
+ /* Sadly, IE6 won't understand this */
+ #preftoc li:first-child {
+ margin-left: 1px;
+ }
+ #preftoc a,
+ #preftoc a:active {
+ display: inline-block;
+ position: relative;
+ color: #0645ad;
+ padding: 0.5em;
+ text-decoration: none;
+ background-image: none;
+ font-size: 0.9em;
+ }
+ #preftoc a:hover,
+ #preftoc a:focus {
+ text-decoration: underline;
+ }
+ #preftoc li.selected a {
+ /* @embed */
+ background-image: url(images/preferences-fade.png);
+ background-position: bottom;
+ background-repeat: repeat-x;
+ color: #333333;
+ text-decoration: none;
+ }
+#preferences {
+ float: left;
+ width: 100%;
+ margin: 0;
+ margin-top: -2px;
+ clear: both;
+ border: solid 1px #cccccc;
+ background-color: #f9f9f9;
+ /* @embed */
+ background-image: url(images/preferences-base.png);
+}
+#preferences fieldset {
+ border: none;
+ border-top: solid 1px #cccccc;
+}
+#preferences fieldset.prefsection {
+ border: none;
+ padding: 0;
+ margin: 1em;
+}
+#preferences legend {
+ color: #666666;
+}
+#preferences fieldset.prefsection legend.mainLegend {
+ display: none;
+}
+#preferences td {
+ padding-left: 0.5em;
+ padding-right: 0.5em;
+}
+#preferences td.htmlform-tip {
+ font-size: x-small;
+ padding: .2em 2em;
+ color: #666666;
+}
+#preferences div.mw-prefs-buttons {
+ padding: 1em;
+}
+#preferences div.mw-prefs-buttons input {
+ margin-right: 0.25em;
+}
+
+/**
+ * The following code is slightly modified from monobook
+ */
+div#content {
+ line-height: 1.5em;
+}
+#bodyContent {
+ font-size: 0.8em;
+}
+
+.editsection {
+ float: right;
+}
+
+ul {
+ /* @embed */
+ list-style-image: url(images/bullet-icon.png);
+}
+
+pre {
+ line-height: 1.3em;
+}
+
+/* Site Notice (includes notices from CentralNotice extension) */
+#siteNotice {
+ font-size: 0.8em;
+}
+#firstHeading {
+ padding-top: 0;
+ margin-top: 0;
+ padding-top: 0;
+ font-size: 1.6em;
+}
+div#content a.external,
+div#content a.external[href ^="gopher://"] {
+ /* @embed */
+ background: url(images/external-link-ltr-icon.png) center right no-repeat;
+ padding-right: 13px;
+}
+div#content a.external[href ^="https://"],
+.link-https {
+ /* @embed */
+ background: url(images/lock-icon.png) center right no-repeat;
+ padding-right: 13px;
+}
+div#content a.external[href ^="mailto:"],
+.link-mailto {
+ /* @embed */
+ background: url(images/mail-icon.png) center right no-repeat;
+ padding-right: 13px;
+}
+div#content a.external[href ^="news:"] {
+ /* @embed */
+ background: url(images/news-icon.png) center right no-repeat;
+ padding-right: 13px;
+}
+div#content a.external[href ^="ftp://"],
+.link-ftp {
+ /* @embed */
+ background: url(images/file-icon.png) center right no-repeat;
+ padding-right: 13px;
+}
+div#content a.external[href ^="irc://"],
+div#content a.external[href ^="ircs://"],
+.link-irc {
+ /* @embed */
+ background: url(images/talk-icon.png) center right no-repeat;
+ padding-right: 13px;
+}
+div#content a.external[href $=".ogg"], div#content a.external[href $=".OGG"],
+div#content a.external[href $=".mid"], div#content a.external[href $=".MID"],
+div#content a.external[href $=".midi"], div#content a.external[href $=".MIDI"],
+div#content a.external[href $=".mp3"], div#content a.external[href $=".MP3"],
+div#content a.external[href $=".wav"], div#content a.external[href $=".WAV"],
+div#content a.external[href $=".wma"], div#content a.external[href $=".WMA"],
+.link-audio {
+ /* @embed */
+ background: url(images/audio-icon.png) center right no-repeat;
+ padding-right: 13px;
+}
+div#content a.external[href $=".ogm"], div#content a.external[href $=".OGM"],
+div#content a.external[href $=".avi"], div#content a.external[href $=".AVI"],
+div#content a.external[href $=".mpeg"], div#content a.external[href $=".MPEG"],
+div#content a.external[href $=".mpg"], div#content a.external[href $=".MPG"],
+.link-video {
+ /* @embed */
+ background: url(images/video-icon.png) center right no-repeat;
+ padding-right: 13px;
+}
+div#content a.external[href $=".pdf"], div#content a.external[href $=".PDF"],
+div#content a.external[href *=".pdf#"], div#content a.external[href *=".PDF#"],
+div#content a.external[href *=".pdf?"], div#content a.external[href *=".PDF?"],
+.link-document {
+ /* @embed */
+ background: url(images/document-icon.png) center right no-repeat;
+ padding-right: 13px;
+}
+
+/* Icon for Usernames */
+#pt-userpage,
+#pt-anonuserpage,
+#pt-login {
+ /* @embed */
+ background: url(images/user-icon.png) left top no-repeat;
+ padding-left: 15px !important;
+ text-transform: none;
+}
+
+.redirectText {
+ font-size: 140%;
+}
+
+.redirectMsg img {
+ vertical-align: text-bottom;
+}
+
+#bodyContent {
+ position: relative;
+ width: 100%;
+}
+#mw-js-message {
+ font-size: 0.8em;
+}
+div#bodyContent {
+ line-height: 1.5em;
+}
+
+/* Watch/Unwatch Icon Styling */
+#ca-unwatch.icon a,
+#ca-watch.icon a {
+ margin: 0;
+ padding: 0;
+ outline: none;
+ display: block;
+ width: 26px;
+ /* This hides the text but shows the background image */
+ padding-top: 3.1em;
+ margin-top: 0;
+ /* Only applied in IE6 */
+ margin-top: -0.8em !ie;
+ height: 0;
+ overflow: hidden;
+ /* @embed */
+ background-image: url(images/watch-icons.png);
+}
+#ca-unwatch.icon a {
+ background-position: -43px 60%;
+}
+#ca-watch.icon a {
+ background-position: 5px 60%;
+}
+#ca-unwatch.icon a:hover,
+#ca-unwatch.icon a:focus {
+ background-position: -67px 60%;
+}
+#ca-watch.icon a:hover,
+#ca-watch.icon a:focus {
+ background-position: -19px 60%;
+}
+#ca-unwatch.icon a.loading,
+#ca-watch.icon a.loading {
+ /* @embed */
+ background-image: url(images/watch-icon-loading.gif);
+ background-position: 5px 60%;
+}
+#ca-unwatch.icon a span,
+#ca-watch.icon a span {
+ display: none;
+}
+div.vectorTabs ul {
+ /* @embed */
+ background-image:url(images/tab-break.png);
+ background-position:right bottom;
+ background-repeat:no-repeat;
+}
+
+/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
+.tipsy {
+ font-size: 0.8em;
+}
+/**
+ * CSS in this file is used by *all* skins (that have any CSS at all). Be
+ * careful what you put in here, since what looks good in one skin may not in
+ * another, but don't ignore the poor pre-Monobook users either.
+ */
+
+/* GENERAL CLASSES FOR DIRECTIONALITY SUPPORT */
+
+/**
+ * These classes should be used for text depending on the content direction.
+ * Content stuff like editsection, ul/ol and TOC depend on this.
+ */
+.mw-content-ltr {
+ /* @noflip */
+ direction: ltr;
+}
+.mw-content-rtl {
+ /* @noflip */
+ direction: rtl;
+}
+
+/* Most input fields should be in site direction */
+.sitedir-ltr textarea,
+.sitedir-ltr input {
+ /* @noflip */
+ direction: ltr;
+}
+.sitedir-rtl textarea,
+.sitedir-rtl input {
+ /* @noflip */
+ direction: rtl;
+}
+
+/* Input types that should follow user direction, like buttons */
+/* TODO: What about buttons in wikipage content ? */
+input[type="submit"],
+input[type="button"],
+input[type="reset"],
+input[type="file"] {
+ direction: ltr;
+}
+
+/* Override default values */
+textarea[dir="ltr"],
+input[dir="ltr"] {
+ /* @noflip */
+ direction: ltr;
+}
+textarea[dir="rtl"],
+input[dir="rtl"] {
+ /* @noflip */
+ direction: rtl;
+}
+
+/* Default style for semantic tags */
+abbr,
+acronym,
+.explain {
+ border-bottom: 1px dotted;
+ cursor: help;
+}
+
+/* Colored watchlist and recent changes numbers */
+.mw-plusminus-pos {
+ color: #006400; /* dark green */
+}
+.mw-plusminus-neg {
+ color: #8b0000; /* dark red */
+}
+.mw-plusminus-null {
+ color: #aaa; /* gray */
+}
+
+/**
+ * Links to redirects appear italicized on [[Special:AllPages]], [[Special:PrefixIndex]],
+ * [[Special:Watchlist/edit]] and in category listings.
+ */
+.allpagesredirect,
+.redirect-in-category,
+.watchlistredir {
+ font-style: italic;
+}
+
+/* Comment and username portions of RC entries */
+span.comment {
+ font-style: italic;
+}
+
+span.changedby {
+ font-size: 95%;
+}
+
+/* Math */
+.texvc {
+ direction: ltr;
+ unicode-bidi: embed;
+}
+img.tex {
+ vertical-align: middle;
+}
+span.texhtml {
+ font-family: serif;
+}
+
+/**
+ * Add a bit of margin space between the preview and the toolbar.
+ * This replaces the ugly <p><br /></p> we used to insert into the page source
+ */
+#wikiPreview.ontop {
+ margin-bottom: 1em;
+}
+
+/* Stop floats from intruding into edit area in previews */
+#editform,
+#toolbar,
+#wpTextbox1 {
+ clear: both;
+}
+#toolbar img {
+ cursor: pointer;
+}
+div#mw-js-message {
+ margin: 1em 5%;
+ padding: 0.5em 2.5%;
+ border: solid 1px #ddd;
+ background-color: #fcfcfc;
+}
+
+/* Edit section links */
+.editsection {
+ float: right;
+ margin-left: 5px;
+}
+/* Correct directionality when page dir is different from site/user dir */
+.mw-content-ltr .editsection,
+.mw-content-rtl .mw-content-ltr .editsection {
+ /* @noflip */
+ float: right;
+}
+.mw-content-rtl .editsection,
+.mw-content-ltr .mw-content-rtl .editsection {
+ /* @noflip */
+ float: left;
+}
+
+/**
+ * File description page
+ */
+
+div.mw-filepage-resolutioninfo {
+ font-size: smaller;
+}
+
+/**
+ * File histories
+ */
+h2#filehistory {
+ clear: both;
+}
+
+table.filehistory th,
+table.filehistory td {
+ vertical-align: top;
+}
+table.filehistory th {
+ text-align: left;
+}
+table.filehistory td.mw-imagepage-filesize,
+table.filehistory th.mw-imagepage-filesize {
+ white-space: nowrap;
+}
+
+table.filehistory td.filehistory-selected {
+ font-weight: bold;
+}
+
+/**
+ * Add a checkered background image on hover for file
+ * description pages. (bug 26470)
+ */
+.filehistory a img,
+#file img:hover {
+ /* @embed */
+ background: white url(images/Checker-16x16.png) repeat;
+}
+
+/**
+ * rev_deleted stuff
+ */
+li span.deleted,
+span.history-deleted {
+ text-decoration: line-through;
+ color: #888;
+ font-style: italic;
+}
+
+/**
+ * Patrol stuff
+ */
+.not-patrolled {
+ background-color: #ffa;
+}
+
+.unpatrolled {
+ font-weight: bold;
+ color: red;
+}
+
+div.patrollink {
+ font-size: 75%;
+ text-align: right;
+}
+
+/**
+ * Forms
+ */
+td.mw-label {
+ text-align: right;
+}
+td.mw-input {
+ text-align: left;
+}
+td.mw-submit {
+ text-align: left;
+}
+
+td.mw-label {
+ vertical-align: top;
+}
+.prefsection td.mw-label {
+ width: 20%;
+}
+.prefsection table {
+ width: 100%;
+}
+td.mw-submit {
+ white-space: nowrap;
+}
+
+table.mw-htmlform-nolabel td.mw-label {
+ width: 1px;
+}
+
+tr.mw-htmlform-vertical-label td.mw-label {
+ text-align: left !important;
+}
+
+.mw-htmlform-invalid-input td.mw-input input {
+ border-color: red;
+}
+
+.mw-htmlform-flatlist div.mw-htmlform-flatlist-item {
+ display: inline;
+ margin-right: 1em;
+ white-space: nowrap;
+}
+
+input#wpSummary {
+ width: 80%;
+}
+
+/**
+ * Image captions
+ */
+.thumbcaption {
+ text-align: left;
+}
+.magnify {
+ float: right;
+}
+
+/**
+ * Categories
+ */
+#catlinks {
+ /**
+ * Overrides text justification (user preference)
+ * See bug 31990
+ */
+ text-align: left;
+}
+.catlinks ul {
+ display: inline;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ list-style-type: none;
+ list-style-image: none;
+ vertical-align: middle !ie;
+}
+
+.catlinks li {
+ display: inline-block;
+ line-height: 1.25em;
+ border-left: 1px solid #AAA;
+ margin: 0.125em 0;
+ padding: 0 0.5em;
+ zoom: 1;
+ display: inline !ie;
+}
+
+.catlinks li:first-child {
+ padding-left: 0.25em;
+ border-left: none;
+}
+/**
+ * Hidden categories
+ */
+.mw-hidden-cats-hidden {
+ display: none;
+}
+.catlinks-allhidden {
+ display: none;
+}
+
+/* Convenience links to edit block, delete and protect reasons */
+p.mw-ipb-conveniencelinks,
+p.mw-protect-editreasons,
+p.mw-filedelete-editreasons,
+p.mw-delete-editreasons,
+p.mw-revdel-editreasons {
+ font-size: 90%;
+ text-align: right;
+}
+
+/**
+ * OpenSearch ajax suggestions
+ */
+.os-suggest {
+ overflow: auto;
+ overflow-x: hidden;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 0;
+ background-color: white;
+ border-style: solid;
+ border-color: #AAAAAA;
+ border-width: 1px;
+ z-index:99;
+ font-size:95%;
+}
+
+table.os-suggest-results {
+ font-size: 95%;
+ cursor: pointer;
+ border: 0;
+ border-collapse: collapse;
+ width: 100%;
+}
+
+.os-suggest-result,
+.os-suggest-result-hl {
+ white-space: nowrap;
+ background-color: white;
+ color: black;
+ padding: 2px;
+}
+.os-suggest-result-hl,
+.os-suggest-result-hl-webkit {
+ background-color: #4C59A6;
+ color: white;
+}
+
+.os-suggest-toggle {
+ position: relative;
+ left: 1ex;
+ font-size: 65%;
+}
+.os-suggest-toggle-def {
+ position: absolute;
+ top: 0;
+ left: 0;
+ font-size: 65%;
+ visibility: hidden;
+}
+
+/* Page history styling */
+
+/* The auto-generated edit comments */
+.autocomment {
+ color: gray;
+}
+#pagehistory .history-user {
+ margin-left: 0.4em;
+ margin-right: 0.2em;
+}
+#pagehistory span.minor {
+ font-weight: bold;
+}
+#pagehistory li {
+ border: 1px solid white;
+}
+#pagehistory li.selected {
+ background-color: #f9f9f9;
+ border: 1px dashed #aaa;
+}
+
+.mw-history-revisiondelete-button, #mw-fileduplicatesearch-icon {
+ float: right;
+}
+
+/** Generic minor/bot/newpage styling (recent changes) */
+.newpage,
+.minoredit,
+.botedit {
+ font-weight: bold;
+}
+
+#shared-image-dup,
+#shared-image-conflict {
+ font-style: italic;
+}
+
+/**
+ * Recreating deleted page warning
+ * Reupload file warning
+ * Page protection warning
+ * incl. log entries for these warnings
+ */
+div.mw-warning-with-logexcerpt {
+ padding: 3px;
+ margin-bottom: 3px;
+ border: 2px solid #2F6FAB;
+ clear: both;
+}
+div.mw-warning-with-logexcerpt ul li {
+ font-size: 90%;
+}
+
+/* (show/hide) revision deletion links */
+span.mw-revdelundel-link,
+strong.mw-revdelundel-link {
+ font-size: 90%;
+}
+span.mw-revdelundel-hidden,
+input.mw-revdelundel-hidden {
+ visibility: hidden;
+}
+
+td.mw-revdel-checkbox,
+th.mw-revdel-checkbox {
+ padding-right: 10px;
+ text-align: center;
+}
+
+/* feed links */
+a.feedlink {
+ /* @embed */
+ background: url(images/feed-icon.png) center left no-repeat;
+ padding-left: 16px;
+}
+
+/* Plainlinks - this can be used to switch
+ * off special external link styling */
+.plainlinks a {
+ background: none !important;
+ padding: 0 !important;
+}
+/* External URLs should always be treated as LTR (bug 4330) */
+/* @noflip */ .rtl a.external.free,
+.rtl a.external.autonumber {
+ direction: ltr;
+ unicode-bidi: embed;
+}
+
+/**
+ * wikitable class for skinning normal tables
+ * keep in sync with commonPrint.css
+ */
+table.wikitable {
+ margin: 1em 1em 1em 0;
+ background-color: #f9f9f9;
+ border: 1px #aaa solid;
+ border-collapse: collapse;
+ color: black;
+}
+table.wikitable > tr > th,
+table.wikitable > tr > td,
+table.wikitable > * > tr > th,
+table.wikitable > * > tr > td {
+ border: 1px #aaa solid;
+ padding: 0.2em;
+}
+table.wikitable > tr > th,
+table.wikitable > * > tr > th {
+ background-color: #f2f2f2;
+ text-align: center;
+}
+table.wikitable > caption {
+ font-weight: bold;
+}
+
+/* hide initially collapsed collapsable tables */
+table.collapsed tr.collapsable {
+ display: none;
+}
+
+/* success and error messages */
+.success {
+ color: green;
+ font-size: larger;
+}
+.warning {
+ color: #FFA500; /* orange */
+ font-size: larger;
+}
+.error {
+ color: red;
+ font-size: larger;
+}
+.errorbox,
+.warningbox,
+.successbox {
+ font-size: larger;
+ border: 2px solid;
+ padding: .5em 1em;
+ float: left;
+ margin-bottom: 2em;
+ color: #000;
+}
+.errorbox {
+ border-color: red;
+ background-color: #fff2f2;
+}
+.warningbox {
+ border-color: #FF8C00; /* darkorange */
+ background-color: #FFFFC0;
+}
+.successbox {
+ border-color: green;
+ background-color: #dfd;
+}
+.errorbox h2,
+.warningbox h2,
+.successbox h2 {
+ font-size: 1em;
+ font-weight: bold;
+ display: inline;
+ margin: 0 .5em 0 0;
+ border: none;
+}
+
+/* general info/warning box for SP */
+.mw-infobox {
+ border: 2px solid #ff7f00;
+ margin: 0.5em;
+ clear: left;
+ overflow: hidden;
+}
+
+.mw-infobox-left {
+ margin: 7px;
+ float: left;
+ width: 35px;
+}
+
+.mw-infobox-right {
+ margin: 0.5em 0.5em 0.5em 49px;
+}
+
+/* Note on preview page */
+.previewnote {
+ color: #c00;
+ margin-bottom: 1em;
+}
+
+.previewnote p {
+ text-indent: 3em;
+ margin: 0.8em 0;
+}
+
+.visualClear {
+ clear: both;
+}
+
+#mw_trackbacks {
+ border: solid 1px #bbbbff;
+ background-color: #eeeeff;
+ padding: 0.2em;
+}
+
+/**
+ * Data table style
+ *
+ * Transparent table with suddle borders
+ * and blue row-highlighting.
+ */
+.mw-datatable {
+ border-collapse: collapse;
+}
+.mw-datatable,
+.mw-datatable td,
+.mw-datatable th {
+ border: 1px solid #aaaaaa;
+ padding: 0 0.15em 0 0.15em;
+}
+.mw-datatable th {
+ background-color: #ddddff;
+}
+.mw-datatable td {
+ background-color: #ffffff;
+}
+.mw-datatable tr:hover td {
+ background-color: #eeeeff;
+}
+
+
+/**
+ * TablePager tables generated by the TablePager PHP class
+ * in MediaWiki (e.g. Special:ListFiles).
+ */
+.TablePager {
+ min-width: 80%;
+}
+.TablePager_nav {
+ margin: 0 auto;
+}
+.TablePager_nav td {
+ padding: 3px;
+ text-align: center;
+}
+.TablePager_nav a {
+ text-decoration: none;
+}
+
+.imagelist td,
+.imagelist th {
+ white-space: nowrap;
+}
+.imagelist .TablePager_col_links {
+ background-color: #eeeeff;
+}
+.imagelist .TablePager_col_img_description {
+ white-space: normal;
+}
+.imagelist th.TablePager_sort {
+ background-color: #ccccff;
+}
+
+/* filetoc */
+ul#filetoc {
+ text-align: center;
+ border: 1px solid #aaaaaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ font-size: 95%;
+ margin-bottom: 0.5em;
+ margin-left: 0;
+ margin-right: 0;
+}
+
+#filetoc li {
+ display: inline;
+ list-style-type: none;
+ padding-right: 2em;
+}
+
+/* Classes for EXIF data display */
+table.mw_metadata {
+ font-size: 0.8em;
+ margin-left: 0.5em;
+ margin-bottom: 0.5em;
+ width: 400px;
+}
+
+table.mw_metadata caption {
+ font-weight: bold;
+}
+
+table.mw_metadata th {
+ font-weight: normal;
+}
+
+table.mw_metadata td {
+ padding: 0.1em;
+}
+
+table.mw_metadata {
+ border: none;
+ border-collapse: collapse;
+}
+
+table.mw_metadata td,
+table.mw_metadata th {
+ text-align: center;
+ border: 1px solid #aaaaaa;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+table.mw_metadata th {
+ background-color: #f9f9f9;
+}
+
+table.mw_metadata td {
+ background-color: #fcfcfc;
+}
+
+table.mw_metadata ul.metadata-langlist {
+ list-style-type: none;
+ list-style-image: none;
+ padding-right: 5px;
+ padding-left: 5px;
+ margin: 0;
+}
+
+/* Correct directionality when page dir is different from site/user dir */
+.mw-content-ltr ul,
+.mw-content-rtl .mw-content-ltr ul {
+ /* @noflip */
+ margin: 0.3em 0 0 1.6em;
+ padding: 0;
+}
+.mw-content-rtl ul,
+.mw-content-ltr .mw-content-rtl ul {
+ /* @noflip */
+ margin: 0.3em 1.6em 0 0;
+ padding: 0;
+}
+.mw-content-ltr ol,
+.mw-content-rtl .mw-content-ltr ol {
+ /* @noflip */
+ margin: 0.3em 0 0 3.2em;
+ padding: 0;
+}
+.mw-content-rtl ol,
+.mw-content-ltr .mw-content-rtl ol {
+ /* @noflip */
+ margin: 0.3em 3.2em 0 0;
+ padding: 0;
+}
+/* @noflip */
+.mw-content-ltr dd,
+.mw-content-rtl .mw-content-ltr dd {
+ margin-left: 1.6em;
+ margin-right: 0;
+}
+/* @noflip */
+.mw-content-rtl dd,
+.mw-content-ltr .mw-content-rtl dd {
+ margin-right: 1.6em;
+ margin-left: 0;
+}
+
+/* Galleries */
+/* These display attributes look nonsensical, but are needed to support IE and FF2 */
+/* Don't forget to update commonPrint.css */
+li.gallerybox {
+ vertical-align: top;
+ border: solid 2px white;
+ display: -moz-inline-box;
+ display: inline-block;
+}
+
+ul.gallery,
+li.gallerybox {
+ zoom: 1;
+ *display: inline;
+}
+
+ul.gallery {
+ margin: 2px;
+ padding: 2px;
+ display: block;
+}
+
+li.gallerycaption {
+ font-weight: bold;
+ text-align: center;
+ display: block;
+ word-wrap: break-word;
+}
+
+li.gallerybox div.thumb {
+ text-align: center;
+ border: 1px solid #ccc;
+ background-color: #f9f9f9;
+ margin: 2px;
+}
+
+li.gallerybox div.thumb img {
+ display: block;
+ margin: 0 auto;
+}
+
+div.gallerytext {
+ overflow: hidden;
+ font-size: 94%;
+ padding: 2px 4px;
+ word-wrap: break-word;
+}
+
+.mw-ajax-loader {
+ /* @embed */
+ background-image: url(images/ajax-loader.gif);
+ background-position: center center;
+ background-repeat: no-repeat;
+ padding: 16px;
+ position: relative;
+ top: -16px;
+}
+
+.mw-small-spinner {
+ padding: 10px !important;
+ margin-right: 0.6em;
+ /* @embed */
+ background-image: url(images/spinner.gif);
+ background-position: center center;
+ background-repeat: no-repeat;
+}
+
+/* Language specific height correction for titles. Ref Bug 29405 and Bug 30809 */
+/* Languages like hi or ml require slightly more vertical space to show diacritics properly */
+h1:lang(as),
+h1:lang(bh), /* Macrolanguage, used on bh.wikipedia.org, should be removed one day */
+h1:lang(bho),
+h1:lang(bn),
+h1:lang(gu),
+h1:lang(hi),
+h1:lang(kn),
+h1:lang(ml),
+h1:lang(mr),
+h1:lang(or),
+h1:lang(pa),
+h1:lang(sa),
+h1:lang(ta),
+h1:lang(te) {
+ line-height: 1.5em !important;
+}
+h2:lang(as), h3:lang(as), h4:lang(as), h5:lang(as), h6:lang(as),
+h2:lang(bho), h3:lang(bho), h4:lang(bho), h5:lang(bho), h6:lang(bho),
+h2:lang(bh), h3:lang(bh), h4:lang(bh), h5:lang(bh), h6:lang(bh),
+h2:lang(bn), h3:lang(bn), h4:lang(bn), h5:lang(bn), h6:lang(bn),
+h2:lang(gu), h3:lang(gu), h4:lang(gu), h5:lang(gu), h6:lang(gu),
+h2:lang(hi), h3:lang(hi), h4:lang(hi), h5:lang(hi), h6:lang(hi),
+h2:lang(kn), h3:lang(kn), h4:lang(kn), h5:lang(kn), h6:lang(kn),
+h2:lang(ml), h3:lang(ml), h4:lang(ml), h5:lang(ml), h6:lang(ml),
+h2:lang(mr), h3:lang(mr), h4:lang(mr), h5:lang(mr), h6:lang(mr),
+h2:lang(or), h3:lang(or), h4:lang(or), h5:lang(or), h6:lang(or),
+h2:lang(pa), h3:lang(pa), h4:lang(pa), h5:lang(pa), h6:lang(pa),
+h2:lang(sa), h3:lang(sa), h4:lang(sa), h5:lang(sa), h6:lang(sa),
+h2:lang(ta), h3:lang(ta), h4:lang(ta), h5:lang(ta), h6:lang(ta),
+h2:lang(te), h3:lang(te), h4:lang(te), h5:lang(te), h6:lang(te) {
+ line-height: 1.2em;
+}
+
+/* Localised ordered list numbering for some languages */
+ol:lang(bcc) li,
+ol:lang(bqi) li,
+ol:lang(fa) li,
+ol:lang(glk) li,
+ol:lang(kk-arab) li,
+ol:lang(mzn) li {
+ list-style-type: -moz-persian;
+ list-style-type: persian;
+}
+
+ol:lang(ckb) li {
+ list-style-type: -moz-arabic-indic;
+ list-style-type: arabic-indic;
+}
+
+ol:lang(hi) li,
+ol:lang(mr) li {
+ list-style-type: -moz-devanagari;
+ list-style-type: devanagari;
+}
+
+ol:lang(as) li,
+ol:lang(bn) li {
+ list-style-type: -moz-bengali;
+ list-style-type: bengali;
+}
+
+ol:lang(or) li {
+ list-style-type: -moz-oriya;
+ list-style-type: oriya;
+}
+
+#toc ul, .toc ul {
+ margin: .3em 0;
+}
+
+/* Correct directionality when page dir is different from site/user dir */
+/* @noflip */ .mw-content-ltr .toc ul,
+.mw-content-ltr #toc ul,
+.mw-content-rtl .mw-content-ltr .toc ul,
+.mw-content-rtl .mw-content-ltr #toc ul {
+ text-align: left;
+}
+/* @noflip */ .mw-content-rtl .toc ul,
+.mw-content-rtl #toc ul,
+.mw-content-ltr .mw-content-rtl .toc ul,
+.mw-content-ltr .mw-content-rtl #toc ul {
+ text-align: right;
+}
+/* @noflip */ .mw-content-ltr .toc ul ul,
+.mw-content-ltr #toc ul ul,
+.mw-content-rtl .mw-content-ltr .toc ul ul,
+.mw-content-rtl .mw-content-ltr #toc ul ul {
+ margin: 0 0 0 2em;
+}
+/* @noflip */ .mw-content-rtl .toc ul ul,
+.mw-content-rtl #toc ul ul,
+.mw-content-ltr .mw-content-rtl .toc ul ul,
+.mw-content-ltr .mw-content-rtl #toc ul ul {
+ margin: 0 2em 0 0;
+}
+
+#toc #toctitle,
+.toc #toctitle,
+#toc .toctitle,
+.toc .toctitle {
+ direction: ltr;
+}
+
+/* tooltip styles */
+.mw-help-field-hint {
+ display: none;
+ margin-left: 2px;
+ margin-bottom: -8px;
+ padding: 0 0 0 15px;
+ /* @embed */
+ background-image: url('images/help-question.gif');
+ background-position: left center;
+ background-repeat: no-repeat;
+ cursor: pointer;
+ font-size: .8em;
+ text-decoration: underline;
+ color: #0645ad;
+}
+.mw-help-field-hint:hover {
+ /* @embed */
+ background-image: url('images/help-question-hover.gif');
+}
+.mw-help-field-data {
+ display: block;
+ background-color: #d6f3ff;
+ padding:5px 8px 4px 8px;
+ border: 1px solid #5dc9f4;
+ margin-left: 20px;
+}
+.tipsy {
+ padding: 5px 5px 10px;
+ font-size: 12px;
+ position: absolute;
+ z-index: 100000;
+ overflow: visible;
+}
+.tipsy-inner {
+ padding: 5px 8px 4px 8px;
+ background-color: #d6f3ff;
+ color: black;
+ border: 1px solid #5dc9f4;
+ max-width: 300px;
+ text-align: left;
+}
+.tipsy-arrow {
+ position: absolute;
+ /* @embed */
+ background: url(images/tipsy-arrow.gif) no-repeat top left;
+ width: 13px;
+ height: 13px;
+}
+.tipsy-se .tipsy-arrow {
+ bottom: -2px;
+ right: 10px;
+ background-position: 0% 100%;
+}
+
+#mw-clearyourcache,
+#mw-sitecsspreview,
+#mw-sitejspreview,
+#mw-usercsspreview,
+#mw-userjspreview {
+ direction: ltr;
+ unicode-bidi: embed;
+}
+
+/* Correct user & content directionality when viewing a diff */
+.diff-currentversion-title,
+.diff {
+ direction: ltr;
+ unicode-bidi: embed;
+}
+/* @noflip */ .diff-contentalign-right td {
+ direction: rtl;
+ unicode-bidi: embed;
+}
+/* @noflip */ .diff-contentalign-left td {
+ direction: ltr;
+ unicode-bidi: embed;
+}
+.diff-otitle,
+.diff-ntitle,
+.diff-lineno {
+ direction: ltr !important;
+ unicode-bidi: embed;
+}
+
+#mw-revision-info,
+#mw-revision-info-current,
+#mw-revision-nav {
+ direction: ltr;
+ display: inline;
+}
+
+/* Images */
+
+/* @noflip */ div.tright,
+div.floatright,
+table.floatright {
+ clear: right;
+ float: right;
+}
+/* @noflip */ div.tleft,
+div.floatleft,
+table.floatleft {
+ float: left;
+ clear: left;
+}
+div.floatright,
+table.floatright,
+div.floatleft,
+table.floatleft {
+ position: relative;
+}
+
+/* bug 12205 */
+#mw-credits a {
+ unicode-bidi: embed;
+}
+
+/* Accessibility */
+.mw-jump,
+#jump-to-nav {
+ overflow: hidden;
+ height: 0;
+ zoom: 1; /* http://webaim.org/techniques/skipnav/#iequirk */
+}
+
+/* Print footer should be hidden by default in screen. */
+.printfooter {
+ display: none;
+}
+
+/* For developpers */
+.xdebug-error {
+ position: absolute;
+ z-index: 99;
+}
+
+.editsection, .toctoggle {
+ -moz-user-select: none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+/**
+ * MediaWiki Print style sheet for CSS2-capable browsers.
+ * Copyright Gabriel Wicke, http://www.aulinx.de/
+ *
+ * Derived from the plone (http://plone.org/) styles
+ * Copyright Alexander Limi
+ */
+
+/* Thanks to A List Apart (http://alistapart.com/) for useful extras */
+a.stub,
+a.new {
+ color: #ba0000;
+ text-decoration: none;
+}
+
+#toc {
+ border: 1px solid #aaaaaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+}
+
+/* images */
+div.floatright {
+ float: right;
+ clear: right;
+ position: relative;
+ margin: 0.5em 0 0.8em 1.4em;
+}
+div.floatright p {
+ font-style: italic;
+}
+div.floatleft {
+ float: left;
+ clear: left;
+ position: relative;
+ margin: 0.5em 1.4em 0.8em 0;
+}
+div.floatleft p {
+ font-style: italic;
+}
+div.center {
+ text-align: center;
+}
+
+/* thumbnails */
+div.thumb {
+ border: none;
+ width: auto;
+ margin-top: 0.5em;
+ margin-bottom: 0.8em;
+ background-color: transparent;
+}
+div.thumbinner {
+ border:1px solid #cccccc;
+ padding: 3px !important;
+ background-color: White;
+ font-size: 94%;
+ text-align: center;
+ overflow: hidden;
+}
+html .thumbimage {
+ border: 1px solid #cccccc;
+}
+html .thumbcaption {
+ border: none;
+ text-align: left;
+ line-height: 1.4em;
+ padding: 3px !important;
+ font-size: 94%;
+}
+
+div.magnify {
+ display: none;
+}
+/* @noflip */
+div.tright {
+ float: right;
+ clear: right;
+ margin: 0.5em 0 0.8em 1.4em;
+}
+/* @noflip */
+div.tleft {
+ float: left;
+ clear: left;
+ margin: 0.5em 1.4em 0.8em 0;
+}
+img.thumbborder {
+ border: 1px solid #dddddd;
+}
+
+/* table standards */
+table.rimage {
+ float: right;
+ width: 1pt;
+ position: relative;
+ margin-left: 1em;
+ margin-bottom: 1em;
+ text-align: center;
+}
+
+body {
+ background: white;
+ color: black;
+ margin: 0;
+ padding: 0;
+}
+
+.noprint,
+div#jump-to-nav,
+.mw-jump,
+div.top,
+div#column-one,
+#colophon,
+.editsection,
+.toctoggle,
+.tochidden,
+div#f-poweredbyico,
+div#f-copyrightico,
+li#viewcount,
+li#about,
+li#disclaimer,
+li#mobileview,
+li#privacy,
+#footer-places,
+.mw-hidden-catlinks,
+tr.mw-metadata-show-hide-extended,
+span.mw-filepage-other-resolutions,
+#filetoc {
+ /* Hides all the elements irrelevant for printing */
+ display: none;
+}
+
+ul {
+ list-style-type: square;
+}
+
+#content {
+ background: none;
+ border: none !important;
+ padding: 0 !important;
+ margin: 0 !important;
+ direction: ltr;
+}
+#footer {
+ background : white;
+ color : black;
+ margin-top: 1em;
+ border-top: 1px solid #AAA;
+ direction: ltr;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ font-weight: bold;
+}
+
+p {
+ margin: 1em 0;
+ line-height: 1.2em;
+}
+
+pre {
+ border: 1pt dashed black;
+ white-space: pre;
+ font-size: 8pt;
+ overflow: auto;
+ padding: 1em 0;
+ background: white;
+ color: black;
+}
+
+table.listing,
+table.listing td {
+ border: 1pt solid black;
+ border-collapse: collapse;
+}
+
+a {
+ color: black !important;
+ background: none !important;
+ padding: 0 !important;
+}
+
+a:link, a:visited {
+ color: #520;
+ background: transparent;
+ text-decoration: underline;
+}
+
+#content a.external.text:after,
+#content a.external.autonumber:after {
+ /* Expand URLs for printing */
+ content: " (" attr(href) ") ";
+}
+
+#globalWrapper {
+ width: 100% !important;
+ min-width: 0 !important;
+}
+
+#content {
+ background: white;
+ color: black;
+}
+
+#column-content {
+ margin: 0 !important;
+}
+
+#column-content #content {
+ padding: 1em;
+ margin: 0 !important;
+}
+
+/* MSIE/Win doesn't understand 'inherit' */
+a,
+a.external,
+a.new,
+a.stub {
+ color: black !important;
+ text-decoration: none !important;
+}
+
+/* Continue ... */
+a,
+a.external,
+a.new,
+a.stub {
+ color: inherit !important;
+ text-decoration: inherit !important;
+}
+
+img {
+ border: none;
+ vertical-align: middle;
+}
+
+/* math */
+span.texhtml {
+ font-family: serif;
+}
+
+#siteNotice {
+ display: none;
+}
+
+/* Galleries (see shared.css for more info) */
+li.gallerybox {
+ vertical-align: top;
+ border: solid 2px white;
+ display: -moz-inline-box;
+ display: inline-block;
+}
+
+ul.gallery, li.gallerybox {
+ zoom: 1;
+ *display: inline;
+}
+
+ul.gallery {
+ margin: 2px;
+ padding: 2px;
+ display: block;
+}
+
+li.gallerycaption {
+ font-weight: bold;
+ text-align: center;
+ display: block;
+ word-wrap: break-word;
+}
+
+li.gallerybox div.thumb {
+ text-align: center;
+ border: 1px solid #ccc;
+ margin: 2px;
+}
+
+div.gallerytext {
+ overflow: hidden;
+ font-size: 94%;
+ padding: 2px 4px;
+ word-wrap: break-word;
+}
+
+/**
+ * Diff rendering
+ */
+table.diff {
+ background: white;
+}
+td.diff-otitle {
+ background: #ffffff;
+}
+td.diff-ntitle {
+ background: #ffffff;
+}
+td.diff-addedline {
+ background: #ccffcc;
+ font-size: smaller;
+ border: solid 2px black;
+}
+td.diff-deletedline {
+ background: #ffffaa;
+ font-size: smaller;
+ border: dotted 2px black;
+}
+td.diff-context {
+ background: #eeeeee;
+ font-size: smaller;
+}
+.diffchange {
+ color: silver;
+ font-weight: bold;
+ text-decoration: underline;
+}
+
+/**
+ * Table rendering
+ * As on shared.css but with white background.
+ */
+table.wikitable,
+table.mw_metadata {
+ margin: 1em 1em 1em 0;
+ border: 1px #aaa solid;
+ background: white;
+ border-collapse: collapse;
+}
+table.wikitable > tr > th, table.wikitable > tr > td,
+table.wikitable > * > tr > th, table.wikitable > * > tr > td,
+.mw_metadata th, .mw_metadata td {
+ border: 1px #aaa solid;
+ padding: 0.2em;
+}
+table.wikitable > tr > th,
+table.wikitable > * > tr > th,
+.mw_metadata th {
+ text-align: center;
+ background: white;
+ font-weight: bold;
+}
+table.wikitable > caption,
+.mw_metadata caption {
+ font-weight: bold;
+}
+
+a.sortheader {
+ margin: 0 0.3em;
+}
+
+/* Some pagination options */
+.wikitable, .thumb, img {
+ page-break-inside: avoid;
+}
+h2, h3, h4, h5, h6, h7 {
+ page-break-after: avoid;
+}
+p {
+ widows: 3;
+ orphans: 3;
+}
+
+/**
+ * Categories
+ */
+.catlinks ul {
+ display: inline;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ list-style-type: none;
+ list-style-image: none;
+ vertical-align: middle !ie;
+}
+
+.catlinks li {
+ display: inline-block;
+ line-height: 1.15em;
+ padding: 0 .4em;
+ border-left: 1px solid #AAA;
+ margin: 0.1em 0;
+ zoom: 1;
+ display: inline !ie;
+}
+
+.catlinks li:first-child {
+ padding-left: .2em;
+ border-left: none;
+}
+/* Default styling for HTML elements */
+dfn {
+ font-style: inherit; /* Reset default styling for <dfn> */
+}
+sup, sub {
+ line-height: 1em; /* Reduce line-height for <sup> and <sub> */
+}
+
+/* Main page fixes */
+#interwiki-completelist {
+ font-weight: bold;
+}
+body.page-Main_Page #ca-delete {
+ display: none !important;
+}
+body.page-Main_Page #mp-topbanner {
+ clear: both;
+}
+
+/* Edit window toolbar */
+#toolbar {
+ height: 22px;
+ margin-bottom: 6px;
+}
+
+/* Highlight data points in the info action if specified in the URL */
+body.action-info :target {
+ background: #DEF;
+}
+
+/* Make the list of references smaller */
+ol.references,
+div.reflist,
+div.refbegin {
+ font-size: 90%; /* Default font-size */
+ margin-bottom: 0.5em;
+}
+div.refbegin-100 {
+ font-size: 100%; /* Option for normal fontsize in {{refbegin}} */
+}
+div.reflist ol.references {
+ font-size: 100%; /* Reset font-size when nested in div.reflist */
+ list-style-type: inherit; /* Enable custom list style types */
+}
+
+/* Reset top margin for lists embedded in columns */
+div.columns {
+ margin-top: 0.3em;
+}
+div.columns dl,
+div.columns ol,
+div.columns ul {
+ margin-top: 0;
+}
+
+/* Avoid list items from breaking between columns */
+div.columns li,
+div.columns dd dd {
+ -webkit-column-break-inside: avoid;
+ page-break-inside: avoid;
+ break-inside: avoid-column;
+}
+
+/* Highlight clicked reference in blue to help navigation */
+ol.references li:target,
+sup.reference:target,
+span.citation:target {
+ background-color: #DEF;
+}
+
+/* Ensure refs in table headers and the like aren't bold or italic */
+sup.reference {
+ font-weight: normal;
+ font-style: normal;
+}
+
+/* Allow hidden ref errors to be shown by user CSS */
+span.brokenref {
+ display: none;
+}
+
+/* Styling for citations (CSS3). Breaks long urls, etc., rather than overflowing box */
+.citation {
+ word-wrap: break-word;
+}
+
+/* For linked citation numbers and document IDs, where
+ the number need not be shown on a screen or a handheld,
+ but should be included in the printed version */
+@media screen, handheld {
+ .citation *.printonly {
+ display: none;
+ }
+}
+
+/* Style for [[Template:Flowlist]] that Lets lists flow around floating objecs */
+.flowlist ul {
+ overflow-x: hidden;
+ margin-left: 0em;
+ padding-left: 1.6em;
+}
+.flowlist ol {
+ overflow-x: hidden;
+ margin-left: 0em;
+ padding-left: 3.2em;
+}
+.flowlist dl {
+ overflow-x: hidden;
+}
+
+/* Style for horizontal lists (separator following item).
+ IE8-specific classes are assigned in [[MediaWiki:Common.js/IEFixes.js]].
+ @source mediawiki.org/wiki/Snippets/Horizontal_lists
+ @revision 4.3 (2014-01-06)
+ @author [[User:Edokter]]
+ */
+.hlist dl,
+.hlist ol,
+.hlist ul {
+ margin: 0;
+ padding: 0;
+}
+/* Display list items inline */
+.hlist dd,
+.hlist dt,
+.hlist li {
+ margin: 0;
+ display: inline;
+}
+/* Display nested lists inline */
+.hlist dl dl, .hlist dl ol, .hlist dl ul,
+.hlist ol dl, .hlist ol ol, .hlist ol ul,
+.hlist ul dl, .hlist ul ol, .hlist ul ul {
+ display: inline;
+}
+/* Generate interpuncts */
+.hlist dt:after {
+ content: ": ";
+}
+.hlist dd:after,
+.hlist li:after {
+ content: " · ";
+ font-weight: bold;
+}
+.hlist dd:last-child:after,
+.hlist dt:last-child:after,
+.hlist li:last-child:after {
+ content: none;
+}
+/* For IE8 */
+.hlist dd.hlist-last-child:after,
+.hlist dt.hlist-last-child:after,
+.hlist li.hlist-last-child:after {
+ content: none;
+}
+/* Add parentheses around nested lists */
+.hlist dd dd:first-child:before, .hlist dd dt:first-child:before, .hlist dd li:first-child:before,
+.hlist dt dd:first-child:before, .hlist dt dt:first-child:before, .hlist dt li:first-child:before,
+.hlist li dd:first-child:before, .hlist li dt:first-child:before, .hlist li li:first-child:before {
+ content: " (";
+ font-weight: normal;
+}
+.hlist dd dd:last-child:after, .hlist dd dt:last-child:after, .hlist dd li:last-child:after,
+.hlist dt dd:last-child:after, .hlist dt dt:last-child:after, .hlist dt li:last-child:after,
+.hlist li dd:last-child:after, .hlist li dt:last-child:after, .hlist li li:last-child:after {
+ content: ") ";
+ font-weight: normal;
+}
+/* For IE8 */
+.hlist dd dd.hlist-last-child:after, .hlist dd dt.hlist-last-child:after, .hlist dd li.hlist-last-child:after,
+.hlist dt dd.hlist-last-child:after, .hlist dt dt.hlist-last-child:after, .hlist dt li.hlist-last-child:after,
+.hlist li dd.hlist-last-child:after, .hlist li dt.hlist-last-child:after, .hlist li li.hlist-last-child:after {
+ content: ") ";
+ font-weight: normal;
+}
+/* Put ordinals in front of ordered list items */
+.hlist ol {
+ counter-reset: listitem;
+}
+.hlist ol > li {
+ counter-increment: listitem;
+}
+.hlist ol > li:before {
+ content: " " counter(listitem) " ";
+}
+.hlist dd ol > li:first-child:before,
+.hlist dt ol > li:first-child:before,
+.hlist li ol > li:first-child:before {
+ content: " (" counter(listitem) " ";
+}
+
+/* Unbulleted lists */
+.plainlist ul {
+ line-height: inherit;
+ list-style: none none;
+ margin: 0;
+}
+.plainlist ul li {
+ margin-bottom: 0;
+}
+
+/* Default style for navigation boxes */
+.navbox { /* Navbox container style */
+ border: 1px solid #aaa;
+ width: 100%;
+ margin: auto;
+ clear: both;
+ font-size: 88%;
+ text-align: center;
+ padding: 1px;
+}
+.navbox-inner,
+.navbox-subgroup {
+ width: 100%;
+}
+.navbox-group,
+.navbox-title,
+.navbox-abovebelow {
+ padding: 0.25em 1em; /* Title, group and above/below styles */
+ line-height: 1.5em;
+ text-align: center;
+}
+th.navbox-group { /* Group style */
+ white-space: nowrap;
+ /* @noflip */
+ text-align: right;
+}
+.navbox,
+.navbox-subgroup {
+ background: #fdfdfd; /* Background color */
+}
+.navbox-list {
+ line-height: 1.8em;
+ border-color: #fdfdfd; /* Must match background color */
+}
+.navbox th,
+.navbox-title {
+ background: #ccccff; /* Level 1 color */
+}
+.navbox-abovebelow,
+th.navbox-group,
+.navbox-subgroup .navbox-title {
+ background: #ddddff; /* Level 2 color */
+}
+.navbox-subgroup .navbox-group,
+.navbox-subgroup .navbox-abovebelow {
+ background: #e6e6ff; /* Level 3 color */
+}
+.navbox-even {
+ background: #f7f7f7; /* Even row striping */
+}
+.navbox-odd {
+ background: transparent; /* Odd row striping */
+}
+table.navbox + table.navbox { /* Single pixel border between adjacent navboxes */
+ margin-top: -1px; /* (doesn't work for IE6, but that's okay) */
+}
+.navbox .hlist td dl,
+.navbox .hlist td ol,
+.navbox .hlist td ul,
+.navbox td.hlist dl,
+.navbox td.hlist ol,
+.navbox td.hlist ul {
+ padding: 0.125em 0; /* Adjust hlist padding in navboxes */
+}
+ol + table.navbox,
+ul + table.navbox {
+ margin-top: 0.5em; /* Prevent lists from clinging to navboxes */
+}
+
+/* Default styling for Navbar template */
+.navbar {
+ display: inline;
+ font-size: 88%;
+ font-weight: normal;
+}
+.navbar ul {
+ display: inline;
+ white-space: nowrap;
+}
+.navbar li {
+ word-spacing: -0.125em;
+}
+.navbar.mini li span {
+ font-variant: small-caps;
+}
+/* Navbar styling when nested in infobox and navbox */
+.infobox .navbar {
+ font-size: 100%;
+}
+.navbox .navbar {
+ display: block;
+ font-size: 100%;
+}
+.navbox-title .navbar {
+ /* @noflip */
+ float: left;
+ /* @noflip */
+ text-align: left;
+ /* @noflip */
+ margin-right: 0.5em;
+ width: 6em;
+}
+
+/* 'show'/'hide' buttons created dynamically by the CollapsibleTables javascript
+ in [[MediaWiki:Common.js]] are styled here so they can be customised. */
+.collapseButton {
+ /* @noflip */
+ float: right;
+ font-weight: normal;
+ /* @noflip */
+ margin-left: 0.5em;
+ /* @noflip */
+ text-align: right;
+ width: auto;
+}
+/* In navboxes, the show/hide button balances the v·d·e links
+ from [[Template:Navbar]], so they need to be the same width. */
+.navbox .collapseButton {
+ width: 6em;
+}
+
+/* Styling for JQuery makeCollapsible, matching that of collapseButton */
+.mw-collapsible-toggle {
+ font-weight: normal;
+ /* @noflip */
+ text-align: right;
+}
+.navbox .mw-collapsible-toggle {
+ width: 6em;
+}
+
+/* Infobox template style */
+.infobox {
+ border: 1px solid #aaa;
+ background-color: #f9f9f9;
+ color: black;
+ /* @noflip */
+ margin: 0.5em 0 0.5em 1em;
+ padding: 0.2em;
+ /* @noflip */
+ float: right;
+ /* @noflip */
+ clear: right;
+ /* @noflip */
+ text-align: left;
+ font-size: 88%;
+ line-height: 1.5em;
+}
+.infobox caption {
+ font-size: 125%;
+ font-weight: bold;
+}
+.infobox td,
+.infobox th {
+ vertical-align: top;
+}
+.infobox.bordered {
+ border-collapse: collapse;
+}
+.infobox.bordered td,
+.infobox.bordered th {
+ border: 1px solid #aaa;
+}
+.infobox.bordered .borderless td,
+.infobox.bordered .borderless th {
+ border: 0;
+}
+
+.infobox.sisterproject {
+ width: 20em;
+ font-size: 90%;
+}
+
+.infobox.standard-talk {
+ border: 1px solid #c0c090;
+ background-color: #f8eaba;
+}
+.infobox.standard-talk.bordered td,
+.infobox.standard-talk.bordered th {
+ border: 1px solid #c0c090;
+}
+
+/* styles for bordered infobox with merged rows */
+.infobox.bordered .mergedtoprow td,
+.infobox.bordered .mergedtoprow th {
+ border: 0;
+ border-top: 1px solid #aaa;
+ /* @noflip */
+ border-right: 1px solid #aaa;
+}
+
+.infobox.bordered .mergedrow td,
+.infobox.bordered .mergedrow th {
+ border: 0;
+ /* @noflip */
+ border-right: 1px solid #aaa;
+}
+
+/* Styles for geography infoboxes, eg countries,
+ country subdivisions, cities, etc. */
+.infobox.geography {
+ border-collapse: collapse;
+ line-height: 1.2em;
+ font-size: 90%;
+}
+
+.infobox.geography td,
+.infobox.geography th {
+ border-top: 1px solid #aaa;
+ padding: 0.4em 0.6em 0.4em 0.6em;
+}
+.infobox.geography .mergedtoprow td,
+.infobox.geography .mergedtoprow th {
+ border-top: 1px solid #aaa;
+ padding: 0.4em 0.6em 0.2em 0.6em;
+}
+
+.infobox.geography .mergedrow td,
+.infobox.geography .mergedrow th {
+ border: 0;
+ padding: 0 0.6em 0.2em 0.6em;
+}
+
+.infobox.geography .mergedbottomrow td,
+.infobox.geography .mergedbottomrow th {
+ border-top: 0;
+ border-bottom: 1px solid #aaa;
+ padding: 0 0.6em 0.4em 0.6em;
+}
+
+.infobox.geography .maptable td,
+.infobox.geography .maptable th {
+ border: 0;
+ padding: 0;
+}
+
+/* Normal font styling for table row headers with scope="row" tag */
+.wikitable.plainrowheaders th[scope=row] {
+ font-weight: normal;
+ /* @noflip */
+ text-align: left;
+}
+
+/* Lists in data cells are always left-aligned */
+.wikitable td ul,
+.wikitable td ol,
+.wikitable td dl {
+ /* @noflip */
+ text-align: left;
+}
+/* ...unless they also use the hlist class */
+.wikitable.hlist td ul,
+.wikitable.hlist td ol,
+.wikitable.hlist td dl {
+ text-align: inherit;
+}
+
+/* Icons for medialist templates [[Template:Listen]],
+ [[Template:Multi-listen_start]], [[Template:Video]],
+ [[Template:Multi-video_start]] */
+div.listenlist {
+ background: url("//upload.wikimedia.org/wikipedia/commons/4/47/Sound-icon.svg") no-repeat scroll 0% 0% transparent;
+ background-size: 30px;
+ padding-left: 40px;
+}
+
+/* Fix for hieroglyphs specificality issue in infoboxes ([[Bugzilla:41869]]) */
+table.mw-hiero-table td {
+ vertical-align: middle;
+}
+
+/* Style rules for media list templates */
+div.medialist {
+ min-height: 50px;
+ margin: 1em;
+ /* @noflip */
+ background-position: top left;
+ background-repeat: no-repeat;
+}
+div.medialist ul {
+ list-style-type: none;
+ list-style-image: none;
+ margin: 0;
+}
+div.medialist ul li {
+ padding-bottom: 0.5em;
+}
+div.medialist ul li li {
+ font-size: 91%;
+ padding-bottom: 0;
+}
+
+/* Change the external link icon to an Adobe icon for all PDF files
+ in browsers that support these CSS selectors, like Mozilla and Opera */
+div#content a[href$=".pdf"].external,
+div#content a[href*=".pdf?"].external,
+div#content a[href*=".pdf#"].external,
+div#content a[href$=".PDF"].external,
+div#content a[href*=".PDF?"].external,
+div#content a[href*=".PDF#"].external,
+div#mw_content a[href$=".pdf"].external,
+div#mw_content a[href*=".pdf?"].external,
+div#mw_content a[href*=".pdf#"].external,
+div#mw_content a[href$=".PDF"].external,
+div#mw_content a[href*=".PDF?"].external,
+div#mw_content a[href*=".PDF#"].external {
+ background: url("//upload.wikimedia.org/wikipedia/commons/2/23/Icons-mini-file_acrobat.gif") no-repeat right;
+ /* @noflip */
+ padding-right: 18px;
+}
+
+/* Change the external link icon to an Adobe icon anywhere the PDFlink class
+ is used (notably Template:PDFlink). This works in IE, unlike the above. */
+div#content span.PDFlink a,
+div#mw_content span.PDFlink a {
+ background: url("//upload.wikimedia.org/wikipedia/commons/2/23/Icons-mini-file_acrobat.gif") no-repeat right;
+ /* @noflip */
+ padding-right: 18px;
+}
+
+/* Content in columns with CSS instead of tables ([[Template:Columns]]) */
+div.columns-2 div.column {
+ /* @noflip */
+ float: left;
+ width: 50%;
+ min-width: 300px;
+}
+div.columns-3 div.column {
+ /* @noflip */
+ float: left;
+ width: 33.3%;
+ min-width: 200px;
+}
+div.columns-4 div.column {
+ /* @noflip */
+ float: left;
+ width: 25%;
+ min-width: 150px;
+}
+div.columns-5 div.column {
+ /* @noflip */
+ float: left;
+ width: 20%;
+ min-width: 120px;
+}
+
+/* Messagebox templates */
+.messagebox {
+ border: 1px solid #aaa;
+ background-color: #f9f9f9;
+ width: 80%;
+ margin: 0 auto 1em auto;
+ padding: .2em;
+}
+.messagebox.merge {
+ border: 1px solid #c0b8cc;
+ background-color: #f0e5ff;
+ text-align: center;
+}
+.messagebox.cleanup {
+ border: 1px solid #9f9fff;
+ background-color: #efefff;
+ text-align: center;
+}
+.messagebox.standard-talk {
+ border: 1px solid #c0c090;
+ background-color: #f8eaba;
+ margin: 4px auto;
+}
+/* For old WikiProject banners inside banner shells. */
+.mbox-inside .standard-talk,
+.messagebox.nested-talk {
+ border: 1px solid #c0c090;
+ background-color: #f8eaba;
+ width: 100%;
+ margin: 2px 0;
+ padding: 2px;
+}
+.messagebox.small {
+ width: 238px;
+ font-size: 85%;
+ /* @noflip */
+ float: right;
+ clear: both;
+ /* @noflip */
+ margin: 0 0 1em 1em;
+ line-height: 1.25em;
+}
+.messagebox.small-talk {
+ width: 238px;
+ font-size: 85%;
+ /* @noflip */
+ float: right;
+ clear: both;
+ /* @noflip */
+ margin: 0 0 1em 1em;
+ line-height: 1.25em;
+ background: #F8EABA;
+}
+
+/* Cell sizes for ambox/tmbox/imbox/cmbox/ombox/fmbox/dmbox message boxes */
+th.mbox-text, td.mbox-text { /* The message body cell(s) */
+ border: none;
+ /* @noflip */
+ padding: 0.25em 0.9em; /* 0.9em left/right */
+ width: 100%; /* Make all mboxes the same width regardless of text length */
+}
+td.mbox-image { /* The left image cell */
+ border: none;
+ /* @noflip */
+ padding: 2px 0 2px 0.9em; /* 0.9em left, 0px right */
+ text-align: center;
+}
+td.mbox-imageright { /* The right image cell */
+ border: none;
+ /* @noflip */
+ padding: 2px 0.9em 2px 0; /* 0px left, 0.9em right */
+ text-align: center;
+}
+td.mbox-empty-cell { /* An empty narrow cell */
+ border: none;
+ padding: 0px;
+ width: 1px;
+}
+
+/* Article message box styles */
+table.ambox {
+ margin: 0px 10%; /* 10% = Will not overlap with other elements */
+ border: 1px solid #aaa;
+ /* @noflip */
+ border-left: 10px solid #1e90ff; /* Default "notice" blue */
+ background: #fbfbfb;
+}
+table.ambox + table.ambox { /* Single border between stacked boxes. */
+ margin-top: -1px;
+}
+.ambox th.mbox-text,
+.ambox td.mbox-text { /* The message body cell(s) */
+ padding: 0.25em 0.5em; /* 0.5em left/right */
+}
+.ambox td.mbox-image { /* The left image cell */
+ /* @noflip */
+ padding: 2px 0 2px 0.5em; /* 0.5em left, 0px right */
+}
+.ambox td.mbox-imageright { /* The right image cell */
+ /* @noflip */
+ padding: 2px 0.5em 2px 0; /* 0px left, 0.5em right */
+}
+
+table.ambox-notice {
+ /* @noflip */
+ border-left: 10px solid #1e90ff; /* Blue */
+}
+table.ambox-speedy {
+ /* @noflip */
+ border-left: 10px solid #b22222; /* Red */
+ background: #fee; /* Pink */
+}
+table.ambox-delete {
+ /* @noflip */
+ border-left: 10px solid #b22222; /* Red */
+}
+table.ambox-content {
+ /* @noflip */
+ border-left: 10px solid #f28500; /* Orange */
+}
+table.ambox-style {
+ /* @noflip */
+ border-left: 10px solid #f4c430; /* Yellow */
+}
+table.ambox-move {
+ /* @noflip */
+ border-left: 10px solid #9932cc; /* Purple */
+}
+table.ambox-protection {
+ /* @noflip */
+ border-left: 10px solid #bba; /* Gray-gold */
+}
+
+/* Image message box styles */
+table.imbox {
+ margin: 4px 10%;
+ border-collapse: collapse;
+ border: 3px solid #1e90ff; /* Default "notice" blue */
+ background: #fbfbfb;
+}
+.imbox .mbox-text .imbox { /* For imboxes inside imbox-text cells. */
+ margin: 0 -0.5em; /* 0.9 - 0.5 = 0.4em left/right. */
+ display: block; /* Fix for webkit to force 100% width. */
+}
+.mbox-inside .imbox { /* For imboxes inside other templates. */
+ margin: 4px;
+}
+
+table.imbox-notice {
+ border: 3px solid #1e90ff; /* Blue */
+}
+table.imbox-speedy {
+ border: 3px solid #b22222; /* Red */
+ background: #fee; /* Pink */
+}
+table.imbox-delete {
+ border: 3px solid #b22222; /* Red */
+}
+table.imbox-content {
+ border: 3px solid #f28500; /* Orange */
+}
+table.imbox-style {
+ border: 3px solid #f4c430; /* Yellow */
+}
+table.imbox-move {
+ border: 3px solid #9932cc; /* Purple */
+}
+table.imbox-protection {
+ border: 3px solid #bba; /* Gray-gold */
+}
+table.imbox-license {
+ border: 3px solid #88a; /* Dark gray */
+ background: #f7f8ff; /* Light gray */
+}
+table.imbox-featured {
+ border: 3px solid #cba135; /* Brown-gold */
+}
+
+/* Category message box styles */
+table.cmbox {
+ margin: 3px 10%;
+ border-collapse: collapse;
+ border: 1px solid #aaa;
+ background: #DFE8FF; /* Default "notice" blue */
+}
+
+table.cmbox-notice {
+ background: #D8E8FF; /* Blue */
+}
+table.cmbox-speedy {
+ margin-top: 4px;
+ margin-bottom: 4px;
+ border: 4px solid #b22222; /* Red */
+ background: #FFDBDB; /* Pink */
+}
+table.cmbox-delete {
+ background: #FFDBDB; /* Red */
+}
+table.cmbox-content {
+ background: #FFE7CE; /* Orange */
+}
+table.cmbox-style {
+ background: #FFF9DB; /* Yellow */
+}
+table.cmbox-move {
+ background: #E4D8FF; /* Purple */
+}
+table.cmbox-protection {
+ background: #EFEFE1; /* Gray-gold */
+}
+
+/* Other pages message box styles */
+table.ombox {
+ margin: 4px 10%;
+ border-collapse: collapse;
+ border: 1px solid #aaa; /* Default "notice" gray */
+ background: #f9f9f9;
+}
+
+table.ombox-notice {
+ border: 1px solid #aaa; /* Gray */
+}
+table.ombox-speedy {
+ border: 2px solid #b22222; /* Red */
+ background: #fee; /* Pink */
+}
+table.ombox-delete {
+ border: 2px solid #b22222; /* Red */
+}
+table.ombox-content {
+ border: 1px solid #f28500; /* Orange */
+}
+table.ombox-style {
+ border: 1px solid #f4c430; /* Yellow */
+}
+table.ombox-move {
+ border: 1px solid #9932cc; /* Purple */
+}
+table.ombox-protection {
+ border: 2px solid #bba; /* Gray-gold */
+}
+
+/* Talk page message box styles */
+table.tmbox {
+ margin: 4px 10%;
+ border-collapse: collapse;
+ border: 1px solid #c0c090; /* Default "notice" gray-brown */
+ background: #f8eaba;
+}
+.mediawiki .mbox-inside .tmbox { /* For tmboxes inside other templates. The "mediawiki" class ensures that */
+ margin: 2px 0; /* this declaration overrides other styles (including mbox-small above) */
+ width: 100%; /* For Safari and Opera */
+}
+.mbox-inside .tmbox.mbox-small { /* "small" tmboxes should not be small when */
+ line-height: 1.5em; /* also "nested", so reset styles that are */
+ font-size: 100%; /* set in "mbox-small" above. */
+}
+
+table.tmbox-speedy {
+ border: 2px solid #b22222; /* Red */
+ background: #fee; /* Pink */
+}
+table.tmbox-delete {
+ border: 2px solid #b22222; /* Red */
+}
+table.tmbox-content {
+ border: 2px solid #f28500; /* Orange */
+}
+table.tmbox-style {
+ border: 2px solid #f4c430; /* Yellow */
+}
+table.tmbox-move {
+ border: 2px solid #9932cc; /* Purple */
+}
+table.tmbox-protection,
+table.tmbox-notice {
+ border: 1px solid #c0c090; /* Gray-brown */
+}
+
+/* Disambig and set index box styles */
+table.dmbox {
+ clear: both;
+ margin: 0.9em 1em;
+ border-top: 1px solid #ccc;
+ border-bottom: 1px solid #ccc;
+ background: transparent;
+}
+
+/* Footer and header message box styles */
+table.fmbox {
+ clear: both;
+ margin: 0.2em 0;
+ width: 100%;
+ border: 1px solid #aaa;
+ background: #f9f9f9; /* Default "system" gray */
+}
+table.fmbox-system {
+ background: #f9f9f9;
+}
+table.fmbox-warning {
+ border: 1px solid #bb7070; /* Dark pink */
+ background: #ffdbdb; /* Pink */
+}
+table.fmbox-editnotice {
+ background: transparent;
+}
+/* Div based "warning" style fmbox messages. */
+div.mw-warning-with-logexcerpt,
+div.mw-lag-warn-high,
+div.mw-cascadeprotectedwarning,
+div#mw-protect-cascadeon {
+ clear: both;
+ margin: 0.2em 0;
+ border: 1px solid #bb7070;
+ background: #ffdbdb;
+ padding: 0.25em 0.9em;
+}
+/* Div based "system" style fmbox messages.
+ Used in [[MediaWiki:Readonly lag]]. */
+div.mw-lag-warn-normal,
+div.fmbox-system {
+ clear: both;
+ margin: 0.2em 0;
+ border: 1px solid #aaa;
+ background: #f9f9f9;
+ padding: 0.25em 0.9em;
+}
+
+/* These mbox-small classes must be placed after all other
+ ambox/tmbox/ombox etc classes. "body.mediawiki" is so
+ they override "table.ambox + table.ambox" above. */
+body.mediawiki table.mbox-small { /* For the "small=yes" option. */
+ /* @noflip */
+ clear: right;
+ /* @noflip */
+ float: right;
+ /* @noflip */
+ margin: 4px 0 4px 1em;
+ width: 238px;
+ font-size: 88%;
+ line-height: 1.25em;
+}
+body.mediawiki table.mbox-small-left { /* For the "small=left" option. */
+ /* @noflip */
+ margin: 4px 1em 4px 0;
+ width: 238px;
+ border-collapse: collapse;
+ font-size: 88%;
+ line-height: 1.25em;
+}
+
+/* Style for compact ambox */
+/* Hide the images */
+.compact-ambox table .mbox-image,
+.compact-ambox table .mbox-imageright,
+.compact-ambox table .mbox-empty-cell {
+ display: none;
+}
+/* Remove borders, backgrounds, padding, etc. */
+.compact-ambox table.ambox {
+ border: none;
+ border-collapse: collapse;
+ background: transparent;
+ margin: 0 0 0 1.6em !important;
+ padding: 0 !important;
+ width: auto;
+ display: block;
+}
+body.mediawiki .compact-ambox table.mbox-small-left {
+ font-size: 100%;
+ width: auto;
+ margin: 0;
+}
+/* Style the text cell as a list item and remove its padding */
+.compact-ambox table .mbox-text {
+ padding: 0 !important;
+ margin: 0 !important;
+}
+.compact-ambox table .mbox-text-span {
+ display: list-item;
+ line-height: 1.5em;
+ list-style-type: square;
+ list-style-image: url(//bits.wikimedia.org/skins/common/images/bullet.gif);
+}
+.skin-vector .compact-ambox table .mbox-text-span {
+ list-style-type: circle;
+ list-style-image: url(//bits.wikimedia.org/skins/vector/images/bullet-icon.png)
+}
+/* Allow for hiding text in compact form */
+.compact-ambox .hide-when-compact {
+ display: none;
+}
+
+/* Remove default styles for [[MediaWiki:Noarticletext]]. */
+div.noarticletext {
+ border: none;
+ background: transparent;
+ padding: 0;
+}
+
+/* Hide (formatting) elements from screen, but not from screenreaders */
+.visualhide {
+ position: absolute;
+ left: -10000px;
+ top: auto;
+ width: 1px;
+ height: 1px;
+ overflow: hidden;
+}
+
+/* Bold save button */
+#wpSave {
+ font-weight: bold;
+}
+
+/* class hiddenStructure is defunct. See [[Wikipedia:hiddenStructure]] */
+.hiddenStructure {
+ display: inline !important;
+ color: #f00;
+ background-color: #0f0;
+}
+
+/* suppress missing interwiki image links where #ifexist cannot
+ be used due to high number of requests see .hidden-redlink on
+ [[m:MediaWiki:Common.css]] */
+.check-icon a.new {
+ display: none;
+ speak: none;
+}
+
+/* Removes underlines from certain links */
+.nounderlines a,
+.IPA a:link, .IPA a:visited {
+ text-decoration: none !important;
+}
+
+/* Standard Navigationsleisten, aka box hiding thingy
+ from .de. Documentation at [[Wikipedia:NavFrame]]. */
+div.NavFrame {
+ margin: 0;
+ padding: 4px;
+ border: 1px solid #aaa;
+ text-align: center;
+ border-collapse: collapse;
+ font-size: 95%;
+}
+div.NavFrame + div.NavFrame {
+ border-top-style: none;
+ border-top-style: hidden;
+}
+div.NavPic {
+ background-color: #fff;
+ margin: 0;
+ padding: 2px;
+ /* @noflip */
+ float: left;
+}
+div.NavFrame div.NavHead {
+ height: 1.6em;
+ font-weight: bold;
+ background-color: #ccf;
+ position: relative;
+}
+div.NavFrame p,
+div.NavFrame div.NavContent,
+div.NavFrame div.NavContent p {
+ font-size: 100%;
+}
+div.NavEnd {
+ margin: 0;
+ padding: 0;
+ line-height: 1px;
+ clear: both;
+}
+a.NavToggle {
+ position: absolute;
+ top: 0;
+ /* @noflip */
+ right: 3px;
+ font-weight: normal;
+ font-size: 90%;
+}
+
+/* Hatnotes and disambiguation notices */
+.rellink,
+.dablink {
+ font-style: italic;
+ /* @noflip */
+ padding-left: 1.6em;
+ margin-bottom: 0.5em;
+}
+.rellink i,
+.dablink i {
+ font-style: normal;
+}
+
+/* Allow transcluded pages to display in lists rather than a table.
+ Compatible in Firefox; incompatible in IE6. */
+.listify td { display: list-item; }
+.listify tr { display: block; }
+.listify table { display: block; }
+
+/* Geographical coordinates defaults. See [[Template:Coord/link]]
+ for how these are used. The classes "geo", "longitude", and
+ "latitude" are used by the [[Geo microformat]]. */
+.geo-default, .geo-dms, .geo-dec { display: inline; }
+.geo-nondefault, .geo-multi-punct { display: none; }
+.longitude, .latitude { white-space: nowrap; }
+
+/* When <div class="nonumtoc"> is used on the table of contents,
+ the ToC will display without numbers */
+.nonumtoc .tocnumber { display: none; }
+.nonumtoc #toc ul,
+.nonumtoc .toc ul {
+ line-height: 1.5em;
+ list-style: none none;
+ margin: .3em 0 0;
+ padding: 0;
+}
+.nonumtoc #toc ul ul,
+.nonumtoc .toc ul ul {
+ /* @noflip */
+ margin: 0 0 0 2em;
+}
+
+/* Allow limiting of which header levels are shown in a TOC;
+ <div class="toclimit-3">, for instance, will limit to
+ showing ==headings== and ===headings=== but no further
+ (as long as there are no =headings= on the page, which
+ there shouldn't be according to the MoS). */
+.toclimit-2 .toclevel-1 ul,
+.toclimit-3 .toclevel-2 ul,
+.toclimit-4 .toclevel-3 ul,
+.toclimit-5 .toclevel-4 ul,
+.toclimit-6 .toclevel-5 ul,
+.toclimit-7 .toclevel-6 ul {
+ display: none;
+}
+
+/* Styling for Template:Quote */
+blockquote.templatequote {
+ margin-top: 0;
+}
+blockquote.templatequote div.templatequotecite {
+ line-height: 1em;
+ /* @noflip */
+ text-align: left;
+ /* @noflip */
+ padding-left: 2em;
+ margin-top: 0;
+}
+blockquote.templatequote div.templatequotecite cite {
+ font-size: 85%;
+}
+
+/* User block messages */
+div.user-block {
+ padding: 5px;
+ margin-bottom: 0.5em;
+ border: 1px solid #A9A9A9;
+ background-color: #FFEFD5;
+}
+
+/* Prevent line breaks in silly places:
+ 1) Where desired
+ 2) Links when we don't want them to
+ 3) Bold "links" to the page itself
+ 4) Ref tags with group names <ref group="Note"> --> "[Note 1]" */
+.nowrap,
+.nowraplinks a,
+.nowraplinks .selflink,
+sup.reference a {
+ white-space: nowrap;
+}
+/* But allow wrapping where desired: */
+.wrap,
+.wraplinks a {
+ white-space: normal;
+}
+
+/* For template documentation */
+.template-documentation {
+ clear: both;
+ margin: 1em 0 0 0;
+ border: 1px solid #aaa;
+ background-color: #ecfcf4;
+ padding: 1em;
+}
+
+/* Inline divs in ImageMaps (code borrowed from de.wiki) */
+.imagemap-inline div {
+ display: inline;
+}
+
+/* Increase the height of the image upload box */
+#wpUploadDescription {
+ height: 13em;
+}
+
+/* Minimum thumb width */
+.thumbinner {
+ min-width: 100px;
+}
+
+/* Makes the background of a framed image white instead of gray.
+ Only visible with transparent images. */
+div.thumb .thumbimage {
+ background-color: #fff;
+}
+
+/* The backgrounds for galleries. */
+div#content .gallerybox div.thumb {
+ /* Light gray padding */
+ background-color: #F9F9F9;
+}
+/* Put a chequered background behind images, only visible if they have transparency.
+ '.filehistory a img' and '#file img:hover' are handled by MediaWiki core (as of 1.19) */
+.gallerybox .thumb img {
+ background: #fff url(//bits.wikimedia.org/skins/common/images/Checker-16x16.png) repeat;
+}
+/* But not on articles, user pages, portals or with opt-out. */
+.ns-0 .gallerybox .thumb img,
+.ns-2 .gallerybox .thumb img,
+.ns-100 .gallerybox .thumb img,
+.nochecker .gallerybox .thumb img {
+ background: #fff;
+}
+
+/* Prevent floating boxes from overlapping any category listings,
+ file histories, edit previews, and edit [Show changes] views. */
+#mw-subcategories, #mw-pages, #mw-category-media,
+#filehistory, #wikiPreview, #wikiDiff {
+ clear: both;
+}
+
+body.rtl #mw-articlefeedbackv5, body.rtl #mw-articlefeedback {
+ display: block; /* Override inline block mode */
+ margin-bottom: 1em;
+ /* @noflip */
+ clear: right; /* Clear any info boxes that stick out */
+ /* @noflip */
+ float: right; /* Prevents margin collapsing */
+}
+
+/* Selectively hide headers in WikiProject banners */
+.wpb .wpb-header { display: none; }
+.wpbs-inner .wpb .wpb-header { display: block; } /* for IE */
+.wpbs-inner .wpb .wpb-header { display: table-row; } /* for real browsers */
+.wpbs-inner .wpb-outside { display: none; } /* hide things that should only display outside shells */
+
+/* Styling for Abuse Filter tags */
+.mw-tag-markers {
+ font-family:sans-serif;
+ font-style:italic;
+ font-size:90%;
+}
+
+/* Hide stuff meant for accounts with special permissions. Made visible again in
+ [[MediaWiki:Group-sysop.css]], [[MediaWiki:Group-accountcreator.css]],
+ [[MediaWiki:Group-templateeditor.css]] and [[Mediawiki:Group-autoconfirmed.css]]. */
+.sysop-show,
+.accountcreator-show,
+.templateeditor-show,
+.autoconfirmed-show {
+ display: none;
+}
+
+/**
+ * Hide the redlink generated by {{Editnotice}},
+ * this overrides the ".sysop-show { display: none; }" above that applies
+ * to the same link as well.
+ */
+.ve-init-mw-viewPageTarget-toolbar-editNotices-notice .editnotice-redlink {
+ display: none !important;
+}
+
+/* Remove bullets when there are multiple edit page warnings */
+ul.permissions-errors > li {
+ list-style: none none;
+}
+ul.permissions-errors {
+ margin: 0;
+}
+
+/* No linewrap on the labels of the login/signup page */
+body.page-Special_UserLogin .mw-label label,
+body.page-Special_UserLogin_signup .mw-label label {
+ white-space: nowrap;
+}
+
+/* Pie chart test: Transparent borders */
+.transborder {
+ border: solid transparent;
+}
+* html .transborder { /* IE6 */
+ border: solid #000001;
+ filter: chroma(color=#000001);
+}
+
+/* Styling for updated markers on watchlist, history and recent/related changes.
+ Bullets are handled in skin-specific stylesheets. */
+.updatedmarker {
+ background-color: transparent;
+ color: #006400;
+}
+li.mw-changeslist-line-watched .mw-title,
+table.mw-changeslist-line-watched .mw-title,
+table.mw-enhanced-watch .mw-enhanced-rctime {
+ font-weight: normal;
+}
+
+/* Adjust font for inline HTML generated formulae */
+span.texhtml {
+ font-family: "Times New Roman", "Nimbus Roman No9 L", Times, serif;
+ font-size: 118%;
+ white-space: nowrap;
+}
+span.texhtml span.texhtml {
+ font-size: 100%;
+}
+
+/* Fix so <syntaxhighlight> tags and .css and .js pages get normal text size.
+ [[Bugzilla:26204]]. See also [[Wikipedia:Typography#The monospace 'bug']] */
+div.mw-geshi div,
+div.mw-geshi div pre,
+span.mw-geshi,
+pre.source-css,
+pre.source-javascript,
+pre.source-lua {
+ font-family: monospace, Courier !important;
+}
+
+/* Fix styling of transcluded prefindex tables */
+table#mw-prefixindex-list-table,
+table#mw-prefixindex-nav-table {
+ width: 98%;
+}
+
+/* For portals, added 2011-12-07 -bv
+ On wide screens, show these as two columns
+ On narrow and mobile screens, let them collapse into a single column */
+.portal-column-left {
+ float: left;
+ width: 50%;
+}
+.portal-column-right {
+ float: right;
+ width: 49%;
+}
+.portal-column-left-wide {
+ float: left;
+ width: 60%;
+}
+.portal-column-right-narrow {
+ float: right;
+ width: 39%;
+}
+.portal-column-left-extra-wide {
+ float: left;
+ width: 70%;
+}
+.portal-column-right-extra-narrow {
+ float: right;
+ width: 29%;
+}
+@media only screen and (max-width: 800px) {
+ /* Decouple the columns on narrow screens */
+ .portal-column-left,
+ .portal-column-right,
+ .portal-column-left-wide,
+ .portal-column-right-narrow,
+ .portal-column-left-extra-wide,
+ .portal-column-right-extra-narrow {
+ float: inherit;
+ width: inherit;
+ }
+}
+
+/* For announcements */
+#bodyContent .letterhead {
+ background-image:url('//upload.wikimedia.org/wikipedia/commons/e/e0/Tan-page-corner.png');
+ background-repeat:no-repeat;
+ padding: 2em;
+ background-color: #faf9f2;
+}
+
+/* Tree style lists */
+.treeview ul {
+ padding: 0;
+ margin: 0;
+}
+.treeview li {
+ padding: 0;
+ margin: 0;
+ list-style-type: none;
+ list-style-image: none;
+ zoom: 1; /* BE KIND TO IE6 */;
+}
+.treeview li li {
+ background: url("//upload.wikimedia.org/wikipedia/commons/f/f2/Treeview-grey-line.png") no-repeat 0 -2981px;
+ /* @noflip */
+ padding-left: 20px;
+ text-indent: 0.3em;
+}
+.treeview li li.lastline {
+ background-position: 0 -5971px
+}
+.treeview li.emptyline > ul {
+ /* @noflip */
+ margin-left: -1px;
+}
+.treeview li.emptyline > ul > li:first-child {
+ background-position: 0 9px
+}
+
+/* hidden sortkey for tablesorter */
+td .sortkey,
+th .sortkey {
+ display: none;
+ speak: none;
+}
+
+/* Make it possible to hide checkboxes in <inputbox> */
+.inputbox-hidecheckboxes form .inputbox-element {
+ display: none !important;
+}
+
+/* Hide charinsert base for those not using the gadget */
+#editpage-specialchars {
+ display: none;
+}
+
+/* work-around for [[bugzilla:23965]] (Kaltura advertisement) */
+.k-player .k-attribution {
+ visibility: hidden;
+}
+
+/* [[MediaZilla:35337]] */
+@media (-webkit-min-device-pixel-ratio: 1.5), (min--moz-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx), (min-resolution: 144dpi) {
+ #p-logo a {
+ background-image: url("//upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Wikipedia-logo-v2-en.svg/204px-Wikipedia-logo-v2-en.svg.png") !important;
+ background-size: 136px auto;
+ }
+}
+@media (-webkit-min-device-pixel-ratio: 2), (min--moz-device-pixel-ratio: 2), (min-resolution: 2dppx), (min-resolution: 192dpi) {
+ #p-logo a {
+ background-image: url("//upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Wikipedia-logo-v2-en.svg/270px-Wikipedia-logo-v2-en.svg.png") !important;
+ background-size: 135px auto;
+ }
+}
+/* Do not print:
+ 1: When in mainspace: Article message boxes,
+ navboxes, sister project boxes, disambig links,
+ and items marked as metadata.
+ 2: section edit links.
+ 3: navbar links.
+ 4: Show/hide toggles for collapsible items.
+*/
+.ns-0 .ambox,
+.ns-0 .navbox,
+.ns-0 .vertical-navbox,
+.ns-0 .infobox.sisterproject,
+.ns-0 .dablink,
+.ns-0 .metadata,
+.editlink,
+.navbar,
+a.NavToggle, span.collapseButton, span.mw-collapsible-toggle,
+th .sortkey, td .sortkey {
+ display: none !important;
+}
+
+/* Add formatting to make sure that "external references" from templates
+ like [[Template:Ref]] do not get URL expansion, not even when printed.
+ The anchor itself has class "external autonumber" and the url expansion
+ is inserted when printing (see the common printing style sheet at
+ http://en.wikipedia.org/skins-1.5/common/commonPrint.css) using the
+ ":after" pseudo-element of CSS. Also hide in <cite> elements.
+*/
+#content cite a.external.text:after,
+.nourlexpansion a.external.text:after,
+.nourlexpansion a.external.autonumber:after {
+ display: none !important;
+}
+
+/* Uncollapse collapsible tables/divs.
+ The proper way to do this for tables is to use display:table-row,
+ but this is not supported by all browsers, so use display:block as fallback.
+*/
+table.collapsible tr, div.NavPic, div.NavContent {
+ display: block !important;
+}
+table.collapsible tr {
+ display: table-row !important;
+}
+
+/* On websites with siteSub visible, the margin on the firstHeading is not needed. */
+#firstHeading {
+ margin: 0px;
+}
+
+/* We don't want very long URLs (that are added to the content in print) to widen the canvas */
+#content a.external.text:after,
+#content a.external.autonumber:after {
+ word-wrap: break-word;
+}
+/* Don't display some stuff on the main page */
+body.page-Main_Page #deleteconfirm,
+body.page-Main_Page #t-cite,
+body.page-Main_Page #footer-info-lastmod,
+body.action-view.page-Main_Page #siteSub,
+body.action-view.page-Main_Page #contentSub,
+body.action-view.page-Main_Page h1.firstHeading {
+ display: none !important;
+}
+
+/* Position Main Page top banner */
+body.page-Main_Page #mp-topbanner {
+ margin-top: 0 !important;
+}
+
+/* Position coordinates */
+#coordinates {
+ position: absolute;
+ top: 0em;
+ right: 0em;
+ float: right;
+ margin: 0em;
+ padding: 0em;
+ line-height: 1.5em;
+ text-align: right;
+ text-indent: 0;
+ font-size: 85%;
+ text-transform: none;
+ white-space: nowrap;
+}
+
+/* For positioning icons at top-right, used in Templates
+ "Spoken Article" and "Featured Article" */
+div.topicon {
+ position: absolute;
+ top: -2em;
+ margin-right: -10px;
+ display: block !important;
+}
+
+/* FR topicon position */
+div.flaggedrevs_short {
+ position: absolute;
+ top: -3em;
+ right: 80px;
+ z-index: 1;
+ margin-left: 0;
+ /* Because this is not yet a topicon, we emulate it's behavior,
+ this ensure compatibility with edit lead section gadget. */
+ margin-right: -10px;
+}
+
+/* On rtl interfaces, we need to override the defaults.
+ It is content included (so ltr), but positioned in part of the rtl interface. */
+body.rtl #protected-icon {
+ /* @noflip */
+ left: 55px;
+}
+body.rtl #spoken-icon,
+body.rtl #commons-icon {
+ /* @noflip */
+ left: 30px;
+}
+body.rtl #featured-star {
+ /* @noflip */
+ left: 10px;
+}
+
+/* Menu over FR box */
+div.vectorMenu div {
+ z-index: 2;
+}
+
+/* Display "From Wikipedia, the free encyclopedia" */
+#siteSub {
+ display: inline;
+ font-size: 92%;
+}
+
+/* Bullets for Good and Featured interwiki links */
+li.GA {
+ list-style-image: url(//upload.wikimedia.org/wikipedia/commons/4/42/Monobook-bullet-ga.png);
+}
+li.FA {
+ list-style-image: url(//upload.wikimedia.org/wikipedia/commons/d/d4/Monobook-bullet-star.png);
+}
+
+/* Styling for updated markers on watchlist, history and recent/related changes */
+li.mw-changeslist-line-watched,
+li.mw-history-line-updated {
+ list-style-image: url(//upload.wikimedia.org/wikipedia/commons/c/c2/ChangedBulletVector.png);
+}
+
+/* Blue instead of yellow padlock for secure links. */
+#bodyContent a.external[href ^="https://"],
+.link-https {
+ background: url(//upload.wikimedia.org/wikipedia/en/0/00/Lock_icon_blue.gif) center right no-repeat;
+ /* @noflip */
+ padding-right: 16px;
+}
+
+/* (Soft) redirect styling (bug:26544) */
+div.redirectMsg img {
+ vertical-align: text-bottom;
+}
+.redirectText {
+ font-size: 150%;
+ margin: 5px;
+}
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/wikipedia.min.css b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/wikipedia.min.css
new file mode 100644
index 00000000000..eecfc919430
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/wikipedia.min.css
@@ -0,0 +1 @@
+html,body{height:100%;margin:0;padding:0;font-family:sans-serif;font-size:1em}body{background-color:#f3f3f3;background-image:url(images/page-base.png)}div#content{margin-left:10em;padding:1em;background-image:url(images/border.png);background-position:top left;background-repeat:repeat-y;background-color:white;color:black;direction:ltr}#mw-page-base{height:5em;background-color:white;background-image:url(images/page-fade.png);background-position:bottom left;background-repeat:repeat-x}#mw-head-base{margin-top:-5em;margin-left:10em;height:5em;background-image:url(images/border.png);background-position:bottom left;background-repeat:repeat-x}div#mw-head{position:absolute;top:0;right:0;width:100%}div#mw-head h5{margin:0;padding:0}div.emptyPortlet{display:none}#p-personal{position:absolute;top:0;right:.75em}#p-personal h5{display:none}#p-personal ul{list-style:none;margin:0;padding-left:10em}#p-personal li{line-height:1.125em;float:left}#p-personal li{margin-left:.75em;margin-top:.5em;font-size:.75em;white-space:nowrap}#left-navigation{position:absolute;left:10em;top:2.5em}#right-navigation{float:right;margin-top:2.5em}div.vectorTabs h5,div.vectorMenu h5 span{display:none}div.vectorTabs{float:left;height:2.5em}div.vectorTabs{background-image:url(images/tab-break.png);background-position:bottom left;background-repeat:no-repeat;padding-left:1px}div.vectorTabs ul{float:left}div.vectorTabs ul{height:100%;list-style:none;margin:0;padding:0}div.vectorTabs ul li{float:left}div.vectorTabs ul li{line-height:1.125em;display:inline-block;height:100%;margin:0;padding:0;background-color:#f3f3f3;background-image:url(images/tab-normal-fade.png);background-position:bottom left;background-repeat:repeat-x;white-space:nowrap}div.vectorTabs ul>li{display:block}div.vectorTabs li.selected{background-image:url(images/tab-current-fade.png)}div.vectorTabs li a{display:inline-block;height:1.9em;padding-left:.5em;padding-right:.5em;color:#0645ad;cursor:pointer;font-size:.8em}div.vectorTabs li>a{display:block}div.vectorTabs li.icon a{background-position:bottom right;background-repeat:no-repeat}div.vectorTabs span a{display:inline-block;padding-top:1.25em}div.vectorTabs span>a{float:left;display:block}div.vectorTabs span{display:inline-block;background-image:url(images/tab-break.png);background-position:bottom right;background-repeat:no-repeat}div.vectorTabs li.selected a,div.vectorTabs li.selected a:visited{color:#333;text-decoration:none}div.vectorTabs li.new a,div.vectorTabs li.new a:visited{color:#a55858}div.vectorMenu{direction:ltr;float:left;background-image:url(images/arrow-down-icon.png);background-position:100% 60%;background-repeat:no-repeat;cursor:pointer}div.vectorMenuFocus{background-image:url(images/arrow-down-focus-icon.png);background-position:100% 60%}body.rtl div.vectorMenu{direction:rtl}div#mw-head div.vectorMenu h5{float:left;background-image:url(images/tab-break.png);background-repeat:no-repeat}div#mw-head div.vectorMenu h5{background-position:bottom left;margin-left:-1px}div#mw-head div.vectorMenu>h5{background-image:none}div#mw-head div.vectorMenu h4{display:inline-block;float:left;font-size:.8em;padding-left:.5em;padding-top:1.375em;font-weight:normal;border:none}div.vectorMenu h5 a{display:inline-block;width:24px;height:2.5em;text-decoration:none;background-image:url(images/tab-break.png);background-repeat:no-repeat}div.vectorMenu h5 a{background-position:bottom right}div.vectorMenu h5>a{display:block}div.vectorMenu div.menu{position:relative;display:none;clear:both;text-align:left}body.rtl div.vectorMenu div.menu{margin-left:24px}body.rtl div.vectorMenu>div.menu{margin-left:auto}body.rtl div.vectorMenu>div.menu,x:-moz-any-link{margin-left:23px}div.vectorMenu:hover div.menu,div.vectorMenu div.menuForceShow{display:block}div.vectorMenu ul{position:absolute;background-color:white;border:solid 1px silver;border-top-width:0;list-style:none;list-style-image:none;list-style-type:none;padding:0;margin:0;margin-left:-1px;text-align:left}div.vectorMenu ul,x:-moz-any-link{min-width:5em}div.vectorMenu ul,x:-moz-any-link,x:default{min-width:0}div.vectorMenu li{padding:0;margin:0;text-align:left;line-height:1em}div.vectorMenu li a{display:inline-block;padding:.5em;white-space:nowrap;color:#0645ad;cursor:pointer;font-size:.8em}div.vectorMenu li>a{display:block}div.vectorMenu li.selected a,div.vectorMenu li.selected a:visited{color:#333;text-decoration:none}#p-search h5{display:none}#p-search{float:left}#p-search{margin-right:.5em;margin-left:.5em}#p-search form,#p-search input{margin:0;margin-top:.4em}div#simpleSearch{display:block;width:14em;height:1.4em;margin-top:.65em;position:relative;min-height:1px;border:solid 1px #AAA;color:black;background-color:white;background-image:url(images/search-fade.png);background-position:top left;background-repeat:repeat-x}div#simpleSearch label{font-size:13px;top:.25em;direction:ltr}div#simpleSearch input{color:black;direction:ltr}div#simpleSearch input:focus{outline:none}div#simpleSearch input.placeholder{color:#999}div#simpleSearch input::-webkit-input-placeholder{color:#999}div#simpleSearch input#searchInput{position:absolute;top:0;left:0;width:90%;margin:0;padding:0;padding-left:.2em;padding-top:.2em;padding-bottom:.2em;outline:none;border:none;font-size:13px;background-color:transparent;direction:ltr}div#simpleSearch button#searchButton{position:absolute;width:10%;right:0;top:0;padding:0;padding-top:.3em;padding-bottom:.2em;padding-right:.4em;margin:0;border:none;cursor:pointer;background-color:transparent;background-image:none}div#simpleSearch button#searchButton img{border:none;margin:0;margin-top:-3px;padding:0}div#simpleSearch button#searchButton>img{margin:0}div#mw-panel{position:absolute;top:160px;padding-top:1em;width:10em;left:0}div#mw-panel div.portal{padding-bottom:1.5em;direction:ltr}div#mw-panel div.portal h5{font-weight:normal;color:#444;padding:.25em;padding-top:0;padding-left:1.75em;cursor:default;border:none;font-size:.75em}div#mw-panel div.portal div.body{margin:0;padding-top:.5em;margin-left:1.25em;background-image:url(images/portal-break.png);background-repeat:no-repeat;background-position:top left}div#mw-panel div.portal div.body ul{list-style:none;list-style-image:none;list-style-type:none;padding:0;margin:0}div#mw-panel div.portal div.body ul li{line-height:1.125em;padding:0;padding-bottom:.5em;margin:0;overflow:hidden;font-size:.75em}div#mw-panel div.portal div.body ul li a{color:#0645ad}div#mw-panel div.portal div.body ul li a:visited{color:#0b0080}div#footer{margin-left:10em;margin-top:0;padding:.75em;background-image:url(images/border.png);background-position:top left;background-repeat:repeat-x;direction:ltr}div#footer ul{list-style:none;list-style-image:none;list-style-type:none;margin:0;padding:0}div#footer ul li{margin:0;padding:0;padding-top:.5em;padding-bottom:.5em;color:#333;font-size:.7em}div#footer #footer-icons{float:right}body.ltr div#footer #footer-places{float:left}div#footer #footer-info li{line-height:1.4em}div#footer #footer-icons li{float:left;margin-left:.5em;line-height:2em;text-align:right}div#footer #footer-places li{float:left;margin-right:1em;line-height:2em}#p-logo{position:absolute;top:-160px;left:0;width:10em;height:160px}#p-logo a{display:block;width:10em;height:160px;background-repeat:no-repeat;background-position:center center;text-decoration:none}#preftoc{width:100%;float:left;clear:both;margin:0!important;padding:0!important;background-image:url(images/preferences-break.png);background-position:bottom left;background-repeat:no-repeat}#preftoc li{float:left;margin:0;padding:0;padding-right:1px;height:2.25em;white-space:nowrap;list-style-type:none;list-style-image:none;background-image:url(images/preferences-break.png);background-position:bottom right;background-repeat:no-repeat}#preftoc li:first-child{margin-left:1px}#preftoc a,#preftoc a:active{display:inline-block;position:relative;color:#0645ad;padding:.5em;text-decoration:none;background-image:none;font-size:.9em}#preftoc a:hover,#preftoc a:focus{text-decoration:underline}#preftoc li.selected a{background-image:url(images/preferences-fade.png);background-position:bottom;background-repeat:repeat-x;color:#333;text-decoration:none}#preferences{float:left;width:100%;margin:0;margin-top:-2px;clear:both;border:solid 1px #ccc;background-color:#f9f9f9;background-image:url(images/preferences-base.png)}#preferences fieldset{border:none;border-top:solid 1px #ccc}#preferences fieldset.prefsection{border:none;padding:0;margin:1em}#preferences legend{color:#666}#preferences fieldset.prefsection legend.mainLegend{display:none}#preferences td{padding-left:.5em;padding-right:.5em}#preferences td.htmlform-tip{font-size:x-small;padding:.2em 2em;color:#666}#preferences div.mw-prefs-buttons{padding:1em}#preferences div.mw-prefs-buttons input{margin-right:.25em}div#content{line-height:1.5em}#bodyContent{font-size:.8em}.editsection{float:right}ul{list-style-image:url(images/bullet-icon.png)}pre{line-height:1.3em}#siteNotice{font-size:.8em}#firstHeading{padding-top:0;margin-top:0;padding-top:0;font-size:1.6em}div#content a.external,div#content a.external[href ^="gopher://"]{background:url(images/external-link-ltr-icon.png) center right no-repeat;padding-right:13px}div#content a.external[href ^="https://"],.link-https{background:url(images/lock-icon.png) center right no-repeat;padding-right:13px}div#content a.external[href ^="mailto:"],.link-mailto{background:url(images/mail-icon.png) center right no-repeat;padding-right:13px}div#content a.external[href ^="news:"]{background:url(images/news-icon.png) center right no-repeat;padding-right:13px}div#content a.external[href ^="ftp://"],.link-ftp{background:url(images/file-icon.png) center right no-repeat;padding-right:13px}div#content a.external[href ^="irc://"],div#content a.external[href ^="ircs://"],.link-irc{background:url(images/talk-icon.png) center right no-repeat;padding-right:13px}div#content a.external[href $=".ogg"],div#content a.external[href $=".OGG"],div#content a.external[href $=".mid"],div#content a.external[href $=".MID"],div#content a.external[href $=".midi"],div#content a.external[href $=".MIDI"],div#content a.external[href $=".mp3"],div#content a.external[href $=".MP3"],div#content a.external[href $=".wav"],div#content a.external[href $=".WAV"],div#content a.external[href $=".wma"],div#content a.external[href $=".WMA"],.link-audio{background:url(images/audio-icon.png) center right no-repeat;padding-right:13px}div#content a.external[href $=".ogm"],div#content a.external[href $=".OGM"],div#content a.external[href $=".avi"],div#content a.external[href $=".AVI"],div#content a.external[href $=".mpeg"],div#content a.external[href $=".MPEG"],div#content a.external[href $=".mpg"],div#content a.external[href $=".MPG"],.link-video{background:url(images/video-icon.png) center right no-repeat;padding-right:13px}div#content a.external[href $=".pdf"],div#content a.external[href $=".PDF"],div#content a.external[href *=".pdf#"],div#content a.external[href *=".PDF#"],div#content a.external[href *=".pdf?"],div#content a.external[href *=".PDF?"],.link-document{background:url(images/document-icon.png) center right no-repeat;padding-right:13px}#pt-userpage,#pt-anonuserpage,#pt-login{background:url(images/user-icon.png) left top no-repeat;padding-left:15px!important;text-transform:none}.redirectText{font-size:140%}.redirectMsg img{vertical-align:text-bottom}#bodyContent{position:relative;width:100%}#mw-js-message{font-size:.8em}div#bodyContent{line-height:1.5em}#ca-unwatch.icon a,#ca-watch.icon a{margin:0;padding:0;outline:none;display:block;width:26px;padding-top:3.1em;margin-top:0;margin-top:-0.8em!ie;height:0;overflow:hidden;background-image:url(images/watch-icons.png)}#ca-unwatch.icon a{background-position:-43px 60%}#ca-watch.icon a{background-position:5px 60%}#ca-unwatch.icon a:hover,#ca-unwatch.icon a:focus{background-position:-67px 60%}#ca-watch.icon a:hover,#ca-watch.icon a:focus{background-position:-19px 60%}#ca-unwatch.icon a.loading,#ca-watch.icon a.loading{background-image:url(images/watch-icon-loading.gif);background-position:5px 60%}#ca-unwatch.icon a span,#ca-watch.icon a span{display:none}div.vectorTabs ul{background-image:url(images/tab-break.png);background-position:right bottom;background-repeat:no-repeat}.tipsy{font-size:.8em}.mw-content-ltr{direction:ltr}.mw-content-rtl{direction:rtl}.sitedir-ltr textarea,.sitedir-ltr input{direction:ltr}.sitedir-rtl textarea,.sitedir-rtl input{direction:rtl}input[type="submit"],input[type="button"],input[type="reset"],input[type="file"]{direction:ltr}textarea[dir="ltr"],input[dir="ltr"]{direction:ltr}textarea[dir="rtl"],input[dir="rtl"]{direction:rtl}abbr,acronym,.explain{border-bottom:1px dotted;cursor:help}.mw-plusminus-pos{color:#006400}.mw-plusminus-neg{color:#8b0000}.mw-plusminus-null{color:#aaa}.allpagesredirect,.redirect-in-category,.watchlistredir{font-style:italic}span.comment{font-style:italic}span.changedby{font-size:95%}.texvc{direction:ltr;unicode-bidi:embed}img.tex{vertical-align:middle}span.texhtml{font-family:serif}#wikiPreview.ontop{margin-bottom:1em}#editform,#toolbar,#wpTextbox1{clear:both}#toolbar img{cursor:pointer}div#mw-js-message{margin:1em 5%;padding:.5em 2.5%;border:solid 1px #ddd;background-color:#fcfcfc}.editsection{float:right;margin-left:5px}.mw-content-ltr .editsection,.mw-content-rtl .mw-content-ltr .editsection{float:right}.mw-content-rtl .editsection,.mw-content-ltr .mw-content-rtl .editsection{float:left}div.mw-filepage-resolutioninfo{font-size:smaller}h2#filehistory{clear:both}table.filehistory th,table.filehistory td{vertical-align:top}table.filehistory th{text-align:left}table.filehistory td.mw-imagepage-filesize,table.filehistory th.mw-imagepage-filesize{white-space:nowrap}table.filehistory td.filehistory-selected{font-weight:bold}.filehistory a img,#file img:hover{background:white url(images/Checker-16x16.png) repeat}li span.deleted,span.history-deleted{text-decoration:line-through;color:#888;font-style:italic}.not-patrolled{background-color:#ffa}.unpatrolled{font-weight:bold;color:red}div.patrollink{font-size:75%;text-align:right}td.mw-label{text-align:right}td.mw-input{text-align:left}td.mw-submit{text-align:left}td.mw-label{vertical-align:top}.prefsection td.mw-label{width:20%}.prefsection table{width:100%}td.mw-submit{white-space:nowrap}table.mw-htmlform-nolabel td.mw-label{width:1px}tr.mw-htmlform-vertical-label td.mw-label{text-align:left!important}.mw-htmlform-invalid-input td.mw-input input{border-color:red}.mw-htmlform-flatlist div.mw-htmlform-flatlist-item{display:inline;margin-right:1em;white-space:nowrap}input#wpSummary{width:80%}.thumbcaption{text-align:left}.magnify{float:right}#catlinks{text-align:left}.catlinks ul{display:inline;margin:0;padding:0;list-style:none;list-style-type:none;list-style-image:none;vertical-align:middle!ie}.catlinks li{display:inline-block;line-height:1.25em;border-left:1px solid #AAA;margin:.125em 0;padding:0 .5em;zoom:1;display:inline!ie}.catlinks li:first-child{padding-left:.25em;border-left:none}.mw-hidden-cats-hidden{display:none}.catlinks-allhidden{display:none}p.mw-ipb-conveniencelinks,p.mw-protect-editreasons,p.mw-filedelete-editreasons,p.mw-delete-editreasons,p.mw-revdel-editreasons{font-size:90%;text-align:right}.os-suggest{overflow:auto;overflow-x:hidden;position:absolute;top:0;left:0;width:0;background-color:white;border-style:solid;border-color:#AAA;border-width:1px;z-index:99;font-size:95%}table.os-suggest-results{font-size:95%;cursor:pointer;border:0;border-collapse:collapse;width:100%}.os-suggest-result,.os-suggest-result-hl{white-space:nowrap;background-color:white;color:black;padding:2px}.os-suggest-result-hl,.os-suggest-result-hl-webkit{background-color:#4C59A6;color:white}.os-suggest-toggle{position:relative;left:1ex;font-size:65%}.os-suggest-toggle-def{position:absolute;top:0;left:0;font-size:65%;visibility:hidden}.autocomment{color:gray}#pagehistory .history-user{margin-left:.4em;margin-right:.2em}#pagehistory span.minor{font-weight:bold}#pagehistory li{border:1px solid white}#pagehistory li.selected{background-color:#f9f9f9;border:1px dashed #aaa}.mw-history-revisiondelete-button,#mw-fileduplicatesearch-icon{float:right}.newpage,.minoredit,.botedit{font-weight:bold}#shared-image-dup,#shared-image-conflict{font-style:italic}div.mw-warning-with-logexcerpt{padding:3px;margin-bottom:3px;border:2px solid #2F6FAB;clear:both}div.mw-warning-with-logexcerpt ul li{font-size:90%}span.mw-revdelundel-link,strong.mw-revdelundel-link{font-size:90%}span.mw-revdelundel-hidden,input.mw-revdelundel-hidden{visibility:hidden}td.mw-revdel-checkbox,th.mw-revdel-checkbox{padding-right:10px;text-align:center}a.feedlink{background:url(images/feed-icon.png) center left no-repeat;padding-left:16px}.plainlinks a{background:none!important;padding:0!important}.rtl a.external.free,.rtl a.external.autonumber{direction:ltr;unicode-bidi:embed}table.wikitable{margin:1em 1em 1em 0;background-color:#f9f9f9;border:1px #aaa solid;border-collapse:collapse;color:black}table.wikitable>tr>th,table.wikitable>tr>td,table.wikitable>*>tr>th,table.wikitable>*>tr>td{border:1px #aaa solid;padding:.2em}table.wikitable>tr>th,table.wikitable>*>tr>th{background-color:#f2f2f2;text-align:center}table.wikitable>caption{font-weight:bold}table.collapsed tr.collapsable{display:none}.success{color:green;font-size:larger}.warning{color:#FFA500;font-size:larger}.error{color:red;font-size:larger}.errorbox,.warningbox,.successbox{font-size:larger;border:2px solid;padding:.5em 1em;float:left;margin-bottom:2em;color:#000}.errorbox{border-color:red;background-color:#fff2f2}.warningbox{border-color:#FF8C00;background-color:#FFFFC0}.successbox{border-color:green;background-color:#dfd}.errorbox h2,.warningbox h2,.successbox h2{font-size:1em;font-weight:bold;display:inline;margin:0 .5em 0 0;border:none}.mw-infobox{border:2px solid #ff7f00;margin:.5em;clear:left;overflow:hidden}.mw-infobox-left{margin:7px;float:left;width:35px}.mw-infobox-right{margin:.5em .5em .5em 49px}.previewnote{color:#c00;margin-bottom:1em}.previewnote p{text-indent:3em;margin:.8em 0}.visualClear{clear:both}#mw_trackbacks{border:solid 1px #bbf;background-color:#eef;padding:.2em}.mw-datatable{border-collapse:collapse}.mw-datatable,.mw-datatable td,.mw-datatable th{border:1px solid #aaa;padding:0 .15em 0 .15em}.mw-datatable th{background-color:#ddf}.mw-datatable td{background-color:#fff}.mw-datatable tr:hover td{background-color:#eef}.TablePager{min-width:80%}.TablePager_nav{margin:0 auto}.TablePager_nav td{padding:3px;text-align:center}.TablePager_nav a{text-decoration:none}.imagelist td,.imagelist th{white-space:nowrap}.imagelist .TablePager_col_links{background-color:#eef}.imagelist .TablePager_col_img_description{white-space:normal}.imagelist th.TablePager_sort{background-color:#ccf}ul#filetoc{text-align:center;border:1px solid #aaa;background-color:#f9f9f9;padding:5px;font-size:95%;margin-bottom:.5em;margin-left:0;margin-right:0}#filetoc li{display:inline;list-style-type:none;padding-right:2em}table.mw_metadata{font-size:.8em;margin-left:.5em;margin-bottom:.5em;width:400px}table.mw_metadata caption{font-weight:bold}table.mw_metadata th{font-weight:normal}table.mw_metadata td{padding:.1em}table.mw_metadata{border:none;border-collapse:collapse}table.mw_metadata td,table.mw_metadata th{text-align:center;border:1px solid #aaa;padding-left:5px;padding-right:5px}table.mw_metadata th{background-color:#f9f9f9}table.mw_metadata td{background-color:#fcfcfc}table.mw_metadata ul.metadata-langlist{list-style-type:none;list-style-image:none;padding-right:5px;padding-left:5px;margin:0}.mw-content-ltr ul,.mw-content-rtl .mw-content-ltr ul{margin:.3em 0 0 1.6em;padding:0}.mw-content-rtl ul,.mw-content-ltr .mw-content-rtl ul{margin:.3em 1.6em 0 0;padding:0}.mw-content-ltr ol,.mw-content-rtl .mw-content-ltr ol{margin:.3em 0 0 3.2em;padding:0}.mw-content-rtl ol,.mw-content-ltr .mw-content-rtl ol{margin:.3em 3.2em 0 0;padding:0}.mw-content-ltr dd,.mw-content-rtl .mw-content-ltr dd{margin-left:1.6em;margin-right:0}.mw-content-rtl dd,.mw-content-ltr .mw-content-rtl dd{margin-right:1.6em;margin-left:0}li.gallerybox{vertical-align:top;border:solid 2px white;display:-moz-inline-box;display:inline-block}ul.gallery,li.gallerybox{zoom:1;*display:inline}ul.gallery{margin:2px;padding:2px;display:block}li.gallerycaption{font-weight:bold;text-align:center;display:block;word-wrap:break-word}li.gallerybox div.thumb{text-align:center;border:1px solid #ccc;background-color:#f9f9f9;margin:2px}li.gallerybox div.thumb img{display:block;margin:0 auto}div.gallerytext{overflow:hidden;font-size:94%;padding:2px 4px;word-wrap:break-word}.mw-ajax-loader{background-image:url(images/ajax-loader.gif);background-position:center center;background-repeat:no-repeat;padding:16px;position:relative;top:-16px}.mw-small-spinner{padding:10px!important;margin-right:.6em;background-image:url(images/spinner.gif);background-position:center center;background-repeat:no-repeat}h1:lang(as),h1:lang(bh),h1:lang(bho),h1:lang(bn),h1:lang(gu),h1:lang(hi),h1:lang(kn),h1:lang(ml),h1:lang(mr),h1:lang(or),h1:lang(pa),h1:lang(sa),h1:lang(ta),h1:lang(te){line-height:1.5em!important}h2:lang(as),h3:lang(as),h4:lang(as),h5:lang(as),h6:lang(as),h2:lang(bho),h3:lang(bho),h4:lang(bho),h5:lang(bho),h6:lang(bho),h2:lang(bh),h3:lang(bh),h4:lang(bh),h5:lang(bh),h6:lang(bh),h2:lang(bn),h3:lang(bn),h4:lang(bn),h5:lang(bn),h6:lang(bn),h2:lang(gu),h3:lang(gu),h4:lang(gu),h5:lang(gu),h6:lang(gu),h2:lang(hi),h3:lang(hi),h4:lang(hi),h5:lang(hi),h6:lang(hi),h2:lang(kn),h3:lang(kn),h4:lang(kn),h5:lang(kn),h6:lang(kn),h2:lang(ml),h3:lang(ml),h4:lang(ml),h5:lang(ml),h6:lang(ml),h2:lang(mr),h3:lang(mr),h4:lang(mr),h5:lang(mr),h6:lang(mr),h2:lang(or),h3:lang(or),h4:lang(or),h5:lang(or),h6:lang(or),h2:lang(pa),h3:lang(pa),h4:lang(pa),h5:lang(pa),h6:lang(pa),h2:lang(sa),h3:lang(sa),h4:lang(sa),h5:lang(sa),h6:lang(sa),h2:lang(ta),h3:lang(ta),h4:lang(ta),h5:lang(ta),h6:lang(ta),h2:lang(te),h3:lang(te),h4:lang(te),h5:lang(te),h6:lang(te){line-height:1.2em}ol:lang(bcc) li,ol:lang(bqi) li,ol:lang(fa) li,ol:lang(glk) li,ol:lang(kk-arab) li,ol:lang(mzn) li{list-style-type:-moz-persian;list-style-type:persian}ol:lang(ckb) li{list-style-type:-moz-arabic-indic;list-style-type:arabic-indic}ol:lang(hi) li,ol:lang(mr) li{list-style-type:-moz-devanagari;list-style-type:devanagari}ol:lang(as) li,ol:lang(bn) li{list-style-type:-moz-bengali;list-style-type:bengali}ol:lang(or) li{list-style-type:-moz-oriya;list-style-type:oriya}#toc ul,.toc ul{margin:.3em 0}.mw-content-ltr .toc ul,.mw-content-ltr #toc ul,.mw-content-rtl .mw-content-ltr .toc ul,.mw-content-rtl .mw-content-ltr #toc ul{text-align:left}.mw-content-rtl .toc ul,.mw-content-rtl #toc ul,.mw-content-ltr .mw-content-rtl .toc ul,.mw-content-ltr .mw-content-rtl #toc ul{text-align:right}.mw-content-ltr .toc ul ul,.mw-content-ltr #toc ul ul,.mw-content-rtl .mw-content-ltr .toc ul ul,.mw-content-rtl .mw-content-ltr #toc ul ul{margin:0 0 0 2em}.mw-content-rtl .toc ul ul,.mw-content-rtl #toc ul ul,.mw-content-ltr .mw-content-rtl .toc ul ul,.mw-content-ltr .mw-content-rtl #toc ul ul{margin:0 2em 0 0}#toc #toctitle,.toc #toctitle,#toc .toctitle,.toc .toctitle{direction:ltr}.mw-help-field-hint{display:none;margin-left:2px;margin-bottom:-8px;padding:0 0 0 15px;background-image:url('images/help-question.gif');background-position:left center;background-repeat:no-repeat;cursor:pointer;font-size:.8em;text-decoration:underline;color:#0645ad}.mw-help-field-hint:hover{background-image:url('images/help-question-hover.gif')}.mw-help-field-data{display:block;background-color:#d6f3ff;padding:5px 8px 4px 8px;border:1px solid #5dc9f4;margin-left:20px}.tipsy{padding:5px 5px 10px;font-size:12px;position:absolute;z-index:100000;overflow:visible}.tipsy-inner{padding:5px 8px 4px 8px;background-color:#d6f3ff;color:black;border:1px solid #5dc9f4;max-width:300px;text-align:left}.tipsy-arrow{position:absolute;background:url(images/tipsy-arrow.gif) no-repeat top left;width:13px;height:13px}.tipsy-se .tipsy-arrow{bottom:-2px;right:10px;background-position:0 100%}#mw-clearyourcache,#mw-sitecsspreview,#mw-sitejspreview,#mw-usercsspreview,#mw-userjspreview{direction:ltr;unicode-bidi:embed}.diff-currentversion-title,.diff{direction:ltr;unicode-bidi:embed}.diff-contentalign-right td{direction:rtl;unicode-bidi:embed}.diff-contentalign-left td{direction:ltr;unicode-bidi:embed}.diff-otitle,.diff-ntitle,.diff-lineno{direction:ltr!important;unicode-bidi:embed}#mw-revision-info,#mw-revision-info-current,#mw-revision-nav{direction:ltr;display:inline}div.tright,div.floatright,table.floatright{clear:right;float:right}div.tleft,div.floatleft,table.floatleft{float:left;clear:left}div.floatright,table.floatright,div.floatleft,table.floatleft{position:relative}#mw-credits a{unicode-bidi:embed}.mw-jump,#jump-to-nav{overflow:hidden;height:0;zoom:1}.printfooter{display:none}.xdebug-error{position:absolute;z-index:99}.editsection,.toctoggle{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}a.stub,a.new{color:#ba0000;text-decoration:none}#toc{border:1px solid #aaa;background-color:#f9f9f9;padding:5px}div.floatright{float:right;clear:right;position:relative;margin:.5em 0 .8em 1.4em}div.floatright p{font-style:italic}div.floatleft{float:left;clear:left;position:relative;margin:.5em 1.4em .8em 0}div.floatleft p{font-style:italic}div.center{text-align:center}div.thumb{border:none;width:auto;margin-top:.5em;margin-bottom:.8em;background-color:transparent}div.thumbinner{border:1px solid #ccc;padding:3px!important;background-color:White;font-size:94%;text-align:center;overflow:hidden}html .thumbimage{border:1px solid #ccc}html .thumbcaption{border:none;text-align:left;line-height:1.4em;padding:3px!important;font-size:94%}div.magnify{display:none}div.tright{float:right;clear:right;margin:.5em 0 .8em 1.4em}div.tleft{float:left;clear:left;margin:.5em 1.4em .8em 0}img.thumbborder{border:1px solid #ddd}table.rimage{float:right;width:1pt;position:relative;margin-left:1em;margin-bottom:1em;text-align:center}body{background:white;color:black;margin:0;padding:0}.noprint,div#jump-to-nav,.mw-jump,div.top,div#column-one,#colophon,.editsection,.toctoggle,.tochidden,div#f-poweredbyico,div#f-copyrightico,li#viewcount,li#about,li#disclaimer,li#mobileview,li#privacy,#footer-places,.mw-hidden-catlinks,tr.mw-metadata-show-hide-extended,span.mw-filepage-other-resolutions,#filetoc{display:none}ul{list-style-type:square}#content{background:none;border:none!important;padding:0!important;margin:0!important;direction:ltr}#footer{background:white;color:black;margin-top:1em;border-top:1px solid #AAA;direction:ltr}h1,h2,h3,h4,h5,h6{font-weight:bold}p{margin:1em 0;line-height:1.2em}pre{border:1pt dashed black;white-space:pre;font-size:8pt;overflow:auto;padding:1em 0;background:white;color:black}table.listing,table.listing td{border:1pt solid black;border-collapse:collapse}a{color:black!important;background:none!important;padding:0!important}a:link,a:visited{color:#520;background:transparent;text-decoration:underline}#content a.external.text:after,#content a.external.autonumber:after{content:"(" attr(href) ") "}#globalWrapper{width:100%!important;min-width:0!important}#content{background:white;color:black}#column-content{margin:0!important}#column-content #content{padding:1em;margin:0!important}a,a.external,a.new,a.stub{color:black!important;text-decoration:none!important}a,a.external,a.new,a.stub{color:inherit!important;text-decoration:inherit!important}img{border:none;vertical-align:middle}span.texhtml{font-family:serif}#siteNotice{display:none}li.gallerybox{vertical-align:top;border:solid 2px white;display:-moz-inline-box;display:inline-block}ul.gallery,li.gallerybox{zoom:1;*display:inline}ul.gallery{margin:2px;padding:2px;display:block}li.gallerycaption{font-weight:bold;text-align:center;display:block;word-wrap:break-word}li.gallerybox div.thumb{text-align:center;border:1px solid #ccc;margin:2px}div.gallerytext{overflow:hidden;font-size:94%;padding:2px 4px;word-wrap:break-word}table.diff{background:white}td.diff-otitle{background:#fff}td.diff-ntitle{background:#fff}td.diff-addedline{background:#cfc;font-size:smaller;border:solid 2px black}td.diff-deletedline{background:#ffa;font-size:smaller;border:dotted 2px black}td.diff-context{background:#eee;font-size:smaller}.diffchange{color:silver;font-weight:bold;text-decoration:underline}table.wikitable,table.mw_metadata{margin:1em 1em 1em 0;border:1px #aaa solid;background:white;border-collapse:collapse}table.wikitable>tr>th,table.wikitable>tr>td,table.wikitable>*>tr>th,table.wikitable>*>tr>td,.mw_metadata th,.mw_metadata td{border:1px #aaa solid;padding:.2em}table.wikitable>tr>th,table.wikitable>*>tr>th,.mw_metadata th{text-align:center;background:white;font-weight:bold}table.wikitable>caption,.mw_metadata caption{font-weight:bold}a.sortheader{margin:0 .3em}.wikitable,.thumb,img{page-break-inside:avoid}h2,h3,h4,h5,h6,h7{page-break-after:avoid}p{widows:3;orphans:3}.catlinks ul{display:inline;margin:0;padding:0;list-style:none;list-style-type:none;list-style-image:none;vertical-align:middle!ie}.catlinks li{display:inline-block;line-height:1.15em;padding:0 .4em;border-left:1px solid #AAA;margin:.1em 0;zoom:1;display:inline!ie}.catlinks li:first-child{padding-left:.2em;border-left:none}dfn{font-style:inherit}sup,sub{line-height:1em}#interwiki-completelist{font-weight:bold}body.page-Main_Page #ca-delete{display:none!important}body.page-Main_Page #mp-topbanner{clear:both}#toolbar{height:22px;margin-bottom:6px}body.action-info :target{background:#DEF}ol.references,div.reflist,div.refbegin{font-size:90%;margin-bottom:.5em}div.refbegin-100{font-size:100%}div.reflist ol.references{font-size:100%;list-style-type:inherit}div.columns{margin-top:.3em}div.columns dl,div.columns ol,div.columns ul{margin-top:0}div.columns li,div.columns dd dd{-webkit-column-break-inside:avoid;page-break-inside:avoid;break-inside:avoid-column}ol.references li:target,sup.reference:target,span.citation:target{background-color:#DEF}sup.reference{font-weight:normal;font-style:normal}span.brokenref{display:none}.citation{word-wrap:break-word}@media screen,handheld{.citation *.printonly{display:none}}.flowlist ul{overflow-x:hidden;margin-left:0;padding-left:1.6em}.flowlist ol{overflow-x:hidden;margin-left:0;padding-left:3.2em}.flowlist dl{overflow-x:hidden}.hlist dl,.hlist ol,.hlist ul{margin:0;padding:0}.hlist dd,.hlist dt,.hlist li{margin:0;display:inline}.hlist dl dl,.hlist dl ol,.hlist dl ul,.hlist ol dl,.hlist ol ol,.hlist ol ul,.hlist ul dl,.hlist ul ol,.hlist ul ul{display:inline}.hlist dt:after{content:":"}.hlist dd:after,.hlist li:after{content:" · ";font-weight:bold}.hlist dd:last-child:after,.hlist dt:last-child:after,.hlist li:last-child:after{content:none}.hlist dd.hlist-last-child:after,.hlist dt.hlist-last-child:after,.hlist li.hlist-last-child:after{content:none}.hlist dd dd:first-child:before,.hlist dd dt:first-child:before,.hlist dd li:first-child:before,.hlist dt dd:first-child:before,.hlist dt dt:first-child:before,.hlist dt li:first-child:before,.hlist li dd:first-child:before,.hlist li dt:first-child:before,.hlist li li:first-child:before{content:"(";font-weight:normal}.hlist dd dd:last-child:after,.hlist dd dt:last-child:after,.hlist dd li:last-child:after,.hlist dt dd:last-child:after,.hlist dt dt:last-child:after,.hlist dt li:last-child:after,.hlist li dd:last-child:after,.hlist li dt:last-child:after,.hlist li li:last-child:after{content:") ";font-weight:normal}.hlist dd dd.hlist-last-child:after,.hlist dd dt.hlist-last-child:after,.hlist dd li.hlist-last-child:after,.hlist dt dd.hlist-last-child:after,.hlist dt dt.hlist-last-child:after,.hlist dt li.hlist-last-child:after,.hlist li dd.hlist-last-child:after,.hlist li dt.hlist-last-child:after,.hlist li li.hlist-last-child:after{content:") ";font-weight:normal}.hlist ol{counter-reset:listitem}.hlist ol>li{counter-increment:listitem}.hlist ol>li:before{content:" " counter(listitem) " "}.hlist dd ol>li:first-child:before,.hlist dt ol>li:first-child:before,.hlist li ol>li:first-child:before{content:"(" counter(listitem) " "}.plainlist ul{line-height:inherit;list-style:none none;margin:0}.plainlist ul li{margin-bottom:0}.navbox{border:1px solid #aaa;width:100%;margin:auto;clear:both;font-size:88%;text-align:center;padding:1px}.navbox-inner,.navbox-subgroup{width:100%}.navbox-group,.navbox-title,.navbox-abovebelow{padding:.25em 1em;line-height:1.5em;text-align:center}th.navbox-group{white-space:nowrap;text-align:right}.navbox,.navbox-subgroup{background:#fdfdfd}.navbox-list{line-height:1.8em;border-color:#fdfdfd}.navbox th,.navbox-title{background:#ccf}.navbox-abovebelow,th.navbox-group,.navbox-subgroup .navbox-title{background:#ddf}.navbox-subgroup .navbox-group,.navbox-subgroup .navbox-abovebelow{background:#e6e6ff}.navbox-even{background:#f7f7f7}.navbox-odd{background:transparent}table.navbox+table.navbox{margin-top:-1px}.navbox .hlist td dl,.navbox .hlist td ol,.navbox .hlist td ul,.navbox td.hlist dl,.navbox td.hlist ol,.navbox td.hlist ul{padding:.125em 0}ol+table.navbox,ul+table.navbox{margin-top:.5em}.navbar{display:inline;font-size:88%;font-weight:normal}.navbar ul{display:inline;white-space:nowrap}.navbar li{word-spacing:-0.125em}.navbar.mini li span{font-variant:small-caps}.infobox .navbar{font-size:100%}.navbox .navbar{display:block;font-size:100%}.navbox-title .navbar{float:left;text-align:left;margin-right:.5em;width:6em}.collapseButton{float:right;font-weight:normal;margin-left:.5em;text-align:right;width:auto}.navbox .collapseButton{width:6em}.mw-collapsible-toggle{font-weight:normal;text-align:right}.navbox .mw-collapsible-toggle{width:6em}.infobox{border:1px solid #aaa;background-color:#f9f9f9;color:black;margin:.5em 0 .5em 1em;padding:.2em;float:right;clear:right;text-align:left;font-size:88%;line-height:1.5em}.infobox caption{font-size:125%;font-weight:bold}.infobox td,.infobox th{vertical-align:top}.infobox.bordered{border-collapse:collapse}.infobox.bordered td,.infobox.bordered th{border:1px solid #aaa}.infobox.bordered .borderless td,.infobox.bordered .borderless th{border:0}.infobox.sisterproject{width:20em;font-size:90%}.infobox.standard-talk{border:1px solid #c0c090;background-color:#f8eaba}.infobox.standard-talk.bordered td,.infobox.standard-talk.bordered th{border:1px solid #c0c090}.infobox.bordered .mergedtoprow td,.infobox.bordered .mergedtoprow th{border:0;border-top:1px solid #aaa;border-right:1px solid #aaa}.infobox.bordered .mergedrow td,.infobox.bordered .mergedrow th{border:0;border-right:1px solid #aaa}.infobox.geography{border-collapse:collapse;line-height:1.2em;font-size:90%}.infobox.geography td,.infobox.geography th{border-top:1px solid #aaa;padding:.4em .6em .4em .6em}.infobox.geography .mergedtoprow td,.infobox.geography .mergedtoprow th{border-top:1px solid #aaa;padding:.4em .6em .2em .6em}.infobox.geography .mergedrow td,.infobox.geography .mergedrow th{border:0;padding:0 .6em .2em .6em}.infobox.geography .mergedbottomrow td,.infobox.geography .mergedbottomrow th{border-top:0;border-bottom:1px solid #aaa;padding:0 .6em .4em .6em}.infobox.geography .maptable td,.infobox.geography .maptable th{border:0;padding:0}.wikitable.plainrowheaders th[scope=row]{font-weight:normal;text-align:left}.wikitable td ul,.wikitable td ol,.wikitable td dl{text-align:left}.wikitable.hlist td ul,.wikitable.hlist td ol,.wikitable.hlist td dl{text-align:inherit}div.listenlist{background:url("//upload.wikimedia.org/wikipedia/commons/4/47/Sound-icon.svg") no-repeat scroll 0 0 transparent;background-size:30px;padding-left:40px}table.mw-hiero-table td{vertical-align:middle}div.medialist{min-height:50px;margin:1em;background-position:top left;background-repeat:no-repeat}div.medialist ul{list-style-type:none;list-style-image:none;margin:0}div.medialist ul li{padding-bottom:.5em}div.medialist ul li li{font-size:91%;padding-bottom:0}div#content a[href$=".pdf"].external,div#content a[href*=".pdf?"].external,div#content a[href*=".pdf#"].external,div#content a[href$=".PDF"].external,div#content a[href*=".PDF?"].external,div#content a[href*=".PDF#"].external,div#mw_content a[href$=".pdf"].external,div#mw_content a[href*=".pdf?"].external,div#mw_content a[href*=".pdf#"].external,div#mw_content a[href$=".PDF"].external,div#mw_content a[href*=".PDF?"].external,div#mw_content a[href*=".PDF#"].external{background:url("//upload.wikimedia.org/wikipedia/commons/2/23/Icons-mini-file_acrobat.gif") no-repeat right;padding-right:18px}div#content span.PDFlink a,div#mw_content span.PDFlink a{background:url("//upload.wikimedia.org/wikipedia/commons/2/23/Icons-mini-file_acrobat.gif") no-repeat right;padding-right:18px}div.columns-2 div.column{float:left;width:50%;min-width:300px}div.columns-3 div.column{float:left;width:33.3%;min-width:200px}div.columns-4 div.column{float:left;width:25%;min-width:150px}div.columns-5 div.column{float:left;width:20%;min-width:120px}.messagebox{border:1px solid #aaa;background-color:#f9f9f9;width:80%;margin:0 auto 1em auto;padding:.2em}.messagebox.merge{border:1px solid #c0b8cc;background-color:#f0e5ff;text-align:center}.messagebox.cleanup{border:1px solid #9f9fff;background-color:#efefff;text-align:center}.messagebox.standard-talk{border:1px solid #c0c090;background-color:#f8eaba;margin:4px auto}.mbox-inside .standard-talk,.messagebox.nested-talk{border:1px solid #c0c090;background-color:#f8eaba;width:100%;margin:2px 0;padding:2px}.messagebox.small{width:238px;font-size:85%;float:right;clear:both;margin:0 0 1em 1em;line-height:1.25em}.messagebox.small-talk{width:238px;font-size:85%;float:right;clear:both;margin:0 0 1em 1em;line-height:1.25em;background:#F8EABA}th.mbox-text,td.mbox-text{border:none;padding:.25em .9em;width:100%}td.mbox-image{border:none;padding:2px 0 2px .9em;text-align:center}td.mbox-imageright{border:none;padding:2px .9em 2px 0;text-align:center}td.mbox-empty-cell{border:none;padding:0;width:1px}table.ambox{margin:0 10%;border:1px solid #aaa;border-left:10px solid #1e90ff;background:#fbfbfb}table.ambox+table.ambox{margin-top:-1px}.ambox th.mbox-text,.ambox td.mbox-text{padding:.25em .5em}.ambox td.mbox-image{padding:2px 0 2px .5em}.ambox td.mbox-imageright{padding:2px .5em 2px 0}table.ambox-notice{border-left:10px solid #1e90ff}table.ambox-speedy{border-left:10px solid #b22222;background:#fee}table.ambox-delete{border-left:10px solid #b22222}table.ambox-content{border-left:10px solid #f28500}table.ambox-style{border-left:10px solid #f4c430}table.ambox-move{border-left:10px solid #9932cc}table.ambox-protection{border-left:10px solid #bba}table.imbox{margin:4px 10%;border-collapse:collapse;border:3px solid #1e90ff;background:#fbfbfb}.imbox .mbox-text .imbox{margin:0 -0.5em;display:block}.mbox-inside .imbox{margin:4px}table.imbox-notice{border:3px solid #1e90ff}table.imbox-speedy{border:3px solid #b22222;background:#fee}table.imbox-delete{border:3px solid #b22222}table.imbox-content{border:3px solid #f28500}table.imbox-style{border:3px solid #f4c430}table.imbox-move{border:3px solid #9932cc}table.imbox-protection{border:3px solid #bba}table.imbox-license{border:3px solid #88a;background:#f7f8ff}table.imbox-featured{border:3px solid #cba135}table.cmbox{margin:3px 10%;border-collapse:collapse;border:1px solid #aaa;background:#DFE8FF}table.cmbox-notice{background:#D8E8FF}table.cmbox-speedy{margin-top:4px;margin-bottom:4px;border:4px solid #b22222;background:#FFDBDB}table.cmbox-delete{background:#FFDBDB}table.cmbox-content{background:#FFE7CE}table.cmbox-style{background:#FFF9DB}table.cmbox-move{background:#E4D8FF}table.cmbox-protection{background:#EFEFE1}table.ombox{margin:4px 10%;border-collapse:collapse;border:1px solid #aaa;background:#f9f9f9}table.ombox-notice{border:1px solid #aaa}table.ombox-speedy{border:2px solid #b22222;background:#fee}table.ombox-delete{border:2px solid #b22222}table.ombox-content{border:1px solid #f28500}table.ombox-style{border:1px solid #f4c430}table.ombox-move{border:1px solid #9932cc}table.ombox-protection{border:2px solid #bba}table.tmbox{margin:4px 10%;border-collapse:collapse;border:1px solid #c0c090;background:#f8eaba}.mediawiki .mbox-inside .tmbox{margin:2px 0;width:100%}.mbox-inside .tmbox.mbox-small{line-height:1.5em;font-size:100%}table.tmbox-speedy{border:2px solid #b22222;background:#fee}table.tmbox-delete{border:2px solid #b22222}table.tmbox-content{border:2px solid #f28500}table.tmbox-style{border:2px solid #f4c430}table.tmbox-move{border:2px solid #9932cc}table.tmbox-protection,table.tmbox-notice{border:1px solid #c0c090}table.dmbox{clear:both;margin:.9em 1em;border-top:1px solid #ccc;border-bottom:1px solid #ccc;background:transparent}table.fmbox{clear:both;margin:.2em 0;width:100%;border:1px solid #aaa;background:#f9f9f9}table.fmbox-system{background:#f9f9f9}table.fmbox-warning{border:1px solid #bb7070;background:#ffdbdb}table.fmbox-editnotice{background:transparent}div.mw-warning-with-logexcerpt,div.mw-lag-warn-high,div.mw-cascadeprotectedwarning,div#mw-protect-cascadeon{clear:both;margin:.2em 0;border:1px solid #bb7070;background:#ffdbdb;padding:.25em .9em}div.mw-lag-warn-normal,div.fmbox-system{clear:both;margin:.2em 0;border:1px solid #aaa;background:#f9f9f9;padding:.25em .9em}body.mediawiki table.mbox-small{clear:right;float:right;margin:4px 0 4px 1em;width:238px;font-size:88%;line-height:1.25em}body.mediawiki table.mbox-small-left{margin:4px 1em 4px 0;width:238px;border-collapse:collapse;font-size:88%;line-height:1.25em}.compact-ambox table .mbox-image,.compact-ambox table .mbox-imageright,.compact-ambox table .mbox-empty-cell{display:none}.compact-ambox table.ambox{border:none;border-collapse:collapse;background:transparent;margin:0 0 0 1.6em!important;padding:0!important;width:auto;display:block}body.mediawiki .compact-ambox table.mbox-small-left{font-size:100%;width:auto;margin:0}.compact-ambox table .mbox-text{padding:0!important;margin:0!important}.compact-ambox table .mbox-text-span{display:list-item;line-height:1.5em;list-style-type:square;list-style-image:url(//bits.wikimedia.org/skins/common/images/bullet.gif)}.skin-vector .compact-ambox table .mbox-text-span{list-style-type:circle;list-style-image:url(//bits.wikimedia.org/skins/vector/images/bullet-icon.png)}.compact-ambox .hide-when-compact{display:none}div.noarticletext{border:none;background:transparent;padding:0}.visualhide{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}#wpSave{font-weight:bold}.hiddenStructure{display:inline!important;color:#f00;background-color:#0f0}.check-icon a.new{display:none;speak:none}.nounderlines a,.IPA a:link,.IPA a:visited{text-decoration:none!important}div.NavFrame{margin:0;padding:4px;border:1px solid #aaa;text-align:center;border-collapse:collapse;font-size:95%}div.NavFrame+div.NavFrame{border-top-style:none;border-top-style:hidden}div.NavPic{background-color:#fff;margin:0;padding:2px;float:left}div.NavFrame div.NavHead{height:1.6em;font-weight:bold;background-color:#ccf;position:relative}div.NavFrame p,div.NavFrame div.NavContent,div.NavFrame div.NavContent p{font-size:100%}div.NavEnd{margin:0;padding:0;line-height:1px;clear:both}a.NavToggle{position:absolute;top:0;right:3px;font-weight:normal;font-size:90%}.rellink,.dablink{font-style:italic;padding-left:1.6em;margin-bottom:.5em}.rellink i,.dablink i{font-style:normal}.listify td{display:list-item}.listify tr{display:block}.listify table{display:block}.geo-default,.geo-dms,.geo-dec{display:inline}.geo-nondefault,.geo-multi-punct{display:none}.longitude,.latitude{white-space:nowrap}.nonumtoc .tocnumber{display:none}.nonumtoc #toc ul,.nonumtoc .toc ul{line-height:1.5em;list-style:none none;margin:.3em 0 0;padding:0}.nonumtoc #toc ul ul,.nonumtoc .toc ul ul{margin:0 0 0 2em}.toclimit-2 .toclevel-1 ul,.toclimit-3 .toclevel-2 ul,.toclimit-4 .toclevel-3 ul,.toclimit-5 .toclevel-4 ul,.toclimit-6 .toclevel-5 ul,.toclimit-7 .toclevel-6 ul{display:none}blockquote.templatequote{margin-top:0}blockquote.templatequote div.templatequotecite{line-height:1em;text-align:left;padding-left:2em;margin-top:0}blockquote.templatequote div.templatequotecite cite{font-size:85%}div.user-block{padding:5px;margin-bottom:.5em;border:1px solid #A9A9A9;background-color:#FFEFD5}.nowrap,.nowraplinks a,.nowraplinks .selflink,sup.reference a{white-space:nowrap}.wrap,.wraplinks a{white-space:normal}.template-documentation{clear:both;margin:1em 0 0 0;border:1px solid #aaa;background-color:#ecfcf4;padding:1em}.imagemap-inline div{display:inline}#wpUploadDescription{height:13em}.thumbinner{min-width:100px}div.thumb .thumbimage{background-color:#fff}div#content .gallerybox div.thumb{background-color:#F9F9F9}.gallerybox .thumb img{background:#fff url(//bits.wikimedia.org/skins/common/images/Checker-16x16.png) repeat}.ns-0 .gallerybox .thumb img,.ns-2 .gallerybox .thumb img,.ns-100 .gallerybox .thumb img,.nochecker .gallerybox .thumb img{background:#fff}#mw-subcategories,#mw-pages,#mw-category-media,#filehistory,#wikiPreview,#wikiDiff{clear:both}body.rtl #mw-articlefeedbackv5,body.rtl #mw-articlefeedback{display:block;margin-bottom:1em;clear:right;float:right}.wpb .wpb-header{display:none}.wpbs-inner .wpb .wpb-header{display:block}.wpbs-inner .wpb .wpb-header{display:table-row}.wpbs-inner .wpb-outside{display:none}.mw-tag-markers{font-family:sans-serif;font-style:italic;font-size:90%}.sysop-show,.accountcreator-show,.templateeditor-show,.autoconfirmed-show{display:none}.ve-init-mw-viewPageTarget-toolbar-editNotices-notice .editnotice-redlink{display:none!important}ul.permissions-errors>li{list-style:none none}ul.permissions-errors{margin:0}body.page-Special_UserLogin .mw-label label,body.page-Special_UserLogin_signup .mw-label label{white-space:nowrap}.transborder{border:solid transparent}* html .transborder{border:solid #000001;filter:chroma(color=#000001)}.updatedmarker{background-color:transparent;color:#006400}li.mw-changeslist-line-watched .mw-title,table.mw-changeslist-line-watched .mw-title,table.mw-enhanced-watch .mw-enhanced-rctime{font-weight:normal}span.texhtml{font-family:"Times New Roman","Nimbus Roman No9 L",Times,serif;font-size:118%;white-space:nowrap}span.texhtml span.texhtml{font-size:100%}div.mw-geshi div,div.mw-geshi div pre,span.mw-geshi,pre.source-css,pre.source-javascript,pre.source-lua{font-family:monospace,Courier!important}table#mw-prefixindex-list-table,table#mw-prefixindex-nav-table{width:98%}.portal-column-left{float:left;width:50%}.portal-column-right{float:right;width:49%}.portal-column-left-wide{float:left;width:60%}.portal-column-right-narrow{float:right;width:39%}.portal-column-left-extra-wide{float:left;width:70%}.portal-column-right-extra-narrow{float:right;width:29%}@media only screen and (max-width:800px){.portal-column-left,.portal-column-right,.portal-column-left-wide,.portal-column-right-narrow,.portal-column-left-extra-wide,.portal-column-right-extra-narrow{float:inherit;width:inherit}}#bodyContent .letterhead{background-image:url('//upload.wikimedia.org/wikipedia/commons/e/e0/Tan-page-corner.png');background-repeat:no-repeat;padding:2em;background-color:#faf9f2}.treeview ul{padding:0;margin:0}.treeview li{padding:0;margin:0;list-style-type:none;list-style-image:none;zoom:1}.treeview li li{background:url("//upload.wikimedia.org/wikipedia/commons/f/f2/Treeview-grey-line.png") no-repeat 0 -2981px;padding-left:20px;text-indent:.3em}.treeview li li.lastline{background-position:0 -5971px}.treeview li.emptyline>ul{margin-left:-1px}.treeview li.emptyline>ul>li:first-child{background-position:0 9px}td .sortkey,th .sortkey{display:none;speak:none}.inputbox-hidecheckboxes form .inputbox-element{display:none!important}#editpage-specialchars{display:none}.k-player .k-attribution{visibility:hidden}@media(-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(min-resolution:1.5dppx),(min-resolution:144dpi){#p-logo a{background-image:url("//upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Wikipedia-logo-v2-en.svg/204px-Wikipedia-logo-v2-en.svg.png")!important;background-size:136px auto}}@media(-webkit-min-device-pixel-ratio:2),(min--moz-device-pixel-ratio:2),(min-resolution:2dppx),(min-resolution:192dpi){#p-logo a{background-image:url("//upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Wikipedia-logo-v2-en.svg/270px-Wikipedia-logo-v2-en.svg.png")!important;background-size:135px auto}}.ns-0 .ambox,.ns-0 .navbox,.ns-0 .vertical-navbox,.ns-0 .infobox.sisterproject,.ns-0 .dablink,.ns-0 .metadata,.editlink,.navbar,a.NavToggle,span.collapseButton,span.mw-collapsible-toggle,th .sortkey,td .sortkey{display:none!important}#content cite a.external.text:after,.nourlexpansion a.external.text:after,.nourlexpansion a.external.autonumber:after{display:none!important}table.collapsible tr,div.NavPic,div.NavContent{display:block!important}table.collapsible tr{display:table-row!important}#firstHeading{margin:0}#content a.external.text:after,#content a.external.autonumber:after{word-wrap:break-word}body.page-Main_Page #deleteconfirm,body.page-Main_Page #t-cite,body.page-Main_Page #footer-info-lastmod,body.action-view.page-Main_Page #siteSub,body.action-view.page-Main_Page #contentSub,body.action-view.page-Main_Page h1.firstHeading{display:none!important}body.page-Main_Page #mp-topbanner{margin-top:0!important}#coordinates{position:absolute;top:0;right:0;float:right;margin:0;padding:0;line-height:1.5em;text-align:right;text-indent:0;font-size:85%;text-transform:none;white-space:nowrap}div.topicon{position:absolute;top:-2em;margin-right:-10px;display:block!important}div.flaggedrevs_short{position:absolute;top:-3em;right:80px;z-index:1;margin-left:0;margin-right:-10px}body.rtl #protected-icon{left:55px}body.rtl #spoken-icon,body.rtl #commons-icon{left:30px}body.rtl #featured-star{left:10px}div.vectorMenu div{z-index:2}#siteSub{display:inline;font-size:92%}li.GA{list-style-image:url(//upload.wikimedia.org/wikipedia/commons/4/42/Monobook-bullet-ga.png)}li.FA{list-style-image:url(//upload.wikimedia.org/wikipedia/commons/d/d4/Monobook-bullet-star.png)}li.mw-changeslist-line-watched,li.mw-history-line-updated{list-style-image:url(//upload.wikimedia.org/wikipedia/commons/c/c2/ChangedBulletVector.png)}#bodyContent a.external[href ^="https://"],.link-https{background:url(//upload.wikimedia.org/wikipedia/en/0/00/Lock_icon_blue.gif) center right no-repeat;padding-right:16px}div.redirectMsg img{vertical-align:text-bottom}.redirectText{font-size:150%;margin:5px} \ No newline at end of file
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/write.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/write.py
new file mode 100644
index 00000000000..939e11d5910
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/write.py
@@ -0,0 +1,344 @@
+#!/usr/bin/env python
+# -*- coding: ascii -*-
+r"""
+=========================
+ Write benchmark results
+=========================
+
+Write benchmark results.
+
+:Copyright:
+
+ Copyright 2014
+ Andr\xe9 Malo or his licensors, as applicable
+
+:License:
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+Usage::
+
+ python -mbench.write [-p plain] [-t table] <pickled
+
+ -p plain Plain file to write to (like docs/BENCHMARKS).
+ -t table Table file to write to (like docs/_userdoc/benchmark.txt).
+
+"""
+if __doc__:
+ __doc__ = __doc__.encode('ascii').decode('unicode_escape')
+__author__ = r"Andr\xe9 Malo".encode('ascii').decode('unicode_escape')
+__docformat__ = "restructuredtext en"
+__license__ = "Apache License, Version 2.0"
+__version__ = "1.0.0"
+
+import os as _os
+import re as _re
+import sys as _sys
+
+
+try:
+ unicode
+except NameError:
+ def uni(v):
+ if hasattr(v, 'decode'):
+ return v.decode('latin-1')
+ return str(v)
+else:
+ def uni(v):
+ if isinstance(v, unicode):
+ return v.encode('utf-8')
+ return str(v)
+
+
+def write_table(filename, results):
+ """
+ Output tabled benchmark results
+
+ :Parameters:
+ `filename` : ``str``
+ Filename to write to
+
+ `results` : ``list``
+ Results
+ """
+ try:
+ next
+ except NameError:
+ next = lambda i: (getattr(i, 'next', None) or i.__next__)()
+ try:
+ cmp
+ except NameError:
+ cmp = lambda a, b: (a > b) - (a < b)
+
+ names = [
+ ('cssmin', 'YUI Port'),
+ ('rcssmin', '|rcssmin|'),
+ ('_rcssmin', r'_\ |rcssmin|'),
+ ]
+ benched_per_table = 2
+
+ results = sorted(results, reverse=True)
+
+ # First we transform our data into a table (list of lists)
+ pythons, widths = [], [0] * (benched_per_table + 1)
+ last_version = None
+ for version, _, result in results:
+ version = uni(version)
+ if not(last_version is None or version.startswith('2.')):
+ continue
+ last_version = version
+
+ namesub = _re.compile(r'(?:-\d+(?:\.\d+)*)?\.css$').sub
+ result = iter(result)
+ tables = []
+
+ # given our data it's easier to create the table transposed...
+ for benched in result:
+ rows = [['Name'] + [desc for _, desc in names]]
+ for _ in range(benched_per_table):
+ if _:
+ try:
+ benched = next(result)
+ except StopIteration:
+ rows.append([''] + ['' for _ in names])
+ continue
+
+ times = dict((
+ uni(port), (time, benched['sizes'][idx])
+ ) for idx, (port, time) in enumerate(benched['times']))
+ columns = ['%s (%.1f)' % (
+ namesub('', _os.path.basename(uni(benched['filename']))),
+ benched['size'] / 1024.0,
+ )]
+ for idx, (port, _) in enumerate(names):
+ if port not in times:
+ columns.append('n/a')
+ continue
+ time, size = times[port]
+ if time is None:
+ columns.append('(failed)')
+ continue
+ columns.append('%s%.2f ms (%.1f %s)' % (
+ idx == 0 and ' ' or '',
+ time,
+ size / 1024.0,
+ idx == 0 and '\\*' or ['=', '>', '<'][
+ cmp(size, benched['sizes'][0])
+ ],
+ ))
+ rows.append(columns)
+
+ # calculate column widths (global for all tables)
+ for idx, row in enumerate(rows):
+ widths[idx] = max(widths[idx], max(map(len, row)))
+
+ # ... and transpose it back.
+ tables.append(zip(*rows))
+ pythons.append((version, tables))
+
+ if last_version.startswith('2.'):
+ break
+
+ # Second we create a rest table from it
+ lines = []
+ separator = lambda c='-': '+'.join([''] + [
+ c * (width + 2) for width in widths
+ ] + [''])
+
+ for idx, (version, tables) in enumerate(pythons):
+ if idx:
+ lines.append('')
+ lines.append('')
+
+ line = 'Python %s' % (version,)
+ lines.append(line)
+ lines.append('~' * len(line))
+
+ for table in tables:
+ lines.append('')
+ lines.append('.. rst-class:: benchmark')
+ lines.append('')
+
+ for idx, row in enumerate(table):
+ if idx == 0:
+ # header
+ lines.append(separator())
+ lines.append('|'.join([''] + [
+ ' %s%*s ' % (col, len(col) - width, '')
+ for width, col in zip(widths, row)
+ ] + ['']))
+ lines.append(separator('='))
+ else: # data
+ lines.append('|'.join([''] + [
+ j == 0 and (
+ ' %s%*s ' % (col, len(col) - widths[j], '')
+ ) or (
+ ['%*s ', ' %*s '][idx == 1] % (widths[j], col)
+ )
+ for j, col in enumerate(row)
+ ] + ['']))
+ lines.append(separator())
+
+ fplines = []
+ fp = open(filename)
+ try:
+ fpiter = iter(fp)
+ for line in fpiter:
+ line = line.rstrip()
+ if line == '.. begin tables':
+ buf = []
+ for line in fpiter:
+ line = line.rstrip()
+ if line == '.. end tables':
+ fplines.append('.. begin tables')
+ fplines.append('')
+ fplines.extend(lines)
+ fplines.append('')
+ fplines.append('.. end tables')
+ buf = []
+ break
+ else:
+ buf.append(line)
+ else:
+ fplines.extend(buf)
+ _sys.stderr.write("Placeholder container not found!\n")
+ else:
+ fplines.append(line)
+ finally:
+ fp.close()
+
+ fp = open(filename, 'w')
+ try:
+ fp.write('\n'.join(fplines) + '\n')
+ finally:
+ fp.close()
+
+
+def write_plain(filename, results):
+ """
+ Output plain benchmark results
+
+ :Parameters:
+ `filename` : ``str``
+ Filename to write to
+
+ `results` : ``list``
+ Results
+ """
+ lines = []
+ results = sorted(results, reverse=True)
+ for idx, (version, import_notes, result) in enumerate(results):
+ if idx:
+ lines.append('')
+ lines.append('')
+
+ lines.append('$ python%s -OO bench/main.py bench/*.css' % (
+ '.'.join(version.split('.')[:2])
+ ))
+ lines.append('~' * 72)
+ for note in import_notes:
+ lines.append(uni(note))
+ lines.append('Python Release: %s' % (version,))
+
+ for single in result:
+ lines.append('')
+ lines.append('Benchmarking %r... (%.1f KiB)' % (
+ uni(single['filename']), single['size'] / 1024.0
+ ))
+ for msg in single['messages']:
+ lines.append(msg)
+ times = []
+ space = max([len(uni(port)) for port, _ in single['times']])
+ for idx, (port, time) in enumerate(single['times']):
+ port = uni(port)
+ if time is None:
+ lines.append(" FAILED %s" % (port,))
+ else:
+ times.append(time)
+ lines.append(
+ " Timing %s%s ... (%5.1f KiB %s) %8.2f ms" % (
+ port,
+ " " * (space - len(port)),
+ single['sizes'][idx] / 1024.0,
+ idx == 0 and '*' or ['=', '>', '<'][
+ cmp(single['sizes'][idx], single['sizes'][0])
+ ],
+ time
+ )
+ )
+ if len(times) > 1:
+ lines[-1] += " (factor: %s)" % (', '.join([
+ '%.2f' % (timed / time) for timed in times[:-1]
+ ]))
+
+ lines.append('')
+ lines.append('')
+ lines.append('# vim: nowrap')
+ fp = open(filename, 'w')
+ try:
+ fp.write('\n'.join(lines) + '\n')
+ finally:
+ fp.close()
+
+
+def main(argv=None):
+ """ Main """
+ import getopt as _getopt
+ import pickle as _pickle
+
+ if argv is None:
+ argv = _sys.argv[1:]
+ try:
+ opts, args = _getopt.getopt(argv, "hp:t:", ["help"])
+ except getopt.GetoptError:
+ e = _sys.exc_info()[0](_sys.exc_info()[1])
+ print >> _sys.stderr, "%s\nTry %s -mbench.write --help" % (
+ e,
+ _os.path.basename(_sys.executable),
+ )
+ _sys.exit(2)
+
+ plain, table = None, None
+ for key, value in opts:
+ if key in ("-h", "--help"):
+ print >> _sys.stderr, (
+ "%s -mbench.write [-p plain] [-t table] <pickled" % (
+ _os.path.basename(_sys.executable),
+ )
+ )
+ _sys.exit(0)
+ elif key == '-p':
+ plain = str(value)
+ elif key == '-t':
+ table = str(value)
+
+ struct = []
+ _sys.stdin = getattr(_sys.stdin, 'detach', lambda: _sys.stdin)()
+ try:
+ while True:
+ version, import_notes, result = _pickle.load(_sys.stdin)
+ if hasattr(version, 'decode'):
+ version = version.decode('latin-1')
+ struct.append((version, import_notes, result))
+ except EOFError:
+ pass
+
+ if plain:
+ write_plain(plain, struct)
+
+ if table:
+ write_table(table, struct)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/BENCHMARKS b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/BENCHMARKS
new file mode 100644
index 00000000000..9a49e9b51bf
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/BENCHMARKS
@@ -0,0 +1,61 @@
+$ python3.4 -OO bench/main.py bench/*.css
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Python Release: 3.4.2
+
+Benchmarking 'bench/wikipedia.css'... (81.0 KiB)
+ Timing cssmin ... ( 49.4 KiB *) 163.11 ms
+ Timing rcssmin ... ( 49.6 KiB >) 45.48 ms (factor: 3.59)
+ Timing _rcssmin ... ( 49.6 KiB >) 0.43 ms (factor: 378.93, 105.66)
+
+Benchmarking 'bench/wikipedia.min.css'... (49.4 KiB)
+ Timing cssmin ... ( 49.4 KiB *) 119.00 ms
+ Timing rcssmin ... ( 49.4 KiB =) 20.94 ms (factor: 5.68)
+ Timing _rcssmin ... ( 49.4 KiB =) 0.26 ms (factor: 454.45, 79.98)
+
+
+$ python3.3 -OO bench/main.py bench/*.css
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Python Release: 3.3.5
+
+Benchmarking 'bench/wikipedia.css'... (81.0 KiB)
+ Timing cssmin ... ( 49.4 KiB *) 185.01 ms
+ Timing rcssmin ... ( 49.6 KiB >) 59.30 ms (factor: 3.12)
+ Timing _rcssmin ... ( 49.6 KiB >) 0.52 ms (factor: 356.38, 114.23)
+
+Benchmarking 'bench/wikipedia.min.css'... (49.4 KiB)
+ Timing cssmin ... ( 49.4 KiB *) 136.26 ms
+ Timing rcssmin ... ( 49.4 KiB =) 25.51 ms (factor: 5.34)
+ Timing _rcssmin ... ( 49.4 KiB =) 0.26 ms (factor: 515.24, 96.47)
+
+
+$ python3.2 -OO bench/main.py bench/*.css
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Python Release: 3.2.5
+
+Benchmarking 'bench/wikipedia.css'... (81.0 KiB)
+ Timing cssmin ... ( 49.4 KiB *) 225.32 ms
+ Timing rcssmin ... ( 49.6 KiB >) 57.51 ms (factor: 3.92)
+ Timing _rcssmin ... ( 49.6 KiB >) 0.43 ms (factor: 527.98, 134.77)
+
+Benchmarking 'bench/wikipedia.min.css'... (49.4 KiB)
+ Timing cssmin ... ( 49.4 KiB *) 129.43 ms
+ Timing rcssmin ... ( 49.4 KiB =) 24.45 ms (factor: 5.29)
+ Timing _rcssmin ... ( 49.4 KiB =) 0.25 ms (factor: 526.94, 99.55)
+
+
+$ python2.7 -OO bench/main.py bench/*.css
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Python Release: 2.7.7
+
+Benchmarking 'bench/wikipedia.css'... (81.0 KiB)
+ Timing cssmin ... ( 49.4 KiB *) 175.98 ms
+ Timing rcssmin ... ( 49.6 KiB >) 46.22 ms (factor: 3.81)
+ Timing _rcssmin ... ( 49.6 KiB >) 0.45 ms (factor: 390.95, 102.68)
+
+Benchmarking 'bench/wikipedia.min.css'... (49.4 KiB)
+ Timing cssmin ... ( 49.4 KiB *) 126.19 ms
+ Timing rcssmin ... ( 49.4 KiB =) 19.92 ms (factor: 6.33)
+ Timing _rcssmin ... ( 49.4 KiB =) 0.27 ms (factor: 469.78, 74.17)
+
+
+# vim: nowrap
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/CHANGES b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/CHANGES
new file mode 100644
index 00000000000..e179dce99dd
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/CHANGES
@@ -0,0 +1,42 @@
+Changes with version 1.0.5
+
+ *) Added support for pypy 2.2
+
+ *) Updated benchmarks
+
+ *) Relint with newer pylint
+
+ *) Fix locale problem with the setup script on python3.
+ Submitted by https://github.com/svenstaro
+
+
+Changes with version 1.0.4
+
+ *) Documentation and benchmark updates
+
+
+Changes with version 1.0.3
+
+ *) Added support for the following grouping @-rules:
+ @supports, @document, @keyframes
+
+ *) Added support for Python 3.4 and Jython 2.7
+
+
+Changes with version 1.0.2
+
+ *) Added compat option to setup.py supporting the pip installer
+
+ *) Added support for pypy (1.9, 2.0)
+
+ *) Added support for jython (2.5)
+
+
+Changes with version 1.0.1
+
+ *) Added support for Python 3.3
+
+
+Changes with version 1.0.0
+
+ *) First stable release.
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/CLASSIFIERS b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/CLASSIFIERS
new file mode 100644
index 00000000000..10d59650380
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/CLASSIFIERS
@@ -0,0 +1,19 @@
+Development Status :: 5 - Production/Stable
+Environment :: Web Environment
+Intended Audience :: Developers
+License :: OSI Approved
+License :: OSI Approved :: Apache License, Version 2.0
+Operating System :: OS Independent
+Programming Language :: C
+Programming Language :: Python
+Programming Language :: Python :: 2
+Programming Language :: Python :: 3
+Programming Language :: Python :: Implementation :: CPython
+Programming Language :: Python :: Implementation :: Jython
+Programming Language :: Python :: Implementation :: PyPy
+Topic :: Internet :: WWW/HTTP :: Dynamic Content
+Topic :: Software Development :: Libraries
+Topic :: Software Development :: Libraries :: Python Modules
+Topic :: Text Processing
+Topic :: Text Processing :: Filters
+Topic :: Utilities
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/DESCRIPTION b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/DESCRIPTION
new file mode 100644
index 00000000000..b51a7fdb837
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/DESCRIPTION
@@ -0,0 +1,85 @@
+==============
+ CSS Minifier
+==============
+
+RCSSmin is a CSS minifier.
+
+The minifier is based on the semantics of the `YUI compressor`_\, which itself
+is based on `the rule list by Isaac Schlueter`_\.
+
+This module is a re-implementation aiming for speed instead of maximum
+compression, so it can be used at runtime (rather than during a preprocessing
+step). RCSSmin does syntactical compression only (removing spaces, comments
+and possibly semicolons). It does not provide semantic compression (like
+removing empty blocks, collapsing redundant properties etc). It does, however,
+support various CSS hacks (by keeping them working as intended).
+
+Here's a feature list:
+
+- Strings are kept, except that escaped newlines are stripped
+- Space/Comments before the very end or before various characters are
+ stripped: ``:{});=>+],!`` (The colon (``:``) is a special case, a single
+ space is kept if it's outside a ruleset.)
+- Space/Comments at the very beginning or after various characters are
+ stripped: ``{}(=:>+[,!``
+- Optional space after unicode escapes is kept, resp. replaced by a simple
+ space
+- whitespaces inside ``url()`` definitions are stripped
+- Comments starting with an exclamation mark (``!``) can be kept optionally.
+- All other comments and/or whitespace characters are replaced by a single
+ space.
+- Multiple consecutive semicolons are reduced to one
+- The last semicolon within a ruleset is stripped
+- CSS Hacks supported:
+
+ - IE7 hack (``>/**/``)
+ - Mac-IE5 hack (``/*\*/.../**/``)
+ - The boxmodelhack is supported naturally because it relies on valid CSS2
+ strings
+ - Between ``:first-line`` and the following comma or curly brace a space is
+ inserted. (apparently it's needed for IE6)
+ - Same for ``:first-letter``
+
+rcssmin.c is a reimplementation of rcssmin.py in C and improves runtime up to
+factor 100 or so (depending on the input). docs/BENCHMARKS in the source
+distribution contains the details.
+
+Both python 2 (>= 2.4) and python 3 are supported.
+
+.. _YUI compressor: https://github.com/yui/yuicompressor/
+
+.. _the rule list by Isaac Schlueter: https://github.com/isaacs/cssmin/
+
+
+Copyright and License
+~~~~~~~~~~~~~~~~~~~~~
+
+Copyright 2011 - 2014
+André Malo or his licensors, as applicable.
+
+The whole package (except for the files in the bench/ directory) is
+distributed under the Apache License Version 2.0. You'll find a copy in the
+root directory of the distribution or online at:
+<http://www.apache.org/licenses/LICENSE-2.0>.
+
+
+Bugs
+~~~~
+
+No bugs, of course. ;-)
+But if you've found one or have an idea how to improve rcssmin, feel free
+to send a pull request on `github <https://github.com/ndparker/rcssmin>`_
+or send a mail to <rcssmin-bugs@perlig.de>.
+
+
+Author Information
+~~~~~~~~~~~~~~~~~~
+
+André "nd" Malo <nd perlig.de>
+GPG: 0x8103A37E
+
+
+ If God intended people to be naked, they would be born that way.
+ -- Oscar Wilde
+
+.. vim:tw=72 syntax=rest
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/PROVIDES b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/PROVIDES
new file mode 100644
index 00000000000..d6d4e9ebe93
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/PROVIDES
@@ -0,0 +1 @@
+rcssmin (1.0)
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/SUMMARY b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/SUMMARY
new file mode 100644
index 00000000000..490e5373442
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/SUMMARY
@@ -0,0 +1 @@
+CSS Minifier
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/api-objects.txt b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/api-objects.txt
new file mode 100644
index 00000000000..f4ed223ee65
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/api-objects.txt
@@ -0,0 +1,6 @@
+rcssmin rcssmin-module.html
+rcssmin.__license__ rcssmin-module.html#__license__
+rcssmin._make_cssmin rcssmin-module.html#_make_cssmin
+rcssmin.__doc__ rcssmin-module.html#__doc__
+rcssmin.__package__ rcssmin-module.html#__package__
+rcssmin.cssmin rcssmin-module.html#cssmin
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/crarr.png b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/crarr.png
new file mode 100644
index 00000000000..26b43c52433
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/crarr.png
Binary files differ
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/epydoc.css b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/epydoc.css
new file mode 100644
index 00000000000..86d41706824
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/epydoc.css
@@ -0,0 +1,322 @@
+
+
+/* Epydoc CSS Stylesheet
+ *
+ * This stylesheet can be used to customize the appearance of epydoc's
+ * HTML output.
+ *
+ */
+
+/* Default Colors & Styles
+ * - Set the default foreground & background color with 'body'; and
+ * link colors with 'a:link' and 'a:visited'.
+ * - Use bold for decision list terms.
+ * - The heading styles defined here are used for headings *within*
+ * docstring descriptions. All headings used by epydoc itself use
+ * either class='epydoc' or class='toc' (CSS styles for both
+ * defined below).
+ */
+body { background: #ffffff; color: #000000; }
+p { margin-top: 0.5em; margin-bottom: 0.5em; }
+a:link { color: #0000ff; }
+a:visited { color: #204080; }
+dt { font-weight: bold; }
+h1 { font-size: +140%; font-style: italic;
+ font-weight: bold; }
+h2 { font-size: +125%; font-style: italic;
+ font-weight: bold; }
+h3 { font-size: +110%; font-style: italic;
+ font-weight: normal; }
+code { font-size: 100%; }
+/* N.B.: class, not pseudoclass */
+a.link { font-family: monospace; }
+
+/* Page Header & Footer
+ * - The standard page header consists of a navigation bar (with
+ * pointers to standard pages such as 'home' and 'trees'); a
+ * breadcrumbs list, which can be used to navigate to containing
+ * classes or modules; options links, to show/hide private
+ * variables and to show/hide frames; and a page title (using
+ * <h1>). The page title may be followed by a link to the
+ * corresponding source code (using 'span.codelink').
+ * - The footer consists of a navigation bar, a timestamp, and a
+ * pointer to epydoc's homepage.
+ */
+h1.epydoc { margin: 0; font-size: +140%; font-weight: bold; }
+h2.epydoc { font-size: +130%; font-weight: bold; }
+h3.epydoc { font-size: +115%; font-weight: bold;
+ margin-top: 0.2em; }
+td h3.epydoc { font-size: +115%; font-weight: bold;
+ margin-bottom: 0; }
+table.navbar { background: #a0c0ff; color: #000000;
+ border: 2px groove #c0d0d0; }
+table.navbar table { color: #000000; }
+th.navbar-select { background: #70b0ff;
+ color: #000000; }
+table.navbar a { text-decoration: none; }
+table.navbar a:link { color: #0000ff; }
+table.navbar a:visited { color: #204080; }
+span.breadcrumbs { font-size: 85%; font-weight: bold; }
+span.options { font-size: 70%; }
+span.codelink { font-size: 85%; }
+td.footer { font-size: 85%; }
+
+/* Table Headers
+ * - Each summary table and details section begins with a 'header'
+ * row. This row contains a section title (marked by
+ * 'span.table-header') as well as a show/hide private link
+ * (marked by 'span.options', defined above).
+ * - Summary tables that contain user-defined groups mark those
+ * groups using 'group header' rows.
+ */
+td.table-header { background: #70b0ff; color: #000000;
+ border: 1px solid #608090; }
+td.table-header table { color: #000000; }
+td.table-header table a:link { color: #0000ff; }
+td.table-header table a:visited { color: #204080; }
+span.table-header { font-size: 120%; font-weight: bold; }
+th.group-header { background: #c0e0f8; color: #000000;
+ text-align: left; font-style: italic;
+ font-size: 115%;
+ border: 1px solid #608090; }
+
+/* Summary Tables (functions, variables, etc)
+ * - Each object is described by a single row of the table with
+ * two cells. The left cell gives the object's type, and is
+ * marked with 'code.summary-type'. The right cell gives the
+ * object's name and a summary description.
+ * - CSS styles for the table's header and group headers are
+ * defined above, under 'Table Headers'
+ */
+table.summary { border-collapse: collapse;
+ background: #e8f0f8; color: #000000;
+ border: 1px solid #608090;
+ margin-bottom: 0.5em; }
+td.summary { border: 1px solid #608090; }
+code.summary-type { font-size: 85%; }
+table.summary a:link { color: #0000ff; }
+table.summary a:visited { color: #204080; }
+
+
+/* Details Tables (functions, variables, etc)
+ * - Each object is described in its own div.
+ * - A single-row summary table w/ table-header is used as
+ * a header for each details section (CSS style for table-header
+ * is defined above, under 'Table Headers').
+ */
+table.details { border-collapse: collapse;
+ background: #e8f0f8; color: #000000;
+ border: 1px solid #608090;
+ margin: .2em 0 0 0; }
+table.details table { color: #000000; }
+table.details a:link { color: #0000ff; }
+table.details a:visited { color: #204080; }
+
+/* Fields */
+dl.fields { margin-left: 2em; margin-top: 1em;
+ margin-bottom: 1em; }
+dl.fields dd ul { margin-left: 0em; padding-left: 0em; }
+dl.fields dd ul li ul { margin-left: 2em; padding-left: 0em; }
+div.fields { margin-left: 2em; }
+div.fields p { margin-bottom: 0.5em; }
+
+/* Index tables (identifier index, term index, etc)
+ * - link-index is used for indices containing lists of links
+ * (namely, the identifier index & term index).
+ * - index-where is used in link indices for the text indicating
+ * the container/source for each link.
+ * - metadata-index is used for indices containing metadata
+ * extracted from fields (namely, the bug index & todo index).
+ */
+table.link-index { border-collapse: collapse;
+ background: #e8f0f8; color: #000000;
+ border: 1px solid #608090; }
+td.link-index { border-width: 0px; }
+table.link-index a:link { color: #0000ff; }
+table.link-index a:visited { color: #204080; }
+span.index-where { font-size: 70%; }
+table.metadata-index { border-collapse: collapse;
+ background: #e8f0f8; color: #000000;
+ border: 1px solid #608090;
+ margin: .2em 0 0 0; }
+td.metadata-index { border-width: 1px; border-style: solid; }
+table.metadata-index a:link { color: #0000ff; }
+table.metadata-index a:visited { color: #204080; }
+
+/* Function signatures
+ * - sig* is used for the signature in the details section.
+ * - .summary-sig* is used for the signature in the summary
+ * table, and when listing property accessor functions.
+ * */
+.sig-name { color: #006080; }
+.sig-arg { color: #008060; }
+.sig-default { color: #602000; }
+.summary-sig { font-family: monospace; }
+.summary-sig-name { color: #006080; font-weight: bold; }
+table.summary a.summary-sig-name:link
+ { color: #006080; font-weight: bold; }
+table.summary a.summary-sig-name:visited
+ { color: #006080; font-weight: bold; }
+.summary-sig-arg { color: #006040; }
+.summary-sig-default { color: #501800; }
+
+/* Subclass list
+ */
+ul.subclass-list { display: inline; }
+ul.subclass-list li { display: inline; }
+
+/* To render variables, classes etc. like functions */
+table.summary .summary-name { color: #006080; font-weight: bold;
+ font-family: monospace; }
+table.summary
+ a.summary-name:link { color: #006080; font-weight: bold;
+ font-family: monospace; }
+table.summary
+ a.summary-name:visited { color: #006080; font-weight: bold;
+ font-family: monospace; }
+
+/* Variable values
+ * - In the 'variable details' sections, each varaible's value is
+ * listed in a 'pre.variable' box. The width of this box is
+ * restricted to 80 chars; if the value's repr is longer than
+ * this it will be wrapped, using a backslash marked with
+ * class 'variable-linewrap'. If the value's repr is longer
+ * than 3 lines, the rest will be ellided; and an ellipsis
+ * marker ('...' marked with 'variable-ellipsis') will be used.
+ * - If the value is a string, its quote marks will be marked
+ * with 'variable-quote'.
+ * - If the variable is a regexp, it is syntax-highlighted using
+ * the re* CSS classes.
+ */
+pre.variable { padding: .5em; margin: 0;
+ background: #dce4ec; color: #000000;
+ border: 1px solid #708890; }
+.variable-linewrap { color: #604000; font-weight: bold; }
+.variable-ellipsis { color: #604000; font-weight: bold; }
+.variable-quote { color: #604000; font-weight: bold; }
+.variable-group { color: #008000; font-weight: bold; }
+.variable-op { color: #604000; font-weight: bold; }
+.variable-string { color: #006030; }
+.variable-unknown { color: #a00000; font-weight: bold; }
+.re { color: #000000; }
+.re-char { color: #006030; }
+.re-op { color: #600000; }
+.re-group { color: #003060; }
+.re-ref { color: #404040; }
+
+/* Base tree
+ * - Used by class pages to display the base class hierarchy.
+ */
+pre.base-tree { font-size: 80%; margin: 0; }
+
+/* Frames-based table of contents headers
+ * - Consists of two frames: one for selecting modules; and
+ * the other listing the contents of the selected module.
+ * - h1.toc is used for each frame's heading
+ * - h2.toc is used for subheadings within each frame.
+ */
+h1.toc { text-align: center; font-size: 105%;
+ margin: 0; font-weight: bold;
+ padding: 0; }
+h2.toc { font-size: 100%; font-weight: bold;
+ margin: 0.5em 0 0 -0.3em; }
+
+/* Syntax Highlighting for Source Code
+ * - doctest examples are displayed in a 'pre.py-doctest' block.
+ * If the example is in a details table entry, then it will use
+ * the colors specified by the 'table pre.py-doctest' line.
+ * - Source code listings are displayed in a 'pre.py-src' block.
+ * Each line is marked with 'span.py-line' (used to draw a line
+ * down the left margin, separating the code from the line
+ * numbers). Line numbers are displayed with 'span.py-lineno'.
+ * The expand/collapse block toggle button is displayed with
+ * 'a.py-toggle' (Note: the CSS style for 'a.py-toggle' should not
+ * modify the font size of the text.)
+ * - If a source code page is opened with an anchor, then the
+ * corresponding code block will be highlighted. The code
+ * block's header is highlighted with 'py-highlight-hdr'; and
+ * the code block's body is highlighted with 'py-highlight'.
+ * - The remaining py-* classes are used to perform syntax
+ * highlighting (py-string for string literals, py-name for names,
+ * etc.)
+ */
+pre.py-doctest { padding: .5em; margin: 1em;
+ background: #e8f0f8; color: #000000;
+ border: 1px solid #708890; }
+table pre.py-doctest { background: #dce4ec;
+ color: #000000; }
+pre.py-src { border: 2px solid #000000;
+ background: #f0f0f0; color: #000000; }
+.py-line { border-left: 2px solid #000000;
+ margin-left: .2em; padding-left: .4em; }
+.py-lineno { font-style: italic; font-size: 90%;
+ padding-left: .5em; }
+a.py-toggle { text-decoration: none; }
+div.py-highlight-hdr { border-top: 2px solid #000000;
+ border-bottom: 2px solid #000000;
+ background: #d8e8e8; }
+div.py-highlight { border-bottom: 2px solid #000000;
+ background: #d0e0e0; }
+.py-prompt { color: #005050; font-weight: bold;}
+.py-more { color: #005050; font-weight: bold;}
+.py-string { color: #006030; }
+.py-comment { color: #003060; }
+.py-keyword { color: #600000; }
+.py-output { color: #404040; }
+.py-name { color: #000050; }
+.py-name:link { color: #000050 !important; }
+.py-name:visited { color: #000050 !important; }
+.py-number { color: #005000; }
+.py-defname { color: #000060; font-weight: bold; }
+.py-def-name { color: #000060; font-weight: bold; }
+.py-base-class { color: #000060; }
+.py-param { color: #000060; }
+.py-docstring { color: #006030; }
+.py-decorator { color: #804020; }
+/* Use this if you don't want links to names underlined: */
+/*a.py-name { text-decoration: none; }*/
+
+/* Graphs & Diagrams
+ * - These CSS styles are used for graphs & diagrams generated using
+ * Graphviz dot. 'img.graph-without-title' is used for bare
+ * diagrams (to remove the border created by making the image
+ * clickable).
+ */
+img.graph-without-title { border: none; }
+img.graph-with-title { border: 1px solid #000000; }
+span.graph-title { font-weight: bold; }
+span.graph-caption { }
+
+/* General-purpose classes
+ * - 'p.indent-wrapped-lines' defines a paragraph whose first line
+ * is not indented, but whose subsequent lines are.
+ * - The 'nomargin-top' class is used to remove the top margin (e.g.
+ * from lists). The 'nomargin' class is used to remove both the
+ * top and bottom margin (but not the left or right margin --
+ * for lists, that would cause the bullets to disappear.)
+ */
+p.indent-wrapped-lines { padding: 0 0 0 7em; text-indent: -7em;
+ margin: 0; }
+.nomargin-top { margin-top: 0; }
+.nomargin { margin-top: 0; margin-bottom: 0; }
+
+/* HTML Log */
+div.log-block { padding: 0; margin: .5em 0 .5em 0;
+ background: #e8f0f8; color: #000000;
+ border: 1px solid #000000; }
+div.log-error { padding: .1em .3em .1em .3em; margin: 4px;
+ background: #ffb0b0; color: #000000;
+ border: 1px solid #000000; }
+div.log-warning { padding: .1em .3em .1em .3em; margin: 4px;
+ background: #ffffb0; color: #000000;
+ border: 1px solid #000000; }
+div.log-info { padding: .1em .3em .1em .3em; margin: 4px;
+ background: #b0ffb0; color: #000000;
+ border: 1px solid #000000; }
+h2.log-hdr { background: #70b0ff; color: #000000;
+ margin: 0; padding: 0em 0.5em 0em 0.5em;
+ border-bottom: 1px solid #000000; font-size: 110%; }
+p.log { font-weight: bold; margin: .5em 0 .5em 0; }
+tr.opt-changed { color: #000000; font-weight: bold; }
+tr.opt-default { color: #606060; }
+pre.log { margin: 0; padding: 0; padding-left: 1em; }
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/epydoc.js b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/epydoc.js
new file mode 100644
index 00000000000..e787dbcf471
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/epydoc.js
@@ -0,0 +1,293 @@
+function toggle_private() {
+ // Search for any private/public links on this page. Store
+ // their old text in "cmd," so we will know what action to
+ // take; and change their text to the opposite action.
+ var cmd = "?";
+ var elts = document.getElementsByTagName("a");
+ for(var i=0; i<elts.length; i++) {
+ if (elts[i].className == "privatelink") {
+ cmd = elts[i].innerHTML;
+ elts[i].innerHTML = ((cmd && cmd.substr(0,4)=="show")?
+ "hide&nbsp;private":"show&nbsp;private");
+ }
+ }
+ // Update all DIVs containing private objects.
+ var elts = document.getElementsByTagName("div");
+ for(var i=0; i<elts.length; i++) {
+ if (elts[i].className == "private") {
+ elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"none":"block");
+ }
+ else if (elts[i].className == "public") {
+ elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"block":"none");
+ }
+ }
+ // Update all table rows containing private objects. Note, we
+ // use "" instead of "block" becaue IE & firefox disagree on what
+ // this should be (block vs table-row), and "" just gives the
+ // default for both browsers.
+ var elts = document.getElementsByTagName("tr");
+ for(var i=0; i<elts.length; i++) {
+ if (elts[i].className == "private") {
+ elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"none":"");
+ }
+ }
+ // Update all list items containing private objects.
+ var elts = document.getElementsByTagName("li");
+ for(var i=0; i<elts.length; i++) {
+ if (elts[i].className == "private") {
+ elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?
+ "none":"");
+ }
+ }
+ // Update all list items containing private objects.
+ var elts = document.getElementsByTagName("ul");
+ for(var i=0; i<elts.length; i++) {
+ if (elts[i].className == "private") {
+ elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"none":"block");
+ }
+ }
+ // Set a cookie to remember the current option.
+ document.cookie = "EpydocPrivate="+cmd;
+ }
+function show_private() {
+ var elts = document.getElementsByTagName("a");
+ for(var i=0; i<elts.length; i++) {
+ if (elts[i].className == "privatelink") {
+ cmd = elts[i].innerHTML;
+ if (cmd && cmd.substr(0,4)=="show")
+ toggle_private();
+ }
+ }
+ }
+function getCookie(name) {
+ var dc = document.cookie;
+ var prefix = name + "=";
+ var begin = dc.indexOf("; " + prefix);
+ if (begin == -1) {
+ begin = dc.indexOf(prefix);
+ if (begin != 0) return null;
+ } else
+ { begin += 2; }
+ var end = document.cookie.indexOf(";", begin);
+ if (end == -1)
+ { end = dc.length; }
+ return unescape(dc.substring(begin + prefix.length, end));
+ }
+function setFrame(url1, url2) {
+ parent.frames[1].location.href = url1;
+ parent.frames[2].location.href = url2;
+ }
+function checkCookie() {
+ var cmd=getCookie("EpydocPrivate");
+ if (cmd && cmd.substr(0,4)!="show" && location.href.indexOf("#_") < 0)
+ toggle_private();
+ }
+function toggleCallGraph(id) {
+ var elt = document.getElementById(id);
+ if (elt.style.display == "none")
+ elt.style.display = "block";
+ else
+ elt.style.display = "none";
+ }
+function expand(id) {
+ var elt = document.getElementById(id+"-expanded");
+ if (elt) elt.style.display = "block";
+ var elt = document.getElementById(id+"-expanded-linenums");
+ if (elt) elt.style.display = "block";
+ var elt = document.getElementById(id+"-collapsed");
+ if (elt) { elt.innerHTML = ""; elt.style.display = "none"; }
+ var elt = document.getElementById(id+"-collapsed-linenums");
+ if (elt) { elt.innerHTML = ""; elt.style.display = "none"; }
+ var elt = document.getElementById(id+"-toggle");
+ if (elt) { elt.innerHTML = "-"; }
+}
+
+function collapse(id) {
+ var elt = document.getElementById(id+"-expanded");
+ if (elt) elt.style.display = "none";
+ var elt = document.getElementById(id+"-expanded-linenums");
+ if (elt) elt.style.display = "none";
+ var elt = document.getElementById(id+"-collapsed-linenums");
+ if (elt) { elt.innerHTML = "<br />"; elt.style.display="block"; }
+ var elt = document.getElementById(id+"-toggle");
+ if (elt) { elt.innerHTML = "+"; }
+ var elt = document.getElementById(id+"-collapsed");
+ if (elt) {
+ elt.style.display = "block";
+
+ var indent = elt.getAttribute("indent");
+ var pad = elt.getAttribute("pad");
+ var s = "<tt class='py-lineno'>";
+ for (var i=0; i<pad.length; i++) { s += "&nbsp;" }
+ s += "</tt>";
+ s += "&nbsp;&nbsp;<tt class='py-line'>";
+ for (var i=0; i<indent.length; i++) { s += "&nbsp;" }
+ s += "<a href='#' onclick='expand(\"" + id;
+ s += "\");return false'>...</a></tt><br />";
+ elt.innerHTML = s;
+ }
+}
+
+function toggle(id) {
+ elt = document.getElementById(id+"-toggle");
+ if (elt.innerHTML == "-")
+ collapse(id);
+ else
+ expand(id);
+ return false;
+}
+
+function highlight(id) {
+ var elt = document.getElementById(id+"-def");
+ if (elt) elt.className = "py-highlight-hdr";
+ var elt = document.getElementById(id+"-expanded");
+ if (elt) elt.className = "py-highlight";
+ var elt = document.getElementById(id+"-collapsed");
+ if (elt) elt.className = "py-highlight";
+}
+
+function num_lines(s) {
+ var n = 1;
+ var pos = s.indexOf("\n");
+ while ( pos > 0) {
+ n += 1;
+ pos = s.indexOf("\n", pos+1);
+ }
+ return n;
+}
+
+// Collapse all blocks that mave more than `min_lines` lines.
+function collapse_all(min_lines) {
+ var elts = document.getElementsByTagName("div");
+ for (var i=0; i<elts.length; i++) {
+ var elt = elts[i];
+ var split = elt.id.indexOf("-");
+ if (split > 0)
+ if (elt.id.substring(split, elt.id.length) == "-expanded")
+ if (num_lines(elt.innerHTML) > min_lines)
+ collapse(elt.id.substring(0, split));
+ }
+}
+
+function expandto(href) {
+ var start = href.indexOf("#")+1;
+ if (start != 0 && start != href.length) {
+ if (href.substring(start, href.length) != "-") {
+ collapse_all(4);
+ pos = href.indexOf(".", start);
+ while (pos != -1) {
+ var id = href.substring(start, pos);
+ expand(id);
+ pos = href.indexOf(".", pos+1);
+ }
+ var id = href.substring(start, href.length);
+ expand(id);
+ highlight(id);
+ }
+ }
+}
+
+function kill_doclink(id) {
+ var parent = document.getElementById(id);
+ parent.removeChild(parent.childNodes.item(0));
+}
+function auto_kill_doclink(ev) {
+ if (!ev) var ev = window.event;
+ if (!this.contains(ev.toElement)) {
+ var parent = document.getElementById(this.parentID);
+ parent.removeChild(parent.childNodes.item(0));
+ }
+}
+
+function doclink(id, name, targets_id) {
+ var elt = document.getElementById(id);
+
+ // If we already opened the box, then destroy it.
+ // (This case should never occur, but leave it in just in case.)
+ if (elt.childNodes.length > 1) {
+ elt.removeChild(elt.childNodes.item(0));
+ }
+ else {
+ // The outer box: relative + inline positioning.
+ var box1 = document.createElement("div");
+ box1.style.position = "relative";
+ box1.style.display = "inline";
+ box1.style.top = 0;
+ box1.style.left = 0;
+
+ // A shadow for fun
+ var shadow = document.createElement("div");
+ shadow.style.position = "absolute";
+ shadow.style.left = "-1.3em";
+ shadow.style.top = "-1.3em";
+ shadow.style.background = "#404040";
+
+ // The inner box: absolute positioning.
+ var box2 = document.createElement("div");
+ box2.style.position = "relative";
+ box2.style.border = "1px solid #a0a0a0";
+ box2.style.left = "-.2em";
+ box2.style.top = "-.2em";
+ box2.style.background = "white";
+ box2.style.padding = ".3em .4em .3em .4em";
+ box2.style.fontStyle = "normal";
+ box2.onmouseout=auto_kill_doclink;
+ box2.parentID = id;
+
+ // Get the targets
+ var targets_elt = document.getElementById(targets_id);
+ var targets = targets_elt.getAttribute("targets");
+ var links = "";
+ target_list = targets.split(",");
+ for (var i=0; i<target_list.length; i++) {
+ var target = target_list[i].split("=");
+ links += "<li><a href='" + target[1] +
+ "' style='text-decoration:none'>" +
+ target[0] + "</a></li>";
+ }
+
+ // Put it all together.
+ elt.insertBefore(box1, elt.childNodes.item(0));
+ //box1.appendChild(box2);
+ box1.appendChild(shadow);
+ shadow.appendChild(box2);
+ box2.innerHTML =
+ "Which <b>"+name+"</b> do you want to see documentation for?" +
+ "<ul style='margin-bottom: 0;'>" +
+ links +
+ "<li><a href='#' style='text-decoration:none' " +
+ "onclick='kill_doclink(\""+id+"\");return false;'>"+
+ "<i>None of the above</i></a></li></ul>";
+ }
+ return false;
+}
+
+function get_anchor() {
+ var href = location.href;
+ var start = href.indexOf("#")+1;
+ if ((start != 0) && (start != href.length))
+ return href.substring(start, href.length);
+ }
+function redirect_url(dottedName) {
+ // Scan through each element of the "pages" list, and check
+ // if "name" matches with any of them.
+ for (var i=0; i<pages.length; i++) {
+
+ // Each page has the form "<pagename>-m" or "<pagename>-c";
+ // extract the <pagename> portion & compare it to dottedName.
+ var pagename = pages[i].substring(0, pages[i].length-2);
+ if (pagename == dottedName.substring(0,pagename.length)) {
+
+ // We've found a page that matches `dottedName`;
+ // construct its URL, using leftover `dottedName`
+ // content to form an anchor.
+ var pagetype = pages[i].charAt(pages[i].length-1);
+ var url = pagename + ((pagetype=="m")?"-module.html":
+ "-class.html");
+ if (dottedName.length > pagename.length)
+ url += "#" + dottedName.substring(pagename.length+1,
+ dottedName.length);
+ return url;
+ }
+ }
+ }
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/help.html b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/help.html
new file mode 100644
index 00000000000..d1bf1c8766d
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/help.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>Help</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="rcssmin-module.html">Home</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Tree link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Index link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Help link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ >&nbsp;&nbsp;&nbsp;Help&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">&nbsp;</td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ </table>
+ </td>
+ </tr>
+</table>
+
+<h1 class="epydoc"> API Documentation </h1>
+
+<p> This document contains the API (Application Programming Interface)
+documentation for this project. Documentation for the Python
+objects defined by the project is divided into separate pages for each
+package, module, and class. The API documentation also includes two
+pages containing information about the project as a whole: a trees
+page, and an index page. </p>
+
+<h2> Object Documentation </h2>
+
+ <p>Each <strong>Package Documentation</strong> page contains: </p>
+ <ul>
+ <li> A description of the package. </li>
+ <li> A list of the modules and sub-packages contained by the
+ package. </li>
+ <li> A summary of the classes defined by the package. </li>
+ <li> A summary of the functions defined by the package. </li>
+ <li> A summary of the variables defined by the package. </li>
+ <li> A detailed description of each function defined by the
+ package. </li>
+ <li> A detailed description of each variable defined by the
+ package. </li>
+ </ul>
+
+ <p>Each <strong>Module Documentation</strong> page contains:</p>
+ <ul>
+ <li> A description of the module. </li>
+ <li> A summary of the classes defined by the module. </li>
+ <li> A summary of the functions defined by the module. </li>
+ <li> A summary of the variables defined by the module. </li>
+ <li> A detailed description of each function defined by the
+ module. </li>
+ <li> A detailed description of each variable defined by the
+ module. </li>
+ </ul>
+
+ <p>Each <strong>Class Documentation</strong> page contains: </p>
+ <ul>
+ <li> A class inheritance diagram. </li>
+ <li> A list of known subclasses. </li>
+ <li> A description of the class. </li>
+ <li> A summary of the methods defined by the class. </li>
+ <li> A summary of the instance variables defined by the class. </li>
+ <li> A summary of the class (static) variables defined by the
+ class. </li>
+ <li> A detailed description of each method defined by the
+ class. </li>
+ <li> A detailed description of each instance variable defined by the
+ class. </li>
+ <li> A detailed description of each class (static) variable defined
+ by the class. </li>
+ </ul>
+
+<h2> Project Documentation </h2>
+
+ <p> The <strong>Trees</strong> page contains the module and class hierarchies: </p>
+ <ul>
+ <li> The <em>module hierarchy</em> lists every package and module, with
+ modules grouped into packages. At the top level, and within each
+ package, modules and sub-packages are listed alphabetically. </li>
+ <li> The <em>class hierarchy</em> lists every class, grouped by base
+ class. If a class has more than one base class, then it will be
+ listed under each base class. At the top level, and under each base
+ class, classes are listed alphabetically. </li>
+ </ul>
+
+ <p> The <strong>Index</strong> page contains indices of terms and
+ identifiers: </p>
+ <ul>
+ <li> The <em>term index</em> lists every term indexed by any object's
+ documentation. For each term, the index provides links to each
+ place where the term is indexed. </li>
+ <li> The <em>identifier index</em> lists the (short) name of every package,
+ module, class, method, function, variable, and parameter. For each
+ identifier, the index provides a short description, and a link to
+ its documentation. </li>
+ </ul>
+
+<h2> The Table of Contents </h2>
+
+<p> The table of contents occupies the two frames on the left side of
+the window. The upper-left frame displays the <em>project
+contents</em>, and the lower-left frame displays the <em>module
+contents</em>: </p>
+
+<table class="help summary" border="1" cellspacing="0" cellpadding="3">
+ <tr style="height: 30%">
+ <td align="center" style="font-size: small">
+ Project<br />Contents<hr />...</td>
+ <td align="center" style="font-size: small" rowspan="2" width="70%">
+ API<br />Documentation<br />Frame<br /><br /><br />
+ </td>
+ </tr>
+ <tr>
+ <td align="center" style="font-size: small">
+ Module<br />Contents<hr />&nbsp;<br />...<br />&nbsp;
+ </td>
+ </tr>
+</table><br />
+
+<p> The <strong>project contents frame</strong> contains a list of all packages
+and modules that are defined by the project. Clicking on an entry
+will display its contents in the module contents frame. Clicking on a
+special entry, labeled "Everything," will display the contents of
+the entire project. </p>
+
+<p> The <strong>module contents frame</strong> contains a list of every
+submodule, class, type, exception, function, and variable defined by a
+module or package. Clicking on an entry will display its
+documentation in the API documentation frame. Clicking on the name of
+the module, at the top of the frame, will display the documentation
+for the module itself. </p>
+
+<p> The "<strong>frames</strong>" and "<strong>no frames</strong>" buttons below the top
+navigation bar can be used to control whether the table of contents is
+displayed or not. </p>
+
+<h2> The Navigation Bar </h2>
+
+<p> A navigation bar is located at the top and bottom of every page.
+It indicates what type of page you are currently viewing, and allows
+you to go to related pages. The following table describes the labels
+on the navigation bar. Note that not some labels (such as
+[Parent]) are not displayed on all pages. </p>
+
+<table class="summary" border="1" cellspacing="0" cellpadding="3" width="100%">
+<tr class="summary">
+ <th>Label</th>
+ <th>Highlighted when...</th>
+ <th>Links to...</th>
+</tr>
+ <tr><td valign="top"><strong>[Parent]</strong></td>
+ <td valign="top"><em>(never highlighted)</em></td>
+ <td valign="top"> the parent of the current package </td></tr>
+ <tr><td valign="top"><strong>[Package]</strong></td>
+ <td valign="top">viewing a package</td>
+ <td valign="top">the package containing the current object
+ </td></tr>
+ <tr><td valign="top"><strong>[Module]</strong></td>
+ <td valign="top">viewing a module</td>
+ <td valign="top">the module containing the current object
+ </td></tr>
+ <tr><td valign="top"><strong>[Class]</strong></td>
+ <td valign="top">viewing a class </td>
+ <td valign="top">the class containing the current object</td></tr>
+ <tr><td valign="top"><strong>[Trees]</strong></td>
+ <td valign="top">viewing the trees page</td>
+ <td valign="top"> the trees page </td></tr>
+ <tr><td valign="top"><strong>[Index]</strong></td>
+ <td valign="top">viewing the index page</td>
+ <td valign="top"> the index page </td></tr>
+ <tr><td valign="top"><strong>[Help]</strong></td>
+ <td valign="top">viewing the help page</td>
+ <td valign="top"> the help page </td></tr>
+</table>
+
+<p> The "<strong>show private</strong>" and "<strong>hide private</strong>" buttons below
+the top navigation bar can be used to control whether documentation
+for private objects is displayed. Private objects are usually defined
+as objects whose (short) names begin with a single underscore, but do
+not end with an underscore. For example, "<code>_x</code>",
+"<code>__pprint</code>", and "<code>epydoc.epytext._tokenize</code>"
+are private objects; but "<code>re.sub</code>",
+"<code>__init__</code>", and "<code>type_</code>" are not. However,
+if a module defines the "<code>__all__</code>" variable, then its
+contents are used to decide which objects are private. </p>
+
+<p> A timestamp below the bottom navigation bar indicates when each
+page was last updated. </p>
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="rcssmin-module.html">Home</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Tree link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Index link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Help link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ >&nbsp;&nbsp;&nbsp;Help&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/identifier-index.html b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/identifier-index.html
new file mode 100644
index 00000000000..82acafdbb7c
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/identifier-index.html
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>Identifier Index</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="rcssmin-module.html">Home</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Tree link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Index link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ >&nbsp;&nbsp;&nbsp;Indices&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Help link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">&nbsp;</td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ </table>
+ </td>
+ </tr>
+</table>
+<table border="0" width="100%">
+<tr valign="bottom"><td>
+<h1 class="epydoc">Identifier Index</h1>
+</td><td>
+[
+ A
+ B
+ <a href="#C">C</a>
+ D
+ E
+ F
+ G
+ H
+ I
+ J
+ K
+ L
+ M
+ N
+ O
+ P
+ Q
+ <a href="#R">R</a>
+ S
+ T
+ U
+ V
+ W
+ X
+ Y
+ Z
+ <a href="#_">_</a>
+]
+</td></table>
+<table border="0" width="100%">
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="C">C</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="rcssmin-module.html#cssmin">cssmin()</a><br />
+<span class="index-where">(in&nbsp;<a href="rcssmin-module.html">rcssmin</a>)</span></td>
+<td width="33%" class="link-index">&nbsp;</td>
+<td width="33%" class="link-index">&nbsp;</td>
+</tr>
+<tr><td class="link-index">&nbsp;</td><td class="link-index">&nbsp;</td><td class="link-index">&nbsp;</td></tr>
+</table>
+</td></tr>
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="R">R</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="rcssmin-module.html">rcssmin</a></td>
+<td width="33%" class="link-index">&nbsp;</td>
+<td width="33%" class="link-index">&nbsp;</td>
+</tr>
+<tr><td class="link-index">&nbsp;</td><td class="link-index">&nbsp;</td><td class="link-index">&nbsp;</td></tr>
+</table>
+</td></tr>
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="_">_</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="rcssmin-module.html#__doc__">__doc__</a><br />
+<span class="index-where">(in&nbsp;<a href="rcssmin-module.html">rcssmin</a>)</span></td>
+<td width="33%" class="link-index"><a href="rcssmin-module.html#__license__">__license__</a><br />
+<span class="index-where">(in&nbsp;<a href="rcssmin-module.html">rcssmin</a>)</span></td>
+<td width="33%" class="link-index"><a href="rcssmin-module.html#__package__">__package__</a><br />
+<span class="index-where">(in&nbsp;<a href="rcssmin-module.html">rcssmin</a>)</span></td>
+</tr>
+<tr><td class="link-index">&nbsp;</td><td class="link-index">&nbsp;</td><td class="link-index">&nbsp;</td></tr>
+</table>
+</td></tr>
+</table>
+<br /><br /><!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="rcssmin-module.html">Home</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Tree link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Index link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ >&nbsp;&nbsp;&nbsp;Indices&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Help link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/index.html b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/index.html
new file mode 100644
index 00000000000..84ffddda734
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/index.html
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>rcssmin</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ >&nbsp;&nbsp;&nbsp;Home&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Tree link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Index link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Help link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Module&nbsp;rcssmin
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ </table>
+ </td>
+ </tr>
+</table>
+<!-- ==================== MODULE DESCRIPTION ==================== -->
+<h1 class="epydoc">Module rcssmin</h1><p class="nomargin-top"><span class="codelink"><a href="rcssmin-pysrc.html">source&nbsp;code</a></span></p>
+<p>CSS Minifier.</p>
+<p>The minifier is based on the semantics of the <a class="rst-reference external" href="https://github.com/yui/yuicompressor/" target="_top">YUI compressor</a>, which
+itself is based on <a class="rst-reference external" href="https://github.com/isaacs/cssmin/" target="_top">the rule list by Isaac Schlueter</a>.</p>
+<p>This module is a re-implementation aiming for speed instead of maximum
+compression, so it can be used at runtime (rather than during a preprocessing
+step). RCSSmin does syntactical compression only (removing spaces, comments
+and possibly semicolons). It does not provide semantic compression (like
+removing empty blocks, collapsing redundant properties etc). It does, however,
+support various CSS hacks (by keeping them working as intended).</p>
+<p>Here's a feature list:</p>
+<ul class="rst-simple">
+<li>Strings are kept, except that escaped newlines are stripped</li>
+<li>Space/Comments before the very end or before various characters are
+stripped: <tt class="rst-docutils literal"><span class="pre">:{});=&gt;+],!</span></tt> (The colon (<tt class="rst-docutils literal">:</tt>) is a special case, a single
+space is kept if it's outside a ruleset.)</li>
+<li>Space/Comments at the very beginning or after various characters are
+stripped: <tt class="rst-docutils literal"><span class="pre">{}(=:&gt;+[,!</span></tt></li>
+<li>Optional space after unicode escapes is kept, resp. replaced by a simple
+space</li>
+<li>whitespaces inside <tt class="rst-docutils literal">url()</tt> definitions are stripped</li>
+<li>Comments starting with an exclamation mark (<tt class="rst-docutils literal">!</tt>) can be kept optionally.</li>
+<li>All other comments and/or whitespace characters are replaced by a single
+space.</li>
+<li>Multiple consecutive semicolons are reduced to one</li>
+<li>The last semicolon within a ruleset is stripped</li>
+<li>CSS Hacks supported:<ul>
+<li>IE7 hack (<tt class="rst-docutils literal"><span class="pre">&gt;/**/</span></tt>)</li>
+<li>Mac-IE5 hack (<tt class="rst-docutils literal"><span class="pre">/*\*/.../**/</span></tt>)</li>
+<li>The boxmodelhack is supported naturally because it relies on valid CSS2
+strings</li>
+<li>Between <tt class="rst-docutils literal"><span class="pre">:first-line</span></tt> and the following comma or curly brace a space is
+inserted. (apparently it's needed for IE6)</li>
+<li>Same for <tt class="rst-docutils literal"><span class="pre">:first-letter</span></tt></li>
+</ul>
+</li>
+</ul>
+<p>rcssmin.c is a reimplementation of rcssmin.py in C and improves runtime up to
+factor 100 or so (depending on the input). docs/BENCHMARKS in the source
+distribution contains the details.</p>
+<p>Both python 2 (&gt;= 2.4) and python 3 are supported.</p>
+
+<hr />
+<div class="fields"> <p><strong>Copyright:</strong>
+ Copyright 2011 - 2014
+Andr&#233; Malo or his licensors, as applicable
+ </p>
+ <p><strong>License:</strong>
+ <p>Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at</p>
+<blockquote>
+<a class="rst-reference external" href="http://www.apache.org/licenses/LICENSE-2.0" target="_top">http://www.apache.org/licenses/LICENSE-2.0</a></blockquote>
+<p>Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.</p>
+ </p>
+ <p><strong>Version:</strong>
+ 1.0.5
+ </p>
+ <p><strong>Author:</strong>
+ Andr&#233; Malo
+ </p>
+</div><!-- ==================== FUNCTIONS ==================== -->
+<a name="section-Functions"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td align="left" colspan="2" class="table-header">
+ <span class="table-header">Functions</span></td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"><tt class="rst-docutils literal">str</tt></span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="rcssmin-module.html#cssmin" class="summary-sig-name">cssmin</a>(<span class="summary-sig-arg">style</span>,
+ <span class="summary-sig-arg">keep_bang_comments</span>=<span class="summary-sig-default">False</span>)</span><br />
+ Minify CSS.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="rcssmin-pysrc.html#cssmin">source&nbsp;code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+</table>
+<!-- ==================== FUNCTION DETAILS ==================== -->
+<a name="section-FunctionDetails"></a>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td align="left" colspan="2" class="table-header">
+ <span class="table-header">Function Details</span></td>
+</tr>
+</table>
+<a name="cssmin"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">cssmin</span>(<span class="sig-arg">style</span>,
+ <span class="sig-arg">keep_bang_comments</span>=<span class="sig-default">False</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="rcssmin-pysrc.html#cssmin">source&nbsp;code</a></span>&nbsp;
+ </td>
+ </tr></table>
+
+ Minify CSS.
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>style</code></strong> (<tt class="rst-docutils literal">str</tt>) - CSS to minify</li>
+ <li><strong class="pname"><code>keep_bang_comments</code></strong> (<tt class="rst-docutils literal">bool</tt>) - Keep comments starting with an exclamation mark? (<tt class="rst-docutils literal"><span class="pre">/*!...*/</span></tt>)</li>
+ </ul></dd>
+ <dt>Returns: <tt class="rst-docutils literal">str</tt></dt>
+ <dd>Minified style</dd>
+ </dl>
+</td></tr></table>
+</div>
+<br />
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ >&nbsp;&nbsp;&nbsp;Home&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Tree link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Index link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Help link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/module-tree.html b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/module-tree.html
new file mode 100644
index 00000000000..e522dd1721b
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/module-tree.html
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>Module Hierarchy</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="rcssmin-module.html">Home</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Tree link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ >&nbsp;&nbsp;&nbsp;Trees&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Index link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Help link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">&nbsp;</td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ </table>
+ </td>
+ </tr>
+</table>
+<h1 class="epydoc">Module Hierarchy</h1>
+<ul class="nomargin-top">
+ <li> <strong class="uidlink"><a href="rcssmin-module.html">rcssmin</a></strong>: <em class="summary">CSS Minifier.</em> </li>
+</ul>
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="rcssmin-module.html">Home</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Tree link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ >&nbsp;&nbsp;&nbsp;Trees&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Index link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Help link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/rcssmin-module.html b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/rcssmin-module.html
new file mode 100644
index 00000000000..84ffddda734
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/rcssmin-module.html
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>rcssmin</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ >&nbsp;&nbsp;&nbsp;Home&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Tree link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Index link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Help link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Module&nbsp;rcssmin
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ </table>
+ </td>
+ </tr>
+</table>
+<!-- ==================== MODULE DESCRIPTION ==================== -->
+<h1 class="epydoc">Module rcssmin</h1><p class="nomargin-top"><span class="codelink"><a href="rcssmin-pysrc.html">source&nbsp;code</a></span></p>
+<p>CSS Minifier.</p>
+<p>The minifier is based on the semantics of the <a class="rst-reference external" href="https://github.com/yui/yuicompressor/" target="_top">YUI compressor</a>, which
+itself is based on <a class="rst-reference external" href="https://github.com/isaacs/cssmin/" target="_top">the rule list by Isaac Schlueter</a>.</p>
+<p>This module is a re-implementation aiming for speed instead of maximum
+compression, so it can be used at runtime (rather than during a preprocessing
+step). RCSSmin does syntactical compression only (removing spaces, comments
+and possibly semicolons). It does not provide semantic compression (like
+removing empty blocks, collapsing redundant properties etc). It does, however,
+support various CSS hacks (by keeping them working as intended).</p>
+<p>Here's a feature list:</p>
+<ul class="rst-simple">
+<li>Strings are kept, except that escaped newlines are stripped</li>
+<li>Space/Comments before the very end or before various characters are
+stripped: <tt class="rst-docutils literal"><span class="pre">:{});=&gt;+],!</span></tt> (The colon (<tt class="rst-docutils literal">:</tt>) is a special case, a single
+space is kept if it's outside a ruleset.)</li>
+<li>Space/Comments at the very beginning or after various characters are
+stripped: <tt class="rst-docutils literal"><span class="pre">{}(=:&gt;+[,!</span></tt></li>
+<li>Optional space after unicode escapes is kept, resp. replaced by a simple
+space</li>
+<li>whitespaces inside <tt class="rst-docutils literal">url()</tt> definitions are stripped</li>
+<li>Comments starting with an exclamation mark (<tt class="rst-docutils literal">!</tt>) can be kept optionally.</li>
+<li>All other comments and/or whitespace characters are replaced by a single
+space.</li>
+<li>Multiple consecutive semicolons are reduced to one</li>
+<li>The last semicolon within a ruleset is stripped</li>
+<li>CSS Hacks supported:<ul>
+<li>IE7 hack (<tt class="rst-docutils literal"><span class="pre">&gt;/**/</span></tt>)</li>
+<li>Mac-IE5 hack (<tt class="rst-docutils literal"><span class="pre">/*\*/.../**/</span></tt>)</li>
+<li>The boxmodelhack is supported naturally because it relies on valid CSS2
+strings</li>
+<li>Between <tt class="rst-docutils literal"><span class="pre">:first-line</span></tt> and the following comma or curly brace a space is
+inserted. (apparently it's needed for IE6)</li>
+<li>Same for <tt class="rst-docutils literal"><span class="pre">:first-letter</span></tt></li>
+</ul>
+</li>
+</ul>
+<p>rcssmin.c is a reimplementation of rcssmin.py in C and improves runtime up to
+factor 100 or so (depending on the input). docs/BENCHMARKS in the source
+distribution contains the details.</p>
+<p>Both python 2 (&gt;= 2.4) and python 3 are supported.</p>
+
+<hr />
+<div class="fields"> <p><strong>Copyright:</strong>
+ Copyright 2011 - 2014
+Andr&#233; Malo or his licensors, as applicable
+ </p>
+ <p><strong>License:</strong>
+ <p>Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at</p>
+<blockquote>
+<a class="rst-reference external" href="http://www.apache.org/licenses/LICENSE-2.0" target="_top">http://www.apache.org/licenses/LICENSE-2.0</a></blockquote>
+<p>Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.</p>
+ </p>
+ <p><strong>Version:</strong>
+ 1.0.5
+ </p>
+ <p><strong>Author:</strong>
+ Andr&#233; Malo
+ </p>
+</div><!-- ==================== FUNCTIONS ==================== -->
+<a name="section-Functions"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td align="left" colspan="2" class="table-header">
+ <span class="table-header">Functions</span></td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"><tt class="rst-docutils literal">str</tt></span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="rcssmin-module.html#cssmin" class="summary-sig-name">cssmin</a>(<span class="summary-sig-arg">style</span>,
+ <span class="summary-sig-arg">keep_bang_comments</span>=<span class="summary-sig-default">False</span>)</span><br />
+ Minify CSS.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="rcssmin-pysrc.html#cssmin">source&nbsp;code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+</table>
+<!-- ==================== FUNCTION DETAILS ==================== -->
+<a name="section-FunctionDetails"></a>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td align="left" colspan="2" class="table-header">
+ <span class="table-header">Function Details</span></td>
+</tr>
+</table>
+<a name="cssmin"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">cssmin</span>(<span class="sig-arg">style</span>,
+ <span class="sig-arg">keep_bang_comments</span>=<span class="sig-default">False</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="rcssmin-pysrc.html#cssmin">source&nbsp;code</a></span>&nbsp;
+ </td>
+ </tr></table>
+
+ Minify CSS.
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>style</code></strong> (<tt class="rst-docutils literal">str</tt>) - CSS to minify</li>
+ <li><strong class="pname"><code>keep_bang_comments</code></strong> (<tt class="rst-docutils literal">bool</tt>) - Keep comments starting with an exclamation mark? (<tt class="rst-docutils literal"><span class="pre">/*!...*/</span></tt>)</li>
+ </ul></dd>
+ <dt>Returns: <tt class="rst-docutils literal">str</tt></dt>
+ <dd>Minified style</dd>
+ </dl>
+</td></tr></table>
+</div>
+<br />
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ >&nbsp;&nbsp;&nbsp;Home&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Tree link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Index link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Help link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/rcssmin-pysrc.html b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/rcssmin-pysrc.html
new file mode 100644
index 00000000000..6856baca0e6
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/rcssmin-pysrc.html
@@ -0,0 +1,477 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>rcssmin</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ >&nbsp;&nbsp;&nbsp;Home&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Tree link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Index link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Help link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Module&nbsp;rcssmin
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ </table>
+ </td>
+ </tr>
+</table>
+<h1 class="epydoc">Source Code for <a href="rcssmin-module.html">Module rcssmin</a></h1>
+<pre class="py-src">
+<a name="L1"></a><tt class="py-lineno"> 1</tt> <tt class="py-line"><tt class="py-comment">#!/usr/bin/env python</tt> </tt>
+<a name="L2"></a><tt class="py-lineno"> 2</tt> <tt class="py-line"><tt class="py-comment"># -*- coding: ascii -*-</tt> </tt>
+<a name="L3"></a><tt class="py-lineno"> 3</tt> <tt class="py-line"><tt class="py-docstring">r"""</tt> </tt>
+<a name="L4"></a><tt class="py-lineno"> 4</tt> <tt class="py-line"><tt class="py-docstring">==============</tt> </tt>
+<a name="L5"></a><tt class="py-lineno"> 5</tt> <tt class="py-line"><tt class="py-docstring"> CSS Minifier</tt> </tt>
+<a name="L6"></a><tt class="py-lineno"> 6</tt> <tt class="py-line"><tt class="py-docstring">==============</tt> </tt>
+<a name="L7"></a><tt class="py-lineno"> 7</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L8"></a><tt class="py-lineno"> 8</tt> <tt class="py-line"><tt class="py-docstring">CSS Minifier.</tt> </tt>
+<a name="L9"></a><tt class="py-lineno"> 9</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L10"></a><tt class="py-lineno"> 10</tt> <tt class="py-line"><tt class="py-docstring">The minifier is based on the semantics of the `YUI compressor`_\\, which</tt> </tt>
+<a name="L11"></a><tt class="py-lineno"> 11</tt> <tt class="py-line"><tt class="py-docstring">itself is based on `the rule list by Isaac Schlueter`_\\.</tt> </tt>
+<a name="L12"></a><tt class="py-lineno"> 12</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L13"></a><tt class="py-lineno"> 13</tt> <tt class="py-line"><tt class="py-docstring">:Copyright:</tt> </tt>
+<a name="L14"></a><tt class="py-lineno"> 14</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L15"></a><tt class="py-lineno"> 15</tt> <tt class="py-line"><tt class="py-docstring"> Copyright 2011 - 2014</tt> </tt>
+<a name="L16"></a><tt class="py-lineno"> 16</tt> <tt class="py-line"><tt class="py-docstring"> Andr\xe9 Malo or his licensors, as applicable</tt> </tt>
+<a name="L17"></a><tt class="py-lineno"> 17</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L18"></a><tt class="py-lineno"> 18</tt> <tt class="py-line"><tt class="py-docstring">:License:</tt> </tt>
+<a name="L19"></a><tt class="py-lineno"> 19</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L20"></a><tt class="py-lineno"> 20</tt> <tt class="py-line"><tt class="py-docstring"> Licensed under the Apache License, Version 2.0 (the "License");</tt> </tt>
+<a name="L21"></a><tt class="py-lineno"> 21</tt> <tt class="py-line"><tt class="py-docstring"> you may not use this file except in compliance with the License.</tt> </tt>
+<a name="L22"></a><tt class="py-lineno"> 22</tt> <tt class="py-line"><tt class="py-docstring"> You may obtain a copy of the License at</tt> </tt>
+<a name="L23"></a><tt class="py-lineno"> 23</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L24"></a><tt class="py-lineno"> 24</tt> <tt class="py-line"><tt class="py-docstring"> http://www.apache.org/licenses/LICENSE-2.0</tt> </tt>
+<a name="L25"></a><tt class="py-lineno"> 25</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L26"></a><tt class="py-lineno"> 26</tt> <tt class="py-line"><tt class="py-docstring"> Unless required by applicable law or agreed to in writing, software</tt> </tt>
+<a name="L27"></a><tt class="py-lineno"> 27</tt> <tt class="py-line"><tt class="py-docstring"> distributed under the License is distributed on an "AS IS" BASIS,</tt> </tt>
+<a name="L28"></a><tt class="py-lineno"> 28</tt> <tt class="py-line"><tt class="py-docstring"> WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</tt> </tt>
+<a name="L29"></a><tt class="py-lineno"> 29</tt> <tt class="py-line"><tt class="py-docstring"> See the License for the specific language governing permissions and</tt> </tt>
+<a name="L30"></a><tt class="py-lineno"> 30</tt> <tt class="py-line"><tt class="py-docstring"> limitations under the License.</tt> </tt>
+<a name="L31"></a><tt class="py-lineno"> 31</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L32"></a><tt class="py-lineno"> 32</tt> <tt class="py-line"><tt class="py-docstring">This module is a re-implementation aiming for speed instead of maximum</tt> </tt>
+<a name="L33"></a><tt class="py-lineno"> 33</tt> <tt class="py-line"><tt class="py-docstring">compression, so it can be used at runtime (rather than during a preprocessing</tt> </tt>
+<a name="L34"></a><tt class="py-lineno"> 34</tt> <tt class="py-line"><tt class="py-docstring">step). RCSSmin does syntactical compression only (removing spaces, comments</tt> </tt>
+<a name="L35"></a><tt class="py-lineno"> 35</tt> <tt class="py-line"><tt class="py-docstring">and possibly semicolons). It does not provide semantic compression (like</tt> </tt>
+<a name="L36"></a><tt class="py-lineno"> 36</tt> <tt class="py-line"><tt class="py-docstring">removing empty blocks, collapsing redundant properties etc). It does, however,</tt> </tt>
+<a name="L37"></a><tt class="py-lineno"> 37</tt> <tt class="py-line"><tt class="py-docstring">support various CSS hacks (by keeping them working as intended).</tt> </tt>
+<a name="L38"></a><tt class="py-lineno"> 38</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L39"></a><tt class="py-lineno"> 39</tt> <tt class="py-line"><tt class="py-docstring">Here's a feature list:</tt> </tt>
+<a name="L40"></a><tt class="py-lineno"> 40</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L41"></a><tt class="py-lineno"> 41</tt> <tt class="py-line"><tt class="py-docstring">- Strings are kept, except that escaped newlines are stripped</tt> </tt>
+<a name="L42"></a><tt class="py-lineno"> 42</tt> <tt class="py-line"><tt class="py-docstring">- Space/Comments before the very end or before various characters are</tt> </tt>
+<a name="L43"></a><tt class="py-lineno"> 43</tt> <tt class="py-line"><tt class="py-docstring"> stripped: ``:{});=&gt;+],!`` (The colon (``:``) is a special case, a single</tt> </tt>
+<a name="L44"></a><tt class="py-lineno"> 44</tt> <tt class="py-line"><tt class="py-docstring"> space is kept if it's outside a ruleset.)</tt> </tt>
+<a name="L45"></a><tt class="py-lineno"> 45</tt> <tt class="py-line"><tt class="py-docstring">- Space/Comments at the very beginning or after various characters are</tt> </tt>
+<a name="L46"></a><tt class="py-lineno"> 46</tt> <tt class="py-line"><tt class="py-docstring"> stripped: ``{}(=:&gt;+[,!``</tt> </tt>
+<a name="L47"></a><tt class="py-lineno"> 47</tt> <tt class="py-line"><tt class="py-docstring">- Optional space after unicode escapes is kept, resp. replaced by a simple</tt> </tt>
+<a name="L48"></a><tt class="py-lineno"> 48</tt> <tt class="py-line"><tt class="py-docstring"> space</tt> </tt>
+<a name="L49"></a><tt class="py-lineno"> 49</tt> <tt class="py-line"><tt class="py-docstring">- whitespaces inside ``url()`` definitions are stripped</tt> </tt>
+<a name="L50"></a><tt class="py-lineno"> 50</tt> <tt class="py-line"><tt class="py-docstring">- Comments starting with an exclamation mark (``!``) can be kept optionally.</tt> </tt>
+<a name="L51"></a><tt class="py-lineno"> 51</tt> <tt class="py-line"><tt class="py-docstring">- All other comments and/or whitespace characters are replaced by a single</tt> </tt>
+<a name="L52"></a><tt class="py-lineno"> 52</tt> <tt class="py-line"><tt class="py-docstring"> space.</tt> </tt>
+<a name="L53"></a><tt class="py-lineno"> 53</tt> <tt class="py-line"><tt class="py-docstring">- Multiple consecutive semicolons are reduced to one</tt> </tt>
+<a name="L54"></a><tt class="py-lineno"> 54</tt> <tt class="py-line"><tt class="py-docstring">- The last semicolon within a ruleset is stripped</tt> </tt>
+<a name="L55"></a><tt class="py-lineno"> 55</tt> <tt class="py-line"><tt class="py-docstring">- CSS Hacks supported:</tt> </tt>
+<a name="L56"></a><tt class="py-lineno"> 56</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L57"></a><tt class="py-lineno"> 57</tt> <tt class="py-line"><tt class="py-docstring"> - IE7 hack (``&gt;/**/``)</tt> </tt>
+<a name="L58"></a><tt class="py-lineno"> 58</tt> <tt class="py-line"><tt class="py-docstring"> - Mac-IE5 hack (``/*\\*/.../**/``)</tt> </tt>
+<a name="L59"></a><tt class="py-lineno"> 59</tt> <tt class="py-line"><tt class="py-docstring"> - The boxmodelhack is supported naturally because it relies on valid CSS2</tt> </tt>
+<a name="L60"></a><tt class="py-lineno"> 60</tt> <tt class="py-line"><tt class="py-docstring"> strings</tt> </tt>
+<a name="L61"></a><tt class="py-lineno"> 61</tt> <tt class="py-line"><tt class="py-docstring"> - Between ``:first-line`` and the following comma or curly brace a space is</tt> </tt>
+<a name="L62"></a><tt class="py-lineno"> 62</tt> <tt class="py-line"><tt class="py-docstring"> inserted. (apparently it's needed for IE6)</tt> </tt>
+<a name="L63"></a><tt class="py-lineno"> 63</tt> <tt class="py-line"><tt class="py-docstring"> - Same for ``:first-letter``</tt> </tt>
+<a name="L64"></a><tt class="py-lineno"> 64</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L65"></a><tt class="py-lineno"> 65</tt> <tt class="py-line"><tt class="py-docstring">rcssmin.c is a reimplementation of rcssmin.py in C and improves runtime up to</tt> </tt>
+<a name="L66"></a><tt class="py-lineno"> 66</tt> <tt class="py-line"><tt class="py-docstring">factor 100 or so (depending on the input). docs/BENCHMARKS in the source</tt> </tt>
+<a name="L67"></a><tt class="py-lineno"> 67</tt> <tt class="py-line"><tt class="py-docstring">distribution contains the details.</tt> </tt>
+<a name="L68"></a><tt class="py-lineno"> 68</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L69"></a><tt class="py-lineno"> 69</tt> <tt class="py-line"><tt class="py-docstring">Both python 2 (&gt;= 2.4) and python 3 are supported.</tt> </tt>
+<a name="L70"></a><tt class="py-lineno"> 70</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L71"></a><tt class="py-lineno"> 71</tt> <tt class="py-line"><tt class="py-docstring">.. _YUI compressor: https://github.com/yui/yuicompressor/</tt> </tt>
+<a name="L72"></a><tt class="py-lineno"> 72</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L73"></a><tt class="py-lineno"> 73</tt> <tt class="py-line"><tt class="py-docstring">.. _the rule list by Isaac Schlueter: https://github.com/isaacs/cssmin/</tt> </tt>
+<a name="L74"></a><tt class="py-lineno"> 74</tt> <tt class="py-line"><tt class="py-docstring">"""</tt> </tt>
+<a name="L75"></a><tt class="py-lineno"> 75</tt> <tt class="py-line"><tt class="py-keyword">if</tt> <tt id="link-0" class="py-name" targets="Variable rcssmin.__doc__=rcssmin-module.html#__doc__"><a title="rcssmin.__doc__" class="py-name" href="#" onclick="return doclink('link-0', '__doc__', 'link-0');">__doc__</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L76"></a><tt class="py-lineno"> 76</tt> <tt class="py-line"> <tt class="py-comment"># pylint: disable = W0622</tt> </tt>
+<a name="L77"></a><tt class="py-lineno"> 77</tt> <tt class="py-line"> <tt id="link-1" class="py-name"><a title="rcssmin.__doc__" class="py-name" href="#" onclick="return doclink('link-1', '__doc__', 'link-0');">__doc__</a></tt> <tt class="py-op">=</tt> <tt id="link-2" class="py-name"><a title="rcssmin.__doc__" class="py-name" href="#" onclick="return doclink('link-2', '__doc__', 'link-0');">__doc__</a></tt><tt class="py-op">.</tt><tt class="py-name">encode</tt><tt class="py-op">(</tt><tt class="py-string">'ascii'</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">decode</tt><tt class="py-op">(</tt><tt class="py-string">'unicode_escape'</tt><tt class="py-op">)</tt> </tt>
+<a name="L78"></a><tt class="py-lineno"> 78</tt> <tt class="py-line"><tt class="py-name">__author__</tt> <tt class="py-op">=</tt> <tt class="py-string">r"Andr\xe9 Malo"</tt><tt class="py-op">.</tt><tt class="py-name">encode</tt><tt class="py-op">(</tt><tt class="py-string">'ascii'</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">decode</tt><tt class="py-op">(</tt><tt class="py-string">'unicode_escape'</tt><tt class="py-op">)</tt> </tt>
+<a name="L79"></a><tt class="py-lineno"> 79</tt> <tt class="py-line"><tt class="py-name">__docformat__</tt> <tt class="py-op">=</tt> <tt class="py-string">"restructuredtext en"</tt> </tt>
+<a name="L80"></a><tt class="py-lineno"> 80</tt> <tt class="py-line"><tt id="link-3" class="py-name" targets="Variable rcssmin.__license__=rcssmin-module.html#__license__"><a title="rcssmin.__license__" class="py-name" href="#" onclick="return doclink('link-3', '__license__', 'link-3');">__license__</a></tt> <tt class="py-op">=</tt> <tt class="py-string">"Apache License, Version 2.0"</tt> </tt>
+<a name="L81"></a><tt class="py-lineno"> 81</tt> <tt class="py-line"><tt class="py-name">__version__</tt> <tt class="py-op">=</tt> <tt class="py-string">'1.0.5'</tt> </tt>
+<a name="L82"></a><tt class="py-lineno"> 82</tt> <tt class="py-line"><tt class="py-name">__all__</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-string">'cssmin'</tt><tt class="py-op">]</tt> </tt>
+<a name="L83"></a><tt class="py-lineno"> 83</tt> <tt class="py-line"> </tt>
+<a name="L84"></a><tt class="py-lineno"> 84</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">re</tt> <tt class="py-keyword">as</tt> <tt class="py-name">_re</tt> </tt>
+<a name="L85"></a><tt class="py-lineno"> 85</tt> <tt class="py-line"> </tt>
+<a name="L86"></a><tt class="py-lineno"> 86</tt> <tt class="py-line"> </tt>
+<a name="_make_cssmin"></a><div id="_make_cssmin-def"><a name="L87"></a><tt class="py-lineno"> 87</tt> <a class="py-toggle" href="#" id="_make_cssmin-toggle" onclick="return toggle('_make_cssmin');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="rcssmin-module.html#_make_cssmin">_make_cssmin</a><tt class="py-op">(</tt><tt class="py-param">python_only</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="_make_cssmin-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="_make_cssmin-expanded"><a name="L88"></a><tt class="py-lineno"> 88</tt> <tt class="py-line"> <tt class="py-docstring">"""</tt> </tt>
+<a name="L89"></a><tt class="py-lineno"> 89</tt> <tt class="py-line"><tt class="py-docstring"> Generate CSS minifier.</tt> </tt>
+<a name="L90"></a><tt class="py-lineno"> 90</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L91"></a><tt class="py-lineno"> 91</tt> <tt class="py-line"><tt class="py-docstring"> :Parameters:</tt> </tt>
+<a name="L92"></a><tt class="py-lineno"> 92</tt> <tt class="py-line"><tt class="py-docstring"> `python_only` : ``bool``</tt> </tt>
+<a name="L93"></a><tt class="py-lineno"> 93</tt> <tt class="py-line"><tt class="py-docstring"> Use only the python variant. If true, the c extension is not even</tt> </tt>
+<a name="L94"></a><tt class="py-lineno"> 94</tt> <tt class="py-line"><tt class="py-docstring"> tried to be loaded.</tt> </tt>
+<a name="L95"></a><tt class="py-lineno"> 95</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L96"></a><tt class="py-lineno"> 96</tt> <tt class="py-line"><tt class="py-docstring"> :Return: Minifier</tt> </tt>
+<a name="L97"></a><tt class="py-lineno"> 97</tt> <tt class="py-line"><tt class="py-docstring"> :Rtype: ``callable``</tt> </tt>
+<a name="L98"></a><tt class="py-lineno"> 98</tt> <tt class="py-line"><tt class="py-docstring"> """</tt> </tt>
+<a name="L99"></a><tt class="py-lineno"> 99</tt> <tt class="py-line"> <tt class="py-comment"># pylint: disable = R0912, R0914, W0612</tt> </tt>
+<a name="L100"></a><tt class="py-lineno">100</tt> <tt class="py-line"> </tt>
+<a name="L101"></a><tt class="py-lineno">101</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">python_only</tt><tt class="py-op">:</tt> </tt>
+<a name="L102"></a><tt class="py-lineno">102</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L103"></a><tt class="py-lineno">103</tt> <tt class="py-line"> <tt class="py-keyword">import</tt> <tt class="py-name">_rcssmin</tt> </tt>
+<a name="L104"></a><tt class="py-lineno">104</tt> <tt class="py-line"> <tt class="py-keyword">except</tt> <tt class="py-name">ImportError</tt><tt class="py-op">:</tt> </tt>
+<a name="L105"></a><tt class="py-lineno">105</tt> <tt class="py-line"> <tt class="py-keyword">pass</tt> </tt>
+<a name="L106"></a><tt class="py-lineno">106</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L107"></a><tt class="py-lineno">107</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">_rcssmin</tt><tt class="py-op">.</tt><tt id="link-4" class="py-name" targets="Function rcssmin.cssmin()=rcssmin-module.html#cssmin"><a title="rcssmin.cssmin" class="py-name" href="#" onclick="return doclink('link-4', 'cssmin', 'link-4');">cssmin</a></tt> </tt>
+<a name="L108"></a><tt class="py-lineno">108</tt> <tt class="py-line"> </tt>
+<a name="L109"></a><tt class="py-lineno">109</tt> <tt class="py-line"> <tt class="py-name">nl</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:[\n\f]|\r\n?)'</tt> <tt class="py-comment"># pylint: disable = C0103</tt> </tt>
+<a name="L110"></a><tt class="py-lineno">110</tt> <tt class="py-line"> <tt class="py-name">spacechar</tt> <tt class="py-op">=</tt> <tt class="py-string">r'[\r\n\f\040\t]'</tt> </tt>
+<a name="L111"></a><tt class="py-lineno">111</tt> <tt class="py-line"> </tt>
+<a name="L112"></a><tt class="py-lineno">112</tt> <tt class="py-line"> <tt class="py-name">unicoded</tt> <tt class="py-op">=</tt> <tt class="py-string">r'[0-9a-fA-F]{1,6}(?:[\040\n\t\f]|\r\n?)?'</tt> </tt>
+<a name="L113"></a><tt class="py-lineno">113</tt> <tt class="py-line"> <tt class="py-name">escaped</tt> <tt class="py-op">=</tt> <tt class="py-string">r'[^\n\r\f0-9a-fA-F]'</tt> </tt>
+<a name="L114"></a><tt class="py-lineno">114</tt> <tt class="py-line"> <tt class="py-name">escape</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:\\(?:%(unicoded)s|%(escaped)s))'</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L115"></a><tt class="py-lineno">115</tt> <tt class="py-line"> </tt>
+<a name="L116"></a><tt class="py-lineno">116</tt> <tt class="py-line"> <tt class="py-name">nmchar</tt> <tt class="py-op">=</tt> <tt class="py-string">r'[^\000-\054\056\057\072-\100\133-\136\140\173-\177]'</tt> </tt>
+<a name="L117"></a><tt class="py-lineno">117</tt> <tt class="py-line"> <tt class="py-comment">#nmstart = r'[^\000-\100\133-\136\140\173-\177]'</tt> </tt>
+<a name="L118"></a><tt class="py-lineno">118</tt> <tt class="py-line"> <tt class="py-comment">#ident = (r'(?:'</tt> </tt>
+<a name="L119"></a><tt class="py-lineno">119</tt> <tt class="py-line"> <tt class="py-comment"># r'-?(?:%(nmstart)s|%(escape)s)%(nmchar)s*(?:%(escape)s%(nmchar)s*)*'</tt> </tt>
+<a name="L120"></a><tt class="py-lineno">120</tt> <tt class="py-line"> <tt class="py-comment">#r')') % locals()</tt> </tt>
+<a name="L121"></a><tt class="py-lineno">121</tt> <tt class="py-line"> </tt>
+<a name="L122"></a><tt class="py-lineno">122</tt> <tt class="py-line"> <tt class="py-name">comment</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)'</tt> </tt>
+<a name="L123"></a><tt class="py-lineno">123</tt> <tt class="py-line"> </tt>
+<a name="L124"></a><tt class="py-lineno">124</tt> <tt class="py-line"> <tt class="py-comment"># only for specific purposes. The bang is grouped:</tt> </tt>
+<a name="L125"></a><tt class="py-lineno">125</tt> <tt class="py-line"> <tt class="py-name">_bang_comment</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:/\*(!?)[^*]*\*+(?:[^/*][^*]*\*+)*/)'</tt> </tt>
+<a name="L126"></a><tt class="py-lineno">126</tt> <tt class="py-line"> </tt>
+<a name="L127"></a><tt class="py-lineno">127</tt> <tt class="py-line"> <tt class="py-name">string1</tt> <tt class="py-op">=</tt> \ </tt>
+<a name="L128"></a><tt class="py-lineno">128</tt> <tt class="py-line"> <tt class="py-string">r'(?:\047[^\047\\\r\n\f]*(?:\\[^\r\n\f][^\047\\\r\n\f]*)*\047)'</tt> </tt>
+<a name="L129"></a><tt class="py-lineno">129</tt> <tt class="py-line"> <tt class="py-name">string2</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:"[^"\\\r\n\f]*(?:\\[^\r\n\f][^"\\\r\n\f]*)*")'</tt> </tt>
+<a name="L130"></a><tt class="py-lineno">130</tt> <tt class="py-line"> <tt class="py-name">strings</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:%s|%s)'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">string1</tt><tt class="py-op">,</tt> <tt class="py-name">string2</tt><tt class="py-op">)</tt> </tt>
+<a name="L131"></a><tt class="py-lineno">131</tt> <tt class="py-line"> </tt>
+<a name="L132"></a><tt class="py-lineno">132</tt> <tt class="py-line"> <tt class="py-name">nl_string1</tt> <tt class="py-op">=</tt> \ </tt>
+<a name="L133"></a><tt class="py-lineno">133</tt> <tt class="py-line"> <tt class="py-string">r'(?:\047[^\047\\\r\n\f]*(?:\\(?:[^\r]|\r\n?)[^\047\\\r\n\f]*)*\047)'</tt> </tt>
+<a name="L134"></a><tt class="py-lineno">134</tt> <tt class="py-line"> <tt class="py-name">nl_string2</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:"[^"\\\r\n\f]*(?:\\(?:[^\r]|\r\n?)[^"\\\r\n\f]*)*")'</tt> </tt>
+<a name="L135"></a><tt class="py-lineno">135</tt> <tt class="py-line"> <tt class="py-name">nl_strings</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:%s|%s)'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">nl_string1</tt><tt class="py-op">,</tt> <tt class="py-name">nl_string2</tt><tt class="py-op">)</tt> </tt>
+<a name="L136"></a><tt class="py-lineno">136</tt> <tt class="py-line"> </tt>
+<a name="L137"></a><tt class="py-lineno">137</tt> <tt class="py-line"> <tt class="py-name">uri_nl_string1</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:\047[^\047\\]*(?:\\(?:[^\r]|\r\n?)[^\047\\]*)*\047)'</tt> </tt>
+<a name="L138"></a><tt class="py-lineno">138</tt> <tt class="py-line"> <tt class="py-name">uri_nl_string2</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:"[^"\\]*(?:\\(?:[^\r]|\r\n?)[^"\\]*)*")'</tt> </tt>
+<a name="L139"></a><tt class="py-lineno">139</tt> <tt class="py-line"> <tt class="py-name">uri_nl_strings</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:%s|%s)'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">uri_nl_string1</tt><tt class="py-op">,</tt> <tt class="py-name">uri_nl_string2</tt><tt class="py-op">)</tt> </tt>
+<a name="L140"></a><tt class="py-lineno">140</tt> <tt class="py-line"> </tt>
+<a name="L141"></a><tt class="py-lineno">141</tt> <tt class="py-line"> <tt class="py-name">nl_escaped</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:\\%(nl)s)'</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L142"></a><tt class="py-lineno">142</tt> <tt class="py-line"> </tt>
+<a name="L143"></a><tt class="py-lineno">143</tt> <tt class="py-line"> <tt class="py-name">space</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:%(spacechar)s|%(comment)s)'</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L144"></a><tt class="py-lineno">144</tt> <tt class="py-line"> </tt>
+<a name="L145"></a><tt class="py-lineno">145</tt> <tt class="py-line"> <tt class="py-name">ie7hack</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:&gt;/\*\*/)'</tt> </tt>
+<a name="L146"></a><tt class="py-lineno">146</tt> <tt class="py-line"> </tt>
+<a name="L147"></a><tt class="py-lineno">147</tt> <tt class="py-line"> <tt class="py-name">uri</tt> <tt class="py-op">=</tt> <tt class="py-op">(</tt><tt class="py-string">r'(?:'</tt> </tt>
+<a name="L148"></a><tt class="py-lineno">148</tt> <tt class="py-line"> <tt class="py-comment"># noqa pylint: disable = C0330</tt> </tt>
+<a name="L149"></a><tt class="py-lineno">149</tt> <tt class="py-line"> <tt class="py-string">r'(?:[^\000-\040"\047()\\\177]*'</tt> </tt>
+<a name="L150"></a><tt class="py-lineno">150</tt> <tt class="py-line"> <tt class="py-string">r'(?:%(escape)s[^\000-\040"\047()\\\177]*)*)'</tt> </tt>
+<a name="L151"></a><tt class="py-lineno">151</tt> <tt class="py-line"> <tt class="py-string">r'(?:'</tt> </tt>
+<a name="L152"></a><tt class="py-lineno">152</tt> <tt class="py-line"> <tt class="py-string">r'(?:%(spacechar)s+|%(nl_escaped)s+)'</tt> </tt>
+<a name="L153"></a><tt class="py-lineno">153</tt> <tt class="py-line"> <tt class="py-string">r'(?:'</tt> </tt>
+<a name="L154"></a><tt class="py-lineno">154</tt> <tt class="py-line"> <tt class="py-string">r'(?:[^\000-\040"\047()\\\177]|%(escape)s|%(nl_escaped)s)'</tt> </tt>
+<a name="L155"></a><tt class="py-lineno">155</tt> <tt class="py-line"> <tt class="py-string">r'[^\000-\040"\047()\\\177]*'</tt> </tt>
+<a name="L156"></a><tt class="py-lineno">156</tt> <tt class="py-line"> <tt class="py-string">r'(?:%(escape)s[^\000-\040"\047()\\\177]*)*'</tt> </tt>
+<a name="L157"></a><tt class="py-lineno">157</tt> <tt class="py-line"> <tt class="py-string">r')+'</tt> </tt>
+<a name="L158"></a><tt class="py-lineno">158</tt> <tt class="py-line"> <tt class="py-string">r')*'</tt> </tt>
+<a name="L159"></a><tt class="py-lineno">159</tt> <tt class="py-line"> <tt class="py-string">r')'</tt><tt class="py-op">)</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L160"></a><tt class="py-lineno">160</tt> <tt class="py-line"> </tt>
+<a name="L161"></a><tt class="py-lineno">161</tt> <tt class="py-line"> <tt class="py-name">nl_unesc_sub</tt> <tt class="py-op">=</tt> <tt class="py-name">_re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-name">nl_escaped</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt> </tt>
+<a name="L162"></a><tt class="py-lineno">162</tt> <tt class="py-line"> </tt>
+<a name="L163"></a><tt class="py-lineno">163</tt> <tt class="py-line"> <tt class="py-name">uri_space_sub</tt> <tt class="py-op">=</tt> <tt class="py-name">_re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-op">(</tt> </tt>
+<a name="L164"></a><tt class="py-lineno">164</tt> <tt class="py-line"> <tt class="py-string">r'(%(escape)s+)|%(spacechar)s+|%(nl_escaped)s+'</tt> </tt>
+<a name="L165"></a><tt class="py-lineno">165</tt> <tt class="py-line"> <tt class="py-op">)</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt> </tt>
+<a name="L166"></a><tt class="py-lineno">166</tt> <tt class="py-line"> <tt class="py-name">uri_space_subber</tt> <tt class="py-op">=</tt> <tt class="py-keyword">lambda</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">groups</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-keyword">or</tt> <tt class="py-string">''</tt> </tt>
+<a name="L167"></a><tt class="py-lineno">167</tt> <tt class="py-line"> </tt>
+<a name="L168"></a><tt class="py-lineno">168</tt> <tt class="py-line"> <tt class="py-name">space_sub_simple</tt> <tt class="py-op">=</tt> <tt class="py-name">_re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-op">(</tt> </tt>
+<a name="L169"></a><tt class="py-lineno">169</tt> <tt class="py-line"> <tt class="py-string">r'[\r\n\f\040\t;]+|(%(comment)s+)'</tt> </tt>
+<a name="L170"></a><tt class="py-lineno">170</tt> <tt class="py-line"> <tt class="py-op">)</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt> </tt>
+<a name="L171"></a><tt class="py-lineno">171</tt> <tt class="py-line"> <tt class="py-name">space_sub_banged</tt> <tt class="py-op">=</tt> <tt class="py-name">_re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-op">(</tt> </tt>
+<a name="L172"></a><tt class="py-lineno">172</tt> <tt class="py-line"> <tt class="py-string">r'[\r\n\f\040\t;]+|(%(_bang_comment)s+)'</tt> </tt>
+<a name="L173"></a><tt class="py-lineno">173</tt> <tt class="py-line"> <tt class="py-op">)</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt> </tt>
+<a name="L174"></a><tt class="py-lineno">174</tt> <tt class="py-line"> </tt>
+<a name="L175"></a><tt class="py-lineno">175</tt> <tt class="py-line"> <tt class="py-name">post_esc_sub</tt> <tt class="py-op">=</tt> <tt class="py-name">_re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">r'[\r\n\f\t]+'</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt> </tt>
+<a name="L176"></a><tt class="py-lineno">176</tt> <tt class="py-line"> </tt>
+<a name="L177"></a><tt class="py-lineno">177</tt> <tt class="py-line"> <tt class="py-name">main_sub</tt> <tt class="py-op">=</tt> <tt class="py-name">_re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-op">(</tt> </tt>
+<a name="L178"></a><tt class="py-lineno">178</tt> <tt class="py-line"> <tt class="py-comment"># noqa pylint: disable = C0330</tt> </tt>
+<a name="L179"></a><tt class="py-lineno">179</tt> <tt class="py-line"> <tt class="py-string">r'([^\\"\047u&gt;@\r\n\f\040\t/;:{}]+)'</tt> </tt>
+<a name="L180"></a><tt class="py-lineno">180</tt> <tt class="py-line"> <tt class="py-string">r'|(?&lt;=[{}(=:&gt;+[,!])(%(space)s+)'</tt> </tt>
+<a name="L181"></a><tt class="py-lineno">181</tt> <tt class="py-line"> <tt class="py-string">r'|^(%(space)s+)'</tt> </tt>
+<a name="L182"></a><tt class="py-lineno">182</tt> <tt class="py-line"> <tt class="py-string">r'|(%(space)s+)(?=(([:{});=&gt;+\],!])|$)?)'</tt> </tt>
+<a name="L183"></a><tt class="py-lineno">183</tt> <tt class="py-line"> <tt class="py-string">r'|;(%(space)s*(?:;%(space)s*)*)(?=(\})?)'</tt> </tt>
+<a name="L184"></a><tt class="py-lineno">184</tt> <tt class="py-line"> <tt class="py-string">r'|(\{)'</tt> </tt>
+<a name="L185"></a><tt class="py-lineno">185</tt> <tt class="py-line"> <tt class="py-string">r'|(\})'</tt> </tt>
+<a name="L186"></a><tt class="py-lineno">186</tt> <tt class="py-line"> <tt class="py-string">r'|(%(strings)s)'</tt> </tt>
+<a name="L187"></a><tt class="py-lineno">187</tt> <tt class="py-line"> <tt class="py-string">r'|(?&lt;!%(nmchar)s)url\(%(spacechar)s*('</tt> </tt>
+<a name="L188"></a><tt class="py-lineno">188</tt> <tt class="py-line"> <tt class="py-string">r'%(uri_nl_strings)s'</tt> </tt>
+<a name="L189"></a><tt class="py-lineno">189</tt> <tt class="py-line"> <tt class="py-string">r'|%(uri)s'</tt> </tt>
+<a name="L190"></a><tt class="py-lineno">190</tt> <tt class="py-line"> <tt class="py-string">r')%(spacechar)s*\)'</tt> </tt>
+<a name="L191"></a><tt class="py-lineno">191</tt> <tt class="py-line"> <tt class="py-string">r'|(@(?:'</tt> </tt>
+<a name="L192"></a><tt class="py-lineno">192</tt> <tt class="py-line"> <tt class="py-string">r'[mM][eE][dD][iI][aA]'</tt> </tt>
+<a name="L193"></a><tt class="py-lineno">193</tt> <tt class="py-line"> <tt class="py-string">r'|[sS][uU][pP][pP][oO][rR][tT][sS]'</tt> </tt>
+<a name="L194"></a><tt class="py-lineno">194</tt> <tt class="py-line"> <tt class="py-string">r'|[dD][oO][cC][uU][mM][eE][nN][tT]'</tt> </tt>
+<a name="L195"></a><tt class="py-lineno">195</tt> <tt class="py-line"> <tt class="py-string">r'|(?:-(?:'</tt> </tt>
+<a name="L196"></a><tt class="py-lineno">196</tt> <tt class="py-line"> <tt class="py-string">r'[wW][eE][bB][kK][iI][tT]|[mM][oO][zZ]|[oO]|[mM][sS]'</tt> </tt>
+<a name="L197"></a><tt class="py-lineno">197</tt> <tt class="py-line"> <tt class="py-string">r')-)?'</tt> </tt>
+<a name="L198"></a><tt class="py-lineno">198</tt> <tt class="py-line"> <tt class="py-string">r'[kK][eE][yY][fF][rR][aA][mM][eE][sS]'</tt> </tt>
+<a name="L199"></a><tt class="py-lineno">199</tt> <tt class="py-line"> <tt class="py-string">r'))(?!%(nmchar)s)'</tt> </tt>
+<a name="L200"></a><tt class="py-lineno">200</tt> <tt class="py-line"> <tt class="py-string">r'|(%(ie7hack)s)(%(space)s*)'</tt> </tt>
+<a name="L201"></a><tt class="py-lineno">201</tt> <tt class="py-line"> <tt class="py-string">r'|(:[fF][iI][rR][sS][tT]-[lL]'</tt> </tt>
+<a name="L202"></a><tt class="py-lineno">202</tt> <tt class="py-line"> <tt class="py-string">r'(?:[iI][nN][eE]|[eE][tT][tT][eE][rR]))'</tt> </tt>
+<a name="L203"></a><tt class="py-lineno">203</tt> <tt class="py-line"> <tt class="py-string">r'(%(space)s*)(?=[{,])'</tt> </tt>
+<a name="L204"></a><tt class="py-lineno">204</tt> <tt class="py-line"> <tt class="py-string">r'|(%(nl_strings)s)'</tt> </tt>
+<a name="L205"></a><tt class="py-lineno">205</tt> <tt class="py-line"> <tt class="py-string">r'|(%(escape)s[^\\"\047u&gt;@\r\n\f\040\t/;:{}]*)'</tt> </tt>
+<a name="L206"></a><tt class="py-lineno">206</tt> <tt class="py-line"> <tt class="py-op">)</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt> </tt>
+<a name="L207"></a><tt class="py-lineno">207</tt> <tt class="py-line"> </tt>
+<a name="L208"></a><tt class="py-lineno">208</tt> <tt class="py-line"> <tt class="py-comment">#print main_sub.__self__.pattern</tt> </tt>
+<a name="L209"></a><tt class="py-lineno">209</tt> <tt class="py-line"> </tt>
+<a name="L210"></a><tt class="py-lineno">210</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">main_subber</tt><tt class="py-op">(</tt><tt class="py-param">keep_bang_comments</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L211"></a><tt class="py-lineno">211</tt> <tt class="py-line"> <tt class="py-docstring">""" Make main subber """</tt> </tt>
+<a name="L212"></a><tt class="py-lineno">212</tt> <tt class="py-line"> <tt class="py-name">in_macie5</tt><tt class="py-op">,</tt> <tt class="py-name">in_rule</tt><tt class="py-op">,</tt> <tt class="py-name">at_group</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> <tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> <tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> </tt>
+<a name="L213"></a><tt class="py-lineno">213</tt> <tt class="py-line"> </tt>
+<a name="L214"></a><tt class="py-lineno">214</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">keep_bang_comments</tt><tt class="py-op">:</tt> </tt>
+<a name="L215"></a><tt class="py-lineno">215</tt> <tt class="py-line"> <tt class="py-name">space_sub</tt> <tt class="py-op">=</tt> <tt class="py-name">space_sub_banged</tt> </tt>
+<a name="L216"></a><tt class="py-lineno">216</tt> <tt class="py-line"> </tt>
+<a name="L217"></a><tt class="py-lineno">217</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">space_subber</tt><tt class="py-op">(</tt><tt class="py-param">match</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L218"></a><tt class="py-lineno">218</tt> <tt class="py-line"> <tt class="py-docstring">""" Space|Comment subber """</tt> </tt>
+<a name="L219"></a><tt class="py-lineno">219</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">match</tt><tt class="py-op">.</tt><tt class="py-name">lastindex</tt><tt class="py-op">:</tt> </tt>
+<a name="L220"></a><tt class="py-lineno">220</tt> <tt class="py-line"> <tt class="py-name">group1</tt><tt class="py-op">,</tt> <tt class="py-name">group2</tt> <tt class="py-op">=</tt> <tt class="py-name">match</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">,</tt> <tt class="py-number">2</tt><tt class="py-op">)</tt> </tt>
+<a name="L221"></a><tt class="py-lineno">221</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">group2</tt><tt class="py-op">:</tt> </tt>
+<a name="L222"></a><tt class="py-lineno">222</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">group1</tt><tt class="py-op">.</tt><tt class="py-name">endswith</tt><tt class="py-op">(</tt><tt class="py-string">r'\*/'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L223"></a><tt class="py-lineno">223</tt> <tt class="py-line"> <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">1</tt> </tt>
+<a name="L224"></a><tt class="py-lineno">224</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L225"></a><tt class="py-lineno">225</tt> <tt class="py-line"> <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L226"></a><tt class="py-lineno">226</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">group1</tt> </tt>
+<a name="L227"></a><tt class="py-lineno">227</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">group1</tt><tt class="py-op">:</tt> </tt>
+<a name="L228"></a><tt class="py-lineno">228</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">group1</tt><tt class="py-op">.</tt><tt class="py-name">endswith</tt><tt class="py-op">(</tt><tt class="py-string">r'\*/'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L229"></a><tt class="py-lineno">229</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
+<a name="L230"></a><tt class="py-lineno">230</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">''</tt> </tt>
+<a name="L231"></a><tt class="py-lineno">231</tt> <tt class="py-line"> <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">1</tt> </tt>
+<a name="L232"></a><tt class="py-lineno">232</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">r'/*\*/'</tt> </tt>
+<a name="L233"></a><tt class="py-lineno">233</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
+<a name="L234"></a><tt class="py-lineno">234</tt> <tt class="py-line"> <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L235"></a><tt class="py-lineno">235</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">'/**/'</tt> </tt>
+<a name="L236"></a><tt class="py-lineno">236</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">''</tt> </tt>
+</div><a name="L237"></a><tt class="py-lineno">237</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L238"></a><tt class="py-lineno">238</tt> <tt class="py-line"> <tt class="py-name">space_sub</tt> <tt class="py-op">=</tt> <tt class="py-name">space_sub_simple</tt> </tt>
+<a name="L239"></a><tt class="py-lineno">239</tt> <tt class="py-line"> </tt>
+<a name="L240"></a><tt class="py-lineno">240</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">space_subber</tt><tt class="py-op">(</tt><tt class="py-param">match</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L241"></a><tt class="py-lineno">241</tt> <tt class="py-line"> <tt class="py-docstring">""" Space|Comment subber """</tt> </tt>
+<a name="L242"></a><tt class="py-lineno">242</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">match</tt><tt class="py-op">.</tt><tt class="py-name">lastindex</tt><tt class="py-op">:</tt> </tt>
+<a name="L243"></a><tt class="py-lineno">243</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">match</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">endswith</tt><tt class="py-op">(</tt><tt class="py-string">r'\*/'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L244"></a><tt class="py-lineno">244</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
+<a name="L245"></a><tt class="py-lineno">245</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">''</tt> </tt>
+<a name="L246"></a><tt class="py-lineno">246</tt> <tt class="py-line"> <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">1</tt> </tt>
+<a name="L247"></a><tt class="py-lineno">247</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">r'/*\*/'</tt> </tt>
+<a name="L248"></a><tt class="py-lineno">248</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
+<a name="L249"></a><tt class="py-lineno">249</tt> <tt class="py-line"> <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L250"></a><tt class="py-lineno">250</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">'/**/'</tt> </tt>
+<a name="L251"></a><tt class="py-lineno">251</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">''</tt> </tt>
+</div><a name="L252"></a><tt class="py-lineno">252</tt> <tt class="py-line"> </tt>
+<a name="L253"></a><tt class="py-lineno">253</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">fn_space_post</tt><tt class="py-op">(</tt><tt class="py-param">group</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L254"></a><tt class="py-lineno">254</tt> <tt class="py-line"> <tt class="py-docstring">""" space with token after """</tt> </tt>
+<a name="L255"></a><tt class="py-lineno">255</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">5</tt><tt class="py-op">)</tt> <tt class="py-keyword">is</tt> <tt class="py-name">None</tt> <tt class="py-keyword">or</tt> <tt class="py-op">(</tt> </tt>
+<a name="L256"></a><tt class="py-lineno">256</tt> <tt class="py-line"> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">6</tt><tt class="py-op">)</tt> <tt class="py-op">==</tt> <tt class="py-string">':'</tt> <tt class="py-keyword">and</tt> <tt class="py-keyword">not</tt> <tt class="py-name">in_rule</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-keyword">not</tt> <tt class="py-name">at_group</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L257"></a><tt class="py-lineno">257</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">' '</tt> <tt class="py-op">+</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">4</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L258"></a><tt class="py-lineno">258</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">4</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L259"></a><tt class="py-lineno">259</tt> <tt class="py-line"> </tt>
+<a name="L260"></a><tt class="py-lineno">260</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">fn_semicolon</tt><tt class="py-op">(</tt><tt class="py-param">group</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L261"></a><tt class="py-lineno">261</tt> <tt class="py-line"> <tt class="py-docstring">""" ; handler """</tt> </tt>
+<a name="L262"></a><tt class="py-lineno">262</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">';'</tt> <tt class="py-op">+</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">7</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L263"></a><tt class="py-lineno">263</tt> <tt class="py-line"> </tt>
+<a name="L264"></a><tt class="py-lineno">264</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">fn_semicolon2</tt><tt class="py-op">(</tt><tt class="py-param">group</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L265"></a><tt class="py-lineno">265</tt> <tt class="py-line"> <tt class="py-docstring">""" ; handler """</tt> </tt>
+<a name="L266"></a><tt class="py-lineno">266</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">in_rule</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
+<a name="L267"></a><tt class="py-lineno">267</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">7</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L268"></a><tt class="py-lineno">268</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">';'</tt> <tt class="py-op">+</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">7</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L269"></a><tt class="py-lineno">269</tt> <tt class="py-line"> </tt>
+<a name="L270"></a><tt class="py-lineno">270</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">fn_open</tt><tt class="py-op">(</tt><tt class="py-param">_</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L271"></a><tt class="py-lineno">271</tt> <tt class="py-line"> <tt class="py-docstring">""" { handler """</tt> </tt>
+<a name="L272"></a><tt class="py-lineno">272</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">at_group</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
+<a name="L273"></a><tt class="py-lineno">273</tt> <tt class="py-line"> <tt class="py-name">at_group</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">-=</tt> <tt class="py-number">1</tt> </tt>
+<a name="L274"></a><tt class="py-lineno">274</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L275"></a><tt class="py-lineno">275</tt> <tt class="py-line"> <tt class="py-name">in_rule</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">1</tt> </tt>
+<a name="L276"></a><tt class="py-lineno">276</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">'{'</tt> </tt>
+</div><a name="L277"></a><tt class="py-lineno">277</tt> <tt class="py-line"> </tt>
+<a name="L278"></a><tt class="py-lineno">278</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">fn_close</tt><tt class="py-op">(</tt><tt class="py-param">_</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L279"></a><tt class="py-lineno">279</tt> <tt class="py-line"> <tt class="py-docstring">""" } handler """</tt> </tt>
+<a name="L280"></a><tt class="py-lineno">280</tt> <tt class="py-line"> <tt class="py-name">in_rule</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L281"></a><tt class="py-lineno">281</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">'}'</tt> </tt>
+</div><a name="L282"></a><tt class="py-lineno">282</tt> <tt class="py-line"> </tt>
+<a name="L283"></a><tt class="py-lineno">283</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">fn_at_group</tt><tt class="py-op">(</tt><tt class="py-param">group</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L284"></a><tt class="py-lineno">284</tt> <tt class="py-line"> <tt class="py-docstring">""" @xxx group handler """</tt> </tt>
+<a name="L285"></a><tt class="py-lineno">285</tt> <tt class="py-line"> <tt class="py-name">at_group</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">+=</tt> <tt class="py-number">1</tt> </tt>
+<a name="L286"></a><tt class="py-lineno">286</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">13</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L287"></a><tt class="py-lineno">287</tt> <tt class="py-line"> </tt>
+<a name="L288"></a><tt class="py-lineno">288</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">fn_ie7hack</tt><tt class="py-op">(</tt><tt class="py-param">group</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L289"></a><tt class="py-lineno">289</tt> <tt class="py-line"> <tt class="py-docstring">""" IE7 Hack handler """</tt> </tt>
+<a name="L290"></a><tt class="py-lineno">290</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">in_rule</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-keyword">not</tt> <tt class="py-name">at_group</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
+<a name="L291"></a><tt class="py-lineno">291</tt> <tt class="py-line"> <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L292"></a><tt class="py-lineno">292</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">14</tt><tt class="py-op">)</tt> <tt class="py-op">+</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">15</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L293"></a><tt class="py-lineno">293</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">'&gt;'</tt> <tt class="py-op">+</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">15</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L294"></a><tt class="py-lineno">294</tt> <tt class="py-line"> </tt>
+<a name="L295"></a><tt class="py-lineno">295</tt> <tt class="py-line"> <tt class="py-name">table</tt> <tt class="py-op">=</tt> <tt class="py-op">(</tt> </tt>
+<a name="L296"></a><tt class="py-lineno">296</tt> <tt class="py-line"> <tt class="py-comment"># noqa pylint: disable = C0330</tt> </tt>
+<a name="L297"></a><tt class="py-lineno">297</tt> <tt class="py-line"> <tt class="py-name">None</tt><tt class="py-op">,</tt> </tt>
+<a name="L298"></a><tt class="py-lineno">298</tt> <tt class="py-line"> <tt class="py-name">None</tt><tt class="py-op">,</tt> </tt>
+<a name="L299"></a><tt class="py-lineno">299</tt> <tt class="py-line"> <tt class="py-name">None</tt><tt class="py-op">,</tt> </tt>
+<a name="L300"></a><tt class="py-lineno">300</tt> <tt class="py-line"> <tt class="py-name">None</tt><tt class="py-op">,</tt> </tt>
+<a name="L301"></a><tt class="py-lineno">301</tt> <tt class="py-line"> <tt class="py-name">fn_space_post</tt><tt class="py-op">,</tt> <tt class="py-comment"># space with token after</tt> </tt>
+<a name="L302"></a><tt class="py-lineno">302</tt> <tt class="py-line"> <tt class="py-name">fn_space_post</tt><tt class="py-op">,</tt> <tt class="py-comment"># space with token after</tt> </tt>
+<a name="L303"></a><tt class="py-lineno">303</tt> <tt class="py-line"> <tt class="py-name">fn_space_post</tt><tt class="py-op">,</tt> <tt class="py-comment"># space with token after</tt> </tt>
+<a name="L304"></a><tt class="py-lineno">304</tt> <tt class="py-line"> <tt class="py-name">fn_semicolon</tt><tt class="py-op">,</tt> <tt class="py-comment"># semicolon</tt> </tt>
+<a name="L305"></a><tt class="py-lineno">305</tt> <tt class="py-line"> <tt class="py-name">fn_semicolon2</tt><tt class="py-op">,</tt> <tt class="py-comment"># semicolon</tt> </tt>
+<a name="L306"></a><tt class="py-lineno">306</tt> <tt class="py-line"> <tt class="py-name">fn_open</tt><tt class="py-op">,</tt> <tt class="py-comment"># {</tt> </tt>
+<a name="L307"></a><tt class="py-lineno">307</tt> <tt class="py-line"> <tt class="py-name">fn_close</tt><tt class="py-op">,</tt> <tt class="py-comment"># }</tt> </tt>
+<a name="L308"></a><tt class="py-lineno">308</tt> <tt class="py-line"> <tt class="py-keyword">lambda</tt> <tt class="py-name">g</tt><tt class="py-op">:</tt> <tt class="py-name">g</tt><tt class="py-op">(</tt><tt class="py-number">11</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-comment"># string</tt> </tt>
+<a name="L309"></a><tt class="py-lineno">309</tt> <tt class="py-line"> <tt class="py-keyword">lambda</tt> <tt class="py-name">g</tt><tt class="py-op">:</tt> <tt class="py-string">'url(%s)'</tt> <tt class="py-op">%</tt> <tt class="py-name">uri_space_sub</tt><tt class="py-op">(</tt><tt class="py-name">uri_space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">g</tt><tt class="py-op">(</tt><tt class="py-number">12</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> </tt>
+<a name="L310"></a><tt class="py-lineno">310</tt> <tt class="py-line"> <tt class="py-comment"># url(...)</tt> </tt>
+<a name="L311"></a><tt class="py-lineno">311</tt> <tt class="py-line"> <tt class="py-name">fn_at_group</tt><tt class="py-op">,</tt> <tt class="py-comment"># @xxx expecting {...}</tt> </tt>
+<a name="L312"></a><tt class="py-lineno">312</tt> <tt class="py-line"> <tt class="py-name">None</tt><tt class="py-op">,</tt> </tt>
+<a name="L313"></a><tt class="py-lineno">313</tt> <tt class="py-line"> <tt class="py-name">fn_ie7hack</tt><tt class="py-op">,</tt> <tt class="py-comment"># ie7hack</tt> </tt>
+<a name="L314"></a><tt class="py-lineno">314</tt> <tt class="py-line"> <tt class="py-name">None</tt><tt class="py-op">,</tt> </tt>
+<a name="L315"></a><tt class="py-lineno">315</tt> <tt class="py-line"> <tt class="py-keyword">lambda</tt> <tt class="py-name">g</tt><tt class="py-op">:</tt> <tt class="py-name">g</tt><tt class="py-op">(</tt><tt class="py-number">16</tt><tt class="py-op">)</tt> <tt class="py-op">+</tt> <tt class="py-string">' '</tt> <tt class="py-op">+</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">g</tt><tt class="py-op">(</tt><tt class="py-number">17</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> </tt>
+<a name="L316"></a><tt class="py-lineno">316</tt> <tt class="py-line"> <tt class="py-comment"># :first-line|letter followed</tt> </tt>
+<a name="L317"></a><tt class="py-lineno">317</tt> <tt class="py-line"> <tt class="py-comment"># by [{,] (apparently space</tt> </tt>
+<a name="L318"></a><tt class="py-lineno">318</tt> <tt class="py-line"> <tt class="py-comment"># needed for IE6)</tt> </tt>
+<a name="L319"></a><tt class="py-lineno">319</tt> <tt class="py-line"> <tt class="py-keyword">lambda</tt> <tt class="py-name">g</tt><tt class="py-op">:</tt> <tt class="py-name">nl_unesc_sub</tt><tt class="py-op">(</tt><tt class="py-string">''</tt><tt class="py-op">,</tt> <tt class="py-name">g</tt><tt class="py-op">(</tt><tt class="py-number">18</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-comment"># nl_string</tt> </tt>
+<a name="L320"></a><tt class="py-lineno">320</tt> <tt class="py-line"> <tt class="py-keyword">lambda</tt> <tt class="py-name">g</tt><tt class="py-op">:</tt> <tt class="py-name">post_esc_sub</tt><tt class="py-op">(</tt><tt class="py-string">' '</tt><tt class="py-op">,</tt> <tt class="py-name">g</tt><tt class="py-op">(</tt><tt class="py-number">19</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-comment"># escape</tt> </tt>
+<a name="L321"></a><tt class="py-lineno">321</tt> <tt class="py-line"> <tt class="py-op">)</tt> </tt>
+<a name="L322"></a><tt class="py-lineno">322</tt> <tt class="py-line"> </tt>
+<a name="L323"></a><tt class="py-lineno">323</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">func</tt><tt class="py-op">(</tt><tt class="py-param">match</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L324"></a><tt class="py-lineno">324</tt> <tt class="py-line"> <tt class="py-docstring">""" Main subber """</tt> </tt>
+<a name="L325"></a><tt class="py-lineno">325</tt> <tt class="py-line"> <tt class="py-name">idx</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt> <tt class="py-op">=</tt> <tt class="py-name">match</tt><tt class="py-op">.</tt><tt class="py-name">lastindex</tt><tt class="py-op">,</tt> <tt class="py-name">match</tt><tt class="py-op">.</tt><tt class="py-name">group</tt> </tt>
+<a name="L326"></a><tt class="py-lineno">326</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">idx</tt> <tt class="py-op">&gt;</tt> <tt class="py-number">3</tt><tt class="py-op">:</tt> </tt>
+<a name="L327"></a><tt class="py-lineno">327</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">table</tt><tt class="py-op">[</tt><tt class="py-name">idx</tt><tt class="py-op">]</tt><tt class="py-op">(</tt><tt class="py-name">group</tt><tt class="py-op">)</tt> </tt>
+<a name="L328"></a><tt class="py-lineno">328</tt> <tt class="py-line"> </tt>
+<a name="L329"></a><tt class="py-lineno">329</tt> <tt class="py-line"> <tt class="py-comment"># shortcuts for frequent operations below:</tt> </tt>
+<a name="L330"></a><tt class="py-lineno">330</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">idx</tt> <tt class="py-op">==</tt> <tt class="py-number">1</tt><tt class="py-op">:</tt> <tt class="py-comment"># not interesting</tt> </tt>
+<a name="L331"></a><tt class="py-lineno">331</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
+<a name="L332"></a><tt class="py-lineno">332</tt> <tt class="py-line"> <tt class="py-comment">#else: # space with token before or at the beginning</tt> </tt>
+<a name="L333"></a><tt class="py-lineno">333</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-name">idx</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L334"></a><tt class="py-lineno">334</tt> <tt class="py-line"> </tt>
+<a name="L335"></a><tt class="py-lineno">335</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">func</tt> </tt>
+</div><a name="L336"></a><tt class="py-lineno">336</tt> <tt class="py-line"> </tt>
+<a name="L337"></a><tt class="py-lineno">337</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">cssmin</tt><tt class="py-op">(</tt><tt class="py-param">style</tt><tt class="py-op">,</tt> <tt class="py-param">keep_bang_comments</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> <tt class="py-comment"># pylint: disable = W0621</tt> </tt>
+<a name="L338"></a><tt class="py-lineno">338</tt> <tt class="py-line"> <tt class="py-docstring">"""</tt> </tt>
+<a name="L339"></a><tt class="py-lineno">339</tt> <tt class="py-line"><tt class="py-docstring"> Minify CSS.</tt> </tt>
+<a name="L340"></a><tt class="py-lineno">340</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L341"></a><tt class="py-lineno">341</tt> <tt class="py-line"><tt class="py-docstring"> :Parameters:</tt> </tt>
+<a name="L342"></a><tt class="py-lineno">342</tt> <tt class="py-line"><tt class="py-docstring"> `style` : ``str``</tt> </tt>
+<a name="L343"></a><tt class="py-lineno">343</tt> <tt class="py-line"><tt class="py-docstring"> CSS to minify</tt> </tt>
+<a name="L344"></a><tt class="py-lineno">344</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L345"></a><tt class="py-lineno">345</tt> <tt class="py-line"><tt class="py-docstring"> `keep_bang_comments` : ``bool``</tt> </tt>
+<a name="L346"></a><tt class="py-lineno">346</tt> <tt class="py-line"><tt class="py-docstring"> Keep comments starting with an exclamation mark? (``/*!...*/``)</tt> </tt>
+<a name="L347"></a><tt class="py-lineno">347</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L348"></a><tt class="py-lineno">348</tt> <tt class="py-line"><tt class="py-docstring"> :Return: Minified style</tt> </tt>
+<a name="L349"></a><tt class="py-lineno">349</tt> <tt class="py-line"><tt class="py-docstring"> :Rtype: ``str``</tt> </tt>
+<a name="L350"></a><tt class="py-lineno">350</tt> <tt class="py-line"><tt class="py-docstring"> """</tt> </tt>
+<a name="L351"></a><tt class="py-lineno">351</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">main_sub</tt><tt class="py-op">(</tt><tt class="py-name">main_subber</tt><tt class="py-op">(</tt><tt class="py-name">keep_bang_comments</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">style</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L352"></a><tt class="py-lineno">352</tt> <tt class="py-line"> </tt>
+<a name="L353"></a><tt class="py-lineno">353</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-5" class="py-name"><a title="rcssmin.cssmin" class="py-name" href="#" onclick="return doclink('link-5', 'cssmin', 'link-4');">cssmin</a></tt> </tt>
+</div><a name="L354"></a><tt class="py-lineno">354</tt> <tt class="py-line"> </tt>
+<a name="L355"></a><tt class="py-lineno">355</tt> <tt class="py-line"><tt id="link-6" class="py-name"><a title="rcssmin.cssmin" class="py-name" href="#" onclick="return doclink('link-6', 'cssmin', 'link-4');">cssmin</a></tt> <tt class="py-op">=</tt> <tt class="py-name">_make_cssmin</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L356"></a><tt class="py-lineno">356</tt> <tt class="py-line"> </tt>
+<a name="L357"></a><tt class="py-lineno">357</tt> <tt class="py-line"> </tt>
+<a name="L358"></a><tt class="py-lineno">358</tt> <tt class="py-line"><tt class="py-keyword">if</tt> <tt class="py-name">__name__</tt> <tt class="py-op">==</tt> <tt class="py-string">'__main__'</tt><tt class="py-op">:</tt> </tt>
+<a name="main"></a><div id="main-def"><a name="L359"></a><tt class="py-lineno">359</tt> <a class="py-toggle" href="#" id="main-toggle" onclick="return toggle('main');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="rcssmin-module.html#main">main</a><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="main-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="main-expanded"><a name="L360"></a><tt class="py-lineno">360</tt> <tt class="py-line"> <tt class="py-docstring">""" Main """</tt> </tt>
+<a name="L361"></a><tt class="py-lineno">361</tt> <tt class="py-line"> <tt class="py-keyword">import</tt> <tt class="py-name">sys</tt> <tt class="py-keyword">as</tt> <tt class="py-name">_sys</tt> </tt>
+<a name="L362"></a><tt class="py-lineno">362</tt> <tt class="py-line"> <tt class="py-name">keep_bang_comments</tt> <tt class="py-op">=</tt> <tt class="py-op">(</tt> </tt>
+<a name="L363"></a><tt class="py-lineno">363</tt> <tt class="py-line"> <tt class="py-string">'-b'</tt> <tt class="py-keyword">in</tt> <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">argv</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt> </tt>
+<a name="L364"></a><tt class="py-lineno">364</tt> <tt class="py-line"> <tt class="py-keyword">or</tt> <tt class="py-string">'-bp'</tt> <tt class="py-keyword">in</tt> <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">argv</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt> </tt>
+<a name="L365"></a><tt class="py-lineno">365</tt> <tt class="py-line"> <tt class="py-keyword">or</tt> <tt class="py-string">'-pb'</tt> <tt class="py-keyword">in</tt> <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">argv</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt> </tt>
+<a name="L366"></a><tt class="py-lineno">366</tt> <tt class="py-line"> <tt class="py-op">)</tt> </tt>
+<a name="L367"></a><tt class="py-lineno">367</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-string">'-p'</tt> <tt class="py-keyword">in</tt> <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">argv</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt> <tt class="py-keyword">or</tt> <tt class="py-string">'-bp'</tt> <tt class="py-keyword">in</tt> <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">argv</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt> \ </tt>
+<a name="L368"></a><tt class="py-lineno">368</tt> <tt class="py-line"> <tt class="py-keyword">or</tt> <tt class="py-string">'-pb'</tt> <tt class="py-keyword">in</tt> <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">argv</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
+<a name="L369"></a><tt class="py-lineno">369</tt> <tt class="py-line"> <tt class="py-keyword">global</tt> <tt id="link-7" class="py-name"><a title="rcssmin.cssmin" class="py-name" href="#" onclick="return doclink('link-7', 'cssmin', 'link-4');">cssmin</a></tt> <tt class="py-comment"># pylint: disable = W0603</tt> </tt>
+<a name="L370"></a><tt class="py-lineno">370</tt> <tt class="py-line"> <tt id="link-8" class="py-name"><a title="rcssmin.cssmin" class="py-name" href="#" onclick="return doclink('link-8', 'cssmin', 'link-4');">cssmin</a></tt> <tt class="py-op">=</tt> <tt class="py-name">_make_cssmin</tt><tt class="py-op">(</tt><tt class="py-name">python_only</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">)</tt> </tt>
+<a name="L371"></a><tt class="py-lineno">371</tt> <tt class="py-line"> <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">stdout</tt><tt class="py-op">.</tt><tt class="py-name">write</tt><tt class="py-op">(</tt><tt id="link-9" class="py-name"><a title="rcssmin.cssmin" class="py-name" href="#" onclick="return doclink('link-9', 'cssmin', 'link-4');">cssmin</a></tt><tt class="py-op">(</tt> </tt>
+<a name="L372"></a><tt class="py-lineno">372</tt> <tt class="py-line"> <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">stdin</tt><tt class="py-op">.</tt><tt class="py-name">read</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">keep_bang_comments</tt><tt class="py-op">=</tt><tt class="py-name">keep_bang_comments</tt> </tt>
+<a name="L373"></a><tt class="py-lineno">373</tt> <tt class="py-line"> <tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L374"></a><tt class="py-lineno">374</tt> <tt class="py-line"> <tt class="py-name">main</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L375"></a><tt class="py-lineno">375</tt> <tt class="py-line"> </tt><script type="text/javascript">
+<!--
+expandto(location.href);
+// -->
+</script>
+</pre>
+<br />
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ >&nbsp;&nbsp;&nbsp;Home&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Tree link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Index link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Help link -->
+ <th>&nbsp;&nbsp;&nbsp;<a
+ href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/redirect.html b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/redirect.html
new file mode 100644
index 00000000000..95728fdf177
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/redirect.html
@@ -0,0 +1,38 @@
+<html><head><title>Epydoc Redirect Page</title>
+<meta http-equiv="cache-control" content="no-cache" />
+<meta http-equiv="expires" content="0" />
+<meta http-equiv="pragma" content="no-cache" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+<body>
+<script type="text/javascript">
+<!--
+var pages = ["rcssmin-m"];
+var dottedName = get_anchor();
+if (dottedName) {
+ var target = redirect_url(dottedName);
+ if (target) window.location.replace(target);
+}
+// -->
+</script>
+
+<h3>Epydoc Auto-redirect page</h3>
+
+<p>When javascript is enabled, this page will redirect URLs of
+the form <tt>redirect.html#<i>dotted.name</i></tt> to the
+documentation for the object with the given fully-qualified
+dotted name.</p>
+<p><a id="message"> &nbsp; </a></p>
+
+<script type="text/javascript">
+<!--
+if (dottedName) {
+ var msg = document.getElementById("message");
+ msg.innerHTML = "No documentation found for <tt>"+
+ dottedName+"</tt>";
+}
+// -->
+</script>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/package.cfg b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/package.cfg
new file mode 100644
index 00000000000..c09bbd0365b
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/package.cfg
@@ -0,0 +1,84 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright 2009 - 2014
+# André Malo or his licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+[package]
+name = rcssmin
+
+python.min = 2.3
+python.max = 3.4
+pypy.min = 1.9
+pypy.max = 2.2
+jython.min = 2.5
+jython.max = 2.7
+
+version.number = 1.0.5
+
+author.name = André Malo
+author.email = nd@perlig.de
+#maintainer.name =
+#maintainer.email =
+url.homepage = http://opensource.perlig.de/rcssmin/
+url.download = http://storage.perlig.de/rcssmin/
+
+
+[docs]
+meta.classifiers = docs/CLASSIFIERS
+meta.description = docs/DESCRIPTION
+meta.summary = docs/SUMMARY
+meta.provides = docs/PROVIDES
+meta.license = LICENSE
+meta.keywords =
+ CSS
+ Minimization
+
+apidoc.dir = docs/apidoc
+apidoc.strip = 1
+#apidoc.ignore =
+
+#userdoc.dir = docs/userdoc
+#userdoc.strip = 1
+#userdoc.ignore =
+# .buildinfo
+
+#examples.dir = docs/examples
+#examples.strip = 1
+#examples.ignore =
+
+#man =
+
+extra =
+ README.rst
+ docs/CHANGES
+ docs/BENCHMARKS
+
+
+[manifest]
+#packages.lib = .
+#packages.collect =
+modules = rcssmin
+
+packages.extra =
+ _setup.py2.term
+ _setup.py3.term
+
+#scripts =
+
+dist =
+ tests
+ run_tests.py
+ bench
+ bench.sh
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/rcssmin.c b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/rcssmin.c
new file mode 100644
index 00000000000..a722fc276a9
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/rcssmin.c
@@ -0,0 +1,1163 @@
+/*
+ * Copyright 2011 - 2014
+ * Andr\xe9 Malo or his licensors, as applicable
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "cext.h"
+EXT_INIT_FUNC;
+
+#ifdef EXT3
+typedef Py_UNICODE rchar;
+#else
+typedef unsigned char rchar;
+#endif
+#define U(c) ((rchar)(c))
+
+typedef struct {
+ const rchar *start;
+ const rchar *sentinel;
+ const rchar *tsentinel;
+ Py_ssize_t at_group;
+ int in_macie5;
+ int in_rule;
+ int keep_bang_comments;
+} rcssmin_ctx_t;
+
+typedef enum {
+ NEED_SPACE_MAYBE = 0,
+ NEED_SPACE_NEVER
+} need_space_flag;
+
+
+#define RCSSMIN_DULL_BIT (1 << 0)
+#define RCSSMIN_HEX_BIT (1 << 1)
+#define RCSSMIN_ESC_BIT (1 << 2)
+#define RCSSMIN_SPACE_BIT (1 << 3)
+#define RCSSMIN_STRING_DULL_BIT (1 << 4)
+#define RCSSMIN_NMCHAR_BIT (1 << 5)
+#define RCSSMIN_URI_DULL_BIT (1 << 6)
+#define RCSSMIN_PRE_CHAR_BIT (1 << 7)
+#define RCSSMIN_POST_CHAR_BIT (1 << 8)
+
+static const unsigned short rcssmin_charmask[128] = {
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 28, 8, 21, 8, 8, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 28, 469, 4, 85, 85, 85, 85, 4,
+ 149, 277, 85, 469, 469, 117, 85, 84,
+ 115, 115, 115, 115, 115, 115, 115, 115,
+ 115, 115, 468, 340, 85, 469, 468, 85,
+ 84, 115, 115, 115, 115, 115, 115, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 213, 4, 341, 85, 117,
+ 85, 115, 115, 115, 115, 115, 115, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 116, 117, 117,
+ 117, 117, 117, 468, 85, 468, 85, 21
+};
+
+#define RCSSMIN_IS_DULL(c) ((U(c) > 127) || \
+ (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_DULL_BIT))
+
+#define RCSSMIN_IS_HEX(c) ((U(c) <= 127) && \
+ (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_HEX_BIT))
+
+#define RCSSMIN_IS_ESC(c) ((U(c) > 127) || \
+ (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_ESC_BIT))
+
+#define RCSSMIN_IS_SPACE(c) ((U(c) <= 127) && \
+ (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_SPACE_BIT))
+
+#define RCSSMIN_IS_STRING_DULL(c) ((U(c) > 127) || \
+ (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_STRING_DULL_BIT))
+
+#define RCSSMIN_IS_NMCHAR(c) ((U(c) > 127) || \
+ (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_NMCHAR_BIT))
+
+#define RCSSMIN_IS_URI_DULL(c) ((U(c) > 127) || \
+ (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_URI_DULL_BIT))
+
+#define RCSSMIN_IS_PRE_CHAR(c) ((U(c) <= 127) && \
+ (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_PRE_CHAR_BIT))
+
+#define RCSSMIN_IS_POST_CHAR(c) ((U(c) <= 127) && \
+ (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_POST_CHAR_BIT))
+
+
+static const rchar pattern_url[] = {
+ /*U('u'),*/ U('r'), U('l'), U('(')
+};
+
+static const rchar pattern_ie7[] = {
+ /*U('>'),*/ U('/'), U('*'), U('*'), U('/')
+};
+
+static const rchar pattern_media[] = {
+ U('m'), U('e'), U('d'), U('i'), U('a'),
+ U('M'), U('E'), U('D'), U('I'), U('A')
+};
+
+static const rchar pattern_document[] = {
+ U('d'), U('o'), U('c'), U('u'), U('m'), U('e'), U('n'), U('t'),
+ U('D'), U('O'), U('C'), U('U'), U('M'), U('E'), U('N'), U('T')
+};
+
+static const rchar pattern_supports[] = {
+ U('s'), U('u'), U('p'), U('p'), U('o'), U('r'), U('t'), U('s'),
+ U('S'), U('U'), U('P'), U('P'), U('O'), U('R'), U('T'), U('S')
+};
+
+static const rchar pattern_keyframes[] = {
+ U('k'), U('e'), U('y'), U('f'), U('r'), U('a'), U('m'), U('e'), U('s'),
+ U('K'), U('E'), U('Y'), U('F'), U('R'), U('A'), U('M'), U('E'), U('S')
+};
+
+static const rchar pattern_vendor_o[] = {
+ U('-'), U('o'), U('-'),
+ U('-'), U('O'), U('-')
+};
+
+static const rchar pattern_vendor_moz[] = {
+ U('-'), U('m'), U('o'), U('z'), U('-'),
+ U('-'), U('M'), U('O'), U('Z'), U('-')
+};
+
+static const rchar pattern_vendor_webkit[] = {
+ U('-'), U('w'), U('e'), U('b'), U('k'), U('i'), U('t'), U('-'),
+ U('-'), U('W'), U('E'), U('B'), U('K'), U('I'), U('T'), U('-')
+};
+
+static const rchar pattern_vendor_ms[] = {
+ U('-'), U('m'), U('s'), U('-'),
+ U('-'), U('M'), U('S'), U('-')
+};
+
+static const rchar pattern_first[] = {
+ U('f'), U('i'), U('r'), U('s'), U('t'), U('-'), U('l'),
+ U('F'), U('I'), U('R'), U('S'), U('T'), U('-'), U('L')
+};
+
+static const rchar pattern_line[] = {
+ U('i'), U('n'), U('e'),
+ U('I'), U('N'), U('E'),
+};
+
+static const rchar pattern_letter[] = {
+ U('e'), U('t'), U('t'), U('e'), U('r'),
+ U('E'), U('T'), U('T'), U('E'), U('R')
+};
+
+static const rchar pattern_macie5_init[] = {
+ U('/'), U('*'), U('\\'), U('*'), U('/')
+};
+
+static const rchar pattern_macie5_exit[] = {
+ U('/'), U('*'), U('*'), U('/')
+};
+
+/*
+ * Match a pattern (and copy immediately to target)
+ */
+#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wstrict-overflow"
+#endif
+static int
+copy_match(const rchar *pattern, const rchar *psentinel,
+ const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx)
+{
+ const rchar *source = *source_;
+ rchar *target = *target_;
+ rchar c;
+
+ while (pattern < psentinel
+ && source < ctx->sentinel && target < ctx->tsentinel
+ && ((c = *source++) == *pattern++))
+ *target++ = c;
+
+ *source_ = source;
+ *target_ = target;
+
+ return (pattern == psentinel);
+}
+#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
+#pragma GCC diagnostic pop
+#endif
+
+#define MATCH(PAT, source, target, ctx) ( \
+ copy_match(pattern_##PAT, \
+ pattern_##PAT + sizeof(pattern_##PAT) / sizeof(rchar), \
+ source, target, ctx) \
+)
+
+
+/*
+ * Match a pattern (and copy immediately to target) - CI version
+ */
+static int
+copy_imatch(const rchar *pattern, const rchar *psentinel,
+ const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx)
+{
+ const rchar *source = *source_, *pstart = pattern;
+ rchar *target = *target_;
+ rchar c;
+
+ while (pattern < psentinel
+ && source < ctx->sentinel && target < ctx->tsentinel
+ && ((c = *source++) == *pattern
+ || c == pstart[(pattern - pstart) + (psentinel - pstart)])) {
+ ++pattern;
+ *target++ = c;
+ }
+
+ *source_ = source;
+ *target_ = target;
+
+ return (pattern == psentinel);
+}
+
+#define IMATCH(PAT, source, target, ctx) ( \
+ copy_imatch(pattern_##PAT, \
+ pattern_##PAT + sizeof(pattern_##PAT) / sizeof(rchar) / 2, \
+ source, target, ctx) \
+)
+
+
+/*
+ * Copy characters
+ */
+#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wstrict-overflow"
+#endif
+static int
+copy(const rchar *source, const rchar *sentinel, rchar **target_,
+ rcssmin_ctx_t *ctx)
+{
+ rchar *target = *target_;
+
+ while (source < sentinel && target < ctx->tsentinel)
+ *target++ = *source++;
+
+ *target_ = target;
+
+ return (source == sentinel);
+}
+#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
+#pragma GCC diagnostic pop
+#endif
+
+#define COPY_PAT(PAT, target, ctx) ( \
+ copy(pattern_##PAT, \
+ pattern_##PAT + sizeof(pattern_##PAT) / sizeof(rchar), \
+ target, ctx) \
+)
+
+
+/*
+ * The ABORT macros work with known local variables!
+ */
+#define ABORT_(RET) do { \
+ if (source < ctx->sentinel && !(target < ctx->tsentinel)) { \
+ *source_ = source; \
+ *target_ = target; \
+ } \
+ return RET; \
+} while(0)
+
+
+#define CRAPPY_C90_COMPATIBLE_EMPTY
+#define ABORT ABORT_(CRAPPY_C90_COMPATIBLE_EMPTY)
+#define RABORT(RET) ABORT_((RET))
+
+
+/*
+ * Copy escape
+ */
+static void
+copy_escape(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx)
+{
+ const rchar *source = *source_, *hsentinel;
+ rchar *target = *target_;
+ rchar c;
+
+ *target++ = U('\\');
+ *target_ = target;
+
+ if (source < ctx->sentinel && target < ctx->tsentinel) {
+ c = *source++;
+ if (RCSSMIN_IS_ESC(c)) {
+ *target++ = c;
+ }
+ else if (RCSSMIN_IS_HEX(c)) {
+ *target++ = c;
+
+ /* 6 hex chars max, one we got already */
+ if (ctx->sentinel - source > 5)
+ hsentinel = source + 5;
+ else
+ hsentinel = ctx->sentinel;
+
+ while (source < hsentinel && target < ctx->tsentinel
+ && (c = *source, RCSSMIN_IS_HEX(c))) {
+ ++source;
+ *target++ = c;
+ }
+
+ /* One optional space after */
+ if (source < ctx->sentinel && target < ctx->tsentinel) {
+ if (source == hsentinel)
+ c = *source;
+ if (RCSSMIN_IS_SPACE(c)) {
+ ++source;
+ *target++ = U(' ');
+ if (c == U('\r') && source < ctx->sentinel
+ && *source == U('\n'))
+ ++source;
+ }
+ }
+ }
+ }
+
+ *target_ = target;
+ *source_ = source;
+}
+
+
+/*
+ * Copy string
+ */
+static void
+copy_string(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx)
+{
+ const rchar *source = *source_;
+ rchar *target = *target_;
+ rchar c, quote = source[-1];
+
+ *target++ = quote;
+ *target_ = target;
+
+ while (source < ctx->sentinel && target < ctx->tsentinel) {
+ c = *target++ = *source++;
+ if (RCSSMIN_IS_STRING_DULL(c))
+ continue;
+
+ switch (c) {
+ case U('\''): case U('"'):
+ if (c == quote) {
+ *target_ = target;
+ *source_ = source;
+ return;
+ }
+ continue;
+
+ case U('\\'):
+ if (source < ctx->sentinel && target < ctx->tsentinel) {
+ c = *source++;
+ switch (c) {
+ case U('\r'):
+ if (source < ctx->sentinel && *source == U('\n'))
+ ++source;
+ /* fall through */
+
+ case U('\n'): case U('\f'):
+ --target;
+ break;
+
+ default:
+ *target++ = c;
+ }
+ }
+ continue;
+ }
+ break; /* forbidden characters */
+ }
+
+ ABORT;
+}
+
+
+/*
+ * Copy URI string
+ */
+static int
+copy_uri_string(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx)
+{
+ const rchar *source = *source_;
+ rchar *target = *target_;
+ rchar c, quote = source[-1];
+
+ *target++ = quote;
+ *target_ = target;
+
+ while (source < ctx->sentinel && target < ctx->tsentinel) {
+ c = *source++;
+ if (RCSSMIN_IS_SPACE(c))
+ continue;
+ *target++ = c;
+ if (RCSSMIN_IS_STRING_DULL(c))
+ continue;
+
+ switch (c) {
+ case U('\''): case U('"'):
+ if (c == quote) {
+ *target_ = target;
+ *source_ = source;
+ return 0;
+ }
+ continue;
+
+ case U('\\'):
+ if (source < ctx->sentinel && target < ctx->tsentinel) {
+ c = *source;
+ switch (c) {
+ case U('\r'):
+ if ((source + 1) < ctx->sentinel && source[1] == U('\n'))
+ ++source;
+ /* fall through */
+
+ case U('\n'): case U('\f'):
+ --target;
+ ++source;
+ break;
+
+ default:
+ --target;
+ copy_escape(&source, &target, ctx);
+ }
+ }
+ continue;
+ }
+
+ break; /* forbidden characters */
+ }
+
+ RABORT(-1);
+}
+
+
+/*
+ * Copy URI (unquoted)
+ */
+static int
+copy_uri_unquoted(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx)
+{
+ const rchar *source = *source_;
+ rchar *target = *target_;
+ rchar c;
+
+ *target++ = source[-1];
+ *target_ = target;
+
+ while (source < ctx->sentinel && target < ctx->tsentinel) {
+ c = *source++;
+ if (RCSSMIN_IS_SPACE(c))
+ continue;
+ *target++ = c;
+ if (RCSSMIN_IS_URI_DULL(c))
+ continue;
+
+ switch (c) {
+
+ case U(')'):
+ *target_ = target - 1;
+ *source_ = source - 1;
+ return 0;
+
+ case U('\\'):
+ if (source < ctx->sentinel && target < ctx->tsentinel) {
+ c = *source;
+ switch (c) {
+ case U('\r'):
+ if ((source + 1) < ctx->sentinel && source[1] == U('\n'))
+ ++source;
+ /* fall through */
+
+ case U('\n'): case U('\f'):
+ --target;
+ ++source;
+ break;
+
+ default:
+ --target;
+ copy_escape(&source, &target, ctx);
+ }
+ }
+ continue;
+ }
+
+ break; /* forbidden characters */
+ }
+
+ RABORT(-1);
+}
+
+
+/*
+ * Copy url
+ */
+static void
+copy_url(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx)
+{
+ const rchar *source = *source_;
+ rchar *target = *target_;
+ rchar c;
+
+ *target++ = U('u');
+ *target_ = target;
+
+ /* Must not be inside an identifier */
+ if ((source != ctx->start + 1) && RCSSMIN_IS_NMCHAR(source[-2]))
+ return;
+
+ if (!MATCH(url, &source, &target, ctx)
+ || !(source < ctx->sentinel && target < ctx->tsentinel))
+ ABORT;
+
+ while (source < ctx->sentinel && RCSSMIN_IS_SPACE(*source))
+ ++source;
+
+ if (!(source < ctx->sentinel))
+ ABORT;
+
+ c = *source++;
+ switch (c) {
+ case U('"'): case U('\''):
+ if (copy_uri_string(&source, &target, ctx) == -1)
+ ABORT;
+
+ while (source < ctx->sentinel && RCSSMIN_IS_SPACE(*source))
+ ++source;
+ break;
+
+ default:
+ if (copy_uri_unquoted(&source, &target, ctx) == -1)
+ ABORT;
+ }
+
+ if (!(source < ctx->sentinel && target < ctx->tsentinel))
+ ABORT;
+
+ if ((*target++ = *source++) != U(')'))
+ ABORT;
+
+ *target_ = target;
+ *source_ = source;
+}
+
+
+/*
+ * Copy @-group
+ */
+static void
+copy_at_group(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx)
+{
+ const rchar *source = *source_;
+ rchar *target = *target_;
+
+ *target++ = U('@');
+ *target_ = target;
+
+#define REMATCH(what) ( \
+ source = *source_, \
+ target = *target_, \
+ IMATCH(what, &source, &target, ctx) \
+)
+#define CMATCH(what) IMATCH(what, &source, &target, ctx)
+
+ if (( !CMATCH(media)
+ && !REMATCH(supports)
+ && !REMATCH(document)
+ && !REMATCH(keyframes)
+ && !(REMATCH(vendor_webkit) && CMATCH(keyframes))
+ && !(REMATCH(vendor_moz) && CMATCH(keyframes))
+ && !(REMATCH(vendor_o) && CMATCH(keyframes))
+ && !(REMATCH(vendor_ms) && CMATCH(keyframes)))
+ || !(source < ctx->sentinel && target < ctx->tsentinel)
+ || RCSSMIN_IS_NMCHAR(*source))
+ ABORT;
+
+#undef CMATCH
+#undef REMATCH
+
+ ++ctx->at_group;
+
+ *target_ = target;
+ *source_ = source;
+}
+
+
+/*
+ * Skip space
+ */
+static const rchar *
+skip_space(const rchar *source, rcssmin_ctx_t *ctx)
+{
+ const rchar *begin = source;
+ int res;
+ rchar c;
+
+ while (source < ctx->sentinel) {
+ c = *source;
+ if (RCSSMIN_IS_SPACE(c)) {
+ ++source;
+ continue;
+ }
+ else if (c == U('/')) {
+ ++source;
+ if (!(source < ctx->sentinel && *source == U('*'))) {
+ --source;
+ break;
+ }
+ ++source;
+ res = 0;
+ while (source < ctx->sentinel) {
+ c = *source++;
+ if (c != U('*'))
+ continue;
+ if (!(source < ctx->sentinel))
+ return begin;
+ if (*source != U('/'))
+ continue;
+
+ /* Comment complete */
+ ++source;
+ res = 1;
+ break;
+ }
+ if (!res)
+ return begin;
+
+ continue;
+ }
+
+ break;
+ }
+
+ return source;
+}
+
+
+/*
+ * Copy space
+ */
+static void
+copy_space(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx,
+ need_space_flag need_space)
+{
+ const rchar *source = *source_, *end, *comment;
+ rchar *target = *target_;
+ int res;
+ rchar c;
+
+ --source;
+ if (need_space == NEED_SPACE_MAYBE
+ && source > ctx->start
+ && !RCSSMIN_IS_PRE_CHAR(source[-1])
+ && (end = skip_space(source, ctx)) < ctx->sentinel
+ && (!RCSSMIN_IS_POST_CHAR(*end)
+ || (*end == U(':') && !ctx->in_rule && !ctx->at_group))) {
+
+ if (!(target < ctx->tsentinel))
+ ABORT;
+ *target++ = U(' ');
+ }
+
+ while (source < ctx->sentinel) {
+ switch (c = *source) {
+
+ /* comment */
+ case U('/'):
+ comment = source++;
+ if (!((source < ctx->sentinel && *source == U('*')))) {
+ --source;
+ break;
+ }
+ ++source;
+ res = 0;
+ while (source < ctx->sentinel) {
+ c = *source++;
+ if (c != U('*'))
+ continue;
+ if (!(source < ctx->sentinel))
+ ABORT;
+ if (*source != U('/'))
+ continue;
+
+ /* Comment complete */
+ ++source;
+ res = 1;
+
+ if (ctx->keep_bang_comments && comment[2] == U('!')) {
+ ctx->in_macie5 = (source[-3] == U('\\'));
+ if (!copy(comment, source, &target, ctx))
+ ABORT;
+ }
+ else if (source[-3] == U('\\')) {
+ if (!ctx->in_macie5) {
+ if (!COPY_PAT(macie5_init, &target, ctx))
+ ABORT;
+ }
+ ctx->in_macie5 = 1;
+ }
+ else if (ctx->in_macie5) {
+ if (!COPY_PAT(macie5_exit, &target, ctx))
+ ABORT;
+ ctx->in_macie5 = 0;
+ }
+ /* else don't copy anything */
+ break;
+ }
+ if (!res)
+ ABORT;
+ continue;
+
+ /* space */
+ case U(' '): case U('\t'): case U('\r'): case U('\n'): case U('\f'):
+ ++source;
+ continue;
+ }
+
+ break;
+ }
+
+ *source_ = source;
+ *target_ = target;
+}
+
+
+/*
+ * Copy space if comment
+ */
+static int
+copy_space_comment(const rchar **source_, rchar **target_,
+ rcssmin_ctx_t *ctx, need_space_flag need_space)
+{
+ const rchar *source = *source_;
+ rchar *target = *target_;
+
+ if (source < ctx->sentinel && *source == U('*')) {
+ copy_space(source_, target_, ctx, need_space);
+ if (*source_ > source)
+ return 0;
+ }
+ if (!(target < ctx->tsentinel))
+ RABORT(-1);
+
+ *target++ = source[-1];
+
+ /* *source_ = source; <-- unchanged */
+ *target_ = target;
+
+ return -1;
+}
+
+
+/*
+ * Copy space if exists
+ */
+static int
+copy_space_optional(const rchar **source_, rchar **target_,
+ rcssmin_ctx_t *ctx)
+{
+ const rchar *source = *source_;
+
+ if (!(source < ctx->sentinel))
+ return -1;
+
+ if (*source == U('/')) {
+ *source_ = source + 1;
+ return copy_space_comment(source_, target_, ctx, NEED_SPACE_NEVER);
+ }
+ else if (RCSSMIN_IS_SPACE(*source)) {
+ *source_ = source + 1;
+ copy_space(source_, target_, ctx, NEED_SPACE_NEVER);
+ return 0;
+ }
+
+ return -1;
+}
+
+
+/*
+ * Copy :first-line|letter
+ */
+static void
+copy_first(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx)
+{
+ const rchar *source = *source_, *next, *source_fork;
+ rchar *target = *target_, *target_fork;
+
+ *target++ = U(':');
+ *target_ = target;
+
+ if (!IMATCH(first, &source, &target, ctx)
+ || !(source < ctx->sentinel && target < ctx->tsentinel))
+ ABORT;
+
+ source_fork = source;
+ target_fork = target;
+
+ if (!IMATCH(line, &source, &target, ctx)) {
+ source = source_fork;
+ target = target_fork;
+
+ if (!IMATCH(letter, &source, &target, ctx)
+ || !(source < ctx->sentinel && target < ctx->tsentinel))
+ ABORT;
+ }
+
+ next = skip_space(source, ctx);
+ if (!(next < ctx->sentinel && target < ctx->tsentinel
+ && (*next == U('{') || *next == U(','))))
+ ABORT;
+
+ *target++ = U(' ');
+ *target_ = target;
+ *source_ = source;
+ (void)copy_space_optional(source_, target_, ctx);
+}
+
+
+/*
+ * Copy IE7 hack
+ */
+static void
+copy_ie7hack(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx)
+{
+ const rchar *source = *source_;
+ rchar *target = *target_;
+
+ *target++ = U('>');
+ *target_ = target;
+
+ if (ctx->in_rule || ctx->at_group)
+ return; /* abort */
+
+ if (!MATCH(ie7, &source, &target, ctx))
+ ABORT;
+
+ ctx->in_macie5 = 0;
+
+ *target_ = target;
+ *source_ = source;
+
+ (void)copy_space_optional(source_, target_, ctx);
+}
+
+
+/*
+ * Copy semicolon; miss out duplicates or even this one (before '}')
+ */
+static void
+copy_semicolon(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx)
+{
+ const rchar *source = *source_, *begin, *end;
+ rchar *target = *target_;
+
+ begin = source;
+ while (source < ctx->sentinel) {
+ end = skip_space(source, ctx);
+ if (!(end < ctx->sentinel)) {
+ if (!(target < ctx->tsentinel))
+ ABORT;
+ *target++ = U(';');
+ break;
+ }
+ switch (*end) {
+ case U(';'):
+ source = end + 1;
+ continue;
+
+ case U('}'):
+ if (ctx->in_rule)
+ break;
+
+ /* fall through */
+ default:
+ if (!(target < ctx->tsentinel))
+ ABORT;
+ *target++ = U(';');
+ break;
+ }
+
+ break;
+ }
+
+ source = begin;
+ *target_ = target;
+ while (source < ctx->sentinel) {
+ if (*source == U(';')) {
+ ++source;
+ continue;
+ }
+
+ if (copy_space_optional(&source, target_, ctx) == 0)
+ continue;
+
+ break;
+ }
+
+ *source_ = source;
+}
+
+
+/*
+ * Main function
+ *
+ * The return value determines the result length (kept in the target buffer).
+ * However, if the target buffer is too small, the return value is greater
+ * than tlength. The difference to tlength is the number of unconsumed source
+ * characters at the time the buffer was full. In this case you should resize
+ * the target buffer to the return value and call rcssmin again. Repeat as
+ * often as needed.
+ */
+static Py_ssize_t
+rcssmin(const rchar *source, rchar *target, Py_ssize_t slength,
+ Py_ssize_t tlength, int keep_bang_comments)
+{
+ rcssmin_ctx_t ctx_, *ctx = &ctx_;
+ const rchar *tstart = target;
+ rchar c;
+
+ ctx->start = source;
+ ctx->sentinel = source + slength;
+ ctx->tsentinel = target + tlength;
+ ctx->at_group = 0;
+ ctx->in_macie5 = 0;
+ ctx->in_rule = 0;
+ ctx->keep_bang_comments = keep_bang_comments;
+
+ while (source < ctx->sentinel && target < ctx->tsentinel) {
+ c = *source++;
+ if (RCSSMIN_IS_DULL(c)) {
+ *target++ = c;
+ continue;
+ }
+ else if (RCSSMIN_IS_SPACE(c)) {
+ copy_space(&source, &target, ctx, NEED_SPACE_MAYBE);
+ continue;
+ }
+
+ switch (c) {
+
+ /* Escape */
+ case U('\\'):
+ copy_escape(&source, &target, ctx);
+ continue;
+
+ /* String */
+ case U('"'): case U('\''):
+ copy_string(&source, &target, ctx);
+ continue;
+
+ /* URL */
+ case U('u'):
+ copy_url(&source, &target, ctx);
+ continue;
+
+ /* IE7hack */
+ case U('>'):
+ copy_ie7hack(&source, &target, ctx);
+ continue;
+
+ /* @-group */
+ case U('@'):
+ copy_at_group(&source, &target, ctx);
+ continue;
+
+ /* ; */
+ case U(';'):
+ copy_semicolon(&source, &target, ctx);
+ continue;
+
+ /* :first-line|letter followed by [{,] */
+ /* (apparently needed for IE6) */
+ case U(':'):
+ copy_first(&source, &target, ctx);
+ continue;
+
+ /* { */
+ case U('{'):
+ if (ctx->at_group)
+ --ctx->at_group;
+ else
+ ++ctx->in_rule;
+ *target++ = c;
+ continue;
+
+ /* } */
+ case U('}'):
+ if (ctx->in_rule)
+ --ctx->in_rule;
+ *target++ = c;
+ continue;
+
+ /* space starting with comment */
+ case U('/'):
+ (void)copy_space_comment(&source, &target, ctx, NEED_SPACE_MAYBE);
+ continue;
+
+ /* Fallback: copy character. Better safe than sorry. Should not be
+ * reached, though */
+ default:
+ *target++ = c;
+ continue;
+ }
+ }
+
+ return
+ (Py_ssize_t)(target - tstart) + (Py_ssize_t)(ctx->sentinel - source);
+}
+
+
+PyDoc_STRVAR(rcssmin_cssmin__doc__,
+"cssmin(style, keep_bang_comments=False)\n\
+\n\
+Minify CSS.\n\
+\n\
+:Note: This is a hand crafted C implementation built on the regex\n\
+ semantics.\n\
+\n\
+:Parameters:\n\
+ `style` : ``str``\n\
+ CSS to minify\n\
+\n\
+:Return: Minified style\n\
+:Rtype: ``str``");
+
+static PyObject *
+rcssmin_cssmin(PyObject *self, PyObject *args, PyObject *kwds)
+{
+ PyObject *style, *keep_bang_comments_ = NULL, *result;
+ static char *kwlist[] = {"style", "keep_bang_comments", NULL};
+ Py_ssize_t rlength, slength, length;
+ int keep_bang_comments;
+#ifdef EXT2
+ int uni;
+#define UOBJ "O"
+#endif
+#ifdef EXT3
+#define UOBJ "U"
+#endif
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, UOBJ "|O", kwlist,
+ &style, &keep_bang_comments_))
+ return NULL;
+
+ if (!keep_bang_comments_)
+ keep_bang_comments = 0;
+ else {
+ keep_bang_comments = PyObject_IsTrue(keep_bang_comments_);
+ if (keep_bang_comments == -1)
+ return NULL;
+ }
+
+#ifdef EXT2
+ if (PyUnicode_Check(style)) {
+ if (!(style = PyUnicode_AsUTF8String(style)))
+ return NULL;
+ uni = 1;
+ }
+ else {
+ if (!(style = PyObject_Str(style)))
+ return NULL;
+ uni = 0;
+ }
+#endif
+
+#ifdef EXT3
+ Py_INCREF(style);
+#define PyString_GET_SIZE PyUnicode_GET_SIZE
+#define PyString_AS_STRING PyUnicode_AS_UNICODE
+#define _PyString_Resize PyUnicode_Resize
+#define PyString_FromStringAndSize PyUnicode_FromUnicode
+#endif
+
+ rlength = slength = PyString_GET_SIZE(style);
+
+again:
+ if (!(result = PyString_FromStringAndSize(NULL, rlength))) {
+ Py_DECREF(style);
+ return NULL;
+ }
+ Py_BEGIN_ALLOW_THREADS
+ length = rcssmin((rchar *)PyString_AS_STRING(style),
+ (rchar *)PyString_AS_STRING(result),
+ slength, rlength, keep_bang_comments);
+ Py_END_ALLOW_THREADS
+
+ if (length > rlength) {
+ Py_DECREF(result);
+ rlength = length;
+ goto again;
+ }
+
+ Py_DECREF(style);
+ if (length < 0) {
+ Py_DECREF(result);
+ return NULL;
+ }
+ if (length != rlength && _PyString_Resize(&result, length) == -1)
+ return NULL;
+
+#ifdef EXT2
+ if (uni) {
+ style = PyUnicode_DecodeUTF8(PyString_AS_STRING(result),
+ PyString_GET_SIZE(result), "strict");
+ Py_DECREF(result);
+ if (!style)
+ return NULL;
+ result = style;
+ }
+#endif
+ return result;
+}
+
+/* ------------------------ BEGIN MODULE DEFINITION ------------------------ */
+
+EXT_METHODS = {
+ {"cssmin",
+ (PyCFunction)rcssmin_cssmin, METH_VARARGS | METH_KEYWORDS,
+ rcssmin_cssmin__doc__},
+
+ {NULL} /* Sentinel */
+};
+
+PyDoc_STRVAR(EXT_DOCS_VAR,
+"C implementation of rcssmin\n\
+===========================\n\
+\n\
+C implementation of rcssmin.");
+
+
+EXT_DEFINE(EXT_MODULE_NAME, EXT_METHODS_VAR, EXT_DOCS_VAR);
+
+EXT_INIT_FUNC {
+ PyObject *m;
+
+ /* Create the module and populate stuff */
+ if (!(m = EXT_CREATE(&EXT_DEFINE_VAR)))
+ EXT_INIT_ERROR(NULL);
+
+ EXT_ADD_UNICODE(m, "__author__", "Andr\xe9 Malo", "latin-1");
+ EXT_ADD_STRING(m, "__docformat__", "restructuredtext en");
+
+ EXT_INIT_RETURN(m);
+}
+
+/* ------------------------- END MODULE DEFINITION ------------------------- */
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/rcssmin.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/rcssmin.py
new file mode 100644
index 00000000000..ae1cefc3396
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/rcssmin.py
@@ -0,0 +1,374 @@
+#!/usr/bin/env python
+# -*- coding: ascii -*-
+r"""
+==============
+ CSS Minifier
+==============
+
+CSS Minifier.
+
+The minifier is based on the semantics of the `YUI compressor`_\\, which
+itself is based on `the rule list by Isaac Schlueter`_\\.
+
+:Copyright:
+
+ Copyright 2011 - 2014
+ Andr\xe9 Malo or his licensors, as applicable
+
+:License:
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+This module is a re-implementation aiming for speed instead of maximum
+compression, so it can be used at runtime (rather than during a preprocessing
+step). RCSSmin does syntactical compression only (removing spaces, comments
+and possibly semicolons). It does not provide semantic compression (like
+removing empty blocks, collapsing redundant properties etc). It does, however,
+support various CSS hacks (by keeping them working as intended).
+
+Here's a feature list:
+
+- Strings are kept, except that escaped newlines are stripped
+- Space/Comments before the very end or before various characters are
+ stripped: ``:{});=>+],!`` (The colon (``:``) is a special case, a single
+ space is kept if it's outside a ruleset.)
+- Space/Comments at the very beginning or after various characters are
+ stripped: ``{}(=:>+[,!``
+- Optional space after unicode escapes is kept, resp. replaced by a simple
+ space
+- whitespaces inside ``url()`` definitions are stripped
+- Comments starting with an exclamation mark (``!``) can be kept optionally.
+- All other comments and/or whitespace characters are replaced by a single
+ space.
+- Multiple consecutive semicolons are reduced to one
+- The last semicolon within a ruleset is stripped
+- CSS Hacks supported:
+
+ - IE7 hack (``>/**/``)
+ - Mac-IE5 hack (``/*\\*/.../**/``)
+ - The boxmodelhack is supported naturally because it relies on valid CSS2
+ strings
+ - Between ``:first-line`` and the following comma or curly brace a space is
+ inserted. (apparently it's needed for IE6)
+ - Same for ``:first-letter``
+
+rcssmin.c is a reimplementation of rcssmin.py in C and improves runtime up to
+factor 100 or so (depending on the input). docs/BENCHMARKS in the source
+distribution contains the details.
+
+Both python 2 (>= 2.4) and python 3 are supported.
+
+.. _YUI compressor: https://github.com/yui/yuicompressor/
+
+.. _the rule list by Isaac Schlueter: https://github.com/isaacs/cssmin/
+"""
+if __doc__:
+ # pylint: disable = W0622
+ __doc__ = __doc__.encode('ascii').decode('unicode_escape')
+__author__ = r"Andr\xe9 Malo".encode('ascii').decode('unicode_escape')
+__docformat__ = "restructuredtext en"
+__license__ = "Apache License, Version 2.0"
+__version__ = '1.0.5'
+__all__ = ['cssmin']
+
+import re as _re
+
+
+def _make_cssmin(python_only=False):
+ """
+ Generate CSS minifier.
+
+ :Parameters:
+ `python_only` : ``bool``
+ Use only the python variant. If true, the c extension is not even
+ tried to be loaded.
+
+ :Return: Minifier
+ :Rtype: ``callable``
+ """
+ # pylint: disable = R0912, R0914, W0612
+
+ if not python_only:
+ try:
+ import _rcssmin
+ except ImportError:
+ pass
+ else:
+ return _rcssmin.cssmin
+
+ nl = r'(?:[\n\f]|\r\n?)' # pylint: disable = C0103
+ spacechar = r'[\r\n\f\040\t]'
+
+ unicoded = r'[0-9a-fA-F]{1,6}(?:[\040\n\t\f]|\r\n?)?'
+ escaped = r'[^\n\r\f0-9a-fA-F]'
+ escape = r'(?:\\(?:%(unicoded)s|%(escaped)s))' % locals()
+
+ nmchar = r'[^\000-\054\056\057\072-\100\133-\136\140\173-\177]'
+ #nmstart = r'[^\000-\100\133-\136\140\173-\177]'
+ #ident = (r'(?:'
+ # r'-?(?:%(nmstart)s|%(escape)s)%(nmchar)s*(?:%(escape)s%(nmchar)s*)*'
+ #r')') % locals()
+
+ comment = r'(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)'
+
+ # only for specific purposes. The bang is grouped:
+ _bang_comment = r'(?:/\*(!?)[^*]*\*+(?:[^/*][^*]*\*+)*/)'
+
+ string1 = \
+ r'(?:\047[^\047\\\r\n\f]*(?:\\[^\r\n\f][^\047\\\r\n\f]*)*\047)'
+ string2 = r'(?:"[^"\\\r\n\f]*(?:\\[^\r\n\f][^"\\\r\n\f]*)*")'
+ strings = r'(?:%s|%s)' % (string1, string2)
+
+ nl_string1 = \
+ r'(?:\047[^\047\\\r\n\f]*(?:\\(?:[^\r]|\r\n?)[^\047\\\r\n\f]*)*\047)'
+ nl_string2 = r'(?:"[^"\\\r\n\f]*(?:\\(?:[^\r]|\r\n?)[^"\\\r\n\f]*)*")'
+ nl_strings = r'(?:%s|%s)' % (nl_string1, nl_string2)
+
+ uri_nl_string1 = r'(?:\047[^\047\\]*(?:\\(?:[^\r]|\r\n?)[^\047\\]*)*\047)'
+ uri_nl_string2 = r'(?:"[^"\\]*(?:\\(?:[^\r]|\r\n?)[^"\\]*)*")'
+ uri_nl_strings = r'(?:%s|%s)' % (uri_nl_string1, uri_nl_string2)
+
+ nl_escaped = r'(?:\\%(nl)s)' % locals()
+
+ space = r'(?:%(spacechar)s|%(comment)s)' % locals()
+
+ ie7hack = r'(?:>/\*\*/)'
+
+ uri = (r'(?:'
+ # noqa pylint: disable = C0330
+ r'(?:[^\000-\040"\047()\\\177]*'
+ r'(?:%(escape)s[^\000-\040"\047()\\\177]*)*)'
+ r'(?:'
+ r'(?:%(spacechar)s+|%(nl_escaped)s+)'
+ r'(?:'
+ r'(?:[^\000-\040"\047()\\\177]|%(escape)s|%(nl_escaped)s)'
+ r'[^\000-\040"\047()\\\177]*'
+ r'(?:%(escape)s[^\000-\040"\047()\\\177]*)*'
+ r')+'
+ r')*'
+ r')') % locals()
+
+ nl_unesc_sub = _re.compile(nl_escaped).sub
+
+ uri_space_sub = _re.compile((
+ r'(%(escape)s+)|%(spacechar)s+|%(nl_escaped)s+'
+ ) % locals()).sub
+ uri_space_subber = lambda m: m.groups()[0] or ''
+
+ space_sub_simple = _re.compile((
+ r'[\r\n\f\040\t;]+|(%(comment)s+)'
+ ) % locals()).sub
+ space_sub_banged = _re.compile((
+ r'[\r\n\f\040\t;]+|(%(_bang_comment)s+)'
+ ) % locals()).sub
+
+ post_esc_sub = _re.compile(r'[\r\n\f\t]+').sub
+
+ main_sub = _re.compile((
+ # noqa pylint: disable = C0330
+ r'([^\\"\047u>@\r\n\f\040\t/;:{}]+)'
+ r'|(?<=[{}(=:>+[,!])(%(space)s+)'
+ r'|^(%(space)s+)'
+ r'|(%(space)s+)(?=(([:{});=>+\],!])|$)?)'
+ r'|;(%(space)s*(?:;%(space)s*)*)(?=(\})?)'
+ r'|(\{)'
+ r'|(\})'
+ r'|(%(strings)s)'
+ r'|(?<!%(nmchar)s)url\(%(spacechar)s*('
+ r'%(uri_nl_strings)s'
+ r'|%(uri)s'
+ r')%(spacechar)s*\)'
+ r'|(@(?:'
+ r'[mM][eE][dD][iI][aA]'
+ r'|[sS][uU][pP][pP][oO][rR][tT][sS]'
+ r'|[dD][oO][cC][uU][mM][eE][nN][tT]'
+ r'|(?:-(?:'
+ r'[wW][eE][bB][kK][iI][tT]|[mM][oO][zZ]|[oO]|[mM][sS]'
+ r')-)?'
+ r'[kK][eE][yY][fF][rR][aA][mM][eE][sS]'
+ r'))(?!%(nmchar)s)'
+ r'|(%(ie7hack)s)(%(space)s*)'
+ r'|(:[fF][iI][rR][sS][tT]-[lL]'
+ r'(?:[iI][nN][eE]|[eE][tT][tT][eE][rR]))'
+ r'(%(space)s*)(?=[{,])'
+ r'|(%(nl_strings)s)'
+ r'|(%(escape)s[^\\"\047u>@\r\n\f\040\t/;:{}]*)'
+ ) % locals()).sub
+
+ #print main_sub.__self__.pattern
+
+ def main_subber(keep_bang_comments):
+ """ Make main subber """
+ in_macie5, in_rule, at_group = [0], [0], [0]
+
+ if keep_bang_comments:
+ space_sub = space_sub_banged
+
+ def space_subber(match):
+ """ Space|Comment subber """
+ if match.lastindex:
+ group1, group2 = match.group(1, 2)
+ if group2:
+ if group1.endswith(r'\*/'):
+ in_macie5[0] = 1
+ else:
+ in_macie5[0] = 0
+ return group1
+ elif group1:
+ if group1.endswith(r'\*/'):
+ if in_macie5[0]:
+ return ''
+ in_macie5[0] = 1
+ return r'/*\*/'
+ elif in_macie5[0]:
+ in_macie5[0] = 0
+ return '/**/'
+ return ''
+ else:
+ space_sub = space_sub_simple
+
+ def space_subber(match):
+ """ Space|Comment subber """
+ if match.lastindex:
+ if match.group(1).endswith(r'\*/'):
+ if in_macie5[0]:
+ return ''
+ in_macie5[0] = 1
+ return r'/*\*/'
+ elif in_macie5[0]:
+ in_macie5[0] = 0
+ return '/**/'
+ return ''
+
+ def fn_space_post(group):
+ """ space with token after """
+ if group(5) is None or (
+ group(6) == ':' and not in_rule[0] and not at_group[0]):
+ return ' ' + space_sub(space_subber, group(4))
+ return space_sub(space_subber, group(4))
+
+ def fn_semicolon(group):
+ """ ; handler """
+ return ';' + space_sub(space_subber, group(7))
+
+ def fn_semicolon2(group):
+ """ ; handler """
+ if in_rule[0]:
+ return space_sub(space_subber, group(7))
+ return ';' + space_sub(space_subber, group(7))
+
+ def fn_open(_):
+ """ { handler """
+ if at_group[0]:
+ at_group[0] -= 1
+ else:
+ in_rule[0] = 1
+ return '{'
+
+ def fn_close(_):
+ """ } handler """
+ in_rule[0] = 0
+ return '}'
+
+ def fn_at_group(group):
+ """ @xxx group handler """
+ at_group[0] += 1
+ return group(13)
+
+ def fn_ie7hack(group):
+ """ IE7 Hack handler """
+ if not in_rule[0] and not at_group[0]:
+ in_macie5[0] = 0
+ return group(14) + space_sub(space_subber, group(15))
+ return '>' + space_sub(space_subber, group(15))
+
+ table = (
+ # noqa pylint: disable = C0330
+ None,
+ None,
+ None,
+ None,
+ fn_space_post, # space with token after
+ fn_space_post, # space with token after
+ fn_space_post, # space with token after
+ fn_semicolon, # semicolon
+ fn_semicolon2, # semicolon
+ fn_open, # {
+ fn_close, # }
+ lambda g: g(11), # string
+ lambda g: 'url(%s)' % uri_space_sub(uri_space_subber, g(12)),
+ # url(...)
+ fn_at_group, # @xxx expecting {...}
+ None,
+ fn_ie7hack, # ie7hack
+ None,
+ lambda g: g(16) + ' ' + space_sub(space_subber, g(17)),
+ # :first-line|letter followed
+ # by [{,] (apparently space
+ # needed for IE6)
+ lambda g: nl_unesc_sub('', g(18)), # nl_string
+ lambda g: post_esc_sub(' ', g(19)), # escape
+ )
+
+ def func(match):
+ """ Main subber """
+ idx, group = match.lastindex, match.group
+ if idx > 3:
+ return table[idx](group)
+
+ # shortcuts for frequent operations below:
+ elif idx == 1: # not interesting
+ return group(1)
+ #else: # space with token before or at the beginning
+ return space_sub(space_subber, group(idx))
+
+ return func
+
+ def cssmin(style, keep_bang_comments=False): # pylint: disable = W0621
+ """
+ Minify CSS.
+
+ :Parameters:
+ `style` : ``str``
+ CSS to minify
+
+ `keep_bang_comments` : ``bool``
+ Keep comments starting with an exclamation mark? (``/*!...*/``)
+
+ :Return: Minified style
+ :Rtype: ``str``
+ """
+ return main_sub(main_subber(keep_bang_comments), style)
+
+ return cssmin
+
+cssmin = _make_cssmin()
+
+
+if __name__ == '__main__':
+ def main():
+ """ Main """
+ import sys as _sys
+ keep_bang_comments = (
+ '-b' in _sys.argv[1:]
+ or '-bp' in _sys.argv[1:]
+ or '-pb' in _sys.argv[1:]
+ )
+ if '-p' in _sys.argv[1:] or '-bp' in _sys.argv[1:] \
+ or '-pb' in _sys.argv[1:]:
+ global cssmin # pylint: disable = W0603
+ cssmin = _make_cssmin(python_only=True)
+ _sys.stdout.write(cssmin(
+ _sys.stdin.read(), keep_bang_comments=keep_bang_comments
+ ))
+ main()
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/run_tests.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/run_tests.py
new file mode 100755
index 00000000000..9128d743586
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/run_tests.py
@@ -0,0 +1,166 @@
+#!/usr/bin/env python
+# -*- coding: ascii -*-
+#
+# Copyright 2014
+# Andr\xe9 Malo or his licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+===========
+ Run tests
+===========
+
+Run tests.
+"""
+__author__ = "Andr\xe9 Malo"
+__author__ = getattr(__author__, 'decode', lambda x: __author__)('latin-1')
+__docformat__ = "restructuredtext en"
+
+import os as _os
+import re as _re
+import sys as _sys
+
+from _setup import shell
+from _setup import term
+
+
+def run_tests(basedir, libdir):
+ """ Run output based tests """
+ import rcssmin as _rcssmin
+ py_cssmin = _rcssmin._make_cssmin(python_only=True)
+ c_cssmin = _rcssmin._make_cssmin(python_only=False)
+
+ def run_test(example, output_file):
+ """ Run it """
+ try:
+ fp = open(example, 'r')
+ except IOError:
+ return
+ else:
+ try:
+ input = fp.read()
+ finally:
+ fp.close()
+
+ def load_output(filename):
+ try:
+ fp = open(filename, 'r')
+ except IOError:
+ return None
+ else:
+ try:
+ output = fp.read()
+ finally:
+ fp.close()
+ output = output.strip()
+ if _re.search(r'(?<!\\)(?:\\\\)*\\[0-9a-zA-Z]{1,6}$', output):
+ output += ' '
+ return output
+
+ output = load_output(output_file)
+ output_b = load_output(output_file + '.b')
+
+ def do_test(cssmin, output, **options):
+ try:
+ genout = cssmin(input, **options)
+ except (KeyboardInterrupt, SystemExit):
+ raise
+ except:
+ return 1, "%(RED)s exc%(NORMAL)s "
+ else:
+ if output is None:
+ return 1, "%(RED)smiss%(NORMAL)s "
+ elif genout == output or genout == output.rstrip():
+ return 0, "%(GREEN)sOK%(NORMAL)s "
+ else:
+ return 1, "%(RED)sfail%(NORMAL)s "
+
+ erred, out = do_test(py_cssmin, output)
+ erred, c_out = do_test(c_cssmin, output)
+ erred, out_b = do_test(py_cssmin, output_b, keep_bang_comments=True)
+ erred, c_out_b = do_test(c_cssmin, output_b, keep_bang_comments=True)
+
+ term.write(
+ "%(out)s %(out_b)s | %(c_out)s %(c_out_b)s - %%(example)s\n"
+ % locals(),
+ example=_os.path.basename(example),
+ )
+ return erred
+
+ # end
+ # begin main test code
+
+ erred = 0
+ basedir = shell.native(basedir)
+ strip = len(basedir) - len(_os.path.basename(basedir))
+ for dirname, dirs, files in shell.walk(basedir):
+ dirs[:] = [
+ item for item in dirs if item not in ('.svn', '.git', 'out')
+ ]
+ dirs.sort()
+ files = [item for item in files if item.endswith('.css')]
+ if not files:
+ continue
+ if not _os.path.isdir(_os.path.join(basedir, dirname, 'out')):
+ continue
+ term.yellow("---> %s" % (dirname[strip:],))
+ files.sort()
+ for filename in files:
+ if run_test(
+ _os.path.join(dirname, filename),
+ _os.path.join(dirname, 'out', filename[:-4] + '.out'),
+ ): erred = 1
+ term.yellow("<--- %s" % (dirname[strip:],))
+ return erred
+
+
+def main():
+ """ Main """
+ basedir, libdir = None, None
+ accept_opts = True
+ args = []
+ for arg in _sys.argv[1:]:
+ if accept_opts:
+ if arg == '--':
+ accept_opts = False
+ continue
+ elif arg == '-q':
+ term.write = term.green = term.red = term.yellow = \
+ term.announce = \
+ lambda fmt, **kwargs: None
+ continue
+ elif arg == '-p':
+ info = {}
+ for key in term.terminfo():
+ info[key] = ''
+ info['ERASE'] = '\n'
+ term.terminfo.info = info
+ continue
+ elif arg.startswith('-'):
+ _sys.stderr.write("Unrecognized option %r\n" % (arg,))
+ return 2
+ args.append(arg)
+ if len(args) > 2:
+ _sys.stderr.write("Too many arguments\n")
+ return 2
+ elif len(args) < 1:
+ _sys.stderr.write("Missing arguments\n")
+ return 2
+ basedir = args[0]
+ if len(args) > 1:
+ libdir = args[1]
+ return run_tests(basedir, libdir)
+
+
+if __name__ == '__main__':
+ _sys.exit(main())
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/setup.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/setup.py
new file mode 100644
index 00000000000..d4ca570bf29
--- /dev/null
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/setup.py
@@ -0,0 +1,42 @@
+#!/usr/bin/env python
+# -*- coding: ascii -*-
+#
+# Copyright 2006 - 2013
+# Andr\xe9 Malo or his licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import sys as _sys
+from _setup import run
+
+
+def setup(args=None, _manifest=0):
+ """ Main setup function """
+ from _setup.ext import Extension
+
+ if 'java' in _sys.platform.lower():
+ # no c extension for jython
+ ext = None
+ else:
+ ext=[Extension('_rcssmin', sources=['rcssmin.c'])]
+
+ return run(script_args=args, ext=ext, manifest_only=_manifest)
+
+
+def manifest():
+ """ Create List of packaged files """
+ return setup((), _manifest=1)
+
+
+if __name__ == '__main__':
+ setup()