Added a new theme and plugins for a redesigned webkit.org.
authorjond@apple.com <jond@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 30 Nov 2015 22:21:57 +0000 (22:21 +0000)
committerjond@apple.com <jond@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 30 Nov 2015 22:21:57 +0000 (22:21 +0000)
Reviewed by Timothy Hatcher.

* apple-touch-icon-precomposed.png: Added.
* code-style.md: Added.
* commit-review.md: Added.
* favicon.png: Added.
* security-policy.md: Added.
* tabicon.svg: Added.
* wp-content: Added.
* wp-content/index.php: Added.
* wp-content/maintenance.php: Added.
* wp-content/plugins: Added.
* wp-content/plugins/analytics.php: Added.
* wp-content/plugins/hyperlight: Added.
* wp-content/plugins/hyperlight/hyperlight: Added.
* wp-content/plugins/hyperlight/hyperlight.php: Added.
* wp-content/plugins/hyperlight/hyperlight/hyperlight.php: Added.
* wp-content/plugins/hyperlight/hyperlight/languages: Added.
* wp-content/plugins/hyperlight/hyperlight/languages/apache.php: Added.
* wp-content/plugins/hyperlight/hyperlight/languages/blocklist.php: Added.
* wp-content/plugins/hyperlight/hyperlight/languages/code.php: Added.
* wp-content/plugins/hyperlight/hyperlight/languages/cpp.php: Added.
* wp-content/plugins/hyperlight/hyperlight/languages/csharp.php: Added.
* wp-content/plugins/hyperlight/hyperlight/languages/css.php: Added.
* wp-content/plugins/hyperlight/hyperlight/languages/diff.php: Added.
* wp-content/plugins/hyperlight/hyperlight/languages/filetypes: Added.
* wp-content/plugins/hyperlight/hyperlight/languages/html.php: Added.
* wp-content/plugins/hyperlight/hyperlight/languages/ini.php: Added.
* wp-content/plugins/hyperlight/hyperlight/languages/iphp.php: Added.
* wp-content/plugins/hyperlight/hyperlight/languages/javascript.php: Added.
* wp-content/plugins/hyperlight/hyperlight/languages/php.php: Added.
* wp-content/plugins/hyperlight/hyperlight/languages/python.php: Added.
* wp-content/plugins/hyperlight/hyperlight/languages/syntax.php: Added.
* wp-content/plugins/hyperlight/hyperlight/languages/vb.php: Added.
* wp-content/plugins/hyperlight/hyperlight/languages/xml.php: Added.
* wp-content/plugins/hyperlight/hyperlight/preg_helper.php: Added.
* wp-content/plugins/index.php: Added.
* wp-content/plugins/social-meta.php: Added.
* wp-content/plugins/table-of-contents.php: Added.
* wp-content/plugins/visual-preview.php: Added.
* wp-content/themes: Added.
* wp-content/themes/index.php: Added.
* wp-content/themes/webkit: Added.
* wp-content/themes/webkit/404.php: Added.
* wp-content/themes/webkit/444.php: Added.
* wp-content/themes/webkit/footer.php: Added.
* wp-content/themes/webkit/front-header.php: Added.
* wp-content/themes/webkit/front-page.php: Added.
* wp-content/themes/webkit/functions.php: Added.
* wp-content/themes/webkit/header.php: Added.
* wp-content/themes/webkit/images: Added.
* wp-content/themes/webkit/images/download.svg: Added.
* wp-content/themes/webkit/images/icons.svg: Added.
* wp-content/themes/webkit/images/inspector.svg: Added.
* wp-content/themes/webkit/images/menu-down.svg: Added.
* wp-content/themes/webkit/images/squirrelfish-lives.svg: Added.
* wp-content/themes/webkit/images/twitter.svg: Added.
* wp-content/themes/webkit/images/webkit.svg: Added.
* wp-content/themes/webkit/includes.php: Added.
* wp-content/themes/webkit/index.php: Added.
* wp-content/themes/webkit/loop.php: Added.
* wp-content/themes/webkit/nightly.php: Added.
* wp-content/themes/webkit/page.php: Added.
* wp-content/themes/webkit/scripts: Added.
* wp-content/themes/webkit/scripts/global.js: Added.
* wp-content/themes/webkit/single.php: Added.
* wp-content/themes/webkit/sitemap.php: Added.
* wp-content/themes/webkit/status.php: Added.
* wp-content/themes/webkit/style.css: Added.
* wp-content/themes/webkit/team.php: Added.
* wp-content/themes/webkit/widgets: Added.
* wp-content/themes/webkit/widgets/icon.php: Added.
* wp-content/themes/webkit/widgets/page.php: Added.
* wp-content/themes/webkit/widgets/post.php: Added.
* wp-content/themes/webkit/widgets/twitter.php: Added.

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

64 files changed:
Websites/webkit.org/ChangeLog
Websites/webkit.org/apple-touch-icon-precomposed.png [new file with mode: 0644]
Websites/webkit.org/code-style.md [new file with mode: 0644]
Websites/webkit.org/commit-review.md [new file with mode: 0644]
Websites/webkit.org/favicon.png [new file with mode: 0644]
Websites/webkit.org/security-policy.md [new file with mode: 0644]
Websites/webkit.org/tabicon.svg [new file with mode: 0644]
Websites/webkit.org/wp-content/index.php [new file with mode: 0644]
Websites/webkit.org/wp-content/maintenance.php [new file with mode: 0644]
Websites/webkit.org/wp-content/plugins/analytics.php [new file with mode: 0644]
Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight.php [new file with mode: 0644]
Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/hyperlight.php [new file with mode: 0644]
Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/apache.php [new file with mode: 0644]
Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/blocklist.php [new file with mode: 0644]
Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/code.php [new file with mode: 0644]
Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/cpp.php [new file with mode: 0644]
Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/csharp.php [new file with mode: 0644]
Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/css.php [new file with mode: 0644]
Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/diff.php [new file with mode: 0644]
Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/filetypes [new file with mode: 0644]
Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/html.php [new file with mode: 0644]
Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/ini.php [new file with mode: 0644]
Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/iphp.php [new file with mode: 0644]
Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/javascript.php [new file with mode: 0644]
Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/php.php [new file with mode: 0644]
Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/python.php [new file with mode: 0644]
Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/syntax.php [new file with mode: 0644]
Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/vb.php [new file with mode: 0644]
Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/xml.php [new file with mode: 0644]
Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/preg_helper.php [new file with mode: 0644]
Websites/webkit.org/wp-content/plugins/index.php [new file with mode: 0644]
Websites/webkit.org/wp-content/plugins/social-meta.php [new file with mode: 0644]
Websites/webkit.org/wp-content/plugins/table-of-contents.php [new file with mode: 0644]
Websites/webkit.org/wp-content/plugins/visual-preview.php [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/index.php [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/404.php [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/444.php [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/footer.php [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/front-header.php [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/front-page.php [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/functions.php [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/header.php [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/images/download.svg [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/images/icons.svg [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/images/inspector.svg [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/images/menu-down.svg [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/images/squirrelfish-lives.svg [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/images/twitter.svg [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/images/webkit.svg [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/includes.php [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/index.php [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/loop.php [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/nightly.php [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/page.php [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/scripts/global.js [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/single.php [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/sitemap.php [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/status.php [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/style.css [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/team.php [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/widgets/icon.php [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/widgets/page.php [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/widgets/post.php [new file with mode: 0644]
Websites/webkit.org/wp-content/themes/webkit/widgets/twitter.php [new file with mode: 0644]

index 379236c..57f3f42 100644 (file)
@@ -1,3 +1,83 @@
+2015-11-30  Jonathan Davis  <jond@apple.com>
+
+        Added a new theme and plugins for a redesigned webkit.org.
+
+        Reviewed by Timothy Hatcher.
+
+        * apple-touch-icon-precomposed.png: Added.
+        * code-style.md: Added.
+        * commit-review.md: Added.
+        * favicon.png: Added.
+        * security-policy.md: Added.
+        * tabicon.svg: Added.
+        * wp-content: Added.
+        * wp-content/index.php: Added.
+        * wp-content/maintenance.php: Added.
+        * wp-content/plugins: Added.
+        * wp-content/plugins/analytics.php: Added.
+        * wp-content/plugins/hyperlight: Added.
+        * wp-content/plugins/hyperlight/hyperlight: Added.
+        * wp-content/plugins/hyperlight/hyperlight.php: Added.
+        * wp-content/plugins/hyperlight/hyperlight/hyperlight.php: Added.
+        * wp-content/plugins/hyperlight/hyperlight/languages: Added.
+        * wp-content/plugins/hyperlight/hyperlight/languages/apache.php: Added.
+        * wp-content/plugins/hyperlight/hyperlight/languages/blocklist.php: Added.
+        * wp-content/plugins/hyperlight/hyperlight/languages/code.php: Added.
+        * wp-content/plugins/hyperlight/hyperlight/languages/cpp.php: Added.
+        * wp-content/plugins/hyperlight/hyperlight/languages/csharp.php: Added.
+        * wp-content/plugins/hyperlight/hyperlight/languages/css.php: Added.
+        * wp-content/plugins/hyperlight/hyperlight/languages/diff.php: Added.
+        * wp-content/plugins/hyperlight/hyperlight/languages/filetypes: Added.
+        * wp-content/plugins/hyperlight/hyperlight/languages/html.php: Added.
+        * wp-content/plugins/hyperlight/hyperlight/languages/ini.php: Added.
+        * wp-content/plugins/hyperlight/hyperlight/languages/iphp.php: Added.
+        * wp-content/plugins/hyperlight/hyperlight/languages/javascript.php: Added.
+        * wp-content/plugins/hyperlight/hyperlight/languages/php.php: Added.
+        * wp-content/plugins/hyperlight/hyperlight/languages/python.php: Added.
+        * wp-content/plugins/hyperlight/hyperlight/languages/syntax.php: Added.
+        * wp-content/plugins/hyperlight/hyperlight/languages/vb.php: Added.
+        * wp-content/plugins/hyperlight/hyperlight/languages/xml.php: Added.
+        * wp-content/plugins/hyperlight/hyperlight/preg_helper.php: Added.
+        * wp-content/plugins/index.php: Added.
+        * wp-content/plugins/social-meta.php: Added.
+        * wp-content/plugins/table-of-contents.php: Added.
+        * wp-content/plugins/visual-preview.php: Added.
+        * wp-content/themes: Added.
+        * wp-content/themes/index.php: Added.
+        * wp-content/themes/webkit: Added.
+        * wp-content/themes/webkit/404.php: Added.
+        * wp-content/themes/webkit/444.php: Added.
+        * wp-content/themes/webkit/footer.php: Added.
+        * wp-content/themes/webkit/front-header.php: Added.
+        * wp-content/themes/webkit/front-page.php: Added.
+        * wp-content/themes/webkit/functions.php: Added.
+        * wp-content/themes/webkit/header.php: Added.
+        * wp-content/themes/webkit/images: Added.
+        * wp-content/themes/webkit/images/download.svg: Added.
+        * wp-content/themes/webkit/images/icons.svg: Added.
+        * wp-content/themes/webkit/images/inspector.svg: Added.
+        * wp-content/themes/webkit/images/menu-down.svg: Added.
+        * wp-content/themes/webkit/images/squirrelfish-lives.svg: Added.
+        * wp-content/themes/webkit/images/twitter.svg: Added.
+        * wp-content/themes/webkit/images/webkit.svg: Added.
+        * wp-content/themes/webkit/includes.php: Added.
+        * wp-content/themes/webkit/index.php: Added.
+        * wp-content/themes/webkit/loop.php: Added.
+        * wp-content/themes/webkit/nightly.php: Added.
+        * wp-content/themes/webkit/page.php: Added.
+        * wp-content/themes/webkit/scripts: Added.
+        * wp-content/themes/webkit/scripts/global.js: Added.
+        * wp-content/themes/webkit/single.php: Added.
+        * wp-content/themes/webkit/sitemap.php: Added.
+        * wp-content/themes/webkit/status.php: Added.
+        * wp-content/themes/webkit/style.css: Added.
+        * wp-content/themes/webkit/team.php: Added.
+        * wp-content/themes/webkit/widgets: Added.
+        * wp-content/themes/webkit/widgets/icon.php: Added.
+        * wp-content/themes/webkit/widgets/page.php: Added.
+        * wp-content/themes/webkit/widgets/post.php: Added.
+        * wp-content/themes/webkit/widgets/twitter.php: Added.
+
 2015-11-18  Jonathan Davis  <jond@apple.com>
 
         Adding a maintenance file for the old WordPress blog.
diff --git a/Websites/webkit.org/apple-touch-icon-precomposed.png b/Websites/webkit.org/apple-touch-icon-precomposed.png
new file mode 100644 (file)
index 0000000..fc7cbdb
Binary files /dev/null and b/Websites/webkit.org/apple-touch-icon-precomposed.png differ
diff --git a/Websites/webkit.org/code-style.md b/Websites/webkit.org/code-style.md
new file mode 100644 (file)
index 0000000..afcd045
--- /dev/null
@@ -0,0 +1,1204 @@
+### Indentation
+
+Use spaces, not tabs. The indent size is 4 spaces. Tabs should only appear in files that require them for semantic meaning, like Makefiles.
+
+###### Right:
+
+```cpp
+int main()
+{
+    return 0;
+}
+```
+
+###### Wrong:
+
+```cpp
+int main() 
+{
+        return 0;
+}
+```
+
+The contents of an outermost `namespace` block (and any nested namespaces with the same scope) should not be indented. The contents of other nested namespaces should be indented.
+
+###### Right:
+
+```cpp
+// Document.h
+namespace WebCore {
+
+class Document {
+    Document();
+    ...
+};
+
+namespace NestedNamespace {
+    ...
+}
+
+} // namespace WebCore
+
+// Document.cpp
+namespace WebCore {
+
+Document::Document()
+{
+    ...
+}
+
+} // namespace WebCore
+```
+
+###### Wrong:
+
+```cpp
+// Document.h
+namespace WebCore {
+
+    class Document {
+        Document();
+        ...
+    };
+
+    namespace NestedNamespace {
+    ...
+    }
+
+} // namespace WebCore
+
+// Document.cpp
+namespace WebCore {
+
+    Document::Document()
+    {
+        ...
+    }
+
+} // namespace WebCore
+```
+
+
+A case label should line up with its switch statement. The case statement is indented.
+
+###### Right:
+
+```cpp
+switch (condition) {
+case fooCondition:
+case barCondition:
+    i++;
+    break;
+default:
+    i--;
+}
+```
+
+###### Wrong:
+
+```cpp
+switch (condition) {
+    case fooCondition:
+    case barCondition:
+        i++;
+        break;
+    default:
+        i--;
+}
+```
+
+
+Boolean expressions at the same nesting level that span multiple lines should have their operators on the left side of the line instead of the right side.
+
+###### Right:
+
+```cpp
+return attribute.name() == srcAttr
+        || attribute.name() == lowsrcAttr
+        || (attribute.name() == usemapAttr && attribute.value().string()[0] != '#');
+```
+
+
+###### Wrong:
+
+```cpp
+return attribute.name() == srcAttr ||
+        attribute.name() == lowsrcAttr ||
+        (attribute.name() == usemapAttr && attr->value().string()[0] != '#');
+```
+
+
+### Spacing
+
+Do not place spaces around unary operators.
+
+###### Right:
+
+```cpp
+i++;
+```
+
+
+###### Wrong:
+
+```cpp
+i ++;
+```
+
+
+**Do** place spaces around binary and ternary operators.
+
+###### Right:
+
+```cpp
+y = m * x + b;
+f(a, b);
+c = a | b;
+return condition ? 1 : 0;
+```
+
+###### Wrong:
+
+```cpp
+y=m*x+b;
+f(a,b);
+c = a|b;
+return condition ? 1:0;
+```
+
+
+Place spaces around the colon in a range-based for loop.
+
+###### Right:
+
+```cpp
+Vector<PluginModuleInfo> plugins;
+for (auto& plugin : plugins)
+    registerPlugin(plugin);
+```
+
+###### Wrong:
+
+```cpp
+Vector<PluginModuleInfo> plugins;
+for (auto& plugin: plugins)
+    registerPlugin(plugin);
+```
+
+
+Do not place spaces before comma and semicolon.
+
+###### Right:
+
+```cpp
+for (int i = 0; i < 10; ++i)
+    doSomething();
+
+f(a, b);
+```
+
+###### Wrong:
+
+```cpp
+for (int i = 0 ; i < 10 ; ++i)
+    doSomething();
+
+f(a , b) ;
+```
+
+
+Place spaces between control statements and their parentheses.
+
+###### Right:
+
+```cpp
+if (condition)
+    doIt();
+```
+
+###### Wrong:
+
+```cpp
+if(condition)
+    doIt();
+```
+
+
+Do not place spaces between a function and its parentheses, or between a parenthesis and its content.
+
+###### Right:
+
+```cpp
+f(a, b);
+```
+
+###### Wrong:
+
+```cpp
+f (a, b);
+f( a, b );
+```
+
+### Line breaking
+
+Each statement should get its own line.
+
+###### Right:
+
+```cpp
+x++;
+y++;
+if (condition)
+    doIt();
+```
+
+###### Wrong:
+
+```cpp
+x++; y++;
+if (condition) doIt();
+```
+
+An `else` statement should go on the same line as a preceding close brace if one is present, else it should line up with the `if` statement.
+
+###### Right:
+
+```cpp
+if (condition) {
+    ...
+} else {
+    ...
+}
+
+if (condition)
+    doSomething();
+else
+    doSomethingElse();
+
+if (condition)
+    doSomething();
+else {
+    ...
+}
+```
+
+###### Wrong:
+
+```cpp
+if (condition) {
+    ...
+}
+else {
+    ...
+}
+
+if (condition) doSomething(); else doSomethingElse();
+
+if (condition) doSomething(); else {
+    ...
+}
+```
+
+
+An `else if` statement should be written as an `if` statement when the prior `if` concludes with a `return` statement.
+
+###### Right:
+
+```cpp
+if (condition) {
+    ...
+    return someValue;
+}
+if (condition) {
+    ...
+}
+```
+
+###### Wrong:
+
+```cpp
+if (condition) {
+    ...
+    return someValue;
+} else if (condition) {
+    ...
+}
+```
+
+### Braces
+
+Function definitions: place each brace on its own line.
+
+###### Right:
+
+```cpp
+int main()
+{
+    ...
+}
+```
+
+###### Wrong:
+
+```cpp
+int main() {
+    ...
+}
+```
+
+Other braces: place the open brace on the line preceding the code block; place the close brace on its own line.
+
+###### Right:
+
+```cpp
+class MyClass {
+    ...
+};
+
+namespace WebCore {
+    ...
+}
+
+for (int i = 0; i < 10; ++i) {
+    ...
+}
+```
+
+###### Wrong:
+
+```cpp
+class MyClass 
+{
+    ...
+};
+```
+
+One-line control clauses should not use braces unless comments are included or a single statement spans multiple lines.
+
+###### Right:
+
+```cpp
+if (condition)
+    doIt();
+
+if (condition) {
+    // Some comment
+    doIt();
+}
+
+if (condition) {
+    myFunction(reallyLongParam1, reallyLongParam2, ...
+        reallyLongParam5);
+}
+```
+
+###### Wrong:
+
+```cpp
+if (condition) {
+    doIt();
+}
+
+if (condition)
+    // Some comment
+    doIt();
+
+if (condition)
+    myFunction(reallyLongParam1, reallyLongParam2, ...
+        reallyLongParam5);
+```
+
+
+Control clauses without a body should use empty braces:
+
+###### Right:
+
+```cpp
+for ( ; current; current = current->next) { }
+```
+
+###### Wrong:
+
+```cpp
+for ( ; current; current = current->next);
+```
+
+### Null, false and zero
+
+In C++, the null pointer value should be written as `nullptr`. In C, it should be written as `NULL`. In Objective-C and Objective-C++, follow the guideline for C or C++, respectively, but use `nil` to represent a null Objective-C object.
+
+C++ and C `bool` values should be written as `true` and `false`. Objective-C `BOOL` values should be written as `YES` and `NO`.
+
+Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.
+
+###### Right:
+
+```cpp
+if (condition)
+    doIt();
+
+if (!ptr)
+    return;
+
+if (!count)
+    return;
+```
+
+###### Wrong:
+
+```cpp
+if (condition == true)
+    doIt();
+
+if (ptr == NULL)
+    return;
+
+if (count == 0)
+    return;
+```
+
+In Objective-C, instance variables are initialized to zero automatically. Don't add explicit initializations to nil or NO in an init method.
+
+### Floating point literals
+
+Unless required in order to force floating point math, do not append `.0`, `.f` and `.0f` to floating point literals.
+
+###### Right:
+
+```cpp
+const double duration = 60;
+
+void setDiameter(float diameter)
+{
+    radius = diameter / 2;
+}
+
+setDiameter(10);
+
+const int framesPerSecond = 12;
+double frameDuration = 1.0 / framesPerSecond;
+```
+
+###### Wrong:
+
+```cpp
+const double duration = 60.0;
+
+void setDiameter(float diameter)
+{
+    radius = diameter / 2.f;
+}
+
+setDiameter(10.f);
+
+const int framesPerSecond = 12;
+double frameDuration = 1 / framesPerSecond; // integer division
+```
+
+### Names
+
+Use CamelCase. Capitalize the first letter, including all letters in an acronym, in a class, struct, protocol, or namespace name. Lower-case the first letter, including all letters in an acronym, in a variable or function name.
+
+###### Right:
+
+```cpp
+struct Data;
+size_t bufferSize;
+class HTMLDocument;
+String mimeType();
+```
+
+###### Wrong:
+
+```cpp
+struct data;
+size_t buffer_size;
+class HtmlDocument;
+String MIMEType();
+```
+
+Use full words, except in the rare case where an abbreviation would be more canonical and easier to understand.
+
+###### Right:
+
+```cpp
+size_t characterSize;
+size_t length;
+short tabIndex; // more canonical
+```
+
+###### Wrong:
+
+```cpp
+size_t charSize;
+size_t len;
+short tabulationIndex; // bizarre
+```
+
+Data members in C++ classes should be private. Static data members should be prefixed by "s_". Other data members should be prefixed by "m_".
+
+###### Right:
+
+```cpp
+class String {
+public:
+    ...
+
+private:
+    short m_length;
+};
+```
+
+###### Wrong:
+
+```cpp
+class String {
+public:
+    ...
+
+    short length;
+};
+```
+
+Prefix Objective-C instance variables with "_".
+
+###### Right:
+
+```cpp
+@class String
+    ...
+    short _length;
+@end
+```
+
+###### Wrong:
+
+```cpp
+@class String
+    ...
+    short length;
+@end
+```
+
+Precede boolean values with words like "is" and "did".
+
+###### Right:
+
+```cpp
+bool isValid;
+bool didSendData;
+```
+
+###### Wrong:
+
+```cpp
+bool valid;
+bool sentData;
+```
+
+Precede setters with the word "set". Use bare words for getters. Setter and getter names should match the names of the variables being set/gotten.
+
+###### Right:
+
+```cpp
+void setCount(size_t); // sets m_count
+size_t count(); // returns m_count
+```
+
+###### Wrong:
+
+```cpp
+void setCount(size_t); // sets m_theCount
+size_t getCount();
+```
+
+Precede getters that return values through out arguments with the word "get".
+
+###### Right:
+
+```cpp
+void getInlineBoxAndOffset(InlineBox*&, int& caretOffset) const;
+```
+
+###### Wrong:
+
+```cpp
+void inlineBoxAndOffset(InlineBox*&, int& caretOffset) const;
+```
+
+Use descriptive verbs in function names.
+
+###### Right:
+
+```cpp
+bool convertToASCII(short*, size_t);
+```
+
+###### Wrong:
+
+```cpp
+bool toASCII(short*, size_t);
+```
+
+Leave meaningless variable names out of function declarations. A good rule of thumb is if the parameter type name contains the parameter name (without trailing numbers or pluralization), then the parameter name isn't needed. Usually, there should be a parameter name for bools, strings, and numerical types.
+
+###### Right:
+
+```cpp
+void setCount(size_t);
+
+void doSomething(ScriptExecutionContext*);
+```
+
+###### Wrong:
+
+```cpp
+void setCount(size_t count);
+
+void doSomething(ScriptExecutionContext* context);
+```
+
+Prefer enums to bools on function parameters if callers are likely to be passing constants, since named constants are easier to read at the call site. An exception to this rule is a setter function, where the name of the function already makes clear what the boolean is.
+
+###### Right:
+
+```cpp
+doSomething(something, AllowFooBar);
+paintTextWithShadows(context, ..., textStrokeWidth > 0, isHorizontal());
+setResizable(false);
+```
+
+###### Wrong:
+
+```cpp
+doSomething(something, false);
+setResizable(NotResizable);
+```
+
+Objective-C method names should follow the Cocoa naming guidelines — they should read like a phrase and each piece of the selector should start with a lowercase letter and use intercaps.
+
+Enum members should use InterCaps with an initial capital letter.
+
+Prefer `const` to `#define`. Prefer inline functions to macros.
+
+`#defined` constants should use all uppercase names with words separated by underscores.
+
+Macros that expand to function calls or other non-constant computation: these should be named like functions, and should have parentheses at the end, even if they take no arguments (with the exception of some special macros like ASSERT). Note that usually it is preferable to use an inline function in such cases instead of a macro.
+
+###### Right:
+
+```cpp
+#define WBStopButtonTitle() \
+        NSLocalizedString(@"Stop", @"Stop button title")
+```
+
+###### Wrong:
+
+```cpp
+#define WB_STOP_BUTTON_TITLE \
+        NSLocalizedString(@"Stop", @"Stop button title")
+
+#define WBStopButtontitle \
+        NSLocalizedString(@"Stop", @"Stop button title")
+```
+
+`#define`, `#ifdef` "header guards" should be named exactly the same as the file (including case), replacing the `.` with a `_`.
+
+###### Right:
+
+```cpp
+// HTMLDocument.h
+#ifndef HTMLDocument_h
+#define HTMLDocument_h
+```
+
+###### Wrong:
+
+```cpp
+// HTMLDocument.h
+#ifndef _HTML_DOCUMENT_H_
+#define _HTML_DOCUMENT_H_
+```
+
+### Other Punctuation
+
+Constructors for C++ classes should initialize all of their members using C++ initializer syntax. Each member (and superclass) should be indented on a separate line, with the colon or comma preceding the member on that line.
+
+###### Right:
+
+```cpp
+MyClass::MyClass(Document* document)
+    : MySuperClass()
+    , m_myMember(0)
+    , m_document(document)
+{
+}
+
+MyOtherClass::MyOtherClass()
+    : MySuperClass()
+{
+}
+```
+
+###### Wrong:
+
+```cpp
+MyClass::MyClass(Document* document) : MySuperClass()
+{
+    m_myMember = 0;
+    m_document = document;
+}
+
+MyOtherClass::MyOtherClass() : MySuperClass() {}
+```
+
+Prefer index over iterator in Vector iterations for terse, easier-to-read code.
+
+###### Right:
+
+```cpp
+for (auto& frameView : frameViews)
+        frameView->updateLayoutAndStyleIfNeededRecursive();
+```
+
+
+#### OK:
+
+```cpp
+unsigned frameViewsCount = frameViews.size();
+for (unsigned i = 0; i < frameViewsCount; ++i)
+    frameViews[i]->updateLayoutAndStyleIfNeededRecursive();
+```
+
+###### Wrong:
+
+```cpp
+const Vector<RefPtr<FrameView> >::iterator end = frameViews.end();
+for (Vector<RefPtr<FrameView> >::iterator it = frameViews.begin(); it != end; ++it)
+    (*it)->updateLayoutAndStyleIfNeededRecursive();
+```
+
+### Pointers and References
+
+**Pointer types in non-C++ code**
+Pointer types should be written with a space between the type and the `*` (so the `*` is adjacent to the following identifier if any).
+
+**Pointer and reference types in C++ code**
+Both pointer types and reference types should be written with no space between the type name and the `*` or `&`.
+
+###### Right:
+
+```cpp
+Image* SVGStyledElement::doSomething(PaintInfo& paintInfo)
+{
+    SVGStyledElement* element = static_cast<SVGStyledElement*>(node());
+    const KCDashArray& dashes = dashArray();
+```
+
+###### Wrong:
+
+```cpp
+Image *SVGStyledElement::doSomething(PaintInfo &paintInfo)
+{
+    SVGStyledElement *element = static_cast<SVGStyledElement *>(node());
+    const KCDashArray &dashes = dashArray();
+```
+
+
+An out argument of a function should be passed by reference except rare cases where it is optional in which case it should be passed by pointer.
+
+###### Right:
+
+```cpp
+void MyClass::getSomeValue(OutArgumentType& outArgument) const
+{
+    outArgument = m_value;
+}
+
+void MyClass::doSomething(OutArgumentType* outArgument) const
+{
+    doSomething();
+    if (outArgument)
+        *outArgument = m_value;
+}
+```
+
+###### Wrong:
+
+```cpp
+void MyClass::getSomeValue(OutArgumentType* outArgument) const
+{
+    *outArgument = m_value;
+}
+```
+
+
+### #include Statements
+
+All implementation files must `#include` `config.h` first. Header files should never include `config.h`.
+
+###### Right:
+
+```cpp
+// RenderLayer.h
+#include "Node.h"
+#include "RenderObject.h"
+#include "RenderView.h"
+```
+
+###### Wrong:
+
+```cpp
+// RenderLayer.h
+#include "config.h"
+
+#include "RenderObject.h"
+#include "RenderView.h"
+#include "Node.h"
+```
+
+All implementation files must `#include` the primary header second, just after `config.h`. So for example, `Node.cpp` should include `Node.h` first, before other files. This guarantees that each header's completeness is tested. This also assures that each header can be compiled without requiring any other header files be included first.
+
+Other `#include` statements should be in sorted order (case sensitive, as done by the command-line sort tool or the Xcode sort selection command). Don't bother to organize them in a logical order.
+
+###### Right:
+
+```cpp
+// HTMLDivElement.cpp
+#include "config.h"
+#include "HTMLDivElement.h"
+
+#include "Attribute.h"
+#include "HTMLElement.h"
+#include "QualifiedName.h"
+```
+
+###### Wrong:
+
+```cpp
+// HTMLDivElement.cpp
+#include "HTMLElement.h"
+#include "HTMLDivElement.h"
+#include "QualifiedName.h"
+#include "Attribute.h"
+```
+
+
+Includes of system headers must come after includes of other headers.
+
+###### Right:
+
+```cpp
+// ConnectionQt.cpp
+#include "ArgumentEncoder.h"
+#include "ProcessLauncher.h"
+#include "WebPageProxyMessageKinds.h"
+#include "WorkItem.h"
+#include <QApplication>
+#include <QLocalServer>
+#include <QLocalSocket>
+```
+
+###### Wrong:
+
+```cpp
+// ConnectionQt.cpp
+#include "ArgumentEncoder.h"
+#include "ProcessLauncher.h"
+#include <QApplication>
+#include <QLocalServer>
+#include <QLocalSocket>
+#include "WebPageProxyMessageKinds.h"
+#include "WorkItem.h"
+```
+
+### "using" Statements
+
+In header files, do not use "using" statements in namespace (or global) scope.
+
+###### Right:
+
+```cpp
+// wtf/Vector.h
+
+namespace WTF {
+
+class VectorBuffer {
+    using std::min;
+    ...
+};
+
+} // namespace WTF
+```
+
+###### Wrong:
+
+```cpp
+// wtf/Vector.h
+
+namespace WTF {
+
+using std::min;
+
+class VectorBuffer {
+    ...
+};
+
+} // namespace WTF
+```
+
+
+In header files in the WTF sub-library, however, it is acceptable to use "using" declarations at the end of the file to import one or more names in the WTF namespace into the global scope.
+
+###### Right:
+
+```cpp
+// wtf/Vector.h
+
+namespace WTF {
+
+} // namespace WTF
+
+using WTF::Vector;
+```
+
+###### Wrong:
+
+```cpp
+// wtf/Vector.h
+
+namespace WTF {
+
+} // namespace WTF
+
+using namespace WTF;
+```
+
+###### Wrong:
+
+```cpp
+// runtime/JSObject.h
+
+namespace WTF {
+
+} // namespace WTF
+
+using WTF::PlacementNewAdopt;
+```
+
+
+In C++ implementation files, do not use "using" declarations of any kind to import names in the standard template library. Directly qualify the names at the point they're used instead.
+
+###### Right:
+
+```cpp
+// HTMLBaseElement.cpp
+
+namespace WebCore {
+
+  std::swap(a, b);
+  c = std::numeric_limits<int>::max()
+
+} // namespace WebCore
+```
+
+###### Wrong:
+
+```cpp
+// HTMLBaseElement.cpp
+
+using std::swap;
+
+namespace WebCore {
+
+  swap(a, b);
+
+} // namespace WebCore
+```
+
+###### Wrong:
+
+```cpp
+// HTMLBaseElement.cpp
+
+using namespace std;
+
+namespace WebCore {
+
+  swap(a, b);
+
+} // namespace WebCore
+```
+
+
+In implementation files, if a "using namespace" statement is for a nested namespace whose parent namespace is defined in the file, put the statement inside that namespace definition.
+
+###### Right:
+
+```cpp
+// HTMLBaseElement.cpp
+
+namespace WebCore {
+
+using namespace HTMLNames;
+
+} // namespace WebCore
+```
+
+###### Wrong:
+
+```cpp
+// HTMLBaseElement.cpp
+
+using namespace WebCore::HTMLNames;
+
+namespace WebCore {
+
+} // namespace WebCore
+```
+
+
+In implementation files, put all other "using" statements at the beginning of the file, before any namespace definitions and after any "include" statements.
+
+###### Right:
+
+```cpp
+// HTMLSelectElement.cpp
+
+using namespace other;
+
+namespace WebCore {
+
+} // namespace WebCore
+```
+
+###### Wrong:
+
+```cpp
+// HTMLSelectElement.cpp
+
+namespace WebCore {
+
+using namespace other;
+
+} // namespace WebCore
+```
+
+### Types
+
+Omit "int" when using "unsigned" modifier. Do not use "signed" modifier. Use "int" by itself instead.
+
+###### Right:
+
+```cpp
+unsigned a;
+int b;
+```
+
+###### Wrong:
+
+```cpp
+unsigned int a; // Doesn't omit "int".
+signed b; // Uses "signed" instead of "int".
+signed int c; // Doesn't omit "signed".
+```
+
+### Classes
+
+Use a constructor to do an implicit conversion when the argument is reasonably thought of as a type conversion and the type conversion is fast. Otherwise, use the explicit keyword or a function returning the type. This only applies to single argument constructors.
+
+###### Right:
+
+```cpp
+class LargeInt {
+public:
+    LargeInt(int);
+...
+
+class Vector {
+public:
+    explicit Vector(int size); // Not a type conversion.
+    Vector create(Array); // Costly conversion.
+...
+
+```
+
+###### Wrong:
+
+```cpp
+class Task {
+public:
+    Task(ScriptExecutionContext&); // Not a type conversion.
+    explicit Task(); // No arguments.
+    explicit Task(ScriptExecutionContext&, Other); // More than one argument.
+...
+```
+
+### Singleton pattern
+
+Use a static member function named "singleton()" to access the instance of the singleton.
+
+###### Right:
+
+```cpp
+class MySingleton {
+public:
+    static MySingleton& singleton();
+...
+```
+
+###### Wrong:
+
+```cpp
+class MySingleton {
+public:
+    static MySingleton& shared();
+...
+```
+
+###### Wrong:
+
+```cpp
+class MySingleton {
+...
+};
+
+MySingleton& mySingleton(); // free function.
+```
+
+### Comments
+
+Use only _one_ space before end of line comments and in between sentences in comments.
+
+###### Right:
+
+```cpp
+f(a, b); // This explains why the function call was done. This is another sentence.
+```
+
+###### Wrong:
+
+```cpp
+int i;    // This is a comment with several spaces before it, which is a non-conforming style.
+double f; // This is another comment.  There are two spaces before this sentence which is a non-conforming style.
+```
+
+Make comments look like sentences by starting with a capital letter and ending with a period (punctation). One exception may be end of line comments like this `if (x == y) // false for NaN`.
+
+Use FIXME: (without attribution) to denote items that need to be addressed in the future.
+
+###### Right:
+
+```cpp
+drawJpg(); // FIXME: Make this code handle jpg in addition to the png support.
+```
+
+###### Wrong:
+
+```cpp
+drawJpg(); // FIXME(joe): Make this code handle jpg in addition to the png support.
+```
+
+```cpp
+drawJpg(); // TODO: Make this code handle jpg in addition to the png support.
+```
\ No newline at end of file
diff --git a/Websites/webkit.org/commit-review.md b/Websites/webkit.org/commit-review.md
new file mode 100644 (file)
index 0000000..6bbd0d8
--- /dev/null
@@ -0,0 +1,53 @@
+The WebKit project has two kinds of special status beyond being a contributor. WebKit Committers have direct read-write access to the Subversion repository, enabling them to commit changes by themselves or reviewed changes by others if authors ask committers to do so. WebKit Reviewers are permitted to review patches and may grant or deny approval for committing. Details of the review and commit process are available on the [contribution page](http://webkit.org/coding/contributing.html).
+
+New WebKit Committers and WebKit Reviewers will be selected by the set of existing WebKit Reviewers. We will create a mailing list, &lt;[webkit-reviewers@lists.webkit.org](mailto:webkit-reviewers@lists.webkit.org)&gt;, for this purpose.
+
+An up to date list of current WebKit Committers and WebKit Reviewers will be maintained at webkit.org.
+
+## Choosing Committers and Reviewers
+
+A candidate for WebKit Committer or WebKit Reviewer should initially be nominated by a reviewer on the reviewers mailing list, in accordance with the criteria below. If the required reviewers (see below) second the nomination, then it carries within 5 business days unless someone objects. If an objection is raised, the reviewers should discuss the matter and try to come to consensus; failing this, the matter will be decided by majority vote of the reviewers.
+
+Once someone is successfully nominated for WebKit Committer status, Apple will take care of sending the committer agreement and setting up a Subversion account once signed and received.
+
+Once someone is successfully nominated for WebKit Reviewer status, the nominating Reviewer or another responsible party should inform the candidate and ask for indication of acceptance from the potential new reviewer. If the candidate accepts, [contributors.json](http://trac.webkit.org/browser/trunk/Tools/Scripts/webkitpy/common/config/contributors.json) will be updated.
+
+## Criteria for Committers
+
+A WebKit Committer should be a person we can trust to follow and understand the project policies about checkins and other matters.
+
+Normally a potential Committer would be nominated once they have submitted around 10-20 good patches, shown good judgment and understanding of project policies, and demonstrated good collaboration skills. To be nominated and seconded, they will have to interact with more than one project reviewer. If someone submits many patches but does not show good judgment or effective collaboration, that contributor might not be nominated right away. If someone submits fewer patches than this but has experience working in another WebKit-based or khtml-based engine and has a track record of good collaboration with the WebKit project, they may be nominated sooner.
+
+Significant contributors to testing, bug management, web site content, documentation, project infrastructure and other non-code areas may also be nominated, even without the normal threshold of patches.
+
+A person who will be working under the supervision of a WebKit reviewer on WebKit-related projects can be nominated if the reviewer is willing to vouch for them and supervise them to ensure they follow project policies on checkins. Supervision does not necessarily imply a manager/employee relationship, just that you work with the potential committer closely enough to make sure they follow policy and work well with others.
+
+All committer nominations require the support of three reviewers. One reviewer nominates, two others second the nomination.
+
+## Criteria for Reviewers
+
+A WebKit Reviewer should be a person who has shown particularly good judgment, understanding of project policies, collaboration skills, and understanding of the code. Reviewers are expected to ensure that patches they review follow project policies, and to do their best to check for bugs or other problems with the patch. They are also expected to show good judgment in whether or not they review a patch at all, or defer to another reviewer.
+
+A potential Reviewer may be nominated once they have submitted a minimum of 80 good patches. They should also be in touch with other reviewers and aware of who are the experts in various areas.
+
+A person who submits many patches but does not show good collaboration skills, code understanding or understanding of project policies may never be nominated. Making unofficial reviews before you become a reviewer is encouraged. This is an excellent way to show your skills. Note that you should not put r+ nor r- on patches in such unofficial reviews.
+
+For Reviewer status, there is no supervision exception.
+
+All reviewer nominations require the support of four reviewers. One reviewer nominates, three reviewers second.
+
+## Inactive Committer or Reviewer Status
+
+A WebKit Committer or Reviewer that has not been active in the project for over a year is considered inactive. Activity for this purpose is defined as landing at least one patch in the past year. Reviewers who have reviewed a patch in the past year will also be considered active.
+
+Inactive Committers can regain Active Committer status by landing (via the Commit Queue) a non-trivial patch and asking on webkit-committers for a return to Active status.
+
+Inactive Reviewers need to show that they are making an effort to get familiar with the changes that have happened in the project since they were last active by landing at least 3 non-trivial patches. Once they have landed the patches, they need to send an email requesting reactivation to webkit-reviewers. This request needs the support of 2 Active Reviewers to be granted.
+
+Note that regardless of a Committer or Reviewer's activity status, any subversion account that has not been used in the past year will be deactivated for security purposes. For example, a Reviewer that has reviewed a patch in the past year but has not committed may have their subversion account deactivated. To reactivate a deactivated subversion account, an Active Committer or Active Reviewer can send an email to webkit-committers requesting it.
+
+## Suspension and Revocation of Committer or Reviewer Status
+
+WebKit Committer or WebKit Reviewer status can be revoked by 2/3 vote of the reviewers, not including the person under consideration for revocation.
+
+Someone actively damaging the repository or intentionally abusing their review privilege may have it temporarily suspended on the request of any two Reviewers. In such a case, the requesting Reviewers should notify the webkit-reviewers list with a description of the offense. At this point, Reviewer or Committer status will be temporarily suspended for one week, pending outcome of the vote for permanent revocation.
\ No newline at end of file
diff --git a/Websites/webkit.org/favicon.png b/Websites/webkit.org/favicon.png
new file mode 100644 (file)
index 0000000..aeaf3d2
Binary files /dev/null and b/Websites/webkit.org/favicon.png differ
diff --git a/Websites/webkit.org/security-policy.md b/Websites/webkit.org/security-policy.md
new file mode 100644 (file)
index 0000000..2596246
--- /dev/null
@@ -0,0 +1,41 @@
+### How To Report Security Bugs
+
+1. **Reporting an issue:** Start by filing a bug in the Security product in the WebKit bug database, at [https://bugs.webkit.org](https://bugs.webkit.org). Bugs in the Security product will have special access controls that restrict who can view and alter the bug; only members of the WebKit Security Group and the originator will have access to the bug.
+2. **Scope of disclosure:** If you would like to limit further dissemination of the information in the bug report, please say so in the bug. Otherwise the WebKit Security Group may share information with other vendors if we find they may be affected by the same vulnerability. The WebKit Security Group will handle the information you provide responsibly. See the other sections of this document for details.
+3. **Getting feedback:** We cannot guarantee a prompt human response to every security bug filed. If you would like immediate feedback on a security issue, or would like to discuss details with members of the WebKit Security Group, please email [security@webkit.org](mailto:security@webkit.org) and include a link to the relevant Bugzilla bug. Your message will be acknowledged within a week at most.
+
+The current member list will be published at [http://webkit.org/security/security-group-members.html](security-group-members.html).
+
+### How To Join the WebKit Security Group
+
+1. **Criteria:** Nominees for WebKit Security Group membership should meet at least one of the following criteria:  
+    Individuals:
+    - The nominee specializes in fixing WebKit security related bugs or often participates in their exploration and resolution.
+    - The nominee has a track record of finding security vulnerabilities and responsible disclosure of those vulnerabilities.
+    - The nominee is a web technology expert who has specific interests in knowing about, resolving, and preventing future security vulnerabilities.Vendor contacts:
+    - The nominee represents an organization or company which ships products that include their own copy of WebKit. Due to their position in the organization, the nominee has a reasonable need to know about security issues and disclosure embargoes.
+2. **Nomination process:** Anyone who feels they meet these criteria can nominate themselves by mailing [security@webkit.org](mailto:security@webkit.org), or may be nominated by a third party such as an existing WebKit Security Group member. The nomination email should state whether the nominee is nominated as an individual or as a vendor contact and clearly describe the grounds for nomination.
+3. **Choosing new members:** If a nomination for Security Group membership is supported by at least three existing Security Group members (either one initial nomination and two seconds, or in the case of self-nomination, three seconds), then it carries within 5 business days unless an existing member of the Security Group objects. If an objection is raised, the WebKit Security Group members should discuss the matter and try to come to consensus; failing this, the nomination will succeed only by majority vote of the WebKit Security Group. After a vote is called for on the mailing list, voting will be open for 5 business days.
+4. **Accepting membership:** Before new WebKit Security Group membership is finalized, the successful nominee should accept membership and agree to abide by this security policy, particularly Privileges and Responsibilities of WebKit Security Group members.
+5. **Duration of membership:** Vendor contacts will only remain members as long as their position with that vendor remains the same. Individuals will remain members indefinitely until they resign or their membership is terminated.
+
+### Privileges and Responsibilities of WebKit Security Group Members
+
+- **Access:** WebKit Security Group members will be subscribed to a private mailing list, [security@webkit.org](mailto:security@webkit.org). It will be used for technical discussions of security bugs, as well as process discussions about matters such as disclosure timelines and group membership. Members will also have access to all bugs in the Security product in the WebKit bug database.
+- **Confidentiality:** Members of the WebKit Security Group will be expected to treat WebKit security vulnerability information shared with the group as confidential until publicly disclosed:
+    - Members should not disclose Security bug information to non-members unless the member is employed by the vendor of a WebKit based product, in which case information can be shared within that organization on a need-to-know basis and handled as confidential information normally is within that organization. The one exception to this rule is that members may share vulnerabilities with vendors of non-WebKit based products if their product suffers from the same issue and the reporter has not explicitly requested this not be done. The non-WebKit vendor should be asked to respect the issue's embargo date, and to not share the information beyond the need-to-know people within their organization.
+    - Members should not post any information about Security bugs in public forums.
+- **Disclosure:** The WebKit Security Group will negotiate an embargo date for public disclosure for each new Security bug, with a default minimum time limit of 60 days. An embargo may be lifted before the agreed-upon date if all vendors planning to ship a fix have already done so, and if the reporter does not object. The agreed-upon embargo date will be communicated to the reporter through the bug at [https://bugs.webkit.org](https://bugs.webkit.org).
+- **Collaboration:** Members of the WebKit Security Group are expected to promptly share any WebKit vulnerabilities they become aware of. The best way to do this is by filing bugs against the Security product in the WebKit bug database.
+
+### Termination of WebKit Security Group Membership
+
+- Members of the WebKit Security Group may voluntarily end their membership at any time, for any reason.
+- Inactive members who are no longer reachable via e-mail at the address associated with their group membership will be removed from the WebKit Security Group.
+- A member who joined the group as a vendor contact who is no longer associated with that vendor will be removed from the WebKit Security Group. The person may be re-nominated as an individual expert or as a vendor contact for another organization.
+- If a member of the WebKit Security Group does not act in accordance with the letter and spirit of this policy, then their WebKit Security Group membership can be revoked by a majority vote of the members, not including the person under consideration for revocation. After a member calls for a revocation vote on the mailing list, voting will be open for 5 business days.
+    - **Emergency suspension:** A WebKit Security Group member who blatantly disregards the WebKit Security Policy may have their membership temporarily suspended on the request of any two members. In such a case, the requesting members should notify the security mailing list with a description of the offense. At this point, membership will be temporarily suspended for one week, pending outcome of the vote for permanent revocation.
+
+### Changes to the Policy
+
+The WebKit Security Policy may be changed in the future by rough consensus of the WebKit Security Group. Changes to the policy will be posted publicly.
\ No newline at end of file
diff --git a/Websites/webkit.org/tabicon.svg b/Websites/webkit.org/tabicon.svg
new file mode 100644 (file)
index 0000000..ce3dfa7
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright © 2015 Apple Inc. All rights reserved. -->
+<svg viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg">
+    <path d="M 1.857 19.227 C 1.647 19.681 1.537 20.165 1.537 20.662 C 1.537 21.782 2.094 22.832 3.089 23.607 L 12.3 30.804 C 13.298 31.571 14.602 31.992 15.986 31.992 C 17.375 31.992 18.678 31.568 19.671 30.792 L 28.882 23.594 C 29.877 22.819 30.434 21.77 30.434 20.65 C 30.434 20.16 30.327 19.683 30.123 19.236 C 29.94 19.425 29.74 19.605 29.524 19.773 L 20.303 26.951 C 19.129 27.865 17.608 28.359 16.0 28.359 C 14.401 28.359 12.881 27.871 11.697 26.964 L 2.478 19.786 C 2.253 19.612 2.046 19.425 1.857 19.227 L 1.857 19.227 Z" fill="black"/>
+    <path d="M 1.899 14.541 C 1.662 15.017 1.537 15.531 1.537 16.058 C 1.537 17.176 2.095 18.223 3.091 18.996 L 12.311 26.175 C 13.31 26.939 14.615 27.359 16.0 27.359 C 17.39 27.359 18.695 26.936 19.689 26.162 L 28.909 18.984 C 29.905 18.211 30.463 17.164 30.463 16.046 C 30.463 15.528 30.343 15.024 30.114 14.554 C 29.939 14.733 29.749 14.903 29.544 15.062 L 20.323 22.26 C 19.149 23.176 17.627 23.671 16.019 23.671 C 14.42 23.671 12.899 23.182 11.722 22.278 L 11.719 22.276 L 11.714 22.272 L 2.495 15.076 C 2.28 14.908 2.081 14.73 1.899 14.541 L 1.899 14.541 Z" fill="black"/>
+    <path d="M 12.331 21.485 C 13.329 22.251 14.634 22.671 16.019 22.671 C 17.409 22.671 18.714 22.248 19.708 21.472 L 28.928 14.274 C 29.924 13.499 30.481 12.45 30.481 11.329 C 30.481 10.209 29.924 9.16 28.928 8.384 L 19.708 1.187 C 18.709 0.42 17.404 0.0 16.019 0.0 C 14.629 0.0 13.312 0.423 12.33 1.187 L 3.109 8.397 C 2.113 9.172 1.556 10.221 1.556 11.342 C 1.556 12.462 2.113 13.511 3.109 14.287 L 12.33 21.484 L 12.331 21.485 Z M 15.993 19.185 C 10.751 19.185 6.483 15.673 6.483 11.311 C 6.483 6.948 10.751 3.437 15.993 3.437 C 21.234 3.437 25.503 6.948 25.503 11.311 C 25.503 15.673 21.234 19.185 15.993 19.185 Z" fill="black"/>
+    <path d="M 15.993 18.032 C 11.438 18.032 7.764 15.01 7.764 11.311 C 7.764 7.611 11.438 4.589 15.993 4.589 C 20.547 4.589 24.221 7.611 24.221 11.311 C 24.221 15.01 20.547 18.032 15.993 18.032 Z M 14.765 11.059 L 14.415 17.313 L 17.253 11.513 L 17.66 5.272 L 14.765 11.059 Z" fill="black"/>
+</svg>
diff --git a/Websites/webkit.org/wp-content/index.php b/Websites/webkit.org/wp-content/index.php
new file mode 100644 (file)
index 0000000..4e6c07c
--- /dev/null
@@ -0,0 +1,3 @@
+<?php
+// Silence is golden.
+?>
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/maintenance.php b/Websites/webkit.org/wp-content/maintenance.php
new file mode 100644 (file)
index 0000000..ad147ee
--- /dev/null
@@ -0,0 +1,73 @@
+<html>
+<head>
+    <title>WebKit</title>
+
+    <style>
+    html {
+        font-family: "Myriad Set Pro","Helvetica Neue",sans-serif;
+        font-size: 62.5%;
+    }
+    body {
+        background-color: #f7f7f7;
+        font-size: 1.6rem;
+        font-weight: 400;
+       line-height: 1.4;
+    }
+    main {
+        width: 30rem;
+        margin: 10% auto;
+        text-align: center;
+    }
+    h1 {
+        font-size: 5.2rem;
+        line-height: 1.0625;
+        font-weight: 200;
+        letter-spacing: -0.02em;
+        text-align: center;
+        color: #444444;
+        margin: 5rem auto 3rem;
+    }
+    img {
+        width: 15rem;
+    }
+    p {
+        font-weight: 200;
+        font-size: 3rem;
+        line-height: 4.2rem;
+    }
+    </style>
+    <link rel="stylesheet" href="https://www.apple.com/wss/fonts?family=Myriad+Set+Pro&v=1" type="text/css" />
+</head>
+<body>
+
+    <main>
+        <svg viewBox="0 0 510 552" version="1.1" xmlns="http://www.w3.org/2000/svg">
+            <defs>
+                <linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="blues">
+                    <stop stop-color="#34AADC" offset="0%"/>
+                    <stop stop-color="#007AFF" offset="100%"/>
+                </linearGradient>
+                <filter x="-50%" y="-50%" width="200%" height="200%" id="shadow">
+                    <feOffset dx="0" dy="5" in="SourceAlpha" result="offset"/>
+                    <feGaussianBlur stdDeviation="2.5" in="offset" result="blur"/>
+                    <feColorMatrix values="0 0 0 0 0  0 0 0 0 0  0 0 0 0 0  0 0 0 0.07 0" in="blur" type="matrix" result="matrix"/>
+                    <feMerge>
+                        <feMergeNode in="matrix"/>
+                        <feMergeNode in="SourceGraphic"/>
+                    </feMerge>
+                </filter>
+            </defs>
+            <path d="M 477.861111 306.92819 C 512.046296 333.587507 512.046296 377.446382 477.861111 404.320693 L 317.015432 530.737452 C 282.830247 557.396768 227.169753 557.396768 192.984568 530.737452 L 32.1388889 404.535688 C -2.0462963 377.876371 -2.0462963 334.017496 32.1388889 307.143185 L 192.984568 180.726426 C 227.169753 154.06711 282.830247 154.06711 317.015432 180.726426 L 477.861111 306.92819 Z" fill="rgb(255, 157, 0)" id="base"/>
+            <path d="M 193.370239 451.831773 L 31.8122232 324.860059 C 15.5243578 312.097996 6.5 295.009809 6.5 276.840092 C 6.5 258.670375 15.5243578 241.582189 31.8122232 228.820125 L 193.370239 101.632105 C 209.658105 88.8700422 231.668733 81.7319391 255 81.7319391 C 278.331267 81.7319391 300.121789 88.8700422 316.629761 101.632105 L 478.187777 228.603819 C 494.475642 241.365882 503.5 258.454069 503.5 276.623786 C 503.5 294.793503 494.475642 311.881689 478.187777 324.643753 L 316.629761 451.615467 C 300.121789 464.593836 278.331267 471.731939 255 471.731939 C 231.668733 471.731939 209.878211 464.593836 193.370239 451.831773 Z" fill="rgb(255, 204, 0)" filter="url(#shadow)" id="mid"/>
+            <path d="M 193.370239 371.831773 L 31.8122232 244.860059 C 15.5243578 232.097996 6.5 215.009809 6.5 196.840092 C 6.5 178.670375 15.5243578 161.582189 31.8122232 148.820125 L 193.370239 21.6321055 C 209.658105 8.87004222 231.668733 1.73193906 255 1.73193906 C 278.331267 1.73193906 300.121789 8.87004222 316.629761 21.6321055 L 478.187777 148.603819 C 494.475642 161.365882 503.5 178.454069 503.5 196.623786 C 503.5 214.793503 494.475642 231.881689 478.187777 244.643753 L 316.629761 371.615467 C 300.121789 384.593836 278.331267 391.731939 255 391.731939 C 231.668733 391.731939 209.878211 384.593836 193.370239 371.831773 Z" fill="url(#blues)" filter="url(#shadow)" id="top"/>
+            <path d="M 255.557796 318.523438 L 255.557796 318.523438 C 338.113251 318.523438 405.03767 263.81823 405.03767 196.335938 C 405.03767 128.853645 338.113251 74.1484375 255.557796 74.1484375 C 173.002341 74.1484375 106.077922 128.853645 106.077922 196.335938 C 106.077922 263.81823 173.002341 318.523438 255.557796 318.523438 L 255.557796 318.523438 Z M 255.557796 331.101563 L 255.557796 331.101563 C 164.503985 331.101563 90.6902879 270.764937 90.6902879 196.335938 C 90.6902879 121.906938 164.503985 61.5703125 255.557796 61.5703125 C 346.611606 61.5703125 420.425304 121.906938 420.425304 196.335938 C 420.425304 270.764937 346.611606 331.101563 255.557796 331.101563 L 255.557796 331.101563 Z" fill="white" id="ring"/>
+            <path d="M 266.575605 248.199383 C 274.839361 247.116964 282.893943 244.813421 290.267395 241.288755 L 337.32129 260.629992 L 312.674012 223.705812 C 325.63867 207.004736 325.63867 185.850561 312.674012 169.149485 L 337.32129 132.225305 L 292.974868 150.45365 L 291.700073 169.952942 C 309.829164 185.157289 309.365846 209.169068 290.527893 223.847168 C 285.721068 227.691529 280.20166 230.389527 274.405151 232.306091 L 266.575605 248.199383 Z M 244.579776 144.624146 C 230.931152 146.398682 220.701293 151.565675 220.701293 151.565675 L 173.690288 132.225305 L 198.337566 169.149485 C 185.372907 185.850561 185.372907 207.004736 198.337566 223.705812 L 173.690288 260.629992 L 219.248736 241.90345 L 220.218932 223.640565 C 201.161804 208.480714 201.314025 184.227967 220.529419 169.002319 C 224.999999 165.000001 235.105895 160.762757 236.622498 160.537354 C 236.622497 160.537354 244.579776 144.624146 244.579776 144.624146 Z" fill="rgb(140, 200, 246)" id="rosette"/>
+            <path d="M 232.944378 192.304563 L 226.682617 303.302063 L 277.389053 200.3587 L 284.649978 89.5703125 L 232.944378 192.304563 Z M 232.289215 281.968558 L 272.904208 199.563458 L 237.312925 193.069439 L 232.289215 281.968558 Z" fill="white" fill-rule="evenodd" id="needle"/>
+        </svg>
+
+        <h1>webkit.org</h1>
+        <p>The team is doing some maintenance work on the site. We'll be back soon.</p>
+    </main>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/plugins/analytics.php b/Websites/webkit.org/wp-content/plugins/analytics.php
new file mode 100644 (file)
index 0000000..2ad20b7
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+/*
+Plugin Name: Google Analytics Plugin
+Plugin URI: http://webkit.org
+Description: Adds Google Analytics for webkit.org
+Author: Jonathan Davis
+Version: 1.0
+*/
+
+add_action( 'wp_head', function() {?>
+    <script type="text/javascript">
+        (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-7299333-1', 'auto'); ga('send', 'pageview');
+    </script>
+<?php
+} );
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight.php b/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight.php
new file mode 100644 (file)
index 0000000..24917e6
--- /dev/null
@@ -0,0 +1,81 @@
+<?php
+/*
+Plugin Name: Hyperlight
+Plugin URI: http://code.google.com/p/hyperlight
+Description: Static, CSS-based syntax highlighter for a variety of languages.
+Author: Jonathan Davis
+Version: 1.0
+*/
+
+require_once('hyperlight/hyperlight.php');
+
+$hyperlight_codes = array();
+$hyperlight_replace_token = uniqid('hyperlight', true) . ':';
+$hyperlight_code_index = 0;
+
+//
+// Wire plugin into WordPress
+//
+
+add_filter('the_content', 'hyperlight_before_filter', 7);
+add_filter('the_content', 'hyperlight_after_filter', 99);
+
+add_filter('get_comment_text', 'hyperlight_before_filter', 7);
+add_filter('get_comment_text', 'hyperlight_after_filter', 99);
+
+add_filter('post_text', 'hyperlight_before_filter', 7);
+add_filter('post_text', 'hyperlight_after_filter', 99);
+
+// Replace code blocks which specify a `class` argument with a replace token. The
+// token is a key in a dictionary and will be replaced by the after-filter with
+// the corresponding highlighted source code.
+// TODO Activate similar mechanism for <code>!
+function hyperlight_before_filter( $content ) {
+    return preg_replace_callback(
+        '#<code class="(.+?)">(.+?)</code>#is',
+        'hyperlight_highlight_block',
+        $content
+    );
+}
+
+// Replace the hyperlight replace tokens with the corresponding highlighted
+// source code.
+function hyperlight_after_filter($content) {
+    global $hyperlight_replace_token;
+    return preg_replace_callback(
+        "/$hyperlight_replace_token\d+/",
+        'hyperlight_insert_block',
+        $content
+    );
+}
+
+function hyperlight_highlight_block($match) {
+    global $hyperlight_codes, $hyperlight_replace_token, $hyperlight_code_index;
+
+    list(, $lang, $code) = $match;
+    
+    $code = html_entity_decode( $code, ENT_QUOTES );
+    
+    if ( ! isset($lang) ) 
+        return $match[0]; // No language given: don't highlight.
+
+       // Auto-detect implicit PHP code
+       if ('php' == $lang && !preg_match('/(<\?php|\?>)/',$code))
+               $lang = 'iphp';
+
+    $hyperlight = new Hyperlight($lang);
+    $code = $hyperlight->render($code);
+
+    // $code =  htmlspecialchars_decode($code, ENT_NOQUOTES);
+
+    $index = "$hyperlight_replace_token$hyperlight_code_index";
+    ++$hyperlight_code_index;
+    $hyperlight_codes[ $index ] = '<code class="' . esc_attr($lang) . '">' . $code . '</code>';
+    
+    return $index;
+}
+
+function hyperlight_insert_block($match) {
+    global $hyperlight_codes;
+    return $hyperlight_codes[ $match[0] ];
+}
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/hyperlight.php b/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/hyperlight.php
new file mode 100644 (file)
index 0000000..3077dc5
--- /dev/null
@@ -0,0 +1,1050 @@
+<?php
+
+/*
+ * Copyright 2008 Konrad Rudolph
+ * All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/*
+ * TODO list
+ * =========
+ *
+ * - FIXME Nested syntax elements create redundant nested tags under certain
+ *   circumstances. This can be reproduced by the following PHP snippet:
+ *
+ *      <pre class="<?php echo; ? >">
+ *
+ *   (Remove space between `?` and `>`).
+ *   Although this no longer occurs, it is fixed by checking for `$token === ''`
+ *   in the `emit*` methods. This should never happen anyway. Probably something
+ *   to do with the zero-width lookahead in the PHP syntax definition.
+ *
+ * - `hyperlight_calculate_fold_marks`: refactor, write proper handler
+ *
+ * - Line numbers (on client-side?)
+ *
+ */
+
+/**
+ * Hyperlight source code highlighter for PHP.
+ * @package hyperlight
+ */
+
+/** @ignore */
+require_once('preg_helper.php');
+
+if (!function_exists('array_peek')) {
+    /**
+     * @internal
+     * This does exactly what you think it does. */
+    function array_peek(array &$array) {
+        $cnt = count($array);
+        return $cnt === 0 ? null : $array[$cnt - 1];
+    }
+}
+
+/**
+ * @internal
+ * For internal debugging purposes.
+ */
+function dump($obj, $descr = null) {
+    if ($descr !== null)
+        echo "<h3>$descr</h3>";
+    ob_start();
+    var_dump($obj);
+    $dump = ob_get_clean();
+    ?><pre><?php echo htmlspecialchars($dump); ?></pre><?php
+    return true;
+}
+
+/**
+ * Raised when the grammar offers a rule that has not been defined.
+ */
+class NoMatchingRuleException extends Exception {
+    /** @internal */
+    public function __construct($states, $position, $code) {
+        $state = array_pop($states);
+        parent::__construct(
+            "State '$state' has no matching rule at position $position:\n" .
+            $this->errorSurrounding($code, $position)
+        );
+    }
+
+    // Try to extract the location of the error more or less precisely.
+    // Only used for a comprehensive display.
+    private function errorSurrounding($code, $pos) {
+        $size = 10;
+        $begin = $pos < $size ? 0 : $pos - $size;
+        $end = $pos + $size > strlen($code) ? strlen($code) : $pos + $size;
+        $offs = $pos - $begin;
+        return substr($code, $begin, $end - $begin) . "\n" . sprintf("%{$offs}s", '^');
+    }
+}
+
+/**
+ * Represents a nesting rule in the grammar of a language definition.
+ *
+ * Individual rules can either be represented by raw strings ("simple" rules) or
+ * by a nesting rule. Nesting rules specify where they can start and end. Inside
+ * a nesting rule, other rules may be applied (both simple and nesting).
+ * For example, a nesting rule may define a string literal. Inside that string,
+ * other rules may be applied that recognize escape sequences.
+ *
+ * To use a nesting rule, supply how it may start and end, e.g.:
+ * <code>
+ * $string_rule = array('string' => new Rule('/"/', '/"/'));
+ * </code>
+ * You also need to specify nested states:
+ * <code>
+ * $string_states = array('string' => 'escaped');
+ * <code>
+ * Now you can add another rule for <var>escaped</var>:
+ * <code>
+ * $escaped_rule = array('escaped' => '/\\(x\d{1,4}|.)/');
+ * </code>
+ */
+class Rule {
+    /**
+     * Common rules.
+     */
+
+    const ALL_WHITESPACE = '/(\s|\r|\n)+/';
+    const C_IDENTIFIER = '/[a-z_][a-z0-9_]*/i';
+    const C_COMMENT = '#//.*?\n|/\*.*?\*/#s';
+    const C_MULTILINECOMMENT = '#/\*.*?\*/#s';
+    const DOUBLEQUOTESTRING = '/"(?:\\\\"|.)*?"/s';
+    const SINGLEQUOTESTRING = "/'(?:\\\\'|.)*?'/s";
+    const C_DOUBLEQUOTESTRING = '/L?"(?:\\\\"|.)*?"/s';
+    const C_SINGLEQUOTESTRING = "/L?'(?:\\\\'|.)*?'/s";
+    const STRING = '/"(?:\\\\"|.)*?"|\'(?:\\\\\'|.)*?\'/s';
+    const C_NUMBER = '/
+        (?: # Integer followed by optional fractional part.
+            (?:
+                0(?:
+                    x[0-9a-f]+
+                    |
+                    [0-7]*
+                )
+                |
+                \d+
+            )
+            (?:\.\d*)?
+            (?:e[+-]\d+)?
+        )
+        |
+        (?: # Just the fractional part.
+            (?:\.\d+)
+            (?:e[+-]?\d+)?
+        )
+        /ix';
+
+    private $_start;
+    private $_end;
+
+    /** @ignore */
+    public function __construct($start, $end = null) {
+        $this->_start = $start;
+        $this->_end = $end;
+    }
+
+    /**
+     * Returns the pattern with which this rule starts.
+     * @return string
+     */
+    public function start() {
+        return $this->_start;
+    }
+
+    /**
+     * Returns the pattern with which this rule may end.
+     * @return string
+     */
+    public function end() {
+        return $this->_end;
+    }
+}
+
+/**
+ * Abstract base class of all Hyperlight language definitions.
+ *
+ * In order to define a new language definition, this class is inherited.
+ * The only function that needs to be overridden is the constructor. Helper
+ * functions from the base class can then be called to construct the grammar
+ * and store additional information.
+ * The name of the subclass must be of the schema <var>{Lang}Language</var>,
+ * where <var>{Lang}</var> is a short, unique name for the language starting
+ * with a capital letter and continuing in lower case. For example,
+ * <var>PhpLanguage</var> is a valid name. The language definition must
+ * reside in a file located at <var>languages/{lang}.php</var>. Here,
+ * <var>{lang}</var> is the all-lowercase spelling of the name, e.g.
+ * <var>languages/php.php</var>.
+ *
+ */
+abstract class HyperLanguage {
+    private $_states = array();
+    private $_rules = array();
+    private $_mappings = array();
+    private $_info = array();
+    private $_extensions = array();
+    private $_caseInsensitive = false;
+    private $_postProcessors = array();
+
+    private static $_languageCache = array();
+    private static $_compiledLanguageCache = array();
+    private static $_filetypes;
+
+    /**
+     * Indices for information.
+     */
+
+    const NAME = 1;
+    const VERSION = 2;
+    const AUTHOR = 10;
+    const WEBSITE = 5;
+    const EMAIL = 6;
+
+    /**
+     * Retrieves a language definition name based on a file extension.
+     *
+     * Uses the contents of the <var>languages/filetypes</var> file to
+     * guess the language definition name from a file name extension.
+     * This file has to be generated using the
+     * <var>collect-filetypes.php</var> script every time the language
+     * definitions have been changed.
+     *
+     * @param string $ext the file name extension.
+     * @return string The language definition name or <var>NULL</var>.
+     */
+    public static function nameFromExt($ext) {
+        if (self::$_filetypes === null) {
+            $ft_content = file('languages/filetypes', 1);
+
+            foreach ($ft_content as $line) {
+                list ($name, $extensions) = explode(':', trim($line));
+                $extensions = explode(',', $extensions);
+                // Inverse lookup.
+                foreach ($extensions as $extension)
+                    $ft_data[$extension] = $name;
+            }
+            self::$_filetypes = $ft_data;
+        }
+        $ext = strtolower($ext);
+        return
+            array_key_exists($ext, self::$_filetypes) ?
+            self::$_filetypes[strtolower($ext)] : null;
+    }
+
+    public static function compile(HyperLanguage $lang) {
+        $id = $lang->id();
+        if (!isset(self::$_compiledLanguageCache[$id]))
+            self::$_compiledLanguageCache[$id] = $lang->makeCompiledLanguage();
+        return self::$_compiledLanguageCache[$id];
+    }
+
+    public static function compileFromName($lang) {
+               $HyperLang = self::fromName($lang);
+               if (false === $HyperLang) return false;
+        return self::compile($HyperLang);
+    }
+
+    protected static function exists($lang) {
+        return isset(self::$_languageCache[$lang]) or
+               file_exists("languages/$lang.php");
+    }
+
+    protected static function fromName($lang) {
+        if (!isset(self::$_languageCache[$lang])) {
+                       $file = realpath(dirname(__FILE__)."/languages/$lang.php");
+                       if (!file_exists($file)) {
+                $lang = self::nameFromExt($lang);
+                       $file = realpath(dirname(__FILE__)."/languages/$lang.php");
+                       }
+                       if (!file_exists($file)) return false;
+                       require_once($file);
+            $klass = ucfirst("{$lang}Language");
+               self::$_languageCache[$lang] = new $klass();
+        }
+               return self::$_languageCache[$lang];
+    }
+
+    public function id() {
+        $klass = get_class($this);
+        return strtolower(substr($klass, 0, strlen($klass) - strlen('Language')));
+    }
+
+    protected function setCaseInsensitive($value) {
+        $this->_caseInsensitive = $value;
+    }
+
+    protected function addStates(array $states) {
+        $this->_states = self::mergeProperties($this->_states, $states);
+    }
+
+    protected function getState($key) {
+        return $this->_states[$key];
+    }
+
+    protected function removeState($key) {
+        unset($this->_states[$key]);
+    }
+
+    protected function addRules(array $rules) {
+        $this->_rules = self::mergeProperties($this->_rules, $rules);
+    }
+
+    protected function getRule($key) {
+        return $this->_rules[$key];
+    }
+
+    protected function removeRule($key) {
+        unset($this->_rules[$key]);
+    }
+
+    protected function addMappings(array $mappings) {
+        // TODO Implement nested mappings.
+        $this->_mappings = array_merge($this->_mappings, $mappings);
+    }
+
+    protected function getMapping($key) {
+        return $this->_mappings[$key];
+    }
+
+    protected function removeMapping($key) {
+        unset($this->_mappings[$key]);
+    }
+
+    protected function setInfo(array $info) {
+        $this->_info = $info;
+    }
+
+    protected function setExtensions(array $extensions) {
+        $this->_extensions = $extensions;
+    }
+
+    protected function addPostprocessing($rule, HyperLanguage $language) {
+        $this->_postProcessors[$rule] = $language;
+    }
+
+//    protected function addNestedLanguage(HyperLanguage $language, $hoistBackRules) {
+//        $prefix = get_class($language);
+//        if (!is_array($hoistBackRules))
+//            $hoistBackRules = array($hoistBackRules);
+//
+//        $states = array();  // Step 1: states
+//
+//        foreach ($language->_states as $stateName => $state) {
+//            $prefixedRules = array();
+//
+//            if (strstr($stateName, ' ')) {
+//                $parts = explode(' ', $stateName);
+//                $prefixed = array();
+//                foreach ($parts as $part)
+//                    $prefixed[] = "$prefix$part";
+//                $stateName = implode(' ', $prefixed);
+//            }
+//            else
+//                $stateName = "$prefix$stateName";
+//
+//            foreach ($state as $key => $rule) {
+//                if (is_string($key) and is_array($rule)) {
+//                    $nestedRules = array();
+//                    foreach ($rule as $nestedRule)
+//                        $nestedRules[] = ($nestedRule === '') ? '' :
+//                                         "$prefix$nestedRule";
+//
+//                    $prefixedRules["$prefix$key"] = $nestedRules;
+//                }
+//                else
+//                    $prefixedRules[] = "$prefix$rule";
+//            }
+//
+//            if ($stateName === 'init')
+//                $prefixedRules = array_merge($hoistBackRules, $prefixedRules);
+//
+//            $states[$stateName] = $prefixedRules;
+//        }
+//
+//        $rules = array();   // Step 2: rules
+//        // Mappings need to set up already!
+//        $mappings = array();
+//
+//        foreach ($language->_rules as $ruleName => $rule) {
+//            if (is_array($rule)) {
+//                $nestedRules = array();
+//                foreach ($rule as $nestedName => $nestedRule) {
+//                    if (is_string($nestedName)) {
+//                        $nestedRules["$prefix$nestedName"] = $nestedRule;
+//                        $mappings["$prefix$nestedName"] = $nestedName;
+//                    }
+//                    else
+//                        $nestedRules[] = $nestedRule;
+//                }
+//                $rules["$prefix$ruleName"] = $nestedRules;
+//            }
+//            else {
+//                $rules["$prefix$ruleName"] = $rule;
+//                $mappings["$prefix$ruleName"] = $ruleName;
+//            }
+//        }
+//
+//        // Step 3: mappings.
+//
+//        foreach ($language->_mappings as $ruleName => $cssClass) {
+//            if (strstr($ruleName, ' ')) {
+//                $parts = explode(' ', $ruleName);
+//                $prefixed = array();
+//                foreach ($parts as $part)
+//                    $prefixed[] = "$prefix$part";
+//                $mappings[implode(' ', $prefixed)] = $cssClass;
+//            }
+//            else
+//                $mappings["$prefix$ruleName"] = $cssClass;
+//        }
+//
+//        $this->addStates($states);
+//        $this->addRules($rules);
+//        $this->addMappings($mappings);
+//
+//        return $prefix . 'init';
+//    }
+
+    private function makeCompiledLanguage() {
+        return new HyperlightCompiledLanguage(
+            $this->id(),
+            $this->_info,
+            $this->_extensions,
+            $this->_states,
+            $this->_rules,
+            $this->_mappings,
+            $this->_caseInsensitive,
+            $this->_postProcessors
+        );
+    }
+
+    private static function mergeProperties(array $old, array $new) {
+        foreach ($new as $key => $value) {
+            if (is_string($key)) {
+                if (isset($old[$key]) and is_array($old[$key]))
+                    $old[$key] = array_merge($old[$key], $new);
+                else
+                    $old[$key] = $value;
+            }
+            else
+                $old[] = $value;
+        }
+
+        return $old;
+    }
+}
+
+class HyperlightCompiledLanguage {
+    private $_id;
+    private $_info;
+    private $_extensions;
+    private $_states;
+    private $_rules;
+    private $_mappings;
+    private $_caseInsensitive;
+    private $_postProcessors = array();
+
+    public function __construct($id, $info, $extensions, $states, $rules, $mappings, $caseInsensitive, $postProcessors) {
+        $this->_id = $id;
+        $this->_info = $info;
+        $this->_extensions = $extensions;
+        $this->_caseInsensitive = $caseInsensitive;
+        $this->_states = $this->compileStates($states);
+        $this->_rules = $this->compileRules($rules);
+        $this->_mappings = $mappings;
+
+        foreach ($postProcessors as $ppkey => $ppvalue)
+            $this->_postProcessors[$ppkey] = HyperLanguage::compile($ppvalue);
+    }
+
+    public function id() {
+        return $this->_id;
+    }
+
+    public function name() {
+        return $this->_info[HyperLanguage::NAME];
+    }
+
+    public function authorName() {
+        if (!array_key_exists(HyperLanguage::AUTHOR, $this->_info))
+            return null;
+        $author = $this->_info[HyperLanguage::AUTHOR];
+        if (is_string($author))
+            return $author;
+        if (!array_key_exists(HyperLanguage::NAME, $author))
+            return null;
+        return $author[HyperLanguage::NAME];
+    }
+
+    public function authorWebsite() {
+        if (!array_key_exists(HyperLanguage::AUTHOR, $this->_info) or
+            !is_array($this->_info[HyperLanguage::AUTHOR]) or
+            !array_key_exists(HyperLanguage::WEBSITE, $this->_info[HyperLanguage::AUTHOR]))
+            return null;
+        return $this->_info[HyperLanguage::AUTHOR][HyperLanguage::WEBSITE];
+    }
+
+    public function authorEmail() {
+        if (!array_key_exists(HyperLanguage::AUTHOR, $this->_info) or
+            !is_array($this->_info[HyperLanguage::AUTHOR]) or
+            !array_key_exists(HyperLanguage::EMAIL, $this->_info[HyperLanguage::AUTHOR]))
+            return null;
+        return $this->_info[HyperLanguage::AUTHOR][HyperLanguage::EMAIL];
+    }
+
+    public function authorContact() {
+        $email = $this->authorEmail();
+        return $email !== null ? $email : $this->authorWebsite();
+    }
+
+    public function extensions() {
+        return $this->_extensions;
+    }
+
+    public function state($stateName) {
+        return $this->_states[$stateName];
+    }
+
+    public function rule($ruleName) {
+        return $this->_rules[$ruleName];
+    }
+
+    public function className($state) {
+        if (array_key_exists($state, $this->_mappings))
+            return $this->_mappings[$state];
+        else if (strstr($state, ' ') === false)
+            // No mapping for state.
+            return $state;
+        else {
+            // Try mapping parts of nested state name.
+            $parts = explode(' ', $state);
+            $ret = array();
+
+            foreach ($parts as $part) {
+                if (array_key_exists($part, $this->_mappings))
+                    $ret[] = $this->_mappings[$part];
+                else
+                    $ret[] = $part;
+            }
+
+            return implode(' ', $ret);
+        }
+    }
+
+    public function postProcessors() {
+        return $this->_postProcessors;
+    }
+
+    private function compileStates($states) {
+        $ret = array();
+
+        foreach ($states as $name => $state) {
+            $newstate = array();
+
+            if (!is_array($state))
+                $state = array($state);
+
+            foreach ($state as $key => $elem) {
+                if ($elem === null)
+                    continue;
+                if (is_string($key)) {
+                    if (!is_array($elem))
+                        $elem = array($elem);
+
+                    foreach ($elem as $el2) {
+                        if ($el2 === '')
+                            $newstate[] = $key;
+                        else
+                            $newstate[] = "$key $el2";
+                    }
+                }
+                else
+                    $newstate[] = $elem;
+            }
+
+            $ret[$name] = $newstate;
+        }
+
+        return $ret;
+    }
+
+    private function compileRules($rules) {
+        $tmp = array();
+
+        // Preprocess keyword list and flatten nested lists:
+
+        // End of regular expression matching keywords.
+        $end = $this->_caseInsensitive ? ')\b/i' : ')\b/';
+
+        foreach ($rules as $name => $rule) {
+            if (is_array($rule)) {
+                if (self::isAssocArray($rule)) {
+                    // Array is a nested list of rules.
+                    foreach ($rule as $key => $value) {
+                        if (is_array($value))
+                            // Array represents a list of keywords.
+                            $value = '/\b(?:' . implode('|', $value) . $end;
+
+                        if (!is_string($key) or strlen($key) === 0)
+                            $tmp[$name] = $value;
+                        else
+                            $tmp["$name $key"] = $value;
+                    }
+                }
+                else {
+                    // Array represents a list of keywords.
+                    $rule = '/\b(?:' . implode('|', $rule) . $end;
+                    $tmp[$name] = $rule;
+                }
+            }
+            else {
+                $tmp[$name] = $rule;
+            } // if (is_array($rule))
+        } // foreach
+
+        $ret = array();
+
+        foreach ($this->_states as $name => $state) {
+            $regex_rules = array();
+            $regex_names = array();
+            $nesting_rules = array();
+
+            foreach ($state as $rule_name) {
+                $rule = $tmp[$rule_name];
+                if ($rule instanceof Rule)
+                    $nesting_rules[$rule_name] = $rule;
+                else {
+                    $regex_rules[] = $rule;
+                    $regex_names[] = $rule_name;
+                }
+            }
+
+            $ret[$name] = array_merge(
+                array(preg_merge('|', $regex_rules, $regex_names)),
+                $nesting_rules
+            );
+        }
+
+        return $ret;
+    }
+
+    private static function isAssocArray(array $array) {
+        foreach($array as $key => $_)
+            if (is_string($key))
+                return true;
+        return false;
+    }
+}
+
+class Hyperlight {
+    private $_lang;
+    private $_result;
+    private $_states;
+    private $_omitSpans;
+    private $_postProcessors = array();
+
+    public function __construct($lang) {
+        if (is_string($lang))
+            $this->_lang = HyperLanguage::compileFromName(strtolower($lang));
+        else if ($lang instanceof HyperlightCompiledLanguage)
+            $this->_lang = $lang;
+        else if ($lang instanceof HyperLanguage)
+            $this->_lang = HyperLanguage::compile($lang);
+        else
+            trigger_error(
+                'Invalid argument type for $lang to Hyperlight::__construct',
+                E_USER_ERROR
+            );
+
+
+               if (method_exists($this->_lang,'postProcessors')) {
+                       foreach ($this->_lang->postProcessors() as $ppkey => $ppvalue)
+                   $this->_postProcessors[$ppkey] = new Hyperlight($ppvalue);
+               }
+
+
+        $this->reset();
+    }
+
+    public function language() {
+        return $this->_lang;
+    }
+
+    public function reset() {
+        $this->_states = array('init');
+        $this->_omitSpans = array();
+    }
+
+    public function render($code) {
+               if (false === $this->language()) {
+                       $this->_lang = HyperLanguage::compileFromName('code');
+                       $this->reset();
+                       if (!$this->language()) return htmlspecialchars($code);
+               }
+
+        // Normalize line breaks.
+        $this->_code = preg_replace('/\r\n?/', "\n", $code);
+        $fm = hyperlight_calculate_fold_marks($this->_code, $this->language()->id());
+        return hyperlight_apply_fold_marks($this->renderCode(), $fm);
+    }
+
+    public function renderAndPrint($code) {
+        echo $this->render($code);
+    }
+
+
+    private function renderCode() {
+        $code = $this->_code;
+        $pos = 0;
+        $len = strlen($code);
+        $this->_result = '';
+        $state = array_peek($this->_states);
+
+        // If there are open states (reentrant parsing), open the corresponding
+        // tags first:
+
+        for ($i = 1; $i < count($this->_states); ++$i)
+            if (!$this->_omitSpans[$i - 1]) {
+                $class = $this->_lang->className($this->_states[$i]);
+                $this->write("<span class=\"$class\">");
+            }
+
+        // Emergency break to catch faulty rules.
+        $prev_pos = -1;
+
+        while ($pos < $len) {
+            // The token next to the current position, after the inner loop completes.
+            // i.e. $closest_hit = array($matched_text, $position)
+            $closest_hit = array('', $len);
+            // The rule that found this token.
+            $closest_rule = null;
+            $rules = $this->_lang->rule($state);
+
+            foreach ((array)$rules as $name => $rule) {
+                if ($rule instanceof Rule)
+                    $this->matchIfCloser(
+                        $rule->start(), $name, $pos, $closest_hit, $closest_rule
+                    );
+                else if (!empty($rule) && preg_match($rule, $code, $matches, PREG_OFFSET_CAPTURE, $pos) == 1) {
+                    // Search which of the sub-patterns matched.
+                    foreach ($matches as $group => $match) {
+                        if (!is_string($group))
+                            continue;
+                        if ($match[1] !== -1) {
+                            $closest_hit = $match;
+                            $closest_rule = str_replace('_', ' ', $group);
+                            break;
+                        }
+                    }
+                }
+            } // foreach ($rules)
+
+            // If we're currently inside a rule, check whether we've come to the
+            // end of it, or the end of any other rule we're nested in.
+
+            if (count($this->_states) > 1) {
+                $n = count($this->_states) - 1;
+                do {
+                    $rule = $this->_lang->rule($this->_states[$n - 1]);
+                    $rule = $rule[$this->_states[$n]];
+                    --$n;
+                    if ($n < 0)
+                        throw new NoMatchingRuleException($this->_states, $pos, $code);
+                } while ($rule->end() === null);
+
+                $this->matchIfCloser($rule->end(), $n + 1, $pos, $closest_hit, $closest_rule);
+            }
+
+            // We take the closest hit:
+
+            if ($closest_hit[1] > $pos)
+                $this->emit(substr($code, $pos, $closest_hit[1] - $pos));
+
+            $prev_pos = $pos;
+            $pos = $closest_hit[1] + strlen($closest_hit[0]);
+
+            if ($prev_pos === $pos and is_string($closest_rule))
+                if (array_key_exists($closest_rule, $this->_lang->rule($state))) {
+                    array_push($this->_states, $closest_rule);
+                    $state = $closest_rule;
+                    $this->emitPartial('', $closest_rule);
+                }
+
+            if ($closest_hit[1] === $len)
+                break;
+            else if (!is_string($closest_rule)) {
+                // Pop state.
+                if (count($this->_states) <= $closest_rule)
+                    throw new NoMatchingRuleException($this->_states, $pos, $code);
+
+                while (count($this->_states) > $closest_rule + 1) {
+                    $lastState = array_pop($this->_states);
+                    $this->emitPop('', $lastState);
+                }
+                $lastState = array_pop($this->_states);
+                $state = array_peek($this->_states);
+                $this->emitPop($closest_hit[0], $lastState);
+            }
+            else if (array_key_exists($closest_rule, $this->_lang->rule($state))) {
+                // Push state.
+                array_push($this->_states, $closest_rule);
+                $state = $closest_rule;
+                $this->emitPartial($closest_hit[0], $closest_rule);
+            }
+            else
+                $this->emit($closest_hit[0], $closest_rule);
+        } // while ($pos < $len)
+
+        // Close any tags that are still open (can happen in incomplete code
+        // fragments that don't necessarily signify an error (consider PHP
+        // embedded in HTML, or a C++ preprocessor code not ending on newline).
+
+        $omitSpansBackup = $this->_omitSpans;
+        for ($i = count($this->_states); $i > 1; --$i)
+            $this->emitPop();
+        $this->_omitSpans = $omitSpansBackup;
+
+        return $this->_result;
+    }
+
+    private function matchIfCloser($expr, $next, $pos, &$closest_hit, &$closest_rule) {
+        $matches = array();
+        if (preg_match($expr, $this->_code, $matches, PREG_OFFSET_CAPTURE, $pos) == 1) {
+            if (
+                (
+                    // Two hits at same position -- compare length
+                    // For equal lengths: first come, first serve.
+                    $matches[0][1] == $closest_hit[1] and
+                    strlen($matches[0][0]) > strlen($closest_hit[0])
+                ) or
+                $matches[0][1] < $closest_hit[1]
+            ) {
+                $closest_hit = $matches[0];
+                $closest_rule = $next;
+            }
+        }
+    }
+
+    private function processToken($token) {
+        if ($token === '')
+            return '';
+        $nest_lang = array_peek($this->_states);
+        if (array_key_exists($nest_lang, $this->_postProcessors))
+            return $this->_postProcessors[$nest_lang]->render($token);
+        else
+            #return self::htmlentities($token);
+            return htmlspecialchars($token, ENT_NOQUOTES);
+    }
+
+    private function emit($token, $class = '') {
+        $token = $this->processToken($token);
+        if ($token === '')
+            return;
+        $class = $this->_lang->className($class);
+        if ($class === '')
+            $this->write($token);
+        else
+            $this->write("<span class=\"$class\">$token</span>");
+    }
+
+    private function emitPartial($token, $class) {
+        $token = $this->processToken($token);
+        $class = $this->_lang->className($class);
+        if ($class === '') {
+            if ($token !== '')
+                $this->write($token);
+            array_push($this->_omitSpans, true);
+        }
+        else {
+            $this->write("<span class=\"$class\">$token");
+            array_push($this->_omitSpans, false);
+        }
+    }
+
+    private function emitPop($token = '', $class = '') {
+        $token = $this->processToken($token);
+        if (array_pop($this->_omitSpans))
+            $this->write($token);
+        else
+            $this->write("$token</span>");
+    }
+
+    private function write($text) {
+        $this->_result .= $text;
+    }
+
+//      // DAMN! What did I need them for? Something to do with encoding …
+//      // but why not use the `$charset` argument on `htmlspecialchars`?
+//    private static function htmlentitiesCallback($match) {
+//        switch ($match[0]) {
+//            case '<': return '&lt;';
+//            case '>': return '&gt;';
+//            case '&': return '&amp;';
+//        }
+//    }
+//
+//    private static function htmlentities($text) {
+//        return htmlspecialchars($text, ENT_NOQUOTES);
+//        return preg_replace_callback(
+//            '/[<>&]/', array('Hyperlight', 'htmlentitiesCallback'), $text
+//        );
+//    }
+} // class Hyperlight
+
+/**
+ * <var>echo</var>s a highlighted code.
+ *
+ * For example, the following
+ * <code>
+ * hyperlight('<?php echo \'Hello, world\'; ?>', 'php');
+ * </code>
+ * results in:
+ * <code>
+ * <pre class="source-code php">...</pre>
+ * </code>
+ *
+ * @param string $code The code.
+ * @param string $lang The language of the code.
+ * @param string $tag The surrounding tag to use. Optional.
+ * @param array $attributes Attributes to decorate {@link $tag} with.
+ *          If no tag is given, this argument can be passed in its place. This
+ *          behaviour will be assumed if the third argument is an array.
+ *          Attributes must be given as a hash of key value pairs.
+ */
+function hyperlight($code, $lang, $tag = 'pre', array $attributes = array()) {
+    if ($code == '')
+        die("`hyperlight` needs a code to work on!");
+    if ($lang == '')
+        die("`hyperlight` needs to know the code's language!");
+    if (is_array($tag) and !empty($attributes))
+        die("Can't pass array arguments for \$tag *and* \$attributes to `hyperlight`!");
+    if ($tag == '')
+        $tag = 'pre';
+    if (is_array($tag)) {
+        $attributes = $tag;
+        $tag = 'pre';
+    }
+    $lang = htmlspecialchars(strtolower($lang));
+    $class = "source-code $lang";
+
+    $attr = array();
+    foreach ($attributes as $key => $value) {
+        if ($key == 'class')
+            $class .= ' ' . htmlspecialchars($value);
+        else
+            $attr[] = htmlspecialchars($key) . '="' .
+                      htmlspecialchars($value) . '"';
+    }
+
+    $attr = empty($attr) ? '' : ' ' . implode(' ', $attr);
+
+    $hl = new Hyperlight($lang);
+    echo "<$tag class=\"$class\"$attr>";
+    $hl->renderAndPrint(trim($code));
+    echo "</$tag>";
+}
+
+/**
+ * Is the same as:
+ * <code>
+ * hyperlight(file_get_contents($filename), $lang, $tag, $attributes);
+ * </code>
+ * @see hyperlight()
+ */
+function hyperlight_file($filename, $lang = null, $tag = 'pre', array $attributes = array()) {
+    if ($lang == '') {
+        // Try to guess it from file extension.
+        $pos = strrpos($filename, '.');
+        if ($pos !== false) {
+            $ext = substr($filename, $pos + 1);
+            $lang = HyperLanguage::nameFromExt($ext);
+        }
+    }
+    hyperlight(file_get_contents($filename), $lang, $tag, $attributes);
+}
+
+if (defined('HYPERLIGHT_SHORTCUT')) {
+    function hy() {
+        $args = func_get_args();
+        call_user_func_array('hyperlight', $args);
+    }
+    function hyf() {
+        $args = func_get_args();
+        call_user_func_array('hyperlight_file', $args);
+    }
+}
+
+function hyperlight_calculate_fold_marks($code, $lang) {
+    $supporting_languages = array('csharp', 'vb');
+
+    if (!in_array($lang, $supporting_languages))
+        return array();
+
+    $fold_begin_marks = array('/^\s*#Region/', '/^\s*#region/');
+    $fold_end_marks = array('/^\s*#End Region/', '/\s*#endregion/');
+
+    $lines = preg_split('/\r|\n|\r\n/', $code);
+
+    $fold_begin = array();
+    foreach ($fold_begin_marks as $fbm)
+        $fold_begin = $fold_begin + preg_grep($fbm, $lines);
+
+    $fold_end = array();
+    foreach ($fold_end_marks as $fem)
+        $fold_end = $fold_end + preg_grep($fem, $lines);
+
+    if (count($fold_begin) !== count($fold_end) or count($fold_begin) === 0)
+        return array();
+
+    $fb = array();
+    $fe = array();
+    foreach ($fold_begin as $line => $_)
+        $fb[] = $line;
+
+    foreach ($fold_end as $line => $_)
+        $fe[] = $line;
+
+    $ret = array();
+    for ($i = 0; $i < count($fb); $i++)
+        $ret[$fb[$i]] = $fe[$i];
+
+    return $ret;
+}
+
+function hyperlight_apply_fold_marks($code, array $fold_marks) {
+    if ($fold_marks === null or count($fold_marks) === 0)
+        return $code;
+
+    $lines = explode("\n", $code);
+
+    foreach ($fold_marks as $begin => $end) {
+        $lines[$begin] = '<span class="fold-header">' . $lines[$begin] . '<span class="dots"> </span></span>';
+        $lines[$begin + 1] = '<span class="fold">' . $lines[$begin + 1];
+        $lines[$end + 1] = '</span>' . $lines[$end + 1];
+    }
+
+    return implode("\n", $lines);
+}
+
+?>
diff --git a/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/apache.php b/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/apache.php
new file mode 100644 (file)
index 0000000..21ea33b
--- /dev/null
@@ -0,0 +1,51 @@
+<?php
+
+class ApacheLanguage extends HyperLanguage {
+    public function __construct() {
+        $this->setInfo(array(
+            parent::NAME => 'Apache',
+            parent::VERSION => '1.0',
+            parent::AUTHOR => array(
+                parent::NAME => 'Jonathan Davis',
+                parent::WEBSITE => 'webkit.org',
+                parent::EMAIL => 'jond@webkit.org'
+            )
+        ));
+
+        $this->setExtensions(array('htaccess','conf'));
+        $this->setCaseInsensitive(false);
+
+        $this->addStates(array(
+            'init' => array('extension','mimetype','comment','regex','identifier','operator','path',
+                                                       'keyword' => array('', 'type')),
+        ));
+
+        $this->addRules(array(
+               'keyword' => array(
+                               array('AccessFileName','AllowOverride','Options','AddHandler','SetHandler',
+                                       'AuthType','AuthName','AuthUserFile','AuthGroupFile','Require','IfModule',
+                                       'RewriteRule','RewriteCond'
+                               ),
+                               'type' => array(
+                                       'mod_fastcgi.c'
+                ),
+                       ),
+                       'regex' => new Rule('/\^/', '/\$/'),
+                       'path' => '/\s\/(.+?)\s/',
+                       'operator' => '/(\[.+\]|!-\w)\n/',
+                       'identifier' => '/%{.+}/',
+                       'extension' => '/(?<=\s)\.\w+/',
+                       'mimetype' => '/[\w\.\-]+\/[\w\.\-]+/',
+                       'comment' => '/#.*/',
+        ));
+
+        $this->addMappings(array(
+                       'keyword' => 'keyword builtin',
+                       'path' => 'string',
+                       'extension' => 'identifier',
+                       'mimetype' => 'string'
+        ));
+    }
+}
+
+?>
diff --git a/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/blocklist.php b/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/blocklist.php
new file mode 100644 (file)
index 0000000..7b8aa79
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+require_once('javascript.php');
+
+class BlocklistLanguage extends JavascriptLanguage {
+    
+    public function __construct() {
+        parent::__construct();
+        $this->setExtensions(array('json-bl'));
+
+        $this->removeState('init');
+        $this->addStates(array(
+            'init' => array(
+                   'trigger', 'action', 'value', 'char', 'number', 'comment',
+                   'keyword' => array('', 'type', 'modifier','control','literal', 'operator'),
+                   'identifier',
+                   'operator'
+               )
+        ));
+        
+        $this->addRules(array(
+            'trigger' => array('url-filter-is-case-sensitive', 'url-filter',  'resource-type', 'load-type', 'if-domain', 'unless-domain'),
+            'action' => array('type', 'selector'),
+            'value' => new Rule('/(?<=:\s)"/', '/"(\n|}|,)/'),
+            'identifier' => array('trigger', 'action')
+        ));
+
+        $this->addMappings(array(
+            'trigger' => 'keyword',
+            'action' => 'keyword',
+            'value' => 'string'
+        ));
+    }
+}
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/code.php b/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/code.php
new file mode 100644 (file)
index 0000000..4d09410
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+
+class CodeLanguage extends HyperLanguage {
+    public function __construct() {
+        $this->setInfo(array(
+            parent::NAME => 'Code',
+            parent::VERSION => '1.0',
+            parent::AUTHOR => array(
+                parent::NAME => 'Jonathan Davis',
+                parent::WEBSITE => 'webkit.org',
+                parent::EMAIL => 'jond@webkit.org'
+            )
+        ));
+
+        $this->setExtensions(array(''));
+
+        $this->addStates(array(
+            'init' => array('comment'),
+        ));
+
+           $this->addRules(array(
+                       'comment' => '/#.*/'
+           ));
+
+    }
+}
+
+?>
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/cpp.php b/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/cpp.php
new file mode 100644 (file)
index 0000000..6ac2980
--- /dev/null
@@ -0,0 +1,84 @@
+<?php
+
+// TODO:
+// - Add escaped string characters
+// - Add 'TO DO', 'FIX ME', … tags
+// - (Add doc comments?)
+
+class CppLanguage extends HyperLanguage {
+    public function __construct() {
+        $this->setInfo(array(
+            parent::NAME => 'C++',
+            parent::VERSION => '0.4',
+            parent::AUTHOR => array(
+                parent::NAME => 'Konrad Rudolph',
+                parent::WEBSITE => 'madrat.net',
+                parent::EMAIL => 'konrad_rudolph@madrat.net'
+            )
+        ));
+
+        $this->setExtensions(array('c', 'cc', 'cpp', 'h', 'hpp', 'icl', 'ipp'));
+
+        $keyword = array('keyword' => array('', 'type', 'literal', 'operator'));
+        $common = array(
+            'string', 'char', 'number', 'comment',
+            'keyword' => array('', 'type', 'literal', 'operator'),
+            'identifier',
+            'operator'
+        );
+
+        $this->addStates(array(
+            'init' => array_merge(array('include', 'preprocessor'), $common),
+            'include' => array('incpath'),
+            'preprocessor' => array_merge($common, array('pp_newline')),
+        ));
+
+        $this->addRules(array(
+            'whitespace' => RULE::ALL_WHITESPACE,
+            'operator' => '/<:|:>|<%|%>|%:|%:%:|\+\+|--|&&|\|\||::|<<|>>|##|\.\.\.|\.\*|->|->*|[-+*\/%^&|!~<>.=,;:?()\[\]\{\}]|[-+*\/%^&|=!~<>]=|<<=|>>=/',
+            'include' => new Rule('/#\s*include/', '/\n/'),
+            'preprocessor' => new Rule('/#\s*\w+/', '/\n/'),
+            //'pp_newline' => '/[^\\\\](?<bs>\\\\*?)(?P=bs)\\\\\n/',
+            'pp_newline' => '/(?<!\\\\)(?:\\\\\\\\)*?\\\\\n/',
+            'incpath' => '/<[^>]*>|"[^"]*"/',
+            'string' => Rule::C_DOUBLEQUOTESTRING,
+            'char' => Rule::C_SINGLEQUOTESTRING,
+            'number' => Rule::C_NUMBER,
+            'comment' => Rule::C_COMMENT,
+            'keyword' => array(
+                array(
+                    'asm', 'auto', 'break', 'case', 'catch', 'class', 'const',
+                    'const_cast', 'continue', 'default', 'do', 'dynamic_cast',
+                    'else', 'enum', 'explicit', 'export', 'extern', 'for',
+                    'firend', 'goto', 'if', 'inline', 'mutable', 'namespace',
+                    'operator', 'private', 'protected', 'public', 'register',
+                    'reinterpret_cast', 'return', 'sizeof', 'static',
+                    'static_cast', 'struct', 'switch', 'template', 'throw',
+                    'try', 'typedef', 'typename', 'union', 'using', 'virtual',
+                    'volatile', 'while'
+                ),
+                'type' => array(
+                    'bool', 'char', 'double', 'float', 'int', 'long', 'short',
+                    'signed', 'unsigned', 'void', 'wchar_t'
+                ),
+                'literal' => array(
+                    'false', 'this', 'true'
+                ),
+                'operator' => array(
+                    'and', 'and_eq', 'bitand', 'bitor', 'compl', 'delete',
+                    'new', 'not', 'not_eq', 'or', 'or_eq', 'typeid', 'xor',
+                    'xor_eq'
+                ),
+            ),
+            'identifier' => Rule::C_IDENTIFIER,
+        ));
+
+        $this->addMappings(array(
+            'operator' => '',
+            'include' => 'preprocessor',
+            'incpath' => 'tag',
+        ));
+    }
+}
+
+?>
diff --git a/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/csharp.php b/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/csharp.php
new file mode 100644 (file)
index 0000000..4b935c0
--- /dev/null
@@ -0,0 +1,79 @@
+<?php
+
+class CsharpLanguage extends HyperLanguage {
+    public function __construct() {
+        $this->setInfo(array(
+            parent::NAME => 'C#',
+            parent::VERSION => '0.3',
+            parent::AUTHOR => array(
+                parent::NAME => 'Konrad Rudolph',
+                parent::WEBSITE => 'madrat.net',
+                parent::EMAIL => 'konrad_rudolph@madrat.net'
+            )
+        ));
+
+        $this->setExtensions(array('cs'));
+
+        $this->setCaseInsensitive(false);
+
+        $this->addStates(array(
+            'init' => array(
+                'string',
+                'char',
+                'number',
+                'comment' => array('', 'doc'),
+                'keyword' => array('', 'type', 'literal', 'operator', 'preprocessor'),
+                'identifier',
+                'operator',
+                'whitespace',
+            ),
+            'comment doc' => 'doc',
+        ));
+
+        $this->addRules(array(
+            'whitespace' => Rule::ALL_WHITESPACE,
+            'operator' => '/[-+*\/%&|^!~=<>?{}()\[\].,:;]|&&|\|\||<<|>>|[-=!<>+*\/%&|^]=|<<=|>>=|->/',
+            'string' => Rule::C_DOUBLEQUOTESTRING,
+            'char' => Rule::C_SINGLEQUOTESTRING,
+            'number' => Rule::C_NUMBER,
+            'comment' => array(
+                '#//(?:[^/].*?)?\n|/\*.*?\*/#s',
+                'doc' => new Rule('#///#', '/$/m')
+            ),
+            'doc' => '/<(?:".*?"|\'.*?\'|[^>])*>/',
+            'keyword' => array(
+                array(
+                    'abstract', 'break', 'case', 'catch', 'checked', 'class',
+                    'const', 'continue', 'default', 'delegate', 'do', 'else',
+                    'enum', 'event', 'explicit', 'extern', 'finally', 'fixed',
+                    'for', 'foreach', 'goto', 'if', 'implicit', 'in', 'interface',
+                    'internal', 'lock', 'namespace', 'operator', 'out', 'override',
+                    'params', 'private', 'protected', 'public', 'readonly', 'ref',
+                    'return', 'sealed', 'static', 'struct', 'switch', 'throw',
+                    'try', 'unchecked', 'unsafe', 'using', 'var', 'virtual',
+                    'volatile', 'while'
+                ),
+                'type' => array(
+                    'bool', 'byte', 'char', 'decimal', 'double', 'float', 'int',
+                    'long', 'object', 'sbyte', 'short', 'string', 'uint', 'ulong',
+                    'ushort', 'void'
+                ),
+                'literal' => array(
+                    'base', 'false', 'null', 'this', 'true',
+                ),
+                'operator' => array(
+                    'as', 'is', 'new', 'sizeof', 'stackallock', 'typeof',
+                ),
+                'preprocessor' => '/#(?:if|else|elif|endif|define|undef|warning|error|line|region|endregion)/'
+            ),
+            'identifier' => '/@?[a-z_][a-z0-9_]*/i',
+        ));
+
+        $this->addMappings(array(
+            'whitespace' => '',
+            'operator' => '',
+        ));
+    }
+}
+
+?>
diff --git a/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/css.php b/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/css.php
new file mode 100644 (file)
index 0000000..100c7b4
--- /dev/null
@@ -0,0 +1,67 @@
+<?php
+
+class CssLanguage extends HyperLanguage {
+    public function __construct() {
+        $this->setInfo(array(
+            parent::NAME => 'CSS',
+            parent::VERSION => '0.8',
+            parent::AUTHOR => array(
+                parent::NAME => 'Konrad Rudolph',
+                parent::WEBSITE => 'madrat.net',
+                parent::EMAIL => 'konrad_rudolph@madrat.net'
+            )
+        ));
+
+        $this->setExtensions(array('css'));
+
+        // The following does not conform to the specs but it is necessary
+        // else numbers wouldn't be recognized any more.
+        $nmstart = '-?[a-z]';
+        $nmchar = '[a-z0-9-]';
+        $hex = '[0-9a-f]';
+        list($string, $strmod) = preg_strip(Rule::STRING);
+        $strmod = implode('', $strmod);
+
+        $this->addStates(array(
+            'init' => array('comment', 'uri', 'meta', 'id', 'class', 'pseudoclass', 'element', 'block', 'constraint', 'string'),
+            'block' => array('comment', 'attribute', 'value'),
+            'constraint' => array('identifier', 'string'),
+            'value' => array('comment', 'string', 'color', 'number', 'uri', 'identifier', 'important'),
+        ));
+
+        $this->addRules(array(
+            'attribute' => "/$nmstart$nmchar*/i",
+            'value' => new Rule('/:/', '/;|(?=\})/'),
+            'comment' => Rule::C_MULTILINECOMMENT,
+            'meta' => "/@$nmstart$nmchar*/i",
+            'id' => "/#$nmstart$nmchar*/i",
+            'class' => "/\.$nmstart$nmchar*/",
+            // Pay attention not to match rules such as ::selection!
+            'pseudoclass' => "/(?<!:):$nmstart$nmchar*/",
+            'element' => "/$nmstart$nmchar*/i",
+            'block' => new Rule('/\{/', '/\}/'),
+            'constraint' => new Rule('/\[/', '/\]/'),
+            'number' => '/[+-]?(?:\d+(\.\d+)?|\d*\.\d+)(%|em|ex|px|pt|in|cm|mm|pc|deg|g?rad|m?s|k?Hz)?/',
+            'uri' => "/url\(\s*(?:$string|[^\)]*)\s*\)/$strmod",
+            'identifier' => "/$nmstart$nmchar*/i",
+            'string' => "/$string/$strmod",
+            'color' => "/#$hex{3}(?:$hex{3})?/i",
+            'important' => '/!\s*important/',
+        ));
+
+        $this->addMappings(array(
+            'element' => 'keyword',
+            'id' => 'keyword type',
+            'class' => 'keyword builtin',
+            'pseudoclass' => 'preprocessor',
+            'block' => '',
+            'constraint' => '',
+            'value' => '',
+            'color' => 'string',
+            'uri' => 'char',
+            'meta' => 'keyword',
+        ));
+    }
+}
+
+?>
diff --git a/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/diff.php b/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/diff.php
new file mode 100644 (file)
index 0000000..1f1128a
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+
+class DiffLanguage extends HyperLanguage {
+    public function __construct() {
+        $this->setInfo(array(
+            parent::NAME => 'Diff',
+            parent::VERSION => '1.0',
+            parent::AUTHOR => array(
+                parent::NAME => 'Jonathan Davis',
+                parent::WEBSITE => 'webkit.org',
+                parent::EMAIL => 'jond@webkit.org'
+            )
+        ));
+
+        $this->setExtensions(array('diff'));
+        $this->setCaseInsensitive(true);
+
+        $this->addStates(array(
+            'init' => array('removed','added'),
+        ));
+
+        $this->addRules(array(
+                       'added' => new Rule('/^\+/m', '/$/m'),
+                       'removed' => new Rule('/^\-/m', '/$/m')
+        ));
+
+        $this->addMappings(array(
+                       'added' => 'string',
+                       'removed' => 'comment'
+        ));
+    }
+}
+
+?>
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/filetypes b/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/filetypes
new file mode 100644 (file)
index 0000000..607e810
--- /dev/null
@@ -0,0 +1,9 @@
+cpp:c,cc,cpp,h,hpp,icl,ipp
+css:css
+iphp:php,php3,php4,php5,inc
+php:php,php3,php4,php5,inc
+vb:vb
+xml:xml,xsl,xslt,xsd,manifest
+apache:htaccess,conf
+javascript:js,json
+blocklist:json-bl
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/html.php b/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/html.php
new file mode 100644 (file)
index 0000000..7902007
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+
+require_once('xml.php');
+
+class HtmlLanguage extends XmlLanguage {
+    public function __construct() {
+        parent::__construct();
+        $this->setExtensions(array('html'));
+
+        $this->addMappings(array(
+            'attribute' => 'keyword attribute',
+            'doctype' => 'doctype'
+        ));
+
+    }
+}
diff --git a/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/ini.php b/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/ini.php
new file mode 100644 (file)
index 0000000..a4db5d8
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+class IniLanguage extends HyperLanguage {
+    public function __construct() {
+        $this->setInfo(array(
+            parent::NAME => 'INI',
+            parent::VERSION => '1.0',
+            parent::AUTHOR => array(
+                parent::NAME => 'Jonathan Davis',
+                parent::WEBSITE => 'webkit.org',
+                parent::EMAIL => 'jond@webkit.org'
+            )
+        ));
+
+        $this->setExtensions(array('ini'));
+        $this->setCaseInsensitive(false);
+
+
+        $this->addStates(array(
+            'init' => array('prefix','setting')
+               ));
+
+        $this->addRules(array(
+               'prefix' => '/\w+\./',
+               'setting' => '/(?<=\.)\w+(?=\s?=)/',
+                       'comment' => '/#.*/',
+        ));
+
+        $this->addMappings(array(
+                       'prefix' => 'keyword',
+                       'setting' => 'identifier',
+                       'value' => 'string'
+        ));
+    }
+}
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/iphp.php b/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/iphp.php
new file mode 100644 (file)
index 0000000..762a722
--- /dev/null
@@ -0,0 +1,14 @@
+<?php
+
+require_once('php.php');
+
+class IphpLanguage extends PhpLanguage {
+    public function __construct() {
+        parent::__construct();
+        $this->setExtensions(array()); // Not a whole file, just a fragment.
+        $this->removeState('init');
+        $this->addStates(array('init' => $this->getState('php')));
+    }
+}
+
+?>
diff --git a/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/javascript.php b/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/javascript.php
new file mode 100644 (file)
index 0000000..675caf0
--- /dev/null
@@ -0,0 +1,59 @@
+<?php
+
+class JavaScriptLanguage extends HyperLanguage {
+    public function __construct() {
+        $this->setInfo(array(
+            parent::NAME => 'JavaScript',
+            parent::VERSION => '1.0',
+            parent::AUTHOR => array(
+                parent::NAME => 'Jonathan Davis',
+                parent::WEBSITE => 'webkit.org',
+                parent::EMAIL => 'jond@webkit.org'
+            )
+        ));
+
+        $this->setExtensions(array('js','json','html','php'));
+
+        $this->addStates(array(
+            'init' => array(
+                   'string', 'char', 'number', 'comment',
+                   'keyword' => array('', 'type', 'modifier','control','literal', 'operator'),
+                   'identifier',
+                   'operator'
+               )
+        ));
+
+        $this->addRules(array(
+            'whitespace' => RULE::ALL_WHITESPACE,
+            'operator' => '/[!|%|&|\*|\-\-|\-|\+\+|\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|\/=|%=|\+=|\-=|&=|\^=|:]/',
+            'string' => Rule::C_DOUBLEQUOTESTRING,
+            'char' => Rule::C_SINGLEQUOTESTRING,
+            'number' => Rule::C_NUMBER,
+            'comment' => Rule::C_COMMENT,
+            'keyword' => array(
+                array(
+                                       'super','this','arguments','prototype','constructor'
+                ),
+                'type' => array(
+                    'boolean', 'byte', 'char', 'class', 'double', 'enum', 'float', 'function', 'int', 'interface', 'long', 'short', 'var', 'void'
+                ),
+                               'modifier' => array(
+                                       'const','export','extends','final','implements','native','private','protected','public','static','synchronized','throws','transient','volatile'
+                               ),
+                               'control' => array(
+                                       'break','case','catch','continue','default','do','else','finally','for','goto','if','import','package','return','switch','throw','try','while'
+                               ),
+                'literal' => array(
+                    'false', 'this', 'true', 'null', 'undefined', 'NaN'
+                ),
+                'operator' => array(
+                                       'delete','in','instanceof','new','typeof','void','with'
+                ),
+            ),
+            'identifier' => Rule::C_IDENTIFIER,
+        ));
+
+        $this->addMappings(array(
+        ));
+    }
+}
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/php.php b/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/php.php
new file mode 100644 (file)
index 0000000..d26b20e
--- /dev/null
@@ -0,0 +1,64 @@
+<?php
+
+// TODO
+// - Fill the scaffold below!
+// - Comments via #
+// - More keywords? What about functions?
+// - String interpolation and escaping.
+// - Usual stuff for doc comments
+// - Heredoc et al.
+// - More complex nested variable names.
+
+class PhpLanguage extends HyperLanguage {
+    public function __construct() {
+        $this->setInfo(array(
+            parent::NAME => 'PHP',
+            parent::VERSION => '0.3',
+            parent::AUTHOR => array(
+                parent::NAME => 'Konrad Rudolph',
+                parent::WEBSITE => 'madrat.net',
+                parent::EMAIL => 'konrad_rudolph@madrat.net'
+            )
+        ));
+
+        $this->setExtensions(array('php', 'php3', 'php4', 'php5', 'inc'));
+
+        $this->addPostProcessing('html', HyperLanguage::fromName('xml'));
+
+        $this->addStates(array(
+            'init' => array('php', 'html'),
+            'php' => array(
+                'comment', 'string', 'char', 'number',
+                'keyword' => array('', 'type', 'literal', 'operator', 'builtin'),
+                'identifier', 'variable'),
+            'variable' => array('identifier'),
+            'html' => array()
+        ));
+
+        $this->addRules(array(
+            'php' => new Rule('/<\?php/', '/\?>/'),
+            'html' => new Rule('/(?=.)/', '/(?=<\?php)/'),
+            'comment' => Rule::C_COMMENT,
+            'string' => Rule::C_DOUBLEQUOTESTRING,
+            'char' => Rule::C_SINGLEQUOTESTRING,
+            'number' => Rule::C_NUMBER,
+            'identifier' => Rule::C_IDENTIFIER,
+            'variable' => new Rule('/\$/', '//'),
+            'keyword' => array(
+                array('break', 'case', 'class', 'const', 'continue', 'declare', 'default', 'do', 'else', 'elseif', 'enddeclare', 'endfor', 'endforeach', 'endif', 'endswitch', 'endwhile', 'extends', 'for', 'foreach', 'function', 'global', 'if', 'return', 'static', 'switch', 'use', 'var', 'while', 'final', 'interface', 'implements', 'public', 'private', 'protected', 'abstract', 'try', 'catch', 'throw', 'final', 'namespace'),
+                'type' => array('exception', 'int'),
+                'literal' => array('false', 'null', 'true', 'this'),
+                'operator' => array('and', 'as', 'or', 'xor', 'new', 'instanceof', 'clone'),
+                'builtin' => array('array', 'die', 'echo', 'empty', 'eval', 'exit', 'include', 'include_once', 'isset', 'list', 'print', 'require', 'require_once', 'unset')
+            ),
+        ));
+
+        $this->addMappings(array(
+            'char' => 'string',
+            'variable' => 'tag',
+            'html' => 'preprocessor',
+        ));
+    }
+}
+
+?>
diff --git a/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/python.php b/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/python.php
new file mode 100644 (file)
index 0000000..c7167ee
--- /dev/null
@@ -0,0 +1,64 @@
+<?php
+
+# TODO
+# Implement correct number formats (don't forget imaginaries)
+# Implement correct string/bytes formats (escape sequences)
+# Add type “keywords”?
+# <http://docs.python.org/dev/3.0/reference/lexical_analysis.html>
+
+class PythonLanguage extends HyperLanguage {
+    public function __construct() {
+        $this->setInfo(array(
+            parent::NAME => 'Python',
+            parent::VERSION => '0.1',
+            parent::AUTHOR => array(
+                parent::NAME => 'Konrad Rudolph',
+                parent::WEBSITE => 'madrat.net',
+                parent::EMAIL => 'konrad_rudolph@madrat.net'
+            )
+        ));
+
+        $this->setExtensions(array('py'));
+
+        $this->setCaseInsensitive(false);
+
+        $this->addStates(array(
+            'init' => array(
+                'string',
+                'bytes',
+                'number',
+                'comment',
+                'keyword' => array('', 'literal', 'operator'),
+                'identifier'
+            ),
+        ));
+
+        $this->addRules(array(
+            'string' => Rule::C_DOUBLEQUOTESTRING,
+            'bytes' => Rule::C_SINGLEQUOTESTRING,
+            'number' => Rule::C_NUMBER,
+            'comment' => '/#.*/',
+            'keyword' => array(
+                array(
+                    'assert', 'break', 'class', 'continue', 'def', 'del',
+                    'elif', 'else', 'except', 'finally', 'for', 'from',
+                    'global', 'if', 'import', 'in', 'lambda', 'nonlocal',
+                    'pass', 'raise', 'return', 'try', 'while', 'with', 'yield'
+                ),
+                'literal' => array(
+                    'False', 'None', 'True'
+                ),
+                'operator' => array(
+                    'and', 'as', 'is', 'not', 'or'
+                )
+            ),
+            'identifier' => Rule::C_IDENTIFIER,
+        ));
+
+        $this->addMappings(array(
+            'bytes' => 'char'
+        ));
+    }
+}
+
+?>
diff --git a/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/syntax.php b/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/syntax.php
new file mode 100644 (file)
index 0000000..c37bc25
--- /dev/null
@@ -0,0 +1,57 @@
+<?php
+
+class SyntaxLanguage extends HyperLanguage {
+    public function __construct() {
+        $this->setInfo(array(
+            parent::NAME => 'Syntax',
+            parent::VERSION => '1.0',
+            parent::AUTHOR => array(
+                parent::NAME => 'Jonathan Davis',
+                parent::WEBSITE => 'webkit.org',
+                parent::EMAIL => 'jond@webkit.org'
+            )
+        ));
+
+        $this->setExtensions(array());
+
+        $this->addStates(array(
+            'init' => array('prototype','variable','optional','return','params','prop','newlines'),
+                       'prototype' => array('name','interface'),
+                       'interface' => array('variable','optional'),
+                       'params' => array('param'),
+                       'param' => array('key','datatype','variable','notice'),
+                       'return' => array('key','returntype','notice')
+        ));
+
+           $this->addRules(array(
+                       'prototype' => new Rule('/\b(?=\w+\s?\()/','/\n/'),
+                       'newlines' => '/\n\n/',
+                       'name' => '/\w+?(?=\(.*?\))/',
+                       'interface' => new Rule('/\(/','/\)/'),
+                       'variable' => '/\$\w+/',
+                       'params' => new Rule('/\n(?=@(param))/','/((?=@return)|\n{2,})/'),
+                       'param' => new Rule('/(?=@param)/','/\n/'),
+                       'return' => new Rule('/(?=@return)/','/\n/'),
+                       'key' => '/@\w+\s/',
+            'datatype' => '/\w+(?=\s\$)/',
+                       'returntype' => '/(?<=@return\s)\w+/',
+                       'notice' => '/\(.*?\)/',
+            'optional' => new Rule('/\[/','/\]/')
+           ));
+
+           $this->addMappings(array(
+                       'name' => 'keyword builtin',
+                       'variable' => 'identifier',
+                       'optional' => 'string',
+                       'notice' => 'string',
+                       'type' => 'keyword type',
+                       'prop' => 'hidden',
+                       'keytype' => 'hidden',
+                       'datatype' => 'keyword literal',
+                       'returntype' => 'keyword literal'
+           ));
+
+    }
+}
+
+?>
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/vb.php b/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/vb.php
new file mode 100644 (file)
index 0000000..f6a9327
--- /dev/null
@@ -0,0 +1,107 @@
+<?php
+
+class VbLanguage extends HyperLanguage {
+    public function __construct() {
+        $this->setInfo(array(
+            parent::NAME => 'VB',
+            parent::VERSION => '1.4',
+            parent::AUTHOR => array(
+                parent::NAME => 'Konrad Rudolph',
+                parent::WEBSITE => 'madrat.net',
+                parent::EMAIL => 'konrad_rudolph@madrat.net'
+            )
+        ));
+
+        $this->setExtensions(array('vb'));
+
+        $this->setCaseInsensitive(true);
+
+        $this->addStates(array(
+            'init' => array(
+                'string',
+                'number',
+                'comment' => array('', 'doc'),
+                'keyword' => array('', 'type', 'literal', 'operator', 'preprocessor'),
+                'date',
+                'identifier',
+                'operator',
+                'whitespace',
+            ),
+            'string' => 'escaped',
+            'comment doc' => 'doc',
+        ));
+
+        $this->addRules(array(
+            'whitespace' => Rule::ALL_WHITESPACE,
+            'operator' => '/[-+*\/\\\\^&.=,()<>{}]/',
+            'string' => new Rule('/"/', '/"c?/i'),
+            'number' => '/(?: # Integer followed by optional fractional part.
+                (?:&(?:H[0-9a-f]+|O[0-7]+)|\d+)
+                (?:\.\d*)?
+                (?:e[+-]\d+)?
+                U?[SILDFR%@!#&]?
+            )
+            |
+            (?: # Just the fractional part.
+                (?:\.\d+)
+                (?:e[+-]\d+)?
+                [FR!#]?
+            )
+            /ix',
+            'escaped' => '/""/',
+            'keyword' => array(
+                array(
+                    'addhandler', 'addressof', 'alias', 'as', 'byref', 'byval',
+                    'call', 'case', 'catch', 'cbool', 'cbyte', 'cchar',
+                    'cdate', 'cdec', 'cdbl', 'cint', 'class', 'clng', 'cobj',
+                    'const', 'continue', 'csbyte', 'cshort', 'csng', 'cstr',
+                    'ctype', 'cuint', 'culng', 'cushort', 'declare', 'default',
+                    'delegate', 'dim', 'directcast', 'do', 'each', 'else',
+                    'elseif', 'end', 'endif', 'enum', 'erase', 'error',
+                    'event', 'exit', 'finally', 'for', 'friend', 'function',
+                    'get', 'gettype', 'getxmlnamespace', 'global', 'gosub',
+                    'goto', 'handles', 'if', 'implements', 'imports', 'in',
+                    'inherits', 'interface', 'let', 'lib', 'loop', 'module',
+                    'mustinherit', 'mustoverride', 'namespace', 'narrowing',
+                    'next', 'notinheritable', 'notoverridable', 'of', 'on',
+                    'operator', 'option', 'optional', 'overloads',
+                    'overridable', 'overrides', 'paramarray', 'partial',
+                    'private', 'property', 'protected', 'public', 'raiseevent',
+                    'readonly', 'redim', 'removehandler', 'resume', 'return',
+                    'select', 'set', 'shadows', 'shared', 'static', 'step',
+                    'stop', 'structure', 'sub', 'synclock', 'then', 'throw',
+                    'to', 'try', 'trycast', 'wend', 'using', 'when', 'while',
+                    'widening', 'with', 'withevents', 'writeonly'
+                ),
+                'type' => array(
+                    'boolean', 'byte', 'char', 'date', 'decimal', 'double',
+                    'long', 'integer', 'object', 'sbyte', 'short', 'single',
+                    'string', 'variant', 'uinteger', 'ulong', 'ushort'
+                ),
+                'literal' => array(
+                    'false', 'me', 'mybase', 'myclass', 'nothing', 'true'
+                ),
+                'operator' => array(
+                    'and', 'andalso', 'is', 'isnot', 'like', 'mod', 'new',
+                    'not', 'or', 'orelse', 'typeof', 'xor'
+                ),
+                'preprocessor' => '/#(?:const|else|elseif|end if|end region|if|region)/i'
+            ),
+            'comment' => array(
+                "/(?:'{1,2}[^']|rem\s).*/i",
+                'doc' => new Rule("/'''/", '/$/m')
+            ),
+            'date' => '/#.+?#/',
+            'identifier' => '/[a-z_][a-z_0-9]*|\[.+?\]/i',
+            'doc' => '/<(?:".*?"|\'.*?\'|[^>])*>/',
+        ));
+
+        $this->addMappings(array(
+            'whitespace' => '',
+            'operator' => '',
+            'date' => 'tag',
+        ));
+    }
+}
+
+?>
diff --git a/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/xml.php b/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/languages/xml.php
new file mode 100644 (file)
index 0000000..07a90fa
--- /dev/null
@@ -0,0 +1,55 @@
+<?php
+
+class XmlLanguage extends HyperLanguage {
+    public function __construct() {
+        $this->setInfo(array(
+            parent::NAME => 'XML',
+            parent::VERSION => '0.3',
+            parent::AUTHOR => array(
+                parent::NAME => 'Konrad Rudolph',
+                parent::WEBSITE => 'madrat.net',
+                parent::EMAIL => 'konrad_rudolph@madrat.net'
+            )
+        ));
+
+        $this->setExtensions(array('xml', 'xsl', 'xslt', 'xsd', 'manifest'));
+
+        $inline = array('entity');
+        $common = array('tagname', 'attribute', 'value' => array('double', 'single'));
+
+        $this->addStates(array(
+            'init' => array_merge(array('doctype', 'comment', 'cdata', 'tag'), $inline),
+            'tag' => array_merge(array('preprocessor', 'meta'), $common),
+            'preprocessor' => $common,
+            'meta' => $common,
+            'value double' => $inline,
+            'value single' => $inline,
+        ));
+        
+        $this->addRules(array(
+            'doctype' => '/<!DOCTYPE.*?>/',
+            'comment' => '/<!--.*?-->/s',
+            'cdata' => '/<!\[CDATA\[.*?\]\]>/',
+            'tag' => new Rule('/</', '/>/'),
+            'tagname' => '#(?:(?<=<)|(?<=</)|(?<=<\?)|(?<=<!))[a-z0-9:-]+#i',
+            'attribute' => '/[a-z0-9:-]+/i',
+            'preprocessor' => new Rule('/\?/'),
+            'meta' => new Rule('/!/'),
+            'value' => array(
+                'double' => new Rule('/"/', '/"/'),
+                'single' => new Rule("/'/", "/'/")
+            ),
+            'entity' => '/&.*?;/',
+        ));
+
+        $this->addMappings(array(
+            'attribute' => 'keyword type',
+            'cdata' => '',
+            'value' => 'attribute value',
+            'value double' => 'attribute value string',
+            'value single' => 'attribute value string',
+            'entity' => 'escaped',
+            'tagname' => 'keyword'
+        ));
+    }
+}
diff --git a/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/preg_helper.php b/Websites/webkit.org/wp-content/plugins/hyperlight/hyperlight/preg_helper.php
new file mode 100644 (file)
index 0000000..bab8d38
--- /dev/null
@@ -0,0 +1,168 @@
+<?php
+
+/**
+ * Copyright 2008 Konrad Rudolph
+ * All rights reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/**
+ * Helper functions for the Perl-compatible regular expressions.
+ * @package preg_helper
+ */
+
+/**
+ * Merges several regular expressions into one, using the indicated 'glue'.
+ *
+ * This function takes care of individual modifiers so it's safe to use
+ * <i>different</i> modifiers on the individual expressions. The order of
+ * sub-matches is preserved as well. Numbered back-references are adapted to
+ * the new overall sub-match count. This means that it's safe to use numbered
+ * back-refences in the individual expressions!
+ * If {@link $names} is given, the individual expressions are captured in
+ * named sub-matches using the contents of that array as names.
+ * Matching pair-delimiters (e.g. <var>"{…}"</var>) are currently
+ * <b>not</b> supported.
+ *
+ * The function assumes that all regular expressions are well-formed.
+ * Behaviour is undefined if they aren't.
+ *
+ * This function was created after a
+ * {@link http://stackoverflow.com/questions/244959/ StackOverflow discussion}.
+ * Much of it was written or thought of by “porneL” and “eyelidlessness”. Many
+ * thanks to both of them.
+ *
+ * @param string $glue  A string to insert between the individual expressions.
+ *      This should usually be either the empty string, indicating
+ *      concatenation, or the pipe (<var>"|"</var>), indicating alternation.
+ *      Notice that this string might have to be escaped since it is treated
+ *      as a normal character in a regular expression (i.e. <var>"/"</var> will
+ *      end the expression and result in an invalid output).
+ * @param array $expressions    The expressions to merge. The expressions may
+ *      have arbitrary different delimiters and modifiers.
+ * @param array $names  Optional. This is either an empty array or an array of
+ *      strings of the same length as {@link $expressions}. In that case,
+ *      the strings of this array are used to create named sub-matches for the
+ *      expressions.
+ * @return string An string representing a regular expression equivalent to the
+ *      merged expressions. Returns <var>FALSE</var> if an error occurred.
+ */
+function preg_merge($glue, array $expressions, array $names = array()) {
+    // … then, a miracle occurs.
+
+    // Sanity check …
+
+    $use_names = ($names !== null and count($names) !== 0);
+
+    if (
+        $use_names and count($names) !== count($expressions) or
+        !is_string($glue)
+    )
+        return false;
+
+    $result = array();
+    // For keeping track of the names for sub-matches.
+    $names_count = 0;
+    // For keeping track of *all* captures to re-adjust backreferences.
+    $capture_count = 0;
+
+    foreach ($expressions as $expression) {
+        if ($use_names)
+            $name = str_replace(' ', '_', $names[$names_count++]);
+
+        // Get delimiters and modifiers:
+
+        $stripped = preg_strip($expression);
+
+        if ($stripped === false)
+            return false;
+
+        list($sub_expr, $modifiers) = $stripped;
+
+        // Re-adjust backreferences:
+        // TODO What about \R backreferences (\0 isn't allowed, though)?
+        
+        // We assume that the expression is correct and therefore don't check
+        // for matching parentheses.
+        
+        $number_of_captures = preg_match_all('/\([^?]|\(\?[^:]/', $sub_expr, $_);
+
+        if ($number_of_captures === false)
+            return false;
+
+        if ($number_of_captures > 0) {
+            $backref_expr = '/
+                (?<!\\\\)        # Not preceded by a backslash,
+                ((?:\\\\\\\\)*?) # zero or more escaped backslashes,
+                \\\\ (\d+)       # followed by backslash plus digits.
+            /x';
+            $sub_expr = preg_replace_callback(
+                $backref_expr,
+                create_function(
+                    '$m',
+                    'return $m[1] . "\\\\" . ((int)$m[2] + ' . $capture_count . ');'
+                ),
+                $sub_expr
+            );
+            $capture_count += $number_of_captures;
+        }
+
+        // Last, construct the new sub-match:
+        
+        $modifiers = implode('', $modifiers);
+        $sub_modifiers = "(?$modifiers)";
+        if ($sub_modifiers === '(?)')
+            $sub_modifiers = '';
+
+        $sub_name = $use_names ? "?<$name>" : '?:';
+        $new_expr = "($sub_name$sub_modifiers$sub_expr)";
+        $result[] = $new_expr;
+    }
+
+    return '/' . implode($glue, $result) . '/';
+}
+
+/**
+ * Strips a regular expression string off its delimiters and modifiers.
+ * Additionally, normalizes the delimiters (i.e. reformats the pattern so that
+ * it could have used <var>"/"</var> as delimiter).
+ *
+ * @param string $expression The regular expression string to strip.
+ * @return array An array whose first entry is the expression itself, the
+ *      second an array of delimiters. If the argument is not a valid regular
+ *      expression, returns <var>FALSE</var>.
+ *
+ */
+function preg_strip($expression) {
+    if (preg_match('/^(.)(.*)\\1([imsxeADSUXJu]*)$/s', $expression, $matches) !== 1)
+        return false;
+
+    $delim = $matches[1];
+    $sub_expr = $matches[2];
+    if ($delim !== '/') {
+        // Replace occurrences by the escaped delimiter by its unescaped
+        // version and escape new delimiter.
+        $sub_expr = str_replace("\\$delim", $delim, $sub_expr);
+        $sub_expr = str_replace('/', '\\/', $sub_expr);
+    }
+    $modifiers = $matches[3] === '' ? array() : str_split(trim($matches[3]));
+
+    return array($sub_expr, $modifiers);
+}
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/plugins/index.php b/Websites/webkit.org/wp-content/plugins/index.php
new file mode 100644 (file)
index 0000000..4e6c07c
--- /dev/null
@@ -0,0 +1,3 @@
+<?php
+// Silence is golden.
+?>
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/plugins/social-meta.php b/Websites/webkit.org/wp-content/plugins/social-meta.php
new file mode 100644 (file)
index 0000000..18b7339
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+/*
+Plugin Name: Social Meta
+Description: Adds schema.org, Twitter Card, Open Graph meta for posts and pages
+Version:     1.0
+Author:      Jonathan Davis
+Author URI:  http://webkit.org
+*/
+
+add_action('wp_head', function() { ?>
+    <?php $image_url = wp_get_attachment_image_src( get_post_thumbnail_id($post_id), 'large' )[0]; ?>
+    
+    <!-- Schema.org markup -->
+    <meta itemprop="name" content="<?php the_title(); ?>">
+    <meta itemprop="description" content="<?php the_excerpt(); ?>">
+    <?php if ( $image_url ): ?>
+    <meta itemprop="image" content="<?php echo $image_url; ?>">
+    <?php endif; ?>
+
+    <!-- Twitter Card data -->
+    <meta name="twitter:card" content="summary_large_image">
+    <meta name="twitter:site" content="@webkit">
+    <meta name="twitter:title" content="<?php the_title(); ?>">
+    <meta name="twitter:description" content="<?php the_excerpt(); ?>">
+    <?php if ( '' !== ( $twitter_handle = get_the_author_meta('twitter') ) ): ?>
+    <meta name="twitter:creator" content="@<?php echo esc_html($twitter_handle); ?>">
+    <?php endif; ?>
+    <?php if ( $image_url ): // Twitter summary card with large image must be at least 280x150px ?>
+    <meta name="twitter:image:src" content="<?php echo $image_url; ?>">
+    <?php endif; ?>
+    
+    <!-- Open Graph data -->
+    <meta property="og:title" content="<?php the_title(); ?>" />
+    <meta property="og:type" content="article" />
+    <meta property="og:url" content="<?php the_permalink(); ?>" />
+    <?php if ( $image_url ): ?>
+    <meta itemprop="og:image" content="<?php echo $image_url; ?>">
+    <?php endif; ?>
+    <meta property="og:description" content="<?php the_excerpt(); ?>" />
+    <meta property="og:site_name" content="<?php bloginfo('title'); ?>" />
+    <meta property="article:published_time" content="<?php the_time('c'); ?>" />
+    <meta property="article:modified_time" content="<?php the_modified_date('c'); ?>" />
+    <?php     
+        $categories = wp_get_object_terms( get_the_ID(), 'category', array( 'fields' => 'names' ) );
+        $tags = wp_get_object_terms( get_the_ID(), 'post_tag', array( 'fields' => 'names' ) );
+        
+        if ( ! empty($categories) ): 
+            $section = array_shift($categories);      // The first category is used as the section
+            $tags = array_merge($categories, $tags);  // The rest are prepended to the tag list
+    ?>
+    <meta property="article:section" content="<?php echo esc_attr($section); ?>" />
+    <?php
+        endif;
+
+        if ( ! empty($tags) ): foreach( $tags as $tag ):
+    ?>
+    <meta property="article:tag" content="<?php echo esc_attr($tag); ?>" />
+    <?php
+        endforeach; endif;
+    ?>
+    
+<?php
+});
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/plugins/table-of-contents.php b/Websites/webkit.org/wp-content/plugins/table-of-contents.php
new file mode 100644 (file)
index 0000000..f0e61aa
--- /dev/null
@@ -0,0 +1,116 @@
+<?php
+/*
+Plugin Name: WebKit Table of Contents
+Plugin URI: http://webkit.org
+Description: Builds a table of contents with navigation anchors from headings
+Version: 1.0
+Author: Jonathan Davis
+*/
+
+WebKitTableOfContents::init();
+
+class WebKitTableOfContents {
+    
+    private static $editing = false;
+    private static $toc = array();
+    private static $attr_regex = '\{((?:[ ]*[#.][-_:a-zA-Z0-9]+){1,})[ ]*\}';
+    
+    public function init() {
+        add_filter( 'wp_insert_post_data', array( 'WebKitTableOfContents', 'wp_insert_post_data' ), 20, 2 );
+        add_action( 'wp_insert_post', array( 'WebKitTableOfContents', 'wp_insert_post' ) );
+    }
+
+    public function hasIndex() {
+        $toc = get_post_meta( get_the_ID(), 'toc', true );
+        array_walk($toc, function ( $value, $key ) {
+            list($level, $anchor) = explode('::', $key);
+            if ( $level < 4 ) self::$toc[ $key ] = $value;
+        });
+        return ( ! empty(self::$toc) && count(self::$toc) > 2 );
+    }
+        
+    public static function renderMarkup() {
+        if ( ! is_page() ) return;
+        
+        if ( empty(self::$toc) || ! self::hasIndex() )
+            return;
+        
+        $depth = 0;
+        $parent = 0;
+        $markup = '<input type="checkbox" id="table-of-contents-toggle" class="menu-toggle"><menu class="table-of-contents"><menuitem class="list"><h6><label for="table-of-contents-toggle">Contents</label></h6>';
+        
+        foreach ( self::$toc as $name => $heading ) {
+            list($level, $anchor) = explode('::', $name);
+            if ( empty($level) || $level > 3 ) continue;
+
+            if ( $level < $depth ) {
+                $markup .= str_repeat('</ul></li>', $depth - $level);
+                $depth = $level;
+            } elseif ( $level == $depth )
+                $markup .= '</li>';
+            
+
+        
+            if ( $level > $depth ) {
+                $markup .= '<ul class="level-' . $level . '">';
+                $depth = $level;                
+                $parent = $depth;
+            }
+            
+            $markup .= sprintf('<li><a href="#%s">%s</a>', $anchor, $heading);
+            
+        }
+        $markup .= '</ul></menuitem></menu>';
+
+        return $markup;
+    }
+    
+    public static function markup() {
+        echo self::renderMarkup();
+    }
+    
+       public function wp_insert_post_data( $post_data, $record ) {
+        
+        if ( ! in_array($post_data['post_type'], array('page')) )
+            return $post_data;
+        
+        $post_data['post_content'] = self::parse($post_data['post_content']);
+               
+        self::$editing = isset( $record['ID'] ) ? $record['ID'] : false;
+        
+        return $post_data;
+    }
+    
+    public static function wp_insert_post( $post_id ) {
+        if ( empty(self::$toc) ) return;
+        if ( self::$editing && self::$editing != $post_id ) return;
+        update_post_meta($post_id, 'toc', self::$toc);        
+    }
+    
+    public static function parse( $content ) {
+        $markup = preg_replace_callback('{
+                ^<h([1-6])[^>]*>(.+?)<\/h[1-6]>* # HTML tags
+                |
+                       ^(\#{1,6})      # $1 = string of #\'s
+                       [ ]*
+                       (.+?)           # $2 = Header text
+                       [ ]*
+                       \#*                     # optional closing #\'s (not counted)
+                       (?:[ ]+ ' . self::$attr_regex . ' )?     # $3 = id/class attributes
+                       [ ]*
+                       \n+
+                       }xm',
+            array('WebKitTableOfContents', 'index'),
+            $content
+        );
+        
+        return $markup;
+    }
+    
+    public static function index( $matches ) {
+        list($marked, $level, $heading) = $matches;
+        $anchor = sanitize_title_with_dashes($heading);
+        self::$toc[ "$level::$anchor" ] = $heading;
+        return sprintf('<h%2$d><a name="%1$s"></a>%3$s</h%2$d>', $anchor, $level, $heading);
+    }
+}
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/plugins/visual-preview.php b/Websites/webkit.org/wp-content/plugins/visual-preview.php
new file mode 100644 (file)
index 0000000..94f83ee
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+/*
+Plugin Name: Visual Editor Read-Only
+Description: Changes the visual editor into a visual preview only
+Version:     1.0
+Author:      Jonathan Davis
+Author URI:  http://webkit.org
+*/
+add_filter( 'tiny_mce_before_init', function( $args ) {
+    $args['readonly'] = 1;
+    return $args;
+} );
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/themes/index.php b/Websites/webkit.org/wp-content/themes/index.php
new file mode 100644 (file)
index 0000000..4e6c07c
--- /dev/null
@@ -0,0 +1,3 @@
+<?php
+// Silence is golden.
+?>
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/themes/webkit/404.php b/Websites/webkit.org/wp-content/themes/webkit/404.php
new file mode 100644 (file)
index 0000000..ffc7cd8
--- /dev/null
@@ -0,0 +1,65 @@
+<?php get_header(); ?>
+<style>
+h1 {
+    font-size: 6rem;
+    font-weight: 100;
+    padding-top: 9rem;
+}
+h1, p, form {
+    margin-bottom: 3rem;
+}
+img {
+    float: right;
+    margin-top: -3rem;
+    width: 50vw;
+    max-width: 800px;
+}
+input {
+    display: inline-block;
+    box-sizing: border-box;
+    vertical-align: top;
+    height: 32px;
+    padding-top: 3px;
+    margin-bottom: 16px;
+    padding-left: 15px;
+    padding-right: 15px;
+    font-size: 15px;
+    color: #333333;
+    text-align: left;
+    border: 1px solid #d6d6d6;
+    border-radius: 4px;
+    background: white;
+    background-clip: padding-box;
+    font-family: "Myriad Set Pro", "Helvetica Neue", "Helvetica", "Arial", sans-serif;
+    font-size: 15px;
+    line-height: 1.33333;
+    font-weight: 400;
+    letter-spacing: normal;
+    font-size: 2rem;
+}
+
+input[type=submit] {
+    background-color: #1d9bd9;
+    background: -webkit-linear-gradient(#3baee7, #0088cc);
+    background: linear-gradient(#3baee7, #0088cc);
+    border-radius: 4px;
+    color: white;
+    cursor: pointer;
+    font-size: 1.5rem;
+    font-weight: 500;
+    text-align: center;
+    border: 0;
+}
+</style>
+
+<img src="<?php echo get_stylesheet_directory_uri(); ?>/images/squirrelfish-lives.svg" class="alignright">
+<h1>Not Found</h1>
+
+<p>Sorry this isn't the page you're looking for.</p>
+
+<p>You can try a search or return to the <a href="<?php bloginfo('siteurl'); ?>">home page</a>.</p>
+
+<?php echo get_search_form(); ?>
+
+
+<?php get_footer(); ?>
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/themes/webkit/444.php b/Websites/webkit.org/wp-content/themes/webkit/444.php
new file mode 100644 (file)
index 0000000..788b916
--- /dev/null
@@ -0,0 +1,63 @@
+<style>
+h1 {
+    font-size: 6rem;
+    font-weight: 100;
+    padding-top: 9rem;
+}
+h1, p, form {
+    margin-bottom: 3rem;
+}
+img {
+    float: right;
+    margin-top: -3rem;
+    width: 50vw;
+    max-width: 800px;
+}
+input {
+    display: inline-block;
+    box-sizing: border-box;
+    vertical-align: top;
+    height: 32px;
+    padding-top: 3px;
+    margin-bottom: 16px;
+    padding-left: 15px;
+    padding-right: 15px;
+    font-size: 15px;
+    color: #333333;
+    text-align: left;
+    border: 1px solid #d6d6d6;
+    border-radius: 4px;
+    background: white;
+    background-clip: padding-box;
+    font-family: "Myriad Set Pro", "Helvetica Neue", "Helvetica", "Arial", sans-serif;
+    font-size: 15px;
+    line-height: 1.33333;
+    font-weight: 400;
+    letter-spacing: normal;
+    font-size: 2rem;
+}
+
+input[type=submit] {
+    background-color: #1d9bd9;
+    background: -webkit-linear-gradient(#3baee7, #0088cc);
+    background: linear-gradient(#3baee7, #0088cc);
+    border-radius: 4px;
+    color: white;
+    cursor: pointer;
+    font-size: 1.5rem;
+    font-weight: 500;
+    text-align: center;
+    border: 0;
+}
+</style>
+
+<img src="<?php echo get_stylesheet_directory_uri(); ?>/images/squirrelfish-lives.svg" class="alignright">
+<h1>No Content</h1>
+
+<p>Sorry the contents of this page couldn't be loaded.</p>
+
+<p>You can try a search or return to the <a href="<?php bloginfo('siteurl'); ?>">home page</a>.</p>
+
+<?php echo get_search_form(); ?>
+
+
diff --git a/Websites/webkit.org/wp-content/themes/webkit/footer.php b/Websites/webkit.org/wp-content/themes/webkit/footer.php
new file mode 100644 (file)
index 0000000..820aa87
--- /dev/null
@@ -0,0 +1,12 @@
+    </main><!-- #content -->
+        
+    <footer class="page-width">
+    <hr>
+    <nav id="footer-nav" aria-label="Footer menu"><?php wp_nav_menu( array('theme_location'  => 'footer-nav') ); ?></nav>
+    </footer>
+
+<?php if ( is_front_page() ): ?></div> <!-- .page-layer --><?php endif; ?>
+
+<?php wp_footer() ?>
+</body>
+</html>
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/themes/webkit/front-header.php b/Websites/webkit.org/wp-content/themes/webkit/front-header.php
new file mode 100644 (file)
index 0000000..08e3dc2
--- /dev/null
@@ -0,0 +1,409 @@
+    <style>
+    body.home {
+        background-color: white;
+    }
+
+    .home .site-logo {
+        opacity: 0;
+        transition: opacity 0.5s ease-out;
+    }
+
+    .home .page-layer {
+        background-color: #f7f7f7;
+        border-top: 1px solid #e7e7e7;
+        position: relative;
+        z-index: 1;
+    }
+
+    .admin-bar header {
+        top: 32px;
+    }
+
+    .home header {
+        -webkit-backdrop-filter: none;
+        border: none;
+        background: none;
+        position: fixed;
+
+    }
+
+    .hero a {
+        text-decoration: none;
+        z-index: 5;
+    }
+
+    .hero {
+        height: 800px;
+        margin-bottom: 3rem;
+        overflow: hidden;
+        background: none;
+        box-sizing: border-box;
+
+        position: fixed;
+        top: 0;
+        left: 0;
+        width: 100vw;
+
+        background-image: radial-gradient(65vw at 50% 40%, white 50%, rgba(255, 255, 255, 0.00) 100%), linear-gradient(180deg, rgb(255, 255, 255) 10%, rgb(232, 232, 232) 32%);
+        background-position: 0% 0%;
+    }
+
+    .admin-bar .hero.spacing {
+        margin-top: -32px;
+    }
+
+    .hero.spacing {
+        position: relative;
+        height: auto;
+        visibility: hidden;
+    }
+
+    .hero .logo {
+        text-align: left;
+        margin: 3rem auto 0;
+        padding-left: 12rem;
+        padding-bottom: 3px;
+        box-sizing: border-box;
+
+        line-height: 10rem;
+        font-size: 6rem;
+        font-weight: 200;
+        color: #444;
+
+        background-repeat: no-repeat;
+        background-size: 10rem;
+        background-position: left 1rem;
+    }
+
+    .admin-bar .hero .logo {
+        margin-top: 5rem;
+    }
+
+    .hero .tagline {
+        text-align: left;
+        display: block;
+        font-size: 3rem;
+        font-weight: 200;
+        line-height: 1.125;
+        margin-top: -2.5rem;
+        margin-bottom: 2rem;
+        color: #555;
+    }
+
+    .intro .column {
+        position: relative;
+        font-size: 2.4rem;
+        line-height: 1.35417;
+        font-weight: 200;
+        box-sizing: border-box;
+        width: 42.24561404%;
+        display: inline-block;
+        vertical-align: text-top;
+    }
+
+    .intro .column h2 {
+        font-size: 3.2rem;
+        line-height: 1.125;
+        font-weight: 200;
+        letter-spacing: 0em;
+        display: block;
+        margin-top: 3rem;
+        margin-bottom: 1.8rem;
+    }
+
+    .intro .column:first-child {
+        margin-right: 14.63157894%;
+    }
+
+
+    .home .floating {
+        border-bottom: 1px solid #e7e7e7;
+        background: rgba(255,255,255,0.9);
+    }
+
+    @supports ( -webkit-backdrop-filter: blur(10px) ) {
+        .home .floating {
+            backdrop-filter: blur(10px);
+            -webkit-backdrop-filter: blur(10px);
+            background: rgba(255,255,255,0.8);
+        }
+    }
+
+    .home .site-logo.fade {
+        opacity: 1;
+    }
+
+    .particles {
+        position: relative;
+        top: 0;
+        left: 0;
+        width: 100%;
+        height: 100%;
+        -webkit-transform-origin: center center;
+          -ms-transform-origin: center center;
+              transform-origin: center center;
+    }
+
+    .particle {
+        position: absolute;
+        background: white;
+        opacity: .7;
+        border-radius: 50%;
+        z-index: -2;
+    }
+    
+    @media only screen and (max-width: 782px) {
+        
+        .admin-bar header {
+            top: 46px;
+        }
+    
+        .admin-bar .hero.spacing {
+            margin-top: -46px;
+        }
+    
+        .hero {
+            position: absolute;
+        }
+        
+        .intro .column {
+            width: 100%;
+        }
+        
+    }
+    
+    @media only screen and (max-width: 600px) {
+    
+        .hero .logo,
+        .hero .tagline,
+        .hero .particle {
+            display: none;
+        }
+    
+        .hero {
+           padding-top: 8rem;
+        }
+        
+        .admin-bar .hero {
+            padding-top: 13rem;
+        }
+        
+/*        .admin-bar .hero.spacing {
+            margin-top: calc(13rem - 46px);
+        }*/
+    
+        .home header {
+            padding-top: 1rem;
+            position: absolute;
+        }
+
+        .home .site-logo {
+            opacity: 1;
+            margin-top: 0;
+        }
+
+        .home header {
+            border-bottom: 1px solid #e7e7e7;
+            background: rgba(255,255,255,0.9);
+        }
+
+        @supports ( -webkit-backdrop-filter: blur(10px) ) {
+            .home header {
+                backdrop-filter: blur(10px);
+                -webkit-backdrop-filter: blur(10px);
+                background: rgba(255,255,255,0.8);
+            }
+        }
+    
+        .home .pagination .next-button {
+            width: 100%;
+        }
+    
+    }
+    
+    @media only screen and (max-height: 415px) {
+        .hero .logo,
+        .hero .tagline,
+        .hero .particle {
+            display: none;
+        }
+    
+        .home .site-logo {
+            opacity: 1;
+            margin-top: 0;
+        }
+        .home .hero {
+            margin: 7rem 0 0;
+        }
+    
+        .home.admin-bar .hero {
+            margin-top: 12rem;
+        }
+    
+        header,
+        .home header {
+            padding-top: 1rem;
+            position: absolute;
+        }
+        .home header {
+            border-bottom: 1px solid #e7e7e7;
+            background: rgba(255,255,255,0.9);
+        }
+
+        @supports ( -webkit-backdrop-filter: blur(10px) ) {
+            .home header {
+                backdrop-filter: blur(10px);
+                -webkit-backdrop-filter: blur(10px);
+                background: rgba(255,255,255,0.8);
+            }
+        }
+    }
+        
+    <?php 
+        
+        function rand_outside_circle() {
+            srand();
+            $circle_x = 50;
+            $circle_y = 40;
+            $circle_r = 32;
+            $x = rand(0, 100); 
+            $y = rand(0, 100);
+            
+            // Avoid starting or ending inside the white fill gradient
+            if ( pow(($x - $circle_x), 2) + pow(($y - $circle_y), 2) <= pow($circle_r, 2) )
+                return rand_outside_circle();
+            
+            return array($x . "vw", $y . "vh");
+        }
+        
+        for ($i = 1; $i < 101; $i++): 
+            $size = rand(5, 80) . "px";
+            list($Xorigin, $Yorigin) = rand_outside_circle();
+            list($Xend, $Yend) = rand_outside_circle();
+            $from_opacity = rand(3, 8) / 10;
+            $to_opacity = rand(3, 8) / 10;
+        ?>
+        .particle:nth-child(<?php echo $i; ?>){
+            height: <?php echo $size; ?>; width: <?php echo $size; ?>;
+            transform: translate(<?php echo $Xorigin; ?>,  <?php echo $Yorigin; ?>);
+            opacity: <?php echo $from_opacity; ?>;
+            animation: move-<?php echo $i; ?> 60s ease-out;
+            animation-direction: alternate;
+            animation-fill-mode: forwards;
+            -webkit-animation-fill-mode: forwards;
+        }
+
+        @keyframes move-<?php echo $i; ?> {
+            100% {
+                transform: translate(<?php echo $Xend; ?>, <?php echo $Yend; ?>);
+                opacity: <?php echo $to_opacity; ?>;
+            }
+        }
+    <?php endfor; ?>
+    </style>
+    <div id="hero" class="hero">
+        <?php for ($i = 0; $i < 101; $i++)
+            echo "<div class=\"particle\"></div>"; ?>
+        <div class="intro page-width">
+        <a href="/"><h1 class="logo">WebKit <span class="tagline">Open Source Web Browser Engine</span></h1></a>
+       
+        <?php if ( is_front_page() && have_posts()): the_post(); ?><div class="intro-copy"><?php 
+            $content = get_the_content();
+            $columns = explode('<br />', $content);
+            foreach ( $columns as $column )
+                echo "<div class=\"column\">$column</div>";
+        ?></div><?php endif; ?>
+        </div>
+    </div>
+    <div class="hero spacing">
+        <div class="intro page-width">
+        <a href="/"><h1 class="logo">WebKit <span class="tagline">Open Source Web Browser Engine</span></h1></a>
+       
+        <?php if ( ! empty($columns) ): ?><div class="intro-copy"><?php 
+            foreach ( $columns as $column )
+                echo "<div class=\"column\">$column</div>";
+        ?></div><?php endif; ?>
+        </div>
+    </div>
+    <script>
+    var latestScrollY = NaN, scrollV = 0, updating = false, layer = false,
+        header = document.getElementById("header"),
+        hero = document.getElementById("hero"),
+        scrollBoundary = 353;
+        
+    header.animating = false;
+    logo.animating = false;
+    
+    function onScroll() {
+        if (isNaN(latestScrollY)) 
+            latestScrollY = window.scrollY;
+        
+       if (!updating)
+               requestAnimationFrame(update);
+       updating = true;
+    }
+
+    function update() {
+        updating = false;
+        
+        if (document.body.offsetWidth <= 508) return;
+        
+        if (latestScrollY != window.scrollY) {
+            scrollV = window.scrollY - latestScrollY;
+            latestScrollY = window.scrollY;
+            
+            if (!layer) {
+                layer = document.getElementsByClassName("page-layer").item(0);
+            }
+            
+            scrollBoundary = layer.offsetTop - header.offsetHeight;
+        }
+                
+        if (latestScrollY >= scrollBoundary) {
+            addAnimationClass(header, "floating");
+            if (!logo.classList.contains('fade'))
+                setAnimateSpeed(logo, scrollV);
+            addAnimationClass(logo, "fade");
+        } else if (latestScrollY < scrollBoundary) {
+            removeAnimationClass(header, "floating");
+            if (logo.classList.contains('fade'))
+                setAnimateSpeed(logo, 10);
+            removeAnimationClass(logo, "fade");
+        }
+        
+    }
+
+    function setAnimateSpeed(element, velocity) {
+        if (element.animating) return;
+        var duration = Math.abs(3 / (velocity * 1.618));
+        element.style["-webkit-transition-duration"] = duration + "s";
+    }
+    
+    function addAnimationClass(element, classname) {
+        if (element.classList.contains(classname)) return;
+        if (element.animating) return;
+        
+        element.classList.add(classname.trim());
+        animatingElement(element);
+    }
+    
+    function animatingElement(element) {
+        element.animating = true;
+        element.addEventListener("transitionend", function () {
+            element.animating = false;
+        });            
+    }
+    
+    function removeAnimationClass(element, classname) {
+        if (!element.classList.contains(classname)) return;
+        if (element.animating) return;
+
+        element.classList.remove(classname.trim());
+        animatingElement(element);
+    }
+
+    window.addEventListener("scroll", onScroll, false);
+    window.addEventListener("resize", onScroll, false);
+    </script>
+        
+<div class="page-layer">
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/themes/webkit/front-page.php b/Websites/webkit.org/wp-content/themes/webkit/front-page.php
new file mode 100644 (file)
index 0000000..e905f4d
--- /dev/null
@@ -0,0 +1,21 @@
+<?php get_header(); ?>
+
+<div id="posts" class="tiles">
+<?php
+Front_Page_Posts::object(); // Initialize Front Page Posts query
+
+if ( ! dynamic_sidebar('Home Tiles') ):
+    $Query = Front_Page_Posts::WP_Query();
+    while ( $Query->have_posts() ): 
+        $Query->the_post(); 
+        get_template_part('loop'); 
+    endwhile;
+endif; 
+?>
+</div>
+
+<div class="pagination">
+<a href="<?php echo get_permalink( get_option( 'page_for_posts' ) ) ?>" class="page-numbers next-button"><?php _e('More Blog Posts')?></a>
+</div>
+
+<?php get_footer(); ?>
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/themes/webkit/functions.php b/Websites/webkit.org/wp-content/themes/webkit/functions.php
new file mode 100644 (file)
index 0000000..5737850
--- /dev/null
@@ -0,0 +1,308 @@
+<?php
+
+// Declare theme features
+add_theme_support( 'post-thumbnails' ); 
+
+function register_menus() {
+}
+add_action( 'init', function () {
+    register_nav_menu('site-nav', __( 'Site Navigation' ));
+    register_nav_menu('footer-nav', __( 'Footer Navigation' ));
+    register_nav_menu('sitemap', __( 'Site Map Page' ));
+} );
+
+function modify_contact_methods($profile_fields) {
+
+       // Add new fields
+       $profile_fields['twitter'] = 'Twitter Handle';
+       unset($profile_fields['aim']);
+       unset($profile_fields['yim']);
+       unset($profile_fields['jabber']);
+
+       return $profile_fields;
+}
+
+add_filter('user_contactmethods', function ($fields) {
+    // Add Twitter field to user profiles
+       $fields['twitter'] = 'Twitter Handle';
+    
+    // Remove unused social networks
+       unset($fields['aim']);
+       unset($fields['yim']);
+       unset($fields['jabber']);
+
+       return $fields;
+});
+
+add_action('init', function () {
+       register_sidebar(array(
+               'name'=> 'Home Tiles',
+               'id' => 'tiles',
+               'before_widget' => '',
+               'after_widget' => '',
+               'before_title' => '',
+               'after_title' => '',
+       ));
+} );
+
+add_filter('the_title', function( $title ) {
+    if ( is_admin() ) return $title;
+    $title = str_replace(": ", ":<br>", $title);
+    return $title;
+});
+
+// Hide category 41: Legacy from archives
+add_filter('pre_get_posts', function ($query) {
+    if ( $query->is_home() )
+        $query->set('cat', '-41');
+    return $query;
+});
+
+
+include('widgets/post.php');
+include('widgets/icon.php');
+include('widgets/twitter.php');
+include('widgets/page.php');
+
+add_filter( 'get_the_excerpt', function( $excerpt ) {
+    $sentences = preg_split( '/(\.|!|\?)\s/', $excerpt, 2, PREG_SPLIT_DELIM_CAPTURE );
+    
+    // if ( empty($sentences[1]) )
+    //     $sentences[1] = '&hellip;';
+    
+    return $sentences[0] . $sentences[1];
+
+});
+
+function table_of_contents() {
+    if ( class_exists('WebKitTableOfContents') )
+        WebKitTableOfContents::markup();
+}
+
+function has_table_of_contents() {
+    if ( class_exists('WebKitTableOfContents') )
+        return WebKitTableOfContents::hasIndex();
+}
+
+function table_of_contents_index( $content, $post_id ) {
+    if ( ! class_exists('WebKitTableOfContents') )
+        return $content;
+    $content = WebKitTableOfContents::parse($content);
+    WebKitTableOfContents::wp_insert_post($post_id);
+    return $content;
+}
+
+function tag_post_image_luminance( $post_id ) {
+    $threshold = 128;
+    $tags = array();
+
+    // Get the image data
+       $image_url = wp_get_attachment_image_src( get_post_thumbnail_id($post_id), 'small' )[0];
+    
+    if ( empty($image_url) ) return $post_id;
+    
+    // detect luminence value
+    $luminance = calculate_image_luminance($image_url);
+    $tags = wp_get_post_tags($post_id, array('fields' => 'names'));
+
+    if ( $luminance < $threshold )
+        $tags[] = 'dark';
+    elseif ( false !== ( $key = array_search('dark', $messages) ) )
+        unset($tags[ $key ]);
+
+    // Set a tag class
+    if ( ! empty($tags) )
+        wp_set_post_tags( $post_id, $tags, true );
+    
+    return $post_id;
+}
+
+function calculate_image_luminance($image_url) {
+    // Get original image dimensions
+    $size = getimagesize($image_url);
+    
+    // Create image resource from source image
+    $image = ImageCreateFromString(file_get_contents($image_url));
+    
+    // Allocate image resource
+    $sample = ImageCreateTrueColor(1, 1);
+    
+    // Flood fill with a white background (to properly calculate luminance of PNGs with alpha)
+    ImageFill($sample , 0, 0, ImageColorAllocate($sample, 255, 255, 255));
+    
+    // Downsample to 1x1 image
+    ImageCopyResampled($sample, $image, 0, 0, 0, 0, 1, 1, $size[0], $size[1]);
+
+    // Get the RGB value of the pixel
+    $rgb   = ImageColorAt($sample, 0, 0);    
+    $red   = ($rgb >> 16) & 0xFF;
+    $green = ($rgb >> 8) & 0xFF;
+    $blue  = $rgb & 0xFF;
+    
+    // Calculate relative luminance value (https://en.wikipedia.org/wiki/Relative_luminance)
+    return ( 0.2126 * $red + 0.7152 * $green + 0.0722 * $blue);
+}
+
+function html_select_options(array $list, $selected = null, $values = false, $append = false) {
+               if ( ! is_array($list) ) return '';
+
+               $_ = '';
+        
+               // Append the options if the selected value doesn't exist
+               if ( ( ! in_array($selected, $list) && ! isset($list[ $selected ])) && $append )
+                       $_ .= '<option value="' . esc_attr($selected) . '">' .esc_html($selected) . '</option>';
+
+               foreach ( $list as $value => $text ) {
+
+                       $value_attr = $selected_attr = '';
+
+                       if ( $values ) $value_attr = ' value="' . esc_attr($value) . '"';
+                       if ( ( $values && (string)$value === (string)$selected)
+                               || ( ! $values && (string)$text === (string)$selected ) )
+                                       $selected_attr = ' selected="selected"';
+    
+                       if ( is_array($text) ) {
+                               $label = $value;
+                               $_ .= '<optgroup label="' . esc_attr($label) . '">';
+                               $_ .= self::menuoptions($text, $selected, $values);
+                               $_ .= '</optgroup>';
+                               continue;
+                       } else $_ .= "<option$value_attr$selected_attr>$text</option>";
+
+               }
+               return $_;
+       }
+
+add_filter('save_post', 'tag_post_image_luminance');
+
+add_filter('next_post_link', function ( $format ) {
+    return str_replace('href=', 'class="page-numbers next-post" href=', $format);
+});
+add_filter('previous_post_link', function ( $format ) {
+    return str_replace('href=', 'class="page-numbers prev-post" href=', $format);
+});
+
+
+
+// Queue global scripts
+add_action( 'wp_enqueue_scripts', function () {
+    wp_register_script(
+        'theme-global',
+        get_stylesheet_directory_uri() . '/scripts/global.js',
+        false,
+        '1.0',
+        true
+    );
+
+    wp_enqueue_script( 'theme-global' );
+
+} );
+
+class Responsive_Toggle_Walker_Nav_Menu extends Walker_Nav_Menu {
+    
+    private $toggleid = null;
+    
+       public function start_lvl( &$output, $depth = 0, $args = array() ) {
+        $output .= "\n" . str_repeat("\t", $depth);
+        if ( ! empty($this->toggleid) )
+            $output .= "<input type=\"checkbox\" id=\"toggle-{$this->toggleid}\" class=\"menu-toggle\" />";
+        $classes = array("sub-menu");
+        if ( 0 == $depth ) {
+            $classes[] = "sub-menu-layer";
+        }
+        $id = ( 0 == $depth ) ? " id=\"sub-menu-for-{$this->toggleid}\"" : '';
+        $class_names = esc_attr(join( ' ', $classes ));
+        $output .= "<ul class=\"$class_names\" role=\"menu\"$id>\n";
+    }
+    
+       public function end_lvl( &$output, $depth = 0, $args = array() ) {
+               $indent = str_repeat("\t", $depth);
+               $output .= "$indent</ul>\n";
+       }
+    
+    public function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
+        
+        $before = $args->link_before;
+        $after = $args->link_after;
+        
+        if ( in_array('menu-item-has-children', $item->classes) && 0 == $depth ) {
+            $args->link_before = "<label for=\"toggle-{$item->ID}\" class=\"label-toggle\">" . $args->link_before;
+            $args->link_after .= "</label>";
+            $this->toggleid = $item->ID;
+            $item->url = '#nav-sub-menu';
+        } elseif ( in_array('menu-item-has-children', $item->classes) && 1 == $depth ) {
+            // $item->role = "presentation";
+        } else $toggleid = null;        
+        
+               $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
+
+               $classes = empty( $item->classes ) ? array() : (array) $item->classes;
+               $classes[] = 'menu-item-' . $item->ID;
+
+               $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args, $depth ) );
+               $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';
+
+               $id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args, $depth );
+               $id = $id ? ' id="' . esc_attr( $id ) . '"' : '';
+
+               $output .= $indent . '<li' . $id . $class_names . '>';
+
+               $atts = array();
+               $atts['title']  = ! empty( $item->attr_title ) ? $item->attr_title : '';
+               $atts['target'] = ! empty( $item->target )     ? $item->target     : '';
+               $atts['rel']    = ! empty( $item->xfn )        ? $item->xfn        : '';
+               $atts['href']   = ! empty( $item->url )        ? $item->url        : '';
+        $atts['role']   = ! empty( $item->role )       ? $item->role       : '';
+        
+        if ( in_array('menu-item-has-children', $item->classes) && 0 == $depth ) {
+            $atts['aria-haspopup'] = "true";
+            $atts['aria-owns'] = 'sub-menu-for-' . $item->ID;
+            $atts['aria-controls'] = 'sub-menu-for-' . $item->ID;
+            $atts['aria-expanded'] = 'true';
+        }
+        
+               $atts = apply_filters( 'nav_menu_link_attributes', $atts, $item, $args, $depth );
+
+               $attributes = '';
+               foreach ( $atts as $attr => $value ) {
+                       if ( ! empty( $value ) ) {
+                               $value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );
+                               $attributes .= ' ' . $attr . '="' . $value . '"';
+                       }
+               }
+
+               $item_output = $args->before;
+               $item_output .= '<a'. $attributes .'>';
+               $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
+               $item_output .= '</a>';
+               $item_output .= $args->after;
+
+               $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
+        
+        $args->link_before = $before;
+        $args->link_after = $after;
+    }
+    
+}
+
+class Front_Page_Posts {
+    
+       private static $object;     // Singleton instance
+    private static $wp_query;   // WP_Query instance
+    
+       public static function &object () {
+               if ( ! self::$object instanceof self )
+                       self::$object = new self;
+        
+        if ( empty(self::$wp_query) )
+            self::$wp_query = new WP_Query(array('post_type' => 'post'));
+        
+               return self::$object;
+       }
+    
+    public static function WP_Query() {
+        return self::$wp_query;
+    }
+    
+}
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/themes/webkit/header.php b/Websites/webkit.org/wp-content/themes/webkit/header.php
new file mode 100644 (file)
index 0000000..ec994f2
--- /dev/null
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
+    <meta name="robots" content="noodp">
+
+    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=yes">
+    
+    <title><?php if ( is_front_page() ) echo "WebKit"; 
+        else { wp_title(''); echo ' | WebKit'; } ?></title>
+
+    <meta name="application-name" content="WebKit">
+
+    <link rel="stylesheet" type="text/css" href="<?php echo get_stylesheet_uri(); ?>" media="all">
+    <link rel="stylesheet" href="https://www.apple.com/wss/fonts?family=Myriad+Set+Pro&v=1" type="text/css" />
+
+    <link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="<?php bloginfo('rss2_url'); ?>">
+    <link rel="alternate" type="text/xml" title="RSS .92" href="<?php bloginfo('rss_url'); ?>">
+    <link rel="alternate" type="application/atom+xml" title="Atom 0.3" href="<?php bloginfo('atom_url'); ?>">
+    <link rel="pingback" href="<?php bloginfo('pingback_url'); ?>">
+
+    <link rel="shortcut icon" sizes="32x32" type="image/x-icon" href="/favicon.ico">
+    <link rel="mask-icon" href="tabicon.svg" color="#0088cc">
+
+    <?php wp_head(); ?>
+</head>
+<body <?php body_class(); ?>>
+
+    <header aria-label="WebKit.org Header" id="header">
+        <div class="page-width">
+        <a href="/"><div id="logo" class="site-logo">WebKit <span class="tagline">Open Source Web Browser Engine</span></div></a>
+        <nav id="site-nav" aria-label="Site Menu">
+<?php wp_nav_menu( array(
+'walker'          => new Responsive_Toggle_Walker_Nav_Menu(),
+'theme_location'  => 'site-nav',
+'items_wrap'      => '<label for="%1$s-toggle" class="label-toggle main-menu" data-open="Main Menu" data-close="Close Menu" onclick></label><input type="checkbox" id="%1$s-toggle" class="menu-toggle" /><ul id="%1$s" class="%2$s" role="menubar">%3$s</ul>',
+) ); ?></nav>
+        </div>
+    </header>
+
+<?php 
+if ( is_front_page() )
+    include('front-header.php');
+?>
+<main id="content" class="page-width">
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/themes/webkit/images/download.svg b/Websites/webkit.org/wp-content/themes/webkit/images/download.svg
new file mode 100644 (file)
index 0000000..f5ed2ff
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright © 2015 Apple Inc. All rights reserved. -->
+<svg viewBox="0 0 47 47" version="1.1" xmlns="http://www.w3.org/2000/svg">
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" >
+        <circle id="Oval-1" stroke="white" stroke-width="3" cx="23.5" cy="23.5" r="21.5"/>
+        <path d="M 21.9000244 31.9295486 L 11.9704758 22 L 10 23.9687873 L 23.3982222 37.368698 L 36.7930675 23.9687873 L 34.8225917 22 L 24.9000244 31.9255003 L 24.9000244 11.5 L 24.9000244 10 L 21.9000244 10 L 21.9000244 11.5 L 21.9000244 31.9295486 L 21.9000244 31.9295486 Z" fill="white"/>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/themes/webkit/images/icons.svg b/Websites/webkit.org/wp-content/themes/webkit/images/icons.svg
new file mode 100644 (file)
index 0000000..14260cb
--- /dev/null
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright © 2015 Apple Inc. All rights reserved. -->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="48"
+    height="528">
+    <style>
+        symbol { color: white; }
+    </style>
+    
+    <defs>
+        
+        <symbol id="compass">
+            <path d="M 24 45.7600002 L 24 45.7600002 C 36.0177159 45.7600002 45.7599999 36.0177161 45.7599999 24.0000001 C 45.7599999 11.9822838 36.0177159 2.24000001 24 2.24000001 C 11.9822838 2.24000001 2.23999999 11.9822838 2.23999999 24.0000001 C 2.23999999 36.0177161 11.9822838 45.7600002 24 45.7600002 L 24 45.7600002 L 24 45.7600002 L 24 45.7600002 Z M 24 48 L 24 48 C 10.745166 48 8.52651283e-14 37.254834 8.52651283e-14 24.0000001 C 8.52651283e-14 10.745166 10.745166 0 24 0 C 37.254834 0 48 10.745166 48 24.0000001 C 48 37.254834 37.254834 48 24 48 L 24 48 L 24 48 L 24 48 Z" fill="currentColor"/>
+            <path d="M 19.2141787 30.7527044 C 20.0566026 31.3582067 21.0164459 31.8087988 22.052466 32.0629879 L 24.0150243 38.3621108 L 25.9644157 32.0671275 C 28.9532689 31.3397602 31.304042 28.97474 32.0270276 25.9677724 L 38.2840894 24.0065666 L 32.38318 22.1457238 L 30.1049072 24.2136546 C 29.9995478 27.5073249 27.2907334 30.1510903 24.0134391 30.1359337 C 23.1661809 30.1431339 22.3840431 29.959524 21.6645278 29.6641888 L 19.2141787 30.7527044 L 19.2141787 30.7527044 L 19.2141787 30.7527044 Z M 28.8019182 17.2563866 C 27.4120183 16.2548466 25.9438825 15.9331447 25.9438825 15.9331447 L 23.9849759 9.63788916 L 22.0355845 15.9328727 C 19.0467312 16.6602398 16.695958 19.0252601 15.9729726 22.0322277 L 9.71591065 23.9934336 C 9.71591065 23.9934336 13.7573684 25.2679011 15.7780972 25.9051349 L 17.8923556 23.9486543 C 17.9116726 20.5783691 20.6200789 17.8803136 23.9912031 17.8674375 C 24.8266313 17.8130168 26.1806153 18.2277657 26.3381938 18.3358993 C 26.3381937 18.3358993 28.8019182 17.2563866 28.8019182 17.2563866 L 28.8019182 17.2563866 L 28.8019182 17.2563866 Z" fill="currentColor"/>
+            <path d="M 22.4528571 21.5612813 L 10.1267612 32.8610634 L 25.4820204 26.3285511 L 37.8732388 15.1389366 L 22.4528571 21.5612813 L 22.4528571 21.5612813 L 22.4528571 21.5612813 Z" fill="currentColor"/>
+        </symbol>
+
+        <symbol id="performance">
+            <path d="M 24 45.76 L 24 45.76 C 36.0177161 45.76 45.76 36.0177162 45.76 24 C 45.76 11.9822838 36.0177161 2.24 24 2.24 C 11.9822838 2.24 2.24 11.9822838 2.24 24 C 2.24 36.0177162 11.9822838 45.76 24 45.76 L 24 45.76 L 24 45.76 L 24 45.76 Z M 24 48 L 24 48 C 10.745166 48 -1.77635684e-14 37.254834 -1.77635684e-14 24 C -1.77635684e-14 10.745166 10.745166 2.84217094e-14 24 2.84217094e-14 C 37.254834 2.84217094e-14 48 10.745166 48 24 C 48 37.254834 37.254834 48 24 48 L 24 48 L 24 48 L 24 48 Z" fill="currentColor"/>
+            <path d="M 25.4586474 22.9633529 L 36.6273818 12.9367924 L 19.3784717 20.0882179 L 22.54035 25.0378408 L 11.3720064 35.0646845 L 28.6179627 27.9103051 L 25.4586474 22.9633529 L 25.4586474 22.9633529 Z" fill="currentColor"/>
+        </symbol>
+
+        <symbol id="inspector">
+            <path d="M 28.5 25.5 L 48 25.5 L 48 23 L 28.5 23 L 28.5 25.5" fill="currentColor"/>
+            <path d="M 23 28.5 L 23 48 L 25.5 48 L 25.5 28.5 L 23 28.5" fill="currentColor"/>
+            <path d="M 0 25.5 L 19.5 25.5 L 19.5 23 L 5.99520433e-15 23 L 0 25.5" fill="currentColor"/>
+            <path d="M 23 0 L 23 19.5 L 25.5 19.5 L 25.5 0 L 23 0" fill="currentColor"/>
+            <circle stroke="currentColor" fill="none" stroke-width="2.5" cx="24" cy="24" r="18"/>
+        </symbol>
+        
+        <symbol id="script">
+            <path d="M 11.4057939 18.0146224 C 12.1528885 17.323319 13.14598 16.88131 14.2562501 16.88131 C 16.6587038 16.88131 18.5125003 18.9853621 18.5125003 21.1375602 C 18.5125003 21.1375602 20.178953 19.4758651 21.0121793 18.6450175 C 23.6138782 16.0507463 28.817276 10.8622038 28.817276 10.8622038 C 28.817276 10.8622038 39.1931445 22.2383022 39.5748423 22.7381568 C 40.0895548 23.4122017 41.2154452 24.6437363 41.2154452 26.8207002 C 41.2154452 27.9043457 40.7691081 28.9601004 40.0240604 29.7480538 C 39.2725506 30.5428415 23.5041804 46.2228621 24.256517 45.5146369 C 25.0871144 44.7325638 25.6062505 43.6260296 25.6062505 42.4188109 C 25.6062505 40.105895 24.4995839 38.9998346 23.9516194 38.3444074 C 23.9377433 38.32781 23.4369464 37.7753288 22.6469581 36.9043367 L 17.0937502 42.4188109 C 17.0937502 44.7694729 18.9993383 46.675061 21.3500004 46.675061 C 22.4737422 46.675061 23.4957691 46.2309411 24.256517 45.5146369 L 24.256517 45.5146368 C 24.2567055 45.5144594 24.256895 45.5142809 24.2570855 45.5141014 C 25.0873513 44.7320588 25.6062505 43.6257541 25.6062505 42.4188109 C 25.6062505 40.105895 24.4995839 38.9998346 23.9516194 38.3444074 C 23.4036549 37.6889802 12.6902909 25.9456715 11.9591809 25.1002579 C 11.2280709 24.2548443 10 23.3242225 10 21.1375602 C 10 19.9614421 10.5362909 18.819193 11.4057939 18.0146224 C 10.5362926 18.8191912 26.254167 3.0662162 27.2247918 2.26492532 C 27.9645636 1.65421303 28.8917931 1.2750595 29.8625007 1.2750595 C 32.1068344 1.2750595 34.1634331 3.37253043 34.1634331 5.53130965 L 18.5125003 21.1375602 C 18.5125003 18.9853621 16.6587038 16.88131 14.2562501 16.88131 C 13.1459801 16.88131 12.1528886 17.323319 11.405794 18.0146222 Z" stroke="currentColor" stroke-width="2.5" fill="none"/>            
+        </symbol>
+
+        <symbol id="style">
+            <path d="M 34.3509426 18.7507162 C 32.564454 17.6916021 31.096954 15.1643395 31.0728076 13.0728197 L 30.9858202 5.538126 C 30.9618449 3.46142442 32.3778969 2.62894951 34.1771329 3.69562079 L 40.6588754 7.538301 C 42.445364 8.597415 43.912864 11.1246777 43.9370104 13.2161974 L 44.0239979 20.7508912 C 44.0479731 22.8275927 42.6319212 23.6600677 40.8326851 22.5933964 L 34.3509426 18.7507162 L 34.3509426 18.7507162 L 34.3509426 18.7507162 Z" stroke="currentColor" stroke-width="2.5" fill="none"/>
+            <path d="M 22.3883659 25.2906441 C 20.6046264 24.23316 19.1392369 21.6969806 19.1152755 19.6214854 L 18.9412495 4.54767084 C 18.9173111 2.47416506 20.3422003 1.64950223 22.1276511 2.70800103 L 35.0949445 10.3956191 C 36.8786839 11.4531034 38.3440734 13.9892828 38.3680349 16.064778 L 38.5420608 31.1385925 C 38.5659993 33.2120983 37.14111 34.0367611 35.3556591 32.9782623 L 22.3883659 25.2906441 L 22.3883659 25.2906441 L 22.3883659 25.2906441 Z" stroke="currentColor" stroke-width="2.5" fill="none"/>
+            <path d="M 8.57225363 34.8880373 C 6.19393433 33.4780584 4.24008165 30.0964858 4.2081331 27.3291589 L 3.97609854 7.2307395 C 3.94418061 4.46606514 5.84403281 3.36651469 8.224634 4.77784643 L 25.5143585 15.0280039 C 27.8926778 16.4379829 29.8465304 19.8195554 29.8784789 22.5868824 L 30.1105135 42.6853018 C 30.1424314 45.4499761 28.2425793 46.5495265 25.861978 45.1381948 L 8.57225363 34.8880373 L 8.57225363 34.8880373 L 8.57225363 34.8880373 Z" stroke="currentColor" stroke-width="2.5" fill="none"/>       
+        </symbol>
+        
+        <symbol id="standards">
+            <path d="M 8.20156221 41.7446204 L 4.60455725 1.39999998 L 44.1294427 1.39999998 L 40.5286241 41.7383005 L 24.34281 46.2255399 L 8.20156221 41.7446204 Z" stroke="currentColor" stroke-width="2.5" fill="none"/>
+            <path d="M 42.0710239 24.0177617 C 39.1538386 16.9070258 32.1617573 11.8990479 24 11.8990479 C 16.3635634 11.8990479 9.75107907 16.2831086 6.54212676 22.6716502" stroke="currentColor" stroke-width="2.5" fill="none"/>
+            <path d="M 30.9761247 44.4830419 C 32.2260967 41.0462637 32.9749756 36.6675422 32.9749756 31.8990479 C 32.9749756 20.8533529 28.9567421 11.8990479 24 11.8990479 C 19.0432579 11.8990479 15.0250244 20.8533529 15.0250244 31.8990479 C 15.0250244 36.5317055 15.7318455 40.7964804 16.9182797 44.1870585 L 16.9182797 44.1870585" stroke="currentColor" stroke-width="2.5" fill="none"/>
+            <path d="M 6.58618164 23.392334 C 6.58618164 25.4881886 14.5338788 27.1872144 24.3378601 27.1872144 C 34.1418414 27.1872144 42.0895386 25.4881886 42.0895386 23.392334" stroke="currentColor" stroke-width="2.5" fill="none"/>
+            <path d="M 7.57792629 35.5492537 C 10.9596878 37.443268 17.049483 38.7070228 24 38.7070228 C 31.5250917 38.7070228 38.041274 37.2256916 41.204187 35.0669761" stroke="currentColor" stroke-width="2.5" fill="none"/>
+            <path d="M 24.25 12.9990234 L 24.25 45" stroke="currentColor" stroke-width="2.5" fill="none"/>
+        </symbol>
+        
+        
+        <symbol id="contribute">
+            <path d="M 24 45.76 L 24 45.76 C 36.0177161 45.76 45.76 36.0177162 45.76 24 C 45.76 11.9822838 36.0177161 2.24 24 2.24 C 11.9822838 2.24 2.24 11.9822838 2.24 24 C 2.24 36.0177162 11.9822838 45.76 24 45.76 L 24 45.76 L 24 45.76 L 24 45.76 Z M 24 48 L 24 48 C 10.745166 48 -1.77635684e-14 37.254834 -1.77635684e-14 24 C -1.77635684e-14 10.745166 10.745166 2.84217094e-14 24 2.84217094e-14 C 37.254834 2.84217094e-14 48 10.745166 48 24 C 48 37.254834 37.254834 48 24 48 L 24 48 L 24 48 L 24 48 Z" fill="currentColor"/>
+            <path d="M 29.4897098 23.3065925 L 26.2706917 20.9393745 L 26.6482584 24.3031351 L 28.4802897 29.4247528 L 29.4897098 33.8205977 L 30.4989581 29.4247528 L 32.3309894 24.3031351 L 32.7087278 20.9393745 L 29.4897098 23.3065925 Z M 18.8503641 23.3065925 L 15.631346 20.9393745 L 16.0090845 24.3031351 L 17.8411157 29.4247528 L 18.8503641 33.8205977 L 19.8597841 29.4247528 L 21.6916437 24.3031351 L 22.0693821 20.9393745 L 18.8503641 23.3065925 Z M 37.2876041 24.3031351 L 39.1196354 29.4247528 L 40.3400738 34.740219 L 38.3454433 35 L 36.6368638 29.562799 C 36.6368638 29.562799 34.8092967 25.6310573 34.8092967 25.4866582 C 34.8092967 25.6310573 32.9819013 29.562799 32.9819013 29.562799 L 31.2733218 35 L 29.4897098 34.7676909 L 27.7060977 35 L 25.9975182 29.562799 C 25.9975182 29.562799 24.1701228 25.6310573 24.1701228 25.4866582 C 24.1701228 25.6310573 22.3425557 29.562799 22.3425557 29.562799 L 20.6339762 35 L 18.8503641 34.7676909 L 17.066752 35 L 15.3581725 29.562799 C 15.3581725 29.562799 13.5307771 25.6310573 13.5307771 25.4866582 C 13.5307771 25.6310573 11.7033817 29.562799 11.7033817 29.562799 L 9.9946305 35 L 8 34.740219 L 9.22043846 29.4247528 L 11.0524697 24.3031351 L 11.4302081 20.9393745 L 8.21101841 23.3065925 L 8.21101841 21.228001 L 11.6719607 18.326455 L 12.3810787 18.2218901 L 12.3810787 17.9233051 C 11.4619725 17.51054 10.825655 16.6183906 10.825655 15.5839024 C 10.825655 14.156738 12.0368217 13 13.5307771 13 C 15.0247325 13 16.2358992 14.156738 16.2358992 15.5839024 C 16.2358992 16.6183906 15.5995817 17.51054 14.6804755 17.9233051 L 14.6804755 18.2218901 L 15.3895935 18.326455 L 18.8503641 21.228001 L 22.3113064 18.326455 L 23.0204244 18.2218901 L 23.0204244 17.9233051 C 22.1013182 17.51054 21.4650007 16.6183906 21.4650007 15.5839024 C 21.4650007 14.156738 22.6761674 13 24.1701228 13 C 25.6640782 13 26.8750732 14.156738 26.8750732 15.5839024 C 26.8750732 16.6183906 26.2387556 17.51054 25.3198211 17.9233051 L 25.3198211 18.2218901 L 26.0289391 18.326455 L 29.4897098 21.228001 L 32.9504804 18.326455 L 33.6595984 18.2218901 L 33.6595984 17.9233051 C 32.7406639 17.51054 32.1043463 16.6183906 32.1043463 15.5839024 C 32.1043463 14.156738 33.3153413 13 34.8092967 13 C 36.3034238 13 37.5142471 14.156738 37.5144188 15.5839024 C 37.5144188 16.6183906 36.8781013 17.51054 35.9591668 17.9233051 L 35.9591668 18.2218901 L 36.6682848 18.326455 L 40.1290554 21.228001 L 40.1290554 23.3065925 L 36.9100374 20.9393745 L 37.2876041 24.3031351 Z" fill="currentColor"/>
+        </symbol>
+        
+        <symbol id="storage">
+                <path d="M 39.9236499 31.5126111 C 41.869091 32.6498521 43 34.0625041 43 35.6923077 C 43 40.1632127 34.4896382 43 24 43 C 13.5103618 43 5 40.1632127 5 35.6923077 C 5 34.0625041 6.130909 32.6498521 8.07635005 31.5126111 C 9.14708175 31.9858647 10.3798534 32.4104194 11.7445378 32.7755154 C 9.22593316 33.7562269 7.92307692 34.9214488 7.92307692 35.6923077 C 7.92307692 36.4947878 9.3350136 37.7246485 12.0606138 38.728817 C 15.168606 39.8738668 19.433505 40.5384615 24 40.5384615 C 28.566495 40.5384615 32.831394 39.8738668 35.9393862 38.728817 C 38.6649864 37.7246485 40.0769231 36.4947878 40.0769231 35.6923077 C 40.0769231 34.9214488 38.7740668 33.7562269 36.2554622 32.7755154 C 37.6201466 32.4104194 38.8529182 31.9858647 39.9236499 31.5126111 Z M 39.9236499 19.8203034 C 41.869091 20.9575444 43 22.3701964 43 24 C 43 28.470905 34.4896382 31.3076923 24 31.3076923 C 13.5103618 31.3076923 5 28.470905 5 24 C 5 22.3701964 6.130909 20.9575444 8.07635005 19.8203034 C 9.06881359 20.2589632 10.2004933 20.6557834 11.4473978 21.0021956 C 9.12353139 22.0250817 7.92307692 23.2072017 7.92307692 24 C 7.92307692 24.8598001 9.3350136 26.177508 12.0606138 27.2534028 C 15.168606 28.4802419 19.433505 29.1923077 24 29.1923077 C 28.566495 29.1923077 32.831394 28.4802419 35.9393862 27.2534028 C 38.6649864 26.177508 40.0769231 24.8598001 40.0769231 24 C 40.0769231 23.2072017 38.8764686 22.0250817 36.5526022 21.0021956 C 37.7995067 20.6557834 38.9311864 20.2589632 39.9236499 19.8203034 Z M 43 12.3076923 C 43 7.83678727 34.4896382 5 24 5 C 13.5103618 5 5 7.83678727 5 12.3076923 C 5 16.7785973 13.5103618 19.6153846 24 19.6153846 C 34.4896382 19.6153846 43 16.7785973 43 12.3076923 Z M 12.0606138 15.3442016 C 9.3350136 14.3400331 7.92307692 13.1101724 7.92307692 12.3076923 C 7.92307692 11.5052122 9.3350136 10.2753515 12.0606138 9.27118298 C 15.168606 8.12613322 19.433505 7.46153846 24 7.46153846 C 28.566495 7.46153846 32.831394 8.12613322 35.9393862 9.27118298 C 38.6649864 10.2753515 40.0769231 11.5052122 40.0769231 12.3076923 C 40.0769231 13.1101724 38.6649864 14.3400331 35.9393862 15.3442016 C 32.831394 16.4892514 28.566495 17.1538462 24 17.1538462 C 19.433505 17.1538462 15.168606 16.4892514 12.0606138 15.3442016 Z" fill="currentColor"/>
+        </symbol>
+        
+        <symbol id="layout">
+            <path d="M 44.5086986 24.2230775 L 24.1090229 24.2230775 L 24.1090229 4.50363839 L 24.1090229 4.50363839" stroke="currentColor" stroke-width="2.5" fill="none"/>
+            <rect id="Rectangle-1-Copy" x="3.70934714" y="4.50363839" width="40.7993514" height="39.4388783" stroke="currentColor" stroke-width="2.5" fill="none"/>
+        </symbol>
+        
+    </defs>
+
+    <use y="0" xlink:href="#compass"/>
+    <use y="48" xlink:href="#inspector"/>
+    <use y="96" xlink:href="#performance"/>
+    <use y="144" xlink:href="#script"/>
+    <use y="192" xlink:href="#style"/>
+    <use y="240" xlink:href="#standards"/>
+    <use y="288" xlink:href="#contribute"/>
+    <use y="336" xlink:href="#storage"/>
+    <use y="384" xlink:href="#layout"/>
+        
+</svg>
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/themes/webkit/images/inspector.svg b/Websites/webkit.org/wp-content/themes/webkit/images/inspector.svg
new file mode 100644 (file)
index 0000000..9c1ff7b
--- /dev/null
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright © 2015 Apple Inc. All rights reserved. -->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="48"
+    height="192">
+    <style>
+        symbol { color: white; }
+    </style>
+    
+    <defs>
+        
+        <symbol id="console">
+            <rect x="5.03735352" y="5.03735352" width="37.925293" height="37.925293" rx="4" stroke="currentColor" stroke-width="2.5" fill="none"/>
+            <path d="M 13.164202 13.164202 L 24 24 L 13.164202 34.835798" stroke="currentColor" stroke-width="2.5" fill="none"/>
+            <path d="M 24 14 L 35 14" stroke="currentColor" stroke-width="2.5" fill="none"/>
+            <path d="M 29.5 24 L 34.9999999 24" stroke="currentColor" stroke-width="2.5" fill="none"/>
+            <path d="M 24 34 L 35 34" stroke="currentColor" stroke-width="2.5" fill="none"/>
+        </symbol>
+
+        <symbol id="debugger">
+            <path d="M 24.1320008 44.328125 C 32.1512251 44.328125 38.6520901 35.226914 38.6520901 24 C 38.6520901 12.773086 32.1512251 3.671875 24.1320008 3.671875 C 16.1127765 3.671875 9.61191153 12.773086 9.61191153 24 C 9.61191153 35.226914 16.1127765 44.328125 24.1320008 44.328125 Z" stroke="currentColor" stroke-width="2.5" fill="none"/>
+            <path d="M 13.7861328 10.5 L 34.4768075 10.5 L 13.7861328 10.5 Z" stroke="currentColor" stroke-width="2.5" fill="none"/>
+            <path d="M 24.25 11 L 24.25 44.328125" stroke="currentColor" stroke-width="2.5" fill="none"/>
+            <path d="M 34.1640625 37.0680804 L 39.9720982 42.8761161" stroke="currentColor" stroke-width="2.5" fill="none"/>
+            <path d="M 38.5200893 22.25 L 44.328125 22.25" stroke="currentColor" stroke-width="2.5" fill="none"/>
+            <path d="M 9.47991071 22.25 L 3.671875 22.25" stroke="currentColor" stroke-width="2.5" fill="none"/>
+            <path d="M 13.8359375 10.9319196 L 8.02790179 5.12388393" stroke="currentColor" stroke-width="2.5" fill="none"/>
+            <path d="M 34.1640625 10.9319196 L 39.9720982 5.12388393" stroke="currentColor" stroke-width="2.5" fill="none"/>
+            <path d="M 13.972 37.068 L 8.164 42.876" stroke="currentColor" stroke-width="2.5" fill="none"/>
+        </symbol>
+
+        <symbol id="shortcuts">
+            <path d="M 5 35.8242187 C 5 39.7527757 8.1847243 42.9375 12.1132812 42.9375 C 16.0418382 42.9375 19.2265625 39.7527757 19.2265625 35.8242187 L 19.2265625 11.9442883 C 19.2265625 8.1847243 16.0418382 5 12.1132812 5 C 8.1847243 5 5 8.1847243 5 12.1132812 C 5 16.0418382 8.1847243 19.2265625 12.1132812 19.2265625 L 35.8928161 19.2265625 C 39.7527757 19.2265625 42.9375 16.0418382 42.9375 12.1132812 C 42.9375 8.1847243 39.7527757 5 35.8242188 5 C 31.8956618 5 28.7109375 8.1847243 28.7109375 12.1132812 L 28.7109375 35.8190088 C 28.7109375 39.7527757 31.8956618 42.9375 35.8242187 42.9375 C 39.7527757 42.9375 42.9375 39.7527757 42.9375 35.8242188 C 42.9375 31.8956618 39.7527757 28.7109375 35.8242187 28.7109375 L 12.1184912 28.7109375 C 8.1847243 28.7109375 5 31.8956618 5 35.8242187 Z" stroke="currentColor" stroke-width="2.5" fill="none" />
+        </symbol>
+        
+        <symbol id="timeline">
+            <path d="M 24.625 7.57617187 L 24.625 24.5833333 L 15 24.5833333" stroke="currentColor" stroke-width="2.5" fill="none"/>
+            <path d="M 24 45.76 L 24 45.76 C 36.0177161 45.76 45.76 36.0177162 45.76 24 C 45.76 11.9822838 36.0177161 2.24 24 2.24 C 11.9822838 2.24 2.24 11.9822838 2.24 24 C 2.24 36.0177162 11.9822838 45.76 24 45.76 L 24 45.76 L 24 45.76 L 24 45.76 Z M 24 48 L 24 48 C 10.745166 48 0 37.254834 0 24 C 0 10.745166 10.745166 0 24 0 C 37.254834 0 48 10.745166 48 24 C 48 37.254834 37.254834 48 24 48 L 24 48 L 24 48 L 24 48 Z" fill="currentColor"/>
+        </symbol>
+
+    </defs>
+
+    <use y="0" xlink:href="#console"/>
+    <use y="48" xlink:href="#debugger"/>
+    <use y="96" xlink:href="#shortcuts"/>
+    <use y="144" xlink:href="#timeline"/>
+        
+</svg>
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/themes/webkit/images/menu-down.svg b/Websites/webkit.org/wp-content/themes/webkit/images/menu-down.svg
new file mode 100644 (file)
index 0000000..0ed9f48
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright © 2015 Apple Inc. All rights reserved. -->
+<svg viewBox="0 0 16 10" version="1.1" xmlns="http://www.w3.org/2000/svg">
+    <path d="M 0.066 1.615 L 1.233 0.449 L 8.001 7.217 L 14.767 0.449 L 15.934 1.615 L 8.001 9.551 L 0.066 1.615 L 0.066 1.615 Z" fill="black"/>
+</svg>
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/themes/webkit/images/squirrelfish-lives.svg b/Websites/webkit.org/wp-content/themes/webkit/images/squirrelfish-lives.svg
new file mode 100644 (file)
index 0000000..c160294
--- /dev/null
@@ -0,0 +1,267 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="800px"
+   height="600px"
+   viewBox="0 0 800 600"
+   version="1.1"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docname="sf1.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <metadata
+     id="metadata90">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs88">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 300 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="800 : 300 : 1"
+       inkscape:persp3d-origin="400 : 200 : 1"
+       id="perspective92" />
+  </defs>
+  <sodipodi:namedview
+     inkscape:window-height="824"
+     inkscape:window-width="1140"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     guidetolerance="10.0"
+     gridtolerance="10.0"
+     objecttolerance="10.0"
+     borderopacity="1.0"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base"
+     showgrid="false"
+     inkscape:zoom="1.3575"
+     inkscape:cx="416.51043"
+     inkscape:cy="321.83047"
+     inkscape:window-x="20"
+     inkscape:window-y="20"
+     inkscape:current-layer="g4" />
+  <g
+     transform="matrix(1,0,0,-1,0,600)"
+     id="g4">
+     <animateMotion values="0,0; 3,30; 0,0" dur="15" calcMode="spline" keySplines="0.5,0,0.5,1;0.5,0,0.5,1" repeatCount="indefinite"/>
+    <g
+       id="bubble1">
+      <path
+         transform="translate(99.600098,381.100098)"
+         d="M -12.1,-0.2 C -15.7,-4.7 -17.6,-9.5 -17.6,-14.5 L -15.1,-24.1 C -11.8,-29.200001 -6.8,-31.9 -0.1,-32.299999 C 6.5,-32.700001 11.2,-30.9 13.8,-27.1 C 16.300001,-23.200001 17.6,-17.700001 17.6,-10.5 C 17.6,-2.5 15.8,3 12,6.2 C 8.900001,9 4.9,9.7 0,8.2 C -4.7,6.8 -8.7,4 -12.1,-0.2"
+         id="path7" />
+      <path
+         transform="translate(110.800003,370)"
+         d="M 0,0 C 0,11.6 -3.7,15.3 -11.2,11.1 C -14,9.6 -16.5,7.4 -18.9,4.4 C -21.200001,1.4 -22.5,-1.1 -22.6,-3.4 C -22.9,-5.6 -21.700001,-8.6 -19.200001,-12.1 C -16.700001,-15.6 -12.6,-16.200001 -6.6,-14.1 C -4.5,-13.2 -2.9,-10.900001 -1.6,-7.2 C -0.6,-3.8 0,-1.4 0,0"
+         id="path9"
+         fill="white" >
+        </path>
+      <animateTransform attributeName="transform" begin="0" type="translate" from="0,0" to="-30,300" dur="7s" repeatCount="indefinite"/>
+    </g>
+    <g
+       id="bubble2">
+      <path
+         transform="translate(122.100098,437.600098)"
+         d="M 33.700001,-29 C 36.100002,-24 37.200001,-16.800001 37.200001,-7.2 C 37.200001,0.5 34.600002,6.3 29.300001,10.3 C 24.6,13.8 18.800001,15.2 11.900001,14.400001 C 5,13.6 -0.9,11 -5.6,6.3 C -10.900001,1.2 -13.5,-5.3 -13.5,-13 C -13.5,-16.1 -11.8,-21.5 -8.3,-29.4 C -4.1,-38.900002 0.3,-43.700001 4.9,-43.700001 C 19.300001,-43.700001 28.9,-38.700001 33.700001,-29"
+         id="path12" />
+      <path
+         transform="translate(134.5,442.899902)"
+         d="M 0,0 C -4.7,-0.2 -8.900001,-2 -12.400001,-5.3 C -16.1,-8.900001 -18,-13.1 -18,-18.1 C -18,-20.800001 -16.6,-24.800001 -14,-30.1 C -10.8,-36.5 -7.6,-39.799999 -4.4,-39.799999 C 4.6,-39.799999 11,-37.100002 14.8,-31.800001 C 17,-28.800001 18,-25.6 18,-22.1 C 18,-14.400001 16.200001,-8.6 12.5,-4.7 C 9.2,-1.2 5,0.4 0,0"
+         id="path14"
+         fill="white" />
+      <animateTransform attributeName="transform" begin="0" type="translate" from="-50,-50" to="0,300" dur="6s" repeatCount="indefinite"/>te"/>
+    </g>
+    <g
+       id="bubble3">
+      <path
+         transform="translate(92.200005,465.600098)"
+         d="M 11,5.7 C 8.7,7.8 5.7,8.5 2,7.8 C -1.4,7.2 -4.4,5.8 -7,3.5 C -9.8,1.2 -11.2,-1.2 -11.2,-3.4 C -11.2,-6.2 -10.6,-9 -9.6,-11.900001 C -7.7,-16.700001 -4.7,-19 -0.4,-19 C 3.4,-19 6.8,-17.800001 10,-15.5 C 13.400001,-13 15.2,-9.900001 15.2,-6.4 C 15.2,-0.7 13.8,3.3 11,5.7"
+         id="path17" />
+      <path
+         transform="translate(97.200005,466.200195)"
+         d="M 0,0 C -0.1,0.6 -1.8,0.4 -5,-0.6 C -8.7,-1.6 -10.6,-2.8 -10.6,-4 C -10.6,-6.3 -9.7,-8.3 -7.8,-10.1 C -6.1,-11.6 -4.5,-12.400001 -3,-12.400001 C -0.4,-12.400001 1.6,-11.6 3,-10.1 C 4.1,-9 4.6,-7.7 4.6,-6.4 C 4.6,-5.1 4.4,-3.8 3.8,-2.6 C 3.2,-1.6 2,-0.6 0,0"
+         id="path19"
+         fill="white" />
+         <animateTransform attributeName="transform" begin="0" type="translate" from="0,-100" to="10,300" dur="8s" repeatCount="indefinite"/>
+    </g>
+    <path
+       id="outline"
+       d="M 19.300001,-15.3 C 19.300001,-3 13.900001,4.5 3.1,7.3 C -11.400001,11 -35.200001,6.2 -68.200005,-7.1 C -74,-9.3 -87.400002,-17.5 -108.400002,-31.300001 C -126.700005,-43.5 -138.400009,-49.5 -143.699997,-49.5 L -162.600006,-49.5 C -164.400009,-49.799999 -165.699997,-50.5 -166.199997,-52 C -167.699997,-51.799999 -169.300003,-51.799999 -170.900009,-51.799999 C -170.199997,-50.600002 -169.400009,-49.400002 -168.600006,-48.299999 C -165.900009,-44 -164.600006,-41.100002 -164.600006,-39.700001 C -164.600006,-32.100002 -168.699997,-27.300001 -176.900009,-25.300001 C -184.400009,-23.5 -193.400009,-24.1 -204,-27.5 C -214.699997,-30.800001 -223.800003,-35.900002 -231.100006,-42.700001 C -233.699997,-45.100002 -236,-47.799999 -237.800003,-50.400002 C -243.900009,-47.5 -255,-44.100002 -271.5,-40 C -264.399994,-32.600002 -259.899994,-27.5 -257.899994,-24.800001 C -253.300003,-18.5 -251,-11.8 -251,-4.9 C -251,3.7 -253.699997,9.5 -259.200012,12.2 C -264.100006,14.7 -270,14.3 -277,11 C -284.100006,7.8 -290,2.6 -294.899994,-4.5 C -300.300018,-12.5 -303,-21.300001 -303,-30.9 L -303,-32.700001 C -310.600006,-31 -318.100006,-29.4 -325.800018,-27.9 C -326.600006,-27.6 -327.399994,-27.300001 -328.200012,-27.1 C -328.200012,-23.700001 -329.200012,-20.5 -331.399994,-17.9 C -333.700012,-14.8 -336.5,-13.8 -339.800018,-15.1 C -339.800018,-18.9 -339.399994,-22.5 -338.399994,-25.800001 C -338.200012,-26.1 -338.100006,-26.5 -338,-26.9 L -338.200012,-26.9 C -350.5,-9.5 -356.600006,-6.1 -356.600006,-16.9 C -356.600006,-18.700001 -354.600006,-22.1 -350.700012,-27.1 C -349.600006,-28.5 -348.600006,-29.6 -347.600006,-30.700001 C -352.5,-33.5 -356.200012,-37.400002 -359,-42.299999 C -360,-44.100002 -363.100006,-47 -368,-50.900002 C -370.800018,-53 -372.600006,-55 -373.600006,-56.799999 C -381.700012,-53.5 -391.5,-53 -402.800018,-55.600002 C -415.800018,-58.5 -427.200012,-64.400002 -436.800018,-73.200005 C -447,-82.700005 -452.200012,-93 -452.200012,-103.900002 C -452.200012,-104 -451.399994,-106.300003 -449.800018,-110.700005 C -449.700012,-111.099998 -449.5,-111.5 -449.300018,-111.900002 C -459.300018,-116.800003 -468.600006,-124.700005 -477.300018,-135.5 C -483.800018,-143.699997 -487.600006,-150.800003 -488.600006,-157.100006 C -489,-156.900009 -489.399994,-156.800003 -489.899994,-156.699997 C -494,-155.400009 -496.899994,-154.800003 -498.300018,-155 C -498.399994,-155.199997 -498.399994,-155.400009 -498.5,-155.600006 L -498.5,-156.699997 C -498.5,-157.199997 -496.700012,-158.600006 -493.200012,-160.699997 C -491.899994,-161.5 -490.700012,-162.100006 -489.600006,-162.699997 L -489.899994,-162.699997 C -492.800018,-164.199997 -494.700012,-165.600006 -495.399994,-167 C -495.100006,-167.300003 -494.600006,-167.699997 -493.700012,-168.100006 C -492.600006,-168.600006 -491.600006,-168.699997 -490.700012,-168.699997 C -489.899994,-168.699997 -488.700012,-168.400009 -487.399994,-167.699997 C -487.399994,-181.300003 -487.600006,-202.100006 -487.800018,-230.100006 C -487.800018,-234.5 -485.399994,-240.199997 -480.800018,-247.400009 C -474.5,-257.100006 -465.5,-265.899994 -453.800018,-273.899994 C -447.300018,-278.399994 -440.100006,-282.399994 -432.300018,-286.100006 C -433.700012,-287.700012 -434.399994,-289 -434.399994,-290.100006 C -434.399994,-290.600006 -434.300018,-291.100006 -434,-291.600006 C -433.5,-292.399994 -432.600006,-292.899994 -431.300018,-292.899994 C -430.600006,-292.899994 -429,-291.5 -426.300018,-288.700012 C -416,-293.100006 -404.600006,-296.800018 -392.300018,-299.700012 C -392.5,-300.300018 -392.800018,-300.899994 -393,-301.399994 C -393.800018,-303.399994 -394.300018,-305 -394.300018,-305.899994 C -394.300018,-307.300018 -394.300018,-308 -394.100006,-308.100006 C -393.700012,-308.399994 -393.300018,-308.600006 -393,-308.899994 C -392.800018,-309 -392.200012,-309.100006 -391.399994,-309.100006 C -389.600006,-309.100006 -388.300018,-307.600006 -387.200012,-304.399994 C -386.800018,-303.300018 -386.5,-302.100006 -386.300018,-301.100006 C -385.300018,-301.300018 -384.300018,-301.5 -383.300018,-301.700012 C -383.300018,-302.300018 -382.800018,-303.800018 -381.899994,-306.300018 C -380.899994,-309.200012 -380,-310.800018 -379.200012,-311.100006 C -377.600006,-311 -376.800018,-309.899994 -376.800018,-307.899994 C -376.800018,-306 -377,-304.399994 -377.200012,-302.899994 C -355.800018,-306.800018 -331.700012,-308.700012 -305,-308.700012 C -300.600006,-308.700012 -294.600006,-308.100006 -286.800018,-307 C -286.300018,-308.5 -285.700012,-310.300018 -285,-312.5 C -282.200012,-320.100006 -279.100006,-327.100006 -275.700012,-333.5 C -265.200012,-353.700012 -254.199997,-363.899994 -242.600006,-363.899994 C -242.5,-363.899994 -239.800003,-362.399994 -234.600006,-359.399994 C -233,-359.899994 -231.400009,-360.300018 -229.5,-360.300018 C -226.5,-360.300018 -224.199997,-358.600006 -222.699997,-355.300018 C -222.100006,-354.200012 -221.699997,-353.100006 -221.400009,-351.899994 C -211.400009,-351.899994 -205.699997,-351.5 -204.600006,-350.700012 C -203.900009,-350.200012 -203.600006,-349.300018 -203.600006,-347.800018 C -203.699997,-345.800018 -203.800003,-343.899994 -203.800003,-342.300018 C -204.900009,-336.800018 -206.199997,-331.399994 -207.800003,-326.100006 C -209.199997,-321.5 -210.600006,-317.899994 -211.900009,-315.399994 C -209.5,-315.200012 -207.400009,-315 -205.699997,-314.800018 C -203.5,-326 -201.600006,-333.200012 -199.900009,-336.300018 C -198.199997,-339.5 -192.600006,-344.399994 -183,-351.100006 C -174.199997,-354.399994 -168.400009,-355.600006 -165.400009,-354.700012 C -162.600006,-353.700012 -160.699997,-352.800018 -159.800003,-352 C -158.900009,-351.100006 -157.199997,-350.899994 -154.600006,-351.5 C -145.600006,-356.300018 -138,-357.899994 -131.900009,-356.300018 C -128.699997,-353.200012 -127,-350.5 -126.900002,-348 C -126.800003,-345.5 -125.400002,-344.300018 -122.900002,-344.200012 C -120.300003,-344.100006 -118,-343.700012 -116,-343 C -112.900002,-339.899994 -111.400002,-335.899994 -111.599998,-331 C -111.700005,-326.200012 -112.599998,-321.300018 -113.900002,-316.300018 C -98.200005,-315.399994 -78.400002,-308.300018 -54.400002,-295.100006 C -54,-294.800018 -53.5,-294.5 -53,-294.200012 C -52.600002,-294 -52,-293.700012 -51.600002,-293.399994 C -42.700001,-288.399994 -34.100002,-283 -25.700001,-277.200012 C -19,-272.600006 -15.2,-269.700012 -14.2,-268.700012 C -10.7,-269.700012 3.3,-276.399994 28,-288.700012 C 53,-300.399994 69.700005,-306.300018 78.200005,-306.300018 C 80.700005,-306.300018 82.599998,-305.899994 83.700005,-305.100006 C 85.099998,-304.200012 85.700005,-302.600006 85.700005,-300.300018 C 81.5,-289.200012 77.200005,-277.600006 73,-265.200012 C 64.400002,-240.600006 60.200001,-223.699997 60.200001,-214.5 C 60.200001,-207.800003 65.700005,-192.600006 76.900002,-168.699997 C 88.800003,-144.5 95.5,-130.300003 97,-126.300003 C 99.700005,-118.5 107.700005,-101.5 120.700005,-75.300003 C 132.600006,-51.400002 138.600006,-38.799999 138.600006,-37.5 C 138.600006,-29.5 133.199997,-26.5 122.5,-28.300001 C 114.200005,-29.800001 102.300003,-34.299999 86.599998,-41.900002 C 82,-44.100002 76.5,-47.700001 70,-52.5 C 63.200001,-58 58.700001,-61.5 56.600002,-63.100002 C 48.799999,-69 41.700001,-76.900002 35.299999,-86.700005 C 29,-97.800003 24.200001,-105.800003 21,-110.700005 C 18,-104.5 11,-96 0,-85.099998 C -9.6,-75.700005 -17.9,-69.5 -25,-66.800003 C -18.9,-61.700001 -10.900001,-53.700001 -1.4,-42.900002 C 12.400001,-27.300001 19.300001,-18.1 19.300001,-15.3"
+       transform="translate(591.799805,464.899902)" />
+    <g
+       id="body">
+      <defs
+         id="defs23">
+        <linearGradient
+           id="gradient-body"
+           gradientUnits="userSpaceOnUse"
+           x1="220"
+           y1="0"
+           x2="710"
+           y2="0">
+          <stop
+             offset="0"
+             stop-color="#7b4524"
+             id="stop26" />
+          <stop
+             offset="1"
+             stop-color="#6385b5"
+             id="stop28" />
+        </linearGradient>
+      </defs>
+      <path
+         id="ear-right"
+         d="M 301.200012,448.899994 C 300.299011,445.899994 299.700012,443 299.201019,440 L 299.201019,440 C 299.100006,438.899994 298.899994,437.800018 298.800018,436.600006 L 298.800018,436.600006 C 299.201019,437.701019 299.600006,438.799011 300,439.899994 L 300,439.899994 C 303.899994,449.399994 308.399994,454.399994 313.600006,454.600006 L 313.600006,454.600006 C 313.600006,454.399994 313.799011,454.100006 314.200012,453.600006 L 314.200012,453.600006 C 314.600006,453 314.800018,451.899994 314.800018,450.399994 L 314.800018,450.399994 C 311.800018,440.800018 308.800018,433.399994 306.100006,428.399994 L 306.100006,428.399994 C 307.899994,427.899994 309.299011,427.600006 310.200012,427.399994 L 310.200012,427.399994 C 313,429.600006 315.600006,432.200012 317.899994,435.100006 L 317.899994,435.100006 C 320.200012,438 321.701019,439.899994 322.399994,440.600006 L 322.399994,440.600006 C 328.800018,447.899994 332,454.300018 332,459.800018 L 332,459.800018 C 332,462.800018 331.799011,464.800018 331.200012,465.701019 L 331.200012,465.701019 C 329.899994,467.899994 327,469 322.600006,469 L 322.600006,469 C 312.200012,469 305.100006,462.299011 301.200012,448.899994"
+         fill="url(#gradient-body)" />
+      <path
+         id="paw-right"
+         d="M 330.300018,130.400009 C 335.299011,122.099998 339.399994,116.700005 342.399994,113.800003 L 342.399994,113.800003 C 342.399994,114.799004 342.100006,116.700005 341.600006,119.299004 L 341.600006,119.299004 C 341.100006,121.900002 340.799011,124 340.799011,125.400002 L 340.799011,125.400002 C 340.799011,127.099998 340.799011,128.100006 340.899994,128.400009 L 340.899994,128.400009 C 340.899994,128.800003 341.100006,129.400009 341.200012,130.199997 L 341.200012,130.199997 L 342.399994,131.100006 C 343.201019,131.899002 344.399994,132.199997 346,132.199997 L 346,132.199997 C 348.600006,132.199997 350.899994,130.100006 353.201019,125.800003 L 353.201019,125.800003 C 356.100006,120.599998 357.799011,117.900002 358.399994,117.400002 L 358.399994,117.400002 C 358.399994,120.900002 358.600006,124.200005 358.799011,127.400002 L 358.799011,127.400002 C 358.899994,127.400002 359.399994,127.599998 360.100006,128.201004 L 360.100006,128.201004 C 360.899994,128.800003 362.100006,129 363.600006,129 L 363.600006,129 C 365.200012,129 367.200012,128.100006 369.600006,126.5 L 369.600006,126.5 C 372.600006,124.400002 375.100006,122.900002 377.200012,122.200005 L 377.200012,122.200005 C 377.200012,121.900002 377.300018,121.700005 377.399994,121.700005 L 377.399994,121.700005 C 377.600006,121.700005 377.600006,122.599998 377.600006,124.200005 L 377.600006,124.200005 C 377.600006,124.601006 374.899994,132.799011 369.600006,148.800003 L 369.600006,148.800003 L 369.600006,149.400009 C 346.399994,149.5 329.200012,150.799011 317.899994,153.100006 L 317.899994,153.100006 C 317.800018,153.199997 317.700012,153.199997 317.600006,153.199997 L 317.600006,153.199997 L 316.800018,153.400009 C 320,147.900009 324.5,140.199997 330.300018,130.400009"
+         fill="url(#gradient-body)" />
+      <path
+         id="back"
+         d="M 549.5,458.399994 C 537.400024,454.100006 523.700012,447.200012 508.300018,437.800018 L 508.300018,437.800018 C 492.100006,427.200012 480.5,420 473.800018,415.899994 L 473.800018,415.899994 C 462.299011,409.200012 453.600006,405.800018 447.600006,405.800018 L 447.600006,405.800018 C 444.299011,405.800018 440.899994,405.899994 437.399994,406.201019 L 437.399994,406.201019 C 435.600006,405 433.201019,404.100006 430.300018,403.399994 L 430.300018,403.399994 C 427.899994,402.899994 425.899994,402.600006 424.399994,402.600006 L 424.399994,402.600006 C 419.399994,402.600006 415.600006,402.899994 412.899994,403.399994 L 412.899994,403.399994 C 412.700012,403.300018 412.600006,403.100006 412.399994,403 L 412.399994,403 C 400.600006,390.800018 388.899994,384.600006 377.200012,384.600006 L 377.200012,384.600006 C 373.800018,384.799011 371.899994,385.799011 371.600006,387.700012 L 371.600006,387.700012 L 371.600006,389 C 371.600006,390 374,391.899994 378.899994,394.600006 L 378.899994,394.600006 C 381.800018,396.399994 387.100006,399.399994 395,403.600006 L 395,403.600006 C 410.600006,412.600006 418.399994,419.600006 418.399994,425 L 418.399994,425 C 418.399994,426.800018 417.800018,428.200012 416.399994,429.300018 L 416.399994,429.300018 C 415.201019,430.100006 413.899994,430.600006 412.399994,430.600006 L 412.399994,430.600006 C 391.800018,430.600006 377.899994,427.700012 370.899994,421.899994 L 370.899994,421.899994 C 368.600006,420.100006 366.899994,417.899994 366.100006,415.399994 L 366.100006,415.399994 C 365.600006,414.100006 363.5,409.600006 359.800018,401.701019 L 359.800018,401.701019 C 359.700012,401.600006 359.600006,401.399994 359.600006,401.100006 L 359.600006,401.100006 C 357.100006,396.800018 355.100006,394.200012 353.5,393.600006 L 353.5,393.600006 C 351.399994,392.899994 350.100006,392.800018 349.5,393.399994 L 349.5,393.399994 C 348.799011,394.200012 348.399994,395.600006 348.399994,397.399994 L 348.399994,397.399994 C 348.399994,400.899994 349,404.200012 350.200012,407.399994 L 350.200012,407.399994 C 342.700012,408.100006 328.100006,411.399994 306.200012,417.399994 L 306.200012,417.399994 C 282.200012,424.100006 266.200012,427.399994 258.399994,427.399994 L 258.399994,427.399994 C 253.201019,427.399994 246.199997,423.800018 237.400009,416.5 L 237.400009,416.5 C 236.800003,415.899994 233.699997,413.200012 228.100006,408.200012 L 228.100006,408.200012 C 226.5,406.899994 225.199997,405.899994 224.199997,405 L 224.199997,405 C 233.699997,398.600006 238.400009,387.800018 238.400009,372.600006 L 238.400009,372.600006 C 238.400009,369.899994 237.600006,366.100006 236.100006,361.100006 L 236.100006,361.100006 C 234,354.299011 231.199997,348.200012 227.600006,342.600006 L 227.600006,342.600006 C 226.201004,340.300018 224.600006,338.200012 223,336.299011 L 223,336.299011 C 226.100006,334.800018 229.199997,333.399994 232.600006,332.399994 L 232.600006,332.399994 C 234.100006,331.899994 235.400009,331.5 236.800003,331.100006 L 236.800003,331.100006 C 238.600006,338 242.5,344.5 248.600006,350.600006 L 248.600006,350.600006 C 256.399994,358.600006 265.800018,364 277,367.100006 L 277,367.100006 C 288.200012,370.100006 297.800018,369.800018 305.399994,365.899994 L 305.399994,365.899994 C 314.100006,361.600006 318.399994,353.700012 318.399994,342 L 318.399994,342 C 318.399994,336.299011 317,330.701019 314.200012,325.100006 L 314.200012,325.100006 C 318.200012,325.100006 322.399994,324.899994 326.700012,324.700012 L 326.700012,324.700012 C 327.800018,324.600006 328.899994,324.399994 330.100006,324 L 330.100006,324 C 340.399994,320.600006 348.100006,315.800018 352.899994,309.800018 L 352.899994,309.800018 C 353.600006,309 354.399994,308.201019 355.200012,307.399994 L 355.200012,307.399994 C 356,306.600006 356.800018,305.800018 357.5,304.899994 L 357.5,304.899994 C 363.800018,297.800018 366.5,288.700012 365.600006,277.399994 L 365.600006,277.399994 C 365.399994,274.200012 365,271 364.600006,267.799011 L 364.600006,267.799011 C 364.399994,266.800018 364.200012,265.700012 363.800018,264.5 L 363.800018,264.5 C 360.100006,254.699997 354.899994,246.100006 348,238.699997 L 348,238.699997 C 347.200012,237.800003 346.600006,236.800003 346,235.800003 L 346,235.800003 C 342.100006,228 339.100006,220 337,211.600006 L 337,211.600006 C 336,207.600006 336.800018,204.900009 339.399994,203.5 L 339.399994,203.5 C 340.100006,203.199997 340.600006,202.699997 340.899994,202 L 340.899994,202 C 344.299011,195.199997 349.600006,190.201004 356.899994,187 L 356.899994,187 C 358.100006,186.5 359.399994,185.800003 360.700012,185.199997 L 360.700012,185.199997 C 364.200012,183.400009 367.899994,182 371.5,181 L 371.5,181 C 375.399994,180 379.201019,179 383.100006,178 L 383.100006,178 C 384,195.799011 384.701019,209.800003 385.200012,219.800003 L 385.200012,219.800003 L 386,220.300003 C 386.600006,220.800003 387.600006,221 389.201019,221 L 389.201019,221 C 392.800018,221 394.399994,212.800003 394,196.5 L 394,196.5 C 393.899994,189.699997 393.399994,182.800003 392.800018,175.699997 L 392.800018,175.699997 C 392.600006,174.299011 392.600006,173 392.399994,171.600006 L 392.399994,171.600006 C 392.399994,169.199997 393.200012,163.201004 394.899994,153.699997 L 394.899994,153.699997 C 396.100006,146.900009 397.100006,141.900009 398,138.5 L 398,138.5 C 399.399994,136.900009 401.100006,134.699997 403,132.100006 L 403,132.100006 C 403.600006,131.701004 406,129.199997 410.399994,124.799004 L 410.399994,124.799004 C 415.300018,120.5 419.899994,118.400002 424.201019,118.300003 L 424.201019,118.300003 C 428.600006,118.201004 430.799011,119.201004 430.899994,121.200005 L 430.899994,121.200005 C 430.899994,123.200005 430.899994,124.5 430.600006,125.099998 L 430.600006,125.099998 C 430.399994,125.400002 430.200012,125.900002 430,126.200005 L 430,126.200005 C 427.399994,131.100006 426,134 426,134.600006 L 426,134.600006 C 426,138 427.899994,139.800003 431.600006,139.800003 L 431.600006,139.800003 C 436.100006,139.800003 439.100006,136.5 440.600006,129.699997 L 440.600006,129.699997 C 442.201019,123 445.100006,119.201004 449.5,118.201004 L 449.5,118.201004 C 451,117.800003 452.299011,117.5 453.399994,117.5 L 453.399994,117.5 C 455.399994,117.900002 456.399994,118.900002 456.399994,120.599998 L 456.399994,120.599998 C 456.399994,121.800003 455,124.400002 452.399994,128.400009 L 452.399994,128.400009 C 449.700012,132.400009 448.399994,135 448.399994,136.201004 L 448.399994,136.201004 L 448.399994,138.600006 C 448.600006,138.900009 448.600006,139.300003 448.799011,139.800003 L 448.799011,139.800003 L 449.800018,140.600006 C 450.399994,141.100006 451.600006,141.400009 453.100006,141.400009 L 453.100006,141.400009 C 455.399994,141.400009 457.899994,139.100006 460.5,134.5 L 460.5,134.5 C 463.100006,129.900009 466.600006,128.600006 471.100006,130.400009 L 471.100006,130.400009 C 471.600006,131.600006 471.700012,133.100006 471.600006,135 L 471.600006,135 C 471.399994,137 469.100006,143.800003 464.600006,155.5 L 464.600006,155.5 C 460.201019,167.300003 457.899994,174.299011 457.899994,176.600006 L 457.899994,176.600006 L 457.899994,178.799011 C 457.799011,184 457.300018,191.201004 456.399994,200.400009 L 456.399994,200.400009 C 455.300018,211.199997 454.800018,216.800003 454.800018,217.399017 L 454.800018,217.399017 C 454.800018,223.5 456.100006,226.300003 459,225.800003 L 459,225.800003 C 461.800018,225.400009 463.600006,221.800003 464.399994,215 L 464.399994,215 C 466.5,203.800003 467.600006,195 467.600006,188.600006 L 467.600006,188.600006 C 467.600006,185.800003 467.899994,182.600006 468.600006,179 L 468.600006,179 C 470.399994,179.100006 472.100006,179.100006 473.899994,179 L 473.899994,179 C 476.100006,179 478.201019,179 480.399994,179.199997 L 480.399994,179.199997 C 487.300018,179.600006 494.200012,180 501.100006,180.199997 L 501.100006,180.199997 C 509.800018,180.699997 517.700012,179.5 524.900024,176.800003 L 524.900024,176.800003 C 528.400024,178.100006 530.900024,179.199997 532.799988,180.199997 L 532.799988,180.199997 C 533.20105,180.400009 535.900024,182 540.600037,185.199997 L 540.600037,185.199997 C 541.100037,185.5 541.5,185.800003 541.900024,186.100006 L 541.900024,186.100006 C 541.399048,185.899002 540.900024,185.800003 540.400024,185.800003 L 540.400024,185.800003 L 537.100037,186.600006 C 536.70105,186.799011 536.400024,187 536.299988,187 L 536.299988,187 C 536.100037,187.199997 535.900024,188 535.900024,189.600006 L 535.900024,189.600006 C 535.900024,191.201004 536.899048,193.199997 538.600037,195.600006 L 538.600037,195.600006 C 540.299988,198 541.100037,199.600006 541.100037,200.400009 L 541.100037,200.400009 C 541.100037,200.900009 540.799988,201.400009 539.900024,202 L 539.900024,202 C 537.299988,203.701004 534.900024,205.400009 532.799988,207 L 532.799988,207 C 539.600037,210.699997 544.100037,210.199997 546.400024,205.699997 L 546.400024,205.699997 C 547.400024,203.5 547.900024,200 547.900024,195.199997 L 547.900024,195.199997 C 547.900024,192.800003 547.100037,190.600006 545.200012,188.600006 L 545.200012,188.600006 L 545.400024,188.300003 C 548.400024,190.300003 551.799988,192.699997 555.799011,195.300003 L 555.799011,195.300003 C 569.600037,204.701004 576.799988,209.400009 577.100037,209.400009 L 577.100037,209.400009 C 582.600037,209.400009 595.600037,204.199997 616,194 L 616,194 C 621.900024,191 627.299988,188.5 632.100037,186.100006 L 632.100037,186.100006 L 633,188 C 621.600037,195.5 615.600037,199.5 615.100037,199.800003 L 615.100037,199.800003 C 617.899048,203.300003 624.5,202.199997 635,196.400009 L 635,196.400009 C 640.399048,193.5 648.400024,188.5 659,181.600006 L 659,181.600006 C 656.100037,189.5 653.799988,196.199997 651.900024,201.800003 L 651.900024,201.800003 L 651.5,201.800003 C 646.5,201.800003 640,204.701004 632.400024,210.400009 L 632.400024,210.400009 C 625.299988,215.699997 620.799988,220.5 618.799011,224.600006 L 618.799011,224.600006 C 620.5,223.799011 626,221.199997 635.100037,216.600006 L 635.100037,216.600006 C 639.5,214.400009 643.5,212.400009 647.400024,210.600006 L 647.400024,210.600006 L 648.100037,212 L 648.299988,212.5 C 646.400024,218.5 644.899048,224.199997 643.799988,229.800003 L 643.799988,229.800003 C 639.600037,230.199997 635.5,230.900009 631.5,232 L 631.5,232 C 624.5,233.800003 619.900024,236.201004 617.5,239 L 617.5,239 C 619.900024,239.800003 625.100037,239.300003 633.400024,237.400009 L 633.400024,237.400009 C 636.799011,236.699997 640,235.800003 643,234.900009 L 643,234.900009 C 642,240.600006 641.5,246.100006 641.5,251.400009 L 641.5,251.400009 C 641.5,251.900009 641.900024,253.201019 642.5,255 L 642.5,255 C 637.5,254.800003 630,254.699997 620,254.600006 L 620,254.600006 C 619.799011,254.201019 619.5,254 619.400024,254 L 619.400024,254 C 619,253.900009 618.799011,254.800003 618.799011,256.399994 L 618.799011,256.399994 C 618.799011,259.399994 620.799988,261.100006 625,261.399994 L 625,261.399994 C 628.5,261.700012 634.799988,261.200012 644,259.799011 L 644,259.799011 C 645.900024,265 648.900024,272.399994 653,282.200012 L 653,282.200012 C 648.900024,280.300018 641,278.200012 629.100037,275.800018 L 629.100037,275.800018 C 630.900024,278.300018 635.600037,281.299011 643.200012,284.800018 L 643.200012,284.800018 C 648.400024,287.100006 652.5,288.5 655.799011,289 L 655.799011,289 C 658.799988,296.399994 662.400024,304.899994 666.5,314.5 L 666.5,314.5 C 663.600037,312.799011 659,310.200012 652.600037,307 L 652.600037,307 C 645,303.200012 641,301.399994 640.399048,301.399994 L 640.399048,301.399994 C 638.799988,301.399994 638,301.5 637.799011,301.700012 L 637.799011,301.700012 C 637.5,302.200012 637.100037,302.399994 636.799011,302.600006 L 636.799011,302.600006 C 636.600037,302.200012 636.5,302 636.400024,302 L 636.400024,302 C 636.100037,301.899994 636,302.800018 636,304.399994 L 636,304.399994 C 636,306.600006 640.399048,309.299011 649.100037,312.799011 L 649.100037,312.799011 C 657.799988,316 663.600037,317.399994 666.799988,317 L 666.799988,317 L 667.5,316.700012 C 668.400024,318.700012 669.200012,320.800018 670.100037,322.899994 L 670.100037,322.899994 C 674,331.799011 677.799988,340.600006 681.400024,348.899994 L 681.400024,348.899994 C 679,346.899994 672.799011,343.300018 662.799988,337.800018 L 662.799988,337.800018 C 650.400024,331.100006 643.400024,327.100006 642,325.800018 L 642,325.800018 C 641,326 640.5,326.201019 640.20105,326.5 L 640.20105,326.5 C 639.799988,326.800018 639.5,327.899994 639.5,329.600006 L 639.5,329.600006 C 639.5,333.100006 645.400024,337.800018 657.100037,343.800018 L 657.100037,343.800018 C 668.799988,349.700012 677,351.700012 681.900024,349.899994 L 681.900024,349.899994 C 687,361.700012 691.900024,372.800018 696.600037,383.200012 L 696.600037,383.200012 C 691.400024,379.100006 684.5,374.100006 676.100037,368.5 L 676.100037,368.5 C 662.899048,359.600006 655,354.200012 652.400024,352.201019 L 652.400024,352.201019 C 652.400024,352.300018 652.299988,352.600006 652.200012,352.899994 L 652.200012,352.899994 C 652,353.201019 652,354.200012 652,355.800018 L 652,355.800018 C 652,358.899994 658.799988,365.100006 672.299988,374.399994 L 672.299988,374.399994 C 684,382.600006 692.799988,387 698.5,387.399994 L 698.5,387.399994 C 702.100037,395.600006 705.600037,403.200012 709,410.600006 L 709,410.600006 C 700.200012,405.100006 690.900024,398.700012 680.899048,391.399994 L 680.899048,391.399994 C 665.900024,380.100006 655,372.100006 648.400024,367.399994 L 648.400024,367.399994 L 646.799011,368.200012 C 655.5,379.100006 665.600037,389.201019 677.20105,398.399994 L 677.20105,398.399994 C 690,408.299011 701.400024,414.300018 711.5,416.201019 L 711.5,416.201019 C 712.20105,417.700012 712.900024,419.100006 713.5,420.600006 L 713.5,420.600006 L 713.400024,421.700012 C 693.900024,418.600006 678.5,413.600006 667,406.600006 L 667,406.600006 C 656.900024,400.399994 649.20105,392.200012 644,382.200012 L 644,382.200012 C 641.600037,377.800018 636.200012,368.899994 627.799011,355.700012 L 627.799011,355.700012 C 619.400024,342.700012 615.100037,336.200012 614.799988,336.200012 L 614.799988,336.200012 C 609.900024,336.200012 605.700012,339.701019 602,346.5 L 602,346.5 C 596.700012,356.701019 592.600037,363.200012 589.600037,366.200012 L 589.600037,366.200012 C 586.799988,368.899994 581.100037,373.700012 572.400024,380.399994 L 572.400024,380.399994 C 560.5,389.299011 554.100037,394.200012 553.100037,395 L 553.100037,395 L 553.100037,398.600006 C 553.299988,398.600006 553.900024,398.800018 554.70105,399.100006 L 554.70105,399.100006 C 557,401.600006 565.799011,410.600006 581,426.200012 L 581,426.200012 C 596.20105,441.700012 603.200012,451.700012 601.900024,456.200012 L 601.900024,456.200012 C 600.5,460.600006 597.200012,463.600006 591.799011,464.899994 L 591.799011,464.899994 C 589.849976,465.029999 587.887024,465.096008 585.911011,465.096008 L 585.911011,465.096008 C 574.307007,465.096008 562.232056,462.843018 549.5,458.399994"
+         fill="url(#gradient-body)" />
+      <path
+         id="tail-bottom"
+         d="M 644.899048,180 C 653.299988,175.900009 659.100037,173.299011 662.400024,172.201004 L 662.400024,172.201004 C 661.799988,173.800003 661.200012,175.5 660.600037,177 L 660.600037,177 L 659.5,177 C 656.100037,177 651.5,178.5 645.400024,181.300003 L 645.400024,181.300003"
+         fill="url(#gradient-body)" />
+      <path
+         id="tail-middle"
+         d=" M 632.100037,186.100006 C 636.799011,183.800003 641,181.699997 644.799988,180 L 644.799988,180 L 645.400024,181.300003 C 641.799988,183 637.600037,185.199997 633,188 L 633,188"
+         fill="url(#gradient-body)" />
+    </g>
+    <path
+       style="fill:#f2bc29"
+       id="path36"
+       d="M 216.79989,339.8998 C 218.99989,342.1998 220.89989,344.7998 222.59989,347.7998 C 227.19989,355.7998 229.59989,363.8998 229.59989,372.1998 C 229.59989,385.5998 225.39989,394.5998 216.99989,399.1998 C 209.79989,403.3998 200.49989,403.7998 189.39989,400.5998 C 178.79989,397.5998 169.69989,392.1998 161.79989,384.5998 C 153.39989,376.5998 149.19988,368.4998 149.19988,360.1998 C 149.19988,352.5998 153.59989,345.3998 162.49989,338.8998 C 172.49989,331.3998 184.19989,328.5998 197.59989,330.1998 C 205.19989,331.1998 211.59989,334.3998 216.79989,339.8998" />
+    <path
+       id="pupil-right"
+       d="M 186.3999,373.2998 C 180.9999,372.6998 176.4999,371.1998 172.5999,368.9998 C 168.4999,366.3998 166.3999,363.4998 166.3999,360.1998 C 166.3999,357.2998 166.7999,355.1998 167.5999,354.0998 C 169.3999,351.4998 173.3999,350.1998 179.5999,350.1998 C 186.6999,350.1998 192.9999,351.5998 198.3999,354.1998 C 203.7999,356.7998 206.3999,359.7998 206.3999,362.9998 C 206.3999,367.0998 204.2999,369.8998 200.1999,371.7998 C 196.4999,373.3998 191.7999,373.8998 186.3999,373.2998"
+       inkscape:label="#path38">
+            <animateMotion path="M 10.686576,20.227776 C 19.43486,28.098588 28.66916,29.148027 29.155181,24.950264 C 29.641196,20.7525 25.753064,9.7333676 22.350957,8.6839246 C 18.948845,7.6344856 4.8543824,7.6344856 5.8264184,12.356969 C 6.7984431,17.079456 10.200561,20.7525 10.686576,20.227776 z" dur="4s" repeatCount="indefinite"/>
+       </path>
+    <path
+       style="fill:#f9eab6"
+       id="path40"
+       d="M 197.8999,394.3999 C 200.8999,395.5999 202.3999,396.7999 202.3999,397.8999 C 202.3999,400.2999 200.0999,401.1999 195.4999,400.5999 C 191.4999,400.0999 186.3999,398.5999 180.4999,395.9999 C 174.4999,393.3999 169.4999,390.5999 165.2999,387.5999 C 160.7999,384.0999 158.4999,381.1999 158.4999,378.8999 C 158.4999,378.4999 158.7999,377.4999 159.4999,375.8999 C 160.1999,374.2999 160.7999,373.1999 161.2999,372.5999 C 166.4999,379.6999 175.0999,385.5999 186.9999,390.1999 C 189.7999,391.3999 193.4999,392.7999 197.8999,394.3999" />
+    <path
+       style="fill:#f9eab6"
+       id="path42"
+       d="M 217.1001,345.70019 L 216.9001,345.30019 C 215.1001,345.00019 211.3001,343.20019 205.8001,340.20019 C 200.6001,337.30019 197.0001,335.80019 194.9001,335.80019 C 194.5001,335.80019 193.7001,335.90019 192.8001,336.10019 C 192.3001,336.20019 192.0001,336.10019 191.8001,335.80019 L 192.0001,335.20019 C 192.3001,335.00019 193.0001,334.50019 193.8001,333.80019 C 194.7001,333.20019 195.5001,332.90019 196.3001,332.90019 C 199.0001,332.90019 203.2001,334.40019 208.7001,337.20019 C 214.4001,340.20019 217.3001,342.60019 217.3001,344.40019 C 217.3001,345.30019 217.2001,345.70019 217.1001,345.70019" />
+    <g
+       id="teeth">
+      <path
+         id="tooth-left"
+         transform="translate(258.200195,269.200195)"
+         d="M 0,0 C 0,-0.1 1,-1.5 3.1,-4.2 C 6.2,-8.2 10.3,-10.2 15.6,-10.2 C 20.5,-10.2 23.800001,-7.6 25.4,-2.5 C 25.800001,0.5 26.1,2.6 26.4,4 C 15.400001,2.8 6.5,1.6 -0.1,0.4"
+         fill="white" />
+      <path
+         id="tooth-right"
+         transform="translate(249.299789,267.600098)"
+         d="M 0,0 C -1.6,-0.4 -3.1,-0.9 -4.1,-1.4 C -7,-2.7 -12.6,-4.2 -21.300001,-6 C -20.1,-10.400001 -18.6,-12.6 -16.9,-12.6 C -12.900001,-12.6 -8.6,-9.900001 -4.1,-4.6 C -2.5,-2.8 -1.1,-1.2 0,0"
+         fill="white" />
+    </g>
+    <path
+       id="nose"
+       transform="translate(201,299.799805)"
+       d="M 0,0 C 0.6,0.3 0.9,0.9 0.9,1.8 C 0.9,5.7 -7,9.2 -22.700001,12.3 C -29.1,13.5 -34.5,14.1 -39,14 C -43.799999,13.900001 -46.299999,12.8 -46.299999,10.900001 C -46.299999,7.7 -43.200001,5.1 -37.100002,3 C -29.800001,0.4 -19.200001,-0.8 -5.3,-0.8 C -2.7,-0.8 -0.9,-0.6 0,0"
+       fill="white" />
+    <path
+       id="path49"
+       d="M 305.4,365.9 C 297.8,369.8 288.2,370.1 277,367.1 C 265.8,364 256.4,358.6 248.6,350.6 C 242.5,344.5 238.6,338 236.8,331.1 C 236,328.1 235.6,325 235.6,321.8 C 235.6,320.8 235.5,318.8 235.2,315.8 C 235.3,312.9 236.2,310.6 237.7,308.5 C 242,302.7 252.8,299.8 270,299.8 C 287.3,299.8 300.4,305.7 309.2,317.4 C 311.2,319.9 312.8,322.5 314.2,325.1 C 317,330.7 318.4,336.3 318.4,342 C 318.4,353.7 314.1,361.6 305.4,365.9" />
+    <path
+       style="fill:#f2bc29"
+       id="path51"
+       d="M 252.6998,339.6998 C 252.2998,339.6998 252.0998,340.0998 252.0998,340.8998 C 252.0998,342.1998 252.7998,343.5998 253.9998,344.9998 C 253.3998,344.5998 252.8998,344.0998 252.3998,343.5998 C 247.0998,338.3998 243.6998,333.0998 242.1998,327.5998 C 241.6998,325.3998 241.2998,323.2998 241.2998,321.1998 C 241.2998,315.5998 243.1998,311.7998 246.6998,309.9998 C 250.5998,307.8998 258.5998,306.8998 270.5998,306.8998 C 286.0998,306.8998 297.6998,312.2998 305.0998,323.1998 C 305.2998,323.3998 305.4998,323.6998 305.6998,323.7998 C 309.9998,330.2998 312.1998,336.4998 312.1998,342.2998 C 312.1998,351.2998 308.3998,357.0998 301.0998,359.5998 C 294.5998,361.8998 286.4998,361.3998 276.7998,358.1998 C 269.9998,355.8998 263.8998,352.7998 258.5998,348.6998 C 260.8998,350.2998 263.8998,351.8998 267.5998,353.6998 C 277.7998,358.3998 285.7998,360.3998 291.4998,359.5998 C 291.7998,359.3998 291.8998,358.8998 291.8998,358.0998 C 291.8998,356.7998 288.1998,355.1998 280.8998,352.9998 C 278.5998,352.2998 274.2998,351.2998 268.2998,349.7998 C 266.0998,349.2998 263.5998,347.4998 260.6998,344.5998 C 258.0998,341.7998 255.5998,340.1998 253.2998,339.8998 C 253.0998,339.7998 252.8998,339.6998 252.6998,339.6998" />
+    <path
+       id="pupil-left"
+       d="M 292.3999,342.20019 C 289.0999,342.80019 284.8999,342.50019 280.0999,341.20019 C 275.1999,339.80019 271.0999,337.90019 267.6999,335.40019 C 263.8999,332.70019 261.9999,329.90019 261.9999,327.20019 C 261.9999,326.20019 262.0999,325.30019 262.2999,324.60019 C 262.3999,323.80019 262.5999,323.10019 262.7999,322.50019 C 264.2999,319.80019 267.0999,318.30019 271.1999,318.30019 C 275.5999,318.30019 280.1999,319.80019 285.0999,322.80019 C 286.4999,323.70019 287.8999,324.80019 289.3999,325.80019 C 295.1999,330.30019 298.0999,333.80019 298.0999,336.40019 C 298.0999,339.50019 296.1999,341.40019 292.3999,342.20019"
+       inkscape:label="#path53">
+       <animateMotion path="M 0.35137106,5.9466274 C 6.4766093,11.773308 12.942139,12.550196 13.282434,9.4426362 C 13.622724,6.3350752 10.900392,-1.8222739 8.5183571,-2.5991656 C 6.1363188,-3.3760544 -3.7321242,-3.3760544 -3.051539,0.11995092 C -2.3709618,3.6159589 0.01108058,6.3350752 0.35137106,5.9466274 z" dur="4.2s" repeatCount="indefinite"/>
+    </path>
+    <path
+       style="fill:#f9eab6"
+       id="path55"
+       d="M 294.3999,315.5 C 297.0999,318.1 298.7999,320.1 299.2999,321.3 C 298.2999,321.4 295.4999,320.1 290.7999,317.1 C 285.2999,313.8 281.6999,311.8 279.6999,311.2 C 279.9999,310.9 280.5999,310.7 281.3999,310.4 C 282.2999,310.2 283.1999,310.2 284.1999,310.2 C 287.2999,310.2 290.7999,311.9 294.3999,315.5" />
+    <path
+       style="fill:#f9eab6;stroke:#f9eab6"
+       id="path57"
+       d="M 252.1001,340.8999 C 252.1001,340.0999 252.3001,339.6999 252.7001,339.6999 C 252.9001,339.6999 253.1001,339.7999 253.3001,339.8999 C 255.6001,340.1999 258.1001,341.7999 260.7001,344.5999 C 263.6001,347.4999 266.1001,349.2999 268.3001,349.7999 C 274.3001,351.2999 278.6001,352.2999 280.9001,352.9999 C 288.2001,355.1999 291.9001,356.7999 291.9001,358.0999 C 291.9001,358.8999 291.8001,359.3999 291.7001,359.3999 C 291.6001,359.3999 291.6001,359.3999 291.5001,359.5999 C 285.8001,360.3999 277.8001,358.3999 267.6001,353.6999 C 263.9001,351.8999 260.9001,350.2999 258.6001,348.6999 C 256.9001,347.5999 255.4001,346.2999 254.0001,344.9999 C 252.8001,343.5999 252.1001,342.1999 252.1001,340.8999" />
+    <g
+       id="face">
+      <path
+         transform="translate(357.5,304.899902)"
+         d="M 0,0 C -0.7,0.9 -1.5,1.7 -2.3,2.5 C -3.1,3.3 -3.9,4.1 -4.6,4.9 C -9.400001,10.900001 -17.1,15.7 -27.4,19.1 C -28.6,19.5 -29.700001,19.700001 -30.800001,19.800001 C -35.100002,20 -39.299999,20.200001 -43.299999,20.200001 C -44.700001,17.6 -46.299999,15 -48.299999,12.5 C -57.100002,0.8 -70.200005,-5.1 -87.5,-5.1 C -104.700005,-5.1 -115.5,-2.2 -119.800003,3.6 C -121.300003,5.7 -122.200005,8 -122.300003,10.900001 C -122,13.900001 -121.900002,15.900001 -121.900002,16.9 C -121.900002,20.1 -121.5,23.200001 -120.700005,26.200001 C -122.099998,26.6 -123.400002,27 -124.900002,27.5 C -128.300003,28.5 -131.400009,29.9 -134.5,31.4 C -144.699997,19.1 -158.5,12.900001 -175.5,12.900001 L -178,12.900001 C -177.199997,12.8 -176.5,12.5 -175.699997,12.3 C -164.800003,9.3 -153.699997,6.9 -142.400009,5.1 C -138.100006,4.4 -135.300003,3.8 -134.100006,3.1 C -132.699997,2.2 -131.900009,0.5 -131.900009,-1.9 C -131.900009,-7 -135.300003,-12.6 -141.900009,-18.700001 C -149.699997,-25.800001 -159.300003,-29.700001 -170.900009,-30.6 C -170.400009,-31.700001 -170,-33 -169.699997,-34.200001 C -169.300003,-35.700001 -168.800003,-37.600002 -168.300003,-39.900002 C -164,-39.100002 -159,-38.100002 -153.300003,-36.900002 C -131.699997,-32.5 -118.400002,-29.6 -113.5,-28.300001 C -93.700005,-23.1 -72.700005,-19.5 -50.700001,-17.5 C -26.700001,-15.3 -14.7,-16.6 -14.7,-21.300001 C -14.7,-24.5 -28.300001,-27.300001 -55.700001,-29.9 C -57.299999,-30.1 -58.799999,-30.200001 -60.299999,-30.4 L -60.299999,-30.700001 C -60.299999,-34.700001 -62,-39.5 -65.400002,-45.100002 C -70,-52.600002 -75.700005,-56.299999 -82.700005,-56.299999 C -88.900002,-56.299999 -93.900002,-54.900002 -97.900002,-52.100002 C -100.700005,-49.299999 -102.200005,-47.700001 -102.300003,-47.5 C -102.700005,-47.700001 -105.200005,-49.799999 -109.800003,-53.600002 C -115.200005,-57.200001 -120,-59.100002 -124.300003,-59.100002 C -129.699997,-59.100002 -133.600006,-57.100002 -136.300003,-53.200001 C -137.900009,-49.100002 -138.800003,-46.700001 -139.100006,-46.299999 L -139.300003,-45.299999 C -151,-47.600002 -166.300003,-50.100002 -185.100006,-53.100002 C -200.199997,-53.100002 -210.800003,-51.700001 -217.100006,-49.100002 C -219.100006,-48.200001 -221.100006,-47 -223,-45.5 C -225.5,-43.5 -227,-42.299999 -227.5,-41.900002 C -227.699997,-43.299999 -227.900009,-42.700001 -227.900009,-40.100002 C -227.900009,-38.299999 -226.900009,-37.200001 -224.800003,-36.700001 C -223.800003,-36.5 -221.699997,-36.299999 -218.699997,-36.299999 C -214.600006,-36.299999 -211.800003,-36.700001 -210.5,-37.5 C -210.199997,-37.700001 -209.5,-38.5 -208.300003,-39.900002 C -206.5,-42.299999 -199.5,-43.5 -187.5,-43.5 C -186.800003,-43.5 -183.5,-42.900002 -177.600006,-41.700001 C -178.600006,-38.299999 -179.100006,-35.799999 -179.100006,-34.299999 C -179,-33 -178.900009,-31.700001 -178.5,-30.6 C -188.800003,-29.6 -198.5,-23.5 -207.600006,-12.400001 C -211,-8.2 -213.900009,-3.8 -216.400009,0.8 C -218.5,4.7 -219.5,7 -219.5,8.1 C -219.5,12.8 -217.5,16.200001 -213.5,18.4 C -208.5,21 -201.300003,20.800001 -191.699997,17.4 C -197.600006,21 -203,26.700001 -207.900009,34.400002 C -209.199997,36.299999 -210.300003,38.299999 -211.5,40.400002 C -212,39.799999 -212.699997,39.200001 -213.5,38.5 C -215.699997,36.700001 -219.900009,33.5 -225.900009,29.1 C -237.900009,19.5 -243.900009,9.900001 -243.900009,0.3 C -243.900009,-29.5 -242.900009,-54.5 -240.699997,-74.700005 C -240.5,-77.400002 -238.100006,-81.5 -233.699997,-86.900002 C -227.5,-94.599998 -219.100006,-101.599998 -208.5,-108 C -197.5,-114.700005 -184.699997,-120.200005 -170.5,-124.599998 C -173.800003,-121.099998 -175.5,-117.800003 -175.5,-114.5 C -175.5,-111.099998 -174.699997,-109.400002 -173.100006,-109.5 C -172,-109.599998 -169.800003,-110.800003 -166.699997,-113.200005 C -158,-119.800003 -151.300003,-123.099998 -146.699997,-123.099998 C -138.100006,-123.099998 -132.100006,-122.200005 -128.900009,-120.599998 C -124.800003,-118.400002 -120.599998,-116.900002 -116.099998,-116.099998 C -115.400002,-116.099998 -115.099998,-116.900002 -115.099998,-118.5 C -115.099998,-121.200005 -118.400002,-124.200005 -125.099998,-127.5 C -129.5,-129.699997 -133.900009,-131.100006 -138.300003,-132 C -119,-135.100006 -97.599998,-136.699997 -73.900002,-136.699997 C -70.900002,-136.699997 -64,-135.900009 -53.100002,-134.300003 C -42.200001,-132.699997 -35.299999,-131.900009 -32.299999,-131.900009 C -28.1,-131.900009 -25.200001,-132.699997 -23.4,-134.300003 C -22.4,-135.199997 -21.9,-136.400009 -21.9,-137.900009 C -21.9,-139.699997 -25.4,-141.5 -32.400002,-143.400009 C -20.1,-145 -0.3,-146.100006 27.1,-146.699997 C 25.9,-139.900009 25.300001,-135.600006 25.300001,-133.699997 C 25.4,-131.400009 25.5,-129.100006 25.6,-126.900002 C 21.700001,-125.900002 17.9,-124.900002 14,-123.900002 C 10.400001,-122.900002 6.7,-121.5 3.2,-119.700005 C 1.9,-119.099998 0.6,-118.400002 -0.6,-117.900002 C -7.9,-114.700005 -13.2,-109.700005 -16.6,-102.900002 C -16.9,-102.200005 -17.4,-101.700005 -18.1,-101.400002 C -20.700001,-100 -21.5,-97.300003 -20.5,-93.300003 C -18.4,-84.900002 -15.400001,-76.900002 -11.5,-69.099998 C -10.900001,-68.099998 -10.3,-67.099998 -9.5,-66.200005 C -2.6,-58.799999 2.6,-50.200001 6.3,-40.400002 C 6.7,-39.200001 6.9,-38.100002 7.1,-37.100002 C 7.5,-33.900002 7.9,-30.700001 8.1,-27.5 C 9,-16.200001 6.3,-7.1 0,0"
+         id="path60"
+         fill="#d1c1ad" />
+      <path
+         transform="translate(473.899902,179)"
+         d="M 0,0 C -1.8,0.1 -3.5,0.1 -5.3,0 C -4.3,-5.2 -2.6,-11.2 -0.1,-18 C 0.2,-18.700001 0.5,-19.5 0.7,-20.200001 C 4.8,-18.200001 11,-16 19.200001,-13.3 C 33.299999,-8.8 44,-5.1 51,-2.2 C 43.799999,0.5 35.900002,1.7 27.200001,1.2 C 20.300001,1 13.400001,0.6 6.5,0.2 C 4.3,0 2.2,0 0,0"
+         id="path62"
+         fill="#d1c1ad" />
+    </g>
+    <g
+       id="scales-fur">
+      <path
+         transform="translate(549.600098,412.5)"
+         d="M 0,0 C -0.8,-2.9 -1,-4.5 -0.6,-4.6 C -0.5,-4.7 -0.2,-4.6 0,-4.3 C 3,-1.8 6.3,2 9.6,7.1 L 18,19.700001 C 16.300001,21.6 13,19.5 8.3,13.400001 C 3.5,7.4 0.8,2.9 0,0"
+         id="path65" />
+      <path
+         transform="translate(516.899902,428.600098)"
+         d="M 0,0 C -21,-13.3 -32,-21.300001 -33.100002,-24 C -34.299999,-26.6 -35.100002,-28 -35.700001,-28.200001 C -36.200001,-28.4 -36,-28.6 -35,-28.800001 C -29,-24.4 -16.300001,-16.4 3.2,-4.7 C 22.800001,7 34.900002,14.5 39.5,18 C 34,19.5 20.9,13.5 0,0"
+         id="path67" />
+      <path
+         transform="translate(508.600098,372.200195)"
+         d="M 0,0 C -3.9,-0.4 -5.8,-2.1 -5.8,-5.2 C -5.8,-6.8 -5.7,-7.8 -5.2,-8 L -4.7,-8.400001 C 7.1,-10 15,-11.8 19,-14 C 22.4,-15.900001 24.200001,-18.6 24.200001,-22.4 C 24.200001,-28 19.5,-33.400002 10.400001,-38.799999 C 5.8,-41.299999 2.6,-43 0.9,-44.200001 C -2,-46 -3.5,-47.799999 -3.5,-49.400002 C -3.5,-51.100002 -3,-52.400002 -2.2,-53.100002 C -1.9,-53.400002 -0.7,-53.5 1.2,-53.400002 C 6.8,-52.799999 13.3,-48.5 20.5,-40.600002 C 27.800001,-32.799999 31.300001,-26.6 31.300001,-22.200001 C 31.300001,-18.1 29.4,-14.3 25.5,-10.5 C 22.200001,-7.1 18,-4.4 12.8,-2.4 C 7.8,-0.5 3.5,0.3 0,0"
+         id="path69" />
+      <path
+         transform="translate(501.899902,393.799805)"
+         d="M 0,0 C 10.3,6.1 21.5,13.900001 33.700001,23.200001 C 45.5,32.100002 54.799999,40 61.700001,46.799999 C 54.600002,46.299999 43.700001,40.100002 29.200001,28.1 C 17,18.1 7.2,8.8 0,0"
+         id="path71" />
+      <path
+         transform="translate(569.799805,347.200195)"
+         d="M 0,0 C -5,-2.1 -4.7,-3.8 0.8,-5 C 6.2,-6.2 9.7,-6.8 11.3,-6.8 C 12.400001,-7 13,-7.4 13,-8 C 13,-10.900001 10.7,-14.8 6.1,-19.6 C 1.6,-24.5 -0.7,-27.6 -0.8,-28.9 C -0.9,-30.1 -0.7,-31.300001 0,-32.299999 C 0.5,-33.400002 2.1,-33.600002 4.5,-33.100002 C 7,-32.5 10.2,-29.1 14.3,-23 C 17.9,-17.4 19.800001,-13.6 19.800001,-11.6 C 19.800001,-7.4 18.800001,-4.2 16.800001,-1.9 C 13,2.5 7.3,3 0,0 M 582.799011,339.200012 C 582.799011,339.799011 582.200012,340.200012 581.100037,340.399994 L 581.100037,340.399994"
+         id="path73" />
+      <path
+         transform="translate(395.200195,421.399902)"
+         d="M 0,0 L -0.8,0.4 C -12.6,-5.5 -19.4,-9 -21.1,-10 C -27.6,-13.8 -31.6,-17.5 -33.200001,-20.800001 C -33.799999,-21.800001 -34,-23 -34,-24 C -34,-25.800001 -33.600002,-26.9 -32.799999,-27.5 C -32.299999,-27.800001 -31.300001,-28.1 -30,-28.4 C -27.300001,-26.300001 -21.200001,-21.9 -11.6,-15.3 C -3.3,-9.3 0.8,-5.1 0.8,-2.8 C 0.8,-1.2 0.6,-0.3 0,0"
+         id="path75" />
+      <path
+         transform="translate(391.200195,355.399902)"
+         d="M 0,0 C 0,-2.6 0.9,-4.7 2.6,-6.6 C 3.7,-7.9 5.7,-10.1 8.8,-13.2 C 5.9,-15 4.1,-17 3.2,-19.200001 C 2.7,-20.4 2.4,-22.200001 2.4,-24.6 C 2.4,-27.6 3.6,-31.800001 6,-37.200001 C 2.6,-38.100002 -0.1,-39.600002 -2,-42 C -3.3,-43.600002 -4,-44.900002 -4,-46 C -4,-47.5 -3.2,-49.299999 -1.6,-51.600002 C -0.6,-52.799999 0.7,-54.600002 2.4,-56.799999 C -2.9,-61.5 -6.3,-64.700005 -8,-66.400002 C -10.6,-69.099998 -11.5,-71.599998 -10.8,-74 C -10.8,-77.200005 -12.400001,-80.599998 -15.8,-84.5 C -19.1,-88.400002 -20.800001,-91.300003 -20.800001,-93.200005 C -20.800001,-94.599998 -20.200001,-96.599998 -19,-99.599998 C -17.800001,-102.400002 -17.200001,-104.5 -17.200001,-105.800003 C -17.200001,-107.200005 -20.6,-111.700005 -27.6,-119.200005 C -34.600002,-126.599998 -38,-130.5 -38,-130.800003 C -38,-131.100006 -37.700001,-131.400009 -37.100002,-131.900009 C -36.700001,-132.199997 -35.100002,-133.300003 -32.400002,-135.199997 C -25.6,-130.400009 -21.200001,-127 -19.1,-125.099998 C -14.400001,-120.800003 -11.3,-116.300003 -9.6,-111.599998 C -9,-109.700005 -8.8,-107.5 -9.3,-104.700005 C -10.1,-101.700005 -10.6,-99.599998 -10.8,-98.400002 C -11.6,-95.200005 -10.3,-92.700005 -6.8,-91 C -3.1,-89.200005 -1.2,-87.099998 -1.2,-84.800003 C -1.8,-81.700005 -2.1,-79.300003 -2.5,-77.599998 C -3.1,-74.300003 -2.8,-71.900002 -1.6,-70.400002 C 1,-66.800003 4.2,-64.200005 7.8,-62.600002 C 10,-61.600002 11.2,-59.799999 11.2,-57.600002 C 11.2,-56.200001 10.5,-54.400002 9.1,-52.299999 C 7.3,-50 6,-48.200001 5.2,-46.799999 C 9.7,-46.5 12.7,-45.299999 13.8,-43.200001 C 14.2,-42.600002 14.400001,-41.200001 14.400001,-39.200001 C 14.400001,-37.600002 13.6,-35.200001 12,-32 C 10.400001,-28.800001 9.6,-26.4 9.6,-24.800001 C 9.6,-22.800001 10.900001,-21.300001 13.400001,-20.4 C 15.900001,-19.5 17.200001,-18 17.200001,-15.8 C 17.200001,-13.2 15.400001,-9.5 11.8,-4.8 C 8.900001,-1.1 5.9,2.2 2.8,4.8 C 2.8,4.5 2,4.4 0.4,4.4 C 0.2,3.7 0.2,3.2 0,3"
+         id="path77" />
+      <path
+         transform="translate(434.399902,313.600098)"
+         d="M 0,0 C -0.3,4.5 -1.2,8.900001 -2.6,13.2 C -5.6,21.700001 -10.3,25.9 -16.4,25.800001 L -16.800001,23.200001 C -16.800001,22 -15.3,17.9 -12.400001,11.2 C -9.3,3.7 -7.6,-0.1 -7.6,-0.2 C -13.5,-1.4 -17.200001,-2.8 -18.5,-4.6 C -19,-5.3 -19.200001,-7 -19.200001,-9.8 C -19.200001,-11 -18.5,-12.8 -17,-15.2 C -15.5,-17.6 -14.8,-19.6 -14.8,-21.200001 C -14.8,-22.300001 -15.3,-23.300001 -16.300001,-24 C -17.6,-24.800001 -18.5,-25.4 -19.200001,-26 C -21.5,-28.4 -21.700001,-33.400002 -19.6,-41 C -25.6,-42.299999 -28.800001,-45.100002 -29,-49.700001 C -29.1,-50.700001 -29,-52.5 -28.6,-55.100002 C -28.5,-57.200001 -28.5,-58.600002 -28.800001,-59.400002 C -28.800001,-59.799999 -31,-62.799999 -35.200001,-68.200005 C -39.200001,-73.599998 -41.200001,-77 -41.200001,-78.400002 C -41.200001,-80.200005 -40.799999,-81.400002 -40.100002,-82.200005 C -39.799999,-82.400002 -38.799999,-82.800003 -37.200001,-83.400002 C -35.600002,-82.800003 -32.299999,-79.300003 -26.9,-73 C -21.5,-66.5 -18.800001,-62.700001 -18.800001,-61.200001 C -18.800001,-59.799999 -19,-58 -19.4,-56.200001 C -19.800001,-54.200001 -20,-52.900002 -20,-52.200001 C -19.300001,-51.400002 -17,-49.400002 -13.2,-46.200001 C -11.3,-44.700001 -10.400001,-43.400002 -10.400001,-42.200001 C -10.3,-40.200001 -9.5,-36.799999 -8,-32 C -6.4,-27.300001 -5.6,-23.700001 -5.6,-21.200001 C -5.6,-19.200001 -5.8,-17.4 -6.3,-16 C -6.9,-14.400001 -7.8,-12.8 -9.2,-11 C -4.3,-9.1 -1.5,-7.4 -0.6,-5.9 C -0.3,-5.3 0,-3.3 0,0"
+         id="path79" />
+      <path
+         transform="translate(582.899902,248.299789)"
+         d="M 0,0 C -3.1,3.4 -8.1,4.9 -15,4.7 C -14.900001,1.6 -13,-1 -9.5,-3 C -6,-5.1 -4.1,-7.1 -4.1,-9.3 C -4.1,-12 -6.8,-15.5 -12.1,-20.1 C -17.5,-24.6 -20.1,-27.300001 -20.1,-28.1 C -20.1,-29.800001 -19.800001,-31 -19,-31.5 C -13.1,-30.1 -8.7,-26.800001 -2.8,-22.5 C 1.7,-18.6 3.9,-14.900001 3.9,-11.1 C 3.9,-6.4 2.6,-2.7 0,0"
+         id="path81" />
+      <path
+         transform="translate(558.399902,267.799805)"
+         d="M 0,0 C 4,5 6,9.400001 6,13.2 C 6,18.6 5.2,23 3.5,26.200001 C 2,29.4 -2.2,32.5 -8.900001,35.400002 C -17.200001,37.299999 -18.800001,35.299999 -13.7,29.300001 C -12.6,28 -10.900001,26.700001 -8.6,25.4 C -4,22.4 -1.6,20 -1.6,17.800001 C -1.6,14 -4.3,9.8 -9.400001,5.2 C -14.6,0.6 -17.300001,-2.4 -17.300001,-3.6 C -17.300001,-5.1 -17.1,-6.1 -16.800001,-6.5 C -16.6,-6.9 -16.5,-7 -16.5,-7.2 L -11.6,-8 C -8,-8 -4.1,-5.4 0,0"
+         id="path83" />
+      <path
+         transform="translate(496.799774,284.200195)"
+         d="M 0,0 C 2.3,-5.1 5.6,-9.5 9.8,-13 C 12.6,-15.5 14,-18.4 14,-21.800001 C 14,-25.1 10.8,-28 4.6,-30.6 C -1.7,-33.200001 -4.9,-35.400002 -4.9,-37.200001 C -4.9,-38.799999 -4.7,-39.799999 -4.4,-40.100002 C -4.2,-40.400002 -4,-40.600002 -4,-40.799999 L 0.3,-41.600002 C 4.3,-41.600002 7.8,-40.400002 11,-38 C 13,-40.400002 15,-42.600002 16.800001,-44.600002 C 17.800001,-46.100002 18.300001,-48 18.300001,-50.400002 C 18.300001,-55 16.4,-60.200001 12.6,-65.900002 C 8.7,-70.700005 6.8,-73.300003 6.8,-73.599998 C 6.8,-75.200005 6.8,-76.200005 7.1,-76.5 C 7.3,-76.700005 7.7,-76.900002 8.3,-77.200005 L 11.6,-78 C 15.900001,-78 19.5,-73.700005 22.300001,-65.200005 C 24.5,-59 25.6,-53.799999 25.6,-49.600002 C 25.6,-43.799999 25.200001,-40.299999 24.4,-39 C 23,-36.600002 19.9,-35.200001 15.1,-34.600002 L 14.400001,-34.600002 C 14.6,-34.299999 14.900001,-34 15.1,-33.600002 C 18.6,-29.200001 20.300001,-25.200001 20.300001,-21.6 C 20.300001,-17.5 17.9,-12.6 13,-6.8 C 7.8,-0.6 3.5,1.6 0,0 "
+         id="path85" />
+    </g>
+  </g>
+</svg>
diff --git a/Websites/webkit.org/wp-content/themes/webkit/images/twitter.svg b/Websites/webkit.org/wp-content/themes/webkit/images/twitter.svg
new file mode 100644 (file)
index 0000000..6d4cf76
--- /dev/null
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Copyright © 2015 Apple Inc. All rights reserved. -->\r
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100"\r
+    height="400">\r
+    <style>\r
+        symbol { color: white; }\r
+    </style>\r
+    \r
+    <defs>\r
+        \r
+        <symbol id="twitter">\r
+            <path d="M 81.812 30.141 C 79.464 31.18 76.943 31.884 74.293 32.201 C 76.996 30.581 79.071 28.014 80.049 24.957 C 77.52 26.457 74.719 27.549 71.736 28.133 C 69.349 25.591 65.948 24 62.182 24 C 54.953 24 49.09 29.861 49.09 37.093 C 49.09 38.119 49.208 39.114 49.428 40.074 C 38.543 39.526 28.9 34.317 22.441 26.395 C 21.315 28.331 20.67 30.579 20.67 32.976 C 20.67 37.518 22.982 41.527 26.494 43.874 C 24.348 43.805 22.329 43.217 20.564 42.236 C 20.562 42.291 20.562 42.346 20.562 42.398 C 20.562 48.743 25.075 54.036 31.066 55.238 C 29.965 55.536 28.81 55.695 27.617 55.695 C 26.771 55.695 25.95 55.617 25.152 55.464 C 26.819 60.664 31.651 64.45 37.382 64.554 C 32.9 68.066 27.253 70.16 21.122 70.16 C 20.067 70.16 19.026 70.099 18 69.976 C 23.794 73.693 30.676 75.858 38.067 75.858 C 62.15 75.858 75.318 55.909 75.318 38.609 C 75.318 38.043 75.304 37.475 75.279 36.915 C 77.838 35.068 80.058 32.765 81.812 30.141 L 81.812 30.141 Z" fill="currentColor"/>\r
+        </symbol>\r
+\r
+        <symbol id="reply">\r
+            <path d="M 38.3020404 47.8542775 L 34.8980705 51.5166522 L 19.231132 36.9551203 L 34.6484605 20.4499969 L 38.302351 23.8630723 L 28.7868053 34.050003 L 70.4483126 34.050003 C 76.1495533 34.050003 80.7688667 38.6674478 80.7688667 44.370557 L 80.768868 79.5500029 L 75.768868 79.5500031 L 75.7688667 44.3705571 C 75.7688667 41.4293245 73.3885824 39.050003 70.4483126 39.050003 L 28.837205 39.050003 L 38.3020404 47.8542775 Z" fill="currentColor"/>\r
+        </symbol>\r
+\r
+        <symbol id="retweet">\r
+            <path d="M 6.62115213 44.0860477 L 2.90704329 40.7386016 L 21.182056 20.4618342 L 41.9727366 40.4891625 L 38.5039285 44.090186 L 24.107044 30.2218987 L 24.107044 66.8576043 C 24.107044 70.7091434 27.2244324 73.8252707 31.0747104 73.8252707 L 66.607044 73.8252707 L 66.607044 78.8252707 L 31.0747104 78.8252707 C 24.4634614 78.8252707 19.107044 73.4710201 19.107044 66.8576043 L 19.107044 30.2325128 L 6.62115213 44.0860477 Z" fill="currentColor"/>\r
+            <path d="M 93.4849846 57.0204941 L 97.0929567 60.4820742 L 78.8100584 79.5381658 L 58.0270441 60.7315523 L 61.3818985 57.0241338 L 75.8770445 70.140836 L 75.8770445 34.0229366 C 75.8770445 30.1713975 72.7596561 27.0552702 68.9093781 27.0552702 L 35.607044 27.0552702 L 35.607044 22.0552702 L 68.9093781 22.0552702 C 75.5206271 22.0552702 80.8770445 27.4095208 80.8770445 34.0229366 L 80.8770445 70.1616305 L 93.4849846 57.0204941 Z" fill="currentColor"/>\r
+        </symbol>\r
+        \r
+        <symbol id="favorite">\r
+            <path d="M 25.2947401 27.7278335 C 34.6110304 16.908572 46.1630367 29.7374149 49.6931294 33.1935192 C 53.4878214 29.7374151 64.7866342 17.7659811 74.0915188 27.7278335 C 90.8907207 45.7131368 49.6931294 76.5246123 49.6931294 76.5246123 C 49.6931294 76.5246123 9.80788797 45.7131364 25.2947401 27.7278335 Z" stroke="currentColor" stroke-width="5" fill="none"/>            \r
+        </symbol>\r
+\r
+    </defs>\r
+\r
+    <use y="0" xlink:href="#twitter"/>\r
+    <use y="100" xlink:href="#reply"/>\r
+    <use y="200" xlink:href="#retweet"/>\r
+    <use y="300" xlink:href="#favorite"/>\r
+        \r
+</svg>
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/themes/webkit/images/webkit.svg b/Websites/webkit.org/wp-content/themes/webkit/images/webkit.svg
new file mode 100644 (file)
index 0000000..34cc1a4
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright © 2015 Apple Inc. All rights reserved. -->
+<svg viewBox="0 0 510 552" version="1.1" xmlns="http://www.w3.org/2000/svg">
+    <defs>
+        <linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="blues">
+            <stop stop-color="#34AADC" offset="0%"/>
+            <stop stop-color="#007AFF" offset="100%"/>
+        </linearGradient>
+        <filter x="-50%" y="-50%" width="200%" height="200%" id="shadow">
+            <feOffset dx="0" dy="5" in="SourceAlpha" result="offset"/>
+            <feGaussianBlur stdDeviation="2.5" in="offset" result="blur"/>
+            <feColorMatrix values="0 0 0 0 0  0 0 0 0 0  0 0 0 0 0  0 0 0 0.07 0" in="blur" type="matrix" result="matrix"/>
+            <feMerge>
+                <feMergeNode in="matrix"/>
+                <feMergeNode in="SourceGraphic"/>
+            </feMerge>
+        </filter>
+    </defs>
+    <path d="M 477.861111 306.92819 C 512.046296 333.587507 512.046296 377.446382 477.861111 404.320693 L 317.015432 530.737452 C 282.830247 557.396768 227.169753 557.396768 192.984568 530.737452 L 32.1388889 404.535688 C -2.0462963 377.876371 -2.0462963 334.017496 32.1388889 307.143185 L 192.984568 180.726426 C 227.169753 154.06711 282.830247 154.06711 317.015432 180.726426 L 477.861111 306.92819 Z" fill="rgb(255, 157, 0)" id="base"/>
+    <path d="M 193.370239 451.831773 L 31.8122232 324.860059 C 15.5243578 312.097996 6.5 295.009809 6.5 276.840092 C 6.5 258.670375 15.5243578 241.582189 31.8122232 228.820125 L 193.370239 101.632105 C 209.658105 88.8700422 231.668733 81.7319391 255 81.7319391 C 278.331267 81.7319391 300.121789 88.8700422 316.629761 101.632105 L 478.187777 228.603819 C 494.475642 241.365882 503.5 258.454069 503.5 276.623786 C 503.5 294.793503 494.475642 311.881689 478.187777 324.643753 L 316.629761 451.615467 C 300.121789 464.593836 278.331267 471.731939 255 471.731939 C 231.668733 471.731939 209.878211 464.593836 193.370239 451.831773 Z" fill="rgb(255, 204, 0)" filter="url(#shadow)" id="mid"/>
+    <path d="M 193.370239 371.831773 L 31.8122232 244.860059 C 15.5243578 232.097996 6.5 215.009809 6.5 196.840092 C 6.5 178.670375 15.5243578 161.582189 31.8122232 148.820125 L 193.370239 21.6321055 C 209.658105 8.87004222 231.668733 1.73193906 255 1.73193906 C 278.331267 1.73193906 300.121789 8.87004222 316.629761 21.6321055 L 478.187777 148.603819 C 494.475642 161.365882 503.5 178.454069 503.5 196.623786 C 503.5 214.793503 494.475642 231.881689 478.187777 244.643753 L 316.629761 371.615467 C 300.121789 384.593836 278.331267 391.731939 255 391.731939 C 231.668733 391.731939 209.878211 384.593836 193.370239 371.831773 Z" fill="url(#blues)" filter="url(#shadow)" id="top"/>
+    <path d="M 255.557796 318.523438 L 255.557796 318.523438 C 338.113251 318.523438 405.03767 263.81823 405.03767 196.335938 C 405.03767 128.853645 338.113251 74.1484375 255.557796 74.1484375 C 173.002341 74.1484375 106.077922 128.853645 106.077922 196.335938 C 106.077922 263.81823 173.002341 318.523438 255.557796 318.523438 L 255.557796 318.523438 Z M 255.557796 331.101563 L 255.557796 331.101563 C 164.503985 331.101563 90.6902879 270.764937 90.6902879 196.335938 C 90.6902879 121.906938 164.503985 61.5703125 255.557796 61.5703125 C 346.611606 61.5703125 420.425304 121.906938 420.425304 196.335938 C 420.425304 270.764937 346.611606 331.101563 255.557796 331.101563 L 255.557796 331.101563 Z" fill="white" id="ring"/>
+    <path d="M 266.575605 248.199383 C 274.839361 247.116964 282.893943 244.813421 290.267395 241.288755 L 337.32129 260.629992 L 312.674012 223.705812 C 325.63867 207.004736 325.63867 185.850561 312.674012 169.149485 L 337.32129 132.225305 L 292.974868 150.45365 L 291.700073 169.952942 C 309.829164 185.157289 309.365846 209.169068 290.527893 223.847168 C 285.721068 227.691529 280.20166 230.389527 274.405151 232.306091 L 266.575605 248.199383 Z M 244.579776 144.624146 C 230.931152 146.398682 220.701293 151.565675 220.701293 151.565675 L 173.690288 132.225305 L 198.337566 169.149485 C 185.372907 185.850561 185.372907 207.004736 198.337566 223.705812 L 173.690288 260.629992 L 219.248736 241.90345 L 220.218932 223.640565 C 201.161804 208.480714 201.314025 184.227967 220.529419 169.002319 C 224.999999 165.000001 235.105895 160.762757 236.622498 160.537354 C 236.622497 160.537354 244.579776 144.624146 244.579776 144.624146 Z" fill="rgb(140, 200, 246)" id="rosette"/>
+    <path d="M 232.944378 192.304563 L 226.682617 303.302063 L 277.389053 200.3587 L 284.649978 89.5703125 L 232.944378 192.304563 Z M 232.289215 281.968558 L 272.904208 199.563458 L 237.312925 193.069439 L 232.289215 281.968558 Z" fill="white" fill-rule="evenodd" id="needle"/>
+</svg>
diff --git a/Websites/webkit.org/wp-content/themes/webkit/includes.php b/Websites/webkit.org/wp-content/themes/webkit/includes.php
new file mode 100644 (file)
index 0000000..eb66862
--- /dev/null
@@ -0,0 +1,49 @@
+<?php
+/**
+ * Template Name: Included Page
+ **/
+?>
+<?php get_header(); ?>
+
+       <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
+        
+        <?php
+            
+        $path = dirname(ABSPATH);
+        $file = get_post_meta(get_the_ID(), 'include-markdown', true);
+
+        $cachekey = "cached_include_" . $file;
+
+        if ( false === ( $content = get_transient($cachekey) ) ) {
+            ob_start();
+            include $path . '/' . $file;
+            $content = ob_get_clean();
+        
+            $Markdown = WPCom_Markdown::get_instance();
+            $content = wp_unslash( $Markdown->transform($content) );
+            $content = table_of_contents_index($content, get_the_ID());
+            
+            set_transient($cachekey, $content, DAY_IN_SECONDS);
+        }
+        
+        ?>
+
+        <article class="page<?php if ( has_table_of_contents() ) echo ' with-toc';?>" id="post-<?php the_ID(); ?>">
+                
+                       <h1><a href="<?php echo get_permalink() ?>" rel="bookmark" title="Permanent Link: <?php the_title(); ?>"><?php the_title(); ?></a></h1>
+            
+                       <div class="bodycopy">
+            <?php table_of_contents(); ?>
+            <?php
+                echo apply_filters('the_content', $content);
+            ?>
+                       </div>
+        </article>
+
+       <?php //comments_template(); ?>
+
+       <?php endwhile; else:
+        include('444.php');
+       endif; ?>
+
+<?php get_footer(); ?>
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/themes/webkit/index.php b/Websites/webkit.org/wp-content/themes/webkit/index.php
new file mode 100644 (file)
index 0000000..9034dab
--- /dev/null
@@ -0,0 +1,35 @@
+<?php get_header(); ?>
+
+
+               <?php if ( have_posts() ) : ?>
+            <div id="posts" class="tiles">
+                       <?php 
+            
+            $count = 1;
+            while ( have_posts() ) : the_post();
+                               get_template_part( 'loop', get_post_format() );
+                $offset = $count++ % 3;
+                       endwhile; 
+            
+            if ( $offset > 0 ) {
+                for ($offset; $offset < 3; $offset++)
+                    echo "<div class=\"tile third-tile spacer\"></div>";
+            }
+            
+            ?>
+        </div>
+
+        <?php 
+            the_posts_pagination( array(
+                'prev_text'          => __( 'Previous page' ),
+                'next_text'          => __( 'Next page' ),
+                'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Page' ) . ' </span>',
+            ) );
+
+               else :
+                       get_template_part( 'loop', 'none' );
+
+               endif;
+               ?>
+
+<?php get_footer(); ?>
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/themes/webkit/loop.php b/Websites/webkit.org/wp-content/themes/webkit/loop.php
new file mode 100644 (file)
index 0000000..2ace3c4
--- /dev/null
@@ -0,0 +1,25 @@
+<?php
+    
+$background_image = '';
+if ( $post_thumbnail_id = get_post_thumbnail_id() ) {
+    $post_thumbnail_url = wp_get_attachment_url( $post_thumbnail_id );
+    // $background_image = " style=\"background-image: url('" . $post_thumbnail_url . "')\"";
+    $background_image = " data-url=\"" . $post_thumbnail_url . "\"";
+}
+
+
+$classes = array('tile', 'third-tile');
+$classes[] = 'third-tile';
+?>
+    <div <?php echo post_class(join(' ', $classes)); ?>>
+        <a class="tile-link" href="<?php the_permalink(); ?>">Clickable link</a>
+        <div class="background-image">
+            <div class="featured-image"<?php echo $background_image; ?>></div>
+            <?php if ( $featured ): ?><div class="background-vignette"></div><?php endif; ?>
+        </div>
+        <div class="tile-content">
+            <h1><?php the_title(); ?></h1>
+            <div class="summary"><?php the_excerpt(); ?></div>
+            <p><a href="<?php the_permalink(); ?>">Read more &rsaquo;</a></p>
+        </div>        
+    </div>
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/themes/webkit/nightly.php b/Websites/webkit.org/wp-content/themes/webkit/nightly.php
new file mode 100644 (file)
index 0000000..40c7b51
--- /dev/null
@@ -0,0 +1,145 @@
+<?php
+/**
+ * Template Name: Nightly Downloads
+ **/
+
+define('WEBKIT_NIGHTLY_ARCHIVE_URL', "http://nightly.webkit.org/builds/trunk/%s/all");
+
+function get_nightly_build() {
+    return get_nightly_download_details('mac');
+}
+
+function get_nightly_source() {
+    return get_nightly_download_details('src');
+}
+
+function get_nightly_download_details( $type = 'mac' ) {
+    $types = array('mac', 'src');
+    if ( ! in_array($type, $types) ) 
+        $type = $types[0];
+    
+    $cachekey = 'nightly_download_' . $type;
+    if ( false !== ( $cached = get_transient($cachekey) ) )
+        return json_decode($cached);
+       
+    $url = sprintf(WEBKIT_NIGHTLY_ARCHIVE_URL, $type);
+    $resource = fopen($url, 'r');
+    $rawdata = fread($resource, 128);
+    list($data,) = explode("\n", $rawdata);
+    fclose($resource);
+    
+    if ( ! empty($data) ) {
+        $record = explode(',', $data);
+        set_transient($cachekey, json_encode($record), DAY_IN_SECONDS);
+        return $record;
+       }
+    
+    return false;
+    
+}
+
+add_filter('the_content', function ($content) {
+        
+    $build = get_nightly_build();
+    $source = get_nightly_source();
+    
+    $content = sprintf($content, 
+                        
+        $build[0], 
+        date(get_option( 'date_format' ), $build[1]),
+        $build[2],
+    
+        $source[0],
+        date(get_option( 'date_format' ), $source[1]),
+        $source[2]
+                            
+    );
+    
+    return $content;
+});
+
+get_header();
+?>
+<style>
+body {
+    background: #333333;
+}
+
+.page-color {
+    /*background: #333333;*/
+    background: linear-gradient(black, #333333 66%);
+}
+
+#nightly {
+    margin: 6rem auto;
+    text-align: center;
+}
+
+#nightly h1 {
+    text-align: center;
+    margin-bottom: 0;
+}
+
+#nightly h1 a {
+    color: #ffffff;
+    font-weight: 100;
+    font-size: 9rem;
+    line-height: 9rem;
+}
+
+#nightly p {
+    text-align: center;
+    color: #D39E23;
+}
+
+#nightly blockquote:first-child {
+    color: #ffffff;
+    text-align: center;
+    font-size: 3rem;
+    line-height: 4.2rem;
+    font-weight: 200;
+}
+
+#nightly img {
+    width: 33%;
+}
+
+#nightly blockquote:first-child p {
+    color: #FFD15E;
+}
+
+#nightly a {
+    color: #edd291;
+}
+
+#nightly a:hover {
+    color: #ffffff;
+}
+
+#nightly a.download {
+    color: #ffffff;
+    font-size: 3rem;
+}
+
+.page-template-nightly hr {
+    border-color: #999;
+}
+.page-template-nightly #footer-nav a {
+    color: #999;
+}
+</style>
+
+       <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
+
+        <article class="page" id="nightly">
+                       <h1><a href="<?php echo get_permalink() ?>" rel="bookmark" title="Permanent Link: <?php the_title(); ?>"><?php the_title(); ?></a></h1>
+            
+                       <div class="bodycopy">
+                               <?php the_content(''); ?>
+                       </div>
+            
+        </article>
+
+       <?php endwhile; endif; ?>
+
+<?php get_footer(); ?>
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/themes/webkit/page.php b/Websites/webkit.org/wp-content/themes/webkit/page.php
new file mode 100644 (file)
index 0000000..e6da1b3
--- /dev/null
@@ -0,0 +1,26 @@
+<?php get_header(); ?>
+
+       <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
+
+        <article class="page<?php if ( has_table_of_contents() ) echo ' with-toc';?>" id="post-<?php the_ID(); ?>">
+                
+                       <h1><a href="<?php echo get_permalink() ?>" rel="bookmark" title="Permanent Link: <?php the_title(); ?>"><?php the_title(); ?></a></h1>
+            
+                       <div class="bodycopy">
+                <?php table_of_contents(); ?>
+                               
+                <?php the_content('<p class="serif">Read the rest of this entry &gt;&gt;</p>'); ?>
+
+                               <?php link_pages('<p><strong>Pages:</strong> ', '</p>', 'number'); ?>
+
+                       </div>
+        </article>
+
+       <?php //comments_template(); ?>
+
+       <?php endwhile; else:
+        include('444.php');
+       endif; ?>
+
+
+<?php get_footer(); ?>
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/themes/webkit/scripts/global.js b/Websites/webkit.org/wp-content/themes/webkit/scripts/global.js
new file mode 100644 (file)
index 0000000..2dc6ea8
--- /dev/null
@@ -0,0 +1,96 @@
+document.addEventListener('DOMContentLoaded', function () {
+    var openClass = ' open-menu',
+        menuClass = 'menu-item-has-children',
+        menus = document.querySelectorAll('#site-nav > div > .menu > .menu-item'),
+        menuLinks = document.querySelectorAll('#site-nav > div > .menu > .menu-item > a'),
+        menuitems = document.querySelectorAll('#site-nav .menu-item-has-children .menu-item > a');
+
+    function findParentMenu (element, className) {
+        while ( (element = element.parentElement) && ! element.classList.contains(className) );
+        return element;
+    }
+
+    for (var i = 0; i < menuLinks.length; ++i) {
+        menuLinks[i].addEventListener('focus', function (e) {
+            var openMenus = findParentMenu(e.target, 'menu').getElementsByClassName(openClass.trim());
+            for (var m = 0; m < openMenus.length; ++m) {
+                openMenus[m].className = openMenus[m].className.replace(openClass, "");
+            }
+        });
+    }
+
+    for (var i = 0; i < menuitems.length; ++i) {
+        menuitems[i].addEventListener('focus', function (e) {
+            var targetMenu = findParentMenu(findParentMenu(e.target, menuClass), menuClass),
+                targetMenuClass = targetMenu.className;
+
+            for (var m = 0; m < menus.length; ++m) {
+                menus[m].className.replace(openClass, "");
+                if (menus[m] == targetMenu) {
+                    if (targetMenuClass.indexOf(openClass) == -1) {
+                        targetMenu.className += openClass;
+                    }
+                } else {
+                    menus[m].className = menus[m].className.replace(openClass, "");
+                }
+            }
+        });
+    }
+
+
+    var latest = [], updating = false;
+    function inView(element) {
+        var box = element.getBoundingClientRect();
+        return ( (box.top >= 0 && box.left >= 0 && box.top) <= (window.innerHeight || document.documentElement.clientHeight));
+    }
+
+    function stageImage(element, src) {
+        element.style.backgroundImage = 'url(' + src + ')';
+        if (!element.parentElement.classList.contains('loaded'))
+            element.parentElement.classList.add('loaded');
+    }
+
+    function loadImage(element) {
+        var src = element.getAttribute('data-url');
+
+        if (sessionStorage.getItem(src)) {
+            setTimeout(function () { stageImage(element, src); }, 1);
+        } else {
+            var img = new Image();
+            img.src = src;
+            img.onload = function() {
+                stageImage(element,src);
+
+                try {
+                    sessionStorage.setItem(src, true);
+                } catch (error) {
+                    return false; // private browsing
+                }
+                img = undefined;
+            }
+        }
+
+    }
+
+    function onMovement() {
+        if (!updating)
+            requestAnimationFrame(update);
+        updating = true;
+    }
+
+    function update() {
+        updating = false;
+
+        for (var i = 0; i < imgs.length; i++) {
+            if ( inView(imgs[i]) )
+                loadImage(imgs[i]);
+        }
+
+    }
+
+    var imgs = document.querySelectorAll('div[data-url]');
+    document.addEventListener('scroll', onMovement);
+    document.addEventListener('resize', onMovement);
+    update();
+
+});
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/themes/webkit/single.php b/Websites/webkit.org/wp-content/themes/webkit/single.php
new file mode 100644 (file)
index 0000000..bcf852c
--- /dev/null
@@ -0,0 +1,33 @@
+<?php get_header(); ?>
+
+       <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
+
+        <article <?php echo post_class(); ?> id="post-<?php the_ID(); ?>">
+                       <h1><a href="<?php echo get_permalink() ?>" rel="bookmark" title="Permanent Link: <?php the_title(); ?>"><?php the_title(); ?></a></h1>
+            <div class="byline">
+                <p class="date"><?php the_time('M j, Y')?></p>
+                <p class="author">by <span><?php the_author() ?></span></p>
+                <?php if ( '' !== ( $twitter_handle = get_the_author_meta('twitter') ) ): ?>
+                <p class="twitter"><a href="https://twitter.com/intent/user?screen_name=<?php echo get_the_author_meta('twitter'); ?>" target="_blank">@<?php echo esc_html($twitter_handle); ?></a></p>
+                <?php endif; ?>
+            </div>
+            
+                       <div class="bodycopy">
+                               <?php the_content('<p class="serif">Read the rest of this entry &gt;&gt;</p>'); ?>
+
+                               <?php link_pages('<p><strong>Pages:</strong> ', '</p>', 'number'); ?>
+                       </div>
+        </article>
+        
+        <nav class="navigation pagination" aria-label="Next/Last posts">
+            <?php previous_post_link('%link', 'Older Post <span>%title</span>'); ?>
+            <?php next_post_link('%link', 'Newer Post <span>%title</span>'); ?>
+        </nav>
+
+       <?php //comments_template(); // No comments ?>
+
+       <?php endwhile; else:
+        include('444.php');
+       endif; ?>
+
+<?php get_footer(); ?>
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/themes/webkit/sitemap.php b/Websites/webkit.org/wp-content/themes/webkit/sitemap.php
new file mode 100644 (file)
index 0000000..72cc4c1
--- /dev/null
@@ -0,0 +1,87 @@
+<?php
+/**
+ * Template Name: Site Map
+ **/
+?>
+<?php get_header(); ?>
+
+       <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
+        <style>
+        article .menu a {
+            color: #444444;
+            text-decoration: none;
+        }
+
+        article .menu a:hover {
+            color: #08c;
+        }   
+        
+        article .menu,
+        article .menu ul {
+            list-style: none;
+        }
+        
+        article .menu,
+        article .sub-menu {
+            padding-left: 0;
+        }
+
+        article .sub-menu li {
+            display: inline-block;
+            vertical-align: top;
+            width: 32%;
+            box-sizing: border-box;
+        }
+        
+        article .sub-menu {
+            padding-right: 1rem;
+        }
+        
+        /* Top headings */
+        article .menu > .menu-item-has-children > a {
+            display: block;
+            margin-top: 3rem;
+            font-size: 3.2rem;
+            line-height: 1.14286;
+            font-weight: 200;
+            letter-spacing: -0.01em;
+            padding-bottom: 1rem;
+            border-bottom: 1px solid #dddddd;
+            margin-bottom: 1rem;
+        }
+        
+        /* Sub-section headings */
+        article .sub-menu > .menu-item-has-children > a {
+            display: block;
+            font-weight: 600;
+            margin-top: 2rem;
+            margin-bottom: 1rem;
+        }
+  
+        article .sub-menu .sub-menu li {
+            display: block;
+            width: 100%;
+            margin-bottom: 0.5rem;
+        }
+        
+        @media only screen and (max-width: 676px) {
+            article .sub-menu li {
+                width: 100%;
+            }
+        
+        }
+        </style>
+        <article class="page sitemap" id="post-<?php the_ID(); ?>">
+                
+                       <h1><a href="<?php echo get_permalink() ?>" rel="bookmark" title="Permanent Link: <?php the_title(); ?>"><?php the_title(); ?></a></h1>
+            
+                       <div class="bodycopy">
+            <?php wp_nav_menu( array('theme_location'  => 'sitemap') ); ?>
+                       </div>
+        </article>
+
+       <?php endwhile; else:
+        include('444.php');
+       endif; ?>
+
+<?php get_footer(); ?>
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/themes/webkit/status.php b/Websites/webkit.org/wp-content/themes/webkit/status.php
new file mode 100644 (file)
index 0000000..b20ff1f
--- /dev/null
@@ -0,0 +1,732 @@
+<?php
+/**
+ * Template Name: Status Page
+ **/
+?>
+<?php get_header(); ?>
+<script>
+function xhrPromise(url) {
+    return new Promise(function(resolve, reject) {
+        var xhrRequest = new XMLHttpRequest();
+        xhrRequest.open('GET', url, true);
+        xhrRequest.responseType = "json";
+
+        xhrRequest.onload = function() {
+            if (xhrRequest.status == 200) {
+                if (xhrRequest.response) {
+                    resolve(xhrRequest.response);
+                } else {
+                    reject({ request: xhrRequest, url:url});
+                }
+            } else {
+                reject({ request: xhrRequest, url:url});
+            }
+        };
+        xhrRequest.onerror = function() {
+            reject({ request: xhrRequest, url:url});
+        };
+        xhrRequest.send();
+    });
+}
+var origin = new URL("https://svn.webkit.org/");
+var loadJavaScriptCoreFeatures = xhrPromise(new URL("/repository/webkit/trunk/Source/JavaScriptCore/features.json", origin));
+var loadWebCoreFeatures = xhrPromise(new URL("/repository/webkit/trunk/Source/WebCore/features.json", origin));
+</script>
+
+<style>
+.page {
+    display: -webkit-flex;
+    display: flex;
+    -webkit-flex-wrap: wrap;
+    flex-wrap: wrap;
+    -webkit-justify-content: space-between;
+    justify-content: space-between;
+    box-sizing: border-box;
+    width: 100%;
+}
+
+.page h1 {
+    font-size: 4.2rem;
+    font-weight: 200;
+    line-height: 6rem;
+    color: black;
+    text-align: left;
+    margin: 3rem auto;
+    width: 100%;
+}
+
+.page h1 a {
+    color: #444444;
+}
+
+.page h2 {
+    font-weight: 200;
+    font-size: 3rem;
+}
+
+.page h3 {
+    font-weight: 400;
+    font-size: 2.5rem;
+}
+
+.page p {
+    margin-bottom: 3rem;
+}
+
+#feature-list {
+    display: inline-block;
+    width: 66%;
+    word-wrap: break-word;
+}
+
+/* Hide the internal links on search since they are unlikely to work. */
+#search:required:valid + *  .internal-reference {
+    display: none;
+}
+
+.feature-header {
+    display: -webkit-flex;
+    display: flex;
+    -webkit-flex-direction: row;
+    flex-direction: row;
+}
+.feature-header > h3:first-of-type {
+    -webkit-flex-grow: 1;
+    flex-grow: 1;
+    margin: 0;
+}
+
+ul.features {
+    padding: 0;
+}
+
+.features .feature {
+    position: relative;
+    display: block;
+    background-color: #f9f9f9;
+    border: 1px solid #dddddd;
+    border-radius: 3px;
+    padding: 1em;
+    margin: 1em 0 !important;
+    max-height: intrinsic;  
+    min-height: 3rem;          
+    overflow-y: hidden;
+    cursor: pointer;
+    -webkit-transition: background-color 0.3s ease-in;
+    -moz-transition: background-color 0.3s ease-in;
+    transition: background-color 0.3s ease-in;
+}
+
+.features .feature:hover {
+    background-color: white;
+}
+
+.feature.opened {
+    background-color: white;
+    max-height: 120rem;
+}
+
+.feature-description + *,
+.feature-description .feature-desc,
+.feature-description .comment {
+    height: 0;
+    opacity: 0;
+    margin: 0;
+}
+
+.feature.opened .feature-description + *,
+.feature.opened .feature-desc,
+.feature.opened .feature-description .comment {
+    opacity: 1;
+    height: auto;
+    margin-bottom: 3rem;
+}
+
+.feature.opened .feature-description + *:last-child {
+    margin-bottom: 0;
+}
+
+.sub-features {
+    font-size: 1.5rem;
+    color: #555;
+}
+
+.sub-features ul {
+    list-style: none;
+    display: inline-block;
+    padding: 0;
+    margin: 0;
+}
+
+.sub-features li {
+    display: inline;
+}
+
+.sub-features li:after {
+    content: ", ";
+}
+
+.sub-features li:last-child:after {
+    content: "";
+}
+
+.feature-header {
+    position: relative;
+    padding-right: 3rem;
+}
+
+.feature-header h3 .internal-reference a {
+    color: #999999;
+    text-decoration: none;
+    padding-left: 0.5em;
+}
+
+.feature-header h3 .internal-reference a:hover {
+    color: inherit;
+    text-decoration: underline;
+}
+
+.feature.is-hidden {
+    display: none;
+}
+
+ul.feature-details {
+    margin: 0;
+}
+.feature-statusItem {
+    margin-right: 0.5em;
+}
+
+.feature-status {
+    font-size: 2rem;
+    display: inline-block;
+    position: relative;
+    min-width: 4em;
+    text-align: right; 
+}
+
+.feature-status,
+.feature-status a {
+    color: #999999;
+}
+
+.feature .status-marker {
+    width: 0;
+    height: 0;
+    position: absolute;
+    top: 0;
+    left: 0;
+    border-style: solid;
+    border-width: 20px 20px 0 0;
+    border-color: transparent transparent transparent transparent;
+}
+
+#status-filters .done,
+.feature-status.done,
+.feature-status.done a {
+    color: #339900;
+}
+
+.status-marker.done {
+    border-color: #339900 transparent transparent transparent;
+}
+
+#status-filters .in-development,
+.feature-status.in-development,
+.feature-status.in-development a {
+    color: #f46c0e;
+}
+
+.status-marker.in-development {
+    border-color: #f46c0e transparent transparent transparent;
+}
+
+#status-filters .no-active-development,
+.feature-status.no-active-development,
+.feature-status.no-active-development a {
+    color: #5858D6;
+}
+
+.status-marker.no-active-development {
+    border-color: #5858D6 transparent transparent transparent;
+}
+
+#status-filters .partial-support,
+.feature-status.partial-support,
+.feature-status.partial-support a {
+    color: #548c8c;
+}
+
+.status-marker.partial-support {
+    border-color: #548c8c transparent transparent transparent;
+}
+
+#status-filters .prototyping,
+.feature-status.prototyping,
+.feature-status.prototyping a {
+    color: #007AFF;
+}
+
+.status-marker.prototyping {
+    border-color: #007AFF transparent transparent transparent;
+}
+
+
+.feature-status.removed,
+.feature-status.removed a {
+    color: #999999;
+}
+
+.status-marker.removed {
+    border-color: #999999 transparent transparent transparent;
+}
+
+
+
+
+.feature-filters {
+    position: relative;
+    top: 0;
+    display: inline-block;
+
+    width: -webkit-calc(33.33% - 3rem);
+    width: -moz-calc(33.33% - 3rem);
+    width: calc(33.33% - 3rem);
+    margin-right: 3rem;
+    font-size: 2rem;
+}
+
+#search {
+    font-size: 2rem;
+    padding: 1rem;
+    border-radius: 3px;
+    border: 1px solid #cccccc;
+    width: 100%;
+    margin-top: 1.5rem;
+    box-sizing: border-box;
+}
+
+.feature-filters ul {
+    margin-top: 3rem;
+}
+
+.feature-filters ul li {
+    margin-bottom: 1rem;
+}
+
+.feature-filters label > input {
+    position: relative;
+    top: -3px;
+}
+
+@media only screen and (max-width: 508px) {
+    #feature-filters,
+    #feature-list {
+        width: 100%;
+    }
+    
+    #feature-filters {
+        border: 1px solid #dddddd;
+        border-radius: 3px;
+        background: #f6f6f6;
+        padding: 1rem;
+        box-sizing: border-box;
+        margin-right: 0;
+        margin-bottom: 3rem;
+    }
+    
+}
+
+</style>
+       <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
+
+        <div class="page feature-status-page" id="post-<?php the_ID(); ?>">
+            <?php echo str_repeat('&nbsp;', 200);?>
+                       <h1><a href="<?php echo get_permalink() ?>" rel="bookmark" title="Permanent Link: <?php the_title(); ?>"><?php the_title(); ?></a></h1>
+            <form id="feature-filters" class="feature-filters">
+                <h2>Filters</h2>
+                <input type="text" id="search" placeholder="Search filter&hellip;" title="Filter the feature list." required>
+                <ul id="status-filters">
+                </ul>
+                
+            </form>
+
+            <div id="feature-list">
+            <h2>Features</h2>
+            </div>
+
+            <template id="success-template">
+                <ul class="features" id="features-container"></ul>
+                <p>Cannot find something? You can contact <a href="https://twitter.com/webkit">@webkit</a> on Twitter or contact the <a href="https://lists.webkit.org/mailman/listinfo/webkit-help">webkit-help</a> mailing list for questions.</p>
+                <p>You can also <a href="coding/contributing.html">contribute to features</a> directly, the entire project is Open Source. To report bugs on existing features or check existing bug reports, see <a href="https://bugs.webkit.org">https://bugs.webkit.org</a>.</p>
+            </template>
+            <template id="error-template">
+                <p>Error: unable to load the features list (<span id="error-message"></span>).</p>
+                <p>If this is not resolved soon, please contact <a href="https://twitter.com/webkit">@webkit</a> on Twitter or the <a href="https://lists.webkit.org/mailman/listinfo/webkit-help">webkit-help</a> mailing list.</p>
+            </template>
+        </div>
+
+       <?php //comments_template(); ?>
+
+       <?php endwhile; else: ?>
+
+               <p>No posts.</p>
+
+       <?php endif; ?>
+
+
+<script>
+function initializeStatusPage() {
+    
+    function sortAlphabetically(array) {
+        array.sort(function(a, b){
+            var aName = a.name.toLowerCase();
+            var bName = b.name.toLowerCase();
+
+            var nameCompareResult = aName.localeCompare(bName);
+            
+            if ( nameCompareResult )
+                return nameCompareResult;
+
+            // Status sort
+            var aStatus = a.status != undefined ? a.status.status.toLowerCase() : '';
+            var bStatus = b.status != undefined ? b.status.status.toLowerCase() : '';
+
+            return aStatus.localeCompare(bStatus);
+        });
+    }
+
+    function createFeatureView(featureObject) {
+        function createLinkWithHeading(elementName, heading, linkText, linkUrl) {
+            var container = document.createElement(elementName);
+            if (heading) {
+                container.textContent = heading + ": ";
+            }
+            var link = document.createElement("a");
+            link.textContent = linkText;
+            link.href = linkUrl;
+            container.appendChild(link);
+            return container;
+        }
+
+        function makeTwitterLink(twitterHandle) {
+            if (twitterHandle[0] == "@")
+                twitterHandle = twitterHandle.substring(1);
+            return "https://twitter.com/" + twitterHandle;
+        }
+
+        var container = document.createElement('li');
+        var hasDocumentationLink = "documentation-url" in featureObject;
+        var hasReferenceLink = "url" in featureObject;
+        var hasContactObject = "contact" in featureObject;
+        var hasSpecificationObject = "specification" in featureObject;
+        
+        container.addEventListener('click', function (e) {
+            if ( container.className.indexOf('opened') !== -1 ) {
+                container.className = container.className.replace(' opened','');
+            } else container.className += " opened";
+        });
+        
+        container.className = "feature";
+
+        if ("features" in featureObject) {
+            container.setAttribute("id", "specification-" + featureObject.name);
+        } else {
+            container.setAttribute("id", "feature-" + featureObject.name);
+        }
+
+        var cornerStatus = document.createElement('div');
+        cornerStatus.className = "status-marker ";
+        container.appendChild(cornerStatus);
+        
+        var descriptionContainer = document.createElement('div');
+        descriptionContainer.className = "feature-description";
+
+        var featureHeaderContainer = document.createElement('div');
+        featureHeaderContainer.className = "feature-header";
+        descriptionContainer.appendChild(featureHeaderContainer);
+
+        var titleElement = document.createElement("h3");
+        titleElement.textContent = featureObject.name;
+
+        // Add sub-feature here
+        if (hasSpecificationObject) {
+            var specification = featureObject.specification;
+            var specSpan = createLinkWithHeading("span", null, specification.name, ("#specification-" + specification.name));
+            specSpan.className = "internal-reference";
+            titleElement.appendChild(specSpan);
+        }
+        featureHeaderContainer.appendChild(titleElement);
+
+        if ("status" in featureObject) {
+            var statusContainer = document.createElement("span");
+            cornerStatus.className += statusClassName = featureObject.status.status.toLowerCase().replace(/ /g, '-');
+            statusContainer.className = "feature-status " + statusClassName;
+            if ("webkit-url" in featureObject) {
+                var statusLink = document.createElement("a");
+                statusLink.href = featureObject["webkit-url"];
+                statusLink.textContent = featureObject.status.status;
+                statusContainer.appendChild(statusLink);
+            } else {
+                statusContainer.textContent = featureObject.status.status;
+            }
+
+            featureHeaderContainer.appendChild(statusContainer);
+        }
+
+        if ("description" in featureObject) {
+            var testDescription = document.createElement('p');
+            testDescription.className = "feature-desc";
+            testDescription.innerHTML = featureObject.description;
+            descriptionContainer.appendChild(testDescription);
+        }
+
+        if ("comment" in featureObject) {
+            if ("description" in featureObject) {
+                var hr = document.createElement("hr");
+                hr.className = 'comment';
+                descriptionContainer.appendChild(hr);
+            }
+            var comment = document.createElement('p');
+            comment.className = 'comment';
+            comment.innerHTML = featureObject.comment;
+            descriptionContainer.appendChild(comment);
+        }
+
+        container.appendChild(descriptionContainer);
+
+        if (hasDocumentationLink || hasReferenceLink || hasContactObject) {
+            var moreInfoList = document.createElement("ul");
+            if (hasDocumentationLink) {
+                var url = featureObject["documentation-url"];
+                moreInfoList.appendChild(createLinkWithHeading("li", "Documentation", url, url));
+            }
+
+            if (hasReferenceLink) {
+                var url = featureObject.url;
+                moreInfoList.appendChild(createLinkWithHeading("li", "Reference", url, url));
+            }
+
+            if (hasSpecificationObject) {
+                var specification = featureObject.specification;
+                var li = createLinkWithHeading("li", "Parent feature", specification.name, ("#specification-" + specification.name));
+                li.className = "internal-reference";
+                moreInfoList.appendChild(li);
+            }
+
+            if (hasContactObject) {
+                var li = document.createElement("li");
+                li.textContent = "Contact: ";
+                if (featureObject.contact.twitter) {
+                    li.appendChild(createLinkWithHeading("span", null, featureObject.contact.twitter, makeTwitterLink(featureObject.contact.twitter)));
+                }
+                if (featureObject.contact.email) {
+                    if (featureObject.contact.twitter) {
+                        li.appendChild(document.createTextNode(" - "));
+                    }
+                    var emailText = featureObject.contact.email;
+                    if (featureObject.contact.name) {
+                        emailText = featureObject.contact.name;
+                    }
+                    li.appendChild(createLinkWithHeading("span", null, emailText, "mailto:" + featureObject.contact.email));
+                }
+                moreInfoList.appendChild(li);
+            }
+
+            container.appendChild(moreInfoList);
+        }
+
+        if ("features" in featureObject && featureObject.features.length) {
+            var internalLinkContainer = document.createElement("div");
+            internalLinkContainer.className = "internal-reference sub-features";
+            internalLinkContainer.textContent = "Includes: "
+            // internalLinkContainer.appendChild(trackedFeatures);
+
+            var list = document.createElement("ul");
+            for (var feature of featureObject.features) {
+                var link = document.createElement("a");
+                link.textContent = feature.name;
+                link.href = "#feature-" + feature.name;
+
+                var li = document.createElement("li");
+                li.appendChild(link);
+                list.appendChild(li);
+            }
+            internalLinkContainer.appendChild(list);
+            container.appendChild(internalLinkContainer);
+        }
+
+        return container;
+    }
+
+    function renderFeaturesAndSpecifications(featureLikeObjects) {
+        var featureContainer = document.getElementById('features-container');
+        for (var featureLikeObject of featureLikeObjects) {
+            featureContainer.appendChild(createFeatureView(featureLikeObject));
+        }
+    }
+
+    function initSearch(featuresArray) {
+        var filtersForm = document.getElementById('feature-filters');
+        var statusContainer = document.getElementById('status-filters');
+        var inputField = document.getElementById('search');
+        var featuresEls = document.querySelectorAll('.features > li');
+        var statusFilters = {};
+        
+        featuresArray.forEach(function(feature, i) {
+            feature.el = featuresEls[i];
+            feature.visible = true;
+            
+            if (feature.status != undefined) {
+                featureStatusKey = feature.status.status.toLocaleLowerCase();
+
+                if (!statusFilters[featureStatusKey])
+                    statusFilters[featureStatusKey] = feature.status.status;
+
+            }
+        });
+        
+        var statusLength = statusFilters.length;
+        
+        for (var key in statusFilters) {
+            var status = statusFilters[key];
+            var entry = document.createElement("li");
+            var label = document.createElement("label");
+            var input = document.createElement("input");
+            input.setAttribute('type','checkbox');
+            input.setAttribute('value', key);
+            input.addEventListener('change', search);
+            label.appendChild(input);
+            label.className = status.toLocaleLowerCase().replace(/ /g, '-');
+            label.appendChild(document.createTextNode(" " + status));
+            entry.appendChild(label);
+            statusContainer.appendChild(entry);
+        }
+                
+        filtersForm.addEventListener('click', function (e) {
+            if ( filtersForm.className.indexOf('opened') !== -1 ) {
+                filtersForm.className = filtersForm.className.replace(' opened','');
+            } else filtersForm.className += " opened";
+        });
+
+        inputField.addEventListener('input', search);
+        
+        var inputs = [].slice.call(filtersForm.getElementsByTagName('input'));
+        inputs.forEach(function (input,i) {
+            input.addEventListener('click', function (e) {
+                e.stopPropagation();
+            });
+        });
+
+        function search(ev) {
+            var searchTerm = inputField.value.trim().toLowerCase();
+            var activeStatusFilters = [];
+            var checkboxes = [].slice.call(statusContainer.getElementsByTagName('input'));
+            checkboxes.forEach(function(checkbox,i) {
+                if ( checkbox.checked )
+                    activeStatusFilters.push(checkbox.value);
+            });
+
+            searchFeatures(featuresArray, searchTerm, activeStatusFilters);
+        }
+    }
+
+    function searchFeatures(featuresArray, searchTerm, statusFilters) {
+        featuresArray.forEach(function(feature) {
+            var visible = isSearchMatch(feature, searchTerm) && isStatusFiltered(feature, statusFilters);
+            
+            if (visible && !feature.visible) {
+                feature.el.className = 'feature';
+            } else if (!visible && feature.visible) {
+                feature.el.className = 'feature is-hidden';
+            }
+            
+            feature.visible = visible;
+        });
+    }
+
+    function isSearchMatch(feature, searchTerm) {
+        if (feature.name.toLowerCase().indexOf(searchTerm) !== -1)
+            return true;
+        if ("keywords" in feature) {
+            for (var keyword of feature.keywords) {
+                if (keyword.toLowerCase().indexOf(searchTerm) !== -1)
+                    return true;
+            }
+        }
+        return false;
+    }
+
+    function isStatusFiltered(feature, activeFilters) {
+        if (activeFilters.length == 0)
+            return true;
+        if (feature.status === undefined) 
+            return false;
+        if (activeFilters.indexOf(feature.status.status.toLowerCase()) != -1)
+            return true;
+        
+        return false;
+    }
+
+    function displayFeatures(results) {
+        var mainContent = document.getElementById("feature-list");
+        var successSubtree = document.importNode(document.getElementById("success-template").content, true);
+        mainContent.appendChild(successSubtree);
+
+        var allSpecifications = [];
+        for (var i in results) {
+            allSpecifications = allSpecifications.concat(results[i].specification);
+        }
+        var specificationsByName = {}
+        for (var specification of allSpecifications) {
+            specification.features = [];
+            specification.isSpecification = true;
+            specificationsByName[specification.name] = specification;
+        }
+
+        var allFeatures = [];
+        for (var i in results) {
+            allFeatures = allFeatures.concat(results[i].features);
+        }
+        var featuresByName = {};
+        for (var feature of allFeatures) {
+            if ('specification' in feature) {
+                var specificationObject = specificationsByName[feature.specification];
+                specificationObject.features.push(feature);
+                feature.specification = specificationObject;
+            }
+            feature.isSpecification = false;
+            featuresByName[feature.name] = feature;
+        }
+
+        var everythingToShow = allFeatures.concat(allSpecifications);
+        
+        sortAlphabetically(everythingToShow);
+        renderFeaturesAndSpecifications(everythingToShow);
+        initSearch(everythingToShow);
+    }
+
+    function displayError(error) {
+        var mainContent = document.getElementById("feature-list");
+        var successSubtree = document.importNode(document.getElementById("error-template").content, true);
+
+        var errorMessage = "Unable to load " + error.url;
+
+        if (error.request.status !== 200) {
+            errorMessage += ", status: " + error.request.status + " - " + error.request.statusText;
+        } else if (!error.response) {
+            errorMessage += ", the JSON file cannot be processed.";
+        }
+
+        successSubtree.querySelector("#error-message").textContent = errorMessage;
+
+        mainContent.appendChild(successSubtree);
+    }
+
+    Promise.all([loadJavaScriptCoreFeatures, loadWebCoreFeatures]).then(displayFeatures).catch(displayError);
+}
+
+document.addEventListener("DOMContentLoaded", initializeStatusPage);
+</script>
+
+<?php get_footer(); ?>
\ No newline at end of file
diff --git a/Websites/webkit.org/wp-content/themes/webkit/style.css b/Websites/webkit.org/wp-content/themes/webkit/style.css
new file mode 100644 (file)
index 0000000..918d1d2
--- /dev/null
@@ -0,0 +1,1867 @@
+/*
+Theme Name: WebKit
+Theme URI: http://webkit.org/
+Author: The WebKit Team
+Author URI: http://webkit.org/
+Description: Modern, adaptive theme for the WebKit project.
+Version: 1.0
+*/
+
+/** Resets **/
+html, body, div, span, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, img, ins, kbd, q, samp,
+small, strike, strong, sub, sup, tt, var,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details,
+figure, figcaption, footer, header, hgroup,
+menu, nav, output, section, summary,
+time, mark, audio, video {
+       margin: 0;
+       padding: 0;
+       border: 0;
+       font: inherit;
+       vertical-align: baseline;
+}
+/* HTML5 display-role reset for older browsers */
+article, aside, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section {
+       display: block;
+}
+html {
+    font-family: "Myriad Set Pro","Helvetica Neue",sans-serif;
+    font-size: 62.5%;
+    font-synthesis: none;
+}
+body {
+    background-color: #f7f7f7;
+    font-size: 1.6rem;
+    font-weight: 400;
+       line-height: 1.4;
+}
+ol, ul {
+       list-style: none;
+}
+blockquote, q {
+       quotes: none;
+}
+blockquote:before, blockquote:after,
+q:before, q:after {
+       content: '';
+       content: none;
+}
+table {
+       border-collapse: collapse;
+       border-spacing: 0;
+}
+p:empty {
+    display: none;
+}
+a {
+    color: #08c;
+    text-decoration: none;
+    transition: color 500ms cubic-bezier(0.190, 1.000, 0.220, 1.000); /* ease-out-exponential */
+}
+a:hover {
+    text-decoration: underline;
+}
+a > code {
+    color: #08c;
+}
+
+h1 a:hover {
+    text-decoration: none;
+}
+hr {
+    border: none;
+    border-bottom: 1px solid #ddd;
+}
+strong {
+    font-weight: 700;
+}
+em {
+    font-weight: 200;
+}
+code {
+    font-family: Menlo, monospace;
+    background: #f2f2f2;
+    border-radius: 2px;
+    border: 1px solid #e7e7e7;
+    padding: 0 0.5rem;
+    font-size: 80%;
+    color: #444;
+}
+
+/** Form Elements **/
+body, input, textarea, select, button {
+    font-synthesis: none;
+    text-rendering: optimizeLegibility;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+    -moz-font-feature-settings: 'liga', 'kern';
+}
+
+/** Accessibility Helpers **/
+a[name] {
+    display: block;
+    position: relative;
+    top: -3rem;
+    visibility: hidden;
+}
+
+.admin-bar a[name] {
+    top: calc(-32px - 3rem);
+}
+
+.screen-reader-text {
+       clip: rect(1px, 1px, 1px, 1px);
+       position: absolute !important;
+       height: 1px;
+       width: 1px;
+       overflow: hidden;
+}
+
+.screen-reader-text:focus {
+       background-color: #f1f1f1;
+       border-radius: 3px;
+       box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6);
+       clip: auto !important;
+       color: #21759b;
+       display: block;
+       font-size: 14px;
+       font-size: 0.875rem;
+       font-weight: bold;
+       height: auto;
+       left: 5px;
+       line-height: normal;
+       padding: 15px 23px 14px;
+       text-decoration: none;
+       top: 5px;
+       width: auto;
+       z-index: 100000; /* Above WP toolbar. */
+}
+
+
+/** Page Layout **/
+.page-width {
+    max-width: 1140px;
+    margin: 0 auto;
+}
+
+/** Header **/
+header {
+    background: #f9f9f9;
+    border-bottom: 1px solid #e7e7e7;
+    overflow: visible;
+    width: 100vw;
+    max-width: 100%;
+    padding-top: 2rem;
+    margin: 0;
+    position: relative;
+    z-index: 500;
+}
+
+@supports ( -webkit-backdrop-filter: blur(10px) ) {
+    header {
+        backdrop-filter: blur(10px);
+        -webkit-backdrop-filter: blur(10px);
+        background: rgba(255,255,255,0.8);
+    }
+}
+
+a.download {
+    background: url('images/download.svg') right no-repeat;
+    padding-right: 4rem;
+}
+
+/** Pagination **/
+.pagination {
+    text-align: center;
+    margin: 3rem auto;
+    font-weight: bold;
+}
+
+.pagination .page-numbers {
+    display: inline-block;
+    padding: 0.5rem 1rem 0.3rem;
+    background: white;
+    border-radius: 3px;
+}
+
+.pagination .page-numbers:not(.current, .dots):hover {
+    text-decoration: none;
+    background: #08c;
+    color: white;
+}
+
+.pagination .dots,
+.pagination .page-numbers.current {
+    background: none;
+}
+
+.pagination .prev-post,
+.pagination .next-post {
+    min-width: 25%;
+}
+
+.pagination .prev-post {
+    text-align: right;
+}
+
+.pagination .next-post {
+    text-align: left;
+}
+
+.pagination .prev-post span,
+.pagination .next-post span {
+    display: block;
+    font-size: 1.4rem;
+    font-weight: normal;
+}
+
+/* Front page next button */
+.pagination .next-button {
+    display: inline-block;
+    line-height: 3rem;
+    box-sizing: border-box;
+    width: -webkit-calc(33.33% - 10px);
+    width: -moz-calc(33.33% - 10px);
+    width: calc(33.33% - 10px);
+}
+
+/** Footer **/
+footer {
+    content: "";
+    display: table;
+    clear: both;
+    width: 100%;
+    padding-bottom: 3rem;
+    box-sizing: border-box;
+}
+
+footer .menu {
+    font-size: 1.3rem;
+}
+
+/** Tiles **/
+.tiles {
+    font-size: 0;
+    display: -webkit-flex;
+    display: flex;
+    -webkit-flex-wrap: wrap;
+    flex-wrap: wrap;
+    -webkit-justify-content: space-between;
+    justify-content: space-between;
+    box-sizing: border-box;
+    width: 100%;
+    margin-top: 3rem;
+}
+
+.tile {
+    background: white;
+    display: inline-block;
+    margin: 0 0 15px;
+    position: relative;
+    vertical-align: top;
+    box-sizing: border-box;
+    min-height: 450px;
+    overflow: hidden;
+    box-shadow: inset rgba(0, 0, 0, 0.1) 0 0 0 1px;
+}
+
+.tile.spacer {
+    background: none;
+    box-shadow: none;
+}
+
+.tile-link,
+.tile-link:hover {
+    text-decoration: none;
+    display: block;
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    font-size: 0;
+    z-index: 1;
+}
+
+.third-tile {
+    width: -webkit-calc(33.33% - 10px);
+    width: -moz-calc(33.33% - 10px);
+    width: calc(33.33% - 10px);
+}
+
+.two-thirds-tile {
+    width: -webkit-calc(66.66% - 5px);
+    width: -moz-calc(66.66% - 5px);
+    width: calc(66.66% - 5px);
+}
+
+.featured-tile {
+    padding: 0;
+    /*border: 1px solid #e7e7e7;*/
+}
+
+.tile .background-image {
+    position: relative;
+    margin-top: -1px;
+    height: 0;
+    padding-bottom: 80%;
+    overflow: hidden;
+
+    background-size: cover;
+    background-position: 50% 1%;
+    background-color: #8E8E93;
+    background-repeat: no-repeat;
+    background-image: url('images/icons.svg');
+}
+
+.tile .background-image.has-featured-image {
+    -webkit-transition: -webkit-filter 10s ease-in;
+    transition: filter 1s ease-in;
+    -webkit-filter: saturate(0);
+            filter: saturate(0);
+}
+
+.tile:not(.has-post-thumbnail) .featured-image {
+    display: none;
+}
+
+.tile.category-web-inspector .background-image {
+    background-color: #08c;
+    background-position-y: 10.75%;
+}
+
+.tile.category-performance .background-image {
+    background-color: rgb(152, 188, 77);
+    background-position-y: 20.5%;
+}
+
+.tile.category-javascript .background-image {
+    background-color: #997FA6;
+    background-position-y: 30.5%;
+}
+
+.tile.category-css .background-image {
+    background-color: #bf6d71;
+    background-position-y: 40.4%;
+}
+
+.tile.category-standards .background-image {
+    background-color: #BF7600;
+    background-position-y: 50.4%;
+}
+
+.tile.category-contributing .background-image {
+    background-color: #CBAA44;
+    background-position-y: 59.8%;
+}
+
+.tile.category-storage .background-image {
+    background-color: #997FA6;
+    background-position-y: 69.6%;
+}
+
+.tile.category-layout .background-image {
+    background-color: #bf6d71;
+    background-position-y: 79.45%;
+}
+
+.tile.tag-console .background-image,
+.tile.tag-debugger .background-image,
+.tile.tag-shortcuts .background-image,
+.tile.tag-timeline .background-image {
+     background-image: url('images/inspector.svg');
+}
+
+.tile.tag-console .background-image {
+    background-position-y: 3%;
+}
+
+.tile.tag-debugger .background-image {
+    background-position-y: 34%;
+}
+
+.tile.tag-shortcuts .background-image {
+    background-position-y: 66%;
+}
+
+.tile.tag-timeline .background-image {
+    background-position-y: 97%;
+}
+
+.tile .background-image.loaded {
+    background: none;
+    -webkit-filter: saturate(1);
+            filter: saturate(1);
+    
+}
+
+.tile .featured-image::before {
+    padding-bottom: 80%;
+    content: '';
+    display: block;
+}
+
+.tile .featured-image {
+    position: relative;
+    max-height: 450px;
+    background-size: cover;
+    background-position: 50% 50%;
+
+    opacity: 0;
+    -webkit-transition: opacity 0.4s ease-in;
+    -moz-transition: opacity 0.4s ease-in;
+    transition: opacity 0.4s ease-in;
+}
+
+.tile .featured-image,
+.tile:not(.has-post-thumbnail) .background-image,
+.tile .loaded .featured-image {
+    box-shadow: inset rgba(0, 0, 0, 0.1) 0 1px 0 1px;
+}
+
+.has-post-thumbnail .background-image {
+    filter: saturate(0);
+    -webkit-filter: saturate(0);
+    opacity: 0.1;    
+}
+
+.has-post-thumbnail .background-image.loaded,
+.tile .background-image.loaded .featured-image {
+    opacity: 1;
+}
+
+.featured-tile .background-image {
+    padding-bottom: 60%;
+    margin-bottom: 0;
+}
+
+.tile .tile-content {
+    font-size: 1.6rem;
+    line-height: 3rem;
+    max-width: 100%;
+    box-sizing: border-box;
+    padding: 2rem;
+}
+
+.featured-tile .tile-content {
+    padding: 0 24px;
+    box-sizing: border-box;
+    position: absolute;
+    -webkit-transform: none;
+    transform: none;
+    bottom: 15px;
+    top: auto;
+}
+
+.background-vignette {
+    width: 100%;
+    padding-bottom: 60%;
+    position: absolute;
+    top:0;
+    background-image: linear-gradient(-180deg, rgba(255, 255, 255, 0) , rgba(255, 255, 255, 0.95) 80%, rgba(255, 255, 255, 1));
+}
+
+.tag-window .background-image {
+    background-color: #f2f2f2;
+}
+
+.tag-window .background-vignette {
+    background-image: linear-gradient(-180deg, rgba(242,242,242,0) 25%,rgba(242,242,242,1) 65%);
+}
+
+.featured-tile.tag-dark.tile {
+    background: black;
+}
+
+.featured-tile.tag-dark .background-vignette {
+    background-image: linear-gradient(-180deg, rgba(0,0,0,0) 33%,rgba(0,0,0,0.85));
+}
+
+.featured-tile.tag-dark .tile-content {
+    color: white;
+}
+
+.featured-tile.tag-dark .tile-content a {
+    color: #6cf;
+}
+
+.tile-content p {
+    margin: 0;
+}
+
+.tile h1 {
+    font-size: 3rem;
+    line-height: 4rem;
+    font-weight: 200;
+    text-align: left;
+}
+.tile h2 {
+    font-size: 3rem;
+    line-height: 4rem;
+    font-weight: 400;
+    text-align: inherit;
+}
+
+.icon-tile {
+    text-align: center;
+    font-size: 2rem;
+}
+
+.icon-tile h2 + p {
+    font-weight: 200;
+    margin-bottom: 1rem;
+}
+
+.icon-tile .icon {
+    position: relative;
+    background: url('images/compass.svg') no-repeat;
+    background-position: 50% 50%;
+    margin: 0 auto 3rem;
+    padding: 40%;
+    color: #fff;
+}
+
+.icon-tile.download .icon {
+    background-image: url('images/download.svg');
+}
+
+.icon-tile.developer .icon {
+    background-image: url('images/developer.svg');
+}
+
+.icon-tile, .icon-tile a {
+    color: white;
+}
+.amber-tile {
+    background-color: #FFCC00;
+}
+.gray-tile, .gray-tile a {
+    color: #017BFD;
+}
+
+.gray-tile {
+    background: linear-gradient(rgb(40, 40, 40), rgb(74, 74, 74));
+}
+.gray-tile, .gray-tile a {
+    color: #fff;
+}
+
+.amber-tile {
+    background-color: #FFCC00;
+}
+.blue-tile {
+    background-color: #08c;
+}
+
+.twitter-tile {
+    background-color: #34AADC;
+}
+
+.twitter-tile, .twitter-tile a {
+    color: white;
+}
+
+.tile-content a {
+    position: relative;
+    z-index: 200;
+}
+
+.twitter-tile .tile-content {
+    position: relative;
+    box-sizing: border-box;
+    font-size: 2rem;
+}
+
+.twitter-tile.text-only {
+    display: -webkit-flex;
+    display: flex;
+    justify-content: center;
+}
+
+.twitter-tile.text-only .tile-content {
+    font-size: 2.5rem;
+    font-weight: 400;
+    line-height: 3rem;
+    align-self: center;
+}
+
+.twitter-tile img {
+    width: 100%;
+    height: auto;
+    max-height: 256px;
+}
+
+.twitter-controls {
+    padding: 0 1.5rem;
+    box-sizing: border-box;
+    width: 100%;
+    font-size: 1.5rem;
+    line-height: 3rem;
+    text-align: center;
+    font-weight: 600;
+    position: absolute;
+    left: 0;
+    bottom: 15px;
+    z-index: 200;
+    display: -webkit-flex;
+    display: flex;
+    -webkit-flex-wrap: wrap;
+    flex-wrap: wrap;
+    -webkit-justify-content: space-between;
+    justify-content: space-between;
+}
+
+.twitter-controls li {
+    display: inline-block;
+    margin: 0 1.3rem;
+}
+.twitter-controls a {
+    opacity: 0.66;
+    transition: opacity 300ms ease-out;
+}
+.twitter-controls a:hover {
+    opacity: 1;
+    text-decoration: none;
+}
+
+/** Twitter Icons **/
+
+.twitter-icon {
+    background: url('images/twitter.svg') no-repeat;
+    background-size: cover;
+}
+
+.icon.twitter-icon {
+    position: relative;
+    margin: 3rem auto 3rem;
+    width: 1px;
+    padding: 33%;
+    color: #ffffff;
+    opacity: 0.33;
+}
+
+.twitter-tile h2 {
+    text-align: center;
+}
+
+.twitter-controls .twitter-icon {
+    text-indent: -9999em;
+    display: inline-block;
+    width: 2.5rem;
+    height: 2.5rem;
+}
+
+.twitter-icon.reply-icon {
+    background-position-y: 33%;
+}
+
+.twitter-icon.retweet-icon {
+    background-position-y: 66%;
+}
+
+.twitter-icon.favorite-icon {
+    background-position-y: 99%;
+}
+
+/** Code Syntax Highlighting **/
+pre {
+    width: calc(100% + 6rem);
+       overflow: auto;
+    -webkit-overflow-scrolling: touch;
+    background: #f2f2f2;
+       border: 1px solid #E6E6E6;
+       border-radius: 3px;
+
+    box-sizing: border-box;
+    padding: 3rem;
+    margin-left: -3rem;
+}
+
+code {
+    color: #555555;
+       font-size: 1.6rem;
+    line-height: 2.5rem;
+}
+
+pre code {
+    border: none;
+    padding: 0;
+}
+
+code .keyword,
+code.html .tag { color: #708; }
+code .keyword.builtin,
+code .keyword.literal { color: #aa0d91;}
+code .keyword.type { color: #cb4b16; }
+code .preprocessor { color: #996; }
+code .comment { color: #93a1a1; float: none; display: inline; }
+code .comment .doc { color: #839496; font-weight: bold; }
+code .identifier { color: #1C63A8; }
+code .string, code .char { color: #5B6E04; }
+code .escaped { color: #AAA; }
+code .number, code .tag { color: #586e75; }
+code .regex, code .attribute { color: rgb(131, 108, 40); }
+code .attribute.value { color: rgb(196, 26, 22) ;}
+code .operator { color: #888; }
+code .keyword.operator { color: #A90007; }
+code .whitespace { background: #333; }
+code .error { border-bottom: 1px solid red; }
+code .doctype { color: rgb(192, 192, 192); }
+code .property { color: #881391; }
+
+code.xml .comment,
+code.html .comment { color: rgb(0, 116, 0); }
+
+code.xml .preprocessor .keyword { color: #996; }
+code.xml .meta, code.xml .meta .keyword { color: #399; }
+
+code.cpp .preprocessor .identifier { color: #996; }
+
+code::-moz-selection, code span::-moz-selection {
+    background: #A3CDFE;
+}
+
+code::selection, code span::selection {
+    background: #A3CDFE;
+}
+
+code.syntax { white-space: normal; }
+code.syntax .newlines { white-space: pre; display: block; }
+
+code.css .attribute,
+code.css .identifier,
+code.css .preprocessor { color: rgb(170, 13, 145); }
+
+code.css .keyword { color: black; }
+code.css .number { color: rgb(28, 0, 207); }
+
+/** Post Typography **/
+article h1 {
+    font-size: 5.2rem;
+    line-height: 1.0625;
+    font-weight: 200;
+    letter-spacing: -0.02em;
+    text-align: center;
+    color: #037DFD;
+    margin: 5rem auto 3rem;
+}
+
+article h1 a {
+    color: #444444;
+    text-decoration: none;
+}
+
+article h2 {
+    font-size: 4.2rem;
+    line-height: 1.08654;
+    font-weight: 200;
+    letter-spacing: -0.014em;
+    margin: 4rem 0 1rem;
+}
+
+article h3 {
+    font-size: 3.2rem;
+    line-height: 1.14286;
+    font-weight: 200;
+    letter-spacing: -0.01em;
+}
+
+article h4 {
+    font-size: 2.2rem;
+    line-height: 1.125;
+    font-weight: 200;
+}
+
+article h5 {
+    font-size: 2rem;
+    line-height: 1.5;
+    font-weight: 600;
+}
+
+article h6 {
+    font-size: 2rem;
+    line-height: 1.5;
+    font-weight: 600;
+    font-size: 2rem;
+}
+
+article h3,
+article h4,
+article h5,
+article h6 {
+    margin-bottom: 0.5rem;
+}
+
+article h2 + h3,
+article h3 + h4,
+article h4 + h5,
+article h5 + h6 {
+    margin-top: 3rem;
+}
+
+article p,
+article div > img,
+article pre,
+article hr {
+    margin-bottom: 3rem;
+}
+
+article .byline p {
+    font-size: 1.5rem;
+    line-height: 3rem;
+    margin-bottom: 0;
+    color: #8E8E93;
+}
+
+article .byline .date {
+    font-weight: 900;
+}
+
+article .byline .author {
+    white-space: nowrap;
+
+}
+
+article .bodycopy {
+    font-size: 2rem;
+    line-height: 3rem;
+}
+
+article table {
+    font-size: 1.6rem;
+    border-collapse: collapse;
+    border-spacing: 0;
+    margin: 3rem 0;
+    width: 100%;
+}
+
+article thead, article tfoot {
+    border-top: 1px solid #bbbbbb;
+    border-bottom: 1px solid #e0e0e0;
+}
+
+article tr {
+    border-top: 1px solid #e0e0e0;
+}
+
+article tr:first-child {
+    border-top: 0 none;
+}
+
+article th {
+    font-weight: bold;
+    vertical-align: bottom;
+    text-align: left;
+
+}
+article td, th {
+    padding: 1.754386%;
+}
+article th:first-child {
+    padding-left: 0;
+}
+
+article ol,
+article ul {
+    padding-left: 3rem;
+    margin: 3rem 0;
+}
+
+article ol {
+    list-style-type: decimal;
+}
+
+article ul {
+    list-style-type: square;
+}
+
+article ul ul,
+article ul ol,
+article ol ul,
+article ol ol {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+article blockquote {
+    width: 100vw;
+    height: auto;
+    padding: 0 3rem;
+    left: 50%;
+    position: relative;
+    margin-left: -50vw;
+    box-sizing: border-box;
+    font-weight: 200;
+    font-size: 3rem;
+    line-height: 4.2rem;
+    text-align: center;
+    color: #555555;
+}
+article blockquote > * {
+    max-width: 1140px;
+    margin-left: auto;
+    margin-right: auto;
+}
+
+article blockquote:first-child {
+    width: 100%;
+    text-align: left;
+    margin: 0 auto;
+    left: 0;
+    padding: 0;
+}
+
+.post .bodycopy > p:last-child:after {
+    content: " \220E"; /* Tombstone */
+    color: #666666;
+}
+
+article div.note {
+    margin-left: -3rem;
+    margin-right: -3rem;
+    padding: 3rem;
+    background-color: hsl(50, 100%, 94%);
+    border: 1px solid hsl(40, 100%, 90%);
+    color: hsl(30, 90%, 35%);
+    border-radius: 3px;
+    margin-bottom: 3rem;
+    box-sizing: normal;
+}
+
+article .two-columns {
+    columns: 2;
+    column-gap: 6rem;
+    margin: 3rem 0;
+}
+
+article .two-columns h2,
+article .two-columns h3,
+article .two-columns h4,
+article .two-columns h5,
+article .two-columns h6 {
+    break-after: avoid-column; /* https://bugs.webkit.org/show_bug.cgi?id=148814 */
+}
+
+article .two-columns p {
+    break-inside: avoid-column;
+}
+
+/** Post Layout **/
+
+article .byline {
+    float: left;
+    width: 191px;
+    text-align: right;
+    padding-right: 3rem;
+    box-sizing: border-box;
+}
+
+article .bodycopy {
+    width: 66%;
+    margin: 0 auto;
+    position: relative;
+}
+
+article .aligncenter .wp-caption-text {
+    right: -50%;
+}
+
+article .alignleft {
+    float: left;
+    margin: 1.5rem 1.5rem 1.5rem 0;
+}
+
+article .aligncenter {
+    clear: both;
+    display: block;
+    margin: 0 auto 3rem;
+}
+
+article div.aligncenter {
+    position: relative;
+    float: right;
+    right: 50%;
+}
+
+article div.aligncenter img {
+    position: relative;
+    right: -50%;
+}
+
+article .alignright {
+    float: right;
+    margin: 1.5rem 0 1.5rem 1.5rem;
+}
+
+article .alignnone {
+    display: block;
+    float: none;
+}
+
+article .alignnone.size-full {
+    width: 100vw;
+    height: auto;
+    left: 50%;
+    position: relative;
+    -webkit-transform: translate(-50vw, 0);
+    transform: translate(-50vw, 0);
+}
+
+article .pull-left {
+    float: left;
+    margin: 1.5rem 1.5rem 1.5rem -25%;
+}
+
+article .pull-right {
+    float: right;
+    margin: 1.5rem -25% 1.5rem 1.5rem;
+}
+
+article .cliptop {
+    border-top: 1px solid #dddddd;
+}
+
+article .clipbottom {
+    border-bottom: 1px solid #dddddd;
+}
+
+article .clipright {
+    border-right: 1px solid #dddddd;
+}
+
+article .clipleft {
+    border-left: 1px solid #dddddd;
+}
+
+article .mattewhite {
+    background: white;
+    border-top: 1px solid #e7e7e7;
+    border-bottom: 1px solid #e7e7e7;
+    padding-top: 3rem;
+    padding-bottom: 3rem;
+}
+
+/** Article Figures **/
+
+article figure {
+    margin-bottom: 3rem;
+    text-align: center;
+}
+article figure > img {
+    display: inline-block;
+    max-width: 100%;
+}
+
+figure.widescreen {
+    position: relative;
+    width: 100vw;
+    left: 50%;
+    transform: translate(-50%);
+}
+
+figure.widescreen img,
+figure.widescreen figcaption {
+    display: block;
+    margin: 0 auto;
+}
+
+figure.widescreen img {
+    max-width: 100%;
+    height: auto;
+}
+
+figure.widescreen figcaption {
+    margin-top: 3rem;
+}
+
+figure.widescreen video {
+    max-height: 420px;
+    max-width: 66%;
+}
+
+article figcaption {
+    text-align: left;
+    margin-top: 1.5rem;
+    max-width: 970px;
+    padding-left: 1.5rem;
+    box-sizing: border-box;
+    font-size: 1.5rem;
+    font-style: italic;
+    color: #8E8E93;
+    position: relative;
+}
+
+article figcaption::before {
+    left: 1.5rem;
+    width: 10%;
+    height: 100%;
+    bottom: 1rem;
+    border-top: 1px solid #cccccc;
+    content: '';
+    opacity: 1;
+    display: inline-block;
+    box-sizing: border-box;
+    position: absolute;
+}
+
+article .clipbottom + p + figcaption {
+    margin-top: 1rem;
+}
+
+article .clipbottom + p + figcaption::before {
+    width: 0;
+}
+
+/** Page Layout **/
+article.page h1 {
+    text-align: left;
+    width: 66%;
+}
+
+.page .bodycopy h1 {
+    width: 100%;
+}
+
+/** Load Effects **/
+
+@keyframes fade-in {
+    from {
+        opacity: 0;
+    }
+
+    to {
+        opacity: 1;
+    }
+}
+
+@-webkit-keyframes fade-in {
+    from {
+        opacity: 0;
+    }
+
+    to {
+        opacity: 1;
+    }
+}
+
+@keyframes fade-in-move-down {
+    from {
+        opacity: 0;
+        -webkit-transform: translateY(-3rem);
+        transform: translateY(-3rem)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateY(0);
+        transform: translateY(0)
+    }
+}
+
+@-webkit-keyframes fade-in-move-down {
+    from {
+        opacity: 0;
+        -webkit-transform: translateY(-3rem);
+        transform: translateY(-3rem)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateY(0);
+        transform: translateY(0)
+    }
+}
+
+article,
+.feature-status-page {
+    -webkit-animation: fade-in-move-down 0.7s;
+    animation: fade-in-move-down 0.7s;
+}
+
+.tile {
+    -webkit-animation: fade-in 0.4s;
+    animation: fade-in 0.4s;
+}
+
+/** Page Table of Contents **/
+
+.table-of-contents {
+    float: right;
+    box-sizing: border-box;
+    padding: 3rem;
+    margin: 0 0 3rem 3rem;
+
+    width: 252px;
+    background: #ffffff;
+    z-index: 5;
+    
+}
+
+.table-of-contents ul {
+    margin: 0;
+    list-style: none;
+    font-size: 1.6rem;
+    line-height: 2rem;
+    padding-left: 2rem;
+    padding-right: 0;
+}
+
+.table-of-contents .list > ul {
+    padding-left: 0;
+}
+
+.table-of-contents ul li {
+    margin-bottom: 1rem;
+}
+
+.table-of-contents ul li:last-child {
+    margin-bottom: 0;
+}
+
+.table-of-contents ul li > ul {
+    margin-top: 1rem;
+}
+
+.with-toc pre:nth-child(-n+6),
+#post-4132 pre:nth-child(-n+8) {
+    width: 55%;
+    z-index: -1;
+}
+
+/** Logo **/
+.site-logo {
+    float: left;
+    font-size: 4.2rem;
+    line-height: 4.2rem;
+    font-weight: 200;
+    display: inline-block;
+    background: url('images/webkit.svg') no-repeat;
+    padding-left: 7rem;
+    color: #333;
+}
+
+.site-logo .tagline {
+    display: block;
+    font-size: 1.8rem;
+    line-height: 2rem;
+    letter-spacing: -0.05rem;
+    color: #666;
+}
+
+.hero .logo {
+    background-image: url('images/webkit.svg');
+}
+
+/** Status Page **/
+
+.feature-header:after {
+    display: inline-block;
+    content: "";
+    background: url('images/menu-down.svg') no-repeat 50%;
+    background-size: 2rem;
+    width: 2rem;
+    height: 2rem;
+    position: absolute;
+    right: 0;
+    top: 0.5rem;
+    -webkit-transition: transform 0.3s ease-out;
+    -moz-transition: transform 0.3s ease-out;
+    transition: transform 0.3s ease-out;
+}
+
+.feature.opened .feature-header:after {
+       -webkit-transform: rotateX(-180deg);
+       -moz-transform: rotateX(-180deg);
+       transform: rotateX(-180deg);
+    perspective: 600;
+}
+
+/** Navigation **/
+
+.label-toggle {
+    cursor: pointer;
+}
+
+header nav {
+    text-align: right;
+}
+
+/* Hide menu toggle checkboxes */
+input.menu-toggle {
+    visibility: hidden;
+    position: absolute;
+    top: 0;
+    left: 0;
+}
+
+footer nav {
+    padding: 3rem 0;
+}
+
+header nav li {
+    display: inline-block;
+    padding: 2.5rem 0 1.5rem 3rem;
+}
+
+footer nav li {
+    display: inline-block;
+    position: relative;
+    padding: 0 0 1.5rem 3rem;
+}
+
+footer nav li:first-child {
+    padding-left: 0;
+}
+
+header nav a,
+footer nav a {
+    position: relative;
+    display: inline-block;
+    text-decoration: none;
+    color: #333;
+    cursor: pointer;
+}
+
+header nav a:hover,
+footer nav a:hover {
+    color: #08c;
+    text-decoration: none;
+}
+
+header nav .menu-item-has-children .label-toggle {
+    background: url('images/menu-down.svg') right 0.7rem no-repeat;
+    background-size: 1rem;
+    display: inline-block;
+    padding-right: 1.5rem;
+}
+
+header nav .menu-item { /* add bottom dimension to main menu items */
+    padding-bottom: 3rem;
+}
+
+/* Improves mouse accessibility of menus */
+header .menu > .menu-item-has-children:hover > a::before {
+    position: absolute;
+    content: '';
+    width: 100%;
+    height: 100%;
+    padding: 0rem 10rem 1rem 0;
+    top: 2rem;
+    right: -3rem;
+}
+
+.sub-menu-layer {
+    text-align: center;
+    padding: 3rem;
+    box-sizing: border-box;
+
+    width: 210px;
+    margin-left: -110px;
+    
+    position: absolute;
+    top: 7rem;    
+    
+    background: rgba(255,255,255,0.95);
+    box-shadow: 0px 3px 20px 0px rgba(0, 0, 0, 0.10);
+    border: 1px solid #e7e7e7;
+    border-radius: 5px;
+
+    -webkit-transition: opacity 0.6s, top 0.6s;
+    -moz-transition: opacity 0.6s, top 0.6s;
+    transition: opacity 0.6s, top 0.6s;
+    opacity: 0;
+}
+
+.sub-menu-layer:after, .sub-menu-layer:before {
+    bottom: 100%;
+    left: 71%;
+    border: solid transparent;
+    content: " ";
+    height: 0;
+    width: 0;
+    position: absolute;
+    pointer-events: none;
+}
+
+.sub-menu-layer:after {
+    border-bottom-color: rgba(255,255,255,0.9);
+    border-width: 10px;
+    margin-left: -10px;
+}
+
+.sub-menu-layer:before {
+    border-bottom-color: #e7e7e7;
+    border-width: 11px;
+    margin-left: -11px;
+}
+
+.sub-menu-layer .menu-item {
+    padding: 1.5rem 0 0 0;
+    width: 100%;    
+}
+
+.sub-menu-layer .menu-item:first-child {
+    padding: 0;
+}
+
+.menu > .menu-item > a:focus ~ .sub-menu,
+.menu > .menu-item.open-menu> .sub-menu,
+.menu > .menu-item:hover > .sub-menu,
+.menu > .menu-item > .menu-toggle:checked ~ .sub-menu {
+    display: block;
+    box-sizing: border-box;
+    z-index: 1;
+    opacity: 1;
+    top: 8rem;    
+}
+
+/** Screen Breakpoints **/
+
+@media only screen and (max-width: 1180px) {
+    
+    .page-width {
+        max-width: 1140px;
+        padding-left: 2rem;
+        padding-right: 2rem;
+    }
+
+    article .byline {
+        width: 60%;
+        margin: 0 auto;
+        float: none;
+        text-align: center;
+        margin-bottom: 3rem;
+    }
+
+    article .byline p {
+        display: inline;
+    }
+
+}
+
+@media only screen and (max-width: 1000px) {
+
+    article.page h1 {
+        width: 90%;
+        margin-bottom: 3rem;
+    }
+    
+    article .byline {
+        width: 60%;
+        margin: 0 auto;
+        float: none;
+        text-align: center;
+        margin-bottom: 3rem;
+    }
+
+    article .byline p {
+        display: inline;
+    }
+
+    article .bodycopy {
+        width: 90%;
+    }
+
+}
+
+@media only screen and (max-width: 920px) {
+    
+    header nav .main-menu.label-toggle {
+        display: inline-block;
+        margin: 1.5rem 0 2.5rem;
+        height: 3rem;
+        width: 3rem;
+        background: url('images/menu-down.svg') no-repeat 50%;
+        cursor: pointer;
+    }
+
+    header .menu {
+        display: none;
+        position: absolute;
+        left: 0;
+        margin-top: 1px;
+        padding-top: 3rem;
+        text-align: left;
+        width: 100vw;
+        overflow: hidden;
+        box-shadow: 0px 5px 5px rgba(0,0,0,0.10);
+        backdrop-filter: blur(10px);
+        -webkit-backdrop-filter: blur(10px);
+        background: rgba(255,255,255,0.8);
+    }
+
+    header nav .menu-toggle:checked ~ ul {
+        display: block;
+        opacity: 1;
+    }
+
+    header .menu-main-menu-container >  ul > li {
+        width: 100vw;
+        position: relative;
+        padding: 0 3rem 3rem;
+        box-sizing: border-box;
+        -webkit-transition: opacity 0.6s;
+        -moz-transition: opacity 0.6s;
+        transition: opacity 0.6s;
+    }
+
+    header .menu > .menu-item > .sub-menu {
+        box-shadow: none;
+        border-bottom: 1px solid #e7e7e7;
+    }
+
+    header .menu > .menu-item-has-children {
+        margin-left: 0;
+    }
+
+    header .sub-menu-layer {
+        text-align: left;
+        width: 100vw;
+        left: 50%;
+        margin-left: -50vw;
+        border-radius: 0;
+        border-left: none;
+        border-right: none;
+        opacity: 0;
+        -webkit-transition: opacity 0.6s;
+        -moz-transition: opacity 0.6s;
+        transition: opacity 0.6s;
+    }
+    
+    header .sub-menu-layer:after, .sub-menu-layer:before {
+        bottom: 100%;
+        left: 71%;
+        border: solid transparent;
+        content: " ";
+        height: 0;
+        width: 0;
+        position: absolute;
+        pointer-events: none;
+    }
+
+    header .sub-menu-layer:after {
+        border: none;
+        margin-left: -10px;
+    }
+    
+    header .sub-menu-layer:before {
+        border: none;
+        margin-left: -11px;
+    }
+    
+    header .menu-toggle:checked ~ .sub-menu {
+        text-align: left;
+    }
+
+    header .menu > .menu-item:hover > .sub-menu,
+    header .menu > .menu-item > .menu-toggle:checked ~ .sub-menu {
+        position: relative;
+        top: 1.5rem;
+    }
+    
+    footer nav li {
+        padding: 0 3rem 3rem 0;
+    }
+
+}
+
+@media only screen and (max-width: 782px) {
+    
+    .featured-tile {
+        padding: 0;
+    }
+
+    .tile.spacer {
+        height: 0;
+        min-height: 0;
+        margin-bottom: 0;
+    }
+
+    .page-width {
+        max-width: 100vw;
+        padding-left: 1rem;
+        padding-right: 1rem;
+        overflow: hidden;
+        box-sizing: border-box;
+    }
+
+    .tile {
+        min-height: auto;
+    }
+
+    .third-tile,
+    .two-thirds-tile {
+        width: -webkit-calc(100% - 1px);
+        width: -moz-calc(100% - 1px);
+        width: calc(100% - 1px);
+    }
+
+    .icon-tile .icon {
+        margin-top: -40%;
+    }
+
+    .with-toc pre:nth-child(-n+8),
+    article pre {
+        position: relative;
+        width: 100vw;
+        left: 50%;
+        transform: translate(-50%);
+        margin-left: 0;
+        border-radius: 0;
+        border-left: none;
+        border-right: none;
+    }
+   
+    .table-of-contents { /* hug the edge */
+        right: 0;
+    }
+    
+    .pagination .prev-post,
+    .pagination .next-post {
+        min-width: auto;
+        width: 90%;
+        text-align: right;
+    }
+    
+    .pagination .prev-post {
+        margin-bottom: 1rem;
+        text-align: left;
+    }
+
+}
+
+@media only screen and (max-width: 600px) {
+        
+    header {
+        padding-top: 1rem;
+    }
+        
+    .site-logo {
+        font-size: 4rem;
+        padding-left: 6rem;
+    }
+    
+    .site-logo .tagline {
+        font-size: 1.6rem;
+        line-height: 1;
+    }
+
+    header nav .main-menu.label-toggle {
+        margin-top: 2rem;
+        margin-bottom: 2rem;
+    }
+
+    .feature-filters {
+        height: 6rem;
+        overflow: hidden;
+    }
+
+    .feature-filters.opened {
+        height: auto;
+    }
+
+    .feature-filters:after {
+        display: inline-block;
+        content: "";
+        background: url('images/menu-down.svg') no-repeat 50%;
+        background-size: 2rem;
+        width: 2rem;
+        height: 2rem;
+        position: absolute;
+        right: 1rem;
+        top: 2rem;
+        -webkit-transition: transform 0.3s ease-out;
+        -moz-transition: transform 0.3s ease-out;
+        transition: transform 0.3s ease-out;
+        perspective: 600;
+    }
+
+    .feature-filters.opened:after {
+       -webkit-transform: rotateX(-180deg);
+       -moz-transform: rotateX(-180deg);
+       transform: rotateX(-180deg);
+    }
+    
+    #wpadminbar {
+        position: absolute;
+    }
+    
+    .table-of-contents {
+        height: 9rem;
+        overflow: hidden;
+        margin-right: -10%;
+    }
+    
+    .menu-toggle:checked ~ .table-of-contents {
+        height: auto;
+    }
+    
+    .table-of-contents label {
+        display: block;
+    }
+    
+    .table-of-contents label:after {
+        display: inline-block;
+        content: "";
+        background: url('images/menu-down.svg') no-repeat 50%;
+        background-size: 2rem;
+        width: 2rem;
+        height: 2rem;
+        position: absolute;
+        right: 3rem;
+        top: 3.5rem;
+        -webkit-transition: transform 0.3s ease-out;
+        -moz-transition: transform 0.3s ease-out;
+        transition: transform 0.3s ease-out;
+        perspective: 600;
+    }
+    
+    .menu-toggle:checked ~ .table-of-contents label:after {
+       -webkit-transform: rotateX(-180deg);
+       -moz-transform: rotateX(-180deg);
+       transform: rotateX(-180deg);
+    }
+    
+    .table-of-contents h6 {
+        margin-bottom: 3rem;
+    }
+    
+    .with-toc pre:nth-child(-n+6),
+    #post-4132 pre:nth-child(-n+8) {
+        width: 100vw;
+    }
+        
+}
+
+@media only screen and (max-width: 415px) {
+    
+    .table-of-contents { 
+        /* Go one-column */
+        width: 100vw;
+        left: 50%;
+        position: relative;
+        transform: translate(-50%);
+        float: none;
+        margin: 0 0 3rem 0;
+    }
+    
+}
+
+@media only screen and (max-height: 415px) {
+    
+    .hero .logo,
+    .hero .tagline,
+    .hero .particle {
+        display: none;
+    }
+    
+    .home .site-logo {
+        opacity: 1;
+        margin-top: 0;
+    }
+    
+    .home .hero {
+        margin: 7rem 0 0;
+    }
+    
+    .home.admin-bar .hero {
+        margin-top: 12rem;
+    }
+    
+    header,
+    .home header {
+        padding-top: 1rem;
+    }
+    
+    .home header {
+        border-bottom: 1px solid #e7e7e7;
+        background: rgba(255,255,255,0.9);
+    }
+
+    @supports ( -webkit-backdrop-filter: blur(10px) ) {
+        .home header {
+            backdrop-filter: blur(10px);
+            -webkit-backdrop-filter: blur(10px);
+            background: rgba(255,255,255,0.8);
+        }
+    }
+    
+    .tile {
+        min-height: 200px;
+        max-height: 400px;
+        overflow: hidden;
+    }
+    
+    .tile .background-image {
+        padding-bottom: 33%;
+    }
+    
+    .tile.category-performance .background-image {
+        background-position-y: 21.5%;
+    }
+
+    .tile.category-web-inspector .background-image {
+        background-position-y: 12.5%;
+    }
+    
+    .table-of-contents {
+        height: 9rem;
+        overflow: hidden;
+        margin-right: -10%;
+    }
+    
+    .menu-toggle:checked ~ .table-of-contents {
+        height: auto;
+    }
+    
+    .table-of-contents label {
+        display: block;
+    }
+    
+    .table-of-contents label:after {
+        display: inline-block;
+        content: "";
+        background: url('images/menu-down.svg') no-repeat 50%;
+        background-size: 2rem;
+        width: 2rem;
+        height: 2rem;
+        position: absolute;
+        right: 3rem;
+        top: 3.5rem;
+        -webkit-transition: transform 0.3s ease-out;
+        -moz-transition: transform 0.3s ease-out;
+        transition: transform 0.3s ease-out;
+        perspective: 600;
+    }
+    
+    .menu-toggle:checked ~ .table-of-contents label:after {
+       -webkit-transform: rotateX(-180deg);
+       -moz-transform: rotateX(-180deg);
+       transform: rotateX(-180deg);
+    }
+    
+    .table-of-contents h6 {
+        margin-bottom: 3rem;
+    }
+    
+    .with-toc pre:nth-child(-n+6),
+    #post-4132 pre:nth-child(-n+8) {
+        width: 100vw;
+    }
+    
+}
+
+@media only screen an