Import W3C web platform tests infrastructure
authoryouenn.fablet@crf.canon.fr <youenn.fablet@crf.canon.fr@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 31 Jan 2015 09:46:40 +0000 (09:46 +0000)
committeryouenn.fablet@crf.canon.fr <youenn.fablet@crf.canon.fr@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 31 Jan 2015 09:46:40 +0000 (09:46 +0000)
https://bugs.webkit.org/show_bug.cgi?id=140934

Reviewed by Ryosuke Niwa.

LayoutTests/imported/w3c:

Initial import of the web-platform-tests repository.
This includes all infrastructure folders.
web-platform-tests submodules are downloaded when needed based on resources/WPTModules.

This patch also adds two tests from the domparsing folder to ensure
W3C test infrastructure works properly on WebKit bots.

* resources/WPTModules: Added
* web-platform-tests/.gitignore: Added.
* web-platform-tests/_certs: Added.
* web-platform-tests/common: Added.
* web-platform-tests/config.default.json: Added.
* web-platform-tests/fonts: Added.
* web-platform-tests/images: Added.
* web-platform-tests/resource: Added.
* web-platform-tests/serve.py: Added.
* web-platform-tests/tools: Added.
* web-platform-tests/w3c-import.log: Added
* web-platform-tests/domparsing/DOMParser-parseFromString-html-expected.txt: Added.
* web-platform-tests/domparsing/DOMParser-parseFromString-html.html: Added.
* web-platform-tests/domparsing/insert-adjacent-expected.txt: Added.
* web-platform-tests/domparsing/insert-adjacent.html: Added.
* web-platform-tests/domparsing/w3c-import.log: Added.

Tools:

Loading necessary web platform tests modules before launching server.
Ensuring that some empty __init__.py files are present and create them if necessary.

* Scripts/webkitpy/layout_tests/servers/web_platform_test_launcher.py:
* Scripts/webkitpy/layout_tests/servers/web_platform_test_server.py:

LayoutTests:

* TestExpectations: added lines to skip web-platform-tests
infrastructure folders. Added one line for a partially passing test.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@179439 268f45cc-cd09-0410-ab3c-d52691b4dbfc

