Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update amphtml spec to 1bbd5505 #5998

Merged
merged 9 commits into from
Mar 20, 2021
Merged

Conversation

westonruter
Copy link
Member

@westonruter westonruter commented Mar 19, 2021

Previously #5703.

  • Run ./bin/amphtml-update.sh (lando ssh -c 'bash ./bin/amphtml-update.sh vendor/amphtml').
  • Examine diff for changelog.
  • Examine upstream diff to ensure nothing was missed.
  • Update spec generator as needed based on spec format changes.
    • Include validator-svg.protoascii when collecting spec data as was done previously when rules were splug out into validator-css.protoascii.
    • Add special case for img[data-amp-story-player-poster-img].
  • Modify validating sanitizer based on changes to spec, if needed.
  • Add tests for key changes.

Changelog

Details

(
    PREV_VERSION=68e4db07;
    THIS_VERSION=1bbd5505;
    git checkout $THIS_VERSION;
    git diff $PREV_VERSION...$THIS_VERSION -w -- $( git ls-files | grep '.protoascii' );
    git checkout - > /dev/null
)
68e4db07...1bbd5505
diff --git a/extensions/amp-story-player/validator-amp-story-player.protoascii b/build-system/tasks/extension-generator/bento/amp-__component_name_hyphenated__/validator-amp-__component_name_hyphenated__.protoascii
similarity index 62%
copy from extensions/amp-story-player/validator-amp-story-player.protoascii
copy to build-system/tasks/extension-generator/bento/amp-__component_name_hyphenated__/validator-amp-__component_name_hyphenated__.protoascii
index 45f7dff61..e52970efc 100644
--- a/extensions/amp-story-player/validator-amp-story-player.protoascii
+++ b/build-system/tasks/extension-generator/bento/amp-__component_name_hyphenated__/validator-amp-__component_name_hyphenated__.protoascii
@@ -1,5 +1,5 @@
 #
-# Copyright 2020 The AMP HTML Authors. All Rights Reserved.
+# Copyright __current_year__ The AMP HTML Authors. All Rights Reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -14,33 +14,30 @@
 # limitations under the license.
 #
 
