WebCore:
authormjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 28 Jan 2005 01:13:07 +0000 (01:13 +0000)
committermjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 28 Jan 2005 01:13:07 +0000 (01:13 +0000)
        Reviewed by Darin, Hyatt and Ken.

<rdar://problem/3790449> REGRESSION (Mail): underline behavior is flaky because of how CSS handles text-decoration

        * khtml/css/css_computedstyle.cpp:
        (DOM::CSSComputedStyleDeclarationImpl::getPropertyCSSValue): Add support
for -khtml-text-decorations-in-effect property. This works like text-docration
but follows proper inline semantics, that is, if a parent is causing text
decoration then -khtml-text-decorations-in-effect on this element will reflect that.
        * khtml/css/cssproperties.in: Add -khtml-text-decorations-in-effect property.
        * khtml/css/cssproperties.h: regenerated
        * khtml/css/cssvalues.c: regenerated
        * khtml/css/cssparser.cpp: regenerated
        * khtml/css/cssproperties.c: regenerated

        * khtml/css/css_valueimpl.h: Made copyPropertiesInSet public.

        * khtml/editing/htmlediting.cpp:
        (khtml::StyleChange::init): Handle -khtml-text-decorations-in-effect
specially, translate to text-decoration
        (khtml::ApplyStyleCommand::applyInlineStyle): Fix a comment.
        (khtml::ApplyStyleCommand::removeInlineStyle): Add new way of pushing down
text-decoration styles around the edges of the selected range.
        (khtml::ApplyStyleCommand::pushDownTextDecorationStyleAroundNode): Helper for this.
        (khtml::ApplyStyleCommand::pushDownTextDecorationStyleAtBoundaries): ditto
        (khtml::ApplyStyleCommand::nodeFullyUnselected): ditto
        (khtml::hasTextDecorationProperty): ditto
        (khtml::highestAncestorWithTextDecoration): ditto
        (khtml::ApplyStyleCommand::extractTextDecorationStyle): ditto
        (khtml::ApplyStyleCommand::extractAndNegateTextDecorationStyle): ditto
        (khtml::ApplyStyleCommand::applyTextDecorationStyle): ditto
        * khtml/editing/htmlediting.h: Prototype new methods.
        * khtml/editing/jsediting.cpp: Make underline execCommand use the new CSS property.

- as a necessary part of the fix, fixed the longstanding problem
that mutating an element's inlineStyleDecl would not property
update its style attribute. now it does.

        * khtml/css/css_valueimpl.cpp:
        (DOM::CSSMutableStyleDeclarationImpl::setChanged): If this is an inline style
declaration, tell the element it's style attribute needs updating.
        * khtml/html/html_elementimpl.cpp:
        (HTMLElementImpl::invalidateStyleAttribute): New method, just calls down
to the dom element.
        (HTMLElementImpl::updateStyleAttribute): Regenerate style attribute from
inline style declaration.
        * khtml/html/html_elementimpl.h: Prototype new stuff.
        * khtml/xml/dom_elementimpl.cpp:
        (ElementImpl::ElementImpl): Initialize new attribute.
        (ElementImpl::updateStyleAttributeIfNeeded): New method to check if the style
is dirty and this is an html element, and if so call the html element to
regenerate the style attribute.
        (ElementImpl::attributes): update style if needed
        (ElementImpl::getAttribute): ditto
        (ElementImpl::hasAttributes): ditto
        (ElementImpl::dump): ditto
        (XMLElementImpl::cloneNode): ditto
        * khtml/xml/dom_elementimpl.h:
        (DOM::ElementImpl::isStyleAttributeValid): new method to manage style attr
dirty bit
        (DOM::ElementImpl::setStyleAttributeValid): ditto

- added new layout tests for underlining:

        * layout-tests/editing/editing.js:
        * layout-tests/editing/style/remove-underline-across-paragraph-expected.txt: Added.
        * layout-tests/editing/style/remove-underline-across-paragraph-in-bold-expected.txt: Added.
        * layout-tests/editing/style/remove-underline-across-paragraph-in-bold.html: Added.
        * layout-tests/editing/style/remove-underline-across-paragraph.html: Added.
        * layout-tests/editing/style/remove-underline-after-paragraph-expected.txt: Added.
        * layout-tests/editing/style/remove-underline-after-paragraph-in-bold-expected.txt: Added.
        * layout-tests/editing/style/remove-underline-after-paragraph-in-bold.html: Added.
        * layout-tests/editing/style/remove-underline-after-paragraph.html: Added.
        * layout-tests/editing/style/remove-underline-expected.txt: Added.
        * layout-tests/editing/style/remove-underline-from-stylesheet-expected.txt: Added.
        * layout-tests/editing/style/remove-underline-from-stylesheet.html: Added.
        * layout-tests/editing/style/remove-underline-in-bold-expected.txt: Added.
        * layout-tests/editing/style/remove-underline-in-bold.html: Added.
        * layout-tests/editing/style/remove-underline.html: Added.
        * layout-tests/editing/style/underline-expected.txt: Added.
        * layout-tests/editing/style/underline.html: Added.

WebKit:

        Reviewed by Darin, Hyatt and Ken.

<rdar://problem/3790449> REGRESSION (Mail): underline behavior is flaky because of how CSS handles text-decoration

        * WebView.subproj/WebHTMLView.m:
        (-[WebHTMLView _styleFromFontAttributes:]): Use new -khtml-text-decorations-in-effect
property
        (-[WebHTMLView _styleForAttributeChange:]): likewise
        (-[WebHTMLView underline:]): likewise

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

35 files changed:
LayoutTests/editing/editing.js
LayoutTests/editing/style/remove-underline-across-paragraph-expected.txt [new file with mode: 0644]
LayoutTests/editing/style/remove-underline-across-paragraph-in-bold-expected.txt [new file with mode: 0644]
LayoutTests/editing/style/remove-underline-across-paragraph-in-bold.html [new file with mode: 0644]
LayoutTests/editing/style/remove-underline-across-paragraph.html [new file with mode: 0644]
LayoutTests/editing/style/remove-underline-after-paragraph-expected.txt [new file with mode: 0644]
LayoutTests/editing/style/remove-underline-after-paragraph-in-bold-expected.txt [new file with mode: 0644]
LayoutTests/editing/style/remove-underline-after-paragraph-in-bold.html [new file with mode: 0644]
LayoutTests/editing/style/remove-underline-after-paragraph.html [new file with mode: 0644]
LayoutTests/editing/style/remove-underline-expected.txt [new file with mode: 0644]
LayoutTests/editing/style/remove-underline-from-stylesheet-expected.txt [new file with mode: 0644]
LayoutTests/editing/style/remove-underline-from-stylesheet.html [new file with mode: 0644]
LayoutTests/editing/style/remove-underline-in-bold-expected.txt [new file with mode: 0644]
LayoutTests/editing/style/remove-underline-in-bold.html [new file with mode: 0644]
LayoutTests/editing/style/remove-underline.html [new file with mode: 0644]
LayoutTests/editing/style/underline-expected.txt [new file with mode: 0644]
LayoutTests/editing/style/underline.html [new file with mode: 0644]
WebCore/ChangeLog-2005-08-23
WebCore/khtml/css/css_computedstyle.cpp
WebCore/khtml/css/css_valueimpl.cpp
WebCore/khtml/css/css_valueimpl.h
WebCore/khtml/css/cssparser.cpp
WebCore/khtml/css/cssproperties.c
WebCore/khtml/css/cssproperties.h
WebCore/khtml/css/cssproperties.in
WebCore/khtml/css/cssvalues.c
WebCore/khtml/editing/htmlediting.cpp
WebCore/khtml/editing/htmlediting.h
WebCore/khtml/editing/jsediting.cpp
WebCore/khtml/html/html_elementimpl.cpp
WebCore/khtml/html/html_elementimpl.h
WebCore/khtml/xml/dom_elementimpl.cpp
WebCore/khtml/xml/dom_elementimpl.h
WebKit/ChangeLog
WebKit/WebView.subproj/WebHTMLView.m