129 files changed:
LayoutTests/ChangeLog
LayoutTests/TestExpectations
LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/resources/WPTModules [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/.gitignore [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/_certs/01.pem [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/_certs/02.pem [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/_certs/cacert.pem [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/_certs/cakey.pem [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/_certs/index.txt.attr [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/_certs/index.txt.attr.old [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/_certs/index.txt.old [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/_certs/localhost.key [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/_certs/localhost.pem [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/_certs/serial [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/_certs/serial.old [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/common/canvas-frame.css [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/common/canvas-index.css [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/common/canvas-spec.css [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/common/canvas-tests.css [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/common/canvas-tests.js [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/common/css-red.txt [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/common/failing-test.html [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/common/large.py [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/common/media.js [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/common/redirect.py [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/common/reftest-wait.js [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/common/stringifiers.js [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/common/text-plain.txt [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/common/utils.js [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/common/vendor-prefix.js [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/common/w3c-import.log [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/config.default.json [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/domparsing/DOMParser-parseFromString-html-expected.txt [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/domparsing/DOMParser-parseFromString-html.html [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/domparsing/insert-adjacent-expected.txt [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/domparsing/insert-adjacent.html [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/domparsing/w3c-import.log [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/fonts/CanvasTest.sfd [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/fonts/CanvasTest.ttf [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/fonts/w3c-import.log [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/anim-gr.gif [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/anim-gr.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/anim-poster-gr.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/background.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/black-rectangle.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/blue-area.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/blue-border.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/blue.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/blue96x96.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/broken.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/canvas-line.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/fail.gif [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/ggrr-256x256.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/green-100x50.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/green-16x16.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/green-1x1.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/green-256x256.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/green-2x2.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/green.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/green.svg [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/grgr-256x256.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/movie_300_frame_0.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/red-16x16.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/red-zeroheight.svg [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/red-zerosize.svg [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/red-zerowidth.svg [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/red.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/redtransparent.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/rgrg-256x256.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/rrgg-256x256.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/smiley.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/threecolors.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/transparent.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/transparent50.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/w3c-import.log [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/yellow.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/images/yellow75.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/serve.py [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/__init__.py [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/runner/css/bootstrap-theme.min.css [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/runner/css/bootstrap.min.css [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/runner/css/w3c-import.log [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/runner/fonts/glyphicons-halflings-regular.eot [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/runner/fonts/glyphicons-halflings-regular.svg [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/runner/fonts/glyphicons-halflings-regular.ttf [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/runner/fonts/glyphicons-halflings-regular.woff [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/runner/fonts/w3c-import.log [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/runner/logo.svg [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/runner/report.css [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/runner/report.py [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/runner/runner.css [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/runner/runner.js [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/runner/update_manifest.py [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/runner/w3c-import.log [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/scripts/_env.py [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/scripts/html5lib_test.xml [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/scripts/html5lib_test_fragment.xml [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/scripts/id2path.js [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/scripts/id2path.json [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/scripts/lint.py [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/scripts/lint.whitelist [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/scripts/manifest.js [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/scripts/manifest.py [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/scripts/package.json [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/scripts/toc.js [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/scripts/update-directory-structure.js [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/scripts/update_html5lib_tests.py [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/scripts/w3c-import.log [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/sslutils/__init__.py [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/sslutils/base.py [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/sslutils/openssl.py [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/sslutils/pregenerated.py [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/sslutils/w3c-import.log [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/w3c-import.log [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/webdriver/webdriver/alert.py [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/webdriver/webdriver/capabilities.py [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/webdriver/webdriver/command.py [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/webdriver/webdriver/driver.py [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/webdriver/webdriver/exceptions.py [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/webdriver/webdriver/keys.py [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/webdriver/webdriver/searchcontext.py [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/webdriver/webdriver/w3c-import.log [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/webdriver/webdriver/wait.py [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/tools/webdriver/webdriver/webelement.py [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/w3c-import.log [new file with mode: 0644]
Tools/ChangeLog
Tools/Scripts/webkitpy/layout_tests/servers/web_platform_test_launcher.py
Tools/Scripts/webkitpy/layout_tests/servers/web_platform_test_server.py

index 2916392..92a4201 100644 (file)
@@ -1,3 +1,13 @@
+2015-01-31  Youenn Fablet  <youenn.fablet@crf.canon.fr>
+
+        Import W3C web platform tests infrastructure
+        https://bugs.webkit.org/show_bug.cgi?id=140934
+
+        Reviewed by Ryosuke Niwa.
+
+        * TestExpectations: added lines to skip web-platform-tests
+        infrastructure folders. Added one line for a partially passing test.
+
 2015-01-30  Yusuke Suzuki  <utatane.tea@gmail.com>
 
         Implement ES6 Symbol
index d8c662f..906b406 100644 (file)
@@ -228,6 +228,15 @@ webkit.org/b/137883 transitions/started-while-suspended.html [ Pass Failure ]
 webkit.org/b/137883 transitions/transition-shorthand-delay.html
 webkit.org/b/137883 transitions/transition-timing-function.html [ Pass Failure ]
 
+# W3C web platform tests infrastructure directories are skipped as they may contain html files
+imported/w3c/web-platform-tests/common [ Skip ]
+imported/w3c/web-platform-tests/fonts [ Skip ]
+imported/w3c/web-platform-tests/images [ Skip ]
+imported/w3c/web-platform-tests/tools [ Skip ]
+
+# W3C domparsing test suite
+imported/w3c/web-platform-tests/domparsing/DOMParser-parseFromString-html.html [ Pass ] # Some assertions failing
+
 # Imported W3C canvas failed tests
 webkit.org/b/138676 imported/w3c/canvas/2d.pattern.image.null.html [ Failure ]
 webkit.org/b/138676 imported/w3c/canvas/2d.pattern.image.incomplete.omitted.html [ Failure ]
index a82728e..2a64c1c 100644 (file)
@@ -1,3 +1,34 @@
+2015-01-31  Youenn Fablet  <youenn.fablet@crf.canon.fr>
+
+        Import W3C web platform tests infrastructure
+        https://bugs.webkit.org/show_bug.cgi?id=140934
+
+        Reviewed by Ryosuke Niwa.
+
+        Initial import of the web-platform-tests repository.
+        This includes all infrastructure folders.
+        web-platform-tests submodules are downloaded when needed based on resources/WPTModules.
+
+        This patch also adds two tests from the domparsing folder to ensure 
+        W3C test infrastructure works properly on WebKit bots.
+
+        * resources/WPTModules: Added
+        * web-platform-tests/.gitignore: Added.
+        * web-platform-tests/_certs: Added.
+        * web-platform-tests/common: Added.
+        * web-platform-tests/config.default.json: Added.
+        * web-platform-tests/fonts: Added.
+        * web-platform-tests/images: Added.
+        * web-platform-tests/resource: Added.
+        * web-platform-tests/serve.py: Added.
+        * web-platform-tests/tools: Added.
+        * web-platform-tests/w3c-import.log: Added
+        * web-platform-tests/domparsing/DOMParser-parseFromString-html-expected.txt: Added.
+        * web-platform-tests/domparsing/DOMParser-parseFromString-html.html: Added.
+        * web-platform-tests/domparsing/insert-adjacent-expected.txt: Added.
+        * web-platform-tests/domparsing/insert-adjacent.html: Added.
+        * web-platform-tests/domparsing/w3c-import.log: Added.
+
 2015-01-26  Youenn Fablet  <youenn.fablet@crf.canon.fr>
 
         Integrate WP python server into WebKit test framework
diff --git a/LayoutTests/imported/w3c/resources/WPTModules b/LayoutTests/imported/w3c/resources/WPTModules
new file mode 100644 (file)
index 0000000..62845fa
--- /dev/null
@@ -0,0 +1,32 @@
+[
+{
+    "name": "html5lib",
+    "path": "tools",
+    "url": "https://github.com/html5lib/html5lib-python/archive/7cce65bbaa78411f98b8b37eeefc9db03c580097.tar.gz",
+    "url_subpath": "html5lib-python-7cce65bbaa78411f98b8b37eeefc9db03c580097"
+},
+{
+    "name": "pywebsocket",
+    "path": "tools",
+    "url": "https://github.com/w3c/pywebsocket/archive/8c285d9015121e8c1c40be852439fc03b4a18112.tar.gz",
+    "url_subpath": "pywebsocket-8c285d9015121e8c1c40be852439fc03b4a18112"
+},
+{
+    "name": "six",
+    "path": "tools",
+    "url": "https://github.com/jgraham/six/archive/3b6173c833d217ab0186c355804f5925cbcfca47.tar.gz",
+    "url_subpath": "six-3b6173c833d217ab0186c355804f5925cbcfca47"
+},
+{
+    "name": "wptserve",
+    "path": "tools",
+    "url": "https://github.com/w3c/wptserve/archive/91e764ffa0f587090341a26af457dfdc6762eb0d.tar.gz",
+    "url_subpath": "wptserve-91e764ffa0f587090341a26af457dfdc6762eb0d"
+},
+{
+    "name": "resources",
+    "path": ".",
+    "url": "https://github.com/w3c/testharness.js/archive/74ba13d2fbb19c6e7494960bd7724873e88c523c.tar.gz",
+    "url_subpath": "testharness.js-74ba13d2fbb19c6e7494960bd7724873e88c523c"
+}
+]
diff --git a/LayoutTests/imported/w3c/web-platform-tests/.gitignore b/LayoutTests/imported/w3c/web-platform-tests/.gitignore
new file mode 100644 (file)
index 0000000..abaed0d
--- /dev/null
@@ -0,0 +1,14 @@
+/.resources.url
+/__init__.py
+/resources/
+
+/tools/.html5lib.url
+/tools/.pywebsocket.url
+/tools/.six.url
+/tools/.wptserve.url
+
+/tools/html5lib/
+/tools/pywebsocket/
+/tools/six/
+/tools/wptserve/
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/_certs/01.pem b/LayoutTests/imported/w3c/web-platform-tests/_certs/01.pem
new file mode 100644 (file)
index 0000000..b36f1d5
--- /dev/null
@@ -0,0 +1,83 @@
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number: 1 (0x1)
+    Signature Algorithm: sha256WithRSAEncryption
+        Issuer: CN=web-platform-tests
+        Validity
+            Not Before: Jan 27 09:27:40 2015 GMT
+            Not After : Feb 26 09:27:40 2015 GMT
+        Subject: CN=web-platform-tests
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+                Public-Key: (2048 bit)
+                Modulus:
+                    00:b2:d3:a2:d8:cd:93:82:4f:87:74:4b:35:77:23:
+                    ef:d4:8b:f8:ad:00:da:cd:66:3f:0f:5d:17:75:44:
+                    d0:ee:83:ca:8c:73:f4:55:20:a4:92:85:40:e4:a2:
+                    5f:59:50:75:89:47:50:73:66:d7:40:aa:a3:cb:26:
+                    ca:0c:b0:94:8e:3f:2e:c7:e2:53:ae:d1:c4:3f:c5:
+                    d8:54:d7:27:2c:b6:f0:9f:18:06:30:b9:de:c4:3d:
+                    6d:7b:62:84:f3:5a:39:b4:81:fd:87:f6:d9:cd:15:
+                    e5:9c:3c:ec:7d:d0:50:e6:9f:4e:c2:75:ca:99:3a:
+                    a2:4d:85:70:ad:51:d6:13:a4:5d:0e:69:f7:98:3a:
+                    48:01:86:26:29:f8:8c:be:6b:23:cc:9e:00:c4:11:
+                    2d:c2:bf:25:e2:12:0a:64:41:ad:a8:37:be:01:a8:
+                    b7:77:f7:23:71:55:f2:67:30:e1:80:6f:48:ea:e3:
+                    9a:be:b1:f9:52:0a:d4:38:4b:07:d7:8a:6c:86:54:
+                    24:e7:01:c8:70:eb:b4:3f:5a:54:57:13:a0:d1:6d:
+                    8b:a6:9b:bb:60:88:25:a1:f8:ce:7d:05:d6:52:2b:
+                    6f:f4:14:e1:ed:6c:e4:00:1b:e6:1f:5c:f8:60:a7:
+                    1e:f7:b7:90:9d:28:93:17:c9:5e:16:ed:9a:e9:68:
+                    9f:af
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:TRUE
+            X509v3 Subject Key Identifier: 
+                0E:31:C1:0D:6C:94:E1:F0:D9:8C:C4:E4:A5:DF:FD:1C:CB:3B:CC:58
+            X509v3 Authority Key Identifier: 
+                keyid:0E:31:C1:0D:6C:94:E1:F0:D9:8C:C4:E4:A5:DF:FD:1C:CB:3B:CC:58
+                DirName:/CN=web-platform-tests
+                serial:01
+
+            X509v3 Key Usage: 
+                Certificate Sign
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication
+    Signature Algorithm: sha256WithRSAEncryption
+         32:a7:f6:ff:bd:ce:59:2c:93:94:e9:a1:57:87:7c:01:82:20:
+         d6:25:6a:09:05:f6:74:d5:3f:37:78:a9:f9:5c:f6:3c:14:e6:
+         5c:1e:96:74:9e:46:b8:5f:3b:88:bc:18:3c:c4:f6:68:e0:79:
+         92:55:7c:c9:5b:b2:88:1e:77:54:ad:bc:e3:43:cb:2c:4c:f2:
+         04:4d:06:b4:b2:1b:32:07:06:de:e8:b6:d1:fb:c6:b2:c5:45:
+         fa:30:46:df:49:22:a8:ea:c5:0c:a1:ee:c2:fc:29:49:12:89:
+         76:44:2f:92:53:cf:d3:5c:a0:3a:82:99:cd:1e:47:2f:98:2a:
+         eb:64:98:db:b5:94:4f:cf:1c:0f:88:cb:fb:98:7a:cd:a7:5d:
+         2d:57:99:4d:52:65:49:c8:9a:da:59:f3:d0:d3:75:c9:1b:9c:
+         c6:8d:8a:f1:d5:29:63:f4:53:00:81:e0:19:8c:89:f3:f9:02:
+         ad:44:48:0e:cd:fd:66:79:fc:25:c0:07:07:86:1c:24:98:37:
+         72:fc:74:b5:7f:12:cd:08:27:70:d1:ce:01:01:01:16:ea:4b:
+         bf:dd:3a:65:77:31:20:db:9e:1f:82:ae:ac:9c:5b:47:0e:b2:
+         41:c0:b2:82:ba:59:aa:94:b8:c1:31:f5:07:56:76:94:60:f5:
+         64:13:48:52
+-----BEGIN CERTIFICATE-----
+MIIDTzCCAjegAwIBAgIBATANBgkqhkiG9w0BAQsFADAdMRswGQYDVQQDDBJ3ZWIt
+cGxhdGZvcm0tdGVzdHMwHhcNMTUwMTI3MDkyNzQwWhcNMTUwMjI2MDkyNzQwWjAd
+MRswGQYDVQQDDBJ3ZWItcGxhdGZvcm0tdGVzdHMwggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQCy06LYzZOCT4d0SzV3I+/Ui/itANrNZj8PXRd1RNDug8qM
+c/RVIKSShUDkol9ZUHWJR1BzZtdAqqPLJsoMsJSOPy7H4lOu0cQ/xdhU1ycstvCf
+GAYwud7EPW17YoTzWjm0gf2H9tnNFeWcPOx90FDmn07CdcqZOqJNhXCtUdYTpF0O
+afeYOkgBhiYp+Iy+ayPMngDEES3CvyXiEgpkQa2oN74BqLd39yNxVfJnMOGAb0jq
+45q+sflSCtQ4SwfXimyGVCTnAchw67Q/WlRXE6DRbYumm7tgiCWh+M59BdZSK2/0
+FOHtbOQAG+YfXPhgpx73t5CdKJMXyV4W7ZrpaJ+vAgMBAAGjgZkwgZYwDAYDVR0T
+BAUwAwEB/zAdBgNVHQ4EFgQUDjHBDWyU4fDZjMTkpd/9HMs7zFgwRQYDVR0jBD4w
+PIAUDjHBDWyU4fDZjMTkpd/9HMs7zFihIaQfMB0xGzAZBgNVBAMMEndlYi1wbGF0
+Zm9ybS10ZXN0c4IBATALBgNVHQ8EBAMCAgQwEwYDVR0lBAwwCgYIKwYBBQUHAwEw
+DQYJKoZIhvcNAQELBQADggEBADKn9v+9zlksk5TpoVeHfAGCINYlagkF9nTVPzd4
+qflc9jwU5lwelnSeRrhfO4i8GDzE9mjgeZJVfMlbsoged1StvONDyyxM8gRNBrSy
+GzIHBt7ottH7xrLFRfowRt9JIqjqxQyh7sL8KUkSiXZEL5JTz9NcoDqCmc0eRy+Y
+KutkmNu1lE/PHA+Iy/uYes2nXS1XmU1SZUnImtpZ89DTdckbnMaNivHVKWP0UwCB
+4BmMifP5Aq1ESA7N/WZ5/CXABweGHCSYN3L8dLV/Es0IJ3DRzgEBARbqS7/dOmV3
+MSDbnh+CrqycW0cOskHAsoK6WaqUuMEx9QdWdpRg9WQTSFI=
+-----END CERTIFICATE-----
diff --git a/LayoutTests/imported/w3c/web-platform-tests/_certs/02.pem b/LayoutTests/imported/w3c/web-platform-tests/_certs/02.pem
new file mode 100644 (file)
index 0000000..5d59a3b
--- /dev/null
@@ -0,0 +1,85 @@
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number: 2 (0x2)
+    Signature Algorithm: sha256WithRSAEncryption
+        Issuer: CN=web-platform-tests
+        Validity
+            Not Before: Jan 27 09:27:41 2015 GMT
+            Not After : Feb 26 09:27:41 2015 GMT
+        Subject: CN=localhost
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+                Public-Key: (2048 bit)
+                Modulus:
+                    00:e8:51:ec:61:80:b6:ac:66:ed:73:09:db:00:30:
+                    48:04:83:e1:41:65:95:2d:8f:0d:50:63:d2:8c:2a:
+                    50:93:4b:56:78:65:96:cf:79:4c:9c:3c:e8:86:ea:
+                    c5:c2:e9:0a:9c:5f:15:8b:a5:fd:21:57:ea:13:23:
+                    55:06:c2:8a:cc:3f:aa:ab:d4:dd:b9:ea:d9:8a:c9:
+                    28:7a:de:14:d8:72:24:b8:a4:bf:c6:64:72:d7:a9:
+                    d0:de:0e:df:4c:a6:50:18:26:f3:5b:ec:40:6a:1a:
+                    27:0c:19:85:47:34:ad:49:37:af:73:8e:77:b3:43:
+                    d3:83:3a:4b:76:16:b3:b8:e9:15:99:ff:07:aa:5f:
+                    e1:26:b9:72:02:87:07:69:3b:86:85:8f:79:ad:ac:
+                    ec:15:c4:16:2e:45:2a:a9:1a:82:24:de:ac:84:56:
+                    88:bd:67:f3:f3:bb:84:d7:af:f9:65:23:01:e9:01:
+                    d0:04:ce:a6:06:09:09:44:58:a7:ba:89:ab:b2:ca:
+                    97:b6:18:6a:6c:84:a8:47:e7:f5:5f:8f:bf:71:7b:
+                    4f:b9:ad:31:dd:73:bf:63:9f:b4:46:8c:93:85:24:
+                    25:19:73:ed:03:19:f3:3f:1d:af:0e:8b:a4:76:90:
+                    88:39:b5:27:f9:17:86:f1:4b:bb:7e:60:7f:f9:d7:
+                    fb:65
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            X509v3 Subject Key Identifier: 
+                F6:CB:82:64:B0:C4:02:1A:85:53:0E:9A:6B:D8:C2:30:AC:05:61:C8
+            X509v3 Authority Key Identifier: 
+                keyid:0E:31:C1:0D:6C:94:E1:F0:D9:8C:C4:E4:A5:DF:FD:1C:CB:3B:CC:58
+
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication
+            X509v3 Subject Alternative Name: 
+                DNS:localhost, DNS:www.localhost, DNS:xn--n8j6ds53lwwkrqhv28a.localhost, DNS:xn--lve-6lad.localhost, DNS:www2.localhost, DNS:www1.localhost
+    Signature Algorithm: sha256WithRSAEncryption
+         80:b4:23:83:d9:5b:c8:5f:fe:16:25:2c:df:64:88:08:6b:1e:
+         f9:15:46:58:54:ce:e0:28:88:af:f1:58:c3:7f:c2:08:7c:8b:
+         d4:2f:da:f3:c5:bd:95:26:f6:0e:0f:66:34:4e:6a:35:3c:14:
+         69:eb:15:2e:fe:0d:0d:c1:ff:30:2d:32:ce:28:c8:8b:57:ac:
+         fc:54:89:9c:37:01:22:08:fe:db:bb:40:96:ec:8b:97:61:9f:
+         68:c8:25:4d:19:77:f7:a6:86:51:2c:f0:b7:39:2b:a0:79:83:
+         4b:42:75:6e:ca:c6:2a:0c:28:8b:69:83:46:3e:9e:0f:0f:7e:
+         1a:17:09:1b:9b:02:ce:21:87:c2:e2:0d:68:91:1b:3a:5c:6d:
+         c5:05:c8:2b:13:d1:28:a3:ed:94:73:ea:7d:b5:b7:b8:4d:be:
+         85:3c:af:66:46:1b:0a:27:5d:71:b5:c6:9d:dc:ff:d6:e4:23:
+         ed:89:11:64:69:16:4f:2f:c5:d6:81:41:d4:75:8d:8e:9b:4d:
+         87:1d:02:bd:a7:d0:cf:a2:41:fb:27:cf:52:cb:2e:19:49:41:
+         5c:d4:2f:c7:39:13:98:72:66:1d:47:97:cb:6b:dd:31:53:4e:
+         b2:b0:af:6c:86:a7:38:1f:a1:a3:9f:54:6b:e1:c7:a2:15:f1:
+         f0:d4:5a:57
+-----BEGIN CERTIFICATE-----
+MIIDnTCCAoWgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAdMRswGQYDVQQDDBJ3ZWIt
+cGxhdGZvcm0tdGVzdHMwHhcNMTUwMTI3MDkyNzQxWhcNMTUwMjI2MDkyNzQxWjAU
+MRIwEAYDVQQDDAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQDoUexhgLasZu1zCdsAMEgEg+FBZZUtjw1QY9KMKlCTS1Z4ZZbPeUycPOiG
+6sXC6QqcXxWLpf0hV+oTI1UGworMP6qr1N256tmKySh63hTYciS4pL/GZHLXqdDe
+Dt9MplAYJvNb7EBqGicMGYVHNK1JN69zjnezQ9ODOkt2FrO46RWZ/weqX+EmuXIC
+hwdpO4aFj3mtrOwVxBYuRSqpGoIk3qyEVoi9Z/Pzu4TXr/llIwHpAdAEzqYGCQlE
+WKe6iauyype2GGpshKhH5/Vfj79xe0+5rTHdc79jn7RGjJOFJCUZc+0DGfM/Ha8O
+i6R2kIg5tSf5F4bxS7t+YH/51/tlAgMBAAGjgfAwge0wCQYDVR0TBAIwADAdBgNV
+HQ4EFgQU9suCZLDEAhqFUw6aa9jCMKwFYcgwHwYDVR0jBBgwFoAUDjHBDWyU4fDZ
+jMTkpd/9HMs7zFgwCwYDVR0PBAQDAgXgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMH4G
+A1UdEQR3MHWCCWxvY2FsaG9zdIINd3d3LmxvY2FsaG9zdIIheG4tLW44ajZkczUz
+bHd3a3JxaHYyOGEubG9jYWxob3N0ghZ4bi0tbHZlLTZsYWQubG9jYWxob3N0gg53
+d3cyLmxvY2FsaG9zdIIOd3d3MS5sb2NhbGhvc3QwDQYJKoZIhvcNAQELBQADggEB
+AIC0I4PZW8hf/hYlLN9kiAhrHvkVRlhUzuAoiK/xWMN/wgh8i9Qv2vPFvZUm9g4P
+ZjROajU8FGnrFS7+DQ3B/zAtMs4oyItXrPxUiZw3ASII/tu7QJbsi5dhn2jIJU0Z
+d/emhlEs8Lc5K6B5g0tCdW7KxioMKItpg0Y+ng8PfhoXCRubAs4hh8LiDWiRGzpc
+bcUFyCsT0Sij7ZRz6n21t7hNvoU8r2ZGGwonXXG1xp3c/9bkI+2JEWRpFk8vxdaB
+QdR1jY6bTYcdAr2n0M+iQfsnz1LLLhlJQVzUL8c5E5hyZh1Hl8tr3TFTTrKwr2yG
+pzgfoaOfVGvhx6IV8fDUWlc=
+-----END CERTIFICATE-----
diff --git a/LayoutTests/imported/w3c/web-platform-tests/_certs/cacert.pem b/LayoutTests/imported/w3c/web-platform-tests/_certs/cacert.pem
new file mode 100644 (file)
index 0000000..b36f1d5
--- /dev/null
@@ -0,0 +1,83 @@
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number: 1 (0x1)
+    Signature Algorithm: sha256WithRSAEncryption
+        Issuer: CN=web-platform-tests
+        Validity
+            Not Before: Jan 27 09:27:40 2015 GMT
+            Not After : Feb 26 09:27:40 2015 GMT
+        Subject: CN=web-platform-tests
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+                Public-Key: (2048 bit)
+                Modulus:
+                    00:b2:d3:a2:d8:cd:93:82:4f:87:74:4b:35:77:23:
+                    ef:d4:8b:f8:ad:00:da:cd:66:3f:0f:5d:17:75:44:
+                    d0:ee:83:ca:8c:73:f4:55:20:a4:92:85:40:e4:a2:
+                    5f:59:50:75:89:47:50:73:66:d7:40:aa:a3:cb:26:
+                    ca:0c:b0:94:8e:3f:2e:c7:e2:53:ae:d1:c4:3f:c5:
+                    d8:54:d7:27:2c:b6:f0:9f:18:06:30:b9:de:c4:3d:
+                    6d:7b:62:84:f3:5a:39:b4:81:fd:87:f6:d9:cd:15:
+                    e5:9c:3c:ec:7d:d0:50:e6:9f:4e:c2:75:ca:99:3a:
+                    a2:4d:85:70:ad:51:d6:13:a4:5d:0e:69:f7:98:3a:
+                    48:01:86:26:29:f8:8c:be:6b:23:cc:9e:00:c4:11:
+                    2d:c2:bf:25:e2:12:0a:64:41:ad:a8:37:be:01:a8:
+                    b7:77:f7:23:71:55:f2:67:30:e1:80:6f:48:ea:e3:
+                    9a:be:b1:f9:52:0a:d4:38:4b:07:d7:8a:6c:86:54:
+                    24:e7:01:c8:70:eb:b4:3f:5a:54:57:13:a0:d1:6d:
+                    8b:a6:9b:bb:60:88:25:a1:f8:ce:7d:05:d6:52:2b:
+                    6f:f4:14:e1:ed:6c:e4:00:1b:e6:1f:5c:f8:60:a7:
+                    1e:f7:b7:90:9d:28:93:17:c9:5e:16:ed:9a:e9:68:
+                    9f:af
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:TRUE
+            X509v3 Subject Key Identifier: 
+                0E:31:C1:0D:6C:94:E1:F0:D9:8C:C4:E4:A5:DF:FD:1C:CB:3B:CC:58
+            X509v3 Authority Key Identifier: 
+                keyid:0E:31:C1:0D:6C:94:E1:F0:D9:8C:C4:E4:A5:DF:FD:1C:CB:3B:CC:58
+                DirName:/CN=web-platform-tests
+                serial:01
+
+            X509v3 Key Usage: 
+                Certificate Sign
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication
+    Signature Algorithm: sha256WithRSAEncryption
+         32:a7:f6:ff:bd:ce:59:2c:93:94:e9:a1:57:87:7c:01:82:20:
+         d6:25:6a:09:05:f6:74:d5:3f:37:78:a9:f9:5c:f6:3c:14:e6:
+         5c:1e:96:74:9e:46:b8:5f:3b:88:bc:18:3c:c4:f6:68:e0:79:
+         92:55:7c:c9:5b:b2:88:1e:77:54:ad:bc:e3:43:cb:2c:4c:f2:
+         04:4d:06:b4:b2:1b:32:07:06:de:e8:b6:d1:fb:c6:b2:c5:45:
+         fa:30:46:df:49:22:a8:ea:c5:0c:a1:ee:c2:fc:29:49:12:89:
+         76:44:2f:92:53:cf:d3:5c:a0:3a:82:99:cd:1e:47:2f:98:2a:
+         eb:64:98:db:b5:94:4f:cf:1c:0f:88:cb:fb:98:7a:cd:a7:5d:
+         2d:57:99:4d:52:65:49:c8:9a:da:59:f3:d0:d3:75:c9:1b:9c:
+         c6:8d:8a:f1:d5:29:63:f4:53:00:81:e0:19:8c:89:f3:f9:02:
+         ad:44:48:0e:cd:fd:66:79:fc:25:c0:07:07:86:1c:24:98:37:
+         72:fc:74:b5:7f:12:cd:08:27:70:d1:ce:01:01:01:16:ea:4b:
+         bf:dd:3a:65:77:31:20:db:9e:1f:82:ae:ac:9c:5b:47:0e:b2:
+         41:c0:b2:82:ba:59:aa:94:b8:c1:31:f5:07:56:76:94:60:f5:
+         64:13:48:52
+-----BEGIN CERTIFICATE-----
+MIIDTzCCAjegAwIBAgIBATANBgkqhkiG9w0BAQsFADAdMRswGQYDVQQDDBJ3ZWIt
+cGxhdGZvcm0tdGVzdHMwHhcNMTUwMTI3MDkyNzQwWhcNMTUwMjI2MDkyNzQwWjAd
+MRswGQYDVQQDDBJ3ZWItcGxhdGZvcm0tdGVzdHMwggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQCy06LYzZOCT4d0SzV3I+/Ui/itANrNZj8PXRd1RNDug8qM
+c/RVIKSShUDkol9ZUHWJR1BzZtdAqqPLJsoMsJSOPy7H4lOu0cQ/xdhU1ycstvCf
+GAYwud7EPW17YoTzWjm0gf2H9tnNFeWcPOx90FDmn07CdcqZOqJNhXCtUdYTpF0O
+afeYOkgBhiYp+Iy+ayPMngDEES3CvyXiEgpkQa2oN74BqLd39yNxVfJnMOGAb0jq
+45q+sflSCtQ4SwfXimyGVCTnAchw67Q/WlRXE6DRbYumm7tgiCWh+M59BdZSK2/0
+FOHtbOQAG+YfXPhgpx73t5CdKJMXyV4W7ZrpaJ+vAgMBAAGjgZkwgZYwDAYDVR0T
+BAUwAwEB/zAdBgNVHQ4EFgQUDjHBDWyU4fDZjMTkpd/9HMs7zFgwRQYDVR0jBD4w
+PIAUDjHBDWyU4fDZjMTkpd/9HMs7zFihIaQfMB0xGzAZBgNVBAMMEndlYi1wbGF0
+Zm9ybS10ZXN0c4IBATALBgNVHQ8EBAMCAgQwEwYDVR0lBAwwCgYIKwYBBQUHAwEw
+DQYJKoZIhvcNAQELBQADggEBADKn9v+9zlksk5TpoVeHfAGCINYlagkF9nTVPzd4
+qflc9jwU5lwelnSeRrhfO4i8GDzE9mjgeZJVfMlbsoged1StvONDyyxM8gRNBrSy
+GzIHBt7ottH7xrLFRfowRt9JIqjqxQyh7sL8KUkSiXZEL5JTz9NcoDqCmc0eRy+Y
+KutkmNu1lE/PHA+Iy/uYes2nXS1XmU1SZUnImtpZ89DTdckbnMaNivHVKWP0UwCB
+4BmMifP5Aq1ESA7N/WZ5/CXABweGHCSYN3L8dLV/Es0IJ3DRzgEBARbqS7/dOmV3
+MSDbnh+CrqycW0cOskHAsoK6WaqUuMEx9QdWdpRg9WQTSFI=
+-----END CERTIFICATE-----
diff --git a/LayoutTests/imported/w3c/web-platform-tests/_certs/cakey.pem b/LayoutTests/imported/w3c/web-platform-tests/_certs/cakey.pem
new file mode 100644 (file)
index 0000000..bcd47b1
--- /dev/null
@@ -0,0 +1,30 @@
+-----BEGIN ENCRYPTED PRIVATE KEY-----
+MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIXrcK+dDfs0ECAggA
+MBQGCCqGSIb3DQMHBAghxNev6rS0zQSCBMj7vW5cvmHitzd/sa+a1VuHobeP0j7V
+iYTbKsKrI+JGr8RocKNKMhAGPSUId/H21hGn1TjOZ/fyST+jcXv2wVuDEB/8xTvj
+qOsvFGi38fFjpkZyYsQ6pUQVJpz+WwbOYg8ebMGI7y7KSN6iWNGo0EmxOwOvfJRz
+//rucK6uv1WE2gjZZPE/6AMIczynacXraLlOtBJlIZ2NnAxU+W822JNl8TYhRw4w
+Pw8C8xXG5wJTbaGu0YdxMjeCrKntC5H3EX1sgzB/dhDVZtag324o2n1Bmp8cGfyx
+YqLFSdyzRdBDwe7hcp8YNH4CBbJSA96ECvIvaVUr5wb4omDeyw3xNaRy2W5tFdTU
+sJMg2WYlXMYXlRYQNjrdHSeG3W4TWJXvA9XqmOhDSe7EGvqEL05obruX3eAUFoAa
+CMbK0vvrcWm8MLXB+0qWcOatdaEsoA9WdnRXWo5pvJ8BYbYMoKANLEsuq3/m0phw
+Ldvk72Z1ME54n2lMXv2G0AF5Dn0a+fmlToajmod065hmilQzsYw/pgrnLepS7aBp
+8EWeg660wA53xiZyhd1DJN6LzfJ7TcJ3UYWAS8tVY9cBhVivvXBgRvLDXKKa4SPG
+YbrR6nHUKXDmIgOUbJOcPRgVCzbwB0mdr4RWR+WfepEOJQZRm6YOJQjh2+mtMs6+
+mANDWyDkBSPeq4HU6CLmMjPcFFGmqvy3d2CWtszPBJVUrq5SqX7HHvwtCp6DiMgM
+ssVUVc/w/PMDcXKkb1kYwW/vD6FBO0UcxbVDpTHDHHilAV4mEvS04iAZFRP4ef03
+33KBhn9eTmNh/T9W0oqDzmYcyJeK2izkdmJaHt0hCJDTMb4tGuULMXL8KJXwRtBY
+WYZkjboZkix1m5tkexHNKaa8ntU+u8kmwsehDcged+ULTp5nalHU2Pt5CFaImBTc
+MyhPXmftfFEiHT4ncf9RBOVNIvLRQvz6vDqsjUu3ulm26nyMHddF8xeQXvW17Ul9
+R7D52DLgq6efzKNYqUDAbToYQmzilNWjlumvUOhPfdN5znFUvOQO3hhiIVi63AhX
+JqstoWtFgXIr7mmpGFE88wMGejQNgt+cDdhI6e3SV7Sga/Vp8MmEbNTm84MfVuH8
+rUWYbOoUTA/NX8ngqArDwsc0LmPsUzVAPqXmQwVBbjoxTA9FKk4bQExmHBgYxPhD
+HllMhKtkRFNvDA4bw9VUYVh9yKWT6oR99DKl4kA6IKhmChNLgdmgdyW2fx9fac/T
+MTHqH/oOkn5lJXFkBMZcE86c6TLqSFdrc+vHbwky3CwMnfA1Ms9Yf3JEJVob13LU
+Z06vsaSUI+MiQkkMpfGFBOl6XeM5EKjPfF4tV8ijYCk993MNhxDuH7JgA3RKNIHV
+bKo+1vxsUKkcEp1YOidyIiCWbQXp79cFEyXdxyt0Paqn8+qpVMK5N17ORE4t020p
+ah/VppwT7REDGRP/s+uHw+o1o27IOORb4EPsqqe7PvuMja6iyu1DfCBebOhzIYdN
+d3yY9DmQu11dTH3RErH4Gh80vpwAiYv5mxgiuTKnNS95Zn1HZmxMKRFI3aki/aIE
+U/qA3YfZaE2lrB66NCtVaG33u+ZJpdhFMOuUuGr2qzovYiUJVZcKll2w/XuBbPD2
+F6k=
+-----END ENCRYPTED PRIVATE KEY-----
diff --git a/LayoutTests/imported/w3c/web-platform-tests/_certs/index.txt.attr b/LayoutTests/imported/w3c/web-platform-tests/_certs/index.txt.attr
new file mode 100644 (file)
index 0000000..8f7e63a
--- /dev/null
@@ -0,0 +1 @@
+unique_subject = yes
diff --git a/LayoutTests/imported/w3c/web-platform-tests/_certs/index.txt.attr.old b/LayoutTests/imported/w3c/web-platform-tests/_certs/index.txt.attr.old
new file mode 100644 (file)
index 0000000..8f7e63a
--- /dev/null
@@ -0,0 +1 @@
+unique_subject = yes
diff --git a/LayoutTests/imported/w3c/web-platform-tests/_certs/index.txt.old b/LayoutTests/imported/w3c/web-platform-tests/_certs/index.txt.old
new file mode 100644 (file)
index 0000000..782b82b
--- /dev/null
@@ -0,0 +1 @@
+V      150226092740Z           01      unknown /CN=web-platform-tests
diff --git a/LayoutTests/imported/w3c/web-platform-tests/_certs/localhost.key b/LayoutTests/imported/w3c/web-platform-tests/_certs/localhost.key
new file mode 100644 (file)
index 0000000..7018283
--- /dev/null
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDoUexhgLasZu1z
+CdsAMEgEg+FBZZUtjw1QY9KMKlCTS1Z4ZZbPeUycPOiG6sXC6QqcXxWLpf0hV+oT
+I1UGworMP6qr1N256tmKySh63hTYciS4pL/GZHLXqdDeDt9MplAYJvNb7EBqGicM
+GYVHNK1JN69zjnezQ9ODOkt2FrO46RWZ/weqX+EmuXIChwdpO4aFj3mtrOwVxBYu
+RSqpGoIk3qyEVoi9Z/Pzu4TXr/llIwHpAdAEzqYGCQlEWKe6iauyype2GGpshKhH
+5/Vfj79xe0+5rTHdc79jn7RGjJOFJCUZc+0DGfM/Ha8Oi6R2kIg5tSf5F4bxS7t+
+YH/51/tlAgMBAAECggEAGImel+XKZYcxiTb/RJPU53Uuc4PRL9CuLVF9yYQmoogQ
+iALi3OMI7m+Yd7eQT7fhgQah9fAAPmdUt9TBhEdD9bK7yg5fpOVjOL9qYR/Xv8y+
+iCoOf1vYrWKoRuv3NddTGlny1kCrxQkiGqsPYqfzrYoOI/xmNC7zxiaAFebr8Jmq
+OsJWj5rD+J3JKMWSRk4zJHTEhcaI/74pPFACDEO6RzGasQhbCEMElMXIor6sBQOF
+yeuirgpHpEHq+LlXZdU61BxvsGKsFyw8fZ+swDcJnskt7h3yuXu1Isp32I3wCnNx
+jUZT6Goo8josTrEe3FSIwqyvttzdfYET2bKhtuCFuQKBgQD9S+LH8Eatn+IDTCyn
+kJuV+Unu+vDvJlK5TKMt5KiYTpDGg5N/IexGJAZ4KFhxEWIYg1ucsor95VjkuV1W
+0m9OkxSda3L60qGZKVd1zysEbPqZfqVYEZEpTeeT8K9f3Jb4Gp9m0HPe0/gtoESl
+b8fZB7OcyT53zsq7F1PkYCg1cwKBgQDqzLiRBNSAZr+yhP1u3bYAkxR3JpoCLTyD
+n2LhUMTPeIS2WDnmcz5BTzaDh8uO/u4mXdR7TaSQu/YR9BPLbThxoxqBnvSQJwEH
+NcizDJeNT/5a+zObr2RNNXc70DauDzygIrVqEBqHDZxZ0480YIdB08reHuNT1iYe
+s0qdK/wVxwKBgQCJCQUoJlYWmOkt34hJH3MNMFFPeXPf7lvS5CNkMNEFlXu96nFh
+1nh9egAGAc3XXhA0MtzdabrIocv18lMNJcwSNoBwqjEKgenrcvJeSjZ7rnnlkR7j
+Bp4COqOO5if7NNx4Xe7fMOd/Ji6egJai6la0k/YYXMfvCXGkxnock+ktAQKBgQCG
+150jQ3faaaermS6GbfNo7w6wws1tdJctK+q4ZQ8x6w+kPJS74PEexqQS83iWnZcd
+F4PAcD2TFS7i7p4zlHz23emKCUSASLYRcvTYxuF+OTNlAqCHxzk+EfdwtUnBumRh
+vq0axTbG2q0w9Qtn1Au5ZS07VNfOvMxVkzfFfY4e3wKBgBy4QqTatz4YaONV0V9E
+CFGscH8W3ZkhSaqGcU0cVsmb1sJ1W66FfpAaY0RiXX6+WxOGUeXrBKZtNGqpEF/h
+5rHiyJN1vllgzrMUm/4v1PKC6wU9PvsRjUioedtB4U0+oi2Qz6p7fkJ8zCzHrX/z
+j2XhXbp+RQAr8IG74ff6Rpo5
+-----END PRIVATE KEY-----
diff --git a/LayoutTests/imported/w3c/web-platform-tests/_certs/localhost.pem b/LayoutTests/imported/w3c/web-platform-tests/_certs/localhost.pem
new file mode 100644 (file)
index 0000000..5d59a3b
--- /dev/null
@@ -0,0 +1,85 @@
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number: 2 (0x2)
+    Signature Algorithm: sha256WithRSAEncryption
+        Issuer: CN=web-platform-tests
+        Validity
+            Not Before: Jan 27 09:27:41 2015 GMT
+            Not After : Feb 26 09:27:41 2015 GMT
+        Subject: CN=localhost
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+                Public-Key: (2048 bit)
+                Modulus:
+                    00:e8:51:ec:61:80:b6:ac:66:ed:73:09:db:00:30:
+                    48:04:83:e1:41:65:95:2d:8f:0d:50:63:d2:8c:2a:
+                    50:93:4b:56:78:65:96:cf:79:4c:9c:3c:e8:86:ea:
+                    c5:c2:e9:0a:9c:5f:15:8b:a5:fd:21:57:ea:13:23:
+                    55:06:c2:8a:cc:3f:aa:ab:d4:dd:b9:ea:d9:8a:c9:
+                    28:7a:de:14:d8:72:24:b8:a4:bf:c6:64:72:d7:a9:
+                    d0:de:0e:df:4c:a6:50:18:26:f3:5b:ec:40:6a:1a:
+                    27:0c:19:85:47:34:ad:49:37:af:73:8e:77:b3:43:
+                    d3:83:3a:4b:76:16:b3:b8:e9:15:99:ff:07:aa:5f:
+                    e1:26:b9:72:02:87:07:69:3b:86:85:8f:79:ad:ac:
+                    ec:15:c4:16:2e:45:2a:a9:1a:82:24:de:ac:84:56:
+                    88:bd:67:f3:f3:bb:84:d7:af:f9:65:23:01:e9:01:
+                    d0:04:ce:a6:06:09:09:44:58:a7:ba:89:ab:b2:ca:
+                    97:b6:18:6a:6c:84:a8:47:e7:f5:5f:8f:bf:71:7b:
+                    4f:b9:ad:31:dd:73:bf:63:9f:b4:46:8c:93:85:24:
+                    25:19:73:ed:03:19:f3:3f:1d:af:0e:8b:a4:76:90:
+                    88:39:b5:27:f9:17:86:f1:4b:bb:7e:60:7f:f9:d7:
+                    fb:65
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            X509v3 Subject Key Identifier: 
+                F6:CB:82:64:B0:C4:02:1A:85:53:0E:9A:6B:D8:C2:30:AC:05:61:C8
+            X509v3 Authority Key Identifier: 
+                keyid:0E:31:C1:0D:6C:94:E1:F0:D9:8C:C4:E4:A5:DF:FD:1C:CB:3B:CC:58
+
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication
+            X509v3 Subject Alternative Name: 
+                DNS:localhost, DNS:www.localhost, DNS:xn--n8j6ds53lwwkrqhv28a.localhost, DNS:xn--lve-6lad.localhost, DNS:www2.localhost, DNS:www1.localhost
+    Signature Algorithm: sha256WithRSAEncryption
+         80:b4:23:83:d9:5b:c8:5f:fe:16:25:2c:df:64:88:08:6b:1e:
+         f9:15:46:58:54:ce:e0:28:88:af:f1:58:c3:7f:c2:08:7c:8b:
+         d4:2f:da:f3:c5:bd:95:26:f6:0e:0f:66:34:4e:6a:35:3c:14:
+         69:eb:15:2e:fe:0d:0d:c1:ff:30:2d:32:ce:28:c8:8b:57:ac:
+         fc:54:89:9c:37:01:22:08:fe:db:bb:40:96:ec:8b:97:61:9f:
+         68:c8:25:4d:19:77:f7:a6:86:51:2c:f0:b7:39:2b:a0:79:83:
+         4b:42:75:6e:ca:c6:2a:0c:28:8b:69:83:46:3e:9e:0f:0f:7e:
+         1a:17:09:1b:9b:02:ce:21:87:c2:e2:0d:68:91:1b:3a:5c:6d:
+         c5:05:c8:2b:13:d1:28:a3:ed:94:73:ea:7d:b5:b7:b8:4d:be:
+         85:3c:af:66:46:1b:0a:27:5d:71:b5:c6:9d:dc:ff:d6:e4:23:
+         ed:89:11:64:69:16:4f:2f:c5:d6:81:41:d4:75:8d:8e:9b:4d:
+         87:1d:02:bd:a7:d0:cf:a2:41:fb:27:cf:52:cb:2e:19:49:41:
+         5c:d4:2f:c7:39:13:98:72:66:1d:47:97:cb:6b:dd:31:53:4e:
+         b2:b0:af:6c:86:a7:38:1f:a1:a3:9f:54:6b:e1:c7:a2:15:f1:
+         f0:d4:5a:57
+-----BEGIN CERTIFICATE-----
+MIIDnTCCAoWgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAdMRswGQYDVQQDDBJ3ZWIt
+cGxhdGZvcm0tdGVzdHMwHhcNMTUwMTI3MDkyNzQxWhcNMTUwMjI2MDkyNzQxWjAU
+MRIwEAYDVQQDDAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQDoUexhgLasZu1zCdsAMEgEg+FBZZUtjw1QY9KMKlCTS1Z4ZZbPeUycPOiG
+6sXC6QqcXxWLpf0hV+oTI1UGworMP6qr1N256tmKySh63hTYciS4pL/GZHLXqdDe
+Dt9MplAYJvNb7EBqGicMGYVHNK1JN69zjnezQ9ODOkt2FrO46RWZ/weqX+EmuXIC
+hwdpO4aFj3mtrOwVxBYuRSqpGoIk3qyEVoi9Z/Pzu4TXr/llIwHpAdAEzqYGCQlE
+WKe6iauyype2GGpshKhH5/Vfj79xe0+5rTHdc79jn7RGjJOFJCUZc+0DGfM/Ha8O
+i6R2kIg5tSf5F4bxS7t+YH/51/tlAgMBAAGjgfAwge0wCQYDVR0TBAIwADAdBgNV
+HQ4EFgQU9suCZLDEAhqFUw6aa9jCMKwFYcgwHwYDVR0jBBgwFoAUDjHBDWyU4fDZ
+jMTkpd/9HMs7zFgwCwYDVR0PBAQDAgXgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMH4G
+A1UdEQR3MHWCCWxvY2FsaG9zdIINd3d3LmxvY2FsaG9zdIIheG4tLW44ajZkczUz
+bHd3a3JxaHYyOGEubG9jYWxob3N0ghZ4bi0tbHZlLTZsYWQubG9jYWxob3N0gg53
+d3cyLmxvY2FsaG9zdIIOd3d3MS5sb2NhbGhvc3QwDQYJKoZIhvcNAQELBQADggEB
+AIC0I4PZW8hf/hYlLN9kiAhrHvkVRlhUzuAoiK/xWMN/wgh8i9Qv2vPFvZUm9g4P
+ZjROajU8FGnrFS7+DQ3B/zAtMs4oyItXrPxUiZw3ASII/tu7QJbsi5dhn2jIJU0Z
+d/emhlEs8Lc5K6B5g0tCdW7KxioMKItpg0Y+ng8PfhoXCRubAs4hh8LiDWiRGzpc
+bcUFyCsT0Sij7ZRz6n21t7hNvoU8r2ZGGwonXXG1xp3c/9bkI+2JEWRpFk8vxdaB
+QdR1jY6bTYcdAr2n0M+iQfsnz1LLLhlJQVzUL8c5E5hyZh1Hl8tr3TFTTrKwr2yG
+pzgfoaOfVGvhx6IV8fDUWlc=
+-----END CERTIFICATE-----
diff --git a/LayoutTests/imported/w3c/web-platform-tests/_certs/serial b/LayoutTests/imported/w3c/web-platform-tests/_certs/serial
new file mode 100644 (file)
index 0000000..a616ad4
--- /dev/null
@@ -0,0 +1 @@
+01
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/_certs/serial.old b/LayoutTests/imported/w3c/web-platform-tests/_certs/serial.old
new file mode 100644 (file)
index 0000000..9e22bcb
--- /dev/null
@@ -0,0 +1 @@
+02
diff --git a/LayoutTests/imported/w3c/web-platform-tests/common/canvas-frame.css b/LayoutTests/imported/w3c/web-platform-tests/common/canvas-frame.css
new file mode 100644 (file)
index 0000000..0c97a68
--- /dev/null
@@ -0,0 +1,21 @@
+body {
+    font-size: small;
+    font-family: sans-serif;
+}
+
+p {
+    line-height: 0;
+}
+
+p:first-child {
+    display: inline;
+}
+
+h1 {
+    display: inline;
+}
+
+iframe, object {
+    border: 1px black solid;
+    margin: 2px;
+}
diff --git a/LayoutTests/imported/w3c/web-platform-tests/common/canvas-index.css b/LayoutTests/imported/w3c/web-platform-tests/common/canvas-index.css
new file mode 100644 (file)
index 0000000..ef35864
--- /dev/null
@@ -0,0 +1,31 @@
+body {
+    font-size: small;
+    font-family: sans-serif;
+}
+
+a {
+    text-decoration: none;
+}
+
+a:hover {
+    text-decoration: underline;
+}
+
+h3 {
+    display: inline;
+    font-size: medium;
+}
+
+h3 + p {
+    display: inline;
+    margin-left: 0.5em;
+}
+
+li {
+    list-style-type: none;
+}
+
+ul {
+    padding-left: 2em;
+    margin-left: 0;
+}
diff --git a/LayoutTests/imported/w3c/web-platform-tests/common/canvas-spec.css b/LayoutTests/imported/w3c/web-platform-tests/common/canvas-spec.css
new file mode 100644 (file)
index 0000000..5882acb
--- /dev/null
@@ -0,0 +1,50 @@
+.testrefs {
+    font-size: small;
+    margin-left: 0.2em;
+    margin-right: 0.2em;
+    border-bottom: none !important;
+
+    font-weight: normal;
+    font-style: normal;
+    white-space: normal;
+    font-family: sans-serif;
+}
+
+.kw-must, .kw-required {
+    background: #fda;
+}
+
+.kw-should {
+    background: #ffa;
+}
+
+.kw-none {
+    background: #dfa;
+}
+
+
+pre.idl .testrefs :link {
+    color: #00c;
+}
+
+pre.idl .testrefs :visited {
+    color: #609;
+}
+
+.testrefs a:hover {
+    background: transparent;
+    text-decoration: none;
+}
+
+.testrefs:before {
+    content: '[';
+}
+
+.testrefs:after {
+    content: ']';
+}
+
+.testrefs a:first-child {
+    font-weight: bold;
+    text-decoration: none;
+}
diff --git a/LayoutTests/imported/w3c/web-platform-tests/common/canvas-tests.css b/LayoutTests/imported/w3c/web-platform-tests/common/canvas-tests.css
new file mode 100644 (file)
index 0000000..e006e81
--- /dev/null
@@ -0,0 +1,134 @@
+html.fail {
+    background: #f66;
+}
+html.pass {
+    background: #6f6;
+}
+html.needs_check {
+    background: #99f;
+}
+
+body {
+    font-size: small;
+    font-family: sans-serif;
+    color: black;
+}
+
+a:link {
+    color: #00c;
+}
+a:visited {
+    color: #808;
+}
+
+body.framed {
+    font-size: x-small;
+}
+
+h1 {
+    font-size: larger;
+    margin: 0;
+    padding-left: 0.5em;
+    text-indent: -0.5em;
+}
+
+p {
+    margin: 0;
+}
+
+p.notes {
+    margin-bottom: 0.5em;
+    font-style: italic;
+}
+
+ul {
+    margin: 0;
+    margin-bottom: 0.5em;
+    padding: 0;
+    padding-left: 1em;
+}
+
+.refs {
+    font-style: italic;
+    margin-bottom: 0.5em;
+}
+
+.refs ul {
+    display: inline;
+    margin: 0;
+    padding: 0;
+}
+
+.refs li {
+    display: inline;
+    list-style-type: none;
+    margin: 0;
+    padding: 0;
+}
+
+canvas {
+    display: none;
+    visibility: hidden;
+    border: 2px #f0f solid;
+    background: url(../images/background.png);
+}
+
+img.expected {
+    display: none;
+    border: 2px #f0f solid;
+    background: url(../images/background.png);
+}
+
+iframe {
+    border: 2px #f0f solid;
+}
+
+.output {
+    display: none;
+}
+
+.show_output .output, .needs_check .output  {
+    display: block !important;
+    visibility: visible !important;
+}
+
+.show_output #show_output {
+    display: none;
+}
+
+.resource {
+    visibility: hidden;
+    height: 0;
+}
+
+.fallback {
+    font-size: 2em;
+    font-weight: bold;
+    color: #a00;
+}
+
+
+html.minimal body {
+    color: white;
+}
+html.fail.minimal {
+    background: #f00;
+}
+html.pass.minimal {
+    background: #080;
+}
+html.needs_check.minimal {
+    background: #008;
+}
+.minimal #d {
+    display: none !important;
+}
+.minimal .expectedtext {
+    visibility: hidden !important;
+}
+#passtext, #failtext {
+    display: none;
+}
+.minimal.pass #passtext, .minimal.fail #failtext {
+    display: block;
+}
diff --git a/LayoutTests/imported/w3c/web-platform-tests/common/canvas-tests.js b/LayoutTests/imported/w3c/web-platform-tests/common/canvas-tests.js
new file mode 100644 (file)
index 0000000..07b3170
--- /dev/null
@@ -0,0 +1,86 @@
+function _valToString(val)
+{
+    if (val === undefined || val === null)
+        return '[' + typeof(val) + ']';
+    return val.toString() + '[' + typeof(val) + ']';
+}
+
+function _assert(cond, text)
+{
+    assert_true(!!cond, text);
+}
+
+function _assertSame(a, b, text_a, text_b)
+{
+    var msg = text_a + ' === ' + text_b + ' (got ' + _valToString(a) +
+              ', expected ' + _valToString(b) + ')';
+    assert_equals(a, b, msg);
+}
+
+function _assertDifferent(a, b, text_a, text_b)
+{
+    var msg = text_a + ' !== ' + text_b + ' (got ' + _valToString(a) +
+              ', expected not ' + _valToString(b) + ')';
+    assert_not_equals(a, b, msg);
+}
+
+
+function _getPixel(canvas, x,y)
+{
+    var ctx = canvas.getContext('2d');
+    var imgdata = ctx.getImageData(x, y, 1, 1);
+    return [ imgdata.data[0], imgdata.data[1], imgdata.data[2], imgdata.data[3] ];
+}
+
+function _assertPixel(canvas, x,y, r,g,b,a, pos, colour)
+{
+    var c = _getPixel(canvas, x,y);
+    assert_equals(c[0], r, 'Red channel of the pixel at (' + x + ', ' + y + ')');
+    assert_equals(c[1], g, 'Green channel of the pixel at (' + x + ', ' + y + ')');
+    assert_equals(c[2], b, 'Blue channel of the pixel at (' + x + ', ' + y + ')');
+    assert_equals(c[3], a, 'Alpha channel of the pixel at (' + x + ', ' + y + ')');
+}
+
+function _assertPixelApprox(canvas, x,y, r,g,b,a, pos, colour, tolerance)
+{
+    var c = _getPixel(canvas, x,y);
+    assert_approx_equals(c[0], r, tolerance, 'Red channel of the pixel at (' + x + ', ' + y + ')');
+    assert_approx_equals(c[1], g, tolerance, 'Green channel of the pixel at (' + x + ', ' + y + ')');
+    assert_approx_equals(c[2], b, tolerance, 'Blue channel of the pixel at (' + x + ', ' + y + ')');
+    assert_approx_equals(c[3], a, tolerance, 'Alpha channel of the pixel at (' + x + ', ' + y + ')');
+}
+
+function _addTest(testFn)
+{
+    var deferred = false;
+    window.deferTest = function () { deferred = true; };
+    on_event(window, "load", function()
+    {
+        t.step(function() {
+            var canvas = document.getElementById('c');
+            var ctx = canvas.getContext('2d');
+            t.step(testFn, window, canvas, ctx);
+        });
+
+        if (!deferred) {
+            t.done();
+        }
+    });
+}
+
+function _assertGreen(ctx, canvasWidth, canvasHeight)
+{
+    var testColor = function(d, idx, expected) {
+        assert_equals(d[idx], expected, "d[" + idx + "]", String(expected));
+    };
+    var imagedata = ctx.getImageData(0, 0, canvasWidth, canvasHeight);
+    var w = imagedata.width, h = imagedata.height, d = imagedata.data;
+    for (var i = 0; i < h; ++i) {
+        for (var j = 0; j < w; ++j) {
+            testColor(d, 4 * (w * i + j) + 0, 0);
+            testColor(d, 4 * (w * i + j) + 1, 255);
+            testColor(d, 4 * (w * i + j) + 2, 0);
+            testColor(d, 4 * (w * i + j) + 3, 255);
+        }
+    }
+}
diff --git a/LayoutTests/imported/w3c/web-platform-tests/common/css-red.txt b/LayoutTests/imported/w3c/web-platform-tests/common/css-red.txt
new file mode 100644 (file)
index 0000000..9ef04cb
--- /dev/null
@@ -0,0 +1 @@
+html { color: red; }
diff --git a/LayoutTests/imported/w3c/web-platform-tests/common/failing-test.html b/LayoutTests/imported/w3c/web-platform-tests/common/failing-test.html
new file mode 100644 (file)
index 0000000..249099c
--- /dev/null
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Failing test</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+test(function() {
+  assert_unreached("Expected failure");
+});
+</script>
diff --git a/LayoutTests/imported/w3c/web-platform-tests/common/large.py b/LayoutTests/imported/w3c/web-platform-tests/common/large.py
new file mode 100644 (file)
index 0000000..0db4e4b
--- /dev/null
@@ -0,0 +1,45 @@
+def main(request, response):
+    """Code for generating large responses where the actual response data
+    isn't very important.
+
+    Two request parameters:
+    size (required): An integer number of bytes (no suffix) or kilobytes
+                     ("kb" suffix) or megabytes ("Mb" suffix).
+    string (optional): The string to repeat in the response. Defaults to "a".
+
+    Example:
+        /resources/large.py?size=32Mb&string=ab
+    """
+    if not "size" in request.GET:
+        400, "Need an integer bytes parameter"
+
+    bytes_value = request.GET.first("size")
+
+    chunk_size = 1024
+
+    multipliers = {"kb": 1024,
+                   "Mb": 1024*1024}
+
+    suffix = bytes_value[-2:]
+    if suffix in multipliers:
+        multiplier = multipliers[suffix]
+        bytes_value = bytes_value[:-2] * multiplier
+
+    try:
+        num_bytes = int(bytes_value)
+    except ValueError:
+        return 400, "Bytes must be an integer possibly with a kb or Mb suffix"
+
+    string = str(request.GET.first("string", "a"))
+
+    chunk = string * chunk_size
+
+    def content():
+        bytes_sent = 0
+        while bytes_sent < num_bytes:
+            if num_bytes - bytes_sent < len(chunk):
+                yield chunk[num_bytes - bytes_sent]
+            else:
+                yield chunk
+            bytes_sent += len(chunk)
+    return [("Content-Type", "text/plain")], content()
diff --git a/LayoutTests/imported/w3c/web-platform-tests/common/media.js b/LayoutTests/imported/w3c/web-platform-tests/common/media.js
new file mode 100644 (file)
index 0000000..6bddea5
--- /dev/null
@@ -0,0 +1,35 @@
+//
+// Returns the URI of a supported video source based on the user agent
+//
+function getVideoURI(base)
+{
+    var extension = '.mp4';
+
+    var videotag = document.createElement("video");
+
+    if ( videotag.canPlayType  &&
+         videotag.canPlayType('video/ogg; codecs="theora, vorbis"') )
+    {
+        extension = '.ogv';
+    }
+
+    return base + extension;
+}
+
+//
+// Returns the URI of a supported audio source based on the user agent
+//
+function getAudioURI(base)
+{
+    var extension = '.mp3';
+
+    var audiotag = document.createElement("audio");
+
+    if ( audiotag.canPlayType &&
+         audiotag.canPlayType('audio/ogg') )
+    {
+        extension = '.oga';
+    }
+
+    return base + extension;
+}
diff --git a/LayoutTests/imported/w3c/web-platform-tests/common/redirect.py b/LayoutTests/imported/w3c/web-platform-tests/common/redirect.py
new file mode 100644 (file)
index 0000000..3f15eff
--- /dev/null
@@ -0,0 +1,19 @@
+def main(request, response):
+    """Simple handler that causes redirection.
+
+    The request should typically have two query parameters:
+    status - The status to use for the redirection. Defaults to 302.
+    location - The resource to redirect to.
+    """
+    status = 302
+    if "status" in request.GET:
+        try:
+            status = int(request.GET.first("status"))
+        except ValueError:
+            pass
+
+    response.status = status
+
+    location = request.GET.first("location")
+
+    response.headers.set("Location", location)
diff --git a/LayoutTests/imported/w3c/web-platform-tests/common/reftest-wait.js b/LayoutTests/imported/w3c/web-platform-tests/common/reftest-wait.js
new file mode 100644 (file)
index 0000000..87816f8
--- /dev/null
@@ -0,0 +1,9 @@
+function takeScreenshot() {
+    document.documentElement.classList.remove("reftest-wait");
+}
+
+function takeScreenshotDelayed(timeout) {
+    setTimeout(function() {
+        takeScreenshot();
+    }, timeout);
+}
diff --git a/LayoutTests/imported/w3c/web-platform-tests/common/stringifiers.js b/LayoutTests/imported/w3c/web-platform-tests/common/stringifiers.js
new file mode 100644 (file)
index 0000000..b59ca9c
--- /dev/null
@@ -0,0 +1,52 @@
+// Tests <http://heycam.github.io/webidl/#es-stringifier>.
+function test_stringifier_attribute(aObject, aAttribute, aIsUnforgeable) {
+  // Step 1.
+  test(function() {
+    [null, undefined].forEach(function(v) {
+      assert_throws(new TypeError(), function() {
+        aObject.toString.call(v);
+      });
+    });
+  });
+
+  // TODO Step 2: security check.
+
+  // Step 3.
+  test(function() {
+    assert_false("Window" in window && aObject instanceof window.Window);
+    [{}, window].forEach(function(v) {
+      assert_throws(new TypeError(), function() {
+        aObject.toString.call(v)
+      });
+    });
+  });
+
+  // Step 4-6.
+  var expected_value;
+  test(function() {
+    expected_value = aObject[aAttribute];
+    assert_equals(aObject[aAttribute], expected_value,
+                  "The attribute " + aAttribute + " should be pure.");
+  });
+
+  var test_error = { name: "test" };
+  test(function() {
+    if (!aIsUnforgeable) {
+      Object.defineProperty(aObject, aAttribute, {
+        configurable: true,
+        get: function() { throw test_error; }
+      });
+    }
+    assert_equals(aObject.toString(), expected_value);
+  });
+
+  test(function() {
+    if (!aIsUnforgeable) {
+      Object.defineProperty(aObject, aAttribute, {
+        configurable: true,
+        value: { toString: function() { throw test_error; } }
+      });
+    }
+    assert_equals(aObject.toString(), expected_value);
+  });
+}
diff --git a/LayoutTests/imported/w3c/web-platform-tests/common/text-plain.txt b/LayoutTests/imported/w3c/web-platform-tests/common/text-plain.txt
new file mode 100644 (file)
index 0000000..97ca870
--- /dev/null
@@ -0,0 +1,4 @@
+This is a sample text/plain document.
+
+This is not an HTML document.
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/common/utils.js b/LayoutTests/imported/w3c/web-platform-tests/common/utils.js
new file mode 100644 (file)
index 0000000..bcdc256
--- /dev/null
@@ -0,0 +1,80 @@
+function make_absolute_url(options) {
+    var loc = window.location;
+    var protocol = get(options, "protocol", loc.protocol);
+    if (protocol[protocol.length - 1] != ":") {
+        protocol += ":";
+    }
+
+    var hostname = get(options, "hostname", loc.hostname);
+
+    var subdomain = get(options, "subdomain");
+    if (subdomain) {
+        hostname = subdomain + "." + hostname;
+    }
+
+    var port = get(options, "port", loc.port)
+    var path = get(options, "path", loc.pathname);
+    var query = get(options, "query", loc.search);
+    var hash = get(options, "hash", loc.hash)
+
+    var url = protocol + "//" + hostname;
+    if (port) {
+        url += ":" + port;
+    }
+
+    if (path[0] != "/") {
+        url += "/";
+    }
+    url += path;
+    if (query) {
+        if (query[0] != "?") {
+            url += "?";
+        }
+        url += query;
+    }
+    if (hash) {
+        if (hash[0] != "#") {
+            url += "#";
+        }
+        url += hash;
+    }
+    return url;
+}
+
+function get(obj, name, default_val) {
+    if (obj.hasOwnProperty(name)) {
+        return obj[name];
+    }
+    return default_val;
+}
+
+function token() {
+    var uuid = [to_hex(rand_int(32), 8),
+                to_hex(rand_int(16), 4),
+                to_hex(0x4000 | rand_int(12), 4),
+                to_hex(0x8000 | rand_int(14), 4),
+                to_hex(rand_int(48), 12)].join("-")
+    return uuid;
+}
+
+function rand_int(bits) {
+    if (bits < 1 || bits > 53) {
+        throw new TypeError();
+    } else {
+        if (bits >= 1 && bits <= 30) {
+            return 0 | ((1 << bits) * Math.random());
+        } else {
+            var high = (0 | ((1 << (bits - 30)) * Math.random())) * (1 << 30);
+            var low = 0 | ((1 << 30) * Math.random());
+            return  high + low;
+        }
+    }
+}
+
+function to_hex(x, length) {
+    var rv = x.toString(16);
+    while (rv.length < length) {
+        rv = "0" + rv;
+    }
+    return rv;
+}
diff --git a/LayoutTests/imported/w3c/web-platform-tests/common/vendor-prefix.js b/LayoutTests/imported/w3c/web-platform-tests/common/vendor-prefix.js
new file mode 100644 (file)
index 0000000..1a91632
--- /dev/null
@@ -0,0 +1,115 @@
+/* Use this script when you want to test APIs that use vendor prefixes
+   and define which objects need to be checked for prefixed versions, à la
+   <script src="vendor-prefix.js"
+     data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}]'
+   data-prefixed-prototypes='[{"ancestors":["HTMLMediaElement"],"name":"srcObject"}]'></script>
+   data-prefixed-objects lets prefix objects in the global space
+   data-prefixed-prototypes adds prefixes to interfaces, for objects that
+   get created during the tests
+
+   NB: vendor prefixes are expected to go away in favor of putting
+   new features behind flag, so hopefully there will be only limited
+   need to use this
+*/
+
+(function () {
+    var aliases = {};
+    var documentingPrefixUsage = document.createElement('div');
+    var vendorPrefixes = ["moz", "ms", "o", "webkit", "Moz", "MS", "O", "WebKit", "op"];
+
+    function getParentObject(ancestors) {
+        var parent = window;
+        var currentName = "";
+        ancestors.forEach(function (p) {
+            currentName = currentName ? currentName + "." + p : p;
+            if (parent[p] === undefined) {
+                throw currentName + " is undefined, cannot set prefix alias on child object";
+            }
+            parent = parent[p];
+        });
+        return parent;
+    }
+
+    function prependPrefix(prefix, name) {
+        var newName = name[0].toUpperCase() + name.substr(1, name.length);
+        return prefix + newName;
+    }
+
+    function setPrototypeAlias(obj) {
+        var parent = getParentObject(obj.ancestors);
+        if (!parent.prototype.hasOwnProperty(obj.name)) {
+            vendorPrefixes.forEach(function (prefix) {
+                if (parent.prototype.hasOwnProperty(prependPrefix(prefix, obj.name))) {
+                    Object.defineProperty(parent.prototype, obj.name,
+                                          {get: function() {return this[prependPrefix(prefix, obj.name)];},
+                                           set: function(v) {this[prependPrefix(prefix, obj.name)] = v;}
+                                          });
+                    aliases[obj.ancestors.join(".") + ".prototype." + obj.name] = obj.ancestors.join(".") + ".prototype." + prependPrefix(prefix, obj.name);
+                    return;
+                }
+            });
+        }
+    }
+
+    function setAlias(obj) {
+        var parent = getParentObject(obj.ancestors);
+        if (parent[obj.name] === undefined) {
+            vendorPrefixes.forEach(function (prefix) {
+                if (parent[prependPrefix(prefix, obj.name)] !== undefined) {
+                    parent[obj.name] = parent[prependPrefix(prefix, obj.name)];
+                    aliases[obj.ancestors.join(".") + "." + obj.name] = obj.ancestors.join(".") + "." + prependPrefix(prefix, obj.name);
+                    return;
+                }
+            });
+        }
+    }
+
+    if (location.search.indexOf('usePrefixes=1') !== -1) {
+        if (document.querySelector("script[data-prefixed-objects]")) {
+            var prefixObjectsData = document.querySelector("script[data-prefixed-objects]").dataset["prefixedObjects"];
+            try {
+                var prefixedObjects = JSON.parse(prefixObjectsData);
+            } catch (e) {
+                throw "couldn't parse data-prefixed-objects as JSON:" + e;
+            }
+            prefixedObjects.forEach(setAlias);
+        }
+        if (document.querySelector("script[data-prefixed-prototypes]")) {
+            var prefixProtoData = document.querySelector("script[data-prefixed-prototypes]").dataset["prefixedPrototypes"];
+            try {
+                var prefixedPrototypes = JSON.parse(prefixProtoData);
+            } catch (e) {
+                throw "couldn't parse data-prefixed-prototypes as JSON:" + e;
+            }
+            prefixedPrototypes.forEach(setPrototypeAlias);
+        }
+        var ul = document.createElement("ul");
+        Object.keys(aliases).forEach(function (alias) {
+            var li = document.createElement("li");
+            li.appendChild(document.createTextNode(alias + " has been set to be an alias of vendor-prefixed " + aliases[alias]));
+            ul.appendChild(li);
+        });
+        documentingPrefixUsage.appendChild(ul);
+    } else {
+        // Document that the test can be run with prefixes enabled
+
+        var a = document.createElement('a');
+        var link = "";
+        if (location.search) {
+            link = location.search + "&usePrefixes=1";
+        } else {
+            link = "?usePrefixes=1";
+        }
+        a.setAttribute("href", link);
+        a.appendChild(document.createTextNode("with vendor prefixes enabled"));
+        documentingPrefixUsage.appendChild(document.createTextNode("The feature(s) tested here are known to have been made available via vendor prefixes; you can run this test "));
+        documentingPrefixUsage.appendChild(a);
+        documentingPrefixUsage.appendChild(document.createTextNode("."));
+    }
+    var log = document.getElementById('log');
+    if (log) {
+        log.parentNode.insertBefore(documentingPrefixUsage, log);
+    } else {
+        document.body.appendChild(documentingPrefixUsage);
+    }
+})();
diff --git a/LayoutTests/imported/w3c/web-platform-tests/common/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/common/w3c-import.log
new file mode 100644 (file)
index 0000000..bf0494c
--- /dev/null
@@ -0,0 +1,34 @@
+The tests in this directory were imported from the W3C repository.
+Do NOT modify these tests directly in Webkit.
+Instead, create a pull request on the W3C CSS or WPT github:
+       https://github.com/w3c/csswg-test
+       https://github.com/w3c/web-platform-tests
+
+Then run the Tools/Scripts/import-w3c-tests in Webkit to reimport
+
+Do NOT modify or remove this file
+
+------------------------------------------------------------------------
+Last Import: 2015-01-27 10:26
+------------------------------------------------------------------------
+Properties requiring vendor prefixes:
+None
+Property values requiring vendor prefixes:
+None
+------------------------------------------------------------------------
+List of files:
+/LayoutTests/imported/w3c/web-platform-tests/common/canvas-tests.js
+/LayoutTests/imported/w3c/web-platform-tests/common/utils.js
+/LayoutTests/imported/w3c/web-platform-tests/common/text-plain.txt
+/LayoutTests/imported/w3c/web-platform-tests/common/reftest-wait.js
+/LayoutTests/imported/w3c/web-platform-tests/common/stringifiers.js
+/LayoutTests/imported/w3c/web-platform-tests/common/canvas-frame.css
+/LayoutTests/imported/w3c/web-platform-tests/common/css-red.txt
+/LayoutTests/imported/w3c/web-platform-tests/common/canvas-tests.css
+/LayoutTests/imported/w3c/web-platform-tests/common/canvas-spec.css
+/LayoutTests/imported/w3c/web-platform-tests/common/media.js
+/LayoutTests/imported/w3c/web-platform-tests/common/vendor-prefix.js
+/LayoutTests/imported/w3c/web-platform-tests/common/large.py
+/LayoutTests/imported/w3c/web-platform-tests/common/failing-test.html
+/LayoutTests/imported/w3c/web-platform-tests/common/redirect.py
+/LayoutTests/imported/w3c/web-platform-tests/common/canvas-index.css
diff --git a/LayoutTests/imported/w3c/web-platform-tests/config.default.json b/LayoutTests/imported/w3c/web-platform-tests/config.default.json
new file mode 100644 (file)
index 0000000..3efab6b
--- /dev/null
@@ -0,0 +1,22 @@
+{"host": "web-platform.test",
+ "external_host": null,
+ "ports":{"http":[8000, "auto"],
+          "https":[8443],
+          "ws":["auto"]},
+ "check_subdomains": true,
+ "log_level":"debug",
+ "bind_hostname": true,
+ "ssl": {"type": "openssl",
+         "encrypt_after_connect": false,
+         "openssl": {
+             "openssl_binary": "openssl",
+             "base_path": "_certs",
+             "force_regenerate": false
+         },
+         "pregenerated": {
+             "host_key_path": null,
+             "host_cert_path": null
+         },
+         "none": {}
+        }
+}
diff --git a/LayoutTests/imported/w3c/web-platform-tests/domparsing/DOMParser-parseFromString-html-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/domparsing/DOMParser-parseFromString-html-expected.txt
new file mode 100644 (file)
index 0000000..ea7a314
--- /dev/null
@@ -0,0 +1,10 @@
+
+PASS Parsing of id attribute 
+FAIL URL value assert_equals: The document must have a URL value equal to the URL of the active document. expected (object) null but got (string) "http://localhost:8800/domparsing/DOMParser-parseFromString-html.html"(stack: assert@http://localhost:8800/resources/testharness.js:1739:42
+assert_equals@http://localhost:8800/resources/testharness.js:331:19
+http://localhost:8800/domparsing/DOMParser-parseFromString-html.html:30:18
+step@http://localhost:8800/resources/testharness.js:799:30
+test@http://localhost:8800/resources/testharness.js:74:22
+global code@http://localhost:8800/domparsing/DOMParser-parseFromString-html.html:29:5)
+PASS Location value 
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/domparsing/DOMParser-parseFromString-html.html b/LayoutTests/imported/w3c/web-platform-tests/domparsing/DOMParser-parseFromString-html.html
new file mode 100644 (file)
index 0000000..a00b619
--- /dev/null
@@ -0,0 +1,39 @@
+<!doctype html>
+<title>DOMParser basic test of HTML parsing</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+// |expected| should be an object indicating the expected type of node.
+function assert_node(actual, expected) {
+    assert_true(actual instanceof expected.type,
+                'Node type mismatch: actual = ' + actual.nodeType + ', expected = ' + expected.nodeType);
+    if (typeof(expected.id) !== 'undefined')
+        assert_equals(actual.id, expected.id, expected.idMessage);
+    if (typeof(expected.nodeValue) !== 'undefined')
+        assert_equals(actual.nodeValue, expected.nodeValue, expected.nodeValueMessage);
+}
+
+var doc;
+setup(function() {
+    var parser = new DOMParser();
+    var input = '<html id="root"><head></head><body></body></html>';
+    doc = parser.parseFromString(input, 'text/html');
+});
+
+test(function() {
+    var root = doc.documentElement;
+    assert_node(root, { type: HTMLHtmlElement, id: 'root',
+                        idMessage: 'documentElement id attribute should be root.' });
+}, 'Parsing of id attribute');
+
+test(function() {
+    assert_equals(document.documentURI, doc.documentURI,
+                  'The document must have a URL value equal to the URL of the active document.');
+}, 'URL value');
+
+test(function() {
+    assert_equals(doc.location, null,
+                  'The document must have a location value of null.');
+}, 'Location value');
+
+</script>
diff --git a/LayoutTests/imported/w3c/web-platform-tests/domparsing/insert-adjacent-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/domparsing/insert-adjacent-expected.txt
new file mode 100644 (file)
index 0000000..c380825
--- /dev/null
@@ -0,0 +1,10 @@
+beforebegin
+
+afterend
+
+
+PASS insertAdjacentHTML(beforebegin, <h3>beforebegin</h3> ) 
+PASS insertAdjacentHTML(afterbegin, <h3>afterbegin</h3> ) 
+PASS insertAdjacentHTML(beforeend, <h3>beforeend</h3> ) 
+PASS insertAdjacentHTML(afterend, <h3>afterend</h3> ) 
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/domparsing/insert-adjacent.html b/LayoutTests/imported/w3c/web-platform-tests/domparsing/insert-adjacent.html
new file mode 100644 (file)
index 0000000..f43ec40
--- /dev/null
@@ -0,0 +1,38 @@
+<!doctype html>
+<title>insertAdjacentHTML</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+#element {
+  display: none;
+}
+</style>
+
+<div id="element"></div>
+<div id="log"></div>
+
+<script>
+function wrap(text) {
+  return '<h3>' + text + '</h3>';
+}
+
+var possiblePositions = {
+    'beforebegin': 'previousSibling'
+  , 'afterbegin': 'firstChild'
+  , 'beforeend': 'lastChild'
+  , 'afterend': 'nextSibling'
+}
+
+var el = document.querySelector('#element');
+
+Object.keys(possiblePositions).forEach(function(position) {
+  var html = wrap(position);
+  test(function() {
+    el.insertAdjacentHTML(position, html);
+    var heading = document.createElement('h3');
+    heading.innerHTML = position;
+    assert_equals(el[possiblePositions[position]].nodeName, "H3");
+    assert_equals(el[possiblePositions[position]].firstChild.nodeType, Node.TEXT_NODE);
+  }, 'insertAdjacentHTML(' + position + ', ' + html + ' )');
+});
+</script>
diff --git a/LayoutTests/imported/w3c/web-platform-tests/domparsing/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/domparsing/w3c-import.log
new file mode 100644 (file)
index 0000000..c86c9af
--- /dev/null
@@ -0,0 +1,21 @@
+The tests in this directory were imported from the W3C repository.
+Do NOT modify these tests directly in Webkit.
+Instead, create a pull request on the W3C CSS or WPT github:
+       https://github.com/w3c/csswg-test
+       https://github.com/w3c/web-platform-tests
+
+Then run the Tools/Scripts/import-w3c-tests in Webkit to reimport
+
+Do NOT modify or remove this file
+
+------------------------------------------------------------------------
+Last Import: 2015-01-27 10:26
+------------------------------------------------------------------------
+Properties requiring vendor prefixes:
+None
+Property values requiring vendor prefixes:
+None
+------------------------------------------------------------------------
+List of files:
+/LayoutTests/imported/w3c/web-platform-tests/domparsing/insert-adjacent.html
+/LayoutTests/imported/w3c/web-platform-tests/domparsing/DOMParser-parseFromString-html.html
diff --git a/LayoutTests/imported/w3c/web-platform-tests/fonts/CanvasTest.sfd b/LayoutTests/imported/w3c/web-platform-tests/fonts/CanvasTest.sfd
new file mode 100644 (file)
index 0000000..6dbe8e2
--- /dev/null
@@ -0,0 +1,321 @@
+SplineFontDB: 3.0
+FontName: CanvasTest
+FullName: CanvasTest
+FamilyName: CanvasTest
+Weight: Medium
+Copyright: Copyright (c) 2010 Philip Taylor.\n\nReleased under the MIT License: http://www.opensource.org/licenses/mit-license.php
+UComments: "2010-2-26: Created." 
+Version: 001.000
+ItalicAngle: 0
+UnderlinePosition: -102
+UnderlineWidth: 51
+Ascent: 768
+Descent: 256
+LayerCount: 2
+Layer: 0 0 "Back"  1
+Layer: 1 0 "Fore"  0
+NeedsXUIDChange: 1
+XUID: [1021 923 651290676 15069128]
+BaseHoriz: 4 'hang' 'ideo' 'math' 'romn'
+BaseScript: 'DFLT' 3  512 128 384 0
+FSType: 0
+OS2Version: 0
+OS2_WeightWidthSlopeOnly: 0
+OS2_UseTypoMetrics: 1
+CreationTime: 1267213266
+ModificationTime: 1267289643
+OS2TypoAscent: 0
+OS2TypoAOffset: 1
+OS2TypoDescent: 0
+OS2TypoDOffset: 1
+OS2TypoLinegap: 92
+OS2WinAscent: 0
+OS2WinAOffset: 1
+OS2WinDescent: 0
+OS2WinDOffset: 1
+HheadAscent: 0
+HheadAOffset: 1
+HheadDescent: 0
+HheadDOffset: 1
+DEI: 91125
+LangName: 1033 
+Encoding: ISO8859-1
+UnicodeInterp: none
+NameList: Adobe Glyph List
+DisplaySize: -24
+AntiAlias: 1
+FitToEm: 1
+WinInfo: 0 39 15
+BeginChars: 256 11
+
+StartChar: A
+Encoding: 65 65 0
+Width: 1024
+VWidth: 0
+Flags: H
+LayerCount: 2
+Fore
+SplineSet
+0 768 m 25
+ 1024 768 l 25
+ 1024 0 l 29
+ 0 0 l 25
+ 0 768 l 25
+EndSplineSet
+Validated: 1
+EndChar
+
+StartChar: B
+Encoding: 66 66 1
+Width: 1024
+VWidth: 0
+Flags: H
+LayerCount: 2
+Fore
+SplineSet
+0 0 m 29
+ 1024 0 l 25
+ 1024 -256 l 25
+ 0 -256 l 25
+ 0 0 l 29
+EndSplineSet
+Validated: 1
+EndChar
+
+StartChar: C
+Encoding: 67 67 2
+Width: 1024
+VWidth: 0
+Flags: H
+LayerCount: 2
+Fore
+SplineSet
+280 1640 m 1
+ 350 1735 l 1
+ 493 1594 l 1
+ 620 1745 l 1
+ 705 1660 l 1
+ 577 1511 l 1
+ 715 1375 l 1
+ 635 1280 l 1
+ 498 1418 l 1
+ 380 1280 l 1
+ 305 1370 l 1
+ 416 1502 l 1
+ 280 1640 l 1
+0 768 m 25
+ 1024 768 l 25
+ 1024 -256 l 25
+ 0 -256 l 25
+ 0 768 l 25
+620 -340 m 1
+ 705 -425 l 1
+ 577 -574 l 1
+ 715 -710 l 1
+ 635 -805 l 1
+ 498 -667 l 1
+ 380 -805 l 1
+ 305 -715 l 1
+ 416 -583 l 1
+ 280 -445 l 1
+ 350 -350 l 1
+ 493 -491 l 1
+ 620 -340 l 1
+EndSplineSet
+Validated: 1
+EndChar
+
+StartChar: D
+Encoding: 68 68 3
+Width: 1024
+VWidth: 0
+Flags: HW
+LayerCount: 2
+Fore
+SplineSet
+-1003 450 m 1
+ -933 545 l 1
+ -790 404 l 1
+ -663 555 l 1
+ -578 470 l 1
+ -706 321 l 1
+ -568 185 l 1
+ -648 90 l 1
+ -785 228 l 1
+ -903 90 l 1
+ -978 180 l 1
+ -867 312 l 1
+ -1003 450 l 1
+0 768 m 25
+ 1024 768 l 25
+ 1024 -256 l 25
+ 0 -256 l 29
+ 0 768 l 25
+1485 591 m 1
+ 1570 506 l 1
+ 1442 357 l 1
+ 1580 221 l 1
+ 1500 126 l 1
+ 1363 264 l 1
+ 1245 126 l 1
+ 1170 216 l 1
+ 1281 348 l 1
+ 1145 486 l 1
+ 1215 581 l 1
+ 1358 440 l 1
+ 1485 591 l 1
+EndSplineSet
+Validated: 1
+EndChar
+
+StartChar: space
+Encoding: 32 32 4
+Width: 1024
+VWidth: 0
+Flags: HW
+LayerCount: 2
+EndChar
+
+StartChar: E
+Encoding: 69 69 5
+Width: 1024
+VWidth: 0
+Flags: HW
+LayerCount: 2
+Fore
+SplineSet
+0 768 m 25
+ 1024 768 l 25
+ 1024 -256 l 25
+ 0 -256 l 25
+ 0 768 l 25
+EndSplineSet
+Validated: 1
+EndChar
+
+StartChar: uni000B
+Encoding: 11 11 6
+Width: 1024
+VWidth: 0
+Flags: HW
+LayerCount: 2
+Fore
+SplineSet
+28 644 m 1
+ 98 739 l 1
+ 241 598 l 1
+ 368 749 l 1
+ 453 664 l 1
+ 325 515 l 1
+ 463 379 l 1
+ 383 284 l 1
+ 246 422 l 1
+ 128 284 l 1
+ 53 374 l 1
+ 164 506 l 1
+ 28 644 l 1
+EndSplineSet
+Validated: 1
+EndChar
+
+StartChar: uni000C
+Encoding: 12 12 7
+Width: 1024
+VWidth: 0
+Flags: HW
+LayerCount: 2
+Fore
+SplineSet
+28 644 m 1
+ 98 739 l 1
+ 241 598 l 1
+ 368 749 l 1
+ 453 664 l 1
+ 325 515 l 1
+ 463 379 l 1
+ 383 284 l 1
+ 246 422 l 1
+ 128 284 l 1
+ 53 374 l 1
+ 164 506 l 1
+ 28 644 l 1
+EndSplineSet
+Validated: 1
+EndChar
+
+StartChar: uni000D
+Encoding: 13 13 8
+Width: 1024
+VWidth: 0
+Flags: HW
+LayerCount: 2
+Fore
+SplineSet
+28 644 m 1
+ 98 739 l 1
+ 241 598 l 1
+ 368 749 l 1
+ 453 664 l 1
+ 325 515 l 1
+ 463 379 l 1
+ 383 284 l 1
+ 246 422 l 1
+ 128 284 l 1
+ 53 374 l 1
+ 164 506 l 1
+ 28 644 l 1
+EndSplineSet
+Validated: 1
+EndChar
+
+StartChar: uni000A
+Encoding: 10 10 9
+Width: 1024
+VWidth: 0
+Flags: HW
+LayerCount: 2
+Fore
+SplineSet
+28 644 m 1
+ 98 739 l 1
+ 241 598 l 1
+ 368 749 l 1
+ 453 664 l 1
+ 325 515 l 1
+ 463 379 l 1
+ 383 284 l 1
+ 246 422 l 1
+ 128 284 l 1
+ 53 374 l 1
+ 164 506 l 1
+ 28 644 l 1
+EndSplineSet
+Validated: 1
+EndChar
+
+StartChar: uni0009
+Encoding: 9 9 10
+Width: 1024
+VWidth: 0
+Flags: HW
+LayerCount: 2
+Fore
+SplineSet
+28 644 m 1
+ 98 739 l 1
+ 241 598 l 1
+ 368 749 l 1
+ 453 664 l 1
+ 325 515 l 1
+ 463 379 l 1
+ 383 284 l 1
+ 246 422 l 1
+ 128 284 l 1
+ 53 374 l 1
+ 164 506 l 1
+ 28 644 l 1
+EndSplineSet
+Validated: 1
+EndChar
+EndChars
+EndSplineFont
diff --git a/LayoutTests/imported/w3c/web-platform-tests/fonts/CanvasTest.ttf b/LayoutTests/imported/w3c/web-platform-tests/fonts/CanvasTest.ttf
new file mode 100644 (file)
index 0000000..9023592
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/fonts/CanvasTest.ttf differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/fonts/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/fonts/w3c-import.log
new file mode 100644 (file)
index 0000000..1b5f2e0
--- /dev/null
@@ -0,0 +1,21 @@
+The tests in this directory were imported from the W3C repository.
+Do NOT modify these tests directly in Webkit.
+Instead, create a pull request on the W3C CSS or WPT github:
+       https://github.com/w3c/csswg-test
+       https://github.com/w3c/web-platform-tests
+
+Then run the Tools/Scripts/import-w3c-tests in Webkit to reimport
+
+Do NOT modify or remove this file
+
+------------------------------------------------------------------------
+Last Import: 2015-01-27 10:26
+------------------------------------------------------------------------
+Properties requiring vendor prefixes:
+None
+Property values requiring vendor prefixes:
+None
+------------------------------------------------------------------------
+List of files:
+/LayoutTests/imported/w3c/web-platform-tests/fonts/CanvasTest.sfd
+/LayoutTests/imported/w3c/web-platform-tests/fonts/CanvasTest.ttf
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/anim-gr.gif b/LayoutTests/imported/w3c/web-platform-tests/images/anim-gr.gif
new file mode 100644 (file)
index 0000000..45263e0
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/anim-gr.gif differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/anim-gr.png b/LayoutTests/imported/w3c/web-platform-tests/images/anim-gr.png
new file mode 100644 (file)
index 0000000..925e2ef
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/anim-gr.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/anim-poster-gr.png b/LayoutTests/imported/w3c/web-platform-tests/images/anim-poster-gr.png
new file mode 100644 (file)
index 0000000..6941207
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/anim-poster-gr.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/background.png b/LayoutTests/imported/w3c/web-platform-tests/images/background.png
new file mode 100644 (file)
index 0000000..6db6c6b
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/background.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/black-rectangle.png b/LayoutTests/imported/w3c/web-platform-tests/images/black-rectangle.png
new file mode 100644 (file)
index 0000000..a0bf1fe
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/black-rectangle.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/blue-area.png b/LayoutTests/imported/w3c/web-platform-tests/images/blue-area.png
new file mode 100644 (file)
index 0000000..570ae0f
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/blue-area.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/blue-border.png b/LayoutTests/imported/w3c/web-platform-tests/images/blue-border.png
new file mode 100644 (file)
index 0000000..8f8e41c
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/blue-border.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/blue.png b/LayoutTests/imported/w3c/web-platform-tests/images/blue.png
new file mode 100644 (file)
index 0000000..4498dd2
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/blue.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/blue96x96.png b/LayoutTests/imported/w3c/web-platform-tests/images/blue96x96.png
new file mode 100644 (file)
index 0000000..820f8ca
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/blue96x96.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/broken.png b/LayoutTests/imported/w3c/web-platform-tests/images/broken.png
new file mode 100644 (file)
index 0000000..f258101
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/broken.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/canvas-line.png b/LayoutTests/imported/w3c/web-platform-tests/images/canvas-line.png
new file mode 100644 (file)
index 0000000..30f8f45
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/canvas-line.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/fail.gif b/LayoutTests/imported/w3c/web-platform-tests/images/fail.gif
new file mode 100644 (file)
index 0000000..c4addcf
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/fail.gif differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/ggrr-256x256.png b/LayoutTests/imported/w3c/web-platform-tests/images/ggrr-256x256.png
new file mode 100644 (file)
index 0000000..0342e4a
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/ggrr-256x256.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/green-100x50.png b/LayoutTests/imported/w3c/web-platform-tests/images/green-100x50.png
new file mode 100644 (file)
index 0000000..2b7577d
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/green-100x50.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/green-16x16.png b/LayoutTests/imported/w3c/web-platform-tests/images/green-16x16.png
new file mode 100644 (file)
index 0000000..e19a3ff
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/green-16x16.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/green-1x1.png b/LayoutTests/imported/w3c/web-platform-tests/images/green-1x1.png
new file mode 100644 (file)
index 0000000..862d1dd
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/green-1x1.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/green-256x256.png b/LayoutTests/imported/w3c/web-platform-tests/images/green-256x256.png
new file mode 100644 (file)
index 0000000..b06945c
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/green-256x256.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/green-2x2.png b/LayoutTests/imported/w3c/web-platform-tests/images/green-2x2.png
new file mode 100644 (file)
index 0000000..adc0594
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/green-2x2.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/green.png b/LayoutTests/imported/w3c/web-platform-tests/images/green.png
new file mode 100644 (file)
index 0000000..28a1faa
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/green.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/green.svg b/LayoutTests/imported/w3c/web-platform-tests/images/green.svg
new file mode 100644 (file)
index 0000000..d91971f
--- /dev/null
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="50">
+  <rect fill="lime" width="100" height="50"/>
+</svg>
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/grgr-256x256.png b/LayoutTests/imported/w3c/web-platform-tests/images/grgr-256x256.png
new file mode 100644 (file)
index 0000000..b8c7189
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/grgr-256x256.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/movie_300_frame_0.png b/LayoutTests/imported/w3c/web-platform-tests/images/movie_300_frame_0.png
new file mode 100644 (file)
index 0000000..b712825
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/movie_300_frame_0.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/red-16x16.png b/LayoutTests/imported/w3c/web-platform-tests/images/red-16x16.png
new file mode 100644 (file)
index 0000000..9038fef
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/red-16x16.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/red-zeroheight.svg b/LayoutTests/imported/w3c/web-platform-tests/images/red-zeroheight.svg
new file mode 100644 (file)
index 0000000..de378d4
--- /dev/null
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="0">
+  <rect fill="red" width="100" height="100"/>
+</svg>
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/red-zerosize.svg b/LayoutTests/imported/w3c/web-platform-tests/images/red-zerosize.svg
new file mode 100644 (file)
index 0000000..dcd3317
--- /dev/null
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="0" height="0">
+  <rect fill="red" width="100" height="100"/>
+</svg>
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/red-zerowidth.svg b/LayoutTests/imported/w3c/web-platform-tests/images/red-zerowidth.svg
new file mode 100644 (file)
index 0000000..66cff81
--- /dev/null
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="0" height="100">
+  <rect fill="red" width="100" height="100"/>
+</svg>
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/red.png b/LayoutTests/imported/w3c/web-platform-tests/images/red.png
new file mode 100644 (file)
index 0000000..a6e195d
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/red.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/redtransparent.png b/LayoutTests/imported/w3c/web-platform-tests/images/redtransparent.png
new file mode 100644 (file)
index 0000000..75da08c
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/redtransparent.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/rgrg-256x256.png b/LayoutTests/imported/w3c/web-platform-tests/images/rgrg-256x256.png
new file mode 100644 (file)
index 0000000..e6fba3d
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/rgrg-256x256.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/rrgg-256x256.png b/LayoutTests/imported/w3c/web-platform-tests/images/rrgg-256x256.png
new file mode 100644 (file)
index 0000000..7f63515
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/rrgg-256x256.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/smiley.png b/LayoutTests/imported/w3c/web-platform-tests/images/smiley.png
new file mode 100644 (file)
index 0000000..640a223
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/smiley.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/threecolors.png b/LayoutTests/imported/w3c/web-platform-tests/images/threecolors.png
new file mode 100644 (file)
index 0000000..0643e6e
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/threecolors.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/transparent.png b/LayoutTests/imported/w3c/web-platform-tests/images/transparent.png
new file mode 100644 (file)
index 0000000..2b49869
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/transparent.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/transparent50.png b/LayoutTests/imported/w3c/web-platform-tests/images/transparent50.png
new file mode 100644 (file)
index 0000000..55f8e69
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/transparent50.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/images/w3c-import.log
new file mode 100644 (file)
index 0000000..58d70da
--- /dev/null
@@ -0,0 +1,55 @@
+The tests in this directory were imported from the W3C repository.
+Do NOT modify these tests directly in Webkit.
+Instead, create a pull request on the W3C CSS or WPT github:
+       https://github.com/w3c/csswg-test
+       https://github.com/w3c/web-platform-tests
+
+Then run the Tools/Scripts/import-w3c-tests in Webkit to reimport
+
+Do NOT modify or remove this file
+
+------------------------------------------------------------------------
+Last Import: 2015-01-27 10:26
+------------------------------------------------------------------------
+Properties requiring vendor prefixes:
+None
+Property values requiring vendor prefixes:
+None
+------------------------------------------------------------------------
+List of files:
+/LayoutTests/imported/w3c/web-platform-tests/images/blue.png
+/LayoutTests/imported/w3c/web-platform-tests/images/redtransparent.png
+/LayoutTests/imported/w3c/web-platform-tests/images/anim-poster-gr.png
+/LayoutTests/imported/w3c/web-platform-tests/images/blue96x96.png
+/LayoutTests/imported/w3c/web-platform-tests/images/green-100x50.png
+/LayoutTests/imported/w3c/web-platform-tests/images/transparent50.png
+/LayoutTests/imported/w3c/web-platform-tests/images/red-zeroheight.svg
+/LayoutTests/imported/w3c/web-platform-tests/images/canvas-line.png
+/LayoutTests/imported/w3c/web-platform-tests/images/ggrr-256x256.png
+/LayoutTests/imported/w3c/web-platform-tests/images/anim-gr.gif
+/LayoutTests/imported/w3c/web-platform-tests/images/green-16x16.png
+/LayoutTests/imported/w3c/web-platform-tests/images/blue-border.png
+/LayoutTests/imported/w3c/web-platform-tests/images/green.png
+/LayoutTests/imported/w3c/web-platform-tests/images/fail.gif
+/LayoutTests/imported/w3c/web-platform-tests/images/green-2x2.png
+/LayoutTests/imported/w3c/web-platform-tests/images/background.png
+/LayoutTests/imported/w3c/web-platform-tests/images/movie_300_frame_0.png
+/LayoutTests/imported/w3c/web-platform-tests/images/transparent.png
+/LayoutTests/imported/w3c/web-platform-tests/images/rgrg-256x256.png
+/LayoutTests/imported/w3c/web-platform-tests/images/black-rectangle.png
+/LayoutTests/imported/w3c/web-platform-tests/images/green-1x1.png
+/LayoutTests/imported/w3c/web-platform-tests/images/smiley.png
+/LayoutTests/imported/w3c/web-platform-tests/images/red.png
+/LayoutTests/imported/w3c/web-platform-tests/images/threecolors.png
+/LayoutTests/imported/w3c/web-platform-tests/images/anim-gr.png
+/LayoutTests/imported/w3c/web-platform-tests/images/rrgg-256x256.png
+/LayoutTests/imported/w3c/web-platform-tests/images/green.svg
+/LayoutTests/imported/w3c/web-platform-tests/images/yellow75.png
+/LayoutTests/imported/w3c/web-platform-tests/images/yellow.png
+/LayoutTests/imported/w3c/web-platform-tests/images/red-zerosize.svg
+/LayoutTests/imported/w3c/web-platform-tests/images/red-zerowidth.svg
+/LayoutTests/imported/w3c/web-platform-tests/images/green-256x256.png
+/LayoutTests/imported/w3c/web-platform-tests/images/grgr-256x256.png
+/LayoutTests/imported/w3c/web-platform-tests/images/red-16x16.png
+/LayoutTests/imported/w3c/web-platform-tests/images/blue-area.png
+/LayoutTests/imported/w3c/web-platform-tests/images/broken.png
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/yellow.png b/LayoutTests/imported/w3c/web-platform-tests/images/yellow.png
new file mode 100644 (file)
index 0000000..51e8aaf
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/yellow.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/images/yellow75.png b/LayoutTests/imported/w3c/web-platform-tests/images/yellow75.png
new file mode 100644 (file)
index 0000000..2bb82c9
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/images/yellow75.png differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/serve.py b/LayoutTests/imported/w3c/web-platform-tests/serve.py
new file mode 100644 (file)
index 0000000..b9c17c5
--- /dev/null
@@ -0,0 +1,462 @@
+ # -*- coding: utf-8 -*-
+import argparse
+import imp
+import json
+import os
+import signal
+import socket
+import sys
+import threading
+import time
+import traceback
+import urllib2
+import uuid
+from collections import defaultdict
+from multiprocessing import Process, Event
+
+print sys.path
+print imp.find_module('tools')
+from tools.scripts import _env
+repo_root = _env.repo_root
+from wptserve import server as wptserve, handlers
+from wptserve.router import any_method
+from wptserve.logger import set_logger
+
+from mod_pywebsocket import standalone as pywebsocket
+
+sys.path.insert(1, os.path.join(repo_root, "tools"))
+import sslutils
+
+
+@handlers.handler
+def workers_handler(request, response):
+    worker_path = request.url_parts.path.replace(".worker", ".worker.js")
+    return """
+<!doctype html>
+<meta charset=utf-8>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id=log></div>
+<script>
+fetch_tests_from_worker(new Worker("%s"));
+</script>
+""" % (worker_path,)
+
+
+routes = [("GET", "/tools/runner/*", handlers.file_handler),
+          ("POST", "/tools/runner/update_manifest.py", handlers.python_script_handler),
+          (any_method, "/_certs/*", handlers.ErrorHandler(404)),
+          (any_method, "/tools/*", handlers.ErrorHandler(404)),
+          (any_method, "{spec}/tools/*", handlers.ErrorHandler(404)),
+          (any_method, "/serve.py", handlers.ErrorHandler(404)),
+          (any_method, "*.py", handlers.python_script_handler),
+          ("GET", "*.asis", handlers.as_is_handler),
+          ("GET", "*.worker", workers_handler),
+          ("GET", "*", handlers.file_handler),
+          ]
+
+rewrites = [("GET", "/resources/WebIDLParser.js", "/resources/webidl2/lib/webidl2.js")]
+
+subdomains = [u"www",
+              u"www1",
+              u"www2",
+              u"天気の良い日",
+              u"élève"]
+
+def setup_logger(level):
+    import logging
+    global logger
+    logger = logging.getLogger("web-platform-tests")
+    logging.basicConfig(level=getattr(logging, level.upper()))
+    set_logger(logger)
+
+
+def open_socket(port):
+    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+    if port != 0:
+        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+    sock.bind(('127.0.0.1', port))
+    sock.listen(5)
+    return sock
+
+
+def get_port():
+    free_socket = open_socket(0)
+    port = free_socket.getsockname()[1]
+    logger.debug("Going to use port %s" % port)
+    free_socket.close()
+    return port
+
+
+class ServerProc(object):
+    def __init__(self):
+        self.proc = None
+        self.daemon = None
+        self.stop = Event()
+
+    def start(self, init_func, host, port, paths, bind_hostname, external_config, ssl_config,
+              **kwargs):
+        self.proc = Process(target=self.create_daemon,
+                            args=(init_func, host, port, paths, bind_hostname,
+                                  external_config, ssl_config))
+        self.proc.daemon = True
+        self.proc.start()
+
+    def create_daemon(self, init_func, host, port, paths, bind_hostname, external_config, ssl_config,
+                      **kwargs):
+        try:
+            self.daemon = init_func(host, port, paths, bind_hostname, external_config,
+                                    ssl_config, **kwargs)
+        except socket.error:
+            print >> sys.stderr, "Socket error on port %s" % port
+            raise
+        except:
+            print >> sys.stderr, traceback.format_exc()
+            raise
+
+        if self.daemon:
+            try:
+                self.daemon.start(block=False)
+                try:
+                    self.stop.wait()
+                except KeyboardInterrupt:
+                    pass
+            except:
+                print >> sys.stderr, traceback.format_exc()
+                raise
+
+    def wait(self):
+        self.stop.set()
+        self.proc.join()
+
+    def kill(self):
+        self.stop.set()
+        self.proc.terminate()
+        self.proc.join()
+
+    def is_alive(self):
+        return self.proc.is_alive()
+
+
+def check_subdomains(host, paths, bind_hostname, ssl_config):
+    port = get_port()
+    subdomains = get_subdomains(host)
+
+    wrapper = ServerProc()
+    wrapper.start(start_http_server, host, port, paths, bind_hostname, None, ssl_config)
+
+    connected = False
+    for i in range(10):
+        try:
+            urllib2.urlopen("http://%s:%d/" % (host, port))
+            connected = True
+            break
+        except urllib2.URLError:
+            time.sleep(1)
+
+    if not connected:
+        logger.critical("Failed to connect to test server on http://%s:%s You may need to edit /etc/hosts or similar" % (host, port))
+        sys.exit(1)
+
+    for subdomain, (punycode, host) in subdomains.iteritems():
+        domain = "%s.%s" % (punycode, host)
+        try:
+            urllib2.urlopen("http://%s:%d/" % (domain, port))
+        except Exception as e:
+            logger.critical("Failed probing domain %s. You may need to edit /etc/hosts or similar." % domain)
+            sys.exit(1)
+
+    wrapper.wait()
+
+
+def get_subdomains(host):
+    #This assumes that the tld is ascii-only or already in punycode
+    return {subdomain: (subdomain.encode("idna"), host)
+            for subdomain in subdomains}
+
+
+def start_servers(host, ports, paths, bind_hostname, external_config, ssl_config, **kwargs):
+    servers = defaultdict(list)
+    for scheme, ports in ports.iteritems():
+        assert len(ports) == {"http":2}.get(scheme, 1)
+
+        for port  in ports:
+            if port is None:
+                continue
+            init_func = {"http":start_http_server,
+                         "https":start_https_server,
+                         "ws":start_ws_server,
+                         "wss":start_wss_server}[scheme]
+
+            server_proc = ServerProc()
+            server_proc.start(init_func, host, port, paths, bind_hostname,
+                              external_config, ssl_config, **kwargs)
+            servers[scheme].append((port, server_proc))
+
+    return servers
+
+
+def start_http_server(host, port, paths, bind_hostname, external_config, ssl_config,
+                      **kwargs):
+    return wptserve.WebTestHttpd(host=host,
+                                 port=port,
+                                 doc_root=paths["doc_root"],
+                                 routes=routes,
+                                 rewrites=rewrites,
+                                 bind_hostname=bind_hostname,
+                                 config=external_config,
+                                 use_ssl=False,
+                                 key_file=None,
+                                 certificate=None,
+                                 latency=kwargs.get("latency"))
+
+
+def start_https_server(host, port, paths, bind_hostname, external_config, ssl_config,
+                       **kwargs):
+    return wptserve.WebTestHttpd(host=host,
+                                 port=port,
+                                 doc_root=paths["doc_root"],
+                                 routes=routes,
+                                 rewrites=rewrites,
+                                 bind_hostname=bind_hostname,
+                                 config=external_config,
+                                 use_ssl=True,
+                                 key_file=ssl_config["key_path"],
+                                 certificate=ssl_config["cert_path"],
+                                 encrypt_after_connect=ssl_config["encrypt_after_connect"],
+                                 latency=kwargs.get("latency"))
+
+
+class WebSocketDaemon(object):
+    def __init__(self, host, port, doc_root, handlers_root, log_level, bind_hostname,
+                 ssl_config):
+        self.host = host
+        cmd_args = ["-p", port,
+                    "-d", doc_root,
+                    "-w", handlers_root,
+                    "--log-level", log_level]
+        if (bind_hostname):
+            cmd_args = ["-H", host] + cmd_args
+        opts, args = pywebsocket._parse_args_and_config(cmd_args)
+        opts.cgi_directories = []
+        opts.is_executable_method = None
+        self.server = pywebsocket.WebSocketServer(opts)
+        ports = [item[0].getsockname()[1] for item in self.server._sockets]
+        assert all(item == ports[0] for item in ports)
+        self.port = ports[0]
+        self.started = False
+        self.server_thread = None
+
+    def start(self, block=False):
+        self.started = True
+        if block:
+            self.server.serve_forever()
+        else:
+            self.server_thread = threading.Thread(target=self.server.serve_forever)
+            self.server_thread.setDaemon(True)  # don't hang on exit
+            self.server_thread.start()
+
+    def stop(self):
+        """
+        Stops the server.
+
+        If the server is not running, this method has no effect.
+        """
+        if self.started:
+            try:
+                self.server.shutdown()
+                self.server.server_close()
+                self.server_thread.join()
+                self.server_thread = None
+            except AttributeError:
+                pass
+            self.started = False
+        self.server = None
+
+
+def start_ws_server(host, port, paths, bind_hostname, external_config, ssl_config,
+                    **kwargs):
+    return WebSocketDaemon(host,
+                           str(port),
+                           repo_root,
+                           paths["ws_doc_root"],
+                           "debug",
+                           bind_hostname,
+                           ssl_config)
+
+
+def start_wss_server(host, port, path, bind_hostname, external_config, ssl_config,
+                     **kwargs):
+    return
+
+
+def get_ports(config, ssl_enabled):
+    rv = defaultdict(list)
+    for scheme, ports in config["ports"].iteritems():
+        for i, port in enumerate(ports):
+            if scheme in ["http", "https"] and not ssl_enabled:
+                port = None
+            if port == "auto":
+                port = get_port()
+            else:
+                port = port
+            rv[scheme].append(port)
+    return rv
+
+
+
+def normalise_config(config, ports):
+    host = config["external_host"] if config["external_host"] else config["host"]
+    domains = get_subdomains(host)
+    ports_ = {}
+    for scheme, ports_used in ports.iteritems():
+        ports_[scheme] = ports_used
+
+    for key, value in domains.iteritems():
+        domains[key] = ".".join(value)
+
+    domains[""] = host
+
+    ports_ = {}
+    for scheme, ports_used in ports.iteritems():
+        ports_[scheme] = ports_used
+
+    return {"host": host,
+            "domains": domains,
+            "ports": ports_}
+
+
+def get_ssl_config(config, external_domains, ssl_environment):
+    key_path, cert_path = ssl_environment.host_cert_path(external_domains)
+    return {"key_path": key_path,
+            "cert_path": cert_path,
+            "encrypt_after_connect": config["ssl"]["encrypt_after_connect"]}
+
+
+def start(config, ssl_environment, **kwargs):
+    host = config["host"]
+    domains = get_subdomains(host)
+    ports = get_ports(config, ssl_environment)
+    bind_hostname = config["bind_hostname"]
+
+    paths = {"doc_root": config["doc_root"],
+             "ws_doc_root": config["ws_doc_root"]}
+
+    external_config = normalise_config(config, ports)
+
+    ssl_config = get_ssl_config(config, external_config["domains"].values(), ssl_environment)
+
+    if config["check_subdomains"]:
+        check_subdomains(host, paths, bind_hostname, ssl_config)
+
+    servers = start_servers(host, ports, paths, bind_hostname, external_config, ssl_config,
+                            **kwargs)
+
+    return external_config, servers
+
+
+def iter_procs(servers):
+    for servers in servers.values():
+        for port, server in servers:
+            yield server.proc
+
+
+def value_set(config, key):
+    return key in config and config[key] is not None
+
+
+def set_computed_defaults(config):
+    if not value_set(config, "ws_doc_root"):
+        if value_set(config, "doc_root"):
+            root = config["doc_root"]
+        else:
+            root = repo_root
+        config["ws_doc_root"] = os.path.join(repo_root, "websockets", "handlers")
+
+    if not value_set(config, "doc_root"):
+        config["doc_root"] = repo_root
+
+
+def merge_json(base_obj, override_obj):
+    rv = {}
+    for key, value in base_obj.iteritems():
+        if key not in override_obj:
+            rv[key] = value
+        else:
+            if isinstance(value, dict):
+                rv[key] = merge_json(value, override_obj[key])
+            else:
+                rv[key] = override_obj[key]
+    return rv
+
+
+def get_ssl_environment(config):
+    implementation_type = config["ssl"]["type"]
+    cls = sslutils.environments[implementation_type]
+    try:
+        kwargs = config["ssl"][implementation_type].copy()
+    except KeyError:
+        raise ValueError("%s is not a vaid ssl type." % implementation_type)
+    return cls(logger, **kwargs)
+
+
+def load_config(default_path, override_path=None, **kwargs):
+    if os.path.exists(default_path):
+        with open(default_path) as f:
+            base_obj = json.load(f)
+    else:
+        raise ValueError("Config path %s does not exist" % default_path)
+
+    if os.path.exists(override_path):
+        with open(override_path) as f:
+            override_obj = json.load(f)
+    else:
+        override_obj = {}
+    rv = merge_json(base_obj, override_obj)
+
+    if kwargs.get("config_path"):
+        other_path = os.path.abspath(os.path.expanduser(kwargs.get("config_path")))
+        if os.path.exists(other_path):
+            base_obj = rv
+            with open(other_path) as f:
+                override_obj = json.load(f)
+            rv = merge_json(base_obj, override_obj)
+        else:
+            raise ValueError("Config path %s does not exist" % other_path)
+
+    set_computed_defaults(rv)
+    return rv
+
+
+def get_parser():
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--latency", type=int,
+                        help="Artificial latency to add before sending http responses, in ms")
+    parser.add_argument("--config", action="store", dest="config_path",
+                        help="Path to external config file")
+    return parser
+
+
+def main():
+    kwargs = vars(get_parser().parse_args())
+    config = load_config("config.default.json",
+                         "config.json",
+                         **kwargs)
+
+    setup_logger(config["log_level"])
+
+    ssl_env = get_ssl_environment(config)
+
+    with get_ssl_environment(config) as ssl_env:
+        config_, servers = start(config, ssl_env, **kwargs)
+
+        try:
+            while any(item.is_alive() for item in iter_procs(servers)):
+                for item in iter_procs(servers):
+                    item.join(1)
+        except KeyboardInterrupt:
+            logger.info("Shutting down")
+
+
+if __name__ == "__main__":
+    main()
diff --git a/LayoutTests/imported/w3c/web-platform-tests/tools/__init__.py b/LayoutTests/imported/w3c/web-platform-tests/tools/__init__.py
new file mode 100644 (file)
index 0000000..c1e4c6d
--- /dev/null
@@ -0,0 +1 @@
+# This file is required for Python to search this directory for modules.
diff --git a/LayoutTests/imported/w3c/web-platform-tests/tools/runner/css/bootstrap-theme.min.css b/LayoutTests/imported/w3c/web-platform-tests/tools/runner/css/bootstrap-theme.min.css
new file mode 100644 (file)
index 0000000..8dee072
--- /dev/null
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.1.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:active,.btn.active{background-image:none}.btn-default{background-image:-webkit-linear-gradient(top, #fff 0, #e0e0e0 100%);background-image:linear-gradient(to bottom, #fff 0, #e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#dbdbdb;text-shadow:0 1px 0 #fff;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-primary{background-image:-webkit-linear-gradient(top, #428bca 0, #2d6ca2 100%);background-image:linear-gradient(to bottom, #428bca 0, #2d6ca2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#2b669a}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-success{background-image:-webkit-linear-gradient(top, #5cb85c 0, #419641 100%);background-image:linear-gradient(to bottom, #5cb85c 0, #419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-info{background-image:-webkit-linear-gradient(top, #5bc0de 0, #2aabd2 100%);background-image:linear-gradient(to bottom, #5bc0de 0, #2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-warning{background-image:-webkit-linear-gradient(top, #f0ad4e 0, #eb9316 100%);background-image:linear-gradient(to bottom, #f0ad4e 0, #eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-danger{background-image:-webkit-linear-gradient(top, #d9534f 0, #c12e2a 100%);background-image:linear-gradient(to bottom, #d9534f 0, #c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-color:#e8e8e8}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-image:-webkit-linear-gradient(top, #428bca 0, #357ebd 100%);background-image:linear-gradient(to bottom, #428bca 0, #357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-color:#357ebd}.navbar-default{background-image:-webkit-linear-gradient(top, #fff 0, #f8f8f8 100%);background-image:linear-gradient(to bottom, #fff 0, #f8f8f8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top, #ebebeb 0, #f3f3f3 100%);background-image:linear-gradient(to bottom, #ebebeb 0, #f3f3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.075);box-shadow:inset 0 3px 9px rgba(0,0,0,0.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top, #3c3c3c 0, #222 100%);background-image:linear-gradient(to bottom, #3c3c3c 0, #222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top, #222 0, #282828 100%);background-image:linear-gradient(to bottom, #222 0, #282828 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.25);box-shadow:inset 0 3px 9px rgba(0,0,0,0.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-linear-gradient(top, #dff0d8 0, #c8e5bc 100%);background-image:linear-gradient(to bottom, #dff0d8 0, #c8e5bc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top, #d9edf7 0, #b9def0 100%);background-image:linear-gradient(to bottom, #d9edf7 0, #b9def0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #f8efc0 100%);background-image:linear-gradient(to bottom, #fcf8e3 0, #f8efc0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top, #f2dede 0, #e7c3c3 100%);background-image:linear-gradient(to bottom, #f2dede 0, #e7c3c3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top, #ebebeb 0, #f5f5f5 100%);background-image:linear-gradient(to bottom, #ebebeb 0, #f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0)}.progress-bar{background-image:-webkit-linear-gradient(top, #428bca 0, #3071a9 100%);background-image:linear-gradient(to bottom, #428bca 0, #3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0)}.progress-bar-success{background-image:-webkit-linear-gradient(top, #5cb85c 0, #449d44 100%);background-image:linear-gradient(to bottom, #5cb85c 0, #449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0)}.progress-bar-info{background-image:-webkit-linear-gradient(top, #5bc0de 0, #31b0d5 100%);background-image:linear-gradient(to bottom, #5bc0de 0, #31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0)}.progress-bar-warning{background-image:-webkit-linear-gradient(top, #f0ad4e 0, #ec971f 100%);background-image:linear-gradient(to bottom, #f0ad4e 0, #ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0)}.progress-bar-danger{background-image:-webkit-linear-gradient(top, #d9534f 0, #c9302c 100%);background-image:linear-gradient(to bottom, #d9534f 0, #c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top, #428bca 0, #3278b3 100%);background-image:linear-gradient(to bottom, #428bca 0, #3278b3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);border-color:#3278b3}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top, #428bca 0, #357ebd 100%);background-image:linear-gradient(to bottom, #428bca 0, #357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top, #dff0d8 0, #d0e9c6 100%);background-image:linear-gradient(to bottom, #dff0d8 0, #d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top, #d9edf7 0, #c4e3f3 100%);background-image:linear-gradient(to bottom, #d9edf7 0, #c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #faf2cc 100%);background-image:linear-gradient(to bottom, #fcf8e3 0, #faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top, #f2dede 0, #ebcccc 100%);background-image:linear-gradient(to bottom, #f2dede 0, #ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0)}.well{background-image:-webkit-linear-gradient(top, #e8e8e8 0, #f5f5f5 100%);background-image:linear-gradient(to bottom, #e8e8e8 0, #f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)}
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/tools/runner/css/bootstrap.min.css b/LayoutTests/imported/w3c/web-platform-tests/tools/runner/css/bootstrap.min.css
new file mode 100644 (file)
index 0000000..de697fd
--- /dev/null
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.1.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/*! normalize.css v3.0.0 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.table td,.table th{background-color:#fff !important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;white-space:nowrap;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}input[type="date"]{line-height:34px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.has-feedback .form-control-feedback{position:absolute;top:25px;right:0;display:block;width:34px;height:34px;line-height:34px;text-align:center}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:normal;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:none}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:none}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.clearfix:before,.clearfix:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.panel-body:before,.panel-body:after{content:" ";display:table}.clearfix:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.panel-body:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}@media print{.hidden-print{display:none !important}}
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/tools/runner/css/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/tools/runner/css/w3c-import.log
new file mode 100644 (file)
index 0000000..4c59771
--- /dev/null
@@ -0,0 +1,21 @@
+The tests in this directory were imported from the W3C repository.
+Do NOT modify these tests directly in Webkit.
+Instead, create a pull request on the W3C CSS or WPT github:
+       https://github.com/w3c/csswg-test
+       https://github.com/w3c/web-platform-tests
+
+Then run the Tools/Scripts/import-w3c-tests in Webkit to reimport
+
+Do NOT modify or remove this file
+
+------------------------------------------------------------------------
+Last Import: 2015-01-27 10:26
+------------------------------------------------------------------------
+Properties requiring vendor prefixes:
+None
+Property values requiring vendor prefixes:
+None
+------------------------------------------------------------------------
+List of files:
+/LayoutTests/imported/w3c/web-platform-tests/tools/runner/css/bootstrap.min.css
+/LayoutTests/imported/w3c/web-platform-tests/tools/runner/css/bootstrap-theme.min.css
diff --git a/LayoutTests/imported/w3c/web-platform-tests/tools/runner/fonts/glyphicons-halflings-regular.eot b/LayoutTests/imported/w3c/web-platform-tests/tools/runner/fonts/glyphicons-halflings-regular.eot
new file mode 100644 (file)
index 0000000..4a4ca86
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/tools/runner/fonts/glyphicons-halflings-regular.eot differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/tools/runner/fonts/glyphicons-halflings-regular.svg b/LayoutTests/imported/w3c/web-platform-tests/tools/runner/fonts/glyphicons-halflings-regular.svg
new file mode 100644 (file)
index 0000000..e3e2dc7
--- /dev/null
@@ -0,0 +1,229 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata></metadata>
+<defs>
+<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
+<font-face units-per-em="1200" ascent="960" descent="-240" />
+<missing-glyph horiz-adv-x="500" />
+<glyph />
+<glyph />
+<glyph unicode="&#xd;" />
+<glyph unicode=" " />
+<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" />
+<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" />
+<glyph unicode="&#xa0;" />
+<glyph unicode="&#x2000;" horiz-adv-x="652" />
+<glyph unicode="&#x2001;" horiz-adv-x="1304" />
+<glyph unicode="&#x2002;" horiz-adv-x="652" />
+<glyph unicode="&#x2003;" horiz-adv-x="1304" />
+<glyph unicode="&#x2004;" horiz-adv-x="434" />
+<glyph unicode="&#x2005;" horiz-adv-x="326" />
+<glyph unicode="&#x2006;" horiz-adv-x="217" />
+<glyph unicode="&#x2007;" horiz-adv-x="217" />
+<glyph unicode="&#x2008;" horiz-adv-x="163" />
+<glyph unicode="&#x2009;" horiz-adv-x="260" />
+<glyph unicode="&#x200a;" horiz-adv-x="72" />
+<glyph unicode="&#x202f;" horiz-adv-x="260" />
+<glyph unicode="&#x205f;" horiz-adv-x="326" />
+<glyph unicode="&#x20ac;" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" />
+<glyph unicode="&#x2212;" d="M200 400h900v300h-900v-300z" />
+<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#x2601;" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" />
+<glyph unicode="&#x2709;" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" />
+<glyph unicode="&#x270f;" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" />
+<glyph unicode="&#xe001;" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" />
+<glyph unicode="&#xe002;" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q18 -55 86 -75.5t147 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" />
+<glyph unicode="&#xe003;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" />
+<glyph unicode="&#xe005;" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" />
+<glyph unicode="&#xe006;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" />
+<glyph unicode="&#xe007;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" />
+<glyph unicode="&#xe008;" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" />
+<glyph unicode="&#xe009;" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" />
+<glyph unicode="&#xe010;" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe011;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe012;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe013;" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" />
+<glyph unicode="&#xe014;" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" />
+<glyph unicode="&#xe015;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" />
+<glyph unicode="&#xe016;" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" />
+<glyph unicode="&#xe017;" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" />
+<glyph unicode="&#xe018;" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" />
+<glyph unicode="&#xe019;" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" />
+<glyph unicode="&#xe020;" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" />
+<glyph unicode="&#xe021;" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" />
+<glyph unicode="&#xe022;" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" />
+<glyph unicode="&#xe023;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" />
+<glyph unicode="&#xe024;" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" />
+<glyph unicode="&#xe025;" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" />
+<glyph unicode="&#xe026;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" />
+<glyph unicode="&#xe027;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" />
+<glyph unicode="&#xe028;" d="M0 25v475l200 700h800l199 -700l1 -475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" />
+<glyph unicode="&#xe029;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" />
+<glyph unicode="&#xe030;" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" />
+<glyph unicode="&#xe031;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" />
+<glyph unicode="&#xe032;" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" />
+<glyph unicode="&#xe033;" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" />
+<glyph unicode="&#xe034;" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" />
+<glyph unicode="&#xe035;" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" />
+<glyph unicode="&#xe036;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" />
+<glyph unicode="&#xe037;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" />
+<glyph unicode="&#xe038;" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" />
+<glyph unicode="&#xe039;" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" />
+<glyph unicode="&#xe040;" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" />
+<glyph unicode="&#xe041;" d="M0 700l1 475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" />
+<glyph unicode="&#xe042;" d="M1 700l1 475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" />
+<glyph unicode="&#xe043;" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" />
+<glyph unicode="&#xe044;" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" />
+<glyph unicode="&#xe045;" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" />
+<glyph unicode="&#xe046;" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" />
+<glyph unicode="&#xe047;" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" />
+<glyph unicode="&#xe048;" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v71l471 -1q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" />
+<glyph unicode="&#xe049;" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" />
+<glyph unicode="&#xe050;" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " />
+<glyph unicode="&#xe051;" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" />
+<glyph unicode="&#xe052;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
+<glyph unicode="&#xe053;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
+<glyph unicode="&#xe054;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" />
+<glyph unicode="&#xe055;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" />
+<glyph unicode="&#xe056;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" />
+<glyph unicode="&#xe057;" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" />
+<glyph unicode="&#xe058;" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" />
+<glyph unicode="&#xe059;" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" />
+<glyph unicode="&#xe060;" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " />
+<glyph unicode="&#xe062;" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" />
+<glyph unicode="&#xe063;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" />
+<glyph unicode="&#xe064;" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 139t-64 210zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" />
+<glyph unicode="&#xe065;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" />
+<glyph unicode="&#xe066;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" />
+<glyph unicode="&#xe067;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q61 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l567 567l-137 137l-430 -431l-146 147z" />
+<glyph unicode="&#xe068;" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" />
+<glyph unicode="&#xe069;" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe070;" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe071;" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" />
+<glyph unicode="&#xe072;" d="M200 0l900 550l-900 550v-1100z" />
+<glyph unicode="&#xe073;" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
+<glyph unicode="&#xe074;" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
+<glyph unicode="&#xe075;" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" />
+<glyph unicode="&#xe076;" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" />
+<glyph unicode="&#xe077;" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" />
+<glyph unicode="&#xe078;" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" />
+<glyph unicode="&#xe079;" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" />
+<glyph unicode="&#xe080;" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" />
+<glyph unicode="&#xe081;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" />
+<glyph unicode="&#xe082;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h600v200h-600v-200z" />
+<glyph unicode="&#xe083;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141 z" />
+<glyph unicode="&#xe084;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" />
+<glyph unicode="&#xe085;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM364 700h143q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5 q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-50 0 -90.5 -12t-75 -38.5t-53.5 -74.5t-19 -114zM500 300h200v100h-200 v-100z" />
+<glyph unicode="&#xe086;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" />
+<glyph unicode="&#xe087;" d="M0 500v200h195q31 125 98.5 199.5t206.5 100.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200v-206 q149 48 201 206h-201v200h200q-25 74 -75.5 127t-124.5 77v-204h-200v203q-75 -23 -130 -77t-79 -126h209v-200h-210z" />
+<glyph unicode="&#xe088;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" />
+<glyph unicode="&#xe089;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" />
+<glyph unicode="&#xe090;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" />
+<glyph unicode="&#xe091;" d="M0 547l600 453v-300h600v-300h-600v-301z" />
+<glyph unicode="&#xe092;" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" />
+<glyph unicode="&#xe093;" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" />
+<glyph unicode="&#xe094;" d="M104 600h296v600h300v-600h298l-449 -600z" />
+<glyph unicode="&#xe095;" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" />
+<glyph unicode="&#xe096;" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" />
+<glyph unicode="&#xe097;" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" />
+<glyph unicode="&#xe101;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5h-207q-21 0 -33 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" />
+<glyph unicode="&#xe102;" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111q1 1 1 6.5t-1.5 15t-3.5 17.5l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6 h-111v-100zM100 0h400v400h-400v-400zM200 900q-3 0 14 48t36 96l18 47l213 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" />
+<glyph unicode="&#xe103;" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" />
+<glyph unicode="&#xe104;" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" />
+<glyph unicode="&#xe105;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" />
+<glyph unicode="&#xe106;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" />
+<glyph unicode="&#xe107;" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 34 -48 36.5t-48 -29.5l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" />
+<glyph unicode="&#xe108;" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -20 -13 -28.5t-32 0.5l-94 78h-222l-94 -78q-19 -9 -32 -0.5t-13 28.5 v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" />
+<glyph unicode="&#xe109;" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" />
+<glyph unicode="&#xe110;" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" />
+<glyph unicode="&#xe111;" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" />
+<glyph unicode="&#xe112;" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" />
+<glyph unicode="&#xe113;" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" />
+<glyph unicode="&#xe114;" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" />
+<glyph unicode="&#xe115;" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" />
+<glyph unicode="&#xe116;" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" />
+<glyph unicode="&#xe117;" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" />
+<glyph unicode="&#xe118;" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" />
+<glyph unicode="&#xe119;" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" />
+<glyph unicode="&#xe120;" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" />
+<glyph unicode="&#xe121;" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" />
+<glyph unicode="&#xe122;" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM100 500v250v8v8v7t0.5 7t1.5 5.5t2 5t3 4t4.5 3.5t6 1.5t7.5 0.5h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35 q-55 337 -55 351zM1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" />
+<glyph unicode="&#xe123;" d="M74 350q0 21 13.5 35.5t33.5 14.5h18l117 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5q-18 -36 -18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-8 -3 -23 -8.5 t-65 -20t-103 -25t-132.5 -19.5t-158.5 -9q-125 0 -245.5 20.5t-178.5 40.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" />
+<glyph unicode="&#xe124;" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" />
+<glyph unicode="&#xe125;" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q124 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 213l100 212h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" />
+<glyph unicode="&#xe126;" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q124 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" />
+<glyph unicode="&#xe127;" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" />
+<glyph unicode="&#xe128;" d="M-101 651q0 72 54 110t139 38l302 -1l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 17 -10.5t26.5 -26t16.5 -36.5v-526q0 -13 -86 -93.5t-94 -80.5h-341q-16 0 -29.5 20t-19.5 41l-130 339h-107q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l107 89v502l-343 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM1000 201v600h200v-600h-200z" />
+<glyph unicode="&#xe129;" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6.5v7.5v6.5v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" />
+<glyph unicode="&#xe130;" d="M2 585q-16 -31 6 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85q0 -51 -0.5 -153.5t-0.5 -148.5q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM77 565l236 339h503 l89 -100v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" />
+<glyph unicode="&#xe131;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM298 701l2 -201h300l-2 -194l402 294l-402 298v-197h-300z" />
+<glyph unicode="&#xe132;" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l402 -294l-2 194h300l2 201h-300v197z" />
+<glyph unicode="&#xe133;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" />
+<glyph unicode="&#xe134;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" />
+<glyph unicode="&#xe135;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60 q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q104 -3 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5 t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5 q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 39 2 44q31 -13 58 -14.5t39 3.5l11 4q7 36 -16.5 53.5t-64.5 28.5t-56 23q-19 -3 -37 0 q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5zM518 916q3 12 16 30t16 25q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -24 17 -66.5t17 -43.5 q-9 2 -31 5t-36 5t-32 8t-30 14zM692 1003h1h-1z" />
+<glyph unicode="&#xe136;" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" />
+<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" />
+<glyph unicode="&#xe138;" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" />
+<glyph unicode="&#xe139;" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" />
+<glyph unicode="&#xe140;" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" />
+<glyph unicode="&#xe141;" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM514 609q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" />
+<glyph unicode="&#xe142;" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -78.5 -16.5t-67.5 -51.5l-389 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23 q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60 l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" />
+<glyph unicode="&#xe143;" d="M80 784q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100q-71 70 -104.5 105.5t-77 89.5t-61 99 t-17.5 91zM250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-105 48.5q-74 0 -132 -83l-118 -171l-114 174q-51 80 -123 80q-60 0 -109.5 -49.5t-49.5 -118.5z" />
+<glyph unicode="&#xe144;" d="M57 353q0 -95 66 -159l141 -142q68 -66 159 -66q93 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-8 9 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141q7 -7 19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -17q47 -49 77 -100l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" />
+<glyph unicode="&#xe145;" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" />
+<glyph unicode="&#xe146;" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" />
+<glyph unicode="&#xe148;" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335q-6 1 -15.5 4t-11.5 3q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5 v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5 zM700 237q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" />
+<glyph unicode="&#xe149;" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -28 16.5 -69.5t28 -62.5t41.5 -72h241v-100h-197q8 -50 -2.5 -115 t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q33 1 103 -16t103 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221z" />
+<glyph unicode="&#xe150;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" />
+<glyph unicode="&#xe151;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" />
+<glyph unicode="&#xe152;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" />
+<glyph unicode="&#xe153;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" />
+<glyph unicode="&#xe154;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" />
+<glyph unicode="&#xe155;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" />
+<glyph unicode="&#xe156;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" />
+<glyph unicode="&#xe157;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" />
+<glyph unicode="&#xe158;" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" />
+<glyph unicode="&#xe159;" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" />
+<glyph unicode="&#xe160;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" />
+<glyph unicode="&#xe161;" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" />
+<glyph unicode="&#xe162;" d="M217 519q8 -19 31 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8h9q14 0 26 15q11 13 274.5 321.5t264.5 308.5q14 19 5 36q-8 17 -31 17l-301 -1q1 4 78 219.5t79 227.5q2 15 -5 27l-9 9h-9q-15 0 -25 -16q-4 -6 -98 -111.5t-228.5 -257t-209.5 -237.5q-16 -19 -6 -41 z" />
+<glyph unicode="&#xe163;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " />
+<glyph unicode="&#xe164;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" />
+<glyph unicode="&#xe165;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" />
+<glyph unicode="&#xe166;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe167;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe168;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe169;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 400l697 1l3 699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe170;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l249 -237l-1 697zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe171;" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" />
+<glyph unicode="&#xe172;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" />
+<glyph unicode="&#xe173;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" />
+<glyph unicode="&#xe174;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" />
+<glyph unicode="&#xe175;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" />
+<glyph unicode="&#xe176;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" />
+<glyph unicode="&#xe177;" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" />
+<glyph unicode="&#xe178;" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" />
+<glyph unicode="&#xe179;" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -116q-25 -17 -43.5 -51.5t-18.5 -65.5v-359z" />
+<glyph unicode="&#xe180;" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" />
+<glyph unicode="&#xe181;" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" />
+<glyph unicode="&#xe182;" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q17 18 13.5 41t-22.5 37l-192 136q-19 14 -45 12t-42 -19l-118 -118q-142 101 -268 227t-227 268l118 118q17 17 20 41.5t-11 44.5 l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" />
+<glyph unicode="&#xe183;" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-20 0 -35 14.5t-15 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" />
+<glyph unicode="&#xe184;" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" />
+<glyph unicode="&#xe185;" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" />
+<glyph unicode="&#xe186;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
+<glyph unicode="&#xe187;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
+<glyph unicode="&#xe188;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" />
+<glyph unicode="&#xe189;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" />
+<glyph unicode="&#xe190;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" />
+<glyph unicode="&#xe191;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
+<glyph unicode="&#xe192;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
+<glyph unicode="&#xe193;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" />
+<glyph unicode="&#xe194;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" />
+<glyph unicode="&#xe195;" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" />
+<glyph unicode="&#xe197;" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300h200 l-300 -300z" />
+<glyph unicode="&#xe198;" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104.5t60.5 178.5q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" />
+<glyph unicode="&#xe199;" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" />
+<glyph unicode="&#xe200;" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" />
+</font>
+</defs></svg> 
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/tools/runner/fonts/glyphicons-halflings-regular.ttf b/LayoutTests/imported/w3c/web-platform-tests/tools/runner/fonts/glyphicons-halflings-regular.ttf
new file mode 100644 (file)
index 0000000..67fa00b
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/tools/runner/fonts/glyphicons-halflings-regular.ttf differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/tools/runner/fonts/glyphicons-halflings-regular.woff b/LayoutTests/imported/w3c/web-platform-tests/tools/runner/fonts/glyphicons-halflings-regular.woff
new file mode 100644 (file)
index 0000000..8c54182
Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/tools/runner/fonts/glyphicons-halflings-regular.woff differ
diff --git a/LayoutTests/imported/w3c/web-platform-tests/tools/runner/fonts/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/tools/runner/fonts/w3c-import.log
new file mode 100644 (file)
index 0000000..f762ab1
--- /dev/null
@@ -0,0 +1,23 @@
+The tests in this directory were imported from the W3C repository.
+Do NOT modify these tests directly in Webkit.
+Instead, create a pull request on the W3C CSS or WPT github:
+       https://github.com/w3c/csswg-test
+       https://github.com/w3c/web-platform-tests
+
+Then run the Tools/Scripts/import-w3c-tests in Webkit to reimport
+
+Do NOT modify or remove this file
+
+------------------------------------------------------------------------
+Last Import: 2015-01-27 10:26
+------------------------------------------------------------------------
+Properties requiring vendor prefixes:
+None
+Property values requiring vendor prefixes:
+None
+------------------------------------------------------------------------
+List of files:
+/LayoutTests/imported/w3c/web-platform-tests/tools/runner/fonts/glyphicons-halflings-regular.svg
+/LayoutTests/imported/w3c/web-platform-tests/tools/runner/fonts/glyphicons-halflings-regular.woff
+/LayoutTests/imported/w3c/web-platform-tests/tools/runner/fonts/glyphicons-halflings-regular.ttf
+/LayoutTests/imported/w3c/web-platform-tests/tools/runner/fonts/glyphicons-halflings-regular.eot
diff --git a/LayoutTests/imported/w3c/web-platform-tests/tools/runner/logo.svg b/LayoutTests/imported/w3c/web-platform-tests/tools/runner/logo.svg
new file mode 100644 (file)
index 0000000..8a25776
--- /dev/null
@@ -0,0 +1,8 @@
+<svg width="453px" height="453px" viewBox="0 0 453 453" xmlns="http://www.w3.org/2000/svg">
+  <circle stroke="#ed5565" stroke-width="20" fill="#fff" cx="226.5" cy="226.5" r="213.5"></circle>
+  <g transform="translate(160 250)">
+    <g transform="matrix(2.25 0 0 -2.25 0 0)">
+      <path d="m0 0c0.252-0.333 0.508-0.659 0.766-0.974-1.269-3.764-2.368-7.749-3.447-11.383-0.166-0.053-0.329-0.116-0.486-0.194-8.572 8.211-2.056 11.364 3.167 12.551m59.809 45.57c2.899 20.118-10.084 38.635-29 41.362-18.915 2.726-36.601-11.371-39.5-31.489-2.418-16.774 6.212-32.427 20.112-38.75l-0.05 0.014-0.323-2.242c0.219-0.049 0.427-0.09 0.64-0.134-0.122-0.027-0.245-0.053-0.365-0.086l-0.004 0.013s-0.042-0.017-0.106-0.042c-0.465-0.137-0.915-0.319-1.349-0.544-3.502-1.424-12.285-5.095-14.287-6.867 0 0 0.927-1.665 2.254-3.704-17.335-2.421-6.522-15.63-3.176-19.26-0.015-0.296 0.004-0.592 0.039-0.888-2.562-1.677-5.772-4.195-7.772-7.29 0 0 0.552-0.182 1.458-0.536v-0.001l0.016-0.005c1.182-0.463 2.96-1.219 4.914-2.248-3.004-13.557-7.542-9.677-10.589-4.683 0.745 2.232 0.741 4.23-0.202 5.393-0.66 0.811-1.681 1.101-2.889 0.931-0.087 0.222-0.135 0.349-0.135 0.349l-0.108-0.397c-0.057-0.01-0.115-0.021-0.173-0.034 0.005 0.003 0.008 0.005 0.013 0.008 0 0-0.032-0.008-0.078-0.021-0.508-0.116-1.042-0.306-1.593-0.566-2.759-1.158-8.023-4.248-8.639-11.088-0.208-1.056-0.212-2.015 0.002-2.812 0.001-0.014 0.001-0.026 0.003-0.04 0 0 0.527-4.561 4.288-1.894l-0.002 0.003c1.861 0.536 4.034 2.003 5.989 4.226 0.664 0.755 1.256 1.545 1.768 2.343 8.537-16.768 14.974 3.409 15.81 6.23 2.309-1.538 4.528-3.425 6.019-5.64 0 0 1.182 3.458 3.942 6.312 5.984-8.956 13.374-10.465 13.374-10.465l3.802 6.152c11.328-5.569 7.382-10.385 2.713-13.253-1.757 1.198-3.428 1.485-4.537 0.55-0.775-0.653-1.166-1.807-1.2-3.246-0.199-0.069-0.312-0.106-0.312-0.106l0.316-0.185c0.001-0.069 0.002-0.139 0.004-0.21-0.002 0.006-0.004 0.012-0.006 0.019 0 0 0.003-0.044 0.007-0.112 0.024-0.604 0.104-1.247 0.239-1.92 0.564-3.395 2.378-10.019 8.013-11.741 0.851-0.396 1.652-0.542 2.349-0.407 0.012 0 0.023-0.003 0.035-0.003 0 0 3.891-0.048 2.21 4.745l-0.004-0.004c-0.176 2.258-1.086 5.015-2.659 7.628-0.535 0.888-1.109 1.695-1.701 2.413 16.374 8.095-3.15 19.567-3.156 19.57l2.062 3.336-4.584 1.028c-0.516 0.116-1.446 0.458-2.639 0.949 0.61-0.116 1.218-0.225 1.821-0.322 0.221 0.615 0.432 1.249 0.631 1.918 1.715 5.766 2.34 12.577 1.803 18.76l1.544-3.601s0.655 0.404 1.612 0.827l-0.088-0.167c3.832-26.906 14.631-10.666 17.407-5.924 1.445 0.125 2.819 1.27 3.448 3.074 0.864 2.475 0.002 5.242-1.926 6.183-1.927 0.942-4.188-0.301-5.05-2.774-0.533-1.524-0.406-3.158 0.218-4.41-6.67-13.044-10.36-1.016-11.647 4.81 0.669 0.143 1.355 0.21 1.998 0.135 0 0-4.185 11.234-11.743 15.618-0.097 0.136-0.192 0.275-0.291 0.405-0.056-0.017-0.116-0.029-0.174-0.044l0.345 2.832c0.567 0.046 0.871 0.099 0.871 0.099l0.021 0.146-0.65 0.181c18.572-2.158 35.744 11.797 38.597 31.593" fill="#ed5565"/>
+    </g>
+  </g>
+</svg>
diff --git a/LayoutTests/imported/w3c/web-platform-tests/tools/runner/report.css b/LayoutTests/imported/w3c/web-platform-tests/tools/runner/report.css
new file mode 100644 (file)
index 0000000..bc25f9e
--- /dev/null
@@ -0,0 +1,43 @@
+table {
+    border-collapse: collapse;
+}
+
+tbody {
+    border-top: thin solid;
+    border-bottom: thin solid;
+}
+
+.status {
+    font-variant:small-caps;
+    color:white;
+    text-align:center;
+    font-variant:small-caps;
+}
+
+.PASS, .OK {
+    background-color:green;
+}
+
+.FAIL {
+    background-color:red;
+}
+
+.ERROR, .NOTRUN, .NONE {
+    background-color:black;
+}
+
+.TIMEOUT {
+    background-color:blue;
+}
+
+td {
+    padding:0.25em;
+}
+
+tr.test {
+    background-color:#ddd;
+}
+
+tr.subtest {
+    background-color:#eee;
+}
diff --git a/LayoutTests/imported/w3c/web-platform-tests/tools/runner/report.py b/LayoutTests/imported/w3c/web-platform-tests/tools/runner/report.py
new file mode 100644 (file)
index 0000000..60a0cef
--- /dev/null
@@ -0,0 +1,310 @@
+import argparse
+import json
+import sys
+from cgi import escape
+from collections import defaultdict
+
+import types
+
+
+def html_escape(item, escape_quote=False):
+    if isinstance(item, types.StringTypes):
+        rv = escape(item)
+        if escape_quote:
+            rv = rv.replace('"', "&quot;")
+        return rv
+    else:
+        return item
+
+
+class Raw(object):
+    """Simple wrapper around a string to stop it being escaped by html_escape"""
+    def __init__(self, value):
+        self.value = value
+
+    def __unicode__(self):
+        return unicode(self.value)
+
+
+class Node(object):
+    """Node structure used when building HTML"""
+    def __init__(self, name, attrs, children):
+        #Need list of void elements
+        self.name = name
+        self.attrs = attrs
+        self.children = children
+
+    def __unicode__(self):
+        if self.attrs:
+            #Need to escape
+            attrs_unicode = " " + " ".join("%s=\"%s\"" % (html_escape(key),
+                                                          html_escape(value,
+                                                                      escape_quote=True))
+                                           for key, value in self.attrs.iteritems())
+        else:
+            attrs_unicode = ""
+        return "<%s%s>%s</%s>\n" % (self.name,
+                                    attrs_unicode,
+                                    "".join(unicode(html_escape(item))
+                                            for item in self.children),
+                                    self.name)
+
+    def __str__(self):
+        return unicode(self).encode("utf8")
+
+
+class RootNode(object):
+    """Special Node representing the document root"""
+    def __init__(self, *children):
+        self.children = ["<!DOCTYPE html>"] + list(children)
+
+    def __unicode__(self):
+        return "".join(unicode(item) for item in self.children)
+
+    def __str__(self):
+        return unicode(self).encode("utf8")
+
+
+def flatten(iterable):
+    """Flatten a list of lists by one level so that
+    [1,["abc"], "def",[2, [3]]]
+    becomes
+    [1, "abc", "def", 2, [3]]"""
+    rv = []
+    for item in iterable:
+        if hasattr(item, "__iter__") and not isinstance(item, types.StringTypes):
+            rv.extend(item)
+        else:
+            rv.append(item)
+    return rv
+
+
+class HTML(object):
+    """Simple HTML templating system. An instance of this class can create
+    element nodes by calling methods with the same name as the element,
+    passing in children as positional arguments or as a list, and attributes
+    as keyword arguments, with _ replacing - and trailing _ for python keywords
+
+    e.g.
+
+    h = HTML()
+    print h.html(
+        html.head(),
+        html.body([html.h1("Hello World!")], class_="body-class")
+    )
+    Would give
+    <!DOCTYPE html><html><head></head><body class="body-class"><h1>Hello World!</h1></body></html>"""
+    def __getattr__(self, name):
+        def make_html(self, *content, **attrs):
+            for attr_name in attrs.keys():
+                if "_" in attr_name:
+                    new_name = attr_name.replace("_", "-")
+                    if new_name.endswith("-"):
+                        new_name = new_name[:-1]
+                    attrs[new_name] = attrs.pop(attr_name)
+            return Node(name, attrs, flatten(content))
+
+        method = types.MethodType(make_html, self, HTML)
+        setattr(self, name, method)
+        return method
+
+    def __call__(self, *children):
+        return RootNode(*flatten(children))
+
+
+h = HTML()
+
+
+class TestResult(object):
+    """Simple holder for the results of a single test in a single UA"""
+    def __init__(self, test):
+        self.test = test
+        self.results = {}
+
+    def __cmp__(self, other):
+        return self.test == other.test
+
+    def __hash__(self):
+        return hash(self.test)
+
+
+def load_data(args):
+    """Load data treating args as a list of UA name, filename pairs"""
+    pairs = []
+    for i in xrange(0, len(args), 2):
+        pairs.append(args[i:i+2])
+
+    rv = {}
+    for UA, filename in pairs:
+        with open(filename) as f:
+            rv[UA] = json.load(f)
+
+    return rv
+
+
+def test_id(id):
+    """Convert a test id in JSON into an immutable object that
+    can be used as a dictionary key"""
+    if isinstance(id, list):
+        return tuple(id)
+    else:
+        return id
+
+
+def all_tests(data):
+    tests = defaultdict(set)
+    for UA, results in data.iteritems():
+        for result in results["results"]:
+            id = test_id(result["test"])
+            tests[id] |= set(subtest["name"] for subtest in result["subtests"])
+    return tests
+
+
+def group_results(data):
+    """Produce a list of UAs and a dictionary mapping specific tests to their
+    status in all UAs e.g.
+    ["UA1", "UA2"], {"test_id":{"harness":{"UA1": (status1, message1),
+                                           "UA2": (status2, message2)},
+                                "subtests":{"subtest1": "UA1": (status1-1, message1-1),
+                                                        "UA2": (status2-1, message2-1)}}}
+    Status and message are None if the test didn't run in a particular UA.
+    Message is None if the test didn't produce a message"""
+    tests = all_tests(data)
+
+    UAs = data.keys()
+
+    def result():
+        return {
+            "harness": dict((UA, (None, None)) for UA in UAs),
+            "subtests": None  # init this later
+        }
+
+    results_by_test = defaultdict(result)
+
+    for UA, results in data.iteritems():
+        for test_data in results["results"]:
+            id = test_id(test_data["test"])
+            result = results_by_test[id]
+
+            if result["subtests"] is None:
+                result["subtests"] = dict(
+                    (name, dict((UA, (None, None)) for UA in UAs)) for name in tests[id]
+                )
+
+            result["harness"][UA] = (test_data["status"], test_data["message"])
+            for subtest in test_data["subtests"]:
+                result["subtests"][subtest["name"]][UA] = (subtest["status"],
+                                                           subtest["message"])
+
+    return UAs, results_by_test
+
+
+def status_cell(status, message=None):
+    """Produce a table cell showing the status of a test"""
+    status = status if status is not None else "NONE"
+    kwargs = {}
+    if message:
+        kwargs["title"] = message
+    status_text = status.title()
+    return h.td(status_text, class_="status " + status,
+                **kwargs)
+
+
+def test_link(test_id, subtest=None):
+    """Produce an <a> element linking to a test"""
+    if isinstance(test_id, types.StringTypes):
+        rv = [h.a(test_id, href=test_id)]
+    else:
+        rv = [h.a(test_id[0], href=test_id[0]),
+              " %s " % test_id[1],
+              h.a(test_id[2], href=test_id[2])]
+    if subtest is not None:
+        rv.append(" [%s]" % subtest)
+    return rv
+
+
+def summary(UAs, results_by_test):
+    """Render the implementation report summary"""
+    not_passing = []
+    for test, results in results_by_test.iteritems():
+        if not any(item[0] in ("PASS", "OK") for item in results["harness"].values()):
+            not_passing.append((test, None))
+        for subtest_name, subtest_results in results["subtests"].iteritems():
+            if not any(item[0] == "PASS" for item in subtest_results.values()):
+                not_passing.append((test, subtest_name))
+    if not_passing:
+        rv = [
+            h.p("The following tests failed to pass in all UAs:"),
+            h.ul([h.li(test_link(test, subtest))
+                  for test, subtest in not_passing])
+        ]
+    else:
+        rv = "All tests passed in at least one UA"
+    return rv
+
+
+def result_rows(UAs, test, result):
+    """Render the results for each test run"""
+    yield h.tr(
+        h.td(
+            test_link(test),
+            rowspan=(1 + len(result["subtests"]))
+        ),
+        h.td(),
+        [status_cell(status, message)
+         for UA, (status, message) in sorted(result["harness"].items())],
+        class_="test"
+    )
+
+    for name, subtest_result in sorted(result["subtests"].iteritems()):
+        yield h.tr(
+            h.td(name),
+            [status_cell(status, message)
+             for UA, (status, message) in sorted(subtest_result.items())],
+            class_="subtest"
+        )
+
+
+def result_bodies(UAs, results_by_test):
+    return [h.tbody(result_rows(UAs, test, result))
+            for test, result in sorted(results_by_test.iteritems())]
+
+
+def generate_html(UAs, results_by_test):
+    """Generate all the HTML output"""
+    doc = h(h.html([
+        h.head(h.meta(charset="utf8"),
+               h.title("Implementation Report"),
+               h.link(href="report.css", rel="stylesheet")),
+        h.body(h.h1("Implementation Report"),
+               h.h2("Summary"),
+               summary(UAs, results_by_test),
+               h.h2("Full Results"),
+               h.table(
+                   h.thead(
+                       h.tr(
+                           h.th("Test"),
+                           h.th("Subtest"),
+                           [h.th(UA) for UA in sorted(UAs)]
+                       )
+                   ),
+                   result_bodies(UAs, results_by_test)
+               )
+           )
+    ]))
+
+    return doc
+
+
+def main(filenames):
+    data = load_data(filenames)
+    UAs, results_by_test = group_results(data)
+    return generate_html(UAs, results_by_test)
+
+
+if __name__ == "__main__":
+    if not sys.argv[1:]:
+        print """Please supply a list of UA name, filename pairs e.g.
+
+python report.py Firefox firefox.json Chrome chrome.json IE internet_explorer.json"""
+    print main(sys.argv[1:])
diff --git a/LayoutTests/imported/w3c/web-platform-tests/tools/runner/runner.css b/LayoutTests/imported/w3c/web-platform-tests/tools/runner/runner.css
new file mode 100644 (file)
index 0000000..b24c8bd
--- /dev/null
@@ -0,0 +1,193 @@
+
+html {
+    margin: 0 8px;
+}
+
+body {
+    margin: 0;
+}
+
+html.done {
+    border: 2px solid #32cd32;
+    margin: 3px;
+    padding: 3px;
+}
+
+html:not(.done) {
+    height: 100%;
+}
+
+html:not(.done) body {
+    height: 100%;
+}
+
+html:not(.done) #wrapper {
+    height: 100%;
+    margin-top: -1.5em;
+    padding-top: 1.5em;
+    -moz-box-sizing: border-box;
+    -webkit-box-sizing: border-box;
+    box-sizing: border-box;
+}
+
+section {
+    display: block;
+    border: thin solid black;
+    padding: 0.5em 0;
+}
+
+section h1 {
+    margin: 0;
+    font-size: 1em;
+}
+
+html.done section h1 {
+    text-align: center;
+}
+
+section ol {
+    padding: 0;
+    margin: 0;
+    list-style-position: inside;
+}
+
+html.done section ol {
+    -moz-column-count: 3;
+    -webkit-column-count: 3;
+    column-count: 3;
+}
+
+section li {
+    padding: 0.1em 0.5em;
+}
+
+section li.pass:nth-child(odd)  {
+    background: #e5ffe5;
+}
+section li.pass:nth-child(even) {
+    background: #def8de;
+}
+
+section li.fail:nth-child(odd)  {
+    background: #ffe5e5;
+}
+
+section li.fail:nth-child(even) {
+    background: #f8dede;
+}
+
+section p {
+    margin: 0;
+}
+
+html:not(.done) section {
+    border-top: none;
+}
+
+html.done section + section {
+    border-top: none;
+}
+
+#manualUI {
+    position: fixed;
+    top: 100px;
+    left: 0;
+    right: 0;
+    display: block;
+    padding: 40px;
+    background: rgba(255, 200, 0, 0.5);
+}
+
+#manualUI .panel {
+    max-width: 800px;
+    margin: auto;
+    box-shadow: 2px 2px 10px #666;
+}
+
+body > p {
+    text-align: center;
+}
+
+body > p > textarea {
+    width: 90%;
+    height: 20em;
+}
+
+body {
+    padding-top: 70px;
+}
+
+.container {
+    max-width: 800px;
+}
+
+.navbar-inverse .navbar-brand {
+    color: #fff;
+}
+
+.form-group {
+    clear:both;
+}
+
+.horizontal-form .form-group {
+    padding: 6px;
+}
+
+header.navbar-inverse {
+    background: linear-gradient(to bottom, rgb(7, 62, 128) 0px, rgb(0, 45, 80) 100%);
+}
+
+ul.error, ul.warning {
+    padding:    0;
+}
+
+td.PASS {
+    color:  #48cfad;
+}
+
+td.FAIL {
+    color:  #ed5565;
+}
+
+td.TIMEOUT {
+    color:  #f6bb42;
+}
+
+td.ERROR {
+    color: #da4453;
+    font-weight: bold;
+}
+.stopped {
+    background-image: linear-gradient(to bottom, #fc0000 0, #770000 100%);
+}
+
+.col-sm-9 label {
+    margin-right: 20px;
+}
+
+.instructions {
+  padding-left: 8px;
+  padding-right: 8px;
+}
+
+@keyframes alert_updating {
+  from {
+    background-color: inherit;
+  }
+  to {
+    background-color: #ffc;
+  }
+}
+
+#manifest {
+  padding-left: 6px;
+  padding-right: 6px;
+  font-size: 80%;
+  font-weight: normal;
+  font-style: italic;
+  color: #999;
+  animation-duration: 1.5s;
+  animation-name: alert_updating;
+  animation-iteration-count: infinite;
+  animation-direction: alternate;
+}
diff --git a/LayoutTests/imported/w3c/web-platform-tests/tools/runner/runner.js b/LayoutTests/imported/w3c/web-platform-tests/tools/runner/runner.js
new file mode 100644 (file)
index 0000000..80dc5d5
--- /dev/null
@@ -0,0 +1,729 @@
+/*jshint nonew: false */
+(function() {
+"use strict";
+var runner;
+var testharness_properties = {output:false,
+                              timeout_multiplier:1};
+
+function Manifest(path) {
+    this.data = null;
+    this.path = path;
+    this.num_tests = null;
+}
+
+Manifest.prototype = {
+    load: function(loaded_callback) {
+        this.generate(loaded_callback);
+    },
+
+    do_load: function(loaded_callback) {
+        var xhr = new XMLHttpRequest();
+        xhr.onreadystatechange = function() {
+            if (xhr.readyState !== 4) {
+                return;
+            }
+            if (!(xhr.status === 200 || xhr.status === 0)) {
+                throw new Error("Manifest " + this.path + " failed to load");
+            }
+            this.data = JSON.parse(xhr.responseText);
+            loaded_callback();
+        }.bind(this);
+        xhr.open("GET", this.path);
+        xhr.send(null);
+    },
+
+    generate: function(loaded_callback) {
+        var xhr = new XMLHttpRequest();
+        xhr.onreadystatechange = function() {
+            if (xhr.readyState !== 4) {
+                return;
+            }
+            if (!(xhr.status === 200 || xhr.status === 0)) {
+                throw new Error("Manifest generation failed");
+            }
+            this.do_load(loaded_callback);
+        }.bind(this);
+        xhr.open("POST", "update_manifest.py");
+        xhr.send(null);
+    },
+
+    by_type:function(type) {
+        if (this.data.items.hasOwnProperty(type)) {
+            return this.data.items[type];
+        } else {
+            return [];
+        }
+    }
+};
+
+function ManifestIterator(manifest, path, test_types) {
+    this.manifest = manifest;
+    this.path = path;
+    this.test_types = test_types;
+    this.test_types_index = -1;
+    this.test_list = null;
+    this.test_index = null;
+}
+
+ManifestIterator.prototype = {
+    next: function() {
+        var manifest_item = null;
+
+        if (this.test_types.length === 0) {
+            return null;
+        }
+
+        while (!manifest_item) {
+            while (this.test_list === null || this.test_index >= this.test_list.length) {
+                this.test_types_index++;
+                if (this.test_types_index >= this.test_types.length) {
+                    return null;
+                }
+                this.test_index = 0;
+                this.test_list = this.manifest.by_type(this.test_types[this.test_types_index]);
+            }
+
+            manifest_item = this.test_list[this.test_index++];
+            while (manifest_item && !this.matches(manifest_item)) {
+                manifest_item = this.test_list[this.test_index++];
+            }
+            if (manifest_item) {
+                return this.to_test(manifest_item);
+            }
+        }
+    },
+
+    matches: function(manifest_item) {
+        return manifest_item.url.indexOf(this.path) === 0;
+    },
+
+    to_test: function(manifest_item) {
+        var test = {
+            type: this.test_types[this.test_types_index],
+            url: manifest_item.url
+        };
+        if (manifest_item.hasOwnProperty("ref_url")) {
+            test.ref_type = manifest_item.ref_type;
+            test.ref_url = manifest_item.ref_url;
+        }
+        return test;
+    },
+
+    count: function() {
+        return this.test_types.reduce(function(prev, current) {
+            var matches = this.manifest.by_type(current).filter(function(x) {
+                return this.matches(x);
+            }.bind(this));
+            return prev + matches.length;
+        }.bind(this), 0);
+    }
+};
+
+function VisualOutput(elem, runner) {
+    this.elem = elem;
+    this.runner = runner;
+    this.results_table = null;
+    this.section_wrapper = null;
+    this.results_table = this.elem.querySelector(".results > table");
+    this.section = null;
+    this.manifest_status = this.elem.querySelector("#manifest");
+    this.progress = this.elem.querySelector(".summary .progress");
+    this.meter = this.progress.querySelector(".progress-bar");
+    this.result_count = null;
+    this.json_results_area = this.elem.querySelector("textarea");
+    this.instructions = document.querySelector(".instructions");
+
+    this.elem.style.display = "none";
+    this.runner.manifest_wait_callbacks.push(this.on_manifest_wait.bind(this));
+    this.runner.start_callbacks.push(this.on_start.bind(this));
+    this.runner.result_callbacks.push(this.on_result.bind(this));
+    this.runner.done_callbacks.push(this.on_done.bind(this));
+}
+
+VisualOutput.prototype = {
+    clear: function() {
+        this.result_count = {"PASS":0,
+                             "FAIL":0,
+                             "ERROR":0,
+                             "TIMEOUT":0};
+        for (var p in this.result_count) {
+            if (this.result_count.hasOwnProperty(p)) {
+                this.elem.querySelector("td." + p).textContent = 0;
+            }
+        }
+        if (this.json_results_area) {
+            this.json_results_area.parentNode.removeChild(this.json_results_area);
+        }
+        this.meter.style.width = '0px';
+        this.meter.textContent = '0%';
+        this.manifest_status.style.display = "none";
+        this.elem.querySelector(".jsonResults").style.display = "none";
+        this.results_table.removeChild(this.results_table.tBodies[0]);
+        this.results_table.appendChild(document.createElement("tbody"));
+    },
+
+    on_manifest_wait: function() {
+        this.clear();
+        this.instructions.style.display = "none";
+        this.elem.style.display = "block";
+        this.manifest_status.style.display = "inline";
+    },
+
+    on_start: function() {
+        this.clear();
+        this.instructions.style.display = "none";
+        this.elem.style.display = "block";
+        this.meter.classList.remove("stopped");
+        this.meter.classList.add("progress-striped", "active");
+    },
+
+    on_result: function(test, status, message, subtests) {
+        var row = document.createElement("tr");
+
+        var subtest_pass_count = subtests.reduce(function(prev, current) {
+            return (current.status === "PASS") ? prev + 1 : prev;
+        }, 0);
+        var subtests_count = subtests.length;
+
+        var test_status;
+        if (subtest_pass_count === subtests_count &&
+            (status == "OK" || status == "PASS")) {
+            test_status = "PASS";
+        } else if (subtests_count > 0 && status === "OK") {
+            test_status = "FAIL";
+        } else {
+            test_status = status;
+        }
+
+        subtests.forEach(function(subtest) {
+            if (this.result_count.hasOwnProperty(subtest.status)) {
+                this.result_count[subtest.status] += 1;
+            }
+        }.bind(this));
+        if (this.result_count.hasOwnProperty(status)) {
+            this.result_count[status] += 1;
+        }
+
+        var name_node = row.appendChild(document.createElement("td"));
+        name_node.appendChild(this.test_name_node(test));
+
+        var status_node = row.appendChild(document.createElement("td"));
+        status_node.textContent = test_status;
+        status_node.className = test_status;
+
+        var message_node = row.appendChild(document.createElement("td"));
+        message_node.textContent = message || "";
+
+        var subtests_node = row.appendChild(document.createElement("td"));
+        if (subtests_count) {
+            subtests_node.textContent = subtest_pass_count + "/" + subtests_count;
+        } else {
+            if (status == "PASS") {
+                subtests_node.textContent = "1/1";
+            } else {
+                subtests_node.textContent = "0/1";
+            }
+        }
+
+        var status_arr = ["PASS", "FAIL", "ERROR", "TIMEOUT"];
+        for (var i = 0; i < status_arr.length; i++) {
+            this.elem.querySelector("td." + status_arr[i]).textContent = this.result_count[status_arr[i]];
+        }
+
+        this.results_table.tBodies[0].appendChild(row);
+        this.update_meter(this.runner.progress(), this.runner.results.count(), this.runner.test_count());
+    },
+
+    on_done: function() {
+        this.meter.setAttribute("aria-valuenow", this.meter.getAttribute("aria-valuemax"));
+        this.meter.style.width = "100%";
+        if (this.runner.stop_flag) {
+            this.meter.textContent = "Stopped";
+            this.meter.classList.add("stopped");
+        } else {
+            this.meter.textContent = "Done!";
+        }
+        this.meter.classList.remove("progress-striped", "active");
+        this.runner.test_div.textContent = "";
+        //add the json serialization of the results
+        var a = this.elem.querySelector(".jsonResults");
+        var json = this.runner.results.to_json();
+
+        if (document.getElementById("dumpit").checked) {
+            this.json_results_area = document.createElement("textarea");
+            this.json_results_area.style.width = "100%";
+            this.json_results_area.setAttribute("rows", "50");
+            this.elem.appendChild(this.json_results_area);
+            this.json_results_area.textContent = json;
+        }
+        var blob = new Blob([json], { type: "application/json" });
+        a.href = window.URL.createObjectURL(blob);
+        a.download = "runner-results.json";
+        a.textContent = "Download JSON results";
+        if (!a.getAttribute("download")) a.textContent += " (right-click and save as to download)";
+        a.style.display = "inline";
+    },
+
+    test_name_node: function(test) {
+        if (!test.hasOwnProperty("ref_url")) {
+            return this.link(test.url);
+        } else {
+            var wrapper = document.createElement("span");
+            wrapper.appendChild(this.link(test.url));
+            wrapper.appendChild(document.createTextNode(" " + test.ref_type + " "));
+            wrapper.appendChild(this.link(test.ref_url));
+            return wrapper;
+        }
+    },
+
+    link: function(href) {
+        var link = document.createElement("a");
+        link.href = this.runner.server + href;
+        link.textContent = href;
+        return link;
+    },
+
+    update_meter: function(progress, count, total) {
+        this.meter.setAttribute("aria-valuenow", count);
+        this.meter.setAttribute("aria-valuemax", total);
+        this.meter.textContent = this.meter.style.width = (progress * 100).toFixed(1) + "%";
+    }
+
+};
+
+function ManualUI(elem, runner) {
+    this.elem = elem;
+    this.runner = runner;
+    this.pass_button = this.elem.querySelector("button.pass");
+    this.fail_button = this.elem.querySelector("button.fail");
+    this.ref_buttons = this.elem.querySelector(".reftestUI");
+    this.ref_type = this.ref_buttons.querySelector(".refType");
+    this.test_button = this.ref_buttons.querySelector("button.test");
+    this.ref_button = this.ref_buttons.querySelector("button.ref");
+
+    this.hide();
+
+    this.runner.test_start_callbacks.push(this.on_test_start.bind(this));
+    this.runner.test_pause_callbacks.push(this.hide.bind(this));
+    this.runner.done_callbacks.push(this.on_done.bind(this));
+
+    this.pass_button.onclick = function() {
+        this.disable_buttons();
+        this.runner.on_result("PASS", "", []);
+    }.bind(this);
+
+    this.fail_button.onclick = function() {
+        this.disable_buttons();
+        this.runner.on_result("FAIL", "", []);
+    }.bind(this);
+}
+
+ManualUI.prototype = {
+    show: function() {
+        this.elem.style.display = "block";
+        setTimeout(this.enable_buttons.bind(this), 200);
+    },
+
+    hide: function() {
+        this.elem.style.display = "none";
+    },
+
+    show_ref: function() {
+        this.ref_buttons.style.display = "block";
+        this.test_button.onclick = function() {
+            this.runner.load(this.runner.current_test.url);
+        }.bind(this);
+        this.ref_button.onclick = function() {
+            this.runner.load(this.runner.current_test.ref_url);
+        }.bind(this);
+    },
+
+    hide_ref: function() {
+        this.ref_buttons.style.display = "none";
+    },
+
+    disable_buttons: function() {
+        this.pass_button.disabled = true;
+        this.fail_button.disabled = true;
+    },
+
+    enable_buttons: function() {
+        this.pass_button.disabled = false;
+        this.fail_button.disabled = false;
+    },
+
+    on_test_start: function(test) {
+        if (test.type == "manual" || test.type == "reftest") {
+            this.show();
+        } else {
+            this.hide();
+        }
+        if (test.type == "reftest") {
+            this.show_ref();
+            this.ref_type.textContent = test.ref_type === "==" ? "equal" : "unequal";
+        } else {
+            this.hide_ref();
+        }
+    },
+
+    on_done: function() {
+        this.hide();
+    }
+};
+
+function TestControl(elem, runner) {
+    this.elem = elem;
+    this.path_input = this.elem.querySelector(".path");
+    this.pause_button = this.elem.querySelector("button.togglePause");
+    this.start_button = this.elem.querySelector("button.toggleStart");
+    this.type_checkboxes = Array.prototype.slice.call(
+        this.elem.querySelectorAll("input[type=checkbox].test-type"));
+    this.type_checkboxes.forEach(function(elem) {
+        elem.addEventListener("click", function() {
+            this.start_button.disabled = this.get_test_types().length < 1;
+        }.bind(this),
+        false);
+    }.bind(this));
+    this.timeout_input = this.elem.querySelector(".timeout_multiplier");
+    this.render_checkbox = this.elem.querySelector(".render");
+    this.runner = runner;
+    this.runner.done_callbacks.push(this.on_done.bind(this));
+    this.set_start();
+}
+
+TestControl.prototype = {
+    set_start: function() {
+        this.start_button.disabled = this.get_test_types().length < 1;
+        this.pause_button.disabled = true;
+        this.start_button.textContent = "Start";
+        this.path_input.disabled = false;
+        this.type_checkboxes.forEach(function(elem) {
+            elem.disabled = false;
+        });
+        this.start_button.onclick = function() {
+            var path = this.get_path();
+            var test_types = this.get_test_types();
+            var settings = this.get_testharness_settings();
+            this.runner.start(path, test_types, settings);
+            this.set_stop();
+            this.set_pause();
+        }.bind(this);
+    },
+
+    set_stop: function() {
+        clearTimeout(this.runner.timeout);
+        this.pause_button.disabled = false;
+        this.start_button.textContent = "Stop";
+        this.path_input.disabled = true;
+        this.type_checkboxes.forEach(function(elem) {
+            elem.disabled = true;
+        });
+        this.start_button.onclick = function() {
+            this.runner.stop_flag = true;
+            this.runner.done();
+        }.bind(this);
+    },
+
+    set_pause: function() {
+        this.pause_button.textContent = "Pause";
+        this.pause_button.onclick = function() {
+            this.runner.pause();
+            this.set_resume();
+        }.bind(this);
+    },
+
+    set_resume: function() {
+        this.pause_button.textContent = "Resume";
+        this.pause_button.onclick = function() {
+            this.runner.unpause();
+            this.set_pause();
+        }.bind(this);
+
+    },
+
+    get_path: function() {
+        return this.path_input.value;
+    },
+
+    get_test_types: function() {
+        return this.type_checkboxes.filter(function(elem) {
+            return elem.checked;
+        }).map(function(elem) {
+            return elem.value;
+        });
+    },
+
+    get_testharness_settings: function() {
+        return {timeout_multiplier: parseFloat(this.timeout_input.value),
+                output: this.render_checkbox.checked};
+    },
+
+    on_done: function() {
+        this.set_pause();
+        this.set_start();
+    }
+};
+
+function Results(runner) {
+    this.test_results = null;
+    this.runner = runner;
+
+    this.runner.start_callbacks.push(this.on_start.bind(this));
+}
+
+Results.prototype = {
+    on_start: function() {
+        this.test_results = [];
+    },
+
+    set: function(test, status, message, subtests) {
+        this.test_results.push({"test":test,
+                                "subtests":subtests,
+                                "status":status,
+                                "message":message});
+    },
+
+    count: function() {
+        return this.test_results.length;
+    },
+
+    to_json: function() {
+        var data = {
+            "results": this.test_results.map(function(result) {
+                var rv = {"test":(result.test.hasOwnProperty("ref_url") ?
+                                  [result.test.url, result.test.ref_type, result.test.ref_url] :
+                                  result.test.url),
+                          "subtests":result.subtests,
+                          "status":result.status,
+                          "message":result.message};
+                return rv;
+            })
+        };
+        return JSON.stringify(data, null, 2);
+    }
+};
+
+function Runner(manifest_path) {
+    this.server = location.protocol + "//" + location.host;
+    this.manifest = new Manifest(manifest_path);
+    this.path = null;
+    this.test_types = null;
+    this.manifest_iterator = null;
+
+    this.test_window = null;
+    this.test_div = document.getElementById('test_url');
+    this.current_test = null;
+    this.timeout = null;
+    this.num_tests = null;
+    this.pause_flag = false;
+    this.stop_flag = false;
+    this.done_flag = false;
+
+    this.manifest_wait_callbacks = [];
+    this.start_callbacks = [];
+    this.test_start_callbacks = [];
+    this.test_pause_callbacks = [];
+    this.result_callbacks = [];
+    this.done_callbacks = [];
+
+    this.results = new Results(this);
+
+    this.start_after_manifest_load = false;
+    this.manifest.load(this.manifest_loaded.bind(this));
+}
+
+Runner.prototype = {
+    test_timeout: 20000, //ms
+
+    currentTest: function() {
+        return this.manifest[this.mTestCount];
+    },
+
+    open_test_window: function() {
+        this.test_window = window.open("about:blank", 800, 600);
+    },
+
+    manifest_loaded: function() {
+        if (this.start_after_manifest_load) {
+            this.do_start();
+        }
+    },
+
+    start: function(path, test_types, testharness_settings) {
+        this.pause_flag = false;
+        this.stop_flag = false;
+        this.done_flag = false;
+        this.path = path;
+        this.test_types = test_types;
+        window.testharness_properties = testharness_settings;
+        this.manifest_iterator = new ManifestIterator(this.manifest, this.path, this.test_types);
+        this.num_tests = null;
+
+        if (this.manifest.data === null) {
+            this.wait_for_manifest();
+        } else {
+            this.do_start();
+        }
+    },
+
+    wait_for_manifest: function() {
+        this.start_after_manifest_load = true;
+        this.manifest_wait_callbacks.forEach(function(callback) {
+            callback();
+        });
+    },
+
+    do_start: function() {
+        if (this.manifest_iterator.count() > 0) {
+            this.open_test_window();
+            this.start_callbacks.forEach(function(callback) {
+                callback();
+            });
+            this.run_next_test();
+        } else {
+            var tests = "tests";
+            if (this.test_types.length < 3) {
+                tests = this.test_types.join(" tests or ") + " tests";
+            }
+            var message = "No " + tests + " found in this path."
+            document.querySelector(".path").setCustomValidity(message);
+            this.done();
+        }
+    },
+
+    pause: function() {
+        this.pause_flag = true;
+        this.test_pause_callbacks.forEach(function(callback) {
+            callback(this.current_test);
+        }.bind(this));
+    },
+
+    unpause: function() {
+        this.pause_flag = false;
+        this.run_next_test();
+    },
+
+    on_result: function(status, message, subtests) {
+        clearTimeout(this.timeout);
+        this.results.set(this.current_test, status, message, subtests);
+        this.result_callbacks.forEach(function(callback) {
+            callback(this.current_test, status, message, subtests);
+        }.bind(this));
+        this.run_next_test();
+    },
+
+    on_timeout: function() {
+        this.on_result("TIMEOUT", "", []);
+    },
+
+    done: function() {
+        this.done_flag = true;
+        if (this.test_window) {
+            this.test_window.close();
+        }
+        this.done_callbacks.forEach(function(callback) {
+            callback();
+        });
+    },
+
+    run_next_test: function() {
+        if (this.pause_flag) {
+            return;
+        }
+        var next_test = this.manifest_iterator.next();
+        if (next_test === null||this.done_flag) {
+            this.done();
+            return;
+        }
+
+        this.current_test = next_test;
+
+        if (next_test.type === "testharness") {
+            this.timeout = setTimeout(this.on_timeout.bind(this),
+                                      this.test_timeout * window.testharness_properties.timeout_multiplier);
+        }
+        this.test_div.textContent = this.current_test.url;
+        this.load(this.current_test.url);
+
+        this.test_start_callbacks.forEach(function(callback) {
+            callback(this.current_test);
+        }.bind(this));
+    },
+
+    load: function(path) {
+        if (this.test_window.location === null) {
+            this.open_test_window();
+        }
+        this.test_window.location.href = this.server + path;
+    },
+
+    progress: function() {
+        return this.results.count() / this.test_count();
+    },
+
+    test_count: function() {
+        if (this.num_tests === null) {
+            this.num_tests = this.manifest_iterator.count();
+        }
+        return this.num_tests;
+    }
+
+};
+
+
+function parseOptions() {
+    var options = {
+        test_types: ["testharness", "reftest", "manual"]
+    };
+
+    var optionstrings = location.search.substring(1).split("&");
+    for (var i = 0, il = optionstrings.length; i < il; ++i) {
+        var opt = optionstrings[i];
+        //TODO: fix this for complex-valued options
+        options[opt.substring(0, opt.indexOf("="))] =
+            opt.substring(opt.indexOf("=") + 1);
+    }
+    return options;
+}
+
+function setup() {
+    var options = parseOptions();
+
+    if (options.path) {
+        document.getElementById('path').value = options.path;
+    }
+
+    runner = new Runner("/MANIFEST.json", options);
+    var test_control = new TestControl(document.getElementById("testControl"), runner);
+    new ManualUI(document.getElementById("manualUI"), runner);
+    new VisualOutput(document.getElementById("output"), runner);
+
+    if (options.autorun === "1") {
+        runner.start(test_control.get_path(),
+                     test_control.get_test_types(),
+                     test_control.get_testharness_settings());
+        return;
+    }
+}
+
+window.completion_callback = function(tests, status) {
+    var harness_status_map = {0:"OK", 1:"ERROR", 2:"TIMEOUT"};
+    var subtest_status_map = {0:"PASS", 1:"FAIL", 2:"TIMEOUT", 3:"NOTRUN"};
+
+    // this ugly hack is because IE really insists on holding on to the objects it creates in
+    // other windows, and on losing track of them when the window gets closed
+    var subtest_results = JSON.parse(JSON.stringify(
+        tests.map(function (test) {
+            return {name: test.name,
+                    status: subtest_status_map[test.status],
+                    message: test.message};
+        })
+    ));
+
+    runner.on_result(harness_status_map[status.status],
+                     status.message,
+                     subtest_results);
+};
+
+window.addEventListener("DOMContentLoaded", setup, false);
+})();
diff --git a/LayoutTests/imported/w3c/web-platform-tests/tools/runner/update_manifest.py b/LayoutTests/imported/w3c/web-platform-tests/tools/runner/update_manifest.py
new file mode 100644 (file)
index 0000000..45d9b06
--- /dev/null
@@ -0,0 +1,18 @@
+import json
+import os
+import sys
+
+here = os.path.split(__file__)[0]
+sys.path.insert(0, os.path.join(here, os.pardir, "scripts"))
+import _env
+root = _env.repo_root
+
+import manifest
+
+def main(request, response):
+    path = os.path.join(root, "MANIFEST.json")
+    manifest_file = manifest.load(path)
+    manifest.update(root, "/", manifest_file)
+    manifest.write(manifest_file, path)
+
+    return [("Content-Type", "application/json")], json.dumps({"url": "/MANIFEST.json"})
diff --git a/LayoutTests/imported/w3c/web-platform-tests/tools/runner/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/tools/runner/w3c-import.log
new file mode 100644 (file)
index 0000000..0fd90c8
--- /dev/null
@@ -0,0 +1,25 @@
+The tests in this directory were imported from the W3C repository.
+Do NOT modify these tests directly in Webkit.
+Instead, create a pull request on the W3C CSS or WPT github:
+       https://github.com/w3c/csswg-test
+       https://github.com/w3c/web-platform-tests
+
+Then run the Tools/Scripts/import-w3c-tests in Webkit to reimport
+
+Do NOT modify or remove this file
+
+------------------------------------------------------------------------
+Last Import: 2015-01-27 10:26
+------------------------------------------------------------------------
+Properties requiring vendor prefixes:
+None
+Property values requiring vendor prefixes:
+None
+------------------------------------------------------------------------
+List of files:
+/LayoutTests/imported/w3c/web-platform-tests/tools/runner/report.py
+/LayoutTests/imported/w3c/web-platform-tests/tools/runner/runner.css
+/LayoutTests/imported/w3c/web-platform-tests/tools/runner/runner.js
+/LayoutTests/imported/w3c/web-platform-tests/tools/runner/logo.svg
+/LayoutTests/imported/w3c/web-platform-tests/tools/runner/update_manifest.py
+/LayoutTests/imported/w3c/web-platform-tests/tools/runner/report.css
diff --git a/LayoutTests/imported/w3c/web-platform-tests/tools/scripts/_env.py b/LayoutTests/imported/w3c/web-platform-tests/tools/scripts/_env.py
new file mode 100644 (file)
index 0000000..74bd490
--- /dev/null
@@ -0,0 +1,10 @@
+import os
+import sys
+
+here = os.path.abspath(os.path.split(__file__)[0])
+repo_root = os.path.abspath(os.path.join(here, os.pardir, os.pardir))
+
+sys.path.insert(0, os.path.join(repo_root, "tools", "six"))
+sys.path.insert(0, os.path.join(repo_root, "tools", "html5lib"))
+sys.path.insert(0, os.path.join(repo_root, "tools", "wptserve"))
+sys.path.insert(0, os.path.join(repo_root, "tools", "pywebsocket", "src"))
diff --git a/LayoutTests/imported/w3c/web-platform-tests/tools/scripts/html5lib_test.xml b/LayoutTests/imported/w3c/web-platform-tests/tools/scripts/html5lib_test.xml
new file mode 100644 (file)
index 0000000..6924992
--- /dev/null
@@ -0,0 +1,26 @@
+<html xmlns:py="http://genshi.edgewall.org/">
+  <head>
+    <meta charset="utf8"/>
+    <title>HTML 5 Parser tests ${file_name}</title>
+    <meta name="timeout" content="long"/>
+  </head>
+  <body>
+    <h1>html5lib Parser Test</h1>
+    <div id="log"></div>
+    <script src="common.js"></script>
+    <script src="test.js"></script>
+    <script src="template.js"></script>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script>
+      var num_iframes = 8;
+
+      var order = [<py:for each="test in tests">'${test.id}',</py:for>];
+      var tests = {
+          <py:for each="test in tests">"${test.id}":[async_test('${file_name} ${test.id}'), ${test.string_uri_encoded_input}, ${test.string_escaped_expected}],</py:for>
+      }
+      init_tests(get_type());
+    </script>
+
+  </body>
+</html>
diff --git a/LayoutTests/imported/w3c/web-platform-tests/tools/scripts/html5lib_test_fragment.xml b/LayoutTests/imported/w3c/web-platform-tests/tools/scripts/html5lib_test_fragment.xml
new file mode 100644 (file)
index 0000000..5be259b
--- /dev/null
@@ -0,0 +1,27 @@
+<html xmlns:py="http://genshi.edgewall.org/">
+  <head>
+    <meta charset="utf8"/>
+    <title>HTML 5 Parser tests ${file_name}</title>
+    <meta name="timeout" content="long"/>
+  </head>
+  <body>
+    <h1>html5lib Parser Test</h1>
+    <div id="log"></div>
+    <script src="common.js"></script>
+    <script src="test.js"></script>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script>
+
+      var num_iframes = 8;
+
+      var order = [<py:for each="test in tests">'${test.id}',</py:for>];
+      var tests = {
+          <py:for each="test in tests">"${test.id}":[async_test('${file_name} ${test.id}'), ${test.string_uri_encoded_input}, ${test.string_escaped_expected}, '${test.container}'],</py:for>
+      }
+
+      init_tests("innerHTML");
+
+    </script>
+  </body>
+</html>
diff --git a/LayoutTests/imported/w3c/web-platform-tests/tools/scripts/id2path.js b/LayoutTests/imported/w3c/web-platform-tests/tools/scripts/id2path.js
new file mode 100644 (file)
index 0000000..39b8d64
--- /dev/null
@@ -0,0 +1,12 @@
+
+var fs = require("fs")
+,   pth = require("path")
+,   id = process.argv[2]
+;
+
+if (!id) {
+    console.log("Missing ID");
+    process.exit(1);
+}
+
+console.log(JSON.parse(fs.readFileSync(pth.join(__dirname, "id2path.json"), "utf8"))[id]);
diff --git a/LayoutTests/imported/w3c/web-platform-tests/tools/scripts/id2path.json b/LayoutTests/imported/w3c/web-platform-tests/tools/scripts/id2path.json
new file mode 100644 (file)
index 0000000..491bd86
--- /dev/null
@@ -0,0 +1,822 @@
+{
+    "introduction": "microdata/introduction",
+    "background": "html/introduction/background",
+    "audience": "html/introduction/audience",
+    "scope": "html/introduction/scope",
+    "history-0": "html/introduction/history-0",
+    "design-notes": "html/introduction/design-notes",
+    "serializability-of-script-execution": "html/introduction/design-notes/serializability-of-script-execution",
+    "compliance-with-other-specifications": "html/introduction/design-notes/compliance-with-other-specifications",
+    "html-vs-xhtml": "html/introduction/html-vs-xhtml",
+    "structure-of-this-specification": "html/introduction/structure-of-this-specification",
+    "how-to-read-this-specification": "html/introduction/structure-of-this-specification/how-to-read-this-specification",
+    "typographic-conventions": "html/introduction/structure-of-this-specification/typographic-conventions",
+    "fingerprint": "html/introduction/fingerprint",
+    "a-quick-introduction-to-html": "html/introduction/a-quick-introduction-to-html",
+    "writing-secure-applications-with-html": "html/introduction/a-quick-introduction-to-html/writing-secure-applications-with-html",
+    "common-pitfalls-to-avoid-when-using-the-scripting-apis": "html/introduction/a-quick-introduction-to-html/common-pitfalls-to-avoid-when-using-the-scripting-apis",
+    "conformance-requirements-for-authors": "html/introduction/conformance-requirements-for-authors",
+    "presentational-markup": "html/introduction/conformance-requirements-for-authors/presentational-markup",
+    "syntax-errors": "html/introduction/conformance-requirements-for-authors/syntax-errors",
+    "restrictions-on-content-models-and-on-attribute-values": "html/introduction/conformance-requirements-for-authors/restrictions-on-content-models-and-on-attribute-values",
+    "suggested-reading": "html/introduction/suggested-reading",
+    "infrastructure": "html/infrastructure",
+    "terminology": "microdata/terminology",
+    "resources": "html/infrastructure/terminology/resources",
+    "xml": "html/infrastructure/terminology/xml",
+    "dom-trees": "html/infrastructure/terminology/dom-trees",
+    "scripting-0": "html/infrastructure/terminology/scripting-0",
+    "plugins": "html/infrastructure/terminology/plugins",
+    "character-encodings": "html/infrastructure/terminology/character-encodings",
+    "conformance-requirements": "microdata/conformance-requirements",
+    "conformance-classes": "html/infrastructure/conformance-requirements/conformance-classes",
+    "dependencies": "microdata/dependencies",
+    "extensibility": "html/infrastructure/conformance-requirements/extensibility",
+    "case-sensitivity-and-string-comparison": "html/infrastructure/case-sensitivity-and-string-comparison",
+    "utf-8": "html/infrastructure/utf-8",
+    "common-microsyntaxes": "html/infrastructure/common-microsyntaxes",
+    "common-parser-idioms": "html/infrastructure/common-microsyntaxes/common-parser-idioms",
+    "boolean-attributes": "html/infrastructure/common-microsyntaxes/boolean-attributes",
+    "keywords-and-enumerated-attributes": "html/infrastructure/common-microsyntaxes/keywords-and-enumerated-attributes",
+    "numbers": "html/infrastructure/common-microsyntaxes/numbers",
+    "signed-integers": "html/infrastructure/common-microsyntaxes/numbers",
+    "non-negative-integers": "html/infrastructure/common-microsyntaxes/numbers",
+    "floating-point-numbers": "html/infrastructure/common-microsyntaxes/numbers",
+    "percentages-and-dimensions": "html/infrastructure/common-microsyntaxes/numbers",
+    "lists-of-integers": "html/infrastructure/common-microsyntaxes/numbers",
+    "lists-of-dimensions": "html/infrastructure/common-microsyntaxes/numbers",
+    "dates-and-times": "html/infrastructure/common-microsyntaxes/dates-and-times",
+    "months": "html/infrastructure/common-microsyntaxes/dates-and-times",
+    "dates": "html/infrastructure/common-microsyntaxes/dates-and-times",
+    "yearless-dates": "html/infrastructure/common-microsyntaxes/dates-and-times",
+    "times": "html/infrastructure/common-microsyntaxes/dates-and-times",
+    "local-dates-and-times": "html/infrastructure/common-microsyntaxes/dates-and-times",
+    "time-zones": "html/infrastructure/common-microsyntaxes/dates-and-times",
+    "global-dates-and-times": "html/infrastructure/common-microsyntaxes/dates-and-times",
+    "weeks": "html/infrastructure/common-microsyntaxes/dates-and-times",
+    "durations": "html/infrastructure/common-microsyntaxes/dates-and-times",
+    "vaguer-moments-in-time": "html/infrastructure/common-microsyntaxes/dates-and-times",
+    "colors": "html/infrastructure/common-microsyntaxes/colors",
+    "space-separated-tokens": "html/infrastructure/common-microsyntaxes/space-separated-tokens",
+    "comma-separated-tokens": "html/infrastructure/common-microsyntaxes/comma-separated-tokens",
+    "syntax-references": "html/infrastructure/common-microsyntaxes/syntax-references",
+    "mq": "html/infrastructure/common-microsyntaxes/mq",
+    "urls": "html/infrastructure/urls",
+    "terminology-0": "html/infrastructure/urls/terminology-0",
+    "parsing-urls": "html/infrastructure/urls/parsing-urls",
+    "base-urls": "html/infrastructure/urls/base-urls",
+    "resolving-urls": "html/infrastructure/urls/resolving-urls",
+    "url-manipulation-and-creation": "html/infrastructure/urls/url-manipulation-and-creation",
+    "dynamic-changes-to-base-urls": "html/infrastructure/urls/dynamic-changes-to-base-urls",
+    "interfaces-for-url-manipulation": "html/infrastructure/urls/interfaces-for-url-manipulation",
+    "fetching-resources": "html/infrastructure/fetching-resources",
+    "terminology-1": "html/infrastructure/fetching-resources/terminology-1",
+    "processing-model": "html/infrastructure/fetching-resources/processing-model",
+    "encrypted-http-and-related-security-concerns": "html/infrastructure/fetching-resources/encrypted-http-and-related-security-concerns",
+    "content-type-sniffing": "html/infrastructure/fetching-resources/content-type-sniffing",
+    "extracting-character-encodings-from-meta-elements": "html/infrastructure/fetching-resources/extracting-character-encodings-from-meta-elements",
+    "cors-settings-attributes": "html/infrastructure/fetching-resources/cors-settings-attributes",
+    "cors-enabled-fetch": "html/infrastructure/fetching-resources/cors-enabled-fetch",
+    "common-dom-interfaces": "html/infrastructure/common-dom-interfaces",
+    "reflecting-content-attributes-in-idl-attributes": "html/infrastructure/common-dom-interfaces/reflecting-content-attributes-in-idl-attributes",
+    "collections": "html/infrastructure/common-dom-interfaces/collections",
+    "htmlallcollection": "html/infrastructure/common-dom-interfaces/collections",
+    "htmlformcontrolscollection": "html/infrastructure/common-dom-interfaces/collections",
+    "htmloptionscollection": "html/infrastructure/common-dom-interfaces/collections",
+    "domstringmap": "html/infrastructure/common-dom-interfaces/domstringmap",
+    "transferable-objects": "html/infrastructure/common-dom-interfaces/transferable-objects",
+    "safe-passing-of-structured-data": "html/infrastructure/common-dom-interfaces/safe-passing-of-structured-data",
+    "garbage-collection": "html/infrastructure/common-dom-interfaces/garbage-collection",
+    "namespaces": "html/infrastructure/namespaces",
+    "dom": "html/dom",
+    "documents": "html/dom/documents",
+    "the-document-object": "html/dom/documents/the-document-object",
+    "security-document": "html/dom/documents/security-document",
+    "resource-metadata-management": "html/dom/documents/resource-metadata-management",
+    "dom-tree-accessors": "html/dom/documents/dom-tree-accessors",
+    "loading-xml-documents": "html/dom/documents/loading-xml-documents",
+    "elements": "html/dom/elements",
+    "semantics-0": "html/dom/elements/semantics-0",
+    "elements-in-the-dom": "html/dom/elements/elements-in-the-dom",
+    "global-attributes": "html/dom/elements/global-attributes",
+    "the-id-attribute": "html/dom/elements/global-attributes",
+    "the-title-attribute": "html/dom/elements/global-attributes",
+    "the-lang-and-xml:lang-attributes": "html/dom/elements/global-attributes",
+    "the-translate-attribute": "html/dom/elements/global-attributes",
+    "the-xml:base-attribute-(xml-only)": "html/dom/elements/global-attributes",
+    "the-dir-attribute": "html/dom/elements/global-attributes",
+    "classes": "html/dom/elements/global-attributes",
+    "the-style-attribute": "html/dom/elements/global-attributes",
+    "embedding-custom-non-visible-data-with-the-data-*-attributes": "html/dom/elements/global-attributes",
+    "element-definitions": "html/dom/elements/element-definitions",
+    "attributes": "html/dom/elements/element-definitions",
+    "content-models": "html/dom/elements/content-models",
+    "kinds-of-content": "html/dom/elements/content-models",
+    "metadata-content": "html/dom/elements/content-models",
+    "flow-content": "html/dom/elements/content-models",
+    "sectioning-content": "html/dom/elements/content-models",
+    "heading-content": "html/dom/elements/content-models",
+    "phrasing-content": "html/dom/elements/content-models",
+    "embedded-content": "html/dom/elements/content-models",
+    "interactive-content": "html/dom/elements/content-models",
+    "palpable-content": "html/dom/elements/content-models",
+    "transparent-content-models": "html/dom/elements/content-models",
+    "paragraphs": "html/dom/elements/content-models",
+    "requirements-relating-to-bidirectional-algorithm-formatting-characters": "html/dom/elements/requirements-relating-to-bidirectional-algorithm-formatting-characters",
+    "wai-aria": "html/dom/elements/wai-aria",
+    "aria-role-attribute": "html/dom/elements/wai-aria",
+    "state-and-property-attributes": "html/dom/elements/wai-aria",
+    "sec-strong-native-semantics": "html/dom/elements/wai-aria",
+    "sec-implicit-aria-semantics": "html/dom/elements/wai-aria",
+    "interactions-with-xpath-and-xslt": "html/dom/interactions-with-xpath-and-xslt",
+    "dynamic-markup-insertion": "html/dom/dynamic-markup-insertion",
+    "opening-the-input-stream": "html/dom/dynamic-markup-insertion/opening-the-input-stream",
+    "closing-the-input-stream": "html/dom/dynamic-markup-insertion/closing-the-input-stream",
+    "document.write()": "html/dom/dynamic-markup-insertion/document-write",
+    "document.writeln()": "html/dom/dynamic-markup-insertion/document-writeln",
+    "semantics": "html/semantics",
+    "the-root-element": "html/semantics/the-root-element",
+    "the-html-element": "html/semantics/the-root-element/the-html-element",
+    "document-metadata": "html/semantics/document-metadata",
+    "the-head-element": "html/semantics/document-metadata/the-head-element",
+    "the-title-element": "html/semantics/document-metadata/the-title-element",
+    "the-base-element": "html/semantics/document-metadata/the-base-element",
+    "the-link-element": "html/semantics/document-metadata/the-link-element",
+    "the-meta-element": "html/semantics/document-metadata/the-meta-element",
+    "standard-metadata-names": "html/semantics/document-metadata/the-meta-element",
+    "other-metadata-names": "html/semantics/document-metadata/the-meta-element",
+    "pragma-directives": "html/semantics/document-metadata/the-meta-element",
+    "other-pragma-directives": "html/semantics/document-metadata/the-meta-element",
+    "charset": "html/semantics/document-metadata/the-meta-element",
+    "the-style-element": "html/semantics/document-metadata/the-style-element",
+    "styling": "html/semantics/document-metadata/styling",
+    "scripting-1": "html/semantics/scripting-1",
+    "the-script-element": "html/semantics/scripting-1/the-script-element",
+    "scriptingLanguages": "html/semantics/scripting-1/the-script-element",
+    "restrictions-for-contents-of-script-elements": "html/semantics/scripting-1/the-script-element",
+    "inline-documentation-for-external-scripts": "html/semantics/scripting-1/the-script-element",
+    "scriptTagXSLT": "html/semantics/scripting-1/the-script-element",
+    "the-noscript-element": "html/semantics/scripting-1/the-noscript-element",
+    "sections": "html/semantics/sections",
+    "the-body-element": "html/semantics/sections/the-body-element",
+    "the-article-element": "html/semantics/sections/the-article-element",
+    "the-section-element": "html/semantics/sections/the-section-element",
+    "the-nav-element": "html/semantics/sections/the-nav-element",
+    "the-aside-element": "html/semantics/sections/the-aside-element",
+    "the-h1,-h2,-h3,-h4,-h5,-and-h6-elements": "html/semantics/sections/the-h1-h2-h3-h4-h5-and-h6-elements",
+    "the-hgroup-element": "html/semantics/sections/the-hgroup-element",
+    "the-header-element": "html/semantics/sections/the-header-element",
+    "the-footer-element": "html/semantics/sections/the-footer-element",
+    "the-address-element": "html/semantics/sections/the-address-element",
+    "headings-and-sections": "html/semantics/sections/headings-and-sections",
+    "outlines": "html/semantics/sections/headings-and-sections",
+    "usage-summary-0": "html/semantics/sections/usage-summary-0",
+    "grouping-content": "html/semantics/grouping-content",
+    "the-p-element": "html/semantics/grouping-content/the-p-element",
+    "the-hr-element": "html/semantics/grouping-content/the-hr-element",
+    "the-pre-element": "html/semantics/grouping-content/the-pre-element",
+    "the-blockquote-element": "html/semantics/grouping-content/the-blockquote-element",
+    "the-ol-element": "html/semantics/grouping-content/the-ol-element",
+    "the-ul-element": "html/semantics/grouping-content/the-ul-element",
+    "the-li-element": "html/semantics/grouping-content/the-li-element",
+    "the-dl-element": "html/semantics/grouping-content/the-dl-element",
+    "the-dt-element": "html/semantics/grouping-content/the-dt-element",
+    "the-dd-element": "html/semantics/grouping-content/the-dd-element",
+    "the-figure-element": "html/semantics/grouping-content/the-figure-element",
+    "the-figcaption-element": "html/semantics/grouping-content/the-figcaption-element",
+    "the-div-element": "html/semantics/grouping-content/the-div-element",
+    "text-level-semantics": "html/semantics/text-level-semantics",
+    "the-a-element": "html/semantics/text-level-semantics/the-a-element",
+    "the-em-element": "html/semantics/text-level-semantics/the-em-element",
+    "the-strong-element": "html/semantics/text-level-semantics/the-strong-element",
+    "the-small-element": "html/semantics/text-level-semantics/the-small-element",
+    "the-s-element": "html/semantics/text-level-semantics/the-s-element",
+    "the-cite-element": "html/semantics/text-level-semantics/the-cite-element",
+    "the-q-element": "html/semantics/text-level-semantics/the-q-element",
+    "the-dfn-element": "html/semantics/text-level-semantics/the-dfn-element",
+    "the-abbr-element": "html/semantics/text-level-semantics/the-abbr-element",
+    "the-time-element": "html/semantics/text-level-semantics/the-time-element",
+    "the-code-element": "html/semantics/text-level-semantics/the-code-element",
+    "the-var-element": "html/semantics/text-level-semantics/the-var-element",
+    "the-samp-element": "html/semantics/text-level-semantics/the-samp-element",
+    "the-kbd-element": "html/semantics/text-level-semantics/the-kbd-element",
+    "the-sub-and-sup-elements": "html/semantics/text-level-semantics/the-sub-and-sup-elements",
+    "the-i-element": "html/semantics/text-level-semantics/the-i-element",
+    "the-b-element": "html/semantics/text-level-semantics/the-b-element",
+    "the-u-element": "html/semantics/text-level-semantics/the-u-element",
+    "the-mark-element": "html/semantics/text-level-semantics/the-mark-element",
+    "the-ruby-element": "html/semantics/text-level-semantics/the-ruby-element",
+    "the-rt-element": "html/semantics/text-level-semantics/the-rt-element",
+    "the-rp-element": "html/semantics/text-level-semantics/the-rp-element",
+    "the-bdi-element": "html/semantics/text-level-semantics/the-bdi-element",
+    "the-bdo-element": "html/semantics/text-level-semantics/the-bdo-element",
+    "the-span-element": "html/semantics/text-level-semantics/the-span-element",
+    "the-br-element": "html/semantics/text-level-semantics/the-br-element",
+    "the-wbr-element": "html/semantics/text-level-semantics/the-wbr-element",
+    "usage-summary": "html/semantics/text-level-semantics/usage-summary",
+    "edits": "html/semantics/edits",
+    "the-ins-element": "html/semantics/edits/the-ins-element",
+    "the-del-element": "html/semantics/edits/the-del-element",
+    "attributes-common-to-ins-and-del-elements": "html/semantics/edits/attributes-common-to-ins-and-del-elements",
+    "edits-and-paragraphs": "html/semantics/edits/edits-and-paragraphs",
+    "edits-and-lists": "html/semantics/edits/edits-and-lists",
+    "edits-and-tables": "html/semantics/edits/edits-and-tables",
+    "embedded-content-0": "html/semantics/embedded-content-0",
+    "the-img-element": "html/semantics/embedded-content-0/the-img-element",
+    "alt": "html/semantics/embedded-content-0/the-img-element",
+    "general-guidelines": "html/semantics/embedded-content-0/the-img-element",
+    "a-link-or-button-containing-nothing-but-the-image": "html/semantics/embedded-content-0/the-img-element",
+    "a-phrase-or-paragraph-with-an-alternative-graphical-representation:-charts,-diagrams,-graphs,-maps,-illustrations": "html/semantics/embedded-content-0/the-img-element",
+    "a-short-phrase-or-label-with-an-alternative-graphical-representation:-icons,-logos": "html/semantics/embedded-content-0/the-img-element",
+    "text-that-has-been-rendered-to-a-graphic-for-typographical-effect": "html/semantics/embedded-content-0/the-img-element",
+    "a-graphical-representation-of-some-of-the-surrounding-text": "html/semantics/embedded-content-0/the-img-element",
+    "a-purely-decorative-image-that-doesn't-add-any-information": "html/semantics/embedded-content-0/the-img-element",
+    "a-group-of-images-that-form-a-single-larger-picture-with-no-links": "html/semantics/embedded-content-0/the-img-element",
+    "a-group-of-images-that-form-a-single-larger-picture-with-links": "html/semantics/embedded-content-0/the-img-element",
+    "a-key-part-of-the-content": "html/semantics/embedded-content-0/the-img-element",
+    "an-image-not-intended-for-the-user": "html/semantics/embedded-content-0/the-img-element",
+    "guidance-for-markup-generators": "html/semantics/embedded-content-0/the-img-element",
+    "guidance-for-conformance-checkers": "html/semantics/embedded-content-0/the-img-element",
+    "the-iframe-element": "html/semantics/embedded-content-0/the-iframe-element",
+    "the-embed-element": "html/semantics/embedded-content-0/the-embed-element",
+    "the-object-element": "html/semantics/embedded-content-0/the-object-element",
+    "the-param-element": "html/semantics/embedded-content-0/the-param-element",
+    "the-video-element": "html/semantics/embedded-content-0/the-video-element",
+    "the-audio-element": "html/semantics/embedded-content-0/the-audio-element",
+    "the-source-element": "html/semantics/embedded-content-0/the-source-element",
+    "the-track-element": "html/semantics/embedded-content-0/the-track-element",
+    "media-elements": "html/semantics/embedded-content-0/media-elements",
+    "error-codes": "html/semantics/embedded-content-0/media-elements",
+    "location-of-the-media-resource": "html/semantics/embedded-content-0/media-elements",
+    "mime-types": "html/semantics/embedded-content-0/media-elements",
+    "network-states": "html/semantics/embedded-content-0/media-elements",
+    "loading-the-media-resource": "html/semantics/embedded-content-0/media-elements",
+    "offsets-into-the-media-resource": "html/semantics/embedded-content-0/media-elements",
+    "ready-states": "html/semantics/embedded-content-0/media-elements",
+    "playing-the-media-resource": "html/semantics/embedded-content-0/media-elements",
+    "seeking": "html/semantics/embedded-content-0/media-elements",
+    "media-resources-with-multiple-media-tracks": "html/semantics/embedded-content-0/media-elements",
+    "audiotracklist-and-videotracklist-objects": "html/semantics/embedded-content-0/media-elements",
+    "selecting-specific-audio-and-video-tracks-declaratively": "html/semantics/embedded-content-0/media-elements",
+    "synchronising-multiple-media-elements": "html/semantics/embedded-content-0/media-elements",
+    "introduction-0": "html/semantics/embedded-content-0/media-elements",
+    "media-controllers": "html/semantics/embedded-content-0/media-elements",
+    "assigning-a-media-controller-declaratively": "html/semantics/embedded-content-0/media-elements",
+    "timed-text-tracks": "html/semantics/embedded-content-0/media-elements",
+    "text-track-model": "html/semantics/embedded-content-0/media-elements",
+    "sourcing-in-band-text-tracks": "html/semantics/embedded-content-0/media-elements",
+    "sourcing-out-of-band-text-tracks": "html/semantics/embedded-content-0/media-elements",
+    "guidelines-for-exposing-cues-in-various-formats-as-text-track-cues": "html/semantics/embedded-content-0/media-elements",
+    "text-track-api": "html/semantics/embedded-content-0/media-elements",
+    "text-tracks-describing-chapters": "html/semantics/embedded-content-0/media-elements",
+    "cue-events": "html/semantics/embedded-content-0/media-elements",
+    "user-interface": "html/semantics/embedded-content-0/media-elements",
+    "time-ranges": "html/semantics/embedded-content-0/media-elements",
+    "event-definitions": "html/semantics/embedded-content-0/media-elements",
+    "mediaevents": "html/semantics/embedded-content-0/media-elements",
+    "security-and-privacy-considerations": "html/semantics/embedded-content-0/media-elements",
+    "best-practices-for-authors-using-media-elements": "html/semantics/embedded-content-0/media-elements",
+    "best-practices-for-implementors-of-media-elements": "html/semantics/embedded-content-0/media-elements",
+    "the-canvas-element": "html/semantics/embedded-content-0/the-canvas-element",
+    "color-spaces-and-color-correction": "html/semantics/embedded-content-0/the-canvas-element",
+    "security-with-canvas-elements": "html/semantics/embedded-content-0/the-canvas-element",
+    "the-map-element": "html/semantics/embedded-content-0/the-map-element",
+    "the-area-element": "html/semantics/embedded-content-0/the-area-element",
+    "image-maps": "html/semantics/embedded-content-0/image-maps",
+    "authoring": "html/semantics/embedded-content-0/image-maps",
+    "processing-model-0": "html/semantics/embedded-content-0/image-maps",
+    "mathml": "html/semantics/embedded-content-0/mathml",
+    "svg": "html/semantics/embedded-content-0/svg",
+    "dimension-attributes": "html/semantics/embedded-content-0/dimension-attributes",
+    "tabular-data": "html/semantics/tabular-data",
+    "the-table-element": "html/semantics/tabular-data/the-table-element",
+    "table-descriptions-techniques": "html/semantics/tabular-data/the-table-element",
+    "table-layout-techniques": "html/semantics/tabular-data/the-table-element",
+    "the-caption-element": "html/semantics/tabular-data/the-caption-element",
+    "the-colgroup-element": "html/semantics/tabular-data/the-colgroup-element",
+    "the-col-element": "html/semantics/tabular-data/the-col-element",
+    "the-tbody-element": "html/semantics/tabular-data/the-tbody-element",
+    "the-thead-element": "html/semantics/tabular-data/the-thead-element",
+    "the-tfoot-element": "html/semantics/tabular-data/the-tfoot-element",
+    "the-tr-element": "html/semantics/tabular-data/the-tr-element",
+    "the-td-element": "html/semantics/tabular-data/the-td-element",
+    "the-th-element": "html/semantics/tabular-data/the-th-element",
+    "attributes-common-to-td-and-th-elements": "html/semantics/tabular-data/attributes-common-to-td-and-th-elements",
+    "processing-model-1": "html/semantics/tabular-data/processing-model-1",
+    "forming-a-table": "html/semantics/tabular-data/processing-model-1",
+    "header-and-data-cell-semantics": "html/semantics/tabular-data/processing-model-1",
+    "examples": "canvas2d/examples",
+    "forms": "html/semantics/forms",
+    "introduction-1": "html/semantics/forms/introduction-1",
+    "writing-a-form's-user-interface": "html/semantics/forms/introduction-1",
+    "implementing-the-server-side-processing-for-a-form": "html/semantics/forms/introduction-1",
+    "configuring-a-form-to-communicate-with-a-server": "html/semantics/forms/introduction-1",
+    "client-side-form-validation": "html/semantics/forms/introduction-1",
+    "enabling-client-side-automatic-filling-of-form-controls": "html/semantics/forms/introduction-1",
+    "improving-the-user-experience-on-mobile-devices": "html/semantics/forms/introduction-1",
+    "the-difference-between-the-field-type,-the-autofill-field-name,-and-the-input-modality": "html/semantics/forms/introduction-1",
+    "input-author-notes": "html/semantics/forms/introduction-1",
+    "categories": "html/semantics/forms/categories",
+    "the-form-element": "html/semantics/forms/the-form-element",
+    "the-fieldset-element": "html/semantics/forms/the-fieldset-element",
+    "the-legend-element": "html/semantics/forms/the-legend-element",
+    "the-label-element": "html/semantics/forms/the-label-element",
+    "the-input-element": "html/semantics/forms/the-input-element",
+    "states-of-the-type-attribute": "html/semantics/forms/the-input-element",
+    "hidden-state-(type=hidden)": "html/semantics/forms/the-input-element",
+    "text-(type=text)-state-and-search-state-(type=search)": "html/semantics/forms/the-input-element",
+    "telephone-state-(type=tel)": "html/semantics/forms/the-input-element",
+    "url-state-(type=url)": "html/semantics/forms/the-input-element",
+    "e-mail-state-(type=email)": "html/semantics/forms/the-input-element",
+    "password-state-(type=password)": "html/semantics/forms/the-input-element",
+    "date-and-time-state-(type=datetime)": "html/semantics/forms/the-input-element",
+    "date-state-(type=date)": "html/semantics/forms/the-input-element",
+    "month-state-(type=month)": "html/semantics/forms/the-input-element",
+    "week-state-(type=week)": "html/semantics/forms/the-input-element",
+    "time-state-(type=time)": "html/semantics/forms/the-input-element",
+    "local-date-and-time-state-(type=datetime-local)": "html/semantics/forms/the-input-element",
+    "number-state-(type=number)": "html/semantics/forms/the-input-element",
+    "range-state-(type=range)": "html/semantics/forms/the-input-element",
+    "color-state-(type=color)": "html/semantics/forms/the-input-element",
+    "checkbox-state-(type=checkbox)": "html/semantics/forms/the-input-element",
+    "radio-button-state-(type=radio)": "html/semantics/forms/the-input-element",
+    "file-upload-state-(type=file)": "html/semantics/forms/the-input-element",
+    "submit-button-state-(type=submit)": "html/semantics/forms/the-input-element",
+    "image-button-state-(type=image)": "html/semantics/forms/the-input-element",
+    "reset-button-state-(type=reset)": "html/semantics/forms/the-input-element",
+    "button-state-(type=button)": "html/semantics/forms/the-input-element",
+    "input-impl-notes": "html/semantics/forms/the-input-element",
+    "common-input-element-attributes": "html/semantics/forms/the-input-element",
+    "the-maxlength-attribute": "html/semantics/forms/the-input-element",
+    "the-size-attribute": "html/semantics/forms/the-input-element",
+    "the-readonly-attribute": "html/semantics/forms/the-input-element",
+    "the-required-attribute": "html/semantics/forms/the-input-element",
+    "the-multiple-attribute": "html/semantics/forms/the-input-element",
+    "the-pattern-attribute": "html/semantics/forms/the-input-element",
+    "the-min-and-max-attributes": "html/semantics/forms/the-input-element",
+    "the-step-attribute": "html/semantics/forms/the-input-element",
+    "the-list-attribute": "html/semantics/forms/the-input-element",
+    "the-placeholder-attribute": "html/semantics/forms/the-input-element",
+    "common-input-element-apis": "html/semantics/forms/the-input-element",
+    "common-event-behaviors": "html/semantics/forms/the-input-element",
+    "the-button-element": "html/semantics/forms/the-button-element",
+    "the-select-element": "html/semantics/forms/the-select-element",
+    "the-datalist-element": "html/semantics/forms/the-datalist-element",
+    "the-optgroup-element": "html/semantics/forms/the-optgroup-element",
+    "the-option-element": "html/semantics/forms/the-option-element",
+    "the-textarea-element": "html/semantics/forms/the-textarea-element",
+    "the-keygen-element": "html/semantics/forms/the-keygen-element",
+    "the-output-element": "html/semantics/forms/the-output-element",
+    "the-progress-element": "html/semantics/forms/the-progress-element",
+    "the-meter-element": "html/semantics/forms/the-meter-element",
+    "form-control-infrastructure": "html/semantics/forms/form-control-infrastructure",
+    "a-form-control's-value": "html/semantics/forms/form-control-infrastructure",
+    "mutability": "html/semantics/forms/form-control-infrastructure",
+    "association-of-controls-and-forms": "html/semantics/forms/form-control-infrastructure",
+    "attributes-common-to-form-controls": "html/semantics/forms/attributes-common-to-form-controls",
+    "naming-form-controls:-the-name-attribute": "html/semantics/forms/attributes-common-to-form-controls",
+    "submitting-element-directionality:-the-dirname-attribute": "html/semantics/forms/attributes-common-to-form-controls",
+    "limiting-user-input-length:-the-maxlength-attribute": "html/semantics/forms/attributes-common-to-form-controls",
+    "enabling-and-disabling-form-controls:-the-disabled-attribute": "html/semantics/forms/attributes-common-to-form-controls",
+    "form-submission": "html/semantics/forms/attributes-common-to-form-controls",
+    "autofocusing-a-form-control:-the-autofocus-attribute": "html/semantics/forms/attributes-common-to-form-controls",
+    "input-modalities:-the-inputmode-attribute": "html/semantics/forms/attributes-common-to-form-controls",
+    "autofilling-form-controls:-the-autocomplete-attribute": "html/semantics/forms/attributes-common-to-form-controls",
+    "textFieldSelection": "html/semantics/forms/textfieldselection",
+    "constraints": "html/semantics/forms/constraints",
+    "definitions": "html/semantics/forms/constraints",
+    "constraint-validation": "html/semantics/forms/constraints",
+    "the-constraint-validation-api": "html/semantics/forms/constraints",
+    "security-forms": "html/semantics/forms/constraints",
+    "form-submission-0": "html/semantics/forms/form-submission-0",
+    "introduction-2": "html/semantics/forms/form-submission-0",
+    "implicit-submission": "html/semantics/forms/form-submission-0",
+    "form-submission-algorithm": "html/semantics/forms/form-submission-0",
+    "constructing-form-data-set": "html/semantics/forms/form-submission-0",
+    "url-encoded-form-data": "html/semantics/forms/form-submission-0",
+    "multipart-form-data": "html/semantics/forms/form-submission-0",
+    "plain-text-form-data": "html/semantics/forms/form-submission-0",
+    "resetting-a-form": "html/semantics/forms/resetting-a-form",
+    "interactive-elements": "html/semantics/interactive-elements",
+    "the-details-element": "html/semantics/interactive-elements/the-details-element",
+    "the-summary-element": "html/semantics/interactive-elements/the-summary-element",
+    "the-command-element": "html/semantics/interactive-elements/the-command-element",
+    "the-menu-element": "html/semantics/interactive-elements/the-menu-element",
+    "menus-intro": "html/semantics/interactive-elements/the-menu-element",
+    "building-menus-and-toolbars": "html/semantics/interactive-elements/the-menu-element",
+    "context-menus": "html/semantics/interactive-elements/the-menu-element",
+    "toolbars": "html/semantics/interactive-elements/the-menu-element",
+    "commands": "html/semantics/interactive-elements/commands",
+    "using-the-a-element-to-define-a-command": "html/semantics/interactive-elements/commands",
+    "using-the-button-element-to-define-a-command": "html/semantics/interactive-elements/commands",
+    "using-the-input-element-to-define-a-command": "html/semantics/interactive-elements/commands",
+    "using-the-option-element-to-define-a-command": "html/semantics/interactive-elements/commands",
+    "using-the-command-element-to-define-a-command": "html/semantics/interactive-elements/commands",
+    "using-the-command-attribute-on-command-elements-to-define-a-command-indirectly": "html/semantics/interactive-elements/commands",
+    "using-the-accesskey-attribute-on-a-label-element-to-define-a-command": "html/semantics/interactive-elements/commands",
+    "using-the-accesskey-attribute-on-a-legend-element-to-define-a-command": "html/semantics/interactive-elements/commands",
+    "using-the-accesskey-attribute-to-define-a-command-on-other-elements": "html/semantics/interactive-elements/commands",
+    "the-dialog-element": "html/semantics/interactive-elements/the-dialog-element",
+    "anchor-points": "html/semantics/interactive-elements/the-dialog-element",
+    "links": "html/semantics/links",
+    "introduction-3": "html/semantics/links/introduction-3",
+    "links-created-by-a-and-area-elements": "html/semantics/links/links-created-by-a-and-area-elements",
+    "following-hyperlinks": "html/semantics/links/following-hyperlinks",
+    "downloading-resources": "html/semantics/links/downloading-resources",
+    "hyperlink-auditing": "html/semantics/links/downloading-resources",
+    "linkTypes": "html/semantics/links/linktypes",
+    "rel-alternate": "html/semantics/links/linktypes",
+    "link-type-author": "html/semantics/links/linktypes",
+    "link-type-bookmark": "html/semantics/links/linktypes",
+    "link-type-help": "html/semantics/links/linktypes",
+    "rel-icon": "html/semantics/links/linktypes",
+    "link-type-license": "html/semantics/links/linktypes",
+    "link-type-nofollow": "html/semantics/links/linktypes",
+    "link-type-noreferrer": "html/semantics/links/linktypes",
+    "link-type-prefetch": "html/semantics/links/linktypes",
+    "link-type-search": "html/semantics/links/linktypes",
+    "link-type-stylesheet": "html/semantics/links/linktypes",
+    "link-type-tag": "html/semantics/links/linktypes",
+    "sequential-link-types": "html/semantics/links/linktypes",
+    "link-type-next": "html/semantics/links/linktypes",
+    "link-type-prev": "html/semantics/links/linktypes",
+    "other-link-types": "html/semantics/links/linktypes",
+    "common-idioms": "html/semantics/common-idioms",
+    "the-main-part-of-the-content": "html/semantics/common-idioms/the-main-part-of-the-content",
+    "rel-up": "html/semantics/common-idioms/rel-up",
+    "tag-clouds": "html/semantics/common-idioms/tag-clouds",
+    "conversations": "html/semantics/common-idioms/conversations",
+    "footnotes": "html/semantics/common-idioms/footnotes",
+    "disabled-elements": "html/semantics/disabled-elements",
+    "selectors": "html/semantics/selectors",
+    "case-sensitivity": "html/semantics/selectors/case-sensitivity",
+    "pseudo-classes": "html/semantics/selectors/pseudo-classes",
+    "browsers": "html/browsers",
+    "windows": "html/browsers/windows",
+    "nested-browsing-contexts": "html/browsers/windows/nested-browsing-contexts",
+    "navigating-nested-browsing-contexts-in-the-dom": "html/browsers/windows/nested-browsing-contexts",
+    "auxiliary-browsing-contexts": "html/browsers/windows/auxiliary-browsing-contexts",
+    "navigating-auxiliary-browsing-contexts-in-the-dom": "html/browsers/windows/auxiliary-browsing-contexts",
+    "secondary-browsing-contexts": "html/browsers/windows/secondary-browsing-contexts",
+    "security-nav": "html/browsers/windows/security-nav",
+    "groupings-of-browsing-contexts": "html/browsers/windows/groupings-of-browsing-contexts",
+    "browsing-context-names": "html/browsers/windows/browsing-context-names",
+    "the-window-object": "html/browsers/the-window-object",
+    "security-window": "html/browsers/the-window-object/security-window",
+    "apis-for-creating-and-navigating-browsing-contexts-by-name": "html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name",
+    "accessing-other-browsing-contexts": "html/browsers/the-window-object/accessing-other-browsing-contexts",
+    "named-access-on-the-window-object": "html/browsers/the-window-object/named-access-on-the-window-object",
+    "garbage-collection-and-browsing-contexts": "html/browsers/the-window-object/garbage-collection-and-browsing-contexts",
+    "closing-browsing-contexts": "html/browsers/the-window-object/closing-browsing-contexts",
+    "browser-interface-elements": "html/browsers/the-window-object/browser-interface-elements",
+    "the-windowproxy-object": "html/browsers/the-window-object/the-windowproxy-object",
+    "origin": "html/browsers/origin",
+    "relaxing-the-same-origin-restriction": "html/browsers/origin/relaxing-the-same-origin-restriction",
+    "sandboxing": "html/browsers/sandboxing",
+    "history": "html/browsers/history",
+    "the-session-history-of-browsing-contexts": "html/browsers/history/the-session-history-of-browsing-contexts",
+    "the-history-interface": "html/browsers/history/the-history-interface",
+    "the-location-interface": "html/browsers/history/the-location-interface",
+    "security-location": "html/browsers/history/the-location-interface",
+    "history-notes": "html/browsers/history/history-notes",
+    "browsing-the-web": "html/browsers/browsing-the-web",
+    "navigating-across-documents": "html/browsers/browsing-the-web/navigating-across-documents",
+    "read-html": "html/browsers/browsing-the-web/read-html",
+    "read-xml": "html/browsers/browsing-the-web/read-xml",
+    "read-text": "html/browsers/browsing-the-web/read-text",
+    "read-multipart-x-mixed-replace": "html/browsers/browsing-the-web/read-multipart-x-mixed-replace",
+    "read-media": "html/browsers/browsing-the-web/read-media",
+    "read-plugin": "html/browsers/browsing-the-web/read-plugin",
+    "read-ua-inline": "html/browsers/browsing-the-web/read-ua-inline",
+    "scroll-to-fragid": "html/browsers/browsing-the-web/scroll-to-fragid",
+    "history-traversal": "html/browsers/browsing-the-web/history-traversal",
+    "event-definitions-0": "html/browsers/browsing-the-web/history-traversal",
+    "unloading-documents": "html/browsers/browsing-the-web/unloading-documents",
+    "event-definition": "html/browsers/browsing-the-web/unloading-documents",
+    "aborting-a-document-load": "html/browsers/browsing-the-web/aborting-a-document-load",
+    "offline": "html/browsers/offline",
+    "introduction-4": "html/browsers/offline/introduction-4",
+    "supporting-offline-caching-for-legacy-applications": "html/browsers/offline/introduction-4",
+    "appcacheevents": "html/browsers/offline/introduction-4",
+    "appcache": "html/browsers/offline/appcache",
+    "manifests": "html/browsers/offline/manifests",
+    "some-sample-manifests": "html/browsers/offline/manifests",
+    "writing-cache-manifests": "html/browsers/offline/manifests",
+    "parsing-cache-manifests": "html/browsers/offline/manifests",
+    "downloading-or-updating-an-application-cache": "html/browsers/offline/downloading-or-updating-an-application-cache",
+    "the-application-cache-selection-algorithm": "html/browsers/offline/the-application-cache-selection-algorithm",
+    "changesToNetworkingModel": "html/browsers/offline/changestonetworkingmodel",
+    "expiring-application-caches": "html/browsers/offline/expiring-application-caches",
+    "disk-space": "html/browsers/offline/disk-space",
+    "application-cache-api": "html/browsers/offline/application-cache-api",
+    "browser-state": "html/browsers/offline/browser-state",
+    "webappapis": "html/webappapis",
+    "scripting": "html/webappapis/scripting",
+    "introduction-5": "html/webappapis/scripting/introduction-5",
+    "enabling-and-disabling-scripting": "html/webappapis/scripting/enabling-and-disabling-scripting",
+    "processing-model-2": "html/webappapis/scripting/processing-model-2",
+    "definitions-0": "html/webappapis/scripting/processing-model-2",
+    "calling-scripts": "html/webappapis/scripting/processing-model-2",
+    "creating-scripts": "html/webappapis/scripting/processing-model-2",
+    "killing-scripts": "html/webappapis/scripting/processing-model-2",
+    "runtime-script-errors": "html/webappapis/scripting/processing-model-2",
+    "runtime-script-errors-in-documents": "html/webappapis/scripting/processing-model-2",
+    "event-loops": "html/webappapis/scripting/event-loops",
+    "definitions-1": "html/webappapis/scripting/event-loops",
+    "processing-model-3": "html/webappapis/scripting/event-loops",
+    "generic-task-sources": "html/webappapis/scripting/event-loops",
+    "javascript-protocol": "html/webappapis/scripting/javascript-protocol",
+    "events": "html/webappapis/scripting/events",
+    "event-handler-attributes": "html/webappapis/scripting/events",
+    "event-handlers-on-elements,-document-objects,-and-window-objects": "html/webappapis/scripting/events",
+    "event-firing": "html/webappapis/scripting/events",
+    "events-and-the-window-object": "html/webappapis/scripting/events",
+    "atob": "html/webappapis/atob",
+    "timers": "html/webappapis/timers",
+    "user-prompts": "html/webappapis/user-prompts",
+    "simple-dialogs": "html/webappapis/user-prompts/simple-dialogs",
+    "printing": "html/webappapis/user-prompts/printing",
+    "dialogs-implemented-using-separate-documents": "html/webappapis/user-prompts/dialogs-implemented-using-separate-documents",
+    "system-state-and-capabilities": "html/webappapis/system-state-and-capabilities",
+    "the-navigator-object": "html/webappapis/system-state-and-capabilities/the-navigator-object",
+    "client-identification": "html/webappapis/system-state-and-capabilities/the-navigator-object",
+    "custom-handlers": "html/webappapis/system-state-and-capabilities/the-navigator-object",
+    "security-and-privacy": "html/webappapis/system-state-and-capabilities/the-navigator-object",
+    "sample-handler-impl": "html/webappapis/system-state-and-capabilities/the-navigator-object",
+    "manually-releasing-the-storage-mutex": "html/webappapis/system-state-and-capabilities/the-navigator-object",
+    "the-external-interface": "html/webappapis/system-state-and-capabilities/the-external-interface",
+    "editing": "html/editing",
+    "the-hidden-attribute": "html/editing/the-hidden-attribute",
+    "inert-subtrees": "html/editing/inert-subtrees",
+    "the-inert-attribute": "html/editing/inert-subtrees/the-inert-attribute",
+    "activation": "html/editing/activation",
+    "focus": "html/editing/focus",
+    "sequential-focus-navigation-and-the-tabindex-attribute": "html/editing/focus/sequential-focus-navigation-and-the-tabindex-attribute",
+    "focus-management": "html/editing/focus/focus-management",
+    "document-level-focus-apis": "html/editing/focus/document-level-focus-apis",
+    "element-level-focus-apis": "html/editing/focus/element-level-focus-apis",
+    "assigning-keyboard-shortcuts": "html/editing/assigning-keyboard-shortcuts",
+    "introduction-6": "html/editing/assigning-keyboard-shortcuts/introduction-6",
+    "the-accesskey-attribute": "html/editing/assigning-keyboard-shortcuts/the-accesskey-attribute",
+    "processing-model-4": "html/editing/assigning-keyboard-shortcuts/processing-model-4",
+    "editing-0": "html/editing/editing-0",
+    "contenteditable": "html/editing/editing-0/contenteditable",
+    "making-entire-documents-editable:-the-designmode-idl-attribute": "html/editing/editing-0/making-entire-documents-editable-the-designmode-idl-attribute",
+    "best-practices-for-in-page-editors": "html/editing/editing-0/best-practices-for-in-page-editors",
+    "editing-apis": "html/editing/editing-0/editing-apis",
+    "spelling-and-grammar-checking": "html/editing/editing-0/spelling-and-grammar-checking",
+    "dnd": "html/editing/dnd",
+    "introduction-7": "html/editing/dnd/introduction-7",
+    "the-drag-data-store": "html/editing/dnd/the-drag-data-store",
+    "the-datatransfer-interface": "html/editing/dnd/the-datatransfer-interface",
+    "the-datatransferitemlist-interface": "html/editing/dnd/the-datatransfer-interface",
+    "the-datatransferitem-interface": "html/editing/dnd/the-datatransfer-interface",
+    "the-dragevent-interface": "html/editing/dnd/the-dragevent-interface",
+    "drag-and-drop-processing-model": "html/editing/dnd/drag-and-drop-processing-model",
+    "dndevents": "html/editing/dnd/dndevents",
+    "the-draggable-attribute": "html/editing/dnd/the-draggable-attribute",
+    "the-dropzone-attribute": "html/editing/dnd/the-dropzone-attribute",
+    "security-risks-in-the-drag-and-drop-model": "html/editing/dnd/security-risks-in-the-drag-and-drop-model",
+    "syntax": "html/syntax",
+    "writing": "html/syntax/writing",
+    "the-doctype": "html/syntax/writing/the-doctype",
+    "elements-0": "html/syntax/writing/elements-0",
+    "start-tags": "html/syntax/writing/elements-0",
+    "end-tags": "html/syntax/writing/elements-0",
+    "attributes-0": "html/syntax/writing/elements-0",
+    "optional-tags": "html/syntax/writing/elements-0",
+    "element-restrictions": "html/syntax/writing/elements-0",
+    "cdata-rcdata-restrictions": "html/syntax/writing/elements-0",
+    "text": "html/syntax/writing/text",
+    "newlines": "html/syntax/writing/text",
+    "character-references": "html/syntax/writing/character-references",
+    "cdata-sections": "html/syntax/writing/cdata-sections",
+    "comments": "html/syntax/writing/comments",
+    "parsing": "html/syntax/parsing",
+    "overview-of-the-parsing-model": "html/syntax/parsing",
+    "the-input-byte-stream": "html/syntax/parsing",
+    "determining-the-character-encoding": "html/syntax/parsing",
+    "character-encodings-0": "html/syntax/parsing",
+    "changing-the-encoding-while-parsing": "html/syntax/parsing",
+    "preprocessing-the-input-stream": "html/syntax/parsing",
+    "parse-state": "html/syntax/parsing",
+    "the-insertion-mode": "html/syntax/parsing",
+    "the-stack-of-open-elements": "html/syntax/parsing",
+    "the-list-of-active-formatting-elements": "html/syntax/parsing",
+    "the-element-pointers": "html/syntax/parsing",
+    "other-parsing-state-flags": "html/syntax/parsing",
+    "tokenization": "html/syntax/parsing",
+    "data-state": "html/syntax/parsing",
+    "character-reference-in-data-state": "html/syntax/parsing",
+    "rcdata-state": "html/syntax/parsing",
+    "character-reference-in-rcdata-state": "html/syntax/parsing",
+    "rawtext-state": "html/syntax/parsing",
+    "script-data-state": "html/syntax/parsing",
+    "plaintext-state": "html/syntax/parsing",
+    "tag-open-state": "html/syntax/parsing",
+    "end-tag-open-state": "html/syntax/parsing",
+    "tag-name-state": "html/syntax/parsing",
+    "rcdata-less-than-sign-state": "html/syntax/parsing",
+    "rcdata-end-tag-open-state": "html/syntax/parsing",
+    "rcdata-end-tag-name-state": "html/syntax/parsing",
+    "rawtext-less-than-sign-state": "html/syntax/parsing",
+    "rawtext-end-tag-open-state": "html/syntax/parsing",
+    "rawtext-end-tag-name-state": "html/syntax/parsing",
+    "script-data-less-than-sign-state": "html/syntax/parsing",
+    "script-data-end-tag-open-state": "html/syntax/parsing",
+    "script-data-end-tag-name-state": "html/syntax/parsing",
+    "script-data-escape-start-state": "html/syntax/parsing",
+    "script-data-escape-start-dash-state": "html/syntax/parsing",
+    "script-data-escaped-state": "html/syntax/parsing",
+    "script-data-escaped-dash-state": "html/syntax/parsing",
+    "script-data-escaped-dash-dash-state": "html/syntax/parsing",
+    "script-data-escaped-less-than-sign-state": "html/syntax/parsing",
+    "script-data-escaped-end-tag-open-state": "html/syntax/parsing",
+    "script-data-escaped-end-tag-name-state": "html/syntax/parsing",
+    "script-data-double-escape-start-state": "html/syntax/parsing",
+    "script-data-double-escaped-state": "html/syntax/parsing",
+    "script-data-double-escaped-dash-state": "html/syntax/parsing",
+    "script-data-double-escaped-dash-dash-state": "html/syntax/parsing",
+    "script-data-double-escaped-less-than-sign-state": "html/syntax/parsing",
+    "script-data-double-escape-end-state": "html/syntax/parsing",
+    "before-attribute-name-state": "html/syntax/parsing",
+    "attribute-name-state": "html/syntax/parsing",
+    "after-attribute-name-state": "html/syntax/parsing",
+    "before-attribute-value-state": "html/syntax/parsing",
+    "attribute-value-(double-quoted)-state": "html/syntax/parsing",
+    "attribute-value-(single-quoted)-state": "html/syntax/parsing",
+    "attribute-value-(unquoted)-state": "html/syntax/parsing",
+    "character-reference-in-attribute-value-state": "html/syntax/parsing",
+    "after-attribute-value-(quoted)-state": "html/syntax/parsing",
+    "self-closing-start-tag-state": "html/syntax/parsing",
+    "bogus-comment-state": "html/syntax/parsing",
+    "markup-declaration-open-state": "html/syntax/parsing",
+    "comment-start-state": "html/syntax/parsing",
+    "comment-start-dash-state": "html/syntax/parsing",
+    "comment-state": "html/syntax/parsing",
+    "comment-end-dash-state": "html/syntax/parsing",
+    "comment-end-state": "html/syntax/parsing",
+    "comment-end-bang-state": "html/syntax/parsing",
+    "doctype-state": "html/syntax/parsing",
+    "before-doctype-name-state": "html/syntax/parsing",
+    "doctype-name-state": "html/syntax/parsing",
+    "after-doctype-name-state": "html/syntax/parsing",
+    "after-doctype-public-keyword-state": "html/syntax/parsing",
+    "before-doctype-public-identifier-state": "html/syntax/parsing",
+    "doctype-public-identifier-(double-quoted)-state": "html/syntax/parsing",
+    "doctype-public-identifier-(single-quoted)-state": "html/syntax/parsing",
+    "after-doctype-public-identifier-state": "html/syntax/parsing",
+    "between-doctype-public-and-system-identifiers-state": "html/syntax/parsing",
+    "after-doctype-system-keyword-state": "html/syntax/parsing",
+    "before-doctype-system-identifier-state": "html/syntax/parsing",
+    "doctype-system-identifier-(double-quoted)-state": "html/syntax/parsing",
+    "doctype-system-identifier-(single-quoted)-state": "html/syntax/parsing",
+    "after-doctype-system-identifier-state": "html/syntax/parsing",
+    "bogus-doctype-state": "html/syntax/parsing",
+    "cdata-section-state": "html/syntax/parsing",
+    "tokenizing-character-references": "html/syntax/parsing",
+    "tree-construction": "html/syntax/parsing",
+    "creating-and-inserting-elements": "html/syntax/parsing",
+    "closing-elements-that-have-implied-end-tags": "html/syntax/parsing",
+    "foster-parenting": "html/syntax/parsing",
+    "parsing-main-inhtml": "html/syntax/parsing",
+    "the-initial-insertion-mode": "html/syntax/parsing",
+    "the-before-html-insertion-mode": "html/syntax/parsing",
+    "the-before-head-insertion-mode": "html/syntax/parsing",
+    "parsing-main-inhead": "html/syntax/parsing",
+    "parsing-main-inheadnoscript": "html/syntax/parsing",
+    "the-after-head-insertion-mode": "html/syntax/parsing",
+    "parsing-main-inbody": "html/syntax/parsing",
+    "parsing-main-incdata": "html/syntax/parsing",
+    "parsing-main-intable": "html/syntax/parsing",
+    "parsing-main-intabletext": "html/syntax/parsing",
+    "parsing-main-incaption": "html/syntax/parsing",
+    "parsing-main-incolgroup": "html/syntax/parsing",
+    "parsing-main-intbody": "html/syntax/parsing",
+    "parsing-main-intr": "html/syntax/parsing",
+    "parsing-main-intd": "html/syntax/parsing",
+    "parsing-main-inselect": "html/syntax/parsing",
+    "parsing-main-inselectintable": "html/syntax/parsing",
+    "parsing-main-afterbody": "html/syntax/parsing",
+    "parsing-main-inframeset": "html/syntax/parsing",
+    "parsing-main-afterframeset": "html/syntax/parsing",
+    "the-after-after-body-insertion-mode": "html/syntax/parsing",
+    "the-after-after-frameset-insertion-mode": "html/syntax/parsing",
+    "parsing-main-inforeign": "html/syntax/parsing",
+    "the-end": "html/syntax/parsing",
+    "coercing-an-html-dom-into-an-infoset": "html/syntax/parsing",
+    "an-introduction-to-error-handling-and-strange-cases-in-the-parser": "html/syntax/parsing",
+    "misnested-tags:-b-i-/b-/i": "html/syntax/parsing",
+    "misnested-tags:-b-p-/b-/p": "html/syntax/parsing",
+    "unexpected-markup-in-tables": "html/syntax/parsing",
+    "scripts-that-modify-the-page-as-it-is-being-parsed": "html/syntax/parsing",
+    "the-execution-of-scripts-that-are-moving-across-multiple-documents": "html/syntax/parsing",
+    "unclosed-formatting-elements": "html/syntax/parsing",
+    "serializing-html-fragments": "html/syntax/serializing-html-fragments",
+    "parsing-html-fragments": "html/syntax/parsing-html-fragments",
+    "named-character-references": "html/syntax/named-character-references",
+    "the-xhtml-syntax": "html/the-xhtml-syntax",
+    "writing-xhtml-documents": "html/the-xhtml-syntax/writing-xhtml-documents",
+    "parsing-xhtml-documents": "html/the-xhtml-syntax/parsing-xhtml-documents",
+    "serializing-xhtml-fragments": "html/the-xhtml-syntax/serializing-xhtml-fragments",
+    "parsing-xhtml-fragments": "html/the-xhtml-syntax/parsing-xhtml-fragments",
+    "rendering": "html/rendering",
+    "introduction-8": "html/rendering/introduction-8",
+    "the-css-user-agent-style-sheet-and-presentational-hints": "html/rendering/the-css-user-agent-style-sheet-and-presentational-hints",
+    "non-replaced-elements": "html/rendering/non-replaced-elements",
+    "hidden-elements": "html/rendering/non-replaced-elements/hidden-elements",
+    "the-page": "html/rendering/non-replaced-elements/the-page",
+    "flow-content-0": "html/rendering/non-replaced-elements/flow-content-0",
+    "phrasing-content-0": "html/rendering/non-replaced-elements/phrasing-content-0",
+    "bidirectional-text": "html/rendering/non-replaced-elements/bidirectional-text",
+    "quotes": "html/rendering/non-replaced-elements/quotes",
+    "sections-and-headings": "html/rendering/non-replaced-elements/sections-and-headings",
+    "lists": "html/rendering/non-replaced-elements/lists",
+    "tables": "html/rendering/non-replaced-elements/tables",
+    "form-controls": "html/rendering/non-replaced-elements/form-controls",
+    "the-hr-element-0": "html/rendering/non-replaced-elements/the-hr-element-0",
+    "the-fieldset-element-0": "html/rendering/non-replaced-elements/the-fieldset-element-0",
+    "replaced-elements": "html/rendering/replaced-elements",
+    "embedded-content-1": "html/rendering/replaced-elements/embedded-content-1",
+    "images": "html/rendering/replaced-elements/images",
+    "attributes-for-embedded-content-and-images": "html/rendering/replaced-elements/attributes-for-embedded-content-and-images",
+    "image-maps-0": "html/rendering/replaced-elements/image-maps-0",
+    "toolbars-0": "html/rendering/replaced-elements/toolbars-0",
+    "bindings": "html/rendering/bindings",
+    "introduction-9": "html/rendering/bindings/introduction-9",
+    "the-button-element-0": "html/rendering/bindings/the-button-element-0",
+    "the-details-element-0": "html/rendering/bindings/the-details-element-0",
+    "the-input-element-as-a-text-entry-widget": "html/rendering/bindings/the-input-element-as-a-text-entry-widget",
+    "the-input-element-as-domain-specific-widgets": "html/rendering/bindings/the-input-element-as-domain-specific-widgets",
+    "the-input-element-as-a-range-control": "html/rendering/bindings/the-input-element-as-a-range-control",
+    "the-input-element-as-a-color-well": "html/rendering/bindings/the-input-element-as-a-color-well",
+    "the-input-element-as-a-checkbox-and-radio-button-widgets": "html/rendering/bindings/the-input-element-as-a-checkbox-and-radio-button-widgets",
+    "the-input-element-as-a-file-upload-control": "html/rendering/bindings/the-input-element-as-a-file-upload-control",
+    "the-input-element-as-a-button": "html/rendering/bindings/the-input-element-as-a-button",
+    "the-marquee-element": "html/rendering/bindings/the-marquee-element",
+    "the-meter-element-0": "html/rendering/bindings/the-meter-element-0",
+    "the-progress-element-0": "html/rendering/bindings/the-progress-element-0",
+    "the-select-element-0": "html/rendering/bindings/the-select-element-0",
+    "the-textarea-element-0": "html/rendering/bindings/the-textarea-element-0",
+    "the-keygen-element-0": "html/rendering/bindings/the-keygen-element-0",
+    "frames-and-framesets": "html/rendering/frames-and-framesets",
+    "interactive-media": "html/rendering/interactive-media",
+    "links,-forms,-and-navigation": "html/rendering/interactive-media/links-forms-and-navigation",
+    "the-title-attribute-0": "html/rendering/interactive-media/the-title-attribute-0",
+    "editing-hosts": "html/rendering/interactive-media/editing-hosts",
+    "text-rendered-in-native-user-interfaces": "html/rendering/interactive-media/text-rendered-in-native-user-interfaces",
+    "print-media": "html/rendering/print-media",
+    "unstyled-xml-documents": "html/rendering/unstyled-xml-documents",
+    "obsolete": "html/obsolete",
+    "obsolete-but-conforming-features": "html/obsolete/obsolete-but-conforming-features",
+    "warnings-for-obsolete-but-conforming-features": "html/obsolete/obsolete-but-conforming-features/warnings-for-obsolete-but-conforming-features",
+    "non-conforming-features": "html/obsolete/non-conforming-features",
+    "requirements-for-implementations": "html/obsolete/requirements-for-implementations",
+    "the-applet-element": "html/obsolete/requirements-for-implementations/the-applet-element",
+    "the-marquee-element-0": "html/obsolete/requirements-for-implementations/the-marquee-element-0",
+    "frames": "html/obsolete/requirements-for-implementations/frames",
+    "other-elements,-attributes-and-apis": "html/obsolete/requirements-for-implementations/other-elements-attributes-and-apis",
+    "iana": "microdata/iana",
+    "text/html": "html/iana/text-html",
+    "multipart/x-mixed-replace": "html/iana/multipart-x-mixed-replace",
+    "application/xhtml+xml": "html/iana/application-xhtml-xml",
+    "application/x-www-form-urlencoded": "html/iana/application-x-www-form-urlencoded",
+    "text/cache-manifest": "html/iana/text-cache-manifest",
+    "ping-to": "html/iana/ping-to",
+    "web+-scheme-prefix": "html/iana/web-scheme-prefix",
+    "the-canvas-state": "canvas2d/the-canvas-state",
+    "drawingstyle-objects": "canvas2d/drawingstyle-objects",
+    "line-styles": "canvas2d/line-styles",
+    "text-styles": "canvas2d/text-styles",
+    "building-paths": "canvas2d/building-paths",
+    "path-objects": "canvas2d/path-objects",
+    "transformations": "canvas2d/transformations",
+    "fill-and-stroke-styles": "canvas2d/fill-and-stroke-styles",
+    "drawing-rectangles-to-the-canvas": "canvas2d/drawing-rectangles-to-the-canvas",
+    "drawing-text-to-the-canvas": "canvas2d/drawing-text-to-the-canvas",
+    "drawing-paths-to-the-canvas": "canvas2d/drawing-paths-to-the-canvas",
+    "drawing-images-to-the-canvas": "canvas2d/drawing-images-to-the-canvas",
+    "hit-regions": "canvas2d/hit-regions",
+    "pixel-manipulation": "canvas2d/pixel-manipulation",
+    "compositing": "canvas2d/compositing",
+    "shadows": "canvas2d/shadows",
+    "drawing-model": "canvas2d/drawing-model",
+    "best-practices": "canvas2d/best-practices",
+    "overview": "microdata/introduction/overview",
+    "the-basic-syntax": "microdata/introduction/the-basic-syntax",
+    "typed-items": "microdata/introduction/typed-items",
+    "global-identifiers-for-items": "microdata/introduction/global-identifiers-for-items",
+    "selecting-names-when-defining-vocabularies": "microdata/introduction/selecting-names-when-defining-vocabularies",
+    "using-the-microdata-dom-api": "microdata/introduction/using-the-microdata-dom-api",
+    "encoding-microdata": "microdata/encoding-microdata",
+    "the-microdata-model": "microdata/encoding-microdata/the-microdata-model",
+    "items": "microdata/encoding-microdata/items",
+    "names:-the-itemprop-attribute": "microdata/encoding-microdata/names-the-itemprop-attribute",
+    "values": "microdata/encoding-microdata/values",
+    "associating-names-with-items": "microdata/encoding-microdata/associating-names-with-items",
+    "microdata-and-other-namespaces": "microdata/encoding-microdata/microdata-and-other-namespaces",
+    "microdata-dom-api": "microdata/microdata-dom-api",
+    "htmlpropertiescollection": "microdata/microdata-dom-api/htmlpropertiescollection",
+    "converting-html-to-other-formats": "microdata/converting-html-to-other-formats",
+    "json": "microdata/converting-html-to-other-formats/json"
+}
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/tools/scripts/lint.py b/LayoutTests/imported/w3c/web-platform-tests/tools/scripts/lint.py
new file mode 100644 (file)
index 0000000..c640d6b
--- /dev/null
@@ -0,0 +1,265 @@
+import os
+import subprocess
+import re
+import sys
+import fnmatch
+
+from collections import defaultdict
+try:
+    from xml.etree import cElementTree as ElementTree
+except ImportError:
+    from xml.etree import ElementTree
+
+import _env
+import manifest
+import html5lib
+
+here = os.path.abspath(os.path.split(__file__)[0])
+repo_root = _env.repo_root
+
+def git(command, *args):
+    args = list(args)
+
+    proc_kwargs = {"cwd": repo_root}
+
+    command_line = ["git", command] + args
+
+    try:
+        return subprocess.check_output(command_line, **proc_kwargs)
+    except subprocess.CalledProcessError as e:
+        raise
+
+
+def iter_files():
+    for item in git("ls-tree", "-r", "--name-only", "HEAD").split("\n"):
+        yield item
+
+
+def check_path_length(path):
+    if len(path) + 1 > 150:
+        return [("PATH LENGTH", "/%s longer than maximum path length (%d > 150)" % (path, len(path) + 1), None)]
+    return []
+
+def set_type(error_type, errors):
+    return [(error_type,) + error for error in errors]
+
+def parse_whitelist_file(filename):
+    data = defaultdict(lambda:defaultdict(set))
+
+    with open(filename) as f:
+        for line in f:
+            line = line.strip()
+            if not line or line.startswith("#"):
+                continue
+            parts = [item.strip() for item in line.split(":")]
+            if len(parts) == 2:
+                parts.append(None)
+            else:
+                parts[-1] = int(parts[-1])
+
+            error_type, file_match, line_number = parts
+            data[file_match][error_type].add(line_number)
+
+    def inner(path, errors):
+        whitelisted = [False for item in xrange(len(errors))]
+
+        for file_match, whitelist_errors in data.iteritems():
+            if fnmatch.fnmatch(path, file_match):
+                for i, (error_type, msg, line) in enumerate(errors):
+                    if "*" in whitelist_errors:
+                        whitelisted[i] = True
+                    elif error_type in whitelist_errors:
+                        allowed_lines = whitelist_errors[error_type]
+                        if None in allowed_lines or line in allowed_lines:
+                            whitelisted[i] = True
+
+        return [item for i, item in enumerate(errors) if not whitelisted[i]]
+    return inner
+
+_whitelist_fn = None
+def whitelist_errors(path, errors):
+    global _whitelist_fn
+
+    if _whitelist_fn is None:
+        _whitelist_fn = parse_whitelist_file(os.path.join(here, "lint.whitelist"))
+    return _whitelist_fn(path, errors)
+
+class Regexp(object):
+    pattern = None
+    file_extensions = None
+    error = None
+    _re = None
+
+    def __init__(self):
+        self._re = re.compile(self.pattern)
+
+    def applies(self, path):
+        return (self.file_extensions is None or
+                os.path.splitext(path)[1] in self.file_extensions)
+
+    def search(self, line):
+        return self._re.search(line)
+
+class TrailingWhitespaceRegexp(Regexp):
+    pattern = "[ \t\f\v]$"
+    error = "TRAILING WHITESPACE"
+
+class TabsRegexp(Regexp):
+    pattern = "^\t"
+    error = "INDENT TABS"
+
+class CRRegexp(Regexp):
+    pattern = "\r$"
+    error = "CR AT EOL"
+
+class W3CTestOrgRegexp(Regexp):
+    pattern = "w3c\-test\.org"
+    error = "W3C-TEST.ORG"
+
+class PrintRegexp(Regexp):
+    pattern = "print(?:\s|\s*\()"
+    error = "PRINT STATEMENT"
+    file_extensions = [".py"]
+
+regexps = [item() for item in
+           [TrailingWhitespaceRegexp,
+            TabsRegexp,
+            CRRegexp,
+            W3CTestOrgRegexp,
+            PrintRegexp]]
+
+def check_regexp_line(path, f):
+    errors = []
+
+    applicable_regexps = [regexp for regexp in regexps if regexp.applies(path)]
+
+    for i, line in enumerate(f):
+        for regexp in applicable_regexps:
+            if regexp.search(line):
+                errors.append((regexp.error, "%s line %i" % (path, i+1), i+1))
+
+    return errors
+
+def check_parsed(path, f):
+    ext = os.path.splitext(path)[1][1:]
+
+    errors = []
+
+    if path.endswith("-manual.%s" % ext):
+        return []
+
+    parsers = {"html":lambda x:html5lib.parse(x, treebuilder="etree"),
+               "htm":lambda x:html5lib.parse(x, treebuilder="etree"),
+               "xhtml":ElementTree.parse,
+               "xhtm":ElementTree.parse,
+               "svg":ElementTree.parse}
+
+    parser = parsers.get(ext)
+
+    if parser is None:
+        return []
+
+    try:
+        tree = parser(f)
+    except:
+        return [("PARSE-FAILED", "Unable to parse file %s" % path, None)]
+
+    if hasattr(tree, "getroot"):
+        root = tree.getroot()
+    else:
+        root = tree
+
+    timeout_nodes = manifest.get_timeout_meta(root)
+    if len(timeout_nodes) > 1:
+        errors.append(("MULTIPLE-TIMEOUT", "%s more than one meta name='timeout'" % path, None))
+
+    for timeout_node in timeout_nodes:
+        timeout_value = timeout_node.attrib.get("content", "").lower()
+        if timeout_value != "long":
+            errors.append(("INVALID-TIMEOUT", "%s invalid timeout value %s" % (path, timeout_value), None))
+
+    testharness_nodes = manifest.get_testharness_scripts(root)
+    if testharness_nodes:
+        if len(testharness_nodes) > 1:
+            errors.append(("MULTIPLE-TESTHARNESS", "%s more than one <script src='/resources/testharness.js>'" % path, None))
+
+        testharnessreport_nodes = root.findall(".//{http://www.w3.org/1999/xhtml}script[@src='/resources/testharnessreport.js']")
+        if not testharnessreport_nodes:
+            errors.append(("MISSING-TESTHARNESSREPORT", "%s missing <script src='/resources/testharnessreport.js>'" % path, None))
+        else:
+            if len(testharnessreport_nodes) > 1:
+                errors.append(("MULTIPLE-TESTHARNESSREPORT", "%s more than one <script src='/resources/testharnessreport.js>'" % path, None))
+
+        seen_elements = {"timeout": False,
+                         "testharness": False,
+                         "testharnessreport": False}
+        required_elements = [key for key, value in {"testharness": True,
+                                                    "testharnessreport": len(testharnessreport_nodes) > 0,
+                                                    "timeout": len(timeout_nodes) > 0}.iteritems() if value]
+
+        for elem in root.iter():
+            if timeout_nodes and elem == timeout_nodes[0]:
+                seen_elements["timeout"] = True
+                if seen_elements["testharness"]:
+                    errors.append(("LATE-TIMEOUT", "%s <meta name=timeout> seen after testharness.js script" % path, None))
+
+            elif elem == testharness_nodes[0]:
+                seen_elements["testharness"] = True
+
+            elif testharnessreport_nodes and elem == testharnessreport_nodes[0]:
+                seen_elements["testharnessreport"] = True
+                if not seen_elements["testharness"]:
+                    errors.append(("EARLY-TESTHARNESSREPORT", "%s testharnessreport.js script seen before testharness.js script" % path, None))
+
+            if all(seen_elements[name] for name in required_elements):
+                break
+
+    return errors
+
+def output_errors(errors):
+    for error_type, error, line_number in errors:
+        print "%s: %s" % (error_type, error)
+
+def output_error_count(error_count):
+    if not error_count:
+        return
+
+    by_type = " ".join("%s: %d" % item for item in error_count.iteritems())
+    count = sum(error_count.values())
+    if count == 1:
+        print "There was 1 error (%s)" % (by_type,)
+    else:
+        print "There were %d errors (%s)" % (count, by_type)
+
+def main():
+    error_count = defaultdict(int)
+
+    def run_lint(path, fn, *args):
+        errors = whitelist_errors(path, fn(path, *args))
+        output_errors(errors)
+        for error_type, error, line in errors:
+            error_count[error_type] += 1
+
+    for path in iter_files():
+        abs_path = os.path.join(repo_root, path)
+        if not os.path.exists(path):
+            continue
+        for path_fn in path_lints:
+            run_lint(path, path_fn)
+
+        if not os.path.isdir(abs_path):
+            with open(abs_path) as f:
+                for file_fn in file_lints:
+                    run_lint(path, file_fn, f)
+                    f.seek(0)
+
+    output_error_count(error_count)
+    return sum(error_count.itervalues())
+
+path_lints = [check_path_length]
+file_lints = [check_regexp_line, check_parsed]
+
+if __name__ == "__main__":
+    error_count = main()
+    if error_count > 0:
+        sys.exit(1)
diff --git a/LayoutTests/imported/w3c/web-platform-tests/tools/scripts/lint.whitelist b/LayoutTests/imported/w3c/web-platform-tests/tools/scripts/lint.whitelist
new file mode 100644 (file)
index 0000000..a44ee7d
--- /dev/null
@@ -0,0 +1,104 @@
+# File containing whiteslist for lint errors
+# Format is:
+# ERROR TYPE:file/name/pattern[:line number]
+# e.g.
+# TRAILING WHITESPACE:example/file.html:128
+# to allow trailing whitespace on example/file.html line 128
+
+## Whitespace rules that we can't enforce yet ##
+
+INDENT TABS: .gitmodules
+INDENT TABS: app-uri/*
+INDENT TABS: conformance-checkers/*
+INDENT TABS: content-security-policy/*
+INDENT TABS: custom-elements/*
+INDENT TABS: DOMEvents/*
+INDENT TABS: eventsource/*
+INDENT TABS: html/*
+INDENT TABS: media-source/*
+INDENT TABS: old-tests/*
+INDENT TABS: pointerlock/*
+INDENT TABS: shadow-dom/*
+INDENT TABS: tools/*
+INDENT TABS: touch-events/*
+INDENT TABS: web-animations/*
+INDENT TABS: webaudio/*
+INDENT TABS: webdriver/*
+INDENT TABS: webvtt/*
+INDENT TABS: XMLHttpRequest/*
+
+TRAILING WHITESPACE: app-uri/*
+TRAILING WHITESPACE: battery-status/*
+TRAILING WHITESPACE: conformance-checkers/*
+TRAILING WHITESPACE: content-security-policy/*
+TRAILING WHITESPACE: custom-elements/*
+TRAILING WHITESPACE: DOMEvents/*
+TRAILING WHITESPACE: html/*
+TRAILING WHITESPACE: html-longdesc/*
+TRAILING WHITESPACE: media-source/*
+TRAILING WHITESPACE: microdata/*
+TRAILING WHITESPACE: old-tests/*
+TRAILING WHITESPACE: pointerevents/*
+TRAILING WHITESPACE: progress-events/*
+TRAILING WHITESPACE: shadow-dom/*
+TRAILING WHITESPACE: tools/*
+TRAILING WHITESPACE: webaudio/*
+TRAILING WHITESPACE: webdriver/*
+TRAILING WHITESPACE: WebIDL/*
+TRAILING WHITESPACE: webvtt/*
+TRAILING WHITESPACE: XMLHttpRequest/*
+
+## File types that should never be checked ##
+
+*:*.pdf
+*:*.jpg
+*:*.png
+*:*.gif
+*:*.pdf
+*:*.wav
+*:*.mp3
+*:*.m4a
+*:*.oga
+*:*.ogv
+*:*.webm
+*:*.mp4
+*:*.m4v
+*:*.ttf
+*:*.woff
+*:*.eot
+*:*.sfd
+
+## Documentation ##
+
+W3C-TEST.ORG:README.md
+W3C-TEST.ORG:*/README.md
+W3C-TEST.ORG:docs/*
+
+## Helper scripts ##
+
+W3C-TEST.ORG:tools/*
+
+### Test exclusions ##
+
+CR AT EOL:WebIDL/valid/idl/documentation-dos.widl
+CR AT EOL:cors/resources/cors-headers.asis
+CR AT EOL:html/semantics/embedded-content/the-canvas-element/size.attributes.parse.whitespace.html
+CR AT EOL:webvtt/webvtt-file-format-parsing/webvtt-file-parsing/support/newlines.vtt
+PARSE-FAILED:dom/nodes/Document-createElement-namespace-tests/empty.svg
+PARSE-FAILED:dom/nodes/Document-createElement-namespace-tests/empty.xhtml
+PARSE-FAILED:dom/nodes/Document-createElement-namespace-tests/minimal_html.svg
+PARSE-FAILED:dom/nodes/Document-createElement-namespace-tests/minimal_html.xhtml
+
+# These have undefined entities; should probably find a way to define them
+PARSE-FAILED:ext-xhtml-pubid/the-xhtml-syntax/parsing-xhtml-documents/xhtml-pubid-1.xhtml
+PARSE-FAILED:ext-xhtml-pubid/the-xhtml-syntax/parsing-xhtml-documents/xhtml-pubid-2.xhtml
+PARSE-FAILED:ext-xhtml-pubid/the-xhtml-syntax/parsing-xhtml-documents/xhtml-pubid-3.xhtml
+
+# Test generation files containing print statements
+PRINT STATEMENT:2dcontext/tools/gentest.py
+PRINT STATEMENT:dom/nodes/Document-createElement-namespace-tests/generate.py
+PRINT STATEMENT:serve.py
+PRINT STATEMENT:tools/runner/report.py
+PRINT STATEMENT:tools/scripts/lint.py
+PRINT STATEMENT:tools/scripts/update_html5lib_tests.py
+PRINT STATEMENT:subresource-integrity/tools/generate_javascript.py
diff --git a/LayoutTests/imported/w3c/web-platform-tests/tools/scripts/manifest.js b/LayoutTests/imported/w3c/web-platform-tests/tools/scripts/manifest.js
new file mode 100644 (file)
index 0000000..fbd5568
--- /dev/null
@@ -0,0 +1,140 @@
+// grab test metadata from a test file
+function __result_handler() {
+
+    function __get_metadata() {
+       var obj = new Object();
+       var author = [];
+       var assert = [];
+       var help = [];
+       var match = [];
+       var mismatch = [];
+       var flags = [];
+       var nodes;
+
+       nodes = document.querySelectorAll('link[rel="author"]');
+       for (var i = 0; i < nodes.length; i++) {
+           var href = nodes[i].getAttribute("href");
+           var title = nodes[i].getAttribute("title");
+           var s = title;
+           if (href != null) {
+               s += " <" + href + ">";
+           }
+           author.push(s);
+       }
+       if (nodes.length > 0) obj.author = author;
+       nodes = document.querySelectorAll('meta[name="assert"]');
+       for (var i = 0; i < nodes.length; i++) {
+           assert.push(nodes[i].getAttribute("content"));
+       }
+       if (nodes.length > 0) obj.assert = assert;
+       nodes = document.querySelectorAll('link[rel="help"]');
+       for (var i = 0; i < nodes.length; i++) {
+           help.push(nodes[i].getAttribute("href"));
+       }
+       if (nodes.length > 0) obj.help = help;
+       nodes = document.querySelectorAll('link[rel="match"]');
+       for (var i = 0; i < nodes.length; i++) {
+           match.push(nodes[i].getAttribute("href"));
+       }
+       if (nodes.length > 0) obj.match = match;
+       nodes = document.querySelectorAll('link[rel="mismatch"]');
+       for (var i = 0; i < nodes.length; i++) {
+           mismatch.push(nodes[i].getAttribute("href"));
+       }
+       if (nodes.length > 0) obj.match = mismatch;
+       nodes = document.querySelectorAll('meta[name="flags"]');
+       for (var i = 0; i < nodes.length; i++) {
+           flags.push(nodes[i].getAttribute("content"));
+       }
+       if (nodes.length > 0) obj.flags = flags;
+
+       return obj;
+    }
+
+    var meta = __get_metadata();
+    var nodes;
+
+    function copy(obj, prop, arr) {
+       if (typeof arr !== "undefined") {
+           var a = [];
+           for (var i = 0; i<arr.length;i++) {
+               a[i] = arr[i];
+           }   
+           obj[prop] = a;
+       }
+    }
+
+
+    var ret = new Object();
+    ret.location = document.location.href;
+    ret.type  = "manual";    
+    ret.tests = new Object();
+
+    var node = document.querySelector('script[src$="/resources/testharness.js"]');
+    if (node !== null) {
+       ret.type = "script";
+    }
+
+    if (ret.type === "script") {
+       if (typeof metadata_generator === "undefined"
+           || Object.keys(metadata_generator.currentMetadata).length === 0)
+           return "WRAPPER:TRY_AGAIN";
+       else {
+           for (var key in metadata_generator.currentMetadata) {
+               var obj = metadata_generator.currentMetadata[key];
+               var newtest = new Object();
+               ret.tests[key]= newtest;
+               if (typeof obj.help === "undefined") {
+                   copy(newtest, "help", meta.help);
+               } else if (typeof obj.help === "string") {
+                   newtest.help = [ obj.help ];          
+               }
+               if (typeof obj.author === "undefined") {
+                   copy(newtest, "author", meta.author);
+               } else if (typeof obj.author === "string") {
+                   newtest.author = [ obj.author ];      
+               }
+               if (typeof obj.assert === "undefined") {
+                   copy(newtest, "assert", meta.assert);
+               } else if (typeof obj.assert === "string") {
+                   newtest.assert = [ obj.assert ];      
+               }
+               copy(newtest, "match", meta.match);
+               copy(newtest, "mismatch", meta.mismatch);
+               copy(newtest, "flags", meta.flags);
+           }
+           return ret;
+       }
+    } else {
+       var newtest = meta;
+       ret.tests[document.title]= newtest;     
+
+       if (typeof newtest.match !== "undefined"
+           || typeof newtest.mismatch !== "undefined") {
+           ret.type = "reftest";
+       }
+
+       return ret;
+    }
+
+}
+
+function __give_up() {
+    var ret = new Object();
+    ret.location = document.location.href;
+    ret.type  = "manual";    
+    ret.tests = new Object();
+
+    var node = document.querySelector('script[src$="/resources/testharness.js"]');
+    if (node !== null) {
+       ret.type = "script";
+    } else if (typeof newtest.match !== "undefined"
+              || typeof newtest.mismatch !== "undefined") {
+       ret.type = "reftest";
+    }
+
+    var newtest = __get_metadata();
+    ret.tests[document.title]= newtest;        
+    
+    return ret;
+}
diff --git a/LayoutTests/imported/w3c/web-platform-tests/tools/scripts/manifest.py b/LayoutTests/imported/w3c/web-platform-tests/tools/scripts/manifest.py
new file mode 100644 (file)
index 0000000..6763944
--- /dev/null
@@ -0,0 +1,860 @@
+#!/usr/bin/env python
+
+import argparse
+import json
+import logging
+import os
+import re
+import subprocess
+import sys
+import urlparse
+
+from StringIO import StringIO
+from abc import ABCMeta, abstractmethod, abstractproperty
+from collections import defaultdict
+from fnmatch import fnmatch
+
+import _env
+import html5lib
+
+def get_git_func(repo_path):
+    def git(cmd, *args):
+        full_cmd = ["git", cmd] + list(args)
+        return subprocess.check_output(full_cmd, cwd=repo_path, stderr=subprocess.STDOUT)
+    return git
+
+
+def is_git_repo(tests_root):
+    return os.path.exists(os.path.join(tests_root, ".git"))
+
+
+_repo_root = None
+def get_repo_root():
+    global _repo_root
+    if _repo_root is None:
+        git = get_git_func(os.path.dirname(__file__))
+        _repo_root = git("rev-parse", "--show-toplevel").rstrip()
+    return _repo_root
+
+
+manifest_name = "MANIFEST.json"
+ref_suffixes = ["_ref", "-ref"]
+wd_pattern = "*.py"
+blacklist = ["/", "/tools/", "/resources/", "/common/", "/conformance-checkers/", "_certs"]
+
+
+logging.basicConfig()
+logger = logging.getLogger("manifest")
+logger.setLevel(logging.DEBUG)
+
+
+def rel_path_to_url(rel_path, url_base="/"):
+    assert not os.path.isabs(rel_path)
+    if url_base[0] != "/":
+        url_base = "/" + url_base
+    if url_base[-1] != "/":
+        url_base += "/"
+    return url_base + rel_path.replace(os.sep, "/")
+
+
+def url_to_rel_path(url, url_base):
+    url_path = urlparse.urlsplit(url).path
+    if not url_path.startswith(url_base):
+        raise ValueError, url
+    url_path = url_path[len(url_base):]
+    return url_path
+
+
+def is_blacklisted(url):
+    for item in blacklist:
+        if item == "/":
+            if "/" not in url[1:]:
+                return True
+        elif url.startswith(item):
+            return True
+    return False
+
+
+class ManifestItem(object):
+    __metaclass__ = ABCMeta
+
+    item_type = None
+
+    def __init__(self):
+        self.manifest = None
+
+    @abstractmethod
+    def key(self):
+        pass
+
+    def __eq__(self, other):
+        if not hasattr(other, "key"):
+            return False
+        return self.key() == other.key()
+
+    def __hash__(self):
+        return hash(self.key())
+
+    @abstractmethod
+    def to_json(self):
+        raise NotImplementedError
+
+    @classmethod
+    def from_json(self, manifest, obj):
+        raise NotImplementedError
+
+    @abstractproperty
+    def id(self):
+        pass
+
+
+class URLManifestItem(ManifestItem):
+    def __init__(self, url, url_base="/"):
+        ManifestItem.__init__(self)
+        self.url = url
+        self.url_base = url_base
+
+    @property
+    def id(self):
+        return self.url
+
+    def key(self):
+        return self.item_type, self.url
+
+    @property
+    def path(self):
+        return url_to_rel_path(self.url, self.url_base)
+
+    def to_json(self):
+        rv = {"url": self.url}
+        return rv
+
+    @classmethod
+    def from_json(cls, manifest, obj):
+        return cls(obj["url"],
+                   url_base=manifest.url_base)
+
+
+class TestharnessTest(URLManifestItem):
+    item_type = "testharness"
+
+    def __init__(self, url, url_base="/", timeout=None):
+        URLManifestItem.__init__(self, url, url_base=url_base)
+        self.timeout = timeout
+
+    def to_json(self):
+        rv = {"url": self.url}
+        if self.timeout is not None:
+            rv["timeout"] = self.timeout
+        return rv
+
+    @classmethod
+    def from_json(cls, manifest, obj):
+        return cls(obj["url"],
+                   url_base=manifest.url_base,
+                   timeout=obj.get("timeout"))
+
+
+class RefTest(URLManifestItem):
+    item_type = "reftest"
+
+    def __init__(self, url, ref_url, ref_type, url_base="/", timeout=None):
+        URLManifestItem.__init__(self, url, url_base=url_base)
+        if ref_type not in ["==", "!="]:
+            raise ValueError, "Unrecognised ref_type %s" % ref_type
+        self.ref_url = ref_url
+        self.ref_type = ref_type
+        self.timeout = timeout
+
+    @property
+    def id(self):
+        return (self.url, self.ref_type, self.ref_url)
+
+    def key(self):
+        return self.item_type, self.url, self.ref_type, self.ref_url
+
+    def to_json(self):
+        rv = {"url": self.url,
+              "ref_type": self.ref_type,
+              "ref_url": self.ref_url}
+        if self.timeout is not None:
+            rv["timeout"] = self.timeout
+        return rv
+
+    @classmethod
+    def from_json(cls, manifest, obj):
+        return cls(obj["url"],
+                   obj["ref_url"],
+                   obj["ref_type"],
+                   url_base=manifest.url_base,
+                   timeout=obj.get("timeout"))
+
+
+class ManualTest(URLManifestItem):
+    item_type = "manual"
+
+class Stub(URLManifestItem):
+    item_type = "stub"
+
+class Helper(URLManifestItem):
+    item_type = "helper"
+
+class WebdriverSpecTest(ManifestItem):
+    item_type = "wdspec"
+
+    def __init__(self, path):
+        ManifestItem.__init__(self)
+        self.path = path
+
+    @property
+    def id(self):
+        return self.path
+
+    def to_json(self):
+        return {"path": self.path}
+
+    def key(self):
+        return self.path
+
+    @classmethod
+    def from_json(cls, manifest, obj):
+        return cls(path=obj["path"])
+
+
+class ManifestError(Exception):
+    pass
+
+item_types = ["testharness", "reftest", "manual", "helper", "stub", "wdspec"]
+
+class Manifest(object):
+    def __init__(self, git_rev=None, url_base="/"):
+        # Dict of item_type: {path: set(manifest_items)}
+        self._data = dict((item_type, defaultdict(set))
+                          for item_type in item_types)
+        self.rev = git_rev
+        self.url_base = url_base
+        self.local_changes = LocalChanges(self)
+
+    def _included_items(self, include_types=None):
+        if include_types is None:
+            include_types = item_types
+
+        for item_type in include_types:
+            paths = self._data[item_type].copy()
+            for local_types, local_paths in self.local_changes.itertypes(item_type):
+                for path, items in local_paths.iteritems():
+                    paths[path] = items
+                for path in self.local_changes.iterdeleted():
+                    if path in paths:
+                        del paths[path]
+
+            yield item_type, paths
+
+    def contains_path(self, path):
+        return any(path in paths for _, paths in self._included_items())
+
+    def add(self, item):
+        self._data[item.item_type][item.path].add(item)
+        item.manifest = self
+
+    def extend(self, items):
+        for item in items:
+            self.add(item)
+
+    def remove_path(self, path):
+        for item_type in item_types:
+            if path in self._data[item_type]:
+                del self._data[item_type][path]
+
+    def itertypes(self, *types):
+        if not types:
+            types = None
+        for item_type, items in self._included_items(types):
+            for item in sorted(items.items()):
+                yield item
+
+    def __iter__(self):
+        for item in self.itertypes():
+            yield item
+
+    def __getitem__(self, path):
+        for _, paths in self._included_items():
+            if path in paths:
+                return paths[path]
+        raise KeyError
+
+    def _committed_with_path(self, rel_path):
+        rv = set()
+        for paths_items in self._data.itervalues():
+            rv |= paths_items.get(rel_path, set())
+        return rv
+
+    def _committed_paths(self):
+        rv = set()
+        for paths_items in self._data.itervalues():
+            rv |= set(paths_items.keys())
+        return rv
+
+    def update(self,
+               tests_root,
+               url_base,
+               new_rev,
+               committed_changes=None,
+               local_changes=None,
+               remove_missing_local=False):
+
+        if local_changes is None:
+            local_changes = {}
+
+        if committed_changes is not None:
+            for rel_path, status in committed_changes:
+                self.remove_path(rel_path)
+                if status == "modified":
+                    use_committed = rel_path in local_changes
+                    manifest_items = get_manifest_items(tests_root,
+                                                        rel_path,
+                                                        url_base,
+                                                        use_committed=use_committed)
+                    self.extend(manifest_items)
+
+        self.local_changes = LocalChanges(self)
+
+        local_paths = set()
+        for rel_path, status in local_changes.iteritems():
+            local_paths.add(rel_path)
+
+            if status == "modified":
+                existing_items = self._committed_with_path(rel_path)
+                local_items = set(get_manifest_items(tests_root,
+                                                     rel_path,
+                                                     url_base,
+                                                     use_committed=False))
+
+                updated_items = local_items - existing_items
+                self.local_changes.extend(updated_items)
+            else:
+                self.local_changes.add_deleted(path)
+
+        if remove_missing_local:
+            for path in self._committed_paths() - local_paths:
+                self.local_changes.add_deleted(path)
+
+        if new_rev is not None:
+            self.rev = new_rev
+        self.url_base = url_base
+
+    def to_json(self):
+        out_items = {
+            item_type: sorted(
+                test.to_json()
+                for _, tests in items.iteritems()
+                for test in tests
+            )
+            for item_type, items in self._data.iteritems()
+        }
+
+        rv = {"url_base": self.url_base,
+              "rev": self.rev,
+              "local_changes": self.local_changes.to_json(),
+              "items": out_items}
+        return rv
+
+    @classmethod
+    def from_json(cls, obj):
+        self = cls(git_rev=obj["rev"],
+                   url_base=obj.get("url_base", "/"))
+        if not hasattr(obj, "iteritems"):
+            raise ManifestError
+
+        item_classes = {"testharness": TestharnessTest,
+                        "reftest": RefTest,
+                        "manual": ManualTest,
+                        "helper": Helper,
+                        "stub": Stub,
+                        "wdspec": WebdriverSpecTest}
+
+        for k, values in obj["items"].iteritems():
+            if k not in item_types:
+                raise ManifestError
+            for v in values:
+                manifest_item = item_classes[k].from_json(self, v)
+                self.add(manifest_item)
+        self.local_changes = LocalChanges.from_json(self, obj["local_changes"])
+        return self
+
+class LocalChanges(object):
+    def __init__(self, manifest):
+        self.manifest = manifest
+        self._data = dict((item_type, defaultdict(set)) for item_type in item_types)
+        self._deleted = set()
+
+    def add(self, item):
+        self._data[item.item_type][item.path].add(item)
+        item.manifest = self.manifest
+
+    def extend(self, items):
+        for item in items:
+            self.add(item)
+
+    def add_deleted(self, path):
+        self._deleted.add(path)
+
+    def is_deleted(self, path):
+        return path in self._deleted
+
+    def itertypes(self, *types):
+        for item_type in types:
+            yield item_type, self._data[item_type]
+
+    def iterdeleted(self):
+        for item in self._deleted:
+            yield item
+
+    def __getitem__(self, item_type):
+        return self._data[item_type]
+
+    def to_json(self):
+        rv = {"items": defaultdict(dict),
+              "deleted": []}
+
+        rv["deleted"].extend(self._deleted)
+
+        for test_type, paths in self._data.iteritems():
+            for path, tests in paths.iteritems():
+                rv["items"][test_type][path] = [test.to_json() for test in tests]
+
+        return rv
+
+    @classmethod
+    def from_json(cls, url_base, obj):
+        self = cls(url_base)
+        if not hasattr(obj, "iteritems"):
+            raise ManifestError
+
+        item_classes = {"testharness": TestharnessTest,
+                        "reftest": RefTest,
+                        "manual": ManualTest,
+                        "helper": Helper,
+                        "stub": Stub,
+                        "wdspec": WebdriverSpecTest}
+
+        for test_type, paths in obj["items"].iteritems():
+            for path, tests in paths.iteritems():
+                for test in tests:
+                    manifest_item = item_classes[test_type].from_json(self.manifest, test)
+                    self.add(manifest_item)
+
+        for item in obj["deleted"]:
+            self.add_deleted(item)
+
+        return self
+
+
+def get_ref(path):
+    base_path, filename = os.path.split(path)
+    name, ext = os.path.splitext(filename)
+    for suffix in ref_suffixes:
+        possible_ref = os.path.join(base_path, name + suffix + ext)
+        if os.path.exists(possible_ref):
+            return possible_ref
+
+
+def markup_type(ext):
+    if not ext:
+        return None
+    if ext[0] == ".":
+        ext = ext[1:]
+    if ext in ["html", "htm"]:
+        return "html"
+    elif ext in ["xhtml", "xht"]:
+        return "xhtml"
+    elif ext == "svg":
+        return "svg"
+    return None
+
+
+def get_timeout_meta(root):
+    return root.findall(".//{http://www.w3.org/1999/xhtml}meta[@name='timeout']")
+
+
+def get_testharness_scripts(root):
+    return root.findall(".//{http://www.w3.org/1999/xhtml}script[@src='/resources/testharness.js']")
+
+
+def get_reference_links(root):
+    match_links = root.findall(".//{http://www.w3.org/1999/xhtml}link[@rel='match']")
+    mismatch_links = root.findall(".//{http://www.w3.org/1999/xhtml}link[@rel='mismatch']")
+    return match_links, mismatch_links
+
+
+def get_file(base_path, rel_path, use_committed):
+    if use_committed:
+        git = get_git_func(os.path.dirname(__file__))
+        blob = git("show", "HEAD:%s" % rel_path)
+        file_obj = ContextManagerStringIO(blob)
+    else:
+        path = os.path.join(base_path, rel_path)
+        file_obj = open(path)
+    return file_obj
+
+class ContextManagerStringIO(StringIO):
+    def __enter__(self):
+        return self
+
+    def __exit__(self, *args, **kwargs):
+        self.close()
+
+def get_manifest_items(tests_root, rel_path, url_base, use_committed=False):
+    if os.path.isdir(rel_path):
+        return []
+
+    url = rel_path_to_url(rel_path, url_base)
+    path = os.path.join(tests_root, rel_path)
+
+    if not use_committed and not os.path.exists(path):
+        return []
+
+    dir_path, filename = os.path.split(path)
+    name, ext = os.path.splitext(filename)
+    rel_dir_tree = rel_path.split(os.path.sep)
+
+    file_markup_type = markup_type(ext)
+
+    if filename.startswith("MANIFEST") or filename.startswith("."):
+        return []
+
+    if is_blacklisted(url):
+        return []
+
+    if name.startswith("stub-"):
+        return [Stub(url)]
+
+    if name.lower().endswith("-manual"):
+        return [ManualTest(url)]
+
+    if filename.endswith(".worker.js"):
+        return [TestharnessTest(url[:-3])]
+
+    ref_list = []
+
+    for suffix in ref_suffixes:
+        if name.endswith(suffix):
+            return [Helper(url)]
+        elif os.path.exists(os.path.join(dir_path, name + suffix + ext)):
+            ref_url, ref_ext = url.rsplit(".", 1)
+            ref_url = ref_url + suffix + ext
+            #Need to check if this is the right reftype
+            ref_list = [RefTest(url, ref_url, "==")]
+
+    # wdspec tests are in subdirectories of /webdriver excluding __init__.py
+    # files.
+    if (rel_dir_tree[0] == "webdriver" and
+        len(rel_dir_tree) > 2 and
+        filename != "__init__.py" and
+        fnmatch(filename, wd_pattern)):
+        return [WebdriverSpecTest(rel_path)]
+
+    if file_markup_type:
+        timeout = None
+
+        parser = {"html":lambda x:html5lib.parse(x, treebuilder="etree"),
+                  "xhtml":ElementTree.parse,
+                  "svg":ElementTree.parse}[file_markup_type]
+
+        with get_file(tests_root, rel_path, use_committed) as f:
+            try:
+                tree = parser(f)
+            except:
+                return [Helper(url)]
+
+        if hasattr(tree, "getroot"):
+            root = tree.getroot()
+        else:
+            root = tree
+
+        timeout_nodes = get_timeout_meta(root)
+        if timeout_nodes:
+            timeout_str = timeout_nodes[0].attrib.get("content", None)
+            if timeout_str and timeout_str.lower() == "long":
+                try:
+                    timeout = timeout_str.lower()
+                except:
+                    pass
+
+        if get_testharness_scripts(root):
+            return [TestharnessTest(url, timeout=timeout)]
+        else:
+            match_links, mismatch_links = get_reference_links(root)
+            for item in match_links + mismatch_links:
+                ref_url = urlparse.urljoin(url, item.attrib["href"])
+                ref_type = "==" if item.attrib["rel"] == "match" else "!="
+                reftest = RefTest(url, ref_url, ref_type, timeout=timeout)
+                if reftest not in ref_list:
+                    ref_list.append(reftest)
+            return ref_list
+
+    return [Helper(url)]
+
+
+def abs_path(path):
+    return os.path.abspath(path)
+
+
+def chunks(data, n):
+    for i in range(0, len(data) - 1, n):
+        yield data[i:i+n]
+
+
+class TestTree(object):
+    def __init__(self, tests_root, url_base):
+        self.tests_root = tests_root
+        self.url_base = url_base
+
+    def current_rev(self):
+        pass
+
+    def local_changes(self):
+        pass
+