-tags: {  # amp-story-player
+tags: {  # amp-__component_name_hyphenated__
   html_format: AMP
   tag_name: "SCRIPT"
   extension_spec: {
-    name: "amp-story-player"
-    version: "0.1"
+    name: "amp-__component_name_hyphenated__"
+    version: "__component_version__"
     version: "latest"
   }
   attr_lists: "common-extension-attrs"
 }
-tags: {  # <amp-story-player>
+tags: {  # <amp-__component_name_hyphenated__>
   html_format: AMP
-  tag_name: "AMP-STORY-PLAYER"
-  requires_extension: "amp-story-player"
-  descendant_tag_list: "amp-story-player-allowed-descendants"
+  tag_name: "__component_name_hyphenated_capitalized__"
+  requires_extension: "amp-__component_name_hyphenated__"
+  attr_lists: "extended-amp-global"
+  spec_url: "https://amp.dev/documentation/components/amp-__component_name_hyphenated__/"
   amp_layout: {
+    supported_layouts: CONTAINER
     supported_layouts: FILL
     supported_layouts: FIXED
     supported_layouts: FIXED_HEIGHT
     supported_layouts: FLEX_ITEM
-    supported_layouts: RESPONSIVE
     supported_layouts: INTRINSIC
+    supported_layouts: NODISPLAY
+    supported_layouts: RESPONSIVE
   }
 }
-descendant_tag_list {
-  name: "amp-story-player-allowed-descendants"
-  tag: "A"
-  tag: "SPAN"
-  tag: "I-AMPHTML-SIZER"  # Only allowed when document is transformed AMP
-}
diff --git a/extensions/amp-ad/validator-amp-ad.protoascii b/extensions/amp-ad/validator-amp-ad.protoascii
index 4d777d3c4..3bf4989c4 100644
--- a/extensions/amp-ad/validator-amp-ad.protoascii
+++ b/extensions/amp-ad/validator-amp-ad.protoascii
@@ -65,6 +65,8 @@ tags: {  # <amp-ad>
   attrs: { name: "template" }
   attrs: { name: "type" mandatory: true }
   attrs: { name: "sticky" value: "" }
+  attrs: { name: "always-serve-npa" }
+  attrs: { name: "block-rtc" }
   attr_lists: "extended-amp-global"
   spec_url: "https://amp.dev/documentation/components/amp-ad/"
   amp_layout: {
@@ -146,6 +148,8 @@ tags: {  # <amp-ad data-multi-size>
     }
     disallowed_value_regex: "__amp_source_origin"
   }
+  attrs: { name: "always-serve-npa" }
+  attrs: { name: "block-rtc" }
   attrs: { name: "type" mandatory: true }
   attr_lists: "extended-amp-global"
   spec_url: "https://amp.dev/documentation/components/amp-ad/"
@@ -223,6 +227,8 @@ tags: {  # <amp-embed>
     disallowed_value_regex: "__amp_source_origin"
   }
   attrs: { name: "type" mandatory: true }
+  attrs: { name: "always-serve-npa" }
+  attrs: { name: "block-rtc" }
   attr_lists: "extended-amp-global"
   spec_url: "https://amp.dev/documentation/components/amp-ad/"
   amp_layout: {
@@ -258,6 +264,8 @@ tags: {  # <amp-embed data-multi-size>
   }
   attrs: { name: "json" }
   attrs: { name: "rtc-config" }
+  attrs: { name: "always-serve-npa" }
+  attrs: { name: "block-rtc" }
   attrs: {
     name: "src"
     value_url: {
diff --git a/extensions/amp-base-carousel/validator-amp-base-carousel.protoascii b/extensions/amp-base-carousel/validator-amp-base-carousel.protoascii
index 70f94e45f..cd6980929 100644
--- a/extensions/amp-base-carousel/validator-amp-base-carousel.protoascii
+++ b/extensions/amp-base-carousel/validator-amp-base-carousel.protoascii
@@ -56,6 +56,11 @@ attr_lists: {
     # Media query / positive integer pairs
     value_regex: "([^,]+\\s+(\\d+),\\s*)*(\\d+)"
   }
+  attrs: {
+    name: "controls"
+    # Media query / (always|auto|never)
+    value_regex: "([^,]+\\s+(always|auto|never),\\s*)*(always|auto|never)"
+  }
   attrs: {
     name: "horizontal"
     # Media query / boolean pairs
diff --git a/extensions/amp-bodymovin-animation/validator-amp-bodymovin-animation.protoascii b/extensions/amp-bodymovin-animation/validator-amp-bodymovin-animation.protoascii
index c7c93fec0..5d9e022ac 100644
--- a/extensions/amp-bodymovin-animation/validator-amp-bodymovin-animation.protoascii
+++ b/extensions/amp-bodymovin-animation/validator-amp-bodymovin-animation.protoascii
@@ -47,8 +47,9 @@ tags: {  # <amp-bodymovin-animation>
   }
   attrs: {
     name: "renderer"
-    value_casei: "svg"
+    value_casei: "canvas"
     value_casei: "html"
+    value_casei: "svg"
   }
   spec_url: "https://amp.dev/documentation/components/amp-bodymovin-animation/"
   amp_layout: {
diff --git a/extensions/amp-google-assistant-assistjs/validator-amp-google-assistant-assistjs.protoascii b/extensions/amp-google-assistant-assistjs/validator-amp-google-assistant-assistjs.protoascii
new file mode 100644
index 000000000..f4ff4ce04
--- /dev/null
+++ b/extensions/amp-google-assistant-assistjs/validator-amp-google-assistant-assistjs.protoascii
@@ -0,0 +1,62 @@
+#
+# Copyright 2021 The AMP HTML Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS-IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the license.
+#
+
+tags: {  # amp-google-assistant-assistjs
+  html_format: AMP
+  tag_name: "SCRIPT"
+  extension_spec: {
+    name: "amp-google-assistant-assistjs"
+    version: "0.1"
+    version: "latest"
+  }
+  attr_lists: "common-extension-attrs"
+}
+tags: {  # <amp-google-assistant-assistjs-config>
+  html_format: AMP
+  tag_name: "AMP-GOOGLE-ASSISTANT-ASSISTJS-CONFIG"
+  requires_extension: "amp-google-assistant-assistjs"
+  amp_layout: {
+    supported_layouts: NODISPLAY
+  }
+}
+tags: {  # <amp-google-assistant-voice-button>
+  html_format: AMP
+  tag_name: "AMP-GOOGLE-ASSISTANT-VOICE-BUTTON"
+  requires_extension: "amp-google-assistant-assistjs"
+  attr_lists: "extended-amp-global"
+  amp_layout: {
+    supported_layouts: RESPONSIVE
+  }
+}
+tags: {  # <amp-google-assistant-voice-bar>
+  html_format: AMP
+  tag_name: "AMP-GOOGLE-ASSISTANT-VOICE-BAR"
+  requires_extension: "amp-google-assistant-assistjs"
+  attr_lists: "extended-amp-global"
+  amp_layout: {
+    supported_layouts: RESPONSIVE
+  }
+}
+tags: {  # <amp-google-assistant-inline-suggestion-bar>
+  html_format: AMP
+  tag_name: "AMP-GOOGLE-ASSISTANT-INLINE-SUGGESTION-BAR"
+  requires_extension: "amp-google-assistant-assistjs"
+  attr_lists: "extended-amp-global"
+  amp_layout: {
+    supported_layouts: RESPONSIVE
+  }
+}
+
diff --git a/extensions/amp-nested-menu/validator-amp-nested-menu.protoascii b/extensions/amp-nested-menu/validator-amp-nested-menu.protoascii
index 7ef5f39b2..3be476db2 100644
--- a/extensions/amp-nested-menu/validator-amp-nested-menu.protoascii
+++ b/extensions/amp-nested-menu/validator-amp-nested-menu.protoascii
@@ -45,19 +45,23 @@ tags: {  # <amp-nested-menu> <div amp-nested-submenu(-open/-close)>
   html_format: AMP
   tag_name: "DIV"
   spec_name: "div amp-nested-menu"
+  descriptive_name: "div amp-nested-menu"
   mandatory_ancestor: "AMP-NESTED-MENU"
   # submenus inside accordion do not display correctly due to styling of <amp-accordion>.
   disallowed_ancestor: "AMP-ACCORDION"
   attrs: {
     name: "amp-nested-submenu"
+    dispatch_key: NAME_VALUE_DISPATCH
     mandatory_oneof: "['amp-nested-submenu', 'amp-nested-submenu-close', 'amp-nested-submenu-open']"
   }
   attrs: {
     name: "amp-nested-submenu-close"
+    dispatch_key: NAME_VALUE_DISPATCH
     mandatory_oneof: "['amp-nested-submenu', 'amp-nested-submenu-close', 'amp-nested-submenu-open']"
   }
   attrs: {
     name: "amp-nested-submenu-open"
+    dispatch_key: NAME_VALUE_DISPATCH
     mandatory_oneof: "['amp-nested-submenu', 'amp-nested-submenu-close', 'amp-nested-submenu-open']"
   }
 }
diff --git a/extensions/amp-story-player/validator-amp-story-player.protoascii b/extensions/amp-story-auto-analytics/validator-amp-story-auto-analytics.protoascii
similarity index 52%
copy from extensions/amp-story-player/validator-amp-story-player.protoascii
copy to extensions/amp-story-auto-analytics/validator-amp-story-auto-analytics.protoascii
index 45f7dff61..63ceb2ae1 100644
--- a/extensions/amp-story-player/validator-amp-story-player.protoascii
+++ b/extensions/amp-story-auto-analytics/validator-amp-story-auto-analytics.protoascii
@@ -1,7 +1,7 @@
 #
-# Copyright 2020 The AMP HTML Authors. All Rights Reserved.
+# Copyright 2021 The AMP HTML Authors. All Rights Reserved.
 #
-# Licensed under the Apache License, Version 2.0 (the "License");
+# Licensed under the Apache License, Version 2.0 (the "License")
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
 #
@@ -14,33 +14,23 @@
 # limitations under the license.
 #
 
-tags: {  # amp-story-player
+tags: {  # amp-story-auto-analytics
   html_format: AMP
   tag_name: "SCRIPT"
   extension_spec: {
-    name: "amp-story-player"
+    name: "amp-story-auto-analytics"
     version: "0.1"
     version: "latest"
   }
   attr_lists: "common-extension-attrs"
 }
-tags: {  # <amp-story-player>
+tags: {  # <amp-story-auto-analytics>
   html_format: AMP
-  tag_name: "AMP-STORY-PLAYER"
-  requires_extension: "amp-story-player"
-  descendant_tag_list: "amp-story-player-allowed-descendants"
-  amp_layout: {
-    supported_layouts: FILL
-    supported_layouts: FIXED
-    supported_layouts: FIXED_HEIGHT
-    supported_layouts: FLEX_ITEM
-    supported_layouts: RESPONSIVE
-    supported_layouts: INTRINSIC
+  tag_name: "AMP-STORY-AUTO-ANALYTICS"
+  requires_extension: "amp-story-auto-analytics"
+  attrs: {
+    name: "gtag-id"
+    mandatory: true
+    value_regex: "[A-Z]{1,2}-[A-Z0-9-]+"
   }
 }
-descendant_tag_list {
-  name: "amp-story-player-allowed-descendants"
-  tag: "A"
-  tag: "SPAN"
-  tag: "I-AMPHTML-SIZER"  # Only allowed when document is transformed AMP
-}
diff --git a/extensions/amp-story-player/validator-amp-story-player.protoascii b/extensions/amp-story-player/validator-amp-story-player.protoascii
index 45f7dff61..ec58ce743 100644
--- a/extensions/amp-story-player/validator-amp-story-player.protoascii
+++ b/extensions/amp-story-player/validator-amp-story-player.protoascii
@@ -23,6 +23,7 @@ tags: {  # amp-story-player
     version: "latest"
   }
   attr_lists: "common-extension-attrs"
+  spec_url: "https://amp.dev/documentation/components/amp-story-player/"
 }
 tags: {  # <amp-story-player>
   html_format: AMP
@@ -37,10 +38,81 @@ tags: {  # <amp-story-player>
     supported_layouts: RESPONSIVE
     supported_layouts: INTRINSIC
   }
+  spec_url: "https://amp.dev/documentation/components/amp-story-player/"
 }
 descendant_tag_list {
   name: "amp-story-player-allowed-descendants"
   tag: "A"
   tag: "SPAN"
   tag: "I-AMPHTML-SIZER"  # Only allowed when document is transformed AMP
+  tag: "IMG"  # Only allowed when document is transformed AMP
+}
+tags: {
+  html_format: AMP
+  enabled_by: "transformed"
+  tag_name: "IMG"
+  spec_name: "img-i-amphtml-intrinsic-sizer-amp-story-player"
+  mandatory_parent: "I-AMPHTML-SIZER-INTRINSIC"
+  mandatory_ancestor: "AMP-STORY-PLAYER"
+  attrs: {
+    name: "alt"
+    value: ""
+    mandatory: true
+  }
+  attrs: {
+    name: "aria-hidden"
+    value: "true"
+    mandatory: true
+  }
+  attrs: {
+    name: "class"
+    value: "i-amphtml-intrinsic-sizer"
+    mandatory: true
+  }
+  attrs: {
+    name: "role"
+    value: "presentation"
+    mandatory: true
+  }
+  attrs: {
+    name: "src"
+    value_regex: "data:image\\/svg\\+xml;charset=utf-8,\\s*<svg height=\"\\d+(\\.\\d+)?\" width=\"\\d+(\\.\\d+)?\" xmlns=\"http:\\/\\/www\\.w3\\.org\\/2000\\/svg\" version=\"1\\.1\"\\/>|data:image\\/svg\\+xml;charset=utf-8,\\s*<svg height='\\d+(\\.\\d+)?\' width='\\d+(\\.\\d+)?\' xmlns='http:\\/\\/www\\.w3\\.org\\/2000\\/svg' version='1\\.1'\\/>|data:image\\/svg\\+xml;base64,[a-zA-Z0-9+\\/=]+"
+    mandatory: true
+  }
+  spec_url: "https://amp.dev/documentation/components/amp-story-player/"
+}
+tags: {
+  html_format: AMP
+  tag_name: "IMG"
+  spec_name: "amp-story-player > img"
+  mandatory_parent: "A"
+  mandatory_ancestor: "AMP-STORY-PLAYER"
+  attrs: { name: "alt" }
+  attrs: { name: "attribution" }
+  attrs: {
+    name: "data-amp-story-player-poster-img"
+    mandatory: true
+    value: ""
+    dispatch_key: NAME_VALUE_DISPATCH
+  }
+    attrs: {
+    name: "decoding"
+    value: "async"
+  }
+  attrs: {
+    name: "height"
+    value_regex: "[0-9]+"
+  }
+  attrs: {
+    name: "loading"
+    mandatory: true
+    value: "lazy"
+  }
+  attrs: { name: "sizes" }
+  attrs: {
+    name: "width"
+    value_regex: "[0-9]+"
+  }
+  attr_lists: "mandatory-src-or-srcset"
+  spec_url: "https://amp.dev/documentation/components/amp-story-player/"
 }
diff --git a/extensions/amp-story/validator-amp-story.protoascii b/extensions/amp-story/validator-amp-story.protoascii
index 52897853d..d0425ca04 100644
--- a/extensions/amp-story/validator-amp-story.protoascii
+++ b/extensions/amp-story/validator-amp-story.protoascii
@@ -122,8 +122,10 @@ tags: {  # <amp-story>
     child_tag_name_oneof: "AMP-PIXEL"
     child_tag_name_oneof: "AMP-SIDEBAR"
     child_tag_name_oneof: "AMP-STORY-AUTO-ADS"
+    child_tag_name_oneof: "AMP-STORY-AUTO-ANALYTICS"
     child_tag_name_oneof: "AMP-STORY-BOOKEND"
     child_tag_name_oneof: "AMP-STORY-PAGE"
+    child_tag_name_oneof: "AMP-STORY-SOCIAL-SHARE"
   }
 }
 tags: {  # <amp-story-page>
@@ -146,6 +148,7 @@ tags: {  # <amp-story-page>
     child_tag_name_oneof: "AMP-ANALYTICS"
     child_tag_name_oneof: "AMP-PIXEL"
     child_tag_name_oneof: "AMP-STORY-ANIMATION"
+    child_tag_name_oneof: "AMP-STORY-AUTO-ANALYTICS"
     child_tag_name_oneof: "AMP-STORY-CTA-LAYER"
     child_tag_name_oneof: "AMP-STORY-GRID-LAYER"
     child_tag_name_oneof: "AMP-STORY-PAGE-ATTACHMENT"
@@ -157,12 +160,12 @@ tags: {  # <amp-story-grid-layer>
   tag_name: "AMP-STORY-GRID-LAYER"
   mandatory_ancestor: "AMP-STORY-PAGE"
   attrs: {
-    name: "template"
-    mandatory: true
-    value: "fill"
-    value: "horizontal"
-    value: "thirds"
-    value: "vertical"
+    name: "anchor"
+    value_regex: "top|bottom|left|right|(top|bottom)[ -](left|right)|(left|right)[ -](top|bottom)"
+  }
+  attrs: {
+    name: "aspect-ratio"
+    value_regex: "\\d+:\\d+"
   }
   attrs: {
     name: "position"
@@ -170,8 +173,17 @@ tags: {  # <amp-story-grid-layer>
     value: "landscape-half-right"
   }
   attrs: {
-    name: "aspect-ratio"
-    value_regex: "\\d+:\\d+"
+    name: "preset"
+    value: "2021-background"
+    value: "2021-foreground"
+  }
+  attrs: {
+    name: "template"
+    mandatory: true
+    value: "fill"
+    value: "horizontal"
+    value: "thirds"
+    value: "vertical"
   }
   descendant_tag_list: "amp-story-grid-layer-allowed-descendants"
   reference_points: {
@@ -408,6 +420,46 @@ tags: {  # amp-story-bookend (json)
   }
   attr_lists: "nonce-attr"
 }
+tags: {  # <amp-story-social-share>
+  html_format: AMP
+  tag_name: "AMP-STORY-SOCIAL-SHARE"
+  mandatory_ancestor: "AMP-STORY"
+  mandatory_last_child: true
+  descendant_tag_list: "amp-story-social-share-allowed-descendants"
+  attrs: {
+    name: "layout"
+    mandatory: true
+    value: "nodisplay"
+  }
+  attrs: {
+    name: "src"
+    value_url: {
+      protocol: "http"
+      protocol: "https"
+    }
+  }
+}
+descendant_tag_list: {
+  name: "amp-story-social-share-allowed-descendants"
+  tag: "SCRIPT"
+}
+tags: {  # amp-story-social-share (json)
+  html_format: AMP
+  tag_name: "SCRIPT"
+  spec_name: "amp-story-social-share extension .json script"
+  requires_extension: "amp-story"
+  mandatory_parent: "AMP-STORY-SOCIAL-SHARE"
+  unique: true
+  mandatory_last_child: true
+  siblings_disallowed: true
+  attrs: {
+    name: "type"
+    mandatory: true
+    value_casei: "application/json"
+    dispatch_key: NAME_VALUE_PARENT_DISPATCH
+  }
+  attr_lists: "nonce-attr"
+}
 tags: {  # amp-story-consent (json)
   html_format: AMP
   tag_name: "SCRIPT"
@@ -662,6 +714,7 @@ descendant_tag_list: {
   tag: "AMP-PIXEL"
   tag: "AMP-STATE"
   tag: "AMP-STORY-360"
+  tag: "AMP-STORY-AUTO-ANALYTICS"
   tag: "AMP-STORY-INTERACTIVE-BINARY-POLL"
   tag: "AMP-STORY-INTERACTIVE-POLL"
   tag: "AMP-STORY-INTERACTIVE-QUIZ"
@@ -822,6 +875,22 @@ tags: {  # <amp-story-page-attachment> with no href
   mandatory_ancestor: "AMP-STORY-PAGE"
   descendant_tag_list: "amp-story-page-attachment-allowed-descendants"
   mandatory_last_child: true
+  attrs: {
+    name: "cta-image"
+    value_url: {
+      # protocol: "http"  # TODO(honeybaderdontcare): readd once transformers in prod
+      protocol: "https"
+      allow_relative: false  # TODO(honeybaderdontcare): remove once transformers in prod
+    }
+  }
+  attrs: {
+    name: "cta-image-2"
+    value_url: {
+      # protocol: "http"  # TODO(honeybaderdontcare): readd once transformers in prod
+      protocol: "https"
+      allow_relative: false  # TODO(honeybaderdontcare): remove once transformers in prod
+    }
+  }
   attrs: {
     name: "layout"
     mandatory: true
diff --git a/extensions/amp-video-iframe/validator-amp-video-iframe.protoascii b/extensions/amp-video-iframe/validator-amp-video-iframe.protoascii
index 28b0b6eee..406224b97 100644
--- a/extensions/amp-video-iframe/validator-amp-video-iframe.protoascii
+++ b/extensions/amp-video-iframe/validator-amp-video-iframe.protoascii
@@ -48,6 +48,7 @@ attr_lists: {
     name: "implements-rotate-to-fullscreen"
     value: ""
   }
+  attrs: { name: "poster" }
   attrs: { name: "referrerpolicy" }
   attrs: {
     name: "rotate-to-fullscreen"
@@ -65,45 +66,15 @@ attr_lists: {
   attrs: { name: "[src]" }
 }
 
-tags: {  # <amp-video-iframe> with poster
-  html_format: AMP
-  tag_name: "AMP-VIDEO-IFRAME"
-  spec_name: "AMP-VIDEO-IFRAME[poster]"
-  requires_extension: "amp-video-iframe"
-  attrs: {
-    name: "poster"
-    mandatory: true
-  }
-  attr_lists: "extended-amp-global"
-  attr_lists: "amp-video-iframe-common"
-  attr_lists: "lightboxable-elements"
-  spec_url: "https://amp.dev/documentation/components/amp-video-iframe/"
-  amp_layout: {
-    supported_layouts: FILL
-    supported_layouts: FIXED
-    supported_layouts: FIXED_HEIGHT
-    supported_layouts: FLEX_ITEM
-    supported_layouts: INTRINSIC
-    supported_layouts: NODISPLAY
-    supported_layouts: RESPONSIVE
-  }
-}
-
-tags: {  # <amp-video-iframe> with [placeholder]
+tags: {  # <amp-video-iframe>
   html_format: AMP
   disabled_by: "transformed"
   tag_name: "AMP-VIDEO-IFRAME"
-  spec_name: "AMP-VIDEO-IFRAME with [placeholder]"
   requires_extension: "amp-video-iframe"
   attr_lists: "extended-amp-global"
   attr_lists: "amp-video-iframe-common"
   attr_lists: "lightboxable-elements"
   spec_url: "https://amp.dev/documentation/components/amp-video-iframe/"
-  reference_points: {
-    tag_spec_name: "AMP-VIDEO-IFRAME > [placeholder]"
-    mandatory: true
-    unique: true
-  }
   amp_layout: {
     supported_layouts: FILL
     supported_layouts: FIXED
@@ -115,24 +86,16 @@ tags: {  # <amp-video-iframe> with [placeholder]
   }
 }
 
-tags: {  # <amp-video-iframe> with [placeholder] (transformed)
+tags: {  # <amp-video-iframe> (transformed)
   html_format: AMP
   enabled_by: "transformed"
   tag_name: "AMP-VIDEO-IFRAME"
-  spec_name: "AMP-VIDEO-IFRAME with [placeholder] (transformed)"
+  spec_name: "AMP-VIDEO-IFRAME (transformed)"
   requires_extension: "amp-video-iframe"
   attr_lists: "extended-amp-global"
   attr_lists: "amp-video-iframe-common"
   attr_lists: "lightboxable-elements"
   spec_url: "https://amp.dev/documentation/components/amp-video-iframe/"
-  reference_points: {
-    tag_spec_name: "AMP-VIDEO-IFRAME > [placeholder]"
-    mandatory: true
-    unique: true
-  }
-  reference_points: {
-    tag_spec_name: "AMP-VIDEO-IFRAME > I-AMPHTML-SIZER [style]"
-  }
   amp_layout: {
     supported_layouts: FILL
     supported_layouts: FIXED
@@ -143,33 +106,3 @@ tags: {  # <amp-video-iframe> with [placeholder] (transformed)
     supported_layouts: RESPONSIVE
   }
 }
-
-tags: {
-  html_format: AMP
-  tag_name: "$REFERENCE_POINT"
-  spec_name: "AMP-VIDEO-IFRAME > [placeholder]"
-  attrs: {
-    name: "placeholder"
-    mandatory: true
-  }
-  spec_url: "https://amp.dev/documentation/components/amp-video-iframe/"
-}
-
-tags: {
-  html_format: AMP
-  enabled_by: "transformed"
-  tag_name: "$REFERENCE_POINT"
-  spec_name: "AMP-VIDEO-IFRAME > I-AMPHTML-SIZER [style]"
-  explicit_attrs_only: true
-  attrs: {
-    name: "style"
-    mandatory: true
-    disallowed_value_regex: "!\\s*important"
-    css_declaration: {
-      name: "display"
-      value_casei: "block"
-    }
-    css_declaration: { name: "padding-top" }
-  }
-  spec_url: "https://amp.dev/documentation/components/amp-video-iframe/"
-}
diff --git a/validator/validator-css.protoascii b/validator/validator-css.protoascii
index f1af32060..23a6b3add 100644
--- a/validator/validator-css.protoascii
+++ b/validator/validator-css.protoascii
@@ -29,6 +29,7 @@ declaration_list {
   declaration: { name: "animation-name" }
   declaration: { name: "animation-play-state" }
   declaration: { name: "animation-timing-function" }
+  declaration: { name: "aspect-ratio" }
   declaration: { name: "backface-visibility" }
   declaration: { name: "background" }
   declaration: { name: "background-attachment" }
@@ -299,11 +300,6 @@ declaration_list {
   declaration: { name: "text-rendering" }
 }
 
-declaration_list {
-  name: "AMP_ONLY_DECLARATIONS"
-  declaration: { name: "clip-path" }
-}
-
 declaration_list {
   name: "EMAIL_SPECIFIC_DECLARATIONS"
   # AMP4EMAIL supported properties:
@@ -315,6 +311,7 @@ declaration_list {
   declaration: { name: "align-items" }
   declaration: { name: "align-self" }
   declaration: { name: "appearance" }
+  declaration: { name: "aspect-ratio" }
   declaration: { name: "azimuth" }
   declaration: { name: "background" }
   declaration: { name: "background-attachment" }
@@ -574,11 +571,7 @@ css {
   "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#maximum-size"
   url_bytes_included: true
 
-  # This is a legacy requirement. Style tags support all declarations while
-  # style attributes limit the allowed declarations. Support for style
-  # attributes was added at a later date than style tags, and more validation
-  # requirements were able to be enforced at that time.
-  allow_all_declaration_in_style_tag: true
+  allow_all_declaration_in_style: true
   allow_important: false
   image_url_spec: {
     protocol: "https"
@@ -593,9 +586,6 @@ css {
     allow_empty: true
   }
   expand_vendor_prefixes: true
-  declaration_list: "BASIC_DECLARATIONS"
-  declaration_list_svg: "SVG_BASIC_DECLARATIONS"
-  declaration_list: "AMP_ONLY_DECLARATIONS"
 }
 
 # DocCss Rules for AMP transformed documents.
@@ -606,13 +596,13 @@ css {
   enabled_by: "transformed"
   spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#stylesheets"
 
-  max_bytes: 75000
-  max_bytes_per_inline_style: 1000
+  max_bytes: 112500
+  max_bytes_per_inline_style: 1500
   max_bytes_spec_url:
   "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#maximum-size"
   url_bytes_included: false
 
-  allow_all_declaration_in_style_tag: true
+  allow_all_declaration_in_style: true
   allow_important: false
   image_url_spec: {
     protocol: "https"
@@ -627,9 +617,6 @@ css {
     allow_empty: true
   }
   expand_vendor_prefixes: true
-  declaration_list: "BASIC_DECLARATIONS"
-  declaration_list_svg: "SVG_BASIC_DECLARATIONS"
-  declaration_list: "AMP_ONLY_DECLARATIONS"
 }
 
 # DocCss rules for AMP4ADS.
@@ -643,7 +630,7 @@ css {
   # max_bytes_per_inline_style: 1000
   max_bytes_spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/a4a_spec/#css"
 
-  allow_all_declaration_in_style_tag: true
+  allow_all_declaration_in_style: true
   allow_important: false
   image_url_spec: {
     protocol: "https"
@@ -658,8 +645,6 @@ css {
     allow_empty: true
   }
   expand_vendor_prefixes: true
-  declaration_list: "BASIC_DECLARATIONS"
-  declaration_list_svg: "SVG_BASIC_DECLARATIONS"
 }
 
 # DocCss rules for AMP4EMAIL, not data-css-strict
@@ -679,11 +664,7 @@ css {
   "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#maximum-size"
   url_bytes_included: true
 
-  # This is a legacy requirement. Style tags support all declarations while
-  # style attributes limit the allowed declarations. Support for style
-  # attributes was added at a later date than style tags, and more validation
-  # requirements were able to be enforced at that time.
-  allow_all_declaration_in_style_tag: true
+  allow_all_declaration_in_style: true
   allow_important: false
   image_url_spec: {
     protocol: "https"
@@ -708,7 +689,7 @@ css {
   "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#maximum-size"
   url_bytes_included: true
 
-  allow_all_declaration_in_style_tag: false
+  allow_all_declaration_in_style: false
   allow_important: false
   image_url_spec: {
     protocol: "https"
@@ -782,9 +763,87 @@ tags: {  # <style amp-custom>, [AMP]
     css_spec: {
       at_rule_spec: { name: 'font-face' }
       at_rule_spec: { name: 'keyframes' }
-      at_rule_spec: { name: 'media' }
+      at_rule_spec: {
+         name: 'media'
+         media_query_spec: {
+           issues_as_error: false
+           type: 'all'
+           type: 'print'
+           type: 'screen'
+           type: 'speech'
+           type: 'tty'
+           type: 'tv'
+           type: 'projection'
+           type: 'handheld'
+           type: 'braille'
+           type: 'embossesd'
+           type: 'aural'
+           feature: 'any-hover'
+           feature: 'any-pointer'
+           feature: 'aspect-ratio'
+           feature: 'color'
+           feature: 'color-gamut'
+           feature: 'color-index'
+           feature: 'device-aspect-ratio'
+           feature: 'device-height'
+           feature: 'device-width'
+           feature: 'display-mode'
+           feature: 'forced-colors'
+           feature: 'grid'
+           feature: 'height'
+           feature: 'hover'
+           feature: 'inverted-colors'
+           feature: 'light-level'
+           feature: 'max-aspect-ratio'
+           feature: 'max-color-index'
+           feature: 'max-device-aspect-ratio'
+           feature: 'max-device-height'
+           feature: 'max-device-width'
+           feature: 'max-height'
+           feature: 'max-resolution'
+           feature: 'max-width'
+           feature: 'min-aspect-ratio'
+           feature: 'min-color-index'
+           feature: 'min-device-aspect-ratio'
+           feature: 'min-device-height'
+           feature: 'min-device-width'
+           feature: 'min-height'
+           feature: 'min-resolution'
+           feature: 'min-width'
+           feature: 'monochrome'
+           feature: 'orientation'
+           feature: 'overflow-block'
+           feature: 'overflow-inline'
+           feature: 'pointer'
+           feature: 'prefers-color-scheme'
+           feature: 'prefers-contrast'
+           feature: 'prefers-reduced-motion'
+           feature: 'prefers-reduced-transparency'
+           feature: 'resolution'
+           feature: 'scan'
+           feature: 'scripting'
+           feature: 'transform-3d'
+           feature: 'update'
+           feature: 'width'
+           # Other non-standard media types and features commonly seen:
+           type: '-sass-debug-info'
+           type: 'device-pixel-ratio'
+           type: 'device-pixel-ratio2'
+           feature: '--mod'
+           feature: '--md'
+           feature: 'device-pixel-ratio'
+           feature: 'device-pixel-ratio2'
+           feature: 'high-contrast'
+           feature: 'max-device-pixel-ratio'
+           feature: 'min-device-pixel-ratio'
+           feature: 'max-device-pixel-ratio2'
+           feature: 'min-device-pixel-ratio2'
+         }
+      }
       at_rule_spec: { name: 'page' }
       at_rule_spec: { name: 'supports' }
+      # https://github.com/ampproject/amphtml/issues/26406
+      at_rule_spec: { name: '-moz-document' }
     }
     disallowed_cdata_regex: {
       regex: "<!--"
@@ -1228,7 +1287,85 @@ tags: {  # `<style amp-keyframes>`, [AMP, AMP4ADS]
     max_bytes_spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#keyframes-stylesheet"
     css_spec: {
       at_rule_spec: { name: 'keyframes' }
-      at_rule_spec: { name: 'media' }
+      at_rule_spec: {
+         name: 'media'
+         media_query_spec: {
+           issues_as_error: false
+           type: 'all'
+           type: 'print'
+           type: 'screen'
+           type: 'speech'
+           type: 'tty'
+           type: 'tv'
+           type: 'projection'
+           type: 'handheld'
+           type: 'braille'
+           type: 'embossesd'
+           type: 'aural'
+           feature: 'any-hover'
+           feature: 'any-pointer'
+           feature: 'aspect-ratio'
+           feature: 'color'
+           feature: 'color-gamut'
+           feature: 'color-index'
+           feature: 'device-aspect-ratio'
+           feature: 'device-height'
+           feature: 'device-width'
+           feature: 'display-mode'
+           feature: 'forced-colors'
+           feature: 'grid'
+           feature: 'height'
+           feature: 'hover'
+           feature: 'inverted-colors'
+           feature: 'light-level'
+           feature: 'monochrome'
+           feature: 'max-aspect-ratio'
+           feature: 'max-color-index'
+           feature: 'max-device-aspect-ratio'
+           feature: 'max-device-height'
+           feature: 'max-device-width'
+           feature: 'max-height'
+           feature: 'max-resolution'
+           feature: 'max-width'
+           feature: 'min-aspect-ratio'
+           feature: 'min-color-index'
+           feature: 'min-device-aspect-ratio'
+           feature: 'min-device-height'
+           feature: 'min-device-width'
+           feature: 'min-height'
+           feature: 'min-resolution'
+           feature: 'min-width'
+           feature: 'orientation'
+           feature: 'overflow-block'
+           feature: 'overflow-inline'
+           feature: 'pointer'
+           feature: 'prefers-color-scheme'
+           feature: 'prefers-contrast'
+           feature: 'prefers-reduced-motion'
+           feature: 'prefers-reduced-transparency'
+           feature: 'resolution'
+           feature: 'scan'
+           feature: 'scripting'
+           feature: 'transform-3d'
+           feature: 'update'
+           feature: 'width'
+           # Other non-standard media types and features commonly seen:
+           type: '-sass-debug-info'
+           type: 'device-pixel-ratio'
+           type: 'device-pixel-ratio2'
+           feature: '--mod'
+           feature: '--md'
+           feature: 'device-pixel-ratio'
+           feature: 'device-pixel-ratio2'
+           feature: 'high-contrast'
+           feature: 'aspect-ratio'
+           feature: 'max-device-pixel-ratio'
+           feature: 'min-device-pixel-ratio'
+           feature: 'max-device-pixel-ratio2'
+           feature: 'min-device-pixel-ratio2'
+         }
+      }
+
       at_rule_spec: { name: 'supports' }
       validate_keyframes: true
       declaration: "animation-timing-function"
diff --git a/validator/validator-main.protoascii b/validator/validator-main.protoascii
index 91cfa1362..7f7da3161 100644
--- a/validator/validator-main.protoascii
+++ b/validator/validator-main.protoascii
@@ -26,7 +26,7 @@ min_validator_revision_required: 475
 # newer versions of the spec file. This is currently a Google internal
 # mechanism, validator.js does not use this facility. However, any
 # change to this file (validator-main.js) requires updating this revision id.
-spec_file_revision: 1132
+spec_file_revision: 1162
 
 styles_spec_url: "https://amp.dev/documentation/guides-and-tutorials/develop/style_and_layout/style_pages/"
 script_spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/validation-workflow/validation_errors/#custom-javascript-is-not-allowed"
@@ -66,6 +66,8 @@ tags: {
   # on existing AMP documents.
   attrs: {
     name: "lang"
+    deprecation: "html"
+    deprecation_url: "https://github.com/ampproject/amphtml/issues/25926"
   }
   spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup"
 }
@@ -221,6 +223,7 @@ tags: {
         "components|"
         "import|"
         "manifest|"  # Handled separately below, has specific requirements.
+        "modulepreload|"  # Handled separately below, has specific requirements.
         "preload|"  # Handled separately below, has specific requirements.
         "serviceworker|"
         "stylesheet|"  # Handled separately below, has specific requirements.
@@ -286,6 +289,35 @@ tags: {
   attr_lists: "common-link-attrs"
   spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#html-tags"
 }
+tags: {
+  html_format: AMP
+  tag_name: "LINK"
+  spec_name: "link rel=modulepreload"
+  descriptive_name: "link rel=modulepreload"
+  mandatory_parent: "HEAD"
+  attrs: {
+    name: "as"
+    mandatory: true
+    value: "script"
+  }
+  attrs: {
+    name: "crossorigin"
+    mandatory: true
+    value: "anonymous"
+  }
+  attrs: {
+    name: "href"
+    mandatory: true
+    value_regex: ".*\\.mjs$"
+  }
+  attrs: {
+    name: "rel"
+    mandatory: true
+    value_casei: "modulepreload"
+    dispatch_key: NAME_VALUE_DISPATCH
+  }
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#html-tags"
+}
 tags: {
   html_format: AMP
   html_format: AMP4ADS
@@ -338,9 +370,9 @@ tags: {
                  "https://fonts\\.googleapis\\.com/earlyaccess/.*\\.css|"
                  "https://maxcdn\\.bootstrapcdn\\.com/font-awesome/"
                  "([0-9]+\\.?)+/css/font-awesome\\.min\\.css(\\?.*)?|"
-                 "https://(use|pro)\\.fontawesome\\.com/releases/v([0-9]+\\.?)+"
+                 "https://(use|pro|kit)\\.fontawesome\\.com/releases/v([0-9]+\\.?)+"
                  "/css/[0-9a-zA-Z-]+\\.css|"
-                 "https://(use|pro)\\.fontawesome\\.com/[0-9a-zA-Z-]+\\.css|"
+                 "https://(use|pro|kit)\\.fontawesome\\.com/[0-9a-zA-Z-]+\\.css|"
                  "https://use\\.typekit\\.net/[\\w\\p{L}\\p{N}_]+\\.css"
   }
   attrs: { name: "integrity" }  # SRI attribute (https://www.w3.org/TR/SRI/)
@@ -1704,7 +1736,8 @@ tags: {
 
 # 4.7 Embedded Content
 # AMP HTML allows embedded content only via its own tags (e.g. amp-img), with
-# the exception of tags inside of a <noscript> ancestor and transformed amp-img.
+# the exception of tags inside of a <noscript> or <amp-story-player> ancestor
+# and transformed amp-img.
 # 4.7.1 The img element
 tags: {
   html_format: AMP  # Disallowed in AMP4ADS because <noscript> is disallowed.
@@ -2137,831 +2170,8 @@ tags: {
   spec_url: "https://amp.dev/documentation/components/amp-ima-video/"
 }
 
-
 # 4.7.15 SVG
-# We allow some limited embedded SVG tags. We do not allow inline styles
-# or embedding any external resources.
-# Attribute lists: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute
-attr_lists: {
-  name: "svg-conditional-processing-attributes"
-  attrs: { name: "requiredextensions" }
-  attrs: { name: "requiredfeatures" }
-  attrs: { name: "systemlanguage" }
-}
-attr_lists: {
-  name: "svg-core-attributes"
-  attrs: { name: "xml:lang" }
-  attrs: { name: "xml:space" }
-  attrs: { name: "xmlns" }
-  attrs: { name: "xmlns:xlink" }
-}
-attr_lists: {
-  name: "svg-filter-primitive-attributes"
-  attrs: { name: "height" }
-  attrs: { name: "result" }
-  attrs: { name: "width" }
-  attrs: { name: "x" }
-  attrs: { name: "y" }
-}
-attr_lists: {
-  name: "svg-presentation-attributes"
-  attrs: { name: "alignment-baseline" }
-  attrs: { name: "baseline-shift" }
-  attrs: { name: "clip" }
-  attrs: { name: "clip-path" }
-  attrs: { name: "clip-rule" }
-  attrs: { name: "color" }
-  attrs: { name: "color-interpolation" }
-  attrs: { name: "color-interpolation-filters" }
-  attrs: { name: "color-profile" }
-  attrs: { name: "color-rendering" }
-  attrs: { name: "cursor" }
-  attrs: { name: "direction" }
-  attrs: { name: "display" }
-  attrs: { name: "dominant-baseline" }
-  attrs: { name: "enable-background" }
-  attrs: { name: "fill" }
-  attrs: { name: "fill-opacity" }
-  attrs: { name: "fill-rule" }
-  attrs: { name: "filter" }
-  attrs: { name: "flood-color" }
-  attrs: { name: "flood-opacity" }
-  attrs: { name: "focusable" }
-  attrs: { name: "font-family" }
-  attrs: { name: "font-size" }
-  attrs: { name: "font-size-adjust" }
-  attrs: { name: "font-stretch" }
-  attrs: { name: "font-style" }
-  attrs: { name: "font-variant" }
-  attrs: { name: "font-weight" }
-  attrs: { name: "glyph-orientation-horizontal" }
-  attrs: { name: "glyph-orientation-vertical" }
-  attrs: { name: "image-rendering" }
-  attrs: { name: "kerning" }
-  attrs: { name: "letter-spacing" }
-  attrs: { name: "lighting-color" }
-  attrs: { name: "marker-end" }
-  attrs: { name: "marker-mid" }
-  attrs: { name: "marker-start" }
-  attrs: { name: "mask" }
-  attrs: { name: "opacity" }
-  attrs: { name: "overflow" }
-  attrs: { name: "pointer-events" }
-  attrs: { name: "shape-rendering" }
-  attrs: { name: "stop-color" }
-  attrs: { name: "stop-opacity" }
-  attrs: { name: "stroke" }
-  attrs: { name: "stroke-dasharray" }
-  attrs: { name: "stroke-dashoffset" }
-  attrs: { name: "stroke-linecap" }
-  attrs: { name: "stroke-linejoin" }
-  attrs: { name: "stroke-miterlimit" }
-  attrs: { name: "stroke-opacity" }
-  attrs: { name: "stroke-width" }
-  attrs: { name: "text-anchor" }
-  attrs: { name: "text-decoration" }
-  attrs: { name: "text-rendering" }
-  attrs: { name: "unicode-bidi" }
-  attrs: { name: "vector-effect" }
-  attrs: { name: "visibility" }
-  attrs: { name: "word-spacing" }
-  attrs: { name: "writing-mode" }
-}
-attr_lists: {
-  name: "svg-transfer-function-attributes"
-  attrs: { name: "amplitude" }
-  attrs: { name: "exponent" }
-  attrs: { name: "intercept" }
-  attrs: { name: "offset" }
-  attrs: { name: "slope" }
-  attrs: { name: "table" }
-  attrs: { name: "tablevalues" }
-}
-attr_lists: {
-  name: "svg-xlink-attributes"
-  attrs: { name: "xlink:actuate" }
-  attrs: { name: "xlink:arcrole" }
-  attrs: {
-    name: "xlink:href"
-    # xlink:href is deprecated since SVG2 in favor of href.
-    alternative_names: "href"
-    value_url: {
-      protocol: "http"
-      protocol: "https"
-      allow_empty: false
-    }
-  }
-  attrs: { name: "xlink:role" }
-  attrs: { name: "xlink:show" }
-  attrs: { name: "xlink:title" }
-  attrs: { name: "xlink:type" }
-}
-# Style attributes are broadly disallowed, but specifically allowed
-# within SVG as SVG are commonly generated by tools.
-attr_lists: {
-  name: "svg-style-attr"
-  attrs: {
-    name: "style"
-    # `style` attribute value validated against Document Level CSS rules defined
-    # in validator-css.protoascii.
-    value_doc_svg_css: true
-  }
-}
-
-# Basics
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "G"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "externalresourcesrequired" }
-  attrs: { name: "transform" }
-  attr_lists: "svg-conditional-processing-attributes"
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "GLYPH"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "arabic-form" }
-  attrs: { name: "d" }
-  attrs: { name: "glyph-name" }
-  attrs: { name: "horiz-adv-x" }
-  attrs: { name: "orientation" }
-  attrs: { name: "unicode" }
-  attrs: { name: "vert-adv-y" }
-  attrs: { name: "vert-origin-x" }
-  attrs: { name: "vert-origin-y" }
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "GLYPHREF"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "dx" }
-  attrs: { name: "dy" }
-  attrs: { name: "format" }
-  attrs: { name: "glyphref" }
-  attrs: { name: "x" }
-  attrs: { name: "y" }
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  attr_lists: "svg-xlink-attributes"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "IMAGE"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "externalresourcesrequired" }
-  attrs: { name: "height" }
-  attrs: { name: "preserveaspectratio" }
-  attrs: { name: "transform" }
-  attrs: { name: "width" }
-  attrs: { name: "x" }
-  attrs: { name: "xlink:actuate" }
-  attrs: { name: "xlink:arcrole" }
-  attrs: {
-    name: "xlink:href"
-    # xlink:href is deprecated since SVG2 in favor of href.
-    alternative_names: "href"
-    value_url: {
-      protocol: "data"
-      protocol: "http"
-      protocol: "https"
-      allow_empty: false
-    }
-    # Inline SVGs execute in a different context and can affect page elements.
-    disallowed_value_regex: "(^|\\s)data:image\\/svg\\+xml"
-  }
-  attrs: { name: "xlink:role" }
-  attrs: { name: "xlink:show" }
-  attrs: { name: "xlink:title" }
-  attrs: { name: "xlink:type" }
-  attrs: { name: "y" }
-  attr_lists: "svg-conditional-processing-attributes"
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "MARKER"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "externalresourcesrequired" }
-  attrs: { name: "markerheight" }
-  attrs: { name: "markerunits" }
-  attrs: { name: "markerwidth" }
-  attrs: { name: "orient" }
-  attrs: { name: "preserveaspectratio" }
-  attrs: { name: "refx" }
-  attrs: { name: "refy" }
-  attrs: { name: "transform" }
-  attrs: { name: "viewbox" }
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "METADATA"
-  mandatory_ancestor: "SVG"
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "PATH"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "d" }
-  attrs: { name: "externalresourcesrequired" }
-  attrs: { name: "pathlength" }
-  attrs: { name: "sketch:type" }
-  attrs: { name: "transform" }
-  attr_lists: "svg-conditional-processing-attributes"
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "SOLIDCOLOR"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "solid-color" }
-  attrs: { name: "solid-opacity" }
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "SVG"
-  attrs: { name: "contentscripttype" }
-  attrs: { name: "contentstyletype" }
-  attrs: { name: "externalresourcesrequired" }
-  attrs: { name: "height" }
-  attrs: { name: "preserveaspectratio" }
-  attrs: {
-    name: "version"
-    value: "1.0"
-    value: "1.1"
-  }
-  attrs: { name: "viewbox" }
-  attrs: { name: "width" }
-  attrs: { name: "x" }
-  attrs: { name: "y" }
-  attrs: { name: "zoomandpan" }
-  attr_lists: "svg-conditional-processing-attributes"
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "SWITCH"
-  mandatory_ancestor: "SVG"
-  attr_lists: "svg-conditional-processing-attributes"
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "VIEW"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "externalresourcesrequired" }
-  attrs: { name: "preserveaspectratio" }
-  attrs: { name: "viewbox" }
-  attrs: { name: "viewtarget" }
-  attrs: { name: "zoomandpan" }
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-# Shapes
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "CIRCLE"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "cx" }
-  attrs: { name: "cy" }
-  attrs: { name: "externalresourcesrequired" }
-  attrs: { name: "r" }
-  attrs: { name: "sketch:type" }
-  attrs: { name: "transform" }
-  attr_lists: "svg-conditional-processing-attributes"
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "ELLIPSE"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "cx" }
-  attrs: { name: "cy" }
-  attrs: { name: "externalresourcesrequired" }
-  attrs: { name: "rx" }
-  attrs: { name: "ry" }
-  attrs: { name: "sketch:type" }
-  attrs: { name: "transform" }
-  attr_lists: "svg-conditional-processing-attributes"
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "LINE"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "externalresourcesrequired" }
-  attrs: { name: "sketch:type" }
-  attrs: { name: "transform" }
-  attrs: { name: "x1" }
-  attrs: { name: "x2" }
-  attrs: { name: "y1" }
-  attrs: { name: "y2" }
-  attr_lists: "svg-conditional-processing-attributes"
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "POLYGON"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "externalresourcesrequired" }
-  attrs: { name: "points" }
-  attrs: { name: "sketch:type" }
-  attrs: { name: "transform" }
-  attr_lists: "svg-conditional-processing-attributes"
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "POLYLINE"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "externalresourcesrequired" }
-  attrs: { name: "points" }
-  attrs: { name: "sketch:type" }
-  attrs: { name: "transform" }
-  attr_lists: "svg-conditional-processing-attributes"
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "RECT"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "externalresourcesrequired" }
-  attrs: { name: "height" }
-  attrs: { name: "rx" }
-  attrs: { name: "ry" }
-  attrs: { name: "sketch:type" }
-  attrs: { name: "transform" }
-  attrs: { name: "width" }
-  attrs: { name: "x" }
-  attrs: { name: "y" }
-  attr_lists: "svg-conditional-processing-attributes"
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-# Text
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "TEXT"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "dx" }
-  attrs: { name: "dy" }
-  attrs: { name: "externalresourcesrequired" }
-  attrs: { name: "lengthadjust" }
-  attrs: { name: "rotate" }
-  attrs: { name: "text-anchor" }
-  attrs: { name: "textlength" }
-  attrs: { name: "transform" }
-  attrs: { name: "x" }
-  attrs: { name: "y" }
-  attr_lists: "svg-conditional-processing-attributes"
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "TEXTPATH"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "externalresourcesrequired" }
-  attrs: { name: "method" }
-  attrs: { name: "spacing" }
-  attrs: { name: "startoffset" }
-  attr_lists: "svg-conditional-processing-attributes"
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  attr_lists: "svg-xlink-attributes"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "TREF"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "externalresourcesrequired" }
-  attr_lists: "svg-conditional-processing-attributes"
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  attr_lists: "svg-xlink-attributes"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "TSPAN"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "dx" }
-  attrs: { name: "dy" }
-  attrs: { name: "externalresourcesrequired" }
-  attrs: { name: "lengthadjust" }
-  attrs: { name: "rotate" }
-  attrs: { name: "textlength" }
-  attrs: { name: "x" }
-  attrs: { name: "y" }
-  attr_lists: "svg-conditional-processing-attributes"
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-# Rendering
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "CLIPPATH"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "clippathunits" }
-  attrs: { name: "externalresourcesrequired" }
-  attrs: { name: "transform" }
-  attr_lists: "svg-conditional-processing-attributes"
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "FILTER"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "externalresourcesrequired" }
-  attrs: { name: "filterres" }
-  attrs: { name: "filterunits" }
-  attrs: { name: "height" }
-  attrs: { name: "primitiveunits" }
-  attrs: { name: "width" }
-  attrs: { name: "x" }
-  attrs: { name: "y" }
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  attr_lists: "svg-xlink-attributes"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "HKERN"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "g1" }
-  attrs: { name: "g2" }
-  attrs: { name: "k" }
-  attrs: { name: "u1" }
-  attrs: { name: "u2" }
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "LINEARGRADIENT"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "externalresourcesrequired" }
-  attrs: { name: "gradienttransform" }
-  attrs: { name: "gradientunits" }
-  attrs: { name: "spreadmethod" }
-  attrs: { name: "x1" }
-  attrs: { name: "x2" }
-  attrs: { name: "y1" }
-  attrs: { name: "y2" }
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  attr_lists: "svg-xlink-attributes"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "MASK"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "externalresourcesrequired" }
-  attrs: { name: "height" }
-  attrs: { name: "maskcontentunits" }
-  attrs: { name: "maskunits" }
-  attrs: { name: "width" }
-  attrs: { name: "x" }
-  attrs: { name: "y" }
-  attr_lists: "svg-conditional-processing-attributes"
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "PATTERN"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "externalresourcesrequired" }
-  attrs: { name: "height" }
-  attrs: { name: "patterncontentunits" }
-  attrs: { name: "patterntransform" }
-  attrs: { name: "patternunits" }
-  attrs: { name: "preserveaspectratio" }
-  attrs: { name: "viewbox" }
-  attrs: { name: "width" }
-  attrs: { name: "x" }
-  attrs: { name: "y" }
-  attr_lists: "svg-conditional-processing-attributes"
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  attr_lists: "svg-xlink-attributes"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "RADIALGRADIENT"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "cx" }
-  attrs: { name: "cy" }
-  attrs: { name: "externalresourcesrequired" }
-  attrs: { name: "fr" }
-  attrs: { name: "fx" }
-  attrs: { name: "fy" }
-  attrs: { name: "gradienttransform" }
-  attrs: { name: "gradientunits" }
-  attrs: { name: "r" }
-  attrs: { name: "spreadmethod" }
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  attr_lists: "svg-xlink-attributes"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "STOP"
-  spec_name: "lineargradient > stop"
-  mandatory_ancestor: "LINEARGRADIENT"
-  attrs: { name: "offset" }
-  attrs: { name: "stop-color" }
-  attrs: { name: "stop-opacity" }
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "STOP"
-  spec_name: "radialgradient > stop"
-  mandatory_ancestor: "RADIALGRADIENT"
-  attrs: { name: "offset" }
-  attrs: { name: "stop-color" }
-  attrs: { name: "stop-opacity" }
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "VKERN"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "g1" }
-  attrs: { name: "g2" }
-  attrs: { name: "k" }
-  attrs: { name: "u1" }
-  attrs: { name: "u2" }
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-# Special
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "DEFS"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "externalresourcesrequired" }
-  attrs: { name: "transform" }
-  attr_lists: "svg-conditional-processing-attributes"
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "SYMBOL"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "externalresourcesrequired" }
-  attrs: { name: "height" }
-  attrs: { name: "preserveaspectratio" }
-  attrs: { name: "viewbox" }
-  attrs: { name: "width" }
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "USE"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "externalresourcesrequired" }
-  attrs: { name: "height" }
-  attrs: { name: "transform" }
-  attrs: { name: "width" }
-  attrs: { name: "x" }
-  attrs: { name: "y" }
-  attr_lists: "svg-conditional-processing-attributes"
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  attr_lists: "svg-xlink-attributes"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-# Filters
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "FECOLORMATRIX"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "in" }
-  attrs: { name: "type" }
-  attrs: { name: "values" }
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-filter-primitive-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "FECOMPOSITE"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "in" }
-  attrs: { name: "in2" }
-  attrs: { name: "k1" }
-  attrs: { name: "k2" }
-  attrs: { name: "k3" }
-  attrs: { name: "k4" }
-  attrs: { name: "operator" }
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-filter-primitive-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "FEFLOOD"
-  mandatory_ancestor: "SVG"
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-filter-primitive-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "FEGAUSSIANBLUR"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "edgemode" }
-  attrs: { name: "in" }
-  attrs: { name: "stddeviation" }
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-filter-primitive-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "FEMERGE"
-  mandatory_ancestor: "SVG"
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-filter-primitive-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "FEMERGENODE"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "in" }
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "FEOFFSET"
-  mandatory_ancestor: "SVG"
-  attrs: { name: "dx" }
-  attrs: { name: "dy" }
-  attrs: { name: "in" }
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-filter-primitive-attributes"
-  attr_lists: "svg-presentation-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-# ARIA
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "DESC"
-  mandatory_ancestor: "SVG"
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
-tags: {
-  html_format: AMP
-  html_format: AMP4ADS
-  tag_name: "TITLE"
-  spec_name: "svg title"
-  mandatory_ancestor: "SVG"
-  attr_lists: "svg-core-attributes"
-  attr_lists: "svg-style-attr"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
-}
+# See validator-svg.protoascii.
 
 # 4.8 Links
 # Links are a concept, rather than a tag. See tagspecs for "LINK", "A", etc.
@@ -3944,110 +3154,106 @@ tags: {
   }
   spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup"
 }
-# TODO(b/167681900): update documentation to cover these script release versions
-# TODO(b/173803451): allow module/nomodule tagspecs.
-#tags: {
-#  html_format: AMP
-#  enabled_by: "transformed"
-#  tag_name: "SCRIPT"
-#  spec_name: "amphtml module engine script"
-#  descriptive_name: "amphtml engine script"
-#  mandatory_alternatives: "amphtml engine script"
-#  unique: true
-#  mandatory_parent: "HEAD"
-#  satisfies: "amphtml module engine script"
-#  requires: "amphtml nomodule engine script"
-#  attr_lists: "nonce-attr"
-#  attr_lists: "amphtml-module-engine-attrs"
-#  attrs: {
-#    name: "src"
-#    mandatory: true
-#    value: "https://cdn.ampproject.org/v0.mjs"
-#    dispatch_key: NAME_VALUE_DISPATCH
-#  }
-#  cdata: {
-#    whitespace_only: true
-#  }
-#  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup"
-#}
-# TODO(b/167681900): update documentation to cover these script release versions
-# TODO(b/173803451): allow module/nomodule tagspecs.
-#tags: {
-#  html_format: AMP
-#  enabled_by: "transformed"
-#  tag_name: "SCRIPT"
-#  spec_name: "amphtml nomodule engine script"
-#  descriptive_name: "amphtml engine script"
-#  mandatory_alternatives: "amphtml engine script"
-#  unique: true
-#  mandatory_parent: "HEAD"
-#  satisfies: "amphtml nomodule engine script"
-#  requires: "amphtml module engine script"
-#  attr_lists: "nonce-attr"
-#  attr_lists: "amphtml-nomodule-engine-attrs"
-#  attrs: {
-#    name: "src"
-#    mandatory: true
-#    value: "https://cdn.ampproject.org/v0.js"
-#    dispatch_key: NAME_VALUE_DISPATCH
-#  }
-#  cdata: {
-#    whitespace_only: true
-#  }
-#  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup"
-#}
-# TODO(b/167681900): update documentation to cover these script release versions
-# TODO(b/173803451): allow module/nomodule tagspecs.
-#tags: {
-#  html_format: AMP
-#  enabled_by: "transformed"
-#  tag_name: "SCRIPT"
-#  spec_name: "amphtml module LTS engine script"
-#  descriptive_name: "amphtml engine script"
-#  mandatory_alternatives: "amphtml engine script"
-#  unique: true
-#  mandatory_parent: "HEAD"
-#  satisfies: "amphtml module LTS engine script"
-#  requires: "amphtml nomodule LTS engine script"
-#  attr_lists: "nonce-attr"
-#  attr_lists: "amphtml-module-engine-attrs"
-#  attrs: {
-#    name: "src"
-#    mandatory: true
-#    value: "https://cdn.ampproject.org/lts/v0.mjs"
-#    dispatch_key: NAME_VALUE_DISPATCH
-#  }
-#  cdata: {
-#    whitespace_only: true
-#  }
-#  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup"
-#}
-# TODO(b/167681900): update documentation to cover these script release versions
-# TODO(b/173803451): allow module/nomodule tagspecs.
-#tags: {
-#  html_format: AMP
-#  enabled_by: "transformed"
-#  tag_name: "SCRIPT"
-#  spec_name: "amphtml nomodule LTS engine script"
-#  descriptive_name: "amphtml engine script"
-#  mandatory_alternatives: "amphtml engine script"
-#  unique: true
-#  mandatory_parent: "HEAD"
-#  satisfies: "amphtml nomodule LTS engine script"
-#  requires: "amphtml module LTS engine script"
-#  attr_lists: "nonce-attr"
-#  attr_lists: "amphtml-nomodule-engine-attrs"
-#  attrs: {
-#    name: "src"
-#    mandatory: true
-#    value: "https://cdn.ampproject.org/lts/v0.js"
-#    dispatch_key: NAME_VALUE_DISPATCH
-#  }
-#  cdata: {
-#    whitespace_only: true
-#  }
-#  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup"
-#}
+tags: {
+  html_format: AMP
+  enabled_by: "transformed"
+  tag_name: "SCRIPT"
+  spec_name: "amphtml module engine script"
+  descriptive_name: "amphtml module engine script"
+  mandatory_alternatives: "amphtml engine script"
+  unique: true
+  mandatory_parent: "HEAD"
+  satisfies: "amphtml module engine script"
+  requires: "amphtml nomodule engine script"
+  attr_lists: "nonce-attr"
+  attr_lists: "amphtml-module-engine-attrs"
+  attrs: {
+    name: "src"
+    mandatory: true
+    value: "https://cdn.ampproject.org/v0.mjs"
+    dispatch_key: NAME_VALUE_DISPATCH
+  }
+  cdata: {
+    whitespace_only: true
+  }
+  # TODO(b/167681900): update spec_url to cover these script release versions
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup"
+}
+tags: {
+  html_format: AMP
+  enabled_by: "transformed"
+  tag_name: "SCRIPT"
+  spec_name: "amphtml nomodule engine script"
+  descriptive_name: "amphtml nomodule engine script"
+  mandatory_alternatives: "amphtml engine script"
+  unique: true
+  mandatory_parent: "HEAD"
+  satisfies: "amphtml nomodule engine script"
+  requires: "amphtml module engine script"
+  attr_lists: "nonce-attr"
+  attr_lists: "amphtml-nomodule-engine-attrs"
+  attrs: {
+    name: "src"
+    mandatory: true
+    value: "https://cdn.ampproject.org/v0.js"
+    dispatch_key: NAME_VALUE_DISPATCH
+  }
+  cdata: {
+    whitespace_only: true
+  }
+  # TODO(b/167681900): update spec_url to cover these script release versions
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup"
+}
+tags: {
+  html_format: AMP
+  enabled_by: "transformed"
+  tag_name: "SCRIPT"
+  spec_name: "amphtml module LTS engine script"
+  descriptive_name: "amphtml module LTS engine script"
+  mandatory_alternatives: "amphtml engine script"
+  unique: true
+  mandatory_parent: "HEAD"
+  satisfies: "amphtml module LTS engine script"
+  requires: "amphtml nomodule LTS engine script"
+  attr_lists: "nonce-attr"
+  attr_lists: "amphtml-module-engine-attrs"
+  attrs: {
+    name: "src"
+    mandatory: true
+    value: "https://cdn.ampproject.org/lts/v0.mjs"
+    dispatch_key: NAME_VALUE_DISPATCH
+  }
+  cdata: {
+    whitespace_only: true
+  }
+  # TODO(b/167681900): update spec_url to cover these script release versions
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup"
+}
+tags: {
+  html_format: AMP
+  enabled_by: "transformed"
+  tag_name: "SCRIPT"
+  spec_name: "amphtml nomodule LTS engine script"
+  descriptive_name: "amphtml nomdule LTS engine script"
+  mandatory_alternatives: "amphtml engine script"
+  unique: true
+  mandatory_parent: "HEAD"
+  satisfies: "amphtml nomodule LTS engine script"
+  requires: "amphtml module LTS engine script"
+  attr_lists: "nonce-attr"
+  attr_lists: "amphtml-nomodule-engine-attrs"
+  attrs: {
+    name: "src"
+    mandatory: true
+    value: "https://cdn.ampproject.org/lts/v0.js"
+    dispatch_key: NAME_VALUE_DISPATCH
+  }
+  cdata: {
+    whitespace_only: true
+  }
+  # TODO(b/167681900): update spec_url to cover these script release versions
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup"
+}
 tags: {
   html_format: AMP4EMAIL
   tag_name: "SCRIPT"
@@ -4164,6 +3370,25 @@ tags: {
     }
   }
 }
+# Enables early styling on fast failure to load v0.js. See GitHub #22543.
+tags: {
+  html_format: AMP
+  tag_name: "SCRIPT"
+  spec_name: "script amp-onerror"
+  descriptive_name: "script amp-onerror"
+  unique: true
+  mandatory_parent: "HEAD"
+  attrs: {
+    name: "amp-onerror"
+    value: ""
+    mandatory: true
+    dispatch_key: NAME_VALUE_DISPATCH
+  }
+  cdata: {
+    mandatory_cdata: "document.querySelector(\"script[src*='/v0.js']\").onerror=function(){document.querySelector('style[amp-boilerplate]').textContent=''}"
+  }
+}
+
 # Specific script tags for custom elements and runtime imports.
 # 4.11.2 The noscript element
 tags: {
@@ -4451,6 +3676,7 @@ tags: {  # <amp-img>
     supported_layouts: FIXED
     supported_layouts: FIXED_HEIGHT
     supported_layouts: FLEX_ITEM
+    supported_layouts: INTRINSIC
     supported_layouts: NODISPLAY
     supported_layouts: RESPONSIVE
   }
@@ -4520,6 +3746,10 @@ tags: {
     }
     css_declaration: { name: "padding-top" }
   }
+  attrs: {
+    name: "i-amphtml-disable-ar"
+    value: ""
+  }
 }
 
 tags: {
@@ -4534,6 +3764,10 @@ tags: {
     mandatory: true
     dispatch_key: NAME_DISPATCH
   }
+  attrs: {
+    name: "i-amphtml-disable-ar"
+    value: ""
+  }
 }
 
 tags: {
@@ -5821,6 +5055,11 @@ attr_lists: {
   attrs: { name: "[class]" }
   attrs: { name: "[hidden]" }
   attrs: { name: "[text]" }
+  attrs: {
+    enabled_by: "transformed"
+    name: "i-amphtml-binding"
+    value: ""
+  }
   # <amp-sidebar>
   attrs: {
     name: "autoscroll"
@@ -6546,3 +5785,9 @@ error_formats {
   format: "Tag 'html' marked with attribute 'data-ampdevmode'. Validator "
           "will suppress errors regarding any other tag with this attribute."
 }
+error_formats {
+  code: AMP_EMAIL_MISSING_STRICT_CSS_ATTR
+  format: "Tag 'html' marked with attribute 'amp4email' is missing the "
+          "corresponding attribute 'data-css-strict' for enabling strict "
+          "CSS validation. This may become an error in the future."
+}
diff --git a/validator/validator-svg.protoascii b/validator/validator-svg.protoascii
new file mode 100644
index 000000000..f1b0b4b28
--- /dev/null
+++ b/validator/validator-svg.protoascii
@@ -0,0 +1,1069 @@
+#
+# Copyright 2021 The AMP HTML Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS-IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the license.
+#
+
+# 4.7.15 SVG
+# We allow some limited embedded SVG tags. We do not allow inline styles
+# or embedding any external resources.
+
+# Attribute lists: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute
+attr_lists: {
+  name: "svg-conditional-processing-attributes"
+  attrs: { name: "requiredextensions" }
+  attrs: { name: "requiredfeatures" }
+  attrs: { name: "systemlanguage" }
+}
+attr_lists: {
+  name: "svg-core-attributes"
+  attrs: { name: "xml:lang" }
+  attrs: { name: "xml:space" }
+  attrs: { name: "xmlns" }
+  attrs: { name: "xmlns:xlink" }
+}
+attr_lists: {
+  name: "svg-filter-primitive-attributes"
+  attrs: { name: "height" }
+  attrs: { name: "result" }
+  attrs: { name: "width" }
+  attrs: { name: "x" }
+  attrs: { name: "y" }
+}
+attr_lists: {
+  name: "svg-presentation-attributes"
+  attrs: { name: "alignment-baseline" }
+  attrs: { name: "baseline-shift" }
+  attrs: { name: "clip" }
+  attrs: { name: "clip-path" }
+  attrs: { name: "clip-rule" }
+  attrs: { name: "color" }
+  attrs: { name: "color-interpolation" }
+  attrs: { name: "color-interpolation-filters" }
+  attrs: { name: "color-profile" }
+  attrs: { name: "color-rendering" }
+  attrs: { name: "cursor" }
+  attrs: { name: "direction" }
+  attrs: { name: "display" }
+  attrs: { name: "dominant-baseline" }
+  attrs: { name: "enable-background" }
+  attrs: { name: "fill" }
+  attrs: { name: "fill-opacity" }
+  attrs: { name: "fill-rule" }
+  attrs: { name: "filter" }
+  attrs: { name: "flood-color" }
+  attrs: { name: "flood-opacity" }
+  attrs: { name: "focusable" }
+  attrs: { name: "font-family" }
+  attrs: { name: "font-size" }
+  attrs: { name: "font-size-adjust" }
+  attrs: { name: "font-stretch" }
+  attrs: { name: "font-style" }
+  attrs: { name: "font-variant" }
+  attrs: { name: "font-weight" }
+  attrs: { name: "glyph-orientation-horizontal" }
+  attrs: { name: "glyph-orientation-vertical" }
+  attrs: { name: "image-rendering" }
+  attrs: { name: "kerning" }
+  attrs: { name: "letter-spacing" }
+  attrs: { name: "lighting-color" }
+  attrs: { name: "marker-end" }
+  attrs: { name: "marker-mid" }
+  attrs: { name: "marker-start" }
+  attrs: { name: "mask" }
+  attrs: { name: "opacity" }
+  attrs: { name: "overflow" }
+  attrs: { name: "pointer-events" }
+  attrs: { name: "shape-rendering" }
+  attrs: { name: "stop-color" }
+  attrs: { name: "stop-opacity" }
+  attrs: { name: "stroke" }
+  attrs: { name: "stroke-dasharray" }
+  attrs: { name: "stroke-dashoffset" }
+  attrs: { name: "stroke-linecap" }
+  attrs: { name: "stroke-linejoin" }
+  attrs: { name: "stroke-miterlimit" }
+  attrs: { name: "stroke-opacity" }
+  attrs: { name: "stroke-width" }
+  attrs: { name: "text-anchor" }
+  attrs: { name: "text-decoration" }
+  attrs: { name: "text-rendering" }
+  attrs: { name: "unicode-bidi" }
+  attrs: { name: "vector-effect" }
+  attrs: { name: "visibility" }
+  attrs: { name: "word-spacing" }
+  attrs: { name: "writing-mode" }
+}
+attr_lists: {
+  name: "svg-transfer-function-attributes"
+  attrs: { name: "amplitude" }
+  attrs: { name: "exponent" }
+  attrs: { name: "intercept" }
+  attrs: { name: "offset" }
+  attrs: { name: "slope" }
+  attrs: { name: "table" }
+  attrs: { name: "tablevalues" }
+  attrs: { name: "type" }
+}
+attr_lists: {
+  name: "svg-xlink-attributes"
+  attrs: { name: "xlink:actuate" }
+  attrs: { name: "xlink:arcrole" }
+  attrs: {
+    name: "xlink:href"
+    # xlink:href is deprecated since SVG2 in favor of href.
+    alternative_names: "href"
+    value_url: {
+      protocol: "http"
+      protocol: "https"
+      allow_empty: false
+    }
+  }
+  attrs: { name: "xlink:role" }
+  attrs: { name: "xlink:show" }
+  attrs: { name: "xlink:title" }
+  attrs: { name: "xlink:type" }
+}
+# Style attributes are broadly disallowed, but specifically allowed
+# within SVG as SVG are commonly generated by tools.
+attr_lists: {
+  name: "svg-style-attr"
+  attrs: {
+    name: "style"
+    # `style` attribute value validated against Document Level CSS rules defined
+    # in validator-css.protoascii.
+    value_doc_svg_css: true
+  }
+}
+
+# Basics
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "G"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "externalresourcesrequired" }
+  attrs: { name: "transform" }
+  attr_lists: "svg-conditional-processing-attributes"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "GLYPH"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "arabic-form" }
+  attrs: { name: "d" }
+  attrs: { name: "glyph-name" }
+  attrs: { name: "horiz-adv-x" }
+  attrs: { name: "orientation" }
+  attrs: { name: "unicode" }
+  attrs: { name: "vert-adv-y" }
+  attrs: { name: "vert-origin-x" }
+  attrs: { name: "vert-origin-y" }
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "GLYPHREF"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "dx" }
+  attrs: { name: "dy" }
+  attrs: { name: "format" }
+  attrs: { name: "glyphref" }
+  attrs: { name: "x" }
+  attrs: { name: "y" }
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  attr_lists: "svg-xlink-attributes"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "IMAGE"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "externalresourcesrequired" }
+  attrs: { name: "height" }
+  attrs: { name: "preserveaspectratio" }
+  attrs: { name: "transform" }
+  attrs: { name: "width" }
+  attrs: { name: "x" }
+  attrs: { name: "xlink:actuate" }
+  attrs: { name: "xlink:arcrole" }
+  attrs: {
+    name: "xlink:href"
+    # xlink:href is deprecated since SVG2 in favor of href.
+    alternative_names: "href"
+    value_url: {
+      protocol: "data"
+      protocol: "http"
+      protocol: "https"
+      allow_empty: false
+    }
+    # Inline SVGs execute in a different context and can affect page elements.
+    disallowed_value_regex: "(^|\\s)data:image\\/svg\\+xml"
+  }
+  attrs: { name: "xlink:role" }
+  attrs: { name: "xlink:show" }
+  attrs: { name: "xlink:title" }
+  attrs: { name: "xlink:type" }
+  attrs: { name: "y" }
+  attr_lists: "svg-conditional-processing-attributes"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "MARKER"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "externalresourcesrequired" }
+  attrs: { name: "markerheight" }
+  attrs: { name: "markerunits" }
+  attrs: { name: "markerwidth" }
+  attrs: { name: "orient" }
+  attrs: { name: "preserveaspectratio" }
+  attrs: { name: "refx" }
+  attrs: { name: "refy" }
+  attrs: { name: "transform" }
+  attrs: { name: "viewbox" }
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "METADATA"
+  mandatory_ancestor: "SVG"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "PATH"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "d" }
+  attrs: { name: "externalresourcesrequired" }
+  attrs: { name: "pathlength" }
+  attrs: { name: "sketch:type" }
+  attrs: { name: "transform" }
+  attr_lists: "svg-conditional-processing-attributes"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "SOLIDCOLOR"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "solid-color" }
+  attrs: { name: "solid-opacity" }
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "SVG"
+  attrs: { name: "contentscripttype" }
+  attrs: { name: "contentstyletype" }
+  attrs: { name: "externalresourcesrequired" }
+  attrs: { name: "height" }
+  attrs: { name: "preserveaspectratio" }
+  attrs: {
+    name: "version"
+    value: "1.0"
+    value: "1.1"
+  }
+  attrs: { name: "viewbox" }
+  attrs: { name: "width" }
+  attrs: { name: "x" }
+  attrs: { name: "y" }
+  attrs: { name: "zoomandpan" }
+  attr_lists: "svg-conditional-processing-attributes"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "SWITCH"
+  mandatory_ancestor: "SVG"
+  attr_lists: "svg-conditional-processing-attributes"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "VIEW"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "externalresourcesrequired" }
+  attrs: { name: "preserveaspectratio" }
+  attrs: { name: "viewbox" }
+  attrs: { name: "viewtarget" }
+  attrs: { name: "zoomandpan" }
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+# Shapes
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "CIRCLE"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "cx" }
+  attrs: { name: "cy" }
+  attrs: { name: "externalresourcesrequired" }
+  attrs: { name: "r" }
+  attrs: { name: "sketch:type" }
+  attrs: { name: "transform" }
+  attr_lists: "svg-conditional-processing-attributes"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "ELLIPSE"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "cx" }
+  attrs: { name: "cy" }
+  attrs: { name: "externalresourcesrequired" }
+  attrs: { name: "rx" }
+  attrs: { name: "ry" }
+  attrs: { name: "sketch:type" }
+  attrs: { name: "transform" }
+  attr_lists: "svg-conditional-processing-attributes"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "LINE"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "externalresourcesrequired" }
+  attrs: { name: "sketch:type" }
+  attrs: { name: "transform" }
+  attrs: { name: "x1" }
+  attrs: { name: "x2" }
+  attrs: { name: "y1" }
+  attrs: { name: "y2" }
+  attr_lists: "svg-conditional-processing-attributes"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "POLYGON"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "externalresourcesrequired" }
+  attrs: { name: "points" }
+  attrs: { name: "sketch:type" }
+  attrs: { name: "transform" }
+  attr_lists: "svg-conditional-processing-attributes"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "POLYLINE"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "externalresourcesrequired" }
+  attrs: { name: "points" }
+  attrs: { name: "sketch:type" }
+  attrs: { name: "transform" }
+  attr_lists: "svg-conditional-processing-attributes"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "RECT"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "externalresourcesrequired" }
+  attrs: { name: "height" }
+  attrs: { name: "rx" }
+  attrs: { name: "ry" }
+  attrs: { name: "sketch:type" }
+  attrs: { name: "transform" }
+  attrs: { name: "width" }
+  attrs: { name: "x" }
+  attrs: { name: "y" }
+  attr_lists: "svg-conditional-processing-attributes"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+# Text
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "TEXT"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "dx" }
+  attrs: { name: "dy" }
+  attrs: { name: "externalresourcesrequired" }
+  attrs: { name: "lengthadjust" }
+  attrs: { name: "rotate" }
+  attrs: { name: "text-anchor" }
+  attrs: { name: "textlength" }
+  attrs: { name: "transform" }
+  attrs: { name: "x" }
+  attrs: { name: "y" }
+  attr_lists: "svg-conditional-processing-attributes"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "TEXTPATH"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "externalresourcesrequired" }
+  attrs: { name: "method" }
+  attrs: { name: "spacing" }
+  attrs: { name: "startoffset" }
+  attr_lists: "svg-conditional-processing-attributes"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  attr_lists: "svg-xlink-attributes"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "TREF"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "externalresourcesrequired" }
+  attr_lists: "svg-conditional-processing-attributes"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  attr_lists: "svg-xlink-attributes"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "TSPAN"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "dx" }
+  attrs: { name: "dy" }
+  attrs: { name: "externalresourcesrequired" }
+  attrs: { name: "lengthadjust" }
+  attrs: { name: "rotate" }
+  attrs: { name: "textlength" }
+  attrs: { name: "x" }
+  attrs: { name: "y" }
+  attr_lists: "svg-conditional-processing-attributes"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+# Rendering
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "CLIPPATH"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "clippathunits" }
+  attrs: { name: "externalresourcesrequired" }
+  attrs: { name: "transform" }
+  attr_lists: "svg-conditional-processing-attributes"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "FILTER"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "externalresourcesrequired" }
+  attrs: { name: "filterres" }
+  attrs: { name: "filterunits" }
+  attrs: { name: "height" }
+  attrs: { name: "primitiveunits" }
+  attrs: { name: "width" }
+  attrs: { name: "x" }
+  attrs: { name: "y" }
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  attr_lists: "svg-xlink-attributes"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "HKERN"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "g1" }
+  attrs: { name: "g2" }
+  attrs: { name: "k" }
+  attrs: { name: "u1" }
+  attrs: { name: "u2" }
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "LINEARGRADIENT"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "externalresourcesrequired" }
+  attrs: { name: "gradienttransform" }
+  attrs: { name: "gradientunits" }
+  attrs: { name: "spreadmethod" }
+  attrs: { name: "x1" }
+  attrs: { name: "x2" }
+  attrs: { name: "y1" }
+  attrs: { name: "y2" }
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  attr_lists: "svg-xlink-attributes"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "MASK"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "externalresourcesrequired" }
+  attrs: { name: "height" }
+  attrs: { name: "maskcontentunits" }
+  attrs: { name: "maskunits" }
+  attrs: { name: "width" }
+  attrs: { name: "x" }
+  attrs: { name: "y" }
+  attr_lists: "svg-conditional-processing-attributes"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "PATTERN"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "externalresourcesrequired" }
+  attrs: { name: "height" }
+  attrs: { name: "patterncontentunits" }
+  attrs: { name: "patterntransform" }
+  attrs: { name: "patternunits" }
+  attrs: { name: "preserveaspectratio" }
+  attrs: { name: "viewbox" }
+  attrs: { name: "width" }
+  attrs: { name: "x" }
+  attrs: { name: "y" }
+  attr_lists: "svg-conditional-processing-attributes"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  attr_lists: "svg-xlink-attributes"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "RADIALGRADIENT"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "cx" }
+  attrs: { name: "cy" }
+  attrs: { name: "externalresourcesrequired" }
+  attrs: { name: "fr" }
+  attrs: { name: "fx" }
+  attrs: { name: "fy" }
+  attrs: { name: "gradienttransform" }
+  attrs: { name: "gradientunits" }
+  attrs: { name: "r" }
+  attrs: { name: "spreadmethod" }
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  attr_lists: "svg-xlink-attributes"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "STOP"
+  spec_name: "lineargradient > stop"
+  mandatory_ancestor: "LINEARGRADIENT"
+  attrs: { name: "offset" }
+  attrs: { name: "stop-color" }
+  attrs: { name: "stop-opacity" }
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "STOP"
+  spec_name: "radialgradient > stop"
+  mandatory_ancestor: "RADIALGRADIENT"
+  attrs: { name: "offset" }
+  attrs: { name: "stop-color" }
+  attrs: { name: "stop-opacity" }
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "VKERN"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "g1" }
+  attrs: { name: "g2" }
+  attrs: { name: "k" }
+  attrs: { name: "u1" }
+  attrs: { name: "u2" }
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+# Special
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "DEFS"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "externalresourcesrequired" }
+  attrs: { name: "transform" }
+  attr_lists: "svg-conditional-processing-attributes"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "SYMBOL"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "externalresourcesrequired" }
+  attrs: { name: "height" }
+  attrs: { name: "preserveaspectratio" }
+  attrs: { name: "viewbox" }
+  attrs: { name: "width" }
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "USE"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "externalresourcesrequired" }
+  attrs: { name: "height" }
+  attrs: { name: "transform" }
+  attrs: { name: "width" }
+  attrs: { name: "x" }
+  attrs: { name: "y" }
+  attr_lists: "svg-conditional-processing-attributes"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  attr_lists: "svg-xlink-attributes"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+# Filters
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "FEBLEND"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "in" }
+  attrs: { name: "in2" }
+  attrs: { name: "mode" }
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-filter-primitive-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "FECOLORMATRIX"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "in" }
+  attrs: { name: "type" }
+  attrs: { name: "values" }
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-filter-primitive-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "FECOMPONENTTRANSFER"
+  mandatory_ancestor: "SVG"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-filter-primitive-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "FECOMPOSITE"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "in" }
+  attrs: { name: "in2" }
+  attrs: { name: "k1" }
+  attrs: { name: "k2" }
+  attrs: { name: "k3" }
+  attrs: { name: "k4" }
+  attrs: { name: "operator" }
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-filter-primitive-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "FECONVOLVEMATRIX"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "bias" }
+  attrs: { name: "divisor" }
+  attrs: { name: "edgemode" }
+  attrs: { name: "in" }
+  attrs: { name: "kernelmatrix" }
+  attrs: { name: "kernelunitlength" }
+  attrs: { name: "order" }
+  attrs: { name: "preservealpha" }
+  attrs: { name: "targetx" }
+  attrs: { name: "targety" }
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-filter-primitive-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "FEDIFFUSELIGHTING"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "diffuseconstant" }
+  attrs: { name: "in" }
+  attrs: { name: "kernelunitlength" }
+  attrs: { name: "surfacescale" }
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-filter-primitive-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "FEDISPLACEMENTMAP"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "in" }
+  attrs: { name: "in2" }
+  attrs: { name: "scale" }
+  attrs: { name: "xchannelselector" }
+  attrs: { name: "ychannelselector" }
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-filter-primitive-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "FEDISTANTLIGHT"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "azimuth" }
+  attrs: { name: "elevation" }
+  attr_lists: "svg-core-attributes"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "FEDROPSHADOW"
+  mandatory_ancestor: "SVG"
+  mandatory_parent: "FILTER"
+  attrs: { name: "dx" }
+  attrs: { name: "dy" }
+  attrs: { name: "stddeviation" }
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-filter-primitive-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "FEFLOOD"
+  mandatory_ancestor: "SVG"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-filter-primitive-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "FEFUNCA"
+  mandatory_ancestor: "SVG"
+  mandatory_parent: "FECOMPONENTTRANSFER"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-transfer-function-attributes"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "FEFUNCB"
+  mandatory_ancestor: "SVG"
+  mandatory_parent: "FECOMPONENTTRANSFER"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-transfer-function-attributes"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "FEFUNCG"
+  mandatory_ancestor: "SVG"
+  mandatory_parent: "FECOMPONENTTRANSFER"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-transfer-function-attributes"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "FEFUNCR"
+  mandatory_ancestor: "SVG"
+  mandatory_parent: "FECOMPONENTTRANSFER"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-transfer-function-attributes"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "FEGAUSSIANBLUR"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "edgemode" }
+  attrs: { name: "in" }
+  attrs: { name: "stddeviation" }
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-filter-primitive-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "FEMERGE"
+  mandatory_ancestor: "SVG"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-filter-primitive-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "FEMERGENODE"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "in" }
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "FEMORPHOLOGY"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "in" }
+  attrs: { name: "operator" }
+  attrs: { name: "radius" }
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-filter-primitive-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "FEOFFSET"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "dx" }
+  attrs: { name: "dy" }
+  attrs: { name: "in" }
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-filter-primitive-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "FEPOINTLIGHT"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "x" }
+  attrs: { name: "y" }
+  attrs: { name: "z" }
+  attr_lists: "svg-core-attributes"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "FESPECULARLIGHTING"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "in" }
+  attrs: { name: "kernelunitlength" }
+  attrs: { name: "specularconstant" }
+  attrs: { name: "specularexponent" }
+  attrs: { name: "surfacescale" }
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-filter-primitive-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "FESPOTLIGHT"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "limitingconeangle" }
+  attrs: { name: "pointsatx" }
+  attrs: { name: "pointsaty" }
+  attrs: { name: "pointsatz" }
+  attrs: { name: "specularexponent" }
+  attrs: { name: "x" }
+  attrs: { name: "y" }
+  attrs: { name: "z" }
+  attr_lists: "svg-core-attributes"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "FETILE"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "in" }
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-filter-primitive-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "FETURBULENCE"
+  mandatory_ancestor: "SVG"
+  attrs: { name: "basefrequency" }
+  attrs: { name: "numoctaves" }
+  attrs: { name: "seed" }
+  attrs: { name: "stitchtiles" }
+  attrs: { name: "type" }
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-filter-primitive-attributes"
+  attr_lists: "svg-presentation-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+# ARIA
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "DESC"
+  mandatory_ancestor: "SVG"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}
+tags: {
+  html_format: AMP
+  html_format: AMP4ADS
+  tag_name: "TITLE"
+  spec_name: "svg title"
+  mandatory_ancestor: "SVG"
+  attr_lists: "svg-core-attributes"
+  attr_lists: "svg-style-attr"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#svg"
+}