index db7939ef52c7d59ee05b740c7f2066960f26e088..2494fe6a0d1650a37fa90b012b5d0ec4e7422f54 100644 (file)
@@ -204,6 +204,21 @@ function boldCommand() {
 
 //-------------------------------------------------------------------------------------------------------
 
+function execUnderlineCommand() {
+    document.execCommand("Underline");
+}
+function underlineCommand() {
+    if (commandDelay > 0) {
+        window.setTimeout(execUnderlineCommand, commandCount * commandDelay);
+        commandCount++;
+    }
+    else {
+        execUnderlineCommand();
+    }
+}
+
+//-------------------------------------------------------------------------------------------------------
+
 function execFontNameCommand() {
     document.execCommand("FontName", false, "Courier");
 }
diff --git a/LayoutTests/editing/style/remove-underline-across-paragraph-expected.txt b/LayoutTests/editing/style/remove-underline-across-paragraph-expected.txt
new file mode 100644 (file)
index 0000000..2c4e53f
--- /dev/null
@@ -0,0 +1,32 @@
+layer at (0,0) size 800x600
+  RenderCanvas at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (8,8) size 784x584
+      RenderBlock {DIV} at (0,0) size 784x84 [border: (2px solid #FF0000)]
+        RenderBlock (anonymous) at (14,14) size 756x28
+          RenderInline {SPAN} at (0,0) size 0x0
+          RenderText {TEXT} at (0,0) size 0x0
+          RenderInline {SPAN} at (0,0) size 78x28
+            RenderText {TEXT} at (0,0) size 78x28
+              text run at (0,0) width 78: "xxxxxx "
+          RenderInline {SPAN} at (0,0) size 72x28
+            RenderText {TEXT} at (78,0) size 72x28
+              text run at (78,0) width 72: "xxxxxx"
+        RenderBlock (anonymous) at (14,42) size 756x28
+          RenderBlock {P} at (0,0) size 756x28
+            RenderInline {SPAN} at (0,0) size 78x28
+              RenderText {TEXT} at (0,0) size 78x28
+                text run at (0,0) width 78: " xxxxxx"
+            RenderInline {SPAN} at (0,0) size 78x28
+              RenderText {TEXT} at (78,0) size 78x28
+                text run at (78,0) width 78: " xxxxxx"
+        RenderBlock (anonymous) at (14,70) size 756x0
+          RenderInline {SPAN} at (0,0) size 0x0
+selection is RANGE:
+start:      position 0 of child 1 {TEXT} of child 5 {SPAN} of root {DIV}
+upstream:   position 7 of child 1 {TEXT} of child 4 {SPAN} of root {DIV}
+downstream: position 0 of child 1 {TEXT} of child 5 {SPAN} of root {DIV}
+end:        position 7 of child 1 {TEXT} of child 1 {SPAN} of child 2 {P} of child 5 {SPAN} of root {DIV}
+upstream:   position 7 of child 1 {TEXT} of child 1 {SPAN} of child 2 {P} of child 5 {SPAN} of root {DIV}
+downstream: position 0 of child 1 {TEXT} of child 2 {SPAN} of child 2 {P} of child 5 {SPAN} of root {DIV}
diff --git a/LayoutTests/editing/style/remove-underline-across-paragraph-in-bold-expected.txt b/LayoutTests/editing/style/remove-underline-across-paragraph-in-bold-expected.txt
new file mode 100644 (file)
index 0000000..8b4e48a
--- /dev/null
@@ -0,0 +1,34 @@
+layer at (0,0) size 800x600
+  RenderCanvas at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (8,8) size 784x584
+      RenderBlock {DIV} at (0,0) size 784x84 [border: (2px solid #FF0000)]
+        RenderBlock (anonymous) at (14,14) size 756x28
+          RenderInline {SPAN} at (0,0) size 0x0
+          RenderText {TEXT} at (0,0) size 0x0
+          RenderInline {SPAN} at (0,0) size 150x28
+            RenderInline {B} at (0,0) size 78x28
+              RenderText {TEXT} at (0,0) size 78x28
+                text run at (0,0) width 78: "xxxxxx "
+            RenderInline {B} at (0,0) size 72x28
+              RenderText {TEXT} at (78,0) size 72x28
+                text run at (78,0) width 72: "xxxxxx"
+        RenderBlock (anonymous) at (14,42) size 756x28
+          RenderBlock {P} at (0,0) size 756x28
+            RenderInline {SPAN} at (0,0) size 78x28
+              RenderText {TEXT} at (0,0) size 78x28
+                text run at (0,0) width 78: " xxxxxx"
+            RenderInline {SPAN} at (0,0) size 78x28
+              RenderText {TEXT} at (78,0) size 78x28
+                text run at (78,0) width 78: " xxxxxx"
+        RenderBlock (anonymous) at (14,70) size 756x0
+          RenderInline {SPAN} at (0,0) size 0x0
+            RenderInline {B} at (0,0) size 0x0
+selection is RANGE:
+start:      position 0 of child 1 {TEXT} of child 2 {B} of child 4 {SPAN} of root {DIV}
+upstream:   position 7 of child 1 {TEXT} of child 1 {B} of child 4 {SPAN} of root {DIV}
+downstream: position 0 of child 1 {TEXT} of child 2 {B} of child 4 {SPAN} of root {DIV}
+end:        position 7 of child 1 {TEXT} of child 1 {SPAN} of child 2 {P} of child 2 {B} of child 4 {SPAN} of root {DIV}
+upstream:   position 7 of child 1 {TEXT} of child 1 {SPAN} of child 2 {P} of child 2 {B} of child 4 {SPAN} of root {DIV}
+downstream: position 0 of child 1 {TEXT} of child 2 {SPAN} of child 2 {P} of child 2 {B} of child 4 {SPAN} of root {DIV}
diff --git a/LayoutTests/editing/style/remove-underline-across-paragraph-in-bold.html b/LayoutTests/editing/style/remove-underline-across-paragraph-in-bold.html
new file mode 100644 (file)
index 0000000..459ff1e
--- /dev/null
@@ -0,0 +1,52 @@
+<html> 
+<head>
+
+<style>
+.editing { 
+    border: 2px solid red; 
+    padding: 12px; 
+    font-size: 24px; 
+}
+</style>
+<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
+
+<script>
+
+function editingTest() {
+    boldCommand();
+    underlineCommand();
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+    typeCharacterCommand(' ');
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+    insertParagraphCommand();
+    typeCharacterCommand(' ');
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+    typeCharacterCommand(' ');
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+    moveSelectionBackwardByWordCommand();
+    moveSelectionBackwardByWordCommand();
+    moveSelectionBackwardByWordCommand();
+    extendSelectionForwardByWordCommand();
+    extendSelectionForwardByWordCommand();
+    underlineCommand();
+}
+
+</script>
+
+<title>Editing Test</title> 
+</head> 
+<body>
+<div contenteditable id="root" class="editing">
+<span id="test"></span>
+</div>
+
+<script>
+runEditingTest();
+</script>
+
+</body>
+</html>
diff --git a/LayoutTests/editing/style/remove-underline-across-paragraph.html b/LayoutTests/editing/style/remove-underline-across-paragraph.html
new file mode 100644 (file)
index 0000000..b7bbe72
--- /dev/null
@@ -0,0 +1,51 @@
+<html> 
+<head>
+
+<style>
+.editing { 
+    border: 2px solid red; 
+    padding: 12px; 
+    font-size: 24px; 
+}
+</style>
+<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
+
+<script>
+
+function editingTest() {
+    underlineCommand();
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+    typeCharacterCommand(' ');
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+    insertParagraphCommand();
+    typeCharacterCommand(' ');
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+    typeCharacterCommand(' ');
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+    moveSelectionBackwardByWordCommand();
+    moveSelectionBackwardByWordCommand();
+    moveSelectionBackwardByWordCommand();
+    extendSelectionForwardByWordCommand();
+    extendSelectionForwardByWordCommand();
+    underlineCommand();
+}
+
+</script>
+
+<title>Editing Test</title> 
+</head> 
+<body>
+<div contenteditable id="root" class="editing">
+<span id="test"></span>
+</div>
+
+<script>
+runEditingTest();
+</script>
+
+</body>
+</html>
diff --git a/LayoutTests/editing/style/remove-underline-after-paragraph-expected.txt b/LayoutTests/editing/style/remove-underline-after-paragraph-expected.txt
new file mode 100644 (file)
index 0000000..bd593a6
--- /dev/null
@@ -0,0 +1,23 @@
+layer at (0,0) size 800x600
+  RenderCanvas at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (8,8) size 784x584
+      RenderBlock {DIV} at (0,0) size 784x84 [border: (2px solid #FF0000)]
+        RenderBlock (anonymous) at (14,14) size 756x28
+          RenderInline {SPAN} at (0,0) size 0x0
+          RenderText {TEXT} at (0,0) size 0x0
+          RenderInline {SPAN} at (0,0) size 150x28
+            RenderInline {SPAN} at (0,0) size 150x28
+              RenderText {TEXT} at (0,0) size 150x28
+                text run at (0,0) width 150: "xxxxxx xxxxxx"
+        RenderBlock (anonymous) at (14,42) size 756x28
+          RenderBlock {P} at (0,0) size 756x28
+            RenderText {TEXT} at (0,0) size 156x28
+              text run at (0,0) width 156: " xxxxxx xxxxxx"
+        RenderBlock (anonymous) at (14,70) size 756x0
+          RenderInline {SPAN} at (0,0) size 0x0
+selection is CARET:
+start:      position 14 of child 1 {TEXT} of child 2 {P} of child 4 {SPAN} of root {DIV}
+upstream:   position 14 of child 1 {TEXT} of child 2 {P} of child 4 {SPAN} of root {DIV}
+downstream: position 14 of child 1 {TEXT} of child 2 {P} of child 4 {SPAN} of root {DIV}
diff --git a/LayoutTests/editing/style/remove-underline-after-paragraph-in-bold-expected.txt b/LayoutTests/editing/style/remove-underline-after-paragraph-in-bold-expected.txt
new file mode 100644 (file)
index 0000000..99bf0a0
--- /dev/null
@@ -0,0 +1,25 @@
+layer at (0,0) size 800x600
+  RenderCanvas at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (8,8) size 784x584
+      RenderBlock {DIV} at (0,0) size 784x84 [border: (2px solid #FF0000)]
+        RenderBlock (anonymous) at (14,14) size 756x28
+          RenderInline {SPAN} at (0,0) size 0x0
+          RenderText {TEXT} at (0,0) size 0x0
+          RenderInline {SPAN} at (0,0) size 150x28
+            RenderInline {B} at (0,0) size 150x28
+              RenderInline {SPAN} at (0,0) size 150x28
+                RenderText {TEXT} at (0,0) size 150x28
+                  text run at (0,0) width 150: "xxxxxx xxxxxx"
+        RenderBlock (anonymous) at (14,42) size 756x28
+          RenderBlock {P} at (0,0) size 756x28
+            RenderText {TEXT} at (0,0) size 156x28
+              text run at (0,0) width 156: " xxxxxx xxxxxx"
+        RenderBlock (anonymous) at (14,70) size 756x0
+          RenderInline {SPAN} at (0,0) size 0x0
+            RenderInline {B} at (0,0) size 0x0
+selection is CARET:
+start:      position 14 of child 1 {TEXT} of child 2 {P} of child 1 {B} of child 4 {SPAN} of root {DIV}
+upstream:   position 14 of child 1 {TEXT} of child 2 {P} of child 1 {B} of child 4 {SPAN} of root {DIV}
+downstream: position 14 of child 1 {TEXT} of child 2 {P} of child 1 {B} of child 4 {SPAN} of root {DIV}
diff --git a/LayoutTests/editing/style/remove-underline-after-paragraph-in-bold.html b/LayoutTests/editing/style/remove-underline-after-paragraph-in-bold.html
new file mode 100644 (file)
index 0000000..ef1d80c
--- /dev/null
@@ -0,0 +1,47 @@
+<html> 
+<head>
+
+<style>
+.editing { 
+    border: 2px solid red; 
+    padding: 12px; 
+    font-size: 24px; 
+}
+</style>
+<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
+
+<script>
+
+function editingTest() {
+    boldCommand();
+    underlineCommand();
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+    typeCharacterCommand(' ');
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+    insertParagraphCommand();
+    underlineCommand();
+    typeCharacterCommand(' ');
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+    typeCharacterCommand(' ');
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+}
+
+</script>
+
+<title>Editing Test</title> 
+</head> 
+<body>
+<div contenteditable id="root" class="editing">
+<span id="test"></span>
+</div>
+
+<script>
+runEditingTest();
+</script>
+
+</body>
+</html>
diff --git a/LayoutTests/editing/style/remove-underline-after-paragraph.html b/LayoutTests/editing/style/remove-underline-after-paragraph.html
new file mode 100644 (file)
index 0000000..17338f8
--- /dev/null
@@ -0,0 +1,46 @@
+<html> 
+<head>
+
+<style>
+.editing { 
+    border: 2px solid red; 
+    padding: 12px; 
+    font-size: 24px; 
+}
+</style>
+<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
+
+<script>
+
+function editingTest() {
+    underlineCommand();
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+    typeCharacterCommand(' ');
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+    insertParagraphCommand();
+    underlineCommand();
+    typeCharacterCommand(' ');
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+    typeCharacterCommand(' ');
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+}
+
+</script>
+
+<title>Editing Test</title> 
+</head> 
+<body>
+<div contenteditable id="root" class="editing">
+<span id="test"></span>
+</div>
+
+<script>
+runEditingTest();
+</script>
+
+</body>
+</html>
diff --git a/LayoutTests/editing/style/remove-underline-expected.txt b/LayoutTests/editing/style/remove-underline-expected.txt
new file mode 100644 (file)
index 0000000..c44b44c
--- /dev/null
@@ -0,0 +1,24 @@
+layer at (0,0) size 800x600
+  RenderCanvas at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (8,8) size 784x584
+      RenderBlock {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)]
+        RenderInline {SPAN} at (0,0) size 0x0
+        RenderText {TEXT} at (0,0) size 0x0
+        RenderInline {SPAN} at (0,0) size 78x28
+          RenderText {TEXT} at (14,14) size 78x28
+            text run at (14,14) width 78: "xxxxxx "
+        RenderInline {SPAN} at (0,0) size 72x28
+          RenderText {TEXT} at (92,14) size 72x28
+            text run at (92,14) width 72: "xxxxxx"
+        RenderInline {SPAN} at (0,0) size 78x28
+          RenderText {TEXT} at (164,14) size 78x28
+            text run at (164,14) width 78: " xxxxxx"
+selection is RANGE:
+start:      position 0 of child 1 {TEXT} of child 5 {SPAN} of root {DIV}
+upstream:   position 7 of child 1 {TEXT} of child 4 {SPAN} of root {DIV}
+downstream: position 0 of child 1 {TEXT} of child 5 {SPAN} of root {DIV}
+end:        position 6 of child 1 {TEXT} of child 5 {SPAN} of root {DIV}
+upstream:   position 6 of child 1 {TEXT} of child 5 {SPAN} of root {DIV}
+downstream: position 0 of child 1 {TEXT} of child 6 {SPAN} of root {DIV}
diff --git a/LayoutTests/editing/style/remove-underline-from-stylesheet-expected.txt b/LayoutTests/editing/style/remove-underline-from-stylesheet-expected.txt
new file mode 100644 (file)
index 0000000..eb221d4
--- /dev/null
@@ -0,0 +1,25 @@
+layer at (0,0) size 800x600
+  RenderCanvas at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (8,8) size 784x584
+      RenderBlock {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)]
+        RenderInline {SPAN} at (0,0) size 78x28
+          RenderText {TEXT} at (0,0) size 0x0
+          RenderInline {SPAN} at (0,0) size 0x0
+          RenderText {TEXT} at (0,0) size 0x0
+          RenderText {TEXT} at (14,14) size 78x28
+            text run at (14,14) width 78: "xxxxxx "
+        RenderInline {SPAN} at (0,0) size 72x28
+          RenderText {TEXT} at (92,14) size 72x28
+            text run at (92,14) width 72: "xxxxxx"
+        RenderInline {SPAN} at (0,0) size 78x28
+          RenderText {TEXT} at (164,14) size 78x28
+            text run at (164,14) width 78: " xxxxxx"
+selection is RANGE:
+start:      position 0 of child 1 {TEXT} of child 2 {SPAN} of root {DIV}
+upstream:   position 7 of child 4 {TEXT} of child 1 {SPAN} of root {DIV}
+downstream: position 0 of child 1 {TEXT} of child 2 {SPAN} of root {DIV}
+end:        position 6 of child 1 {TEXT} of child 2 {SPAN} of root {DIV}
+upstream:   position 6 of child 1 {TEXT} of child 2 {SPAN} of root {DIV}
+downstream: position 0 of child 1 {TEXT} of child 3 {SPAN} of root {DIV}
diff --git a/LayoutTests/editing/style/remove-underline-from-stylesheet.html b/LayoutTests/editing/style/remove-underline-from-stylesheet.html
new file mode 100644 (file)
index 0000000..fdc86a0
--- /dev/null
@@ -0,0 +1,45 @@
+<html> 
+<head>
+
+<style>
+.editing { 
+    border: 2px solid red; 
+    padding: 12px; 
+    font-size: 24px; 
+    text-decoration: underline;
+}
+</style>
+<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
+
+<script>
+
+function editingTest() {
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+    typeCharacterCommand(' ');
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+    typeCharacterCommand(' ');
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+    moveSelectionBackwardByWordCommand();
+    moveSelectionBackwardByWordCommand();
+    extendSelectionForwardByWordCommand();
+    underlineCommand();
+}
+
+</script>
+
+<title>Editing Test</title> 
+</head> 
+<body>
+<div contenteditable id="root" class="editing">
+<span id="test"></span>
+</div>
+
+<script>
+runEditingTest();
+</script>
+
+</body>
+</html>
diff --git a/LayoutTests/editing/style/remove-underline-in-bold-expected.txt b/LayoutTests/editing/style/remove-underline-in-bold-expected.txt
new file mode 100644 (file)
index 0000000..59d2a3b
--- /dev/null
@@ -0,0 +1,25 @@
+layer at (0,0) size 800x600
+  RenderCanvas at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (8,8) size 784x584
+      RenderBlock {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)]
+        RenderInline {SPAN} at (0,0) size 0x0
+        RenderText {TEXT} at (0,0) size 0x0
+        RenderInline {SPAN} at (0,0) size 228x28
+          RenderInline {B} at (0,0) size 78x28
+            RenderText {TEXT} at (14,14) size 78x28
+              text run at (14,14) width 78: "xxxxxx "
+          RenderInline {B} at (0,0) size 72x28
+            RenderText {TEXT} at (92,14) size 72x28
+              text run at (92,14) width 72: "xxxxxx"
+          RenderInline {B} at (0,0) size 78x28
+            RenderText {TEXT} at (164,14) size 78x28
+              text run at (164,14) width 78: " xxxxxx"
+selection is RANGE:
+start:      position 0 of child 1 {TEXT} of child 2 {B} of child 4 {SPAN} of root {DIV}
+upstream:   position 7 of child 1 {TEXT} of child 1 {B} of child 4 {SPAN} of root {DIV}
+downstream: position 0 of child 1 {TEXT} of child 2 {B} of child 4 {SPAN} of root {DIV}
+end:        position 6 of child 1 {TEXT} of child 2 {B} of child 4 {SPAN} of root {DIV}
+upstream:   position 6 of child 1 {TEXT} of child 2 {B} of child 4 {SPAN} of root {DIV}
+downstream: position 0 of child 1 {TEXT} of child 3 {B} of child 4 {SPAN} of root {DIV}
diff --git a/LayoutTests/editing/style/remove-underline-in-bold.html b/LayoutTests/editing/style/remove-underline-in-bold.html
new file mode 100644 (file)
index 0000000..1f3ea2a
--- /dev/null
@@ -0,0 +1,46 @@
+<html> 
+<head>
+
+<style>
+.editing { 
+    border: 2px solid red; 
+    padding: 12px; 
+    font-size: 24px; 
+}
+</style>
+<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
+
+<script>
+
+function editingTest() {
+    underlineCommand();
+    boldCommand();
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+    typeCharacterCommand(' ');
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+    typeCharacterCommand(' ');
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+    moveSelectionBackwardByWordCommand();
+    moveSelectionBackwardByWordCommand();
+    extendSelectionForwardByWordCommand();
+    underlineCommand();
+}
+
+</script>
+
+<title>Editing Test</title> 
+</head> 
+<body>
+<div contenteditable id="root" class="editing">
+<span id="test"></span>
+</div>
+
+<script>
+runEditingTest();
+</script>
+
+</body>
+</html>
diff --git a/LayoutTests/editing/style/remove-underline.html b/LayoutTests/editing/style/remove-underline.html
new file mode 100644 (file)
index 0000000..0a3ff77
--- /dev/null
@@ -0,0 +1,45 @@
+<html> 
+<head>
+
+<style>
+.editing { 
+    border: 2px solid red; 
+    padding: 12px; 
+    font-size: 24px; 
+}
+</style>
+<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
+
+<script>
+
+function editingTest() {
+    underlineCommand();
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+    typeCharacterCommand(' ');
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+    typeCharacterCommand(' ');
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+    moveSelectionBackwardByWordCommand();
+    moveSelectionBackwardByWordCommand();
+    extendSelectionForwardByWordCommand();
+    underlineCommand();
+}
+
+</script>
+
+<title>Editing Test</title> 
+</head> 
+<body>
+<div contenteditable id="root" class="editing">
+<span id="test"></span>
+</div>
+
+<script>
+runEditingTest();
+</script>
+
+</body>
+</html>
diff --git a/LayoutTests/editing/style/underline-expected.txt b/LayoutTests/editing/style/underline-expected.txt
new file mode 100644 (file)
index 0000000..f5d0e13
--- /dev/null
@@ -0,0 +1,15 @@
+layer at (0,0) size 800x600
+  RenderCanvas at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (8,8) size 784x584
+      RenderBlock {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)]
+        RenderInline {SPAN} at (0,0) size 0x0
+        RenderText {TEXT} at (0,0) size 0x0
+        RenderInline {SPAN} at (0,0) size 228x28
+          RenderText {TEXT} at (14,14) size 228x28
+            text run at (14,14) width 228: "xxxxxx xxxxxx xxxxxx"
+selection is CARET:
+start:      position 20 of child 1 {TEXT} of child 4 {SPAN} of root {DIV}
+upstream:   position 20 of child 1 {TEXT} of child 4 {SPAN} of root {DIV}
+downstream: position 20 of child 1 {TEXT} of child 4 {SPAN} of root {DIV}
diff --git a/LayoutTests/editing/style/underline.html b/LayoutTests/editing/style/underline.html
new file mode 100644 (file)
index 0000000..3ef0532
--- /dev/null
@@ -0,0 +1,41 @@
+<html> 
+<head>
+
+<style>
+.editing { 
+    border: 2px solid red; 
+    padding: 12px; 
+    font-size: 24px; 
+}
+</style>
+<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
+
+<script>
+
+function editingTest() {
+    underlineCommand();
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+    typeCharacterCommand(' ');
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+    typeCharacterCommand(' ');
+    for (i = 0; i < 6; i++)
+        typeCharacterCommand();
+}
+
+</script>
+
+<title>Editing Test</title> 
+</head> 
+<body>
+<div contenteditable id="root" class="editing">
+<span id="test"></span>
+</div>
+
+<script>
+runEditingTest();
+</script>
+
+</body>
+</html>
index cd3dbdb7ba2cfa83f4f04ccdb6828e4c0113600e..7fe092f7d02fce7430b40e01fdf8521e6eda113f 100644 (file)
@@ -1,3 +1,87 @@
+2005-01-26  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Darin, Hyatt and Ken.
+
+       <rdar://problem/3790449> REGRESSION (Mail): underline behavior is flaky because of how CSS handles text-decoration
+       
+        * khtml/css/css_computedstyle.cpp:
+        (DOM::CSSComputedStyleDeclarationImpl::getPropertyCSSValue): Add support
+       for -khtml-text-decorations-in-effect property. This works like text-docration
+       but follows proper inline semantics, that is, if a parent is causing text
+       decoration then -khtml-text-decorations-in-effect on this element will reflect that.
+        * khtml/css/cssproperties.in: Add -khtml-text-decorations-in-effect property.
+        * khtml/css/cssproperties.h: regenerated
+        * khtml/css/cssvalues.c: regenerated
+        * khtml/css/cssparser.cpp: regenerated
+        * khtml/css/cssproperties.c: regenerated
+
+        * khtml/css/css_valueimpl.h: Made copyPropertiesInSet public.
+
+        * khtml/editing/htmlediting.cpp:
+        (khtml::StyleChange::init): Handle -khtml-text-decorations-in-effect
+       specially, translate to text-decoration
+        (khtml::ApplyStyleCommand::applyInlineStyle): Fix a comment.
+        (khtml::ApplyStyleCommand::removeInlineStyle): Add new way of pushing down
+       text-decoration styles around the edges of the selected range.
+        (khtml::ApplyStyleCommand::pushDownTextDecorationStyleAroundNode): Helper for this.
+        (khtml::ApplyStyleCommand::pushDownTextDecorationStyleAtBoundaries): ditto
+        (khtml::ApplyStyleCommand::nodeFullyUnselected): ditto
+        (khtml::hasTextDecorationProperty): ditto
+        (khtml::highestAncestorWithTextDecoration): ditto
+        (khtml::ApplyStyleCommand::extractTextDecorationStyle): ditto
+        (khtml::ApplyStyleCommand::extractAndNegateTextDecorationStyle): ditto
+        (khtml::ApplyStyleCommand::applyTextDecorationStyle): ditto
+        * khtml/editing/htmlediting.h: Prototype new methods.
+        * khtml/editing/jsediting.cpp: Make underline execCommand use the new CSS property.
+
+       - as a necessary part of the fix, fixed the longstanding problem
+       that mutating an element's inlineStyleDecl would not property
+       update its style attribute. now it does.
+       
+        * khtml/css/css_valueimpl.cpp:
+        (DOM::CSSMutableStyleDeclarationImpl::setChanged): If this is an inline style
+       declaration, tell the element it's style attribute needs updating.
+        * khtml/html/html_elementimpl.cpp:
+        (HTMLElementImpl::invalidateStyleAttribute): New method, just calls down
+       to the dom element.
+        (HTMLElementImpl::updateStyleAttribute): Regenerate style attribute from
+       inline style declaration.
+        * khtml/html/html_elementimpl.h: Prototype new stuff.
+        * khtml/xml/dom_elementimpl.cpp:
+        (ElementImpl::ElementImpl): Initialize new attribute.
+        (ElementImpl::updateStyleAttributeIfNeeded): New method to check if the style
+       is dirty and this is an html element, and if so call the html element to
+       regenerate the style attribute.
+        (ElementImpl::attributes): update style if needed
+        (ElementImpl::getAttribute): ditto
+        (ElementImpl::hasAttributes): ditto
+        (ElementImpl::dump): ditto
+        (XMLElementImpl::cloneNode): ditto
+        * khtml/xml/dom_elementimpl.h:
+        (DOM::ElementImpl::isStyleAttributeValid): new method to manage style attr
+       dirty bit
+        (DOM::ElementImpl::setStyleAttributeValid): ditto
+
+       - added new layout tests for underlining:
+       
+        * layout-tests/editing/editing.js:
+        * layout-tests/editing/style/remove-underline-across-paragraph-expected.txt: Added.
+        * layout-tests/editing/style/remove-underline-across-paragraph-in-bold-expected.txt: Added.
+        * layout-tests/editing/style/remove-underline-across-paragraph-in-bold.html: Added.
+        * layout-tests/editing/style/remove-underline-across-paragraph.html: Added.
+        * layout-tests/editing/style/remove-underline-after-paragraph-expected.txt: Added.
+        * layout-tests/editing/style/remove-underline-after-paragraph-in-bold-expected.txt: Added.
+        * layout-tests/editing/style/remove-underline-after-paragraph-in-bold.html: Added.
+        * layout-tests/editing/style/remove-underline-after-paragraph.html: Added.
+        * layout-tests/editing/style/remove-underline-expected.txt: Added.
+        * layout-tests/editing/style/remove-underline-from-stylesheet-expected.txt: Added.
+        * layout-tests/editing/style/remove-underline-from-stylesheet.html: Added.
+        * layout-tests/editing/style/remove-underline-in-bold-expected.txt: Added.
+        * layout-tests/editing/style/remove-underline-in-bold.html: Added.
+        * layout-tests/editing/style/remove-underline.html: Added.
+        * layout-tests/editing/style/underline-expected.txt: Added.
+        * layout-tests/editing/style/underline.html: Added.
+
 2005-01-27  David Hyatt  <hyatt@apple.com>
 
        Fix for 3875199, search field needs to be able to  show a magnifying  glass without a dropdown menu.
index 4b6ad2c0fcd6b373d46d594519635682189660eb..88a262cf3ab88da5a33583ad7bc07ca04c6accc6 100644 (file)
@@ -138,6 +138,7 @@ static const int computedProperties[] = {
     CSS_PROP_TABLE_LAYOUT,
     CSS_PROP_TEXT_ALIGN,
     CSS_PROP_TEXT_DECORATION,
+    CSS_PROP__KHTML_TEXT_DECORATIONS_IN_EFFECT,
     CSS_PROP_TEXT_INDENT,
     CSS_PROP_TEXT_SHADOW,
     CSS_PROP_TEXT_TRANSFORM,
@@ -171,7 +172,7 @@ static const int inheritableProperties[] = {
     CSS_PROP_LETTER_SPACING,
     CSS_PROP_LINE_HEIGHT,
     CSS_PROP_TEXT_ALIGN,
-    CSS_PROP_TEXT_DECORATION, // this is not inheritable, yet we do want to consider it for typing style (name change needed? redesign?)
+    CSS_PROP__KHTML_TEXT_DECORATIONS_IN_EFFECT,
     CSS_PROP_TEXT_INDENT,
     CSS_PROP__APPLE_TEXT_SIZE_ADJUST,
     CSS_PROP_TEXT_TRANSFORM,
@@ -991,6 +992,30 @@ CSSValueImpl *CSSComputedStyleDeclarationImpl::getPropertyCSSValue(int propertyI
             return new CSSPrimitiveValueImpl(CSS_VAL_NONE);
         return new CSSPrimitiveValueImpl(string, CSSPrimitiveValue::CSS_STRING);
     }
+    case CSS_PROP__KHTML_TEXT_DECORATIONS_IN_EFFECT:
+    {
+        QString string;
+        if (style->textDecorationsInEffect() & khtml::UNDERLINE)
+            string += "underline";
+        if (style->textDecorationsInEffect() & khtml::OVERLINE) {
+            if (string.length() > 0)
+                string += " ";
+            string += "overline";
+        }
+        if (style->textDecorationsInEffect() & khtml::LINE_THROUGH) {
+            if (string.length() > 0)
+                string += " ";
+            string += "line-through";
+        }
+        if (style->textDecorationsInEffect() & khtml::BLINK) {
+            if (string.length() > 0)
+                string += " ";
+            string += "blink";
+        }
+        if (string.length() == 0)
+            return new CSSPrimitiveValueImpl(CSS_VAL_NONE);
+        return new CSSPrimitiveValueImpl(string, CSSPrimitiveValue::CSS_STRING);
+    }
     case CSS_PROP_TEXT_INDENT:
         return valueForLength(style->textIndent());
     case CSS_PROP_TEXT_SHADOW:
index 9663c1cf614855b5925115c64d888258fa6532da..5d2c636b0d9d8f9667a10a241f4dc283ac4dd76f 100644 (file)
@@ -34,6 +34,7 @@
 
 #include "xml/dom_stringimpl.h"
 #include "xml/dom_docimpl.h"
+#include "html/html_elementimpl.h"
 
 #include "misc/loader.h"
 
@@ -267,6 +268,13 @@ void CSSMutableStyleDeclarationImpl::setChanged()
 {
     if (m_node) {
         m_node->setChanged();
+        // FIXME: Ideally, this should be factored better and there
+        // should be a subclass of CSSMutableStyleDeclarationImpl just
+        // for inline style declarations that handles this
+        if (m_node->isHTMLElement() && this == static_cast<HTMLElementImpl *>(m_node)->inlineStyleDecl()) {
+            static_cast<HTMLElementImpl *>(m_node)->invalidateStyleAttribute();
+        }
+
         return;
     }
 
index 7ea65cd09be4c75fe32a484a2ce8b4a3d9ce0897..726a469050815f5924d3734aa711987929c99e6a 100644 (file)
@@ -64,10 +64,11 @@ public:
  
     void diff(CSSMutableStyleDeclarationImpl *) const;
 
+    CSSMutableStyleDeclarationImpl *copyPropertiesInSet(const int *set, unsigned length) const;
+
 protected:
     CSSStyleDeclarationImpl(CSSRuleImpl *parentRule = 0);
 
-    CSSMutableStyleDeclarationImpl *copyPropertiesInSet(const int *set, unsigned length) const;
 
 private:
     CSSStyleDeclarationImpl(const CSSStyleDeclarationImpl &);
index 3957d4ddb9538ac4cd0959dc5c24f6325e7758e3..91c6866bd5b5fa6ffbc688425e201b289dd5e24d 100644 (file)
@@ -900,6 +900,7 @@ bool CSSParser::parseValue( int propId, bool important )
     }
 
     case CSS_PROP_TEXT_DECORATION:
+    case CSS_PROP__KHTML_TEXT_DECORATIONS_IN_EFFECT:
        // none | [ underline || overline || line-through || blink ] | inherit
        if (id == CSS_VAL_NONE) {
            valid_primitive = true;
index 486d2b22d00a20154ac663c6da1140ad25a15e59..fd6b2acd692ebfc6d6baa16a0e5d05c6e8b3fc23 100644 (file)
@@ -1,44 +1,13 @@
-/* ANSI-C code produced by gperf version 3.0.1 */
+/* ANSI-C code produced by gperf version 2.7.2 */
 /* Command-line: gperf -a -L ANSI-C -E -C -c -o -t -k '*' -NfindProp -Hhash_prop -Wwordlist_prop -D -s 2 cssproperties.gperf  */
-
-#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
-      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
-      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
-      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
-      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
-      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
-      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
-      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
-      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
-      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
-      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
-      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
-      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
-      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
-      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
-      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
-      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
-      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
-      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
-      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
-      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
-      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
-      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
-/* The character set is not based on ISO-646.  */
-#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
-#endif
-
-#line 1 "cssproperties.gperf"
-
 /* This file is automatically generated from cssproperties.in by makeprop, do not edit */
 /* Copyright 1999 W. Bastian */
 #include "cssproperties.h"
-#line 6 "cssproperties.gperf"
 struct props {
     const char *name;
     int id;
 };
-/* maximum key range = 514, duplicates = 0 */
+/* maximum key range = 990, duplicates = 0 */
 
 #ifdef __GNUC__
 __inline
@@ -52,130 +21,102 @@ hash_prop (register const char *str, register unsigned int len)
 {
   static const unsigned short asso_values[] =
     {
-      517, 517, 517, 517, 517, 517, 517, 517, 517, 517,
-      517, 517, 517, 517, 517, 517, 517, 517, 517, 517,
-      517, 517, 517, 517, 517, 517, 517, 517, 517, 517,
-      517, 517, 517, 517, 517, 517, 517, 517, 517, 517,
-      517, 517, 517, 517, 517,   0, 517, 517, 517, 517,
-      517,   5, 517, 517, 517, 517, 517, 517, 517, 517,
-      517, 517, 517, 517, 517, 517, 517, 517, 517, 517,
-      517, 517, 517, 517, 517, 517, 517, 517, 517, 517,
-      517, 517, 517, 517, 517, 517, 517, 517, 517, 517,
-      517, 517, 517, 517, 517, 517, 517,   0,   0,   0,
-        0,   5, 135,  25,  15,   0,   5,  25,   0,   0,
-        0,   0,   0,  45,   0,  25,   0,  70,  40, 205,
-      110, 210,  15, 517, 517, 517, 517, 517, 517, 517,
-      517, 517, 517, 517, 517, 517, 517, 517, 517, 517,
-      517, 517, 517, 517, 517, 517, 517, 517, 517, 517,
-      517, 517, 517, 517, 517, 517, 517, 517, 517, 517,
-      517, 517, 517, 517, 517, 517, 517, 517, 517, 517,
-      517, 517, 517, 517, 517, 517, 517, 517, 517, 517,
-      517, 517, 517, 517, 517, 517, 517, 517, 517, 517,
-      517, 517, 517, 517, 517, 517, 517, 517, 517, 517,
-      517, 517, 517, 517, 517, 517, 517, 517, 517, 517,
-      517, 517, 517, 517, 517, 517, 517, 517, 517, 517,
-      517, 517, 517, 517, 517, 517, 517, 517, 517, 517,
-      517, 517, 517, 517, 517, 517, 517, 517, 517, 517,
-      517, 517, 517, 517, 517, 517, 517, 517, 517, 517,
-      517, 517, 517, 517, 517, 517
+      1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+      1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+      1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+      1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+      1026, 1026, 1026, 1026, 1026,    0, 1026, 1026, 1026, 1026,
+      1026,    0, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+      1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+      1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+      1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+      1026, 1026, 1026, 1026, 1026, 1026, 1026,    5,   30,   90,
+         0,    0,  205,   40,    0,    0,    0,   25,    0,  135,
+        15,    0,  120,   10,    0,   50,    0,   15,  125,  405,
+       125,  395,   10, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+      1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+      1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+      1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+      1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+      1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+      1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+      1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+      1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+      1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+      1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+      1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+      1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+      1026, 1026, 1026, 1026, 1026, 1026
     };
   register int hval = len;
 
   switch (hval)
     {
       default:
+      case 33:
+        hval += asso_values[(unsigned char)str[32]];
+      case 32:
         hval += asso_values[(unsigned char)str[31]];
-      /*FALLTHROUGH*/
       case 31:
         hval += asso_values[(unsigned char)str[30]];
-      /*FALLTHROUGH*/
       case 30:
         hval += asso_values[(unsigned char)str[29]];
-      /*FALLTHROUGH*/
       case 29:
         hval += asso_values[(unsigned char)str[28]];
-      /*FALLTHROUGH*/
       case 28:
         hval += asso_values[(unsigned char)str[27]];
-      /*FALLTHROUGH*/
       case 27:
         hval += asso_values[(unsigned char)str[26]];
-      /*FALLTHROUGH*/
       case 26:
         hval += asso_values[(unsigned char)str[25]];
-      /*FALLTHROUGH*/
       case 25:
         hval += asso_values[(unsigned char)str[24]];
-      /*FALLTHROUGH*/
       case 24:
         hval += asso_values[(unsigned char)str[23]];
-      /*FALLTHROUGH*/
       case 23:
         hval += asso_values[(unsigned char)str[22]];
-      /*FALLTHROUGH*/
       case 22:
         hval += asso_values[(unsigned char)str[21]];
-      /*FALLTHROUGH*/
       case 21:
         hval += asso_values[(unsigned char)str[20]];
-      /*FALLTHROUGH*/
       case 20:
         hval += asso_values[(unsigned char)str[19]];
-      /*FALLTHROUGH*/
       case 19:
         hval += asso_values[(unsigned char)str[18]];
-      /*FALLTHROUGH*/
       case 18:
         hval += asso_values[(unsigned char)str[17]];
-      /*FALLTHROUGH*/
       case 17:
         hval += asso_values[(unsigned char)str[16]];
-      /*FALLTHROUGH*/
       case 16:
         hval += asso_values[(unsigned char)str[15]];
-      /*FALLTHROUGH*/
       case 15:
         hval += asso_values[(unsigned char)str[14]];
-      /*FALLTHROUGH*/
       case 14:
         hval += asso_values[(unsigned char)str[13]];
-      /*FALLTHROUGH*/
       case 13:
         hval += asso_values[(unsigned char)str[12]];
-      /*FALLTHROUGH*/
       case 12:
         hval += asso_values[(unsigned char)str[11]];
-      /*FALLTHROUGH*/
       case 11:
         hval += asso_values[(unsigned char)str[10]];
-      /*FALLTHROUGH*/
       case 10:
         hval += asso_values[(unsigned char)str[9]];
-      /*FALLTHROUGH*/
       case 9:
         hval += asso_values[(unsigned char)str[8]];
-      /*FALLTHROUGH*/
       case 8:
         hval += asso_values[(unsigned char)str[7]];
-      /*FALLTHROUGH*/
       case 7:
         hval += asso_values[(unsigned char)str[6]];
-      /*FALLTHROUGH*/
       case 6:
         hval += asso_values[(unsigned char)str[5]];
-      /*FALLTHROUGH*/
       case 5:
         hval += asso_values[(unsigned char)str[4]];
-      /*FALLTHROUGH*/
       case 4:
         hval += asso_values[(unsigned char)str[3]];
-      /*FALLTHROUGH*/
       case 3:
         hval += asso_values[(unsigned char)str[2]];
-      /*FALLTHROUGH*/
       case 2:
         hval += asso_values[(unsigned char)str[1]];
-      /*FALLTHROUGH*/
       case 1:
         hval += asso_values[(unsigned char)str[0]];
         break;
@@ -191,387 +132,281 @@ findProp (register const char *str, register unsigned int len)
 {
   enum
     {
-      TOTAL_KEYWORDS = 158,
+      TOTAL_KEYWORDS = 159,
       MIN_WORD_LENGTH = 3,
-      MAX_WORD_LENGTH = 32,
-      MIN_HASH_VALUE = 3,
-      MAX_HASH_VALUE = 516
+      MAX_WORD_LENGTH = 33,
+      MIN_HASH_VALUE = 36,
+      MAX_HASH_VALUE = 1025
     };
 
   static const struct props wordlist_prop[] =
     {
-#line 135 "cssproperties.gperf"
-      {"top", CSS_PROP_TOP},
-#line 46 "cssproperties.gperf"
-      {"clip", CSS_PROP_CLIP},
-#line 47 "cssproperties.gperf"
+      {"border", CSS_PROP_BORDER},
+      {"outline", CSS_PROP_OUTLINE},
+      {"right", CSS_PROP_RIGHT},
+      {"height", CSS_PROP_HEIGHT},
+      {"size", CSS_PROP_SIZE},
+      {"line-height", CSS_PROP_LINE_HEIGHT},
+      {"quotes", CSS_PROP_QUOTES},
+      {"border-right", CSS_PROP_BORDER_RIGHT},
       {"color", CSS_PROP_COLOR},
-#line 35 "cssproperties.gperf"
-      {"bottom", CSS_PROP_BOTTOM},
-#line 45 "cssproperties.gperf"
       {"clear", CSS_PROP_CLEAR},
-#line 149 "cssproperties.gperf"
-      {"border", CSS_PROP_BORDER},
-#line 48 "cssproperties.gperf"
-      {"content", CSS_PROP_CONTENT},
-#line 52 "cssproperties.gperf"
       {"direction", CSS_PROP_DIRECTION},
-#line 152 "cssproperties.gperf"
-      {"border-top", CSS_PROP_BORDER_TOP},
-#line 150 "cssproperties.gperf"
+      {"top", CSS_PROP_TOP},
+      {"content", CSS_PROP_CONTENT},
       {"border-color", CSS_PROP_BORDER_COLOR},
-#line 154 "cssproperties.gperf"
-      {"border-bottom", CSS_PROP_BORDER_BOTTOM},
-#line 23 "cssproperties.gperf"
-      {"border-top-color", CSS_PROP_BORDER_TOP_COLOR},
-#line 25 "cssproperties.gperf"
-      {"border-bottom-color", CSS_PROP_BORDER_BOTTOM_COLOR},
-#line 66 "cssproperties.gperf"
-      {"-apple-line-clamp", CSS_PROP__APPLE_LINE_CLAMP},
-#line 159 "cssproperties.gperf"
-      {"margin", CSS_PROP_MARGIN},
-#line 161 "cssproperties.gperf"
+      {"outline-color", CSS_PROP_OUTLINE_COLOR},
+      {"z-index", CSS_PROP_Z_INDEX},
+      {"border-top", CSS_PROP_BORDER_TOP},
+      {"cursor", CSS_PROP_CURSOR},
+      {"unicode-bidi", CSS_PROP_UNICODE_BIDI},
+      {"text-indent", CSS_PROP_TEXT_INDENT},
+      {"page", CSS_PROP_PAGE},
+      {"bottom", CSS_PROP_BOTTOM},
+      {"border-right-color", CSS_PROP_BORDER_RIGHT_COLOR},
+      {"counter-reset", CSS_PROP_COUNTER_RESET},
+      {"text-underline", CSS_PROP_TEXT_UNDERLINE},
       {"padding", CSS_PROP_PADDING},
-#line 107 "cssproperties.gperf"
       {"position", CSS_PROP_POSITION},
-#line 103 "cssproperties.gperf"
-      {"page", CSS_PROP_PAGE},
-#line 71 "cssproperties.gperf"
-      {"margin-top", CSS_PROP_MARGIN_TOP},
-#line 98 "cssproperties.gperf"
-      {"padding-top", CSS_PROP_PADDING_TOP},
-#line 73 "cssproperties.gperf"
-      {"margin-bottom", CSS_PROP_MARGIN_BOTTOM},
-#line 100 "cssproperties.gperf"
-      {"padding-bottom", CSS_PROP_PADDING_BOTTOM},
-#line 44 "cssproperties.gperf"
-      {"caption-side", CSS_PROP_CAPTION_SIDE},
-#line 109 "cssproperties.gperf"
-      {"right", CSS_PROP_RIGHT},
-#line 92 "cssproperties.gperf"
+      {"text-align", CSS_PROP_TEXT_ALIGN},
       {"orphans", CSS_PROP_ORPHANS},
-#line 110 "cssproperties.gperf"
-      {"size", CSS_PROP_SIZE},
-#line 19 "cssproperties.gperf"
-      {"border-collapse", CSS_PROP_BORDER_COLLAPSE},
-#line 153 "cssproperties.gperf"
-      {"border-right", CSS_PROP_BORDER_RIGHT},
-#line 24 "cssproperties.gperf"
-      {"border-right-color", CSS_PROP_BORDER_RIGHT_COLOR},
-#line 63 "cssproperties.gperf"
-      {"height", CSS_PROP_HEIGHT},
-#line 20 "cssproperties.gperf"
-      {"border-spacing", CSS_PROP_BORDER_SPACING},
-#line 88 "cssproperties.gperf"
       {"min-height", CSS_PROP_MIN_HEIGHT},
-#line 167 "cssproperties.gperf"
-      {"scrollbar-track-color", CSS_PROP_SCROLLBAR_TRACK_COLOR},
-#line 65 "cssproperties.gperf"
-      {"letter-spacing", CSS_PROP_LETTER_SPACING},
-#line 67 "cssproperties.gperf"
-      {"line-height", CSS_PROP_LINE_HEIGHT},
-#line 72 "cssproperties.gperf"
-      {"margin-right", CSS_PROP_MARGIN_RIGHT},
-#line 99 "cssproperties.gperf"
+      {"margin", CSS_PROP_MARGIN},
+      {"border-bottom", CSS_PROP_BORDER_BOTTOM},
+      {"left", CSS_PROP_LEFT},
+      {"text-line-through", CSS_PROP_TEXT_LINE_THROUGH},
+      {"clip", CSS_PROP_CLIP},
+      {"float", CSS_PROP_FLOAT},
+      {"font", CSS_PROP_FONT},
+      {"background", CSS_PROP_BACKGROUND},
       {"padding-right", CSS_PROP_PADDING_RIGHT},
-#line 18 "cssproperties.gperf"
+      {"border-left", CSS_PROP_BORDER_LEFT},
+      {"margin-right", CSS_PROP_MARGIN_RIGHT},
+      {"text-decoration", CSS_PROP_TEXT_DECORATION},
+      {"-khtml-line-break", CSS_PROP__KHTML_LINE_BREAK},
+      {"border-top-color", CSS_PROP_BORDER_TOP_COLOR},
       {"-khtml-binding", CSS_PROP__KHTML_BINDING},
-#line 160 "cssproperties.gperf"
-      {"outline", CSS_PROP_OUTLINE},
-#line 140 "cssproperties.gperf"
+      {"text-overline", CSS_PROP_TEXT_OVERLINE},
+      {"text-underline-color", CSS_PROP_TEXT_UNDERLINE_COLOR},
+      {"-khtml-user-drag", CSS_PROP__KHTML_USER_DRAG},
+      {"font-size", CSS_PROP_FONT_SIZE},
+      {"caption-side", CSS_PROP_CAPTION_SIDE},
       {"vertical-align", CSS_PROP_VERTICAL_ALIGN},
-#line 90 "cssproperties.gperf"
-      {"-khtml-nbsp-mode", CSS_PROP__KHTML_NBSP_MODE},
-#line 136 "cssproperties.gperf"
-      {"unicode-bidi", CSS_PROP_UNICODE_BIDI},
-#line 93 "cssproperties.gperf"
-      {"outline-color", CSS_PROP_OUTLINE_COLOR},
-#line 75 "cssproperties.gperf"
-      {"-khtml-line-break", CSS_PROP__KHTML_LINE_BREAK},
-#line 165 "cssproperties.gperf"
-      {"scrollbar-3dlight-color", CSS_PROP_SCROLLBAR_3DLIGHT_COLOR},
-#line 134 "cssproperties.gperf"
-      {"-apple-dashboard-region", CSS_PROP__APPLE_DASHBOARD_REGION},
-#line 51 "cssproperties.gperf"
-      {"cursor", CSS_PROP_CURSOR},
-#line 49 "cssproperties.gperf"
-      {"counter-increment", CSS_PROP_COUNTER_INCREMENT},
-#line 106 "cssproperties.gperf"
+      {"border-bottom-color", CSS_PROP_BORDER_BOTTOM_COLOR},
       {"page-break-inside", CSS_PROP_PAGE_BREAK_INSIDE},
-#line 79 "cssproperties.gperf"
-      {"-khtml-margin-start", CSS_PROP__KHTML_MARGIN_START},
-#line 102 "cssproperties.gperf"
-      {"-khtml-padding-start", CSS_PROP__KHTML_PADDING_START},
-#line 76 "cssproperties.gperf"
-      {"-khtml-margin-collapse", CSS_PROP__KHTML_MARGIN_COLLAPSE},
-#line 77 "cssproperties.gperf"
-      {"-khtml-margin-top-collapse", CSS_PROP__KHTML_MARGIN_TOP_COLLAPSE},
-#line 50 "cssproperties.gperf"
-      {"counter-reset", CSS_PROP_COUNTER_RESET},
-#line 78 "cssproperties.gperf"
-      {"-khtml-margin-bottom-collapse", CSS_PROP__KHTML_MARGIN_BOTTOM_COLLAPSE},
-#line 148 "cssproperties.gperf"
-      {"background", CSS_PROP_BACKGROUND},
-#line 114 "cssproperties.gperf"
-      {"text-indent", CSS_PROP_TEXT_INDENT},
-#line 113 "cssproperties.gperf"
-      {"text-decoration", CSS_PROP_TEXT_DECORATION},
-#line 11 "cssproperties.gperf"
+      {"text-line-through-color", CSS_PROP_TEXT_LINE_THROUGH_COLOR},
+      {"border-collapse", CSS_PROP_BORDER_COLLAPSE},
+      {"padding-top", CSS_PROP_PADDING_TOP},
+      {"max-height", CSS_PROP_MAX_HEIGHT},
+      {"text-underline-mode", CSS_PROP_TEXT_UNDERLINE_MODE},
+      {"margin-top", CSS_PROP_MARGIN_TOP},
       {"background-color", CSS_PROP_BACKGROUND_COLOR},
-#line 147 "cssproperties.gperf"
-      {"z-index", CSS_PROP_Z_INDEX},
-#line 157 "cssproperties.gperf"
-      {"font", CSS_PROP_FONT},
-#line 55 "cssproperties.gperf"
-      {"float", CSS_PROP_FLOAT},
-#line 64 "cssproperties.gperf"
-      {"left", CSS_PROP_LEFT},
-#line 164 "cssproperties.gperf"
-      {"scrollbar-highlight-color", CSS_PROP_SCROLLBAR_HIGHLIGHT_COLOR},
-#line 13 "cssproperties.gperf"
-      {"background-repeat", CSS_PROP_BACKGROUND_REPEAT},
-#line 112 "cssproperties.gperf"
-      {"text-align", CSS_PROP_TEXT_ALIGN},
-#line 108 "cssproperties.gperf"
-      {"quotes", CSS_PROP_QUOTES},
-#line 155 "cssproperties.gperf"
-      {"border-left", CSS_PROP_BORDER_LEFT},
-#line 21 "cssproperties.gperf"
-      {"-khtml-border-horizontal-spacing", CSS_PROP__KHTML_BORDER_HORIZONTAL_SPACING},
-#line 14 "cssproperties.gperf"
-      {"background-attachment", CSS_PROP_BACKGROUND_ATTACHMENT},
-#line 26 "cssproperties.gperf"
+      {"scrollbar-3dlight-color", CSS_PROP_SCROLLBAR_3DLIGHT_COLOR},
+      {"letter-spacing", CSS_PROP_LETTER_SPACING},
+      {"-khtml-marquee", CSS_PROP__KHTML_MARQUEE},
       {"border-left-color", CSS_PROP_BORDER_LEFT_COLOR},
-#line 15 "cssproperties.gperf"
-      {"background-position", CSS_PROP_BACKGROUND_POSITION},
-#line 12 "cssproperties.gperf"
-      {"background-image", CSS_PROP_BACKGROUND_IMAGE},
-#line 22 "cssproperties.gperf"
-      {"-khtml-border-vertical-spacing", CSS_PROP__KHTML_BORDER_VERTICAL_SPACING},
-#line 42 "cssproperties.gperf"
       {"-khtml-box-orient", CSS_PROP__KHTML_BOX_ORIENT},
-#line 37 "cssproperties.gperf"
-      {"-khtml-box-direction", CSS_PROP__KHTML_BOX_DIRECTION},
-#line 74 "cssproperties.gperf"
-      {"margin-left", CSS_PROP_MARGIN_LEFT},
-#line 101 "cssproperties.gperf"
-      {"padding-left", CSS_PROP_PADDING_LEFT},
-#line 121 "cssproperties.gperf"
-      {"text-overline", CSS_PROP_TEXT_OVERLINE},
-#line 80 "cssproperties.gperf"
-      {"-khtml-marquee", CSS_PROP__KHTML_MARQUEE},
-#line 86 "cssproperties.gperf"
-      {"max-height", CSS_PROP_MAX_HEIGHT},
-#line 137 "cssproperties.gperf"
-      {"-khtml-user-drag", CSS_PROP__KHTML_USER_DRAG},
-#line 122 "cssproperties.gperf"
+      {"text-line-through-mode", CSS_PROP_TEXT_LINE_THROUGH_MODE},
+      {"padding-bottom", CSS_PROP_PADDING_BOTTOM},
+      {"background-repeat", CSS_PROP_BACKGROUND_REPEAT},
+      {"border-spacing", CSS_PROP_BORDER_SPACING},
+      {"scrollbar-highlight-color", CSS_PROP_SCROLLBAR_HIGHLIGHT_COLOR},
+      {"font-stretch", CSS_PROP_FONT_STRETCH},
+      {"margin-bottom", CSS_PROP_MARGIN_BOTTOM},
       {"text-overline-color", CSS_PROP_TEXT_OVERLINE_COLOR},
-#line 162 "cssproperties.gperf"
-      {"scrollbar-face-color", CSS_PROP_SCROLLBAR_FACE_COLOR},
-#line 61 "cssproperties.gperf"
       {"font-variant", CSS_PROP_FONT_VARIANT},
-#line 123 "cssproperties.gperf"
-      {"text-overline-mode", CSS_PROP_TEXT_OVERLINE_MODE},
-#line 57 "cssproperties.gperf"
-      {"font-size", CSS_PROP_FONT_SIZE},
-#line 43 "cssproperties.gperf"
-      {"-khtml-box-pack", CSS_PROP__KHTML_BOX_PACK},
-#line 36 "cssproperties.gperf"
-      {"-khtml-box-align", CSS_PROP__KHTML_BOX_ALIGN},
-#line 59 "cssproperties.gperf"
-      {"font-stretch", CSS_PROP_FONT_STRETCH},
-#line 139 "cssproperties.gperf"
       {"-khtml-user-select", CSS_PROP__KHTML_USER_SELECT},
-#line 81 "cssproperties.gperf"
-      {"-khtml-marquee-direction", CSS_PROP__KHTML_MARQUEE_DIRECTION},
-#line 40 "cssproperties.gperf"
+      {"-khtml-box-align", CSS_PROP__KHTML_BOX_ALIGN},
+      {"counter-increment", CSS_PROP_COUNTER_INCREMENT},
       {"-khtml-box-lines", CSS_PROP__KHTML_BOX_LINES},
-#line 82 "cssproperties.gperf"
-      {"-khtml-marquee-increment", CSS_PROP__KHTML_MARQUEE_INCREMENT},
-#line 83 "cssproperties.gperf"
-      {"-khtml-marquee-repetition", CSS_PROP__KHTML_MARQUEE_REPETITION},
-#line 128 "cssproperties.gperf"
-      {"text-underline", CSS_PROP_TEXT_UNDERLINE},
-#line 129 "cssproperties.gperf"
-      {"text-underline-color", CSS_PROP_TEXT_UNDERLINE_COLOR},
-#line 104 "cssproperties.gperf"
-      {"page-break-after", CSS_PROP_PAGE_BREAK_AFTER},
-#line 91 "cssproperties.gperf"
-      {"opacity", CSS_PROP_OPACITY},
-#line 130 "cssproperties.gperf"
-      {"text-underline-mode", CSS_PROP_TEXT_UNDERLINE_MODE},
-#line 84 "cssproperties.gperf"
-      {"-khtml-marquee-speed", CSS_PROP__KHTML_MARQUEE_SPEED},
-#line 105 "cssproperties.gperf"
-      {"page-break-before", CSS_PROP_PAGE_BREAK_BEFORE},
-#line 144 "cssproperties.gperf"
+      {"padding-left", CSS_PROP_PADDING_LEFT},
+      {"scrollbar-track-color", CSS_PROP_SCROLLBAR_TRACK_COLOR},
       {"width", CSS_PROP_WIDTH},
-#line 89 "cssproperties.gperf"
-      {"min-width", CSS_PROP_MIN_WIDTH},
-#line 156 "cssproperties.gperf"
+      {"margin-left", CSS_PROP_MARGIN_LEFT},
+      {"-apple-dashboard-region", CSS_PROP__APPLE_DASHBOARD_REGION},
+      {"-khtml-padding-start", CSS_PROP__KHTML_PADDING_START},
+      {"background-image", CSS_PROP_BACKGROUND_IMAGE},
+      {"text-overline-mode", CSS_PROP_TEXT_OVERLINE_MODE},
+      {"background-position", CSS_PROP_BACKGROUND_POSITION},
+      {"-khtml-margin-start", CSS_PROP__KHTML_MARGIN_START},
+      {"-khtml-box-direction", CSS_PROP__KHTML_BOX_DIRECTION},
       {"border-width", CSS_PROP_BORDER_WIDTH},
-#line 31 "cssproperties.gperf"
-      {"border-top-width", CSS_PROP_BORDER_TOP_WIDTH},
-#line 53 "cssproperties.gperf"
-      {"display", CSS_PROP_DISPLAY},
-#line 33 "cssproperties.gperf"
-      {"border-bottom-width", CSS_PROP_BORDER_BOTTOM_WIDTH},
-#line 58 "cssproperties.gperf"
+      {"outline-width", CSS_PROP_OUTLINE_WIDTH},
+      {"page-break-after", CSS_PROP_PAGE_BREAK_AFTER},
+      {"-khtml-marquee-direction", CSS_PROP__KHTML_MARQUEE_DIRECTION},
+      {"table-layout", CSS_PROP_TABLE_LAYOUT},
       {"-khtml-font-size-delta", CSS_PROP__KHTML_FONT_SIZE_DELTA},
-#line 168 "cssproperties.gperf"
-      {"scrollbar-arrow-color", CSS_PROP_SCROLLBAR_ARROW_COLOR},
-#line 54 "cssproperties.gperf"
-      {"empty-cells", CSS_PROP_EMPTY_CELLS},
-#line 151 "cssproperties.gperf"
+      {"page-break-before", CSS_PROP_PAGE_BREAK_BEFORE},
+      {"-khtml-marquee-repetition", CSS_PROP__KHTML_MARQUEE_REPETITION},
       {"border-style", CSS_PROP_BORDER_STYLE},
-#line 27 "cssproperties.gperf"
-      {"border-top-style", CSS_PROP_BORDER_TOP_STYLE},
-#line 115 "cssproperties.gperf"
-      {"text-line-through", CSS_PROP_TEXT_LINE_THROUGH},
-#line 29 "cssproperties.gperf"
-      {"border-bottom-style", CSS_PROP_BORDER_BOTTOM_STYLE},
-#line 142 "cssproperties.gperf"
-      {"white-space", CSS_PROP_WHITE_SPACE},
-#line 146 "cssproperties.gperf"
-      {"word-spacing", CSS_PROP_WORD_SPACING},
-#line 116 "cssproperties.gperf"
-      {"text-line-through-color", CSS_PROP_TEXT_LINE_THROUGH_COLOR},
-#line 41 "cssproperties.gperf"
-      {"-khtml-box-ordinal-group", CSS_PROP__KHTML_BOX_ORDINAL_GROUP},
-#line 117 "cssproperties.gperf"
-      {"text-line-through-mode", CSS_PROP_TEXT_LINE_THROUGH_MODE},
-#line 158 "cssproperties.gperf"
-      {"list-style", CSS_PROP_LIST_STYLE},
-#line 16 "cssproperties.gperf"
-      {"background-position-x", CSS_PROP_BACKGROUND_POSITION_X},
-#line 32 "cssproperties.gperf"
+      {"outline-style", CSS_PROP_OUTLINE_STYLE},
+      {"background-attachment", CSS_PROP_BACKGROUND_ATTACHMENT},
       {"border-right-width", CSS_PROP_BORDER_RIGHT_WIDTH},
-#line 141 "cssproperties.gperf"
-      {"visibility", CSS_PROP_VISIBILITY},
-#line 133 "cssproperties.gperf"
+      {"outline-offset", CSS_PROP_OUTLINE_OFFSET},
+      {"list-style", CSS_PROP_LIST_STYLE},
+      {"-khtml-marquee-speed", CSS_PROP__KHTML_MARQUEE_SPEED},
       {"-apple-text-size-adjust", CSS_PROP__APPLE_TEXT_SIZE_ADJUST},
-#line 127 "cssproperties.gperf"
-      {"text-transform", CSS_PROP_TEXT_TRANSFORM},
-#line 163 "cssproperties.gperf"
-      {"scrollbar-shadow-color", CSS_PROP_SCROLLBAR_SHADOW_COLOR},
-#line 111 "cssproperties.gperf"
-      {"table-layout", CSS_PROP_TABLE_LAYOUT},
-#line 28 "cssproperties.gperf"
+      {"-khtml-nbsp-mode", CSS_PROP__KHTML_NBSP_MODE},
       {"border-right-style", CSS_PROP_BORDER_RIGHT_STYLE},
-#line 96 "cssproperties.gperf"
-      {"outline-width", CSS_PROP_OUTLINE_WIDTH},
-#line 69 "cssproperties.gperf"
-      {"list-style-position", CSS_PROP_LIST_STYLE_POSITION},
-#line 68 "cssproperties.gperf"
-      {"list-style-image", CSS_PROP_LIST_STYLE_IMAGE},
-#line 166 "cssproperties.gperf"
-      {"scrollbar-darkshadow-color", CSS_PROP_SCROLLBAR_DARKSHADOW_COLOR},
-#line 95 "cssproperties.gperf"
-      {"outline-style", CSS_PROP_OUTLINE_STYLE},
-#line 87 "cssproperties.gperf"
-      {"max-width", CSS_PROP_MAX_WIDTH},
-#line 126 "cssproperties.gperf"
+      {"-khtml-box-ordinal-group", CSS_PROP__KHTML_BOX_ORDINAL_GROUP},
+      {"text-transform", CSS_PROP_TEXT_TRANSFORM},
+      {"background-position-x", CSS_PROP_BACKGROUND_POSITION_X},
+      {"min-width", CSS_PROP_MIN_WIDTH},
+      {"-khtml-box-pack", CSS_PROP__KHTML_BOX_PACK},
+      {"border-top-width", CSS_PROP_BORDER_TOP_WIDTH},
+      {"-khtml-border-horizontal-spacing", CSS_PROP__KHTML_BORDER_HORIZONTAL_SPACING},
+      {"display", CSS_PROP_DISPLAY},
+      {"scrollbar-face-color", CSS_PROP_SCROLLBAR_FACE_COLOR},
+      {"text-underline-width", CSS_PROP_TEXT_UNDERLINE_WIDTH},
       {"text-shadow", CSS_PROP_TEXT_SHADOW},
-#line 17 "cssproperties.gperf"
-      {"background-position-y", CSS_PROP_BACKGROUND_POSITION_Y},
-#line 34 "cssproperties.gperf"
+      {"-khtml-marquee-increment", CSS_PROP__KHTML_MARQUEE_INCREMENT},
+      {"visibility", CSS_PROP_VISIBILITY},
+      {"border-top-style", CSS_PROP_BORDER_TOP_STYLE},
+      {"opacity", CSS_PROP_OPACITY},
+      {"border-bottom-width", CSS_PROP_BORDER_BOTTOM_WIDTH},
+      {"text-line-through-width", CSS_PROP_TEXT_LINE_THROUGH_WIDTH},
+      {"-apple-line-clamp", CSS_PROP__APPLE_LINE_CLAMP},
+      {"text-underline-style", CSS_PROP_TEXT_UNDERLINE_STYLE},
+      {"-khtml-margin-collapse", CSS_PROP__KHTML_MARGIN_COLLAPSE},
       {"border-left-width", CSS_PROP_BORDER_LEFT_WIDTH},
-#line 60 "cssproperties.gperf"
+      {"border-bottom-style", CSS_PROP_BORDER_BOTTOM_STYLE},
+      {"-khtml-box-flex", CSS_PROP__KHTML_BOX_FLEX},
+      {"text-line-through-style", CSS_PROP_TEXT_LINE_THROUGH_STYLE},
       {"font-style", CSS_PROP_FONT_STYLE},
-#line 94 "cssproperties.gperf"
-      {"outline-offset", CSS_PROP_OUTLINE_OFFSET},
-#line 97 "cssproperties.gperf"
-      {"overflow", CSS_PROP_OVERFLOW},
-#line 62 "cssproperties.gperf"
       {"font-weight", CSS_PROP_FONT_WEIGHT},
-#line 30 "cssproperties.gperf"
-      {"border-left-style", CSS_PROP_BORDER_LEFT_STYLE},
-#line 125 "cssproperties.gperf"
+      {"max-width", CSS_PROP_MAX_WIDTH},
+      {"white-space", CSS_PROP_WHITE_SPACE},
       {"text-overline-width", CSS_PROP_TEXT_OVERLINE_WIDTH},
-#line 38 "cssproperties.gperf"
-      {"-khtml-box-flex", CSS_PROP__KHTML_BOX_FLEX},
-#line 145 "cssproperties.gperf"
-      {"word-wrap", CSS_PROP_WORD_WRAP},
-#line 124 "cssproperties.gperf"
+      {"list-style-image", CSS_PROP_LIST_STYLE_IMAGE},
+      {"scrollbar-arrow-color", CSS_PROP_SCROLLBAR_ARROW_COLOR},
+      {"border-left-style", CSS_PROP_BORDER_LEFT_STYLE},
+      {"list-style-position", CSS_PROP_LIST_STYLE_POSITION},
       {"text-overline-style", CSS_PROP_TEXT_OVERLINE_STYLE},
-#line 85 "cssproperties.gperf"
+      {"word-spacing", CSS_PROP_WORD_SPACING},
+      {"overflow", CSS_PROP_OVERFLOW},
+      {"scrollbar-shadow-color", CSS_PROP_SCROLLBAR_SHADOW_COLOR},
+      {"-khtml-border-vertical-spacing", CSS_PROP__KHTML_BORDER_VERTICAL_SPACING},
+      {"-khtml-margin-top-collapse", CSS_PROP__KHTML_MARGIN_TOP_COLLAPSE},
+      {"scrollbar-darkshadow-color", CSS_PROP_SCROLLBAR_DARKSHADOW_COLOR},
       {"-khtml-marquee-style", CSS_PROP__KHTML_MARQUEE_STYLE},
-#line 132 "cssproperties.gperf"
-      {"text-underline-width", CSS_PROP_TEXT_UNDERLINE_WIDTH},
-#line 143 "cssproperties.gperf"
+      {"empty-cells", CSS_PROP_EMPTY_CELLS},
+      {"-khtml-margin-bottom-collapse", CSS_PROP__KHTML_MARGIN_BOTTOM_COLLAPSE},
+      {"background-position-y", CSS_PROP_BACKGROUND_POSITION_Y},
+      {"-khtml-box-flex-group", CSS_PROP__KHTML_BOX_FLEX_GROUP},
       {"widows", CSS_PROP_WIDOWS},
-#line 131 "cssproperties.gperf"
-      {"text-underline-style", CSS_PROP_TEXT_UNDERLINE_STYLE},
-#line 119 "cssproperties.gperf"
-      {"text-line-through-width", CSS_PROP_TEXT_LINE_THROUGH_WIDTH},
-#line 56 "cssproperties.gperf"
+      {"text-overflow", CSS_PROP_TEXT_OVERFLOW},
+      {"word-wrap", CSS_PROP_WORD_WRAP},
       {"font-family", CSS_PROP_FONT_FAMILY},
-#line 70 "cssproperties.gperf"
-      {"list-style-type", CSS_PROP_LIST_STYLE_TYPE},
-#line 138 "cssproperties.gperf"
       {"-khtml-user-modify", CSS_PROP__KHTML_USER_MODIFY},
-#line 118 "cssproperties.gperf"
-      {"text-line-through-style", CSS_PROP_TEXT_LINE_THROUGH_STYLE},
-#line 120 "cssproperties.gperf"
-      {"text-overflow", CSS_PROP_TEXT_OVERFLOW},
-#line 39 "cssproperties.gperf"
-      {"-khtml-box-flex-group", CSS_PROP__KHTML_BOX_FLEX_GROUP}
+      {"-khtml-text-decorations-in-effect", CSS_PROP__KHTML_TEXT_DECORATIONS_IN_EFFECT},
+      {"list-style-type", CSS_PROP_LIST_STYLE_TYPE}
     };
 
   static const short lookup[] =
     {
-       -1,  -1,  -1,   0,   1,   2,   3,  -1,  -1,  -1,
-        4,   5,   6,  -1,   7,   8,  -1,   9,  10,  -1,
-       -1,  11,  -1,  -1,  12,  -1,  -1,  13,  -1,  -1,
-       -1,  14,  15,  16,  17,  18,  19,  -1,  20,  21,
-       -1,  -1,  22,  -1,  -1,  23,  -1,  24,  -1,  25,
-       26,  -1,  -1,  -1,  -1,  -1,  -1,  27,  -1,  -1,
-       -1,  -1,  -1,  28,  -1,  -1,  29,  -1,  -1,  30,
-       31,  32,  -1,  -1,  33,  -1,  34,  35,  36,  37,
-       -1,  -1,  38,  -1,  39,  -1,  40,  41,  42,  -1,
-       -1,  -1,  43,  44,  -1,  -1,  -1,  -1,  45,  -1,
-       -1,  46,  47,  -1,  -1,  -1,  -1,  48,  -1,  49,
-       50,  -1,  -1,  -1,  -1,  -1,  -1,  51,  -1,  -1,
-       -1,  52,  -1,  53,  54,  -1,  -1,  -1,  -1,  -1,
-       55,  56,  -1,  -1,  -1,  57,  58,  59,  -1,  60,
-       61,  -1,  -1,  -1,  62,  63,  -1,  64,  -1,  -1,
-       65,  66,  -1,  -1,  -1,  -1,  67,  68,  -1,  -1,
-       -1,  69,  70,  -1,  71,  -1,  72,  -1,  -1,  -1,
-       73,  -1,  74,  -1,  -1,  75,  76,  77,  78,  79,
-       80,  81,  -1,  -1,  82,  83,  -1,  84,  85,  86,
-       87,  88,  89,  90,  91,  -1,  92,  -1,  -1,  93,
-       94,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  95,
-       -1,  -1,  -1,  -1,  -1,  96,  97,  98,  -1,  99,
-      100,  -1, 101,  -1,  -1, 102,  -1,  -1,  -1, 103,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1, 104,  -1,  -1,
-       -1, 105, 106,  -1, 107,  -1,  -1, 108,  -1,  -1,
-       -1, 109,  -1,  -1,  -1,  -1, 110, 111,  -1,  -1,
-       -1, 112, 113,  -1, 114,  -1, 115, 116, 117, 118,
-       -1,  -1, 119,  -1,  -1, 120, 121,  -1,  -1,  -1,
-       -1,  -1,  -1, 122,  -1, 123,  -1,  -1, 124, 125,
-       -1,  -1, 126,  -1,  -1,  -1,  -1, 127,  -1,  -1,
-       -1,  -1,  -1, 128,  -1,  -1,  -1,  -1, 129, 130,
-       -1, 131,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1, 132,  -1,  -1,  -1,  -1,  -1,  -1, 133,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 134,
        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1, 135,  -1,  -1,  -1,  -1, 136,  -1,  -1,  -1,
-       -1,  -1, 137,  -1,  -1, 138,  -1,  -1,  -1, 139,
-       -1,  -1,  -1, 140,  -1,  -1, 141,  -1,  -1,  -1,
-       -1,  -1, 142,  -1, 143,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1, 144,  -1,  -1,  -1, 145,
-       -1,  -1,  -1,  -1, 146, 147,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1, 148,  -1,  -1,  -1,  -1,
-       -1, 149,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1, 150,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,   0,   1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,   2,   3,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,   4,  -1,   5,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,   6,   7,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,   8,  -1,  -1,  -1,  -1,
+        9,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  10,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  11,  -1,  -1,  -1,  12,  -1,  -1,
+       -1,  -1,  13,  14,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,  -1,  15,  -1,  -1,
+       16,  17,  18,  -1,  -1,  -1,  19,  -1,  -1,  20,
+       -1,  21,  -1,  -1,  -1,  -1,  -1,  -1,  22,  -1,
+       -1,  -1,  -1,  23,  24,  -1,  -1,  25,  -1,  -1,
+       -1,  -1,  -1,  26,  -1,  27,  -1,  28,  -1,  -1,
+       29,  30,  -1,  -1,  -1,  -1,  -1,  -1,  31,  32,
+       -1,  -1,  33,  -1,  34,  35,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  36,  -1,  -1,  -1,  -1,  -1,
+       37,  -1,  -1,  38,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,  39,  40,  -1,  -1,
+       41,  -1,  42,  -1,  -1,  -1,  43,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  44,  -1,  -1,  -1,  45,  -1,
+       46,  -1,  -1,  -1,  -1,  -1,  47,  -1,  -1,  48,
+       -1,  -1,  49,  -1,  50,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  51,  -1,  -1,  52,  53,  -1,
+       54,  55,  -1,  -1,  -1,  56,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  57,  58,  59,  -1,  60,  -1,
+       -1,  -1,  -1,  -1,  61,  -1,  -1,  -1,  -1,  62,
+       -1,  -1,  63,  -1,  -1,  -1,  -1,  64,  -1,  -1,
+       -1,  -1,  65,  -1,  -1,  -1,  -1,  -1,  -1,  66,
+       -1,  -1,  67,  -1,  68,  -1,  -1,  -1,  -1,  -1,
+       69,  -1,  70,  71,  72,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  73,  74,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  75,  76,  -1,  -1,  -1,  77,  78,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,  79,  -1,  -1,  -1,
+       80,  81,  -1,  82,  -1,  83,  84,  -1,  85,  -1,
+       -1,  -1,  -1,  -1,  86,  -1,  -1,  -1,  -1,  87,
+       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       88,  -1,  -1,  -1,  -1,  -1,  -1,  89,  90,  -1,
+       -1,  91,  -1,  -1,  92,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  93,  -1,  -1,  -1,  -1,  94,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,  -1,  95,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  96,  -1,  97,  98,  -1,
+       -1,  99,  -1, 100,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1, 101, 102,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1, 103,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1, 104,  -1,  -1, 105,  -1,  -1,  -1,
+       -1,  -1,  -1, 106, 107,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 108,
+       -1, 109,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1, 110,  -1,  -1,  -1,  -1,  -1,
+      111, 112, 113,  -1,  -1,  -1,  -1, 114,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1, 115,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1, 116, 117,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1, 118,  -1,  -1,  -1,  -1,  -1,
+      119, 120,  -1,  -1,  -1,  -1,  -1, 121,  -1, 122,
+       -1,  -1,  -1, 123,  -1,  -1,  -1, 124,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1, 125,  -1,  -1,  -1,  -1,
+       -1,  -1, 126,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,  -1, 127,  -1, 128,
+      129,  -1,  -1, 130,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1, 131, 132,  -1,  -1, 133,
+       -1, 134,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 135,
+       -1, 136,  -1,  -1,  -1,  -1, 137, 138,  -1, 139,
        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 151,  -1,
-       -1, 152,  -1,  -1,  -1, 153,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1, 154,  -1,  -1,  -1,  -1, 155,  -1,
-       -1,  -1,  -1, 156,  -1,  -1, 157
+       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 140,
+       -1,  -1,  -1,  -1,  -1,  -1,  -1, 141,  -1,  -1,
+       -1,  -1,  -1, 142,  -1,  -1,  -1, 143,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+      144,  -1,  -1,  -1,  -1,  -1, 145,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1, 146,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+      147,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1, 148,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1, 149,  -1,  -1,  -1,  -1,  -1,
+       -1, 150,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1, 151,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1, 152,  -1,  -1,  -1,
+       -1,  -1,  -1, 153,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1, 154,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1, 155,  -1,  -1,  -1,  -1,  -1,  -1, 156,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1, 157,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       -1,  -1,  -1,  -1,  -1, 158
     };
 
   if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
@@ -593,8 +428,6 @@ findProp (register const char *str, register unsigned int len)
     }
   return 0;
 }
-#line 169 "cssproperties.gperf"
-
 static const char * const propertyList[] = {
 "",
 "background-color", 
@@ -755,6 +588,7 @@ static const char * const propertyList[] = {
 "scrollbar-darkshadow-color", 
 "scrollbar-track-color", 
 "scrollbar-arrow-color", 
+"-khtml-text-decorations-in-effect", 
     0
 };
 DOMString getPropertyName(unsigned short id)
index 724f6c1ff3eecd6ccc15dbe3ece7119e1e998558..2463af2d7d9e3f9fcf3c157cd12c76367ba8897a 100644 (file)
 #define CSS_PROP_SCROLLBAR_DARKSHADOW_COLOR 156
 #define CSS_PROP_SCROLLBAR_TRACK_COLOR 157
 #define CSS_PROP_SCROLLBAR_ARROW_COLOR 158
+#define CSS_PROP__KHTML_TEXT_DECORATIONS_IN_EFFECT 159
 
 #define CSS_PROP_MAX CSS_PROP_Z_INDEX
-#define CSS_PROP_TOTAL 159
+#define CSS_PROP_TOTAL 160
 #endif
 
index 8b535a1dde98cf44f58cfacb3665712f52ab2c00..0250083fea72eb3d074140f2550df8f1e5cf23fd 100644 (file)
@@ -170,3 +170,4 @@ scrollbar-3dlight-color
 scrollbar-darkshadow-color
 scrollbar-track-color
 scrollbar-arrow-color
+-khtml-text-decorations-in-effect
index 2f8082051b6c43f85a2e697d0760cff22f4e36cf..b48406ebb9bc5f02f5e65cdeeefd99a31c75e9cc 100644 (file)
@@ -1,44 +1,13 @@
-/* ANSI-C code produced by gperf version 3.0.1 */
+/* ANSI-C code produced by gperf version 2.7.2 */
 /* Command-line: gperf -L ANSI-C -E -C -n -o -t -k '*' -NfindValue -Hhash_val -Wwordlist_value -D cssvalues.gperf  */
-
-#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
-      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
-      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
-      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
-      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
-      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
-      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
-      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
-      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
-      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
-      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
-      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
-      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
-      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
-      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
-      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
-      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
-      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
-      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
-      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
-      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
-      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
-      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
-/* The character set is not based on ISO-646.  */
-#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
-#endif
-
-#line 1 "cssvalues.gperf"
-
 /* This file is automatically generated from cssvalues.in by makevalues, do not edit */
 /* Copyright 1999 W. Bastian */
 #include "cssvalues.h"
-#line 6 "cssvalues.gperf"
 struct css_value {
     const char *name;
     int id;
 };
-/* maximum key range = 3201, duplicates = 0 */
+/* maximum key range = 2888, duplicates = 1 */
 
 #ifdef __GNUC__
 __inline
@@ -52,100 +21,80 @@ hash_val (register const char *str, register unsigned int len)
 {
   static const unsigned short asso_values[] =
     {
-      3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
-      3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
-      3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
-      3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
-      3201, 3201, 3201, 3201, 3201,  200,  490, 3201,    0,    0,
-       115,  110,   95,   70,   65,   60,   25,   20, 3201, 3201,
-      3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
-      3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
-      3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
-      3201, 3201, 3201, 3201, 3201, 3201, 3201,   60,  265,    5,
-       360,    0,   68,  475,  460,    5,  440,  160,   20,   95,
-        10,   35,  150,  153,    5,   20,    0,   25,    8,    8,
-         3,   68,    5, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
-      3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
-      3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
-      3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
-      3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
-      3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
-      3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
-      3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
-      3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
-      3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
-      3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
-      3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
-      3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
-      3201, 3201, 3201, 3201, 3201, 3201, 3201
+      2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
+      2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
+      2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
+      2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
+      2888, 2888, 2888, 2888, 2888,   15, 2888, 2888,    0,    5,
+        10,   15,   20,   25,   30,   35,   40,    0, 2888, 2888,
+      2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
+      2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
+      2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
+      2888, 2888, 2888, 2888, 2888, 2888, 2888,    0,   28,    3,
+       400,  300,  160,  463,   56,   35,   10,  425,    0,   13,
+        55,    5,    8,   90,   65,   10,    0,  465,  258,  405,
+       450,   80,  250, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
+      2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
+      2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
+      2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
+      2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
+      2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
+      2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
+      2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
+      2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
+      2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
+      2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
+      2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
+      2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
+      2888, 2888, 2888, 2888, 2888, 2888
     };
   register int hval = 0;
 
   switch (len)
     {
       default:
+      case 22:
         hval += asso_values[(unsigned char)str[21]];
-      /*FALLTHROUGH*/
       case 21:
         hval += asso_values[(unsigned char)str[20]];
-      /*FALLTHROUGH*/
       case 20:
         hval += asso_values[(unsigned char)str[19]];
-      /*FALLTHROUGH*/
       case 19:
         hval += asso_values[(unsigned char)str[18]];
-      /*FALLTHROUGH*/
       case 18:
         hval += asso_values[(unsigned char)str[17]];
-      /*FALLTHROUGH*/
       case 17:
         hval += asso_values[(unsigned char)str[16]];
-      /*FALLTHROUGH*/
       case 16:
         hval += asso_values[(unsigned char)str[15]];
-      /*FALLTHROUGH*/
       case 15:
         hval += asso_values[(unsigned char)str[14]];
-      /*FALLTHROUGH*/
       case 14:
         hval += asso_values[(unsigned char)str[13]];
-      /*FALLTHROUGH*/
       case 13:
         hval += asso_values[(unsigned char)str[12]];
-      /*FALLTHROUGH*/
       case 12:
         hval += asso_values[(unsigned char)str[11]];
-      /*FALLTHROUGH*/
       case 11:
         hval += asso_values[(unsigned char)str[10]];
-      /*FALLTHROUGH*/
       case 10:
         hval += asso_values[(unsigned char)str[9]];
-      /*FALLTHROUGH*/
       case 9:
         hval += asso_values[(unsigned char)str[8]];
-      /*FALLTHROUGH*/
       case 8:
         hval += asso_values[(unsigned char)str[7]];
-      /*FALLTHROUGH*/
       case 7:
         hval += asso_values[(unsigned char)str[6]];
-      /*FALLTHROUGH*/
       case 6:
         hval += asso_values[(unsigned char)str[5]];
-      /*FALLTHROUGH*/
       case 5:
         hval += asso_values[(unsigned char)str[4]];
-      /*FALLTHROUGH*/
       case 4:
         hval += asso_values[(unsigned char)str[3]];
-      /*FALLTHROUGH*/
       case 3:
-        hval += asso_values[(unsigned char)str[2]+1];
-      /*FALLTHROUGH*/
+        hval += asso_values[(unsigned char)str[2]];
       case 2:
         hval += asso_values[(unsigned char)str[1]];
-      /*FALLTHROUGH*/
       case 1:
         hval += asso_values[(unsigned char)str[0]];
         break;
@@ -165,878 +114,647 @@ findValue (register const char *str, register unsigned int len)
       MIN_WORD_LENGTH = 2,
       MAX_WORD_LENGTH = 22,
       MIN_HASH_VALUE = 0,
-      MAX_HASH_VALUE = 3200
+      MAX_HASH_VALUE = 2887
     };
 
   static const struct css_value wordlist_value[] =
     {
-#line 36 "cssvalues.gperf"
-      {"100", CSS_VAL_100},
-#line 83 "cssvalues.gperf"
-      {"red", CSS_VAL_RED},
-#line 247 "cssvalues.gperf"
-      {"end", CSS_VAL_END},
-#line 15 "cssvalues.gperf"
-      {"inset", CSS_VAL_INSET},
-#line 55 "cssvalues.gperf"
-      {"wider", CSS_VAL_WIDER},
-#line 44 "cssvalues.gperf"
       {"900", CSS_VAL_900},
-#line 43 "cssvalues.gperf"
+      {"100", CSS_VAL_100},
+      {"200", CSS_VAL_200},
+      {"top", CSS_VAL_TOP},
+      {"300", CSS_VAL_300},
+      {"400", CSS_VAL_400},
+      {"small", CSS_VAL_SMALL},
+      {"500", CSS_VAL_500},
+      {"600", CSS_VAL_600},
+      {"compact", CSS_VAL_COMPACT},
+      {"700", CSS_VAL_700},
       {"800", CSS_VAL_800},
-#line 220 "cssvalues.gperf"
-      {"invert", CSS_VAL_INVERT},
-#line 11 "cssvalues.gperf"
-      {"inherit", CSS_VAL_INHERIT},
-#line 77 "cssvalues.gperf"
-      {"lime", CSS_VAL_LIME},
-#line 248 "cssvalues.gperf"
-      {"reverse", CSS_VAL_REVERSE},
-#line 197 "cssvalues.gperf"
+      {"clip", CSS_VAL_CLIP},
+      {"static", CSS_VAL_STATIC},
+      {"bottom", CSS_VAL_BOTTOM},
+      {"small-caps", CSS_VAL_SMALL_CAPS},
       {"ltr", CSS_VAL_LTR},
-#line 136 "cssvalues.gperf"
-      {"center", CSS_VAL_CENTER},
-#line 222 "cssvalues.gperf"
-      {"level", CSS_VAL_LEVEL},
-#line 126 "cssvalues.gperf"
-      {"sub", CSS_VAL_SUB},
-#line 144 "cssvalues.gperf"
-      {"circle", CSS_VAL_CIRCLE},
-#line 42 "cssvalues.gperf"
-      {"700", CSS_VAL_700},
-#line 225 "cssvalues.gperf"
-      {"lower", CSS_VAL_LOWER},
-#line 41 "cssvalues.gperf"
-      {"600", CSS_VAL_600},
-#line 194 "cssvalues.gperf"
-      {"text", CSS_VAL_TEXT},
-#line 40 "cssvalues.gperf"
-      {"500", CSS_VAL_500},
-#line 243 "cssvalues.gperf"
-      {"underline", CSS_VAL_UNDERLINE},
-#line 276 "cssvalues.gperf"
-      {"wave", CSS_VAL_WAVE},
-#line 13 "cssvalues.gperf"
-      {"none", CSS_VAL_NONE},
-#line 67 "cssvalues.gperf"
-      {"cursive", CSS_VAL_CURSIVE},
-#line 169 "cssvalues.gperf"
-      {"table", CSS_VAL_TABLE},
-#line 269 "cssvalues.gperf"
-      {"intrinsic", CSS_VAL_INTRINSIC},
-#line 39 "cssvalues.gperf"
-      {"400", CSS_VAL_400},
-#line 198 "cssvalues.gperf"
       {"rtl", CSS_VAL_RTL},
-#line 18 "cssvalues.gperf"
-      {"outset", CSS_VAL_OUTSET},
-#line 38 "cssvalues.gperf"
-      {"300", CSS_VAL_300},
-#line 65 "cssvalues.gperf"
-      {"serif", CSS_VAL_SERIF},
-#line 37 "cssvalues.gperf"
-      {"200", CSS_VAL_200},
-#line 250 "cssvalues.gperf"
-      {"vertical", CSS_VAL_VERTICAL},
-#line 237 "cssvalues.gperf"
+      {"italic", CSS_VAL_ITALIC},
+      {"start", CSS_VAL_START},
+      {"crop", CSS_VAL_CROP},
       {"scroll", CSS_VAL_SCROLL},
-#line 163 "cssvalues.gperf"
-      {"inline", CSS_VAL_INLINE},
-#line 261 "cssvalues.gperf"
-      {"fast", CSS_VAL_FAST},
-#line 84 "cssvalues.gperf"
-      {"silver", CSS_VAL_SILVER},
-#line 185 "cssvalues.gperf"
-      {"move", CSS_VAL_MOVE},
-#line 56 "cssvalues.gperf"
-      {"narrower", CSS_VAL_NARROWER},
-#line 181 "cssvalues.gperf"
-      {"auto", CSS_VAL_AUTO},
-#line 79 "cssvalues.gperf"
-      {"navy", CSS_VAL_NAVY},
-#line 201 "cssvalues.gperf"
-      {"lowercase", CSS_VAL_LOWERCASE},
-#line 233 "cssvalues.gperf"
-      {"overline", CSS_VAL_OVERLINE},
-#line 25 "cssvalues.gperf"
-      {"menu", CSS_VAL_MENU},
-#line 108 "cssvalues.gperf"
-      {"menutext", CSS_VAL_MENUTEXT},
-#line 156 "cssvalues.gperf"
-      {"armenian", CSS_VAL_ARMENIAN},
-#line 227 "cssvalues.gperf"
-      {"mix", CSS_VAL_MIX},
-#line 24 "cssvalues.gperf"
-      {"icon", CSS_VAL_ICON},
-#line 236 "cssvalues.gperf"
-      {"relative", CSS_VAL_RELATIVE},
-#line 258 "cssvalues.gperf"
-      {"up", CSS_VAL_UP},
-#line 264 "cssvalues.gperf"
-      {"alternate", CSS_VAL_ALTERNATE},
-#line 130 "cssvalues.gperf"
-      {"top", CSS_VAL_TOP},
-#line 268 "cssvalues.gperf"
-      {"element", CSS_VAL_ELEMENT},
-#line 277 "cssvalues.gperf"
-      {"continuous", CSS_VAL_CONTINUOUS},
-#line 260 "cssvalues.gperf"
-      {"slow", CSS_VAL_SLOW},
-#line 214 "cssvalues.gperf"
+      {"both", CSS_VAL_BOTH},
       {"cross", CSS_VAL_CROSS},
-#line 127 "cssvalues.gperf"
-      {"super", CSS_VAL_SUPER},
-#line 120 "cssvalues.gperf"
-      {"repeat", CSS_VAL_REPEAT},
-#line 48 "cssvalues.gperf"
-      {"medium", CSS_VAL_MEDIUM},
-#line 235 "cssvalues.gperf"
-      {"pre", CSS_VAL_PRE},
-#line 87 "cssvalues.gperf"
-      {"yellow", CSS_VAL_YELLOW},
-#line 206 "cssvalues.gperf"
-      {"always", CSS_VAL_ALWAYS},
-#line 32 "cssvalues.gperf"
+      {"icon", CSS_VAL_ICON},
+      {"caption", CSS_VAL_CAPTION},
       {"normal", CSS_VAL_NORMAL},
-#line 145 "cssvalues.gperf"
-      {"square", CSS_VAL_SQUARE},
-#line 186 "cssvalues.gperf"
-      {"e-resize", CSS_VAL_E_RESIZE},
-#line 78 "cssvalues.gperf"
       {"maroon", CSS_VAL_MAROON},
-#line 193 "cssvalues.gperf"
-      {"w-resize", CSS_VAL_W_RESIZE},
-#line 189 "cssvalues.gperf"
-      {"n-resize", CSS_VAL_N_RESIZE},
-#line 230 "cssvalues.gperf"
-      {"nowrap", CSS_VAL_NOWRAP},
-#line 232 "cssvalues.gperf"
-      {"overlay", CSS_VAL_OVERLAY},
-#line 167 "cssvalues.gperf"
-      {"compact", CSS_VAL_COMPACT},
-#line 23 "cssvalues.gperf"
-      {"caption", CSS_VAL_CAPTION},
-#line 192 "cssvalues.gperf"
-      {"s-resize", CSS_VAL_S_RESIZE},
-#line 99 "cssvalues.gperf"
-      {"captiontext", CSS_VAL_CAPTIONTEXT},
-#line 234 "cssvalues.gperf"
+      {"small-caption", CSS_VAL_SMALL_CAPTION},
+      {"thin", CSS_VAL_THIN},
+      {"initial", CSS_VAL_INITIAL},
+      {"fast", CSS_VAL_FAST},
+      {"scrollbar", CSS_VAL_SCROLLBAR},
       {"portrait", CSS_VAL_PORTRAIT},
-#line 166 "cssvalues.gperf"
-      {"run-in", CSS_VAL_RUN_IN},
-#line 71 "cssvalues.gperf"
-      {"aqua", CSS_VAL_AQUA},
-#line 85 "cssvalues.gperf"
+      {"crosshair", CSS_VAL_CROSSHAIR},
+      {"intrinsic", CSS_VAL_INTRINSIC},
       {"teal", CSS_VAL_TEAL},
-#line 246 "cssvalues.gperf"
-      {"start", CSS_VAL_START},
-#line 73 "cssvalues.gperf"
-      {"blue", CSS_VAL_BLUE},
-#line 240 "cssvalues.gperf"
-      {"static", CSS_VAL_STATIC},
-#line 238 "cssvalues.gperf"
-      {"separate", CSS_VAL_SEPARATE},
-#line 29 "cssvalues.gperf"
-      {"italic", CSS_VAL_ITALIC},
-#line 202 "cssvalues.gperf"
-      {"visible", CSS_VAL_VISIBLE},
-#line 213 "cssvalues.gperf"
-      {"crop", CSS_VAL_CROP},
-#line 68 "cssvalues.gperf"
       {"fantasy", CSS_VAL_FANTASY},
-#line 199 "cssvalues.gperf"
-      {"capitalize", CSS_VAL_CAPITALIZE},
-#line 272 "cssvalues.gperf"
-      {"ellipsis", CSS_VAL_ELLIPSIS},
-#line 165 "cssvalues.gperf"
-      {"list-item", CSS_VAL_LIST_ITEM},
-#line 177 "cssvalues.gperf"
-      {"table-cell", CSS_VAL_TABLE_CELL},
-#line 174 "cssvalues.gperf"
-      {"table-row", CSS_VAL_TABLE_ROW},
-#line 226 "cssvalues.gperf"
-      {"marquee", CSS_VAL_MARQUEE},
-#line 152 "cssvalues.gperf"
-      {"lower-latin", CSS_VAL_LOWER_LATIN},
-#line 124 "cssvalues.gperf"
-      {"baseline", CSS_VAL_BASELINE},
-#line 98 "cssvalues.gperf"
-      {"buttontext", CSS_VAL_BUTTONTEXT},
-#line 82 "cssvalues.gperf"
-      {"purple", CSS_VAL_PURPLE},
-#line 92 "cssvalues.gperf"
-      {"activecaption", CSS_VAL_ACTIVECAPTION},
-#line 143 "cssvalues.gperf"
-      {"disc", CSS_VAL_DISC},
-#line 142 "cssvalues.gperf"
-      {"inside", CSS_VAL_INSIDE},
-#line 203 "cssvalues.gperf"
+      {"space", CSS_VAL_SPACE},
       {"collapse", CSS_VAL_COLLAPSE},
-#line 254 "cssvalues.gperf"
-      {"multiple", CSS_VAL_MULTIPLE},
-#line 46 "cssvalues.gperf"
-      {"x-small", CSS_VAL_X_SMALL},
-#line 270 "cssvalues.gperf"
-      {"min-intrinsic", CSS_VAL_MIN_INTRINSIC},
-#line 208 "cssvalues.gperf"
-      {"below", CSS_VAL_BELOW},
-#line 205 "cssvalues.gperf"
-      {"absolute", CSS_VAL_ABSOLUTE},
-#line 259 "cssvalues.gperf"
-      {"down", CSS_VAL_DOWN},
-#line 251 "cssvalues.gperf"
-      {"inline-axis", CSS_VAL_INLINE_AXIS},
-#line 200 "cssvalues.gperf"
-      {"uppercase", CSS_VAL_UPPERCASE},
-#line 47 "cssvalues.gperf"
-      {"small", CSS_VAL_SMALL},
-#line 121 "cssvalues.gperf"
-      {"repeat-x", CSS_VAL_REPEAT_X},
-#line 224 "cssvalues.gperf"
-      {"loud", CSS_VAL_LOUD},
-#line 53 "cssvalues.gperf"
+      {"table", CSS_VAL_TABLE},
+      {"lime", CSS_VAL_LIME},
+      {"help", CSS_VAL_HELP},
+      {"pre", CSS_VAL_PRE},
       {"smaller", CSS_VAL_SMALLER},
-#line 66 "cssvalues.gperf"
-      {"sans-serif", CSS_VAL_SANS_SERIF},
-#line 69 "cssvalues.gperf"
+      {"navy", CSS_VAL_NAVY},
+      {"ellipsis", CSS_VAL_ELLIPSIS},
       {"monospace", CSS_VAL_MONOSPACE},
-#line 280 "cssvalues.gperf"
-      {"space", CSS_VAL_SPACE},
-#line 109 "cssvalues.gperf"
-      {"scrollbar", CSS_VAL_SCROLLBAR},
-#line 115 "cssvalues.gperf"
-      {"window", CSS_VAL_WINDOW},
-#line 128 "cssvalues.gperf"
-      {"text-top", CSS_VAL_TEXT_TOP},
-#line 117 "cssvalues.gperf"
-      {"windowtext", CSS_VAL_WINDOWTEXT},
-#line 131 "cssvalues.gperf"
-      {"bottom", CSS_VAL_BOTTOM},
-#line 215 "cssvalues.gperf"
-      {"embed", CSS_VAL_EMBED},
-#line 218 "cssvalues.gperf"
-      {"hide", CSS_VAL_HIDE},
-#line 148 "cssvalues.gperf"
-      {"lower-roman", CSS_VAL_LOWER_ROMAN},
-#line 141 "cssvalues.gperf"
-      {"outside", CSS_VAL_OUTSIDE},
-#line 176 "cssvalues.gperf"
-      {"table-column", CSS_VAL_TABLE_COLUMN},
-#line 155 "cssvalues.gperf"
-      {"hebrew", CSS_VAL_HEBREW},
-#line 125 "cssvalues.gperf"
-      {"middle", CSS_VAL_MIDDLE},
-#line 204 "cssvalues.gperf"
-      {"above", CSS_VAL_ABOVE},
-#line 17 "cssvalues.gperf"
-      {"ridge", CSS_VAL_RIDGE},
-#line 122 "cssvalues.gperf"
-      {"repeat-y", CSS_VAL_REPEAT_Y},
-#line 95 "cssvalues.gperf"
-      {"buttonface", CSS_VAL_BUTTONFACE},
-#line 134 "cssvalues.gperf"
-      {"left", CSS_VAL_LEFT},
-#line 216 "cssvalues.gperf"
-      {"fixed", CSS_VAL_FIXED},
-#line 80 "cssvalues.gperf"
-      {"olive", CSS_VAL_OLIVE},
-#line 245 "cssvalues.gperf"
+      {"inset", CSS_VAL_INSET},
+      {"circle", CSS_VAL_CIRCLE},
+      {"list-item", CSS_VAL_LIST_ITEM},
+      {"min-intrinsic", CSS_VAL_MIN_INTRINSIC},
+      {"none", CSS_VAL_NONE},
+      {"slow", CSS_VAL_SLOW},
+      {"bold", CSS_VAL_BOLD},
       {"stretch", CSS_VAL_STRETCH},
-#line 195 "cssvalues.gperf"
       {"wait", CSS_VAL_WAIT},
-#line 262 "cssvalues.gperf"
-      {"infinite", CSS_VAL_INFINITE},
-#line 21 "cssvalues.gperf"
+      {"disc", CSS_VAL_DISC},
+      {"table-caption", CSS_VAL_TABLE_CAPTION},
       {"solid", CSS_VAL_SOLID},
-#line 88 "cssvalues.gperf"
+      {"black", CSS_VAL_BLACK},
+      {"left", CSS_VAL_LEFT},
+      {"block", CSS_VAL_BLOCK},
+      {"pointer", CSS_VAL_POINTER},
+      {"auto", CSS_VAL_AUTO},
+      {"horizontal", CSS_VAL_HORIZONTAL},
+      {"up", CSS_VAL_UP},
+      {"show", CSS_VAL_SHOW},
+      {"inline", CSS_VAL_INLINE},
+      {"x-small", CSS_VAL_X_SMALL},
+      {"always", CSS_VAL_ALWAYS},
+      {"mix", CSS_VAL_MIX},
+      {"sub", CSS_VAL_SUB},
+      {"hand", CSS_VAL_HAND},
+      {"thick", CSS_VAL_THICK},
+      {"armenian", CSS_VAL_ARMENIAN},
+      {"nowrap", CSS_VAL_NOWRAP},
+      {"blink", CSS_VAL_BLINK},
+      {"inherit", CSS_VAL_INHERIT},
+      {"aqua", CSS_VAL_AQUA},
       {"transparent", CSS_VAL_TRANSPARENT},
-#line 107 "cssvalues.gperf"
-      {"infotext", CSS_VAL_INFOTEXT},
-#line 187 "cssvalues.gperf"
-      {"ne-resize", CSS_VAL_NE_RESIZE},
-#line 12 "cssvalues.gperf"
-      {"initial", CSS_VAL_INITIAL},
-#line 188 "cssvalues.gperf"
-      {"nw-resize", CSS_VAL_NW_RESIZE},
-#line 190 "cssvalues.gperf"
-      {"se-resize", CSS_VAL_SE_RESIZE},
-#line 178 "cssvalues.gperf"
-      {"table-caption", CSS_VAL_TABLE_CAPTION},
-#line 191 "cssvalues.gperf"
-      {"sw-resize", CSS_VAL_SW_RESIZE},
-#line 253 "cssvalues.gperf"
-      {"single", CSS_VAL_SINGLE},
-#line 76 "cssvalues.gperf"
-      {"green", CSS_VAL_GREEN},
-#line 265 "cssvalues.gperf"
-      {"unfurl", CSS_VAL_UNFURL},
-#line 104 "cssvalues.gperf"
+      {"serif", CSS_VAL_SERIF},
+      {"move", CSS_VAL_MOVE},
+      {"above", CSS_VAL_ABOVE},
+      {"status-bar", CSS_VAL_STATUS_BAR},
+      {"olive", CSS_VAL_OLIVE},
+      {"gray", CSS_VAL_GRAY},
+      {"right", CSS_VAL_RIGHT},
+      {"capitalize", CSS_VAL_CAPITALIZE},
+      {"table-cell", CSS_VAL_TABLE_CELL},
+      {"sans-serif", CSS_VAL_SANS_SERIF},
+      {"vertical", CSS_VAL_VERTICAL},
+      {"visible", CSS_VAL_VISIBLE},
+      {"silver", CSS_VAL_SILVER},
+      {"repeat", CSS_VAL_REPEAT},
+      {"hiragana", CSS_VAL_HIRAGANA},
+      {"infinite", CSS_VAL_INFINITE},
+      {"separate", CSS_VAL_SEPARATE},
+      {"run-in", CSS_VAL_RUN_IN},
+      {"avoid", CSS_VAL_AVOID},
+      {"activecaption", CSS_VAL_ACTIVECAPTION},
+      {"overlay", CSS_VAL_OVERLAY},
+      {"invert", CSS_VAL_INVERT},
+      {"alternate", CSS_VAL_ALTERNATE},
+      {"center", CSS_VAL_CENTER},
+      {"baseline", CSS_VAL_BASELINE},
+      {"fuchsia", CSS_VAL_FUCHSIA},
+      {"below", CSS_VAL_BELOW},
+      {"slide", CSS_VAL_SLIDE},
+      {"no-repeat", CSS_VAL_NO_REPEAT},
+      {"text", CSS_VAL_TEXT},
+      {"decimal", CSS_VAL_DECIMAL},
+      {"end", CSS_VAL_END},
+      {"ahead", CSS_VAL_AHEAD},
+      {"justify", CSS_VAL_JUSTIFY},
+      {"red", CSS_VAL_RED},
+      {"repeat-y", CSS_VAL_REPEAT_Y},
+      {"lower", CSS_VAL_LOWER},
+      {"landscape", CSS_VAL_LANDSCAPE},
+      {"text-top", CSS_VAL_TEXT_TOP},
+      {"outset", CSS_VAL_OUTSET},
+      {"yellow", CSS_VAL_YELLOW},
+      {"hide", CSS_VAL_HIDE},
       {"inactivecaption", CSS_VAL_INACTIVECAPTION},
-#line 105 "cssvalues.gperf"
-      {"inactivecaptiontext", CSS_VAL_INACTIVECAPTIONTEXT},
-#line 49 "cssvalues.gperf"
+      {"blue", CSS_VAL_BLUE},
+      {"white", CSS_VAL_WHITE},
+      {"bolder", CSS_VAL_BOLDER},
+      {"absolute", CSS_VAL_ABSOLUTE},
+      {"text-bottom", CSS_VAL_TEXT_BOTTOM},
+      {"table-row", CSS_VAL_TABLE_ROW},
+      {"multiple", CSS_VAL_MULTIPLE},
+      {"inline-table", CSS_VAL_INLINE_TABLE},
       {"large", CSS_VAL_LARGE},
-#line 255 "cssvalues.gperf"
-      {"forwards", CSS_VAL_FORWARDS},
-#line 30 "cssvalues.gperf"
-      {"oblique", CSS_VAL_OBLIQUE},
-#line 54 "cssvalues.gperf"
+      {"menu", CSS_VAL_MENU},
+      {"inside", CSS_VAL_INSIDE},
+      {"purple", CSS_VAL_PURPLE},
+      {"super", CSS_VAL_SUPER},
+      {"hiragana-iroha", CSS_VAL_HIRAGANA_IROHA},
+      {"lower-alpha", CSS_VAL_LOWER_ALPHA},
+      {"captiontext", CSS_VAL_CAPTIONTEXT},
+      {"level", CSS_VAL_LEVEL},
+      {"single", CSS_VAL_SINGLE},
+      {"down", CSS_VAL_DOWN},
+      {"loud", CSS_VAL_LOUD},
+      {"lower-latin", CSS_VAL_LOWER_LATIN},
+      {"table-column", CSS_VAL_TABLE_COLUMN},
+      {"dot-dash", CSS_VAL_DOT_DASH},
+      {"orange", CSS_VAL_ORANGE},
       {"larger", CSS_VAL_LARGER},
-#line 207 "cssvalues.gperf"
-      {"avoid", CSS_VAL_AVOID},
-#line 160 "cssvalues.gperf"
       {"katakana", CSS_VAL_KATAKANA},
-#line 164 "cssvalues.gperf"
-      {"block", CSS_VAL_BLOCK},
-#line 137 "cssvalues.gperf"
-      {"justify", CSS_VAL_JUSTIFY},
-#line 212 "cssvalues.gperf"
-      {"close-quote", CSS_VAL_CLOSE_QUOTE},
-#line 271 "cssvalues.gperf"
-      {"clip", CSS_VAL_CLIP},
-#line 118 "cssvalues.gperf"
       {"grey", CSS_VAL_GREY},
-#line 154 "cssvalues.gperf"
-      {"upper-latin", CSS_VAL_UPPER_LATIN},
-#line 239 "cssvalues.gperf"
-      {"show", CSS_VAL_SHOW},
-#line 184 "cssvalues.gperf"
-      {"pointer", CSS_VAL_POINTER},
-#line 249 "cssvalues.gperf"
-      {"horizontal", CSS_VAL_HORIZONTAL},
-#line 170 "cssvalues.gperf"
-      {"inline-table", CSS_VAL_INLINE_TABLE},
-#line 16 "cssvalues.gperf"
-      {"groove", CSS_VAL_GROOVE},
-#line 231 "cssvalues.gperf"
-      {"open-quote", CSS_VAL_OPEN_QUOTE},
-#line 116 "cssvalues.gperf"
-      {"windowframe", CSS_VAL_WINDOWFRAME},
-#line 119 "cssvalues.gperf"
-      {"-khtml-text", CSS_VAL__KHTML_TEXT},
-#line 22 "cssvalues.gperf"
-      {"double", CSS_VAL_DOUBLE},
-#line 129 "cssvalues.gperf"
-      {"text-bottom", CSS_VAL_TEXT_BOTTOM},
-#line 140 "cssvalues.gperf"
-      {"-khtml-center", CSS_VAL__KHTML_CENTER},
-#line 196 "cssvalues.gperf"
-      {"help", CSS_VAL_HELP},
-#line 221 "cssvalues.gperf"
-      {"landscape", CSS_VAL_LANDSCAPE},
-#line 45 "cssvalues.gperf"
+      {"discard", CSS_VAL_DISCARD},
+      {"lighter", CSS_VAL_LIGHTER},
+      {"read-only", CSS_VAL_READ_ONLY},
+      {"oblique", CSS_VAL_OBLIQUE},
+      {"upper-alpha", CSS_VAL_UPPER_ALPHA},
+      {"lower-roman", CSS_VAL_LOWER_ROMAN},
+      {"square", CSS_VAL_SQUARE},
       {"xx-small", CSS_VAL_XX_SMALL},
-#line 72 "cssvalues.gperf"
-      {"black", CSS_VAL_BLACK},
-#line 182 "cssvalues.gperf"
-      {"crosshair", CSS_VAL_CROSSHAIR},
-#line 149 "cssvalues.gperf"
-      {"upper-roman", CSS_VAL_UPPER_ROMAN},
-#line 123 "cssvalues.gperf"
-      {"no-repeat", CSS_VAL_NO_REPEAT},
-#line 33 "cssvalues.gperf"
-      {"bold", CSS_VAL_BOLD},
-#line 34 "cssvalues.gperf"
-      {"bolder", CSS_VAL_BOLDER},
-#line 138 "cssvalues.gperf"
+      {"upper-latin", CSS_VAL_UPPER_LATIN},
+      {"inline-block", CSS_VAL_INLINE_BLOCK},
+      {"relative", CSS_VAL_RELATIVE},
+      {"narrower", CSS_VAL_NARROWER},
+      {"wave", CSS_VAL_WAVE},
+      {"element", CSS_VAL_ELEMENT},
+      {"block-axis", CSS_VAL_BLOCK_AXIS},
+      {"higher", CSS_VAL_HIGHER},
       {"-khtml-left", CSS_VAL__KHTML_LEFT},
-#line 91 "cssvalues.gperf"
-      {"activeborder", CSS_VAL_ACTIVEBORDER},
-#line 19 "cssvalues.gperf"
-      {"dotted", CSS_VAL_DOTTED},
-#line 211 "cssvalues.gperf"
-      {"both", CSS_VAL_BOTH},
-#line 81 "cssvalues.gperf"
-      {"orange", CSS_VAL_ORANGE},
-#line 273 "cssvalues.gperf"
-      {"discard", CSS_VAL_DISCARD},
-#line 133 "cssvalues.gperf"
+      {"s-resize", CSS_VAL_S_RESIZE},
+      {"inline-axis", CSS_VAL_INLINE_AXIS},
       {"-khtml-auto", CSS_VAL__KHTML_AUTO},
-#line 93 "cssvalues.gperf"
+      {"upper-roman", CSS_VAL_UPPER_ROMAN},
+      {"infotext", CSS_VAL_INFOTEXT},
+      {"-khtml-box", CSS_VAL__KHTML_BOX},
+      {"buttonface", CSS_VAL_BUTTONFACE},
+      {"overline", CSS_VAL_OVERLINE},
+      {"n-resize", CSS_VAL_N_RESIZE},
+      {"-khtml-body", CSS_VAL__KHTML_BODY},
+      {"-khtml-link", CSS_VAL__KHTML_LINK},
+      {"embed", CSS_VAL_EMBED},
+      {"-khtml-nowrap", CSS_VAL__KHTML_NOWRAP},
+      {"katakana-iroha", CSS_VAL_KATAKANA_IROHA},
+      {"lowercase", CSS_VAL_LOWERCASE},
+      {"groove", CSS_VAL_GROOVE},
+      {"continuous", CSS_VAL_CONTINUOUS},
+      {"dotted", CSS_VAL_DOTTED},
+      {"forwards", CSS_VAL_FORWARDS},
+      {"cursive", CSS_VAL_CURSIVE},
+      {"repeat-x", CSS_VAL_REPEAT_X},
+      {"-khtml-right", CSS_VAL__KHTML_RIGHT},
+      {"middle", CSS_VAL_MIDDLE},
+      {"hebrew", CSS_VAL_HEBREW},
+      {"uppercase", CSS_VAL_UPPERCASE},
+      {"highlight", CSS_VAL_HIGHLIGHT},
+      {"dashed", CSS_VAL_DASHED},
+      {"green", CSS_VAL_GREEN},
+      {"close-quote", CSS_VAL_CLOSE_QUOTE},
+      {"double", CSS_VAL_DOUBLE},
+      {"wider", CSS_VAL_WIDER},
+      {"unfurl", CSS_VAL_UNFURL},
+      {"outside", CSS_VAL_OUTSIDE},
+      {"medium", CSS_VAL_MEDIUM},
+      {"marquee", CSS_VAL_MARQUEE},
       {"appworkspace", CSS_VAL_APPWORKSPACE},
-#line 168 "cssvalues.gperf"
-      {"inline-block", CSS_VAL_INLINE_BLOCK},
-#line 75 "cssvalues.gperf"
-      {"gray", CSS_VAL_GRAY},
-#line 100 "cssvalues.gperf"
-      {"graytext", CSS_VAL_GRAYTEXT},
-#line 59 "cssvalues.gperf"
-      {"condensed", CSS_VAL_CONDENSED},
-#line 14 "cssvalues.gperf"
+      {"open-quote", CSS_VAL_OPEN_QUOTE},
       {"hidden", CSS_VAL_HIDDEN},
-#line 50 "cssvalues.gperf"
+      {"-khtml-center", CSS_VAL__KHTML_CENTER},
+      {"ridge", CSS_VAL_RIDGE},
+      {"no-close-quote", CSS_VAL_NO_CLOSE_QUOTE},
+      {"-khtml-text", CSS_VAL__KHTML_TEXT},
+      {"e-resize", CSS_VAL_E_RESIZE},
+      {"se-resize", CSS_VAL_SE_RESIZE},
       {"x-large", CSS_VAL_X_LARGE},
-#line 263 "cssvalues.gperf"
-      {"slide", CSS_VAL_SLIDE},
-#line 267 "cssvalues.gperf"
-      {"read-write", CSS_VAL_READ_WRITE},
-#line 31 "cssvalues.gperf"
-      {"small-caps", CSS_VAL_SMALL_CAPS},
-#line 28 "cssvalues.gperf"
-      {"status-bar", CSS_VAL_STATUS_BAR},
-#line 89 "cssvalues.gperf"
-      {"-khtml-link", CSS_VAL__KHTML_LINK},
-#line 27 "cssvalues.gperf"
-      {"small-caption", CSS_VAL_SMALL_CAPTION},
-#line 252 "cssvalues.gperf"
-      {"block-axis", CSS_VAL_BLOCK_AXIS},
-#line 209 "cssvalues.gperf"
-      {"bidi-override", CSS_VAL_BIDI_OVERRIDE},
-#line 210 "cssvalues.gperf"
-      {"blink", CSS_VAL_BLINK},
-#line 146 "cssvalues.gperf"
-      {"decimal", CSS_VAL_DECIMAL},
-#line 150 "cssvalues.gperf"
-      {"lower-greek", CSS_VAL_LOWER_GREEK},
-#line 86 "cssvalues.gperf"
-      {"white", CSS_VAL_WHITE},
-#line 242 "cssvalues.gperf"
-      {"thin", CSS_VAL_THIN},
-#line 217 "cssvalues.gperf"
-      {"hand", CSS_VAL_HAND},
-#line 135 "cssvalues.gperf"
-      {"right", CSS_VAL_RIGHT},
-#line 183 "cssvalues.gperf"
+      {"reverse", CSS_VAL_REVERSE},
+      {"buttontext", CSS_VAL_BUTTONTEXT},
+      {"window", CSS_VAL_WINDOW},
+      {"dot-dot-dash", CSS_VAL_DOT_DOT_DASH},
+      {"no-open-quote", CSS_VAL_NO_OPEN_QUOTE},
       {"default", CSS_VAL_DEFAULT},
-#line 62 "cssvalues.gperf"
-      {"expanded", CSS_VAL_EXPANDED},
-#line 244 "cssvalues.gperf"
-      {"-khtml-nowrap", CSS_VAL__KHTML_NOWRAP},
-#line 35 "cssvalues.gperf"
-      {"lighter", CSS_VAL_LIGHTER},
-#line 90 "cssvalues.gperf"
-      {"-khtml-activelink", CSS_VAL__KHTML_ACTIVELINK},
-#line 266 "cssvalues.gperf"
-      {"read-only", CSS_VAL_READ_ONLY},
-#line 103 "cssvalues.gperf"
+      {"ne-resize", CSS_VAL_NE_RESIZE},
+      {"backwards", CSS_VAL_BACKWARDS},
+      {"fixed", CSS_VAL_FIXED},
+      {"graytext", CSS_VAL_GRAYTEXT},
+      {"w-resize", CSS_VAL_W_RESIZE},
+      {"georgian", CSS_VAL_GEORGIAN},
+      {"sw-resize", CSS_VAL_SW_RESIZE},
+      {"buttonshadow", CSS_VAL_BUTTONSHADOW},
+      {"nw-resize", CSS_VAL_NW_RESIZE},
+      {"activeborder", CSS_VAL_ACTIVEBORDER},
+      {"-khtml-inline-box", CSS_VAL__KHTML_INLINE_BOX},
+      {"line-through", CSS_VAL_LINE_THROUGH},
+      {"condensed", CSS_VAL_CONDENSED},
+      {"inactivecaptiontext", CSS_VAL_INACTIVECAPTIONTEXT},
       {"inactiveborder", CSS_VAL_INACTIVEBORDER},
-#line 111 "cssvalues.gperf"
+      {"menutext", CSS_VAL_MENUTEXT},
       {"threedface", CSS_VAL_THREEDFACE},
-#line 179 "cssvalues.gperf"
-      {"-khtml-box", CSS_VAL__KHTML_BOX},
-#line 74 "cssvalues.gperf"
-      {"fuchsia", CSS_VAL_FUCHSIA},
-#line 257 "cssvalues.gperf"
-      {"ahead", CSS_VAL_AHEAD},
-#line 151 "cssvalues.gperf"
-      {"lower-alpha", CSS_VAL_LOWER_ALPHA},
-#line 228 "cssvalues.gperf"
-      {"no-close-quote", CSS_VAL_NO_CLOSE_QUOTE},
-#line 60 "cssvalues.gperf"
-      {"semi-condensed", CSS_VAL_SEMI_CONDENSED},
-#line 51 "cssvalues.gperf"
-      {"xx-large", CSS_VAL_XX_LARGE},
-#line 241 "cssvalues.gperf"
-      {"thick", CSS_VAL_THICK},
-#line 58 "cssvalues.gperf"
-      {"extra-condensed", CSS_VAL_EXTRA_CONDENSED},
-#line 57 "cssvalues.gperf"
-      {"ultra-condensed", CSS_VAL_ULTRA_CONDENSED},
-#line 229 "cssvalues.gperf"
-      {"no-open-quote", CSS_VAL_NO_OPEN_QUOTE},
-#line 159 "cssvalues.gperf"
-      {"hiragana", CSS_VAL_HIRAGANA},
-#line 26 "cssvalues.gperf"
+      {"read-write", CSS_VAL_READ_WRITE},
       {"message-box", CSS_VAL_MESSAGE_BOX},
-#line 279 "cssvalues.gperf"
+      {"skip-white-space", CSS_VAL_SKIP_WHITE_SPACE},
+      {"-khtml-activelink", CSS_VAL__KHTML_ACTIVELINK},
+      {"after-white-space", CSS_VAL_AFTER_WHITE_SPACE},
+      {"underline", CSS_VAL_UNDERLINE},
       {"break-word", CSS_VAL_BREAK_WORD},
-#line 61 "cssvalues.gperf"
-      {"semi-expanded", CSS_VAL_SEMI_EXPANDED},
-#line 157 "cssvalues.gperf"
-      {"georgian", CSS_VAL_GEORGIAN},
-#line 171 "cssvalues.gperf"
+      {"buttonhighlight", CSS_VAL_BUTTONHIGHLIGHT},
+      {"xx-large", CSS_VAL_XX_LARGE},
+      {"cjk-ideographic", CSS_VAL_CJK_IDEOGRAPHIC},
       {"table-row-group", CSS_VAL_TABLE_ROW_GROUP},
-#line 180 "cssvalues.gperf"
-      {"-khtml-inline-box", CSS_VAL__KHTML_INLINE_BOX},
-#line 63 "cssvalues.gperf"
-      {"extra-expanded", CSS_VAL_EXTRA_EXPANDED},
-#line 20 "cssvalues.gperf"
-      {"dashed", CSS_VAL_DASHED},
-#line 281 "cssvalues.gperf"
-      {"after-white-space", CSS_VAL_AFTER_WHITE_SPACE},
-#line 64 "cssvalues.gperf"
-      {"ultra-expanded", CSS_VAL_ULTRA_EXPANDED},
-#line 153 "cssvalues.gperf"
-      {"upper-alpha", CSS_VAL_UPPER_ALPHA},
-#line 256 "cssvalues.gperf"
-      {"backwards", CSS_VAL_BACKWARDS},
-#line 97 "cssvalues.gperf"
-      {"buttonshadow", CSS_VAL_BUTTONSHADOW},
-#line 173 "cssvalues.gperf"
+      {"windowframe", CSS_VAL_WINDOWFRAME},
       {"table-footer-group", CSS_VAL_TABLE_FOOTER_GROUP},
-#line 162 "cssvalues.gperf"
-      {"katakana-iroha", CSS_VAL_KATAKANA_IROHA},
-#line 175 "cssvalues.gperf"
+      {"semi-condensed", CSS_VAL_SEMI_CONDENSED},
       {"table-column-group", CSS_VAL_TABLE_COLUMN_GROUP},
-#line 219 "cssvalues.gperf"
-      {"higher", CSS_VAL_HIGHER},
-#line 70 "cssvalues.gperf"
-      {"-khtml-body", CSS_VAL__KHTML_BODY},
-#line 52 "cssvalues.gperf"
-      {"-khtml-xxx-large", CSS_VAL__KHTML_XXX_LARGE},
-#line 274 "cssvalues.gperf"
-      {"dot-dash", CSS_VAL_DOT_DASH},
-#line 139 "cssvalues.gperf"
-      {"-khtml-right", CSS_VAL__KHTML_RIGHT},
-#line 223 "cssvalues.gperf"
-      {"line-through", CSS_VAL_LINE_THROUGH},
-#line 94 "cssvalues.gperf"
       {"background", CSS_VAL_BACKGROUND},
-#line 114 "cssvalues.gperf"
+      {"expanded", CSS_VAL_EXPANDED},
+      {"highlighttext", CSS_VAL_HIGHLIGHTTEXT},
+      {"bidi-override", CSS_VAL_BIDI_OVERRIDE},
       {"threedshadow", CSS_VAL_THREEDSHADOW},
-#line 278 "cssvalues.gperf"
-      {"skip-white-space", CSS_VAL_SKIP_WHITE_SPACE},
-#line 161 "cssvalues.gperf"
-      {"hiragana-iroha", CSS_VAL_HIRAGANA_IROHA},
-#line 106 "cssvalues.gperf"
+      {"windowtext", CSS_VAL_WINDOWTEXT},
+      {"ultra-condensed", CSS_VAL_ULTRA_CONDENSED},
       {"infobackground", CSS_VAL_INFOBACKGROUND},
-#line 172 "cssvalues.gperf"
-      {"table-header-group", CSS_VAL_TABLE_HEADER_GROUP},
-#line 132 "cssvalues.gperf"
+      {"threedhighlight", CSS_VAL_THREEDHIGHLIGHT},
+      {"semi-expanded", CSS_VAL_SEMI_EXPANDED},
+      {"lower-greek", CSS_VAL_LOWER_GREEK},
+      {"extra-condensed", CSS_VAL_EXTRA_CONDENSED},
       {"-khtml-baseline-middle", CSS_VAL__KHTML_BASELINE_MIDDLE},
-#line 275 "cssvalues.gperf"
-      {"dot-dot-dash", CSS_VAL_DOT_DOT_DASH},
-#line 158 "cssvalues.gperf"
-      {"cjk-ideographic", CSS_VAL_CJK_IDEOGRAPHIC},
-#line 147 "cssvalues.gperf"
-      {"decimal-leading-zero", CSS_VAL_DECIMAL_LEADING_ZERO},
-#line 101 "cssvalues.gperf"
-      {"highlight", CSS_VAL_HIGHLIGHT},
-#line 102 "cssvalues.gperf"
-      {"highlighttext", CSS_VAL_HIGHLIGHTTEXT},
-#line 110 "cssvalues.gperf"
-      {"threeddarkshadow", CSS_VAL_THREEDDARKSHADOW},
-#line 96 "cssvalues.gperf"
-      {"buttonhighlight", CSS_VAL_BUTTONHIGHLIGHT},
-#line 113 "cssvalues.gperf"
+      {"ultra-expanded", CSS_VAL_ULTRA_EXPANDED},
+      {"table-header-group", CSS_VAL_TABLE_HEADER_GROUP},
       {"threedlightshadow", CSS_VAL_THREEDLIGHTSHADOW},
-#line 112 "cssvalues.gperf"
-      {"threedhighlight", CSS_VAL_THREEDHIGHLIGHT}
+      {"decimal-leading-zero", CSS_VAL_DECIMAL_LEADING_ZERO},
+      {"-khtml-xxx-large", CSS_VAL__KHTML_XXX_LARGE},
+      {"extra-expanded", CSS_VAL_EXTRA_EXPANDED},
+      {"threeddarkshadow", CSS_VAL_THREEDDARKSHADOW}
     };
 
   static const short lookup[] =
     {
-        0,  -1,  -1,  -1,  -1,   1,  -1,  -1,  -1,  -1,
-        2,  -1,  -1,  -1,  -1,   3,  -1,  -1,   4,  -1,
-        5,  -1,  -1,  -1,  -1,   6,  -1,  -1,   7,  -1,
-        8,  -1,  -1,  -1,  -1,   9,  -1,  -1,  10,  -1,
-       11,  -1,  -1,  -1,  -1,  12,  -1,  -1,  13,  -1,
-       14,  -1,  -1,  -1,  -1,  15,  -1,  -1,  -1,  -1,
-       16,  -1,  -1,  17,  -1,  18,  -1,  -1,  19,  -1,
-       20,  -1,  -1,  -1,  -1,  21,  22,  -1,  -1,  -1,
-       23,  -1,  -1,  24,  -1,  25,  -1,  -1,  -1,  -1,
-       26,  -1,  -1,  -1,  -1,  27,  -1,  -1,  -1,  -1,
-       28,  -1,  -1,  -1,  -1,  29,  -1,  -1,  -1,  -1,
-       30,  -1,  -1,  31,  -1,  32,  -1,  -1,  33,  -1,
-       34,  -1,  -1,  -1,  -1,  35,  -1,  -1,  36,  -1,
-       -1,  -1,  -1,  37,  -1,  -1,  -1,  -1,  38,  -1,
-       -1,  -1,  -1,  39,  -1,  40,  41,  -1,  42,  -1,
-       -1,  43,  -1,  -1,  -1,  44,  -1,  -1,  45,  -1,
-       46,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  47,  -1,
-       48,  -1,  -1,  49,  -1,  50,  -1,  -1,  -1,  -1,
-       51,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  52,  -1,
-       -1,  -1,  -1,  53,  -1,  54,  -1,  -1,  55,  -1,
-       56,  -1,  -1,  57,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  58,  -1,
-       59,  -1,  -1,  60,  -1,  -1,  61,  -1,  -1,  -1,
-       -1,  62,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       63,  -1,  -1,  -1,  -1,  -1,  64,  -1,  -1,  -1,
-       65,  -1,  -1,  -1,  -1,  66,  -1,  -1,  67,  -1,
-       68,  -1,  -1,  69,  70,  71,  -1,  -1,  72,  -1,
-       73,  74,  -1,  -1,  -1,  75,  -1,  -1,  -1,  -1,
-       76,  77,  -1,  -1,  -1,  78,  -1,  -1,  -1,  -1,
-       79,  -1,  -1,  80,  -1,  81,  -1,  -1,  82,  -1,
-       83,  -1,  -1,  84,  -1,  -1,  -1,  -1,  -1,  -1,
-       85,  86,  -1,  87,  -1,  88,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  89,  -1,  -1,  -1,  -1,
-       90,  -1,  -1,  91,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  92,  -1,  -1,  -1,  -1,  93,  -1,
-       94,  -1,  -1,  95,  -1,  96,  -1,  -1,  97,  -1,
-       98,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       99,  -1,  -1,  -1,  -1, 100,  -1,  -1,  -1,  -1,
-      101,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 102,  -1,
-      103,  -1,  -1, 104,  -1, 105,  -1,  -1, 106,  -1,
-       -1,  -1,  -1, 107,  -1,  -1,  -1,  -1, 108,  -1,
-      109, 110,  -1, 111,  -1, 112,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1, 113,  -1, 114,  -1,  -1,  -1,  -1,
-      115,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-      116, 117,  -1, 118, 119, 120,  -1,  -1,  -1,  -1,
-      121,  -1,  -1,  -1,  -1, 122,  -1,  -1, 123,  -1,
-      124,  -1,  -1,  -1,  -1, 125,  -1,  -1, 126,  -1,
-      127,  -1,  -1, 128,  -1, 129, 130,  -1,  -1,  -1,
-       -1,  -1,  -1, 131,  -1, 132,  -1,  -1,  -1,  -1,
-       -1, 133,  -1, 134,  -1, 135,  -1,  -1, 136,  -1,
-      137,  -1,  -1,  -1,  -1, 138,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1, 139,  -1,  -1, 140,  -1,
-       -1,  -1,  -1,  -1,  -1, 141,  -1,  -1,  -1,  -1,
-      142,  -1,  -1, 143,  -1, 144,  -1,  -1,  -1,  -1,
-      145,  -1,  -1, 146,  -1, 147,  -1,  -1, 148,  -1,
-      149,  -1,  -1, 150,  -1,  -1, 151,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1, 152, 153,  -1, 154,  -1,
-      155,  -1,  -1, 156,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1, 157,  -1,  -1,  -1,  -1,
-      158,  -1,  -1,  -1,  -1,  -1, 159,  -1, 160,  -1,
-       -1,  -1,  -1,  -1,  -1, 161, 162,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 163,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 164,  -1,
-      165,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-      166,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-      167,  -1,  -1, 168,  -1,  -1, 169,  -1,  -1, 170,
-       -1,  -1,  -1, 171,  -1,  -1,  -1,  -1, 172,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 173,  -1,
-      174,  -1,  -1,  -1,  -1, 175,  -1,  -1,  -1,  -1,
-      176, 177,  -1,  -1,  -1, 178,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-      179,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 180,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-      181,  -1,  -1,  -1,  -1, 182,  -1,  -1,  -1,  -1,
-      183,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 184,  -1,
-       -1,  -1,  -1, 185,  -1,  -1,  -1,  -1,  -1,  -1,
-      186,  -1,  -1,  -1,  -1, 187,  -1,  -1,  -1,  -1,
-      188,  -1,  -1,  -1,  -1, 189,  -1,  -1,  -1,  -1,
-      190,  -1,  -1,  -1,  -1,  -1, 191,  -1,  -1,  -1,
-      192,  -1,  -1, 193,  -1,  -1, 194,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1, 195,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1, 196,  -1,  -1, 197,  -1,
-      198,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 199,  -1,
-       -1,  -1,  -1,  -1,  -1, 200,  -1,  -1,  -1,  -1,
-      201,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1, 202,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1, 203,  -1,  -1, 204,  -1,
-       -1,  -1,  -1, 205,  -1, 206,  -1,  -1,  -1,  -1,
-      207,  -1,  -1, 208,  -1,  -1,  -1,  -1, 209,  -1,
-      210,  -1,  -1,  -1,  -1, 211,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-      212,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-      213,  -1,  -1,  -1,  -1,  -1, 214,  -1, 215,  -1,
-      216,  -1,  -1, 217,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1, 218,  -1,  -1,  -1,  -1, 219,  -1,
-       -1,  -1,  -1, 220,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1, 221,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 222,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 223,  -1,
-       -1,  -1,  -1, 224,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 225,  -1,
-       -1,  -1,  -1,  -1,  -1, 226,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1, 227,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1, 228,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1, 229,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1, 230,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1, 231,  -1,  -1,  -1,  -1,  -1,  -1,
-      232,  -1,  -1, 233,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1, 234,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 235,  -1,
-      236,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1, 237,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1, 238,  -1,  -1, 239,  -1,  -1,  -1,
-      240,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1, 241,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 242,  -1,
-       -1,  -1,  -1, 243,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 244,  -1,
-       -1,  -1,  -1, 245,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 246,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-      247,  -1,  -1,  -1,  -1, 248,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-      249,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 250,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 251,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-      252,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1, 253,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-      254,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1, 255,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1, 256,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 257,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1, 258,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1, 259,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-      260,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-      261,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1, 262,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1, 263,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1, 264,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1, 265,  -1,  -1, 266,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 267,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-      268,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1, 269,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-      270
+         0,   -1,   -1,   -1,   -1,    1,   -1,   -1,
+        -1,   -1,    2,   -1,   -1,    3,   -1,    4,
+        -1,   -1,   -1,   -1,    5,   -1,   -1,    6,
+        -1,    7,   -1,   -1,   -1,   -1,    8,   -1,
+         9,   -1,   -1,   10,   -1,   -1,   -1,   -1,
+        11,   -1,   -1,   -1,   -1,   -1,   12,   -1,
+        13,   -1,   -1,   14,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   15,   -1,   -1,   -1,   -1,
+        -1, -338, -255,   -2,   -1,   -1,   -1,   -1,
+        -1,   18,   -1,   19,   -1,   -1,   -1,   -1,
+        -1,   20,   -1,   21,   -1,   -1,   -1,   -1,
+        -1,   22,   -1,   -1,   -1,   23,   -1,   -1,
+        -1,   -1,   24,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   25,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   26,   -1,   -1,   -1,   -1,   27,
+        28,   -1,   29,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        30,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   31,   -1,   -1,   -1,   -1,   -1,
+        32,   -1,   33,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   34,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   35,   -1,   -1,
+        -1,   -1,   -1,   -1,   36,   -1,   -1,   -1,
+        -1,   37,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   38,   -1,   -1,   -1,   -1,   39,   -1,
+        40,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   41,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   42,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   43,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   44,   -1,   -1,   -1,
+        -1,   45,   -1,   -1,   -1,   -1,   46,   47,
+        48,   -1,   -1,   -1,   -1,   -1,   49,   -1,
+        50,   -1,   -1,   51,   -1,   -1,   -1,   52,
+        -1,   -1,   -1,   -1,   53,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   54,   55,   -1,   -1,   -1,   -1,   -1,
+        56,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        57,   58,   59,   -1,   -1,   -1,   -1,   -1,
+        60,   -1,   -1,   -1,   61,   62,   -1,   -1,
+        -1,   -1,   -1,   -1,   63,   -1,   64,   65,
+        -1,   66,   -1,   -1,   67,   -1,   -1,   -1,
+        68,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        69,   -1,   -1,   -1,   -1,   -1,   -1,   70,
+        -1,   -1,   71,   -1,   -1,   -1,   -1,   72,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   73,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   74,
+        -1,   -1,   -1,   75,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   76,   -1,   -1,   -1,   -1,   77,
+        -1,   -1,   78,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   79,   -1,   -1,   80,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   81,   -1,   -1,   -1,   -1,   -1,
+        82,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   83,
+        -1,   84,   -1,   -1,   -1,   -1,   85,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        86,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   87,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   88,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   89,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   90,   91,   -1,   -1,
+        -1,   -1,   92,   -1,   93,   -1,   -1,   -1,
+        -1,   94,   95,   96,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   97,   -1,   -1,   -1,   -1,
+        -1,   -1,   98,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   99,   -1,   -1,   -1,  100,   -1,
+        -1,   -1,   -1,   -1,  101,   -1,   -1,   -1,
+        -1,  102,   -1,   -1,   -1,   -1,   -1,   -1,
+       103,   -1,   -1,  104,   -1,   -1,   -1,   -1,
+       105,  106,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,  107,   -1,   -1,   -1,   -1,   -1,
+        -1,  108,   -1,   -1,  109,   -1,  110,  111,
+        -1,   -1,   -1,  112,  113,   -1,   -1,   -1,
+       114,   -1,   -1,   -1,   -1,  115,   -1,   -1,
+       116,   -1,   -1,   -1,   -1,   -1,   -1,  117,
+       118,   -1,  119,   -1,  120,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,  121,  122,
+       123,  124,   -1,   -1,  125,   -1,  126,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+       127,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+       128,   -1,  129,   -1,   -1,  130,   -1,  131,
+        -1,   -1,   -1,   -1,  132,   -1,   -1,   -1,
+        -1,  133,   -1,  134,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,  135,   -1,
+       136,   -1,  137,   -1,   -1,   -1,  138,   -1,
+       139,   -1,  140,   -1,   -1,   -1,   -1,  141,
+        -1,  142,   -1,   -1,   -1,   -1,  143,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+       144,   -1,   -1,   -1,  145,   -1,  146,   -1,
+       147,   -1,   -1,   -1,   -1,  148,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,  149,   -1,   -1,  150,   -1,   -1,   -1,
+        -1,  151,   -1,   -1,   -1,   -1,   -1,  152,
+       153,   -1,   -1,  154,   -1,  155,   -1,   -1,
+       156,   -1,  157,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,  158,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,  159,
+        -1,   -1,   -1,   -1,  160,   -1,  161,   -1,
+       162,   -1,   -1,  163,   -1,   -1,   -1,   -1,
+       164,   -1,   -1,  165,   -1,   -1,   -1,  166,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+       167,  168,   -1,   -1,   -1,   -1,  169,   -1,
+        -1,   -1,  170,   -1,   -1,   -1,   -1,  171,
+        -1,   -1,   -1,   -1,   -1,  172,   -1,  173,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+       174,   -1,  175,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,  176,   -1,
+        -1,   -1,   -1,   -1,   -1,  177,   -1,  178,
+        -1,  179,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,  180,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,  181,   -1,   -1,   -1,   -1,   -1,   -1,
+       182,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+       183,   -1,  184,   -1,   -1,   -1,   -1,   -1,
+        -1,  185,   -1,   -1,   -1,   -1,  186,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+       187,   -1,  188,   -1,   -1,   -1,   -1,  189,
+        -1,   -1,   -1,   -1,  190,   -1,   -1,   -1,
+        -1,   -1,  191,   -1,   -1,   -1,   -1,  192,
+        -1,   -1,   -1,   -1,  193,   -1,  194,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,  195,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,  196,   -1,   -1,   -1,   -1,  197,   -1,
+        -1,   -1,   -1,   -1,   -1,  198,   -1,   -1,
+        -1,   -1,  199,   -1,   -1,   -1,   -1,  200,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,  201,   -1,   -1,   -1,   -1,   -1,
+        -1,  202,   -1,   -1,   -1,  203,   -1,   -1,
+        -1,   -1,   -1,  204,   -1,   -1,  205,  206,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,  207,
+        -1,   -1,   -1,   -1,  208,   -1,   -1,   -1,
+        -1,   -1,  209,  210,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,  211,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,  212,   -1,   -1,
+        -1,   -1,  213,   -1,   -1,   -1,   -1,  214,
+        -1,  215,  216,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,  217,   -1,
+        -1,   -1,   -1,   -1,   -1,  218,   -1,   -1,
+        -1,   -1,  219,   -1,   -1,   -1,   -1,   -1,
+       220,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,  221,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,  222,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,  223,   -1,   -1,   -1,
+        -1,   -1,  224,   -1,   -1,   -1,  225,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,  226,   -1,   -1,
+        -1,   -1,   -1,  227,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,  228,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,  229,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,  230,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+       231,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,  232,   -1,
+        -1,   -1,   -1,   -1,   -1,  233,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,  234,
+       235,  236,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,  237,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,  238,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,  239,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+       240,   -1,   -1,  241,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,  242,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,  243,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,  244,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,  245,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,  246,
+        -1,   -1,   -1,  247,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,  248,   -1,  249,   -1,   -1,
+        -1,  250,   -1,   -1,   -1,  251,   -1,   -1,
+        -1,  252,  253,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,  254,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,  255,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,  256,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,  257,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,  258,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,  259,  260,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,  261,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,  262,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,  263,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,  264,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,  265,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,  266,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,  267,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,  268,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,  269,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,  270
     };
 
   if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
@@ -1054,12 +772,25 @@ findValue (register const char *str, register unsigned int len)
               if (*str == *s && !strcmp (str + 1, s + 1))
                 return &wordlist_value[index];
             }
+          else if (index < -TOTAL_KEYWORDS)
+            {
+              register int offset = - 1 - TOTAL_KEYWORDS - index;
+              register const struct css_value *wordptr = &wordlist_value[TOTAL_KEYWORDS + lookup[offset]];
+              register const struct css_value *wordendptr = wordptr + -lookup[offset + 1];
+
+              while (wordptr < wordendptr)
+                {
+                  register const char *s = wordptr->name;
+
+                  if (*str == *s && !strcmp (str + 1, s + 1))
+                    return wordptr;
+                  wordptr++;
+                }
+            }
         }
     }
   return 0;
 }
-#line 282 "cssvalues.gperf"
-
 static const char * const valueList[] = {
 "",
 "inherit", 
index 587ed905a12788b93d5c14c8940d13b17747295d..719a356963ef9fcad6feaf6b862a07a727f75161 100644 (file)
@@ -387,7 +387,14 @@ void StyleChange::init(CSSStyleDeclarationImpl *style, const Position &position)
             continue;
 
         // Add this property
-        styleText += property->cssText().string();
+
+        if (property->id() == CSS_PROP__KHTML_TEXT_DECORATIONS_IN_EFFECT) {
+            // we have to special-case text decorations
+            CSSProperty alteredProperty = CSSProperty(CSS_PROP_TEXT_DECORATION, property->value(), property->isImportant());
+            styleText += alteredProperty.cssText().string();
+        } else {
+            styleText += property->cssText().string();
+        }
     }
 
     mutableStyle->deref();
@@ -1340,7 +1347,7 @@ void ApplyStyleCommand::applyInlineStyle(CSSMutableStyleDeclarationImpl *style)
     // to check a computed style
     document()->updateLayout();
 
-    // split the start node and containingelement if the selection starts inside of it
+    // split the start node and containing element if the selection starts inside of it
     bool splitStart = splitTextElementAtStartIfNeeded(start, end); 
     if (splitStart) {
         start = endingSelection().start();
@@ -1487,14 +1494,200 @@ void ApplyStyleCommand::removeBlockStyle(CSSMutableStyleDeclarationImpl *style,
     
 }
 
+static bool hasTextDecorationProperty(NodeImpl *node)
+{
+    if (!node->isElementNode())
+        return false;
+
+    ElementImpl *element = static_cast<ElementImpl *>(node);
+    CSSComputedStyleDeclarationImpl style(element);
+
+    CSSValueImpl *value = style.getPropertyCSSValue(CSS_PROP_TEXT_DECORATION, DoNotUpdateLayout);
+
+    if (value) {
+        value->ref();
+        DOMString valueText(value->cssText());
+        value->deref();
+        if (strcasecmp(valueText,"none") != 0)
+            return true;
+    }
+
+    return false;
+}
+
+static NodeImpl* highestAncestorWithTextDecoration(NodeImpl *node)
+{
+    NodeImpl *result = NULL;
+
+    for (NodeImpl *n = node; n; n = n->parentNode()) {
+        if (hasTextDecorationProperty(n))
+            result = n;
+    }
+
+    return result;
+}
+
+CSSMutableStyleDeclarationImpl *ApplyStyleCommand::extractTextDecorationStyle(NodeImpl *node)
+{
+    ASSERT(node);
+    ASSERT(node->isElementNode());
+    
+    // non-html elements not handled yet
+    if (!node->isHTMLElement())
+        return 0;
+
+    HTMLElementImpl *element = static_cast<HTMLElementImpl *>(node);
+    CSSMutableStyleDeclarationImpl *style = element->inlineStyleDecl();
+    if (!style)
+        return 0;
+
+    style->ref();
+    int properties[1] = { CSS_PROP_TEXT_DECORATION };
+    CSSMutableStyleDeclarationImpl *textDecorationStyle = style->copyPropertiesInSet(properties, 1);
+
+    CSSValueImpl *property = style->getPropertyCSSValue(CSS_PROP_TEXT_DECORATION);
+    if (property && strcasecmp(property->cssText(), "none") != 0) {
+        removeCSSProperty(style, CSS_PROP_TEXT_DECORATION);
+    }
+
+    style->deref();
+
+    return textDecorationStyle;
+}
+
+CSSMutableStyleDeclarationImpl *ApplyStyleCommand::extractAndNegateTextDecorationStyle(NodeImpl *node)
+{
+    ASSERT(node);
+    ASSERT(node->isElementNode());
+    
+    // non-html elements not handled yet
+    if (!node->isHTMLElement())
+        return 0;
+
+    HTMLElementImpl *element = static_cast<HTMLElementImpl *>(node);
+    CSSComputedStyleDeclarationImpl *computedStyle = new CSSComputedStyleDeclarationImpl(element);
+    ASSERT(computedStyle);
+
+    computedStyle->ref();
+
+    int properties[1] = { CSS_PROP_TEXT_DECORATION };
+    CSSMutableStyleDeclarationImpl *textDecorationStyle = computedStyle->copyPropertiesInSet(properties, 1);
+    
+
+    CSSValueImpl *property = computedStyle->getPropertyCSSValue(CSS_PROP_TEXT_DECORATION);
+    if (property && strcasecmp(property->cssText(), "none") != 0) {
+        property->ref();
+        CSSMutableStyleDeclarationImpl *newStyle = textDecorationStyle->copy();
+
+        newStyle->ref();
+        newStyle->setProperty(CSS_PROP_TEXT_DECORATION, "none");
+        applyTextDecorationStyle(node, newStyle);
+        newStyle->deref();
+
+        property->deref();
+    }
+
+    computedStyle->deref();
+
+    return textDecorationStyle;
+}
+
+void ApplyStyleCommand::applyTextDecorationStyle(NodeImpl *node, CSSMutableStyleDeclarationImpl *style)
+{
+    ASSERT(node);
+
+    if (!style || !style->cssText().length())
+        return;
+
+    if (node->isTextNode()) {
+        HTMLElementImpl *styleSpan = static_cast<HTMLElementImpl *>(createStyleSpanElement(document()));
+        insertNodeBefore(styleSpan, node);
+        surroundNodeRangeWithElement(node, node, styleSpan);
+        node = styleSpan;
+    }
+
+    if (!node->isElementNode())
+        return;
+
+    HTMLElementImpl *element = static_cast<HTMLElementImpl *>(node);
+        
+    StyleChange styleChange(style, Position(element, 0), StyleChange::DoNotUseLegacyHTMLStyles);
+    if (styleChange.cssStyle().length() > 0) {
+        DOMString cssText = styleChange.cssStyle();
+        CSSMutableStyleDeclarationImpl *decl = element->inlineStyleDecl();
+        if (decl)
+            cssText += decl->cssText();
+        setNodeAttribute(element, ATTR_STYLE, cssText);
+    }
+}
+
+void ApplyStyleCommand::pushDownTextDecorationStyleAroundNode(NodeImpl *node, const Position &start, const Position &end, bool force)
+{
+    NodeImpl *highestAncestor = highestAncestorWithTextDecoration(node);
+    
+    if (highestAncestor) {
+        NodeImpl *nextCurrent;
+        NodeImpl *nextChild;
+        for (NodeImpl *current = highestAncestor; current != node; current = nextCurrent) {
+            ASSERT(current);
+            
+            nextCurrent = NULL;
+            
+            CSSMutableStyleDeclarationImpl *decoration = force ? extractAndNegateTextDecorationStyle(current) : extractTextDecorationStyle(current);
+            if (decoration)
+                decoration->ref();
+
+            for (NodeImpl *child = current->firstChild(); child; child = nextChild) {
+                nextChild = child->nextSibling();
+
+                if (node == child) {
+                    nextCurrent = child;
+                } else if (node->isAncestor(child)) {
+                    applyTextDecorationStyle(child, decoration);
+                    nextCurrent = child;
+                } else {
+                    applyTextDecorationStyle(child, decoration);
+                }
+            }
+
+            if (decoration)
+                decoration->deref();
+        }
+    }
+}
+
+void ApplyStyleCommand::pushDownTextDecorationStyleAtBoundaries(const Position &start, const Position &end)
+{
+    // We need to work in two passes. First we push down any inline
+    // styles that set text decoration. Then we look for any remaining
+    // styles (caused by stylesheets) and explicitly negate text
+    // decoration while pushing down.
+
+    pushDownTextDecorationStyleAroundNode(start.node(), start, end, false);
+    document()->updateLayout();
+    pushDownTextDecorationStyleAroundNode(start.node(), start, end, true);
+
+    pushDownTextDecorationStyleAroundNode(end.node(), start, end, false);
+    document()->updateLayout();
+    pushDownTextDecorationStyleAroundNode(end.node(), start, end, true);
+}
+
 void ApplyStyleCommand::removeInlineStyle(CSSMutableStyleDeclarationImpl *style, const Position &start, const Position &end)
 {
     ASSERT(start.isNotNull());
     ASSERT(end.isNotNull());
     ASSERT(start.node()->inDocument());
     ASSERT(end.node()->inDocument());
-    ASSERT(RangeImpl::compareBoundaryPoints(start, end) <= 0);
+    ASSERT(RangeImpl::compareBoundaryPoints(start, end) < 0);
     
+    CSSValueImpl *textDecorationSpecialProperty = style->getPropertyCSSValue(CSS_PROP__KHTML_TEXT_DECORATIONS_IN_EFFECT);
+
+    if (textDecorationSpecialProperty) {
+        pushDownTextDecorationStyleAtBoundaries(start.downstream(), end.upstream());
+        style = style->copy();
+        style->setProperty(CSS_PROP_TEXT_DECORATION, textDecorationSpecialProperty->cssText(), style->getPropertyPriority(CSS_PROP__KHTML_TEXT_DECORATIONS_IN_EFFECT));
+    }
+
     NodeImpl *node = start.node();
     while (node) {
         NodeImpl *next = node->traverseNextNode();
@@ -1509,6 +1702,11 @@ void ApplyStyleCommand::removeInlineStyle(CSSMutableStyleDeclarationImpl *style,
             break;
         node = next;
     }
+
+
+    if (textDecorationSpecialProperty) {
+        style->deref();
+    }
 }
 
 bool ApplyStyleCommand::nodeFullySelected(NodeImpl *node, const Position &start, const Position &end) const
@@ -1520,6 +1718,18 @@ bool ApplyStyleCommand::nodeFullySelected(NodeImpl *node, const Position &start,
         RangeImpl::compareBoundaryPoints(pos, end) <= 0;
 }
 
+bool ApplyStyleCommand::nodeFullyUnselected(NodeImpl *node, const Position &start, const Position &end) const
+{
+    ASSERT(node);
+
+    Position pos = Position(node, node->childNodeCount()).upstream();
+    bool isFullyBeforeStart = RangeImpl::compareBoundaryPoints(pos, start) < 0;
+    bool isFullyAfterEnd = RangeImpl::compareBoundaryPoints(node, 0, end.node(), end.offset()) > 0;
+
+    return isFullyBeforeStart || isFullyAfterEnd;
+}
+
+
 //------------------------------------------------------------------------------------------
 // ApplyStyleCommand: style-application helpers
 
index adc5874b5da4aa7df074b7ca9a42f13380d8076b..4d0b3c4e2e4d4d76c629c40f8872443b891eadc2 100644 (file)
@@ -275,7 +275,13 @@ private:
     void removeBlockStyle(DOM::CSSMutableStyleDeclarationImpl *, const DOM::Position &start, const DOM::Position &end);
     void removeInlineStyle(DOM::CSSMutableStyleDeclarationImpl *, const DOM::Position &start, const DOM::Position &end);
     bool nodeFullySelected(DOM::NodeImpl *, const DOM::Position &start, const DOM::Position &end) const;
-
+    bool nodeFullyUnselected(DOM::NodeImpl *node, const DOM::Position &start, const DOM::Position &end) const;
+    DOM::CSSMutableStyleDeclarationImpl *extractTextDecorationStyle(DOM::NodeImpl *node);
+    DOM::CSSMutableStyleDeclarationImpl *extractAndNegateTextDecorationStyle(DOM::NodeImpl *node);
+    void applyTextDecorationStyle(DOM::NodeImpl *node, DOM::CSSMutableStyleDeclarationImpl *style);
+    void pushDownTextDecorationStyleAroundNode(DOM::NodeImpl *node, const DOM::Position &start, const DOM::Position &end, bool force);
+    void pushDownTextDecorationStyleAtBoundaries(const DOM::Position &start, const DOM::Position &end);
+    
     // style-application helpers
     void applyBlockStyle(DOM::CSSMutableStyleDeclarationImpl *);
     void applyRelativeFontStyleChange(DOM::CSSMutableStyleDeclarationImpl *);
index 1d3b658c96ea8240681060a9327618169579beb7..edbf0bfa86a7abd9ab7d7e162ba10dcf1be28a66 100644 (file)
@@ -332,8 +332,8 @@ bool execSuperscript(KHTMLPart *part, bool userInterface, const DOMString &value
 
 bool execUnderline(KHTMLPart *part, bool userInterface, const DOMString &value)
 {
-    bool isUnderlined = selectionStartHasStyle(part, CSS_PROP_TEXT_DECORATION, "underline");
-    return execStyleChange(part, CSS_PROP_TEXT_DECORATION, isUnderlined ? "none" : "underline");
+    bool isUnderlined = selectionStartHasStyle(part, CSS_PROP__KHTML_TEXT_DECORATIONS_IN_EFFECT, "underline");
+    return execStyleChange(part, CSS_PROP__KHTML_TEXT_DECORATIONS_IN_EFFECT, isUnderlined ? "none" : "underline");
 }
 
 bool execUndo(KHTMLPart *part, bool userInterface, const DOMString &value)
index 8cfbde1b1f66a2aeb582860430e5c59133fc7fde..d6a39e534f37807df91ad6c13c40d07113a6c83c 100644 (file)
@@ -113,6 +113,19 @@ void HTMLElementImpl::removeMappedAttributeDecl(MappedAttributeEntry entryType,
     attrValueDict->remove(attrValue.implementation());
 }
 
+void HTMLElementImpl::invalidateStyleAttribute()
+{
+    setStyleAttributeValid(false);
+}
+
+void HTMLElementImpl::updateStyleAttribute()
+{
+    // we need to say teh attribute is valid before setting it to avoid the
+    // possibility of an infinite loop
+    setStyleAttributeValid(true);
+    setAttribute(ATTR_STYLE, getInlineStyleDecl()->cssText());
+}
+
 HTMLAttributeImpl::~HTMLAttributeImpl()
 {
     if (m_styleDecl)
index 52bd57a390c604cb1440c98c74ad997b04b4c74f..214fa16f961f2bf496989d6b0108da83eb206569 100644 (file)
@@ -185,7 +185,10 @@ public:
     static void removeMappedAttributeDecl(MappedAttributeEntry type, NodeImpl::Id attrName, const AtomicString& attrValue);
     static QPtrDict<QPtrDict<QPtrDict<CSSMappedAttributeDeclarationImpl> > >* m_mappedAttributeDecls;
 
+    void invalidateStyleAttribute();
+    void updateStyleAttribute();
 protected:
+
     // for IMG, OBJECT and APPLET
     void addHTMLAlignment(HTMLAttributeImpl* htmlAttr);
 
index 56697ee2b0a9af6540c7d1aea2ef863c211bad2a..41484934bb3d87014c5e4026edf57e6002c8ce50 100644 (file)
@@ -194,6 +194,7 @@ ElementImpl::ElementImpl(DocumentPtr *doc)
 {
     namedAttrMap = 0;
     m_prefix = 0;
+    m_isStyleAttributeValid = true;
 }
 
 ElementImpl::~ElementImpl()
@@ -223,6 +224,21 @@ void ElementImpl::setAttribute(NodeImpl::Id id, const DOMString &value)
     setAttribute(id,value.implementation(),exceptioncode);
 }
 
+void ElementImpl::updateStyleAttributeIfNeeded() const
+{
+    if (!m_isStyleAttributeValid && isHTMLElement()) {
+        static_cast<HTMLElementImpl *>(const_cast<ElementImpl *>(this))->updateStyleAttribute();
+    }
+}
+
+NamedAttrMapImpl* ElementImpl::attributes(bool readonly) const
+{
+    updateStyleAttributeIfNeeded();
+
+    if (!readonly && !namedAttrMap) createAttributeMap();
+    return namedAttrMap;
+}
+
 unsigned short ElementImpl::nodeType() const
 {
     return Node::ELEMENT_NODE;
@@ -240,6 +256,9 @@ const AtomicString& ElementImpl::getIDAttribute() const
 
 const AtomicString& ElementImpl::getAttribute(NodeImpl::Id id) const
 {
+    if (id == ATTR_STYLE)
+        updateStyleAttributeIfNeeded();
+
     if (namedAttrMap) {
         AttributeImpl* a = namedAttrMap->getAttributeItem(id);
         if (a) return a->value();
@@ -320,6 +339,8 @@ void ElementImpl::setAttributeMap( NamedAttrMapImpl* list )
 
 bool ElementImpl::hasAttributes() const
 {
+    updateStyleAttributeIfNeeded();
+
     return namedAttrMap && namedAttrMap->length() > 0;
 }
 
@@ -614,6 +635,7 @@ void ElementImpl::updateId(const AtomicString& oldId, const AtomicString& newId)
 #ifndef NDEBUG
 void ElementImpl::dump(QTextStream *stream, QString ind) const
 {
+    updateStyleAttributeIfNeeded();
     if (namedAttrMap) {
         for (uint i = 0; i < namedAttrMap->length(); i++) {
             AttributeImpl *attr = namedAttrMap->attributeItem(i);
index dbb55ddebdf3289e9b4c47cfb21c2bd81a177bed..fb2ea7b7810a2a8389b731c982636277ad182721 100644 (file)
@@ -181,11 +181,7 @@ public:
     // convenience methods which ignore exceptions
     void setAttribute (NodeImpl::Id id, const DOMString &value);
 
-    NamedAttrMapImpl* attributes(bool readonly = false) const
-    {
-        if (!readonly && !namedAttrMap) createAttributeMap();
-        return namedAttrMap;
-    }
+    NamedAttrMapImpl* attributes(bool readonly = false) const;
 
     // This method is called whenever an attribute is added, changed or removed.
     virtual void attributeChanged(AttributeImpl* attr, bool preserveDecls = false) {}
@@ -233,12 +229,18 @@ protected:
     virtual void createAttributeMap() const;
     DOMString openTagStartToString() const;
 
+    bool isStyleAttributeValid() const { return m_isStyleAttributeValid; }
+    void setStyleAttributeValid(bool valid) { m_isStyleAttributeValid = valid; }
+
 private:
     void updateId(const AtomicString& oldId, const AtomicString& newId);
 
+    void updateStyleAttributeIfNeeded() const;
+
 protected: // member variables
     mutable NamedAttrMapImpl *namedAttrMap;
     DOMStringImpl *m_prefix;
+    bool m_isStyleAttributeValid;
 };
 
 
index e926eddfbd1b64b2bc6e026867fdf2cf0b01e333..0ccdcf6ba4a51bd63536db571d0c256192c53a45 100644 (file)
@@ -1,3 +1,15 @@
+2005-01-26  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Darin, Hyatt and Ken.
+
+       <rdar://problem/3790449> REGRESSION (Mail): underline behavior is flaky because of how CSS handles text-decoration
+
+        * WebView.subproj/WebHTMLView.m:
+        (-[WebHTMLView _styleFromFontAttributes:]): Use new -khtml-text-decorations-in-effect
+       property
+        (-[WebHTMLView _styleForAttributeChange:]): likewise
+        (-[WebHTMLView underline:]): likewise
+
 2005-01-27  Ken Kocienda  <kocienda@apple.com>
 
         Reviewed by Maciej
index 97dda298fe9835ef63302d3b4d6381d9d117e6f7..f279f911743954f83924554eb0a99d50868890b2 100644 (file)
@@ -3419,11 +3419,11 @@ static WebHTMLView *lastHitView = nil;
     int underlineInt = [[dictionary objectForKey:NSUnderlineStyleAttributeName] intValue];
     // FIXME: Underline wins here if we have both (see bug 3790443).
     if (strikethroughInt == NSUnderlineStyleNone && underlineInt == NSUnderlineStyleNone)
-        [style setTextDecoration:@"none"];
+        [style setProperty:@"-khtml-text-decorations-in-effect" :@"none" :@""];
     else if (underlineInt == NSUnderlineStyleNone)
-        [style setTextDecoration:@"line-through"];
+        [style setProperty:@"-khtml-text-decorations-in-effect" :@"line-through" :@""];
     else
-        [style setTextDecoration:@"underline"];
+        [style setProperty:@"-khtml-text-decorations-in-effect" :@"underline" :@""];
 
     return style;
 }
@@ -3681,9 +3681,11 @@ NSStrokeColorAttributeName        /* NSColor, default nil: same as foreground co
     int sb = [[b objectForKey:NSStrikethroughStyleAttributeName] intValue];
     if (sa == sb) {
         if (sa == NSUnderlineStyleNone)
-            [style setTextDecoration:@"none"]; // we really mean "no line-through" rather than "none"
+            [style setProperty:@"-khtml-text-decorations-in-effect" :@"none" :@""]; 
+            // we really mean "no line-through" rather than "none"
         else
-            [style setTextDecoration:@"line-through"]; // we really mean "add line-through" rather than "line-through"
+            [style setProperty:@"-khtml-text-decorations-in-effect" :@"line-through" :@""];
+            // we really mean "add line-through" rather than "line-through"
     }
 
     sa = [[a objectForKey:NSSuperscriptAttributeName] intValue];
@@ -3701,9 +3703,11 @@ NSStrokeColorAttributeName        /* NSColor, default nil: same as foreground co
     int ub = [[b objectForKey:NSUnderlineStyleAttributeName] intValue];
     if (ua == ub) {
         if (ua == NSUnderlineStyleNone)
-            [style setTextDecoration:@"none"]; // we really mean "no underline" rather than "none"
+            [style setProperty:@"-khtml-text-decorations-in-effect" :@"none" :@""];
+            // we really mean "no underline" rather than "none"
         else
-            [style setTextDecoration:@"underline"]; // we really mean "add underline" rather than "underline"
+            [style setProperty:@"-khtml-text-decorations-in-effect" :@"underline" :@""];
+            // we really mean "add underline" rather than "underline"
     }
 
     return style;
@@ -4106,9 +4110,9 @@ NSStrokeColorAttributeName        /* NSColor, default nil: same as foreground co
     // Despite the name, this method is actually supposed to toggle underline.
     // FIXME: This currently clears overline, line-through, and blink as an unwanted side effect.
     DOMCSSStyleDeclaration *style = [self _emptyStyle];
-    [style setTextDecoration:@"underline"];
+    [style setProperty:@"-khtml-text-decorations-in-effect" :@"underline" :@""];
     if ([[self _bridge] selectionStartHasStyle:style])
-        [style setTextDecoration:@"none"];
+        [style setProperty:@"-khtml-text-decorations-in-effect" :@"none" :@""];
     [self _applyStyleToSelection:style withUndoAction:WebUndoActionUnderline];
 }