@westonruter westonruter added this to the v2.1 milestone Mar 19, 2021
@codecov
Copy link

codecov bot commented Mar 19, 2021

Codecov Report

Merging #5998 (55effe6) into develop (a97651d) will decrease coverage by 4.79%.
The diff coverage is 88.88%.

❗ Current head 55effe6 differs from pull request most recent head bca8eb7. Consider uploading reports for the commit bca8eb7 to get more accurate results
Impacted file tree graph

@@              Coverage Diff              @@
##             develop    #5998      +/-   ##
=============================================
- Coverage      80.05%   75.26%   -4.80%     
- Complexity         0     5703    +5703     
=============================================
  Files             41      218     +177     
  Lines            702    17275   +16573     
=============================================
+ Hits             562    13002   +12440     
- Misses           140     4273    +4133     
Flag Coverage Δ Complexity Δ
javascript 80.05% <ø> (ø) 0.00 <ø> (ø)
php 75.06% <88.88%> (?) 0.00 <0.00> (?)

Flags with carried forward coverage won't be shown. Click here to find out more.

Impacted Files Coverage Δ Complexity Δ
...es/sanitizers/class-amp-allowed-tags-generated.php 46.42% <ø> (ø) 14.00 <0.00> (?)
...nitizers/class-amp-tag-and-attribute-sanitizer.php 97.70% <50.00%> (ø) 453.00 <0.00> (?)
includes/sanitizers/class-amp-img-sanitizer.php 97.64% <100.00%> (ø) 87.00 <0.00> (?)
includes/sanitizers/class-amp-style-sanitizer.php 86.56% <100.00%> (ø) 453.00 <0.00> (?)
includes/sanitizers/class-amp-block-sanitizer.php 82.43% <0.00%> (ø) 31.00% <0.00%> (?%)
...rc/PairedUrlStructure/LegacyReaderUrlStructure.php 94.73% <0.00%> (ø) 16.00% <0.00%> (?%)
templates/header-bar.php 100.00% <0.00%> (ø) 0.00% <0.00%> (?%)
includes/sanitizers/class-amp-base-sanitizer.php 78.66% <0.00%> (ø) 146.00% <0.00%> (?%)
includes/sanitizers/class-amp-script-sanitizer.php 100.00% <0.00%> (ø) 11.00% <0.00%> (?%)
.../Transformer/AmpSchemaOrgMetadataConfiguration.php 0.00% <0.00%> (ø) 4.00% <0.00%> (?%)
... and 171 more

@github-actions
Copy link
Contributor

github-actions bot commented Mar 19, 2021

Plugin builds for bca8eb7 are ready 🛎️!

includes/sanitizers/class-amp-img-sanitizer.php Outdated Show resolved Hide resolved
@@ -637,6 +654,18 @@ static function () {
[ 'amp-story-player' ],
],

'amp_google_assistant_assistjs' => [
// Note: the first line is commented out because it is broken in AMP currently.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suppose the only time this will be uncommented is when there is a future spec update that adds support for amp-google-assistant-assistjs-config > script.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes

Co-authored-by: Pierre Gordon <[email protected]>
@westonruter westonruter added Validation WS:Core Work stream for Plugin core labels Mar 20, 2021
@westonruter westonruter merged commit 92387aa into develop Mar 20, 2021
@westonruter westonruter deleted the update/amphtml-1bbd5505985 branch March 20, 2021 02:33
@westonruter westonruter mentioned this pull request May 21, 2021
10 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Validation WS:Core Work stream for Plugin core
Projects
None yet
2 participants