aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan <me@jordan.im>2022-02-10 19:08:25 -0700
committerJordan <me@jordan.im>2022-02-10 19:08:25 -0700
commit90feb03edc6a4c737e69f245a5b19a9e13c77570 (patch)
treeb922988fc68c0061d833a46aee05a7e24e795091
parentf4ad4e4adf34c65bc83bbdc586499e3136a26be1 (diff)
downloadcrane-90feb03edc6a4c737e69f245a5b19a9e13c77570.tar.gz
crane-90feb03edc6a4c737e69f245a5b19a9e13c77570.zip
go mod vendor
-rw-r--r--vendor/golang.org/x/net/AUTHORS3
-rw-r--r--vendor/golang.org/x/net/CONTRIBUTORS3
-rw-r--r--vendor/golang.org/x/net/LICENSE27
-rw-r--r--vendor/golang.org/x/net/PATENTS22
-rw-r--r--vendor/golang.org/x/net/html/atom/atom.go78
-rw-r--r--vendor/golang.org/x/net/html/atom/table.go783
-rw-r--r--vendor/golang.org/x/net/html/const.go111
-rw-r--r--vendor/golang.org/x/net/html/doc.go106
-rw-r--r--vendor/golang.org/x/net/html/doctype.go156
-rw-r--r--vendor/golang.org/x/net/html/entity.go2253
-rw-r--r--vendor/golang.org/x/net/html/escape.go258
-rw-r--r--vendor/golang.org/x/net/html/foreign.go222
-rw-r--r--vendor/golang.org/x/net/html/node.go225
-rw-r--r--vendor/golang.org/x/net/html/parse.go2438
-rw-r--r--vendor/golang.org/x/net/html/render.go273
-rw-r--r--vendor/golang.org/x/net/html/token.go1224
-rw-r--r--vendor/golang.org/x/net/publicsuffix/list.go181
-rw-r--r--vendor/golang.org/x/net/publicsuffix/table.go10435
-rw-r--r--vendor/modules.txt5
19 files changed, 18803 insertions, 0 deletions
diff --git a/vendor/golang.org/x/net/AUTHORS b/vendor/golang.org/x/net/AUTHORS
new file mode 100644
index 0000000..15167cd
--- /dev/null
+++ b/vendor/golang.org/x/net/AUTHORS
@@ -0,0 +1,3 @@
+# This source code refers to The Go Authors for copyright purposes.
+# The master list of authors is in the main Go distribution,
+# visible at http://tip.golang.org/AUTHORS.
diff --git a/vendor/golang.org/x/net/CONTRIBUTORS b/vendor/golang.org/x/net/CONTRIBUTORS
new file mode 100644
index 0000000..1c4577e
--- /dev/null
+++ b/vendor/golang.org/x/net/CONTRIBUTORS
@@ -0,0 +1,3 @@
+# This source code was written by the Go contributors.
+# The master list of contributors is in the main Go distribution,
+# visible at http://tip.golang.org/CONTRIBUTORS.
diff --git a/vendor/golang.org/x/net/LICENSE b/vendor/golang.org/x/net/LICENSE
new file mode 100644
index 0000000..6a66aea
--- /dev/null
+++ b/vendor/golang.org/x/net/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2009 The Go Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/golang.org/x/net/PATENTS b/vendor/golang.org/x/net/PATENTS
new file mode 100644
index 0000000..7330990
--- /dev/null
+++ b/vendor/golang.org/x/net/PATENTS
@@ -0,0 +1,22 @@
+Additional IP Rights Grant (Patents)
+
+"This implementation" means the copyrightable works distributed by
+Google as part of the Go project.
+
+Google hereby grants to You a perpetual, worldwide, non-exclusive,
+no-charge, royalty-free, irrevocable (except as stated in this section)
+patent license to make, have made, use, offer to sell, sell, import,
+transfer and otherwise run, modify and propagate the contents of this
+implementation of Go, where such license applies only to those patent
+claims, both currently owned or controlled by Google and acquired in
+the future, licensable by Google that are necessarily infringed by this
+implementation of Go. This grant does not include claims that would be
+infringed only as a consequence of further modification of this
+implementation. If you or your agent or exclusive licensee institute or
+order or agree to the institution of patent litigation against any
+entity (including a cross-claim or counterclaim in a lawsuit) alleging
+that this implementation of Go or any code incorporated within this
+implementation of Go constitutes direct or contributory patent
+infringement, or inducement of patent infringement, then any patent
+rights granted to you under this License for this implementation of Go
+shall terminate as of the date such litigation is filed.
diff --git a/vendor/golang.org/x/net/html/atom/atom.go b/vendor/golang.org/x/net/html/atom/atom.go
new file mode 100644
index 0000000..cd0a8ac
--- /dev/null
+++ b/vendor/golang.org/x/net/html/atom/atom.go
@@ -0,0 +1,78 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package atom provides integer codes (also known as atoms) for a fixed set of
+// frequently occurring HTML strings: tag names and attribute keys such as "p"
+// and "id".
+//
+// Sharing an atom's name between all elements with the same tag can result in
+// fewer string allocations when tokenizing and parsing HTML. Integer
+// comparisons are also generally faster than string comparisons.
+//
+// The value of an atom's particular code is not guaranteed to stay the same
+// between versions of this package. Neither is any ordering guaranteed:
+// whether atom.H1 < atom.H2 may also change. The codes are not guaranteed to
+// be dense. The only guarantees are that e.g. looking up "div" will yield
+// atom.Div, calling atom.Div.String will return "div", and atom.Div != 0.
+package atom // import "golang.org/x/net/html/atom"
+
+// Atom is an integer code for a string. The zero value maps to "".
+type Atom uint32
+
+// String returns the atom's name.
+func (a Atom) String() string {
+ start := uint32(a >> 8)
+ n := uint32(a & 0xff)
+ if start+n > uint32(len(atomText)) {
+ return ""
+ }
+ return atomText[start : start+n]
+}
+
+func (a Atom) string() string {
+ return atomText[a>>8 : a>>8+a&0xff]
+}
+
+// fnv computes the FNV hash with an arbitrary starting value h.
+func fnv(h uint32, s []byte) uint32 {
+ for i := range s {
+ h ^= uint32(s[i])
+ h *= 16777619
+ }
+ return h
+}
+
+func match(s string, t []byte) bool {
+ for i, c := range t {
+ if s[i] != c {
+ return false
+ }
+ }
+ return true
+}
+
+// Lookup returns the atom whose name is s. It returns zero if there is no
+// such atom. The lookup is case sensitive.
+func Lookup(s []byte) Atom {
+ if len(s) == 0 || len(s) > maxAtomLen {
+ return 0
+ }
+ h := fnv(hash0, s)
+ if a := table[h&uint32(len(table)-1)]; int(a&0xff) == len(s) && match(a.string(), s) {
+ return a
+ }
+ if a := table[(h>>16)&uint32(len(table)-1)]; int(a&0xff) == len(s) && match(a.string(), s) {
+ return a
+ }
+ return 0
+}
+
+// String returns a string whose contents are equal to s. In that sense, it is
+// equivalent to string(s) but may be more efficient.
+func String(s []byte) string {
+ if a := Lookup(s); a != 0 {
+ return a.String()
+ }
+ return string(s)
+}
diff --git a/vendor/golang.org/x/net/html/atom/table.go b/vendor/golang.org/x/net/html/atom/table.go
new file mode 100644
index 0000000..2a93886
--- /dev/null
+++ b/vendor/golang.org/x/net/html/atom/table.go
@@ -0,0 +1,783 @@
+// Code generated by go generate gen.go; DO NOT EDIT.
+
+//go:generate go run gen.go
+
+package atom
+
+const (
+ A Atom = 0x1
+ Abbr Atom = 0x4
+ Accept Atom = 0x1a06
+ AcceptCharset Atom = 0x1a0e
+ Accesskey Atom = 0x2c09
+ Acronym Atom = 0xaa07
+ Action Atom = 0x27206
+ Address Atom = 0x6f307
+ Align Atom = 0xb105
+ Allowfullscreen Atom = 0x2080f
+ Allowpaymentrequest Atom = 0xc113
+ Allowusermedia Atom = 0xdd0e
+ Alt Atom = 0xf303
+ Annotation Atom = 0x1c90a
+ AnnotationXml Atom = 0x1c90e
+ Applet Atom = 0x31906
+ Area Atom = 0x35604
+ Article Atom = 0x3fc07
+ As Atom = 0x3c02
+ Aside Atom = 0x10705
+ Async Atom = 0xff05
+ Audio Atom = 0x11505
+ Autocomplete Atom = 0x2780c
+ Autofocus Atom = 0x12109
+ Autoplay Atom = 0x13c08
+ B Atom = 0x101
+ Base Atom = 0x3b04
+ Basefont Atom = 0x3b08
+ Bdi Atom = 0xba03
+ Bdo Atom = 0x14b03
+ Bgsound Atom = 0x15e07
+ Big Atom = 0x17003
+ Blink Atom = 0x17305
+ Blockquote Atom = 0x1870a
+ Body Atom = 0x2804
+ Br Atom = 0x202
+ Button Atom = 0x19106
+ Canvas Atom = 0x10306
+ Caption Atom = 0x23107
+ Center Atom = 0x22006
+ Challenge Atom = 0x29b09
+ Charset Atom = 0x2107
+ Checked Atom = 0x47907
+ Cite Atom = 0x19c04
+ Class Atom = 0x56405
+ Code Atom = 0x5c504
+ Col Atom = 0x1ab03
+ Colgroup Atom = 0x1ab08
+ Color Atom = 0x1bf05
+ Cols Atom = 0x1c404
+ Colspan Atom = 0x1c407
+ Command Atom = 0x1d707
+ Content Atom = 0x58b07
+ Contenteditable Atom = 0x58b0f
+ Contextmenu Atom = 0x3800b
+ Controls Atom = 0x1de08
+ Coords Atom = 0x1ea06
+ Crossorigin Atom = 0x1fb0b
+ Data Atom = 0x4a504
+ Datalist Atom = 0x4a508
+ Datetime Atom = 0x2b808
+ Dd Atom = 0x2d702
+ Default Atom = 0x10a07
+ Defer Atom = 0x5c705
+ Del Atom = 0x45203
+ Desc Atom = 0x56104
+ Details Atom = 0x7207
+ Dfn Atom = 0x8703
+ Dialog Atom = 0xbb06
+ Dir Atom = 0x9303
+ Dirname Atom = 0x9307
+ Disabled Atom = 0x16408
+ Div Atom = 0x16b03
+ Dl Atom = 0x5e602
+ Download Atom = 0x46308
+ Draggable Atom = 0x17a09
+ Dropzone Atom = 0x40508
+ Dt Atom = 0x64b02
+ Em Atom = 0x6e02
+ Embed Atom = 0x6e05
+ Enctype Atom = 0x28d07
+ Face Atom = 0x21e04
+ Fieldset Atom = 0x22608
+ Figcaption Atom = 0x22e0a
+ Figure Atom = 0x24806
+ Font Atom = 0x3f04
+ Footer Atom = 0xf606
+ For Atom = 0x25403
+ ForeignObject Atom = 0x2540d
+ Foreignobject Atom = 0x2610d
+ Form Atom = 0x26e04
+ Formaction Atom = 0x26e0a
+ Formenctype Atom = 0x2890b
+ Formmethod Atom = 0x2a40a
+ Formnovalidate Atom = 0x2ae0e
+ Formtarget Atom = 0x2c00a
+ Frame Atom = 0x8b05
+ Frameset Atom = 0x8b08
+ H1 Atom = 0x15c02
+ H2 Atom = 0x2de02
+ H3 Atom = 0x30d02
+ H4 Atom = 0x34502
+ H5 Atom = 0x34f02
+ H6 Atom = 0x64d02
+ Head Atom = 0x33104
+ Header Atom = 0x33106
+ Headers Atom = 0x33107
+ Height Atom = 0x5206
+ Hgroup Atom = 0x2ca06
+ Hidden Atom = 0x2d506
+ High Atom = 0x2db04
+ Hr Atom = 0x15702
+ Href Atom = 0x2e004
+ Hreflang Atom = 0x2e008
+ Html Atom = 0x5604
+ HttpEquiv Atom = 0x2e80a
+ I Atom = 0x601
+ Icon Atom = 0x58a04
+ Id Atom = 0x10902
+ Iframe Atom = 0x2fc06
+ Image Atom = 0x30205
+ Img Atom = 0x30703
+ Input Atom = 0x44b05
+ Inputmode Atom = 0x44b09
+ Ins Atom = 0x20403
+ Integrity Atom = 0x23f09
+ Is Atom = 0x16502
+ Isindex Atom = 0x30f07
+ Ismap Atom = 0x31605
+ Itemid Atom = 0x38b06
+ Itemprop Atom = 0x19d08
+ Itemref Atom = 0x3cd07
+ Itemscope Atom = 0x67109
+ Itemtype Atom = 0x31f08
+ Kbd Atom = 0xb903
+ Keygen Atom = 0x3206
+ Keytype Atom = 0xd607
+ Kind Atom = 0x17704
+ Label Atom = 0x5905
+ Lang Atom = 0x2e404
+ Legend Atom = 0x18106
+ Li Atom = 0xb202
+ Link Atom = 0x17404
+ List Atom = 0x4a904
+ Listing Atom = 0x4a907
+ Loop Atom = 0x5d04
+ Low Atom = 0xc303
+ Main Atom = 0x1004
+ Malignmark Atom = 0xb00a
+ Manifest Atom = 0x6d708
+ Map Atom = 0x31803
+ Mark Atom = 0xb604
+ Marquee Atom = 0x32707
+ Math Atom = 0x32e04
+ Max Atom = 0x33d03
+ Maxlength Atom = 0x33d09
+ Media Atom = 0xe605
+ Mediagroup Atom = 0xe60a
+ Menu Atom = 0x38704
+ Menuitem Atom = 0x38708
+ Meta Atom = 0x4b804
+ Meter Atom = 0x9805
+ Method Atom = 0x2a806
+ Mglyph Atom = 0x30806
+ Mi Atom = 0x34702
+ Min Atom = 0x34703
+ Minlength Atom = 0x34709
+ Mn Atom = 0x2b102
+ Mo Atom = 0xa402
+ Ms Atom = 0x67402
+ Mtext Atom = 0x35105
+ Multiple Atom = 0x35f08
+ Muted Atom = 0x36705
+ Name Atom = 0x9604
+ Nav Atom = 0x1303
+ Nobr Atom = 0x3704
+ Noembed Atom = 0x6c07
+ Noframes Atom = 0x8908
+ Nomodule Atom = 0xa208
+ Nonce Atom = 0x1a605
+ Noscript Atom = 0x21608
+ Novalidate Atom = 0x2b20a
+ Object Atom = 0x26806
+ Ol Atom = 0x13702
+ Onabort Atom = 0x19507
+ Onafterprint Atom = 0x2360c
+ Onautocomplete Atom = 0x2760e
+ Onautocompleteerror Atom = 0x27613
+ Onauxclick Atom = 0x61f0a
+ Onbeforeprint Atom = 0x69e0d
+ Onbeforeunload Atom = 0x6e70e
+ Onblur Atom = 0x56d06
+ Oncancel Atom = 0x11908
+ Oncanplay Atom = 0x14d09
+ Oncanplaythrough Atom = 0x14d10
+ Onchange Atom = 0x41b08
+ Onclick Atom = 0x2f507
+ Onclose Atom = 0x36c07
+ Oncontextmenu Atom = 0x37e0d
+ Oncopy Atom = 0x39106
+ Oncuechange Atom = 0x3970b
+ Oncut Atom = 0x3a205
+ Ondblclick Atom = 0x3a70a
+ Ondrag Atom = 0x3b106
+ Ondragend Atom = 0x3b109
+ Ondragenter Atom = 0x3ba0b
+ Ondragexit Atom = 0x3c50a
+ Ondragleave Atom = 0x3df0b
+ Ondragover Atom = 0x3ea0a
+ Ondragstart Atom = 0x3f40b
+ Ondrop Atom = 0x40306
+ Ondurationchange Atom = 0x41310
+ Onemptied Atom = 0x40a09
+ Onended Atom = 0x42307
+ Onerror Atom = 0x42a07
+ Onfocus Atom = 0x43107
+ Onhashchange Atom = 0x43d0c
+ Oninput Atom = 0x44907
+ Oninvalid Atom = 0x45509
+ Onkeydown Atom = 0x45e09
+ Onkeypress Atom = 0x46b0a
+ Onkeyup Atom = 0x48007
+ Onlanguagechange Atom = 0x48d10
+ Onload Atom = 0x49d06
+ Onloadeddata Atom = 0x49d0c
+ Onloadedmetadata Atom = 0x4b010
+ Onloadend Atom = 0x4c609
+ Onloadstart Atom = 0x4cf0b
+ Onmessage Atom = 0x4da09
+ Onmessageerror Atom = 0x4da0e
+ Onmousedown Atom = 0x4e80b
+ Onmouseenter Atom = 0x4f30c
+ Onmouseleave Atom = 0x4ff0c
+ Onmousemove Atom = 0x50b0b
+ Onmouseout Atom = 0x5160a
+ Onmouseover Atom = 0x5230b
+ Onmouseup Atom = 0x52e09
+ Onmousewheel Atom = 0x53c0c
+ Onoffline Atom = 0x54809
+ Ononline Atom = 0x55108
+ Onpagehide Atom = 0x5590a
+ Onpageshow Atom = 0x5730a
+ Onpaste Atom = 0x57f07
+ Onpause Atom = 0x59a07
+ Onplay Atom = 0x5a406
+ Onplaying Atom = 0x5a409
+ Onpopstate Atom = 0x5ad0a
+ Onprogress Atom = 0x5b70a
+ Onratechange Atom = 0x5cc0c
+ Onrejectionhandled Atom = 0x5d812
+ Onreset Atom = 0x5ea07
+ Onresize Atom = 0x5f108
+ Onscroll Atom = 0x60008
+ Onsecuritypolicyviolation Atom = 0x60819
+ Onseeked Atom = 0x62908
+ Onseeking Atom = 0x63109
+ Onselect Atom = 0x63a08
+ Onshow Atom = 0x64406
+ Onsort Atom = 0x64f06
+ Onstalled Atom = 0x65909
+ Onstorage Atom = 0x66209
+ Onsubmit Atom = 0x66b08
+ Onsuspend Atom = 0x67b09
+ Ontimeupdate Atom = 0x400c
+ Ontoggle Atom = 0x68408
+ Onunhandledrejection Atom = 0x68c14
+ Onunload Atom = 0x6ab08
+ Onvolumechange Atom = 0x6b30e
+ Onwaiting Atom = 0x6c109
+ Onwheel Atom = 0x6ca07
+ Open Atom = 0x1a304
+ Optgroup Atom = 0x5f08
+ Optimum Atom = 0x6d107
+ Option Atom = 0x6e306
+ Output Atom = 0x51d06
+ P Atom = 0xc01
+ Param Atom = 0xc05
+ Pattern Atom = 0x6607
+ Picture Atom = 0x7b07
+ Ping Atom = 0xef04
+ Placeholder Atom = 0x1310b
+ Plaintext Atom = 0x1b209
+ Playsinline Atom = 0x1400b
+ Poster Atom = 0x2cf06
+ Pre Atom = 0x47003
+ Preload Atom = 0x48607
+ Progress Atom = 0x5b908
+ Prompt Atom = 0x53606
+ Public Atom = 0x58606
+ Q Atom = 0xcf01
+ Radiogroup Atom = 0x30a
+ Rb Atom = 0x3a02
+ Readonly Atom = 0x35708
+ Referrerpolicy Atom = 0x3d10e
+ Rel Atom = 0x48703
+ Required Atom = 0x24c08
+ Reversed Atom = 0x8008
+ Rows Atom = 0x9c04
+ Rowspan Atom = 0x9c07
+ Rp Atom = 0x23c02
+ Rt Atom = 0x19a02
+ Rtc Atom = 0x19a03
+ Ruby Atom = 0xfb04
+ S Atom = 0x2501
+ Samp Atom = 0x7804
+ Sandbox Atom = 0x12907
+ Scope Atom = 0x67505
+ Scoped Atom = 0x67506
+ Script Atom = 0x21806
+ Seamless Atom = 0x37108
+ Section Atom = 0x56807
+ Select Atom = 0x63c06
+ Selected Atom = 0x63c08
+ Shape Atom = 0x1e505
+ Size Atom = 0x5f504
+ Sizes Atom = 0x5f505
+ Slot Atom = 0x1ef04
+ Small Atom = 0x20605
+ Sortable Atom = 0x65108
+ Sorted Atom = 0x33706
+ Source Atom = 0x37806
+ Spacer Atom = 0x43706
+ Span Atom = 0x9f04
+ Spellcheck Atom = 0x4740a
+ Src Atom = 0x5c003
+ Srcdoc Atom = 0x5c006
+ Srclang Atom = 0x5f907
+ Srcset Atom = 0x6f906
+ Start Atom = 0x3fa05
+ Step Atom = 0x58304
+ Strike Atom = 0xd206
+ Strong Atom = 0x6dd06
+ Style Atom = 0x6ff05
+ Sub Atom = 0x66d03
+ Summary Atom = 0x70407
+ Sup Atom = 0x70b03
+ Svg Atom = 0x70e03
+ System Atom = 0x71106
+ Tabindex Atom = 0x4be08
+ Table Atom = 0x59505
+ Target Atom = 0x2c406
+ Tbody Atom = 0x2705
+ Td Atom = 0x9202
+ Template Atom = 0x71408
+ Textarea Atom = 0x35208
+ Tfoot Atom = 0xf505
+ Th Atom = 0x15602
+ Thead Atom = 0x33005
+ Time Atom = 0x4204
+ Title Atom = 0x11005
+ Tr Atom = 0xcc02
+ Track Atom = 0x1ba05
+ Translate Atom = 0x1f209
+ Tt Atom = 0x6802
+ Type Atom = 0xd904
+ Typemustmatch Atom = 0x2900d
+ U Atom = 0xb01
+ Ul Atom = 0xa702
+ Updateviacache Atom = 0x460e
+ Usemap Atom = 0x59e06
+ Value Atom = 0x1505
+ Var Atom = 0x16d03
+ Video Atom = 0x2f105
+ Wbr Atom = 0x57c03
+ Width Atom = 0x64905
+ Workertype Atom = 0x71c0a
+ Wrap Atom = 0x72604
+ Xmp Atom = 0x12f03
+)
+
+const hash0 = 0x81cdf10e
+
+const maxAtomLen = 25
+
+var table = [1 << 9]Atom{
+ 0x1: 0xe60a, // mediagroup
+ 0x2: 0x2e404, // lang
+ 0x4: 0x2c09, // accesskey
+ 0x5: 0x8b08, // frameset
+ 0x7: 0x63a08, // onselect
+ 0x8: 0x71106, // system
+ 0xa: 0x64905, // width
+ 0xc: 0x2890b, // formenctype
+ 0xd: 0x13702, // ol
+ 0xe: 0x3970b, // oncuechange
+ 0x10: 0x14b03, // bdo
+ 0x11: 0x11505, // audio
+ 0x12: 0x17a09, // draggable
+ 0x14: 0x2f105, // video
+ 0x15: 0x2b102, // mn
+ 0x16: 0x38704, // menu
+ 0x17: 0x2cf06, // poster
+ 0x19: 0xf606, // footer
+ 0x1a: 0x2a806, // method
+ 0x1b: 0x2b808, // datetime
+ 0x1c: 0x19507, // onabort
+ 0x1d: 0x460e, // updateviacache
+ 0x1e: 0xff05, // async
+ 0x1f: 0x49d06, // onload
+ 0x21: 0x11908, // oncancel
+ 0x22: 0x62908, // onseeked
+ 0x23: 0x30205, // image
+ 0x24: 0x5d812, // onrejectionhandled
+ 0x26: 0x17404, // link
+ 0x27: 0x51d06, // output
+ 0x28: 0x33104, // head
+ 0x29: 0x4ff0c, // onmouseleave
+ 0x2a: 0x57f07, // onpaste
+ 0x2b: 0x5a409, // onplaying
+ 0x2c: 0x1c407, // colspan
+ 0x2f: 0x1bf05, // color
+ 0x30: 0x5f504, // size
+ 0x31: 0x2e80a, // http-equiv
+ 0x33: 0x601, // i
+ 0x34: 0x5590a, // onpagehide
+ 0x35: 0x68c14, // onunhandledrejection
+ 0x37: 0x42a07, // onerror
+ 0x3a: 0x3b08, // basefont
+ 0x3f: 0x1303, // nav
+ 0x40: 0x17704, // kind
+ 0x41: 0x35708, // readonly
+ 0x42: 0x30806, // mglyph
+ 0x44: 0xb202, // li
+ 0x46: 0x2d506, // hidden
+ 0x47: 0x70e03, // svg
+ 0x48: 0x58304, // step
+ 0x49: 0x23f09, // integrity
+ 0x4a: 0x58606, // public
+ 0x4c: 0x1ab03, // col
+ 0x4d: 0x1870a, // blockquote
+ 0x4e: 0x34f02, // h5
+ 0x50: 0x5b908, // progress
+ 0x51: 0x5f505, // sizes
+ 0x52: 0x34502, // h4
+ 0x56: 0x33005, // thead
+ 0x57: 0xd607, // keytype
+ 0x58: 0x5b70a, // onprogress
+ 0x59: 0x44b09, // inputmode
+ 0x5a: 0x3b109, // ondragend
+ 0x5d: 0x3a205, // oncut
+ 0x5e: 0x43706, // spacer
+ 0x5f: 0x1ab08, // colgroup
+ 0x62: 0x16502, // is
+ 0x65: 0x3c02, // as
+ 0x66: 0x54809, // onoffline
+ 0x67: 0x33706, // sorted
+ 0x69: 0x48d10, // onlanguagechange
+ 0x6c: 0x43d0c, // onhashchange
+ 0x6d: 0x9604, // name
+ 0x6e: 0xf505, // tfoot
+ 0x6f: 0x56104, // desc
+ 0x70: 0x33d03, // max
+ 0x72: 0x1ea06, // coords
+ 0x73: 0x30d02, // h3
+ 0x74: 0x6e70e, // onbeforeunload
+ 0x75: 0x9c04, // rows
+ 0x76: 0x63c06, // select
+ 0x77: 0x9805, // meter
+ 0x78: 0x38b06, // itemid
+ 0x79: 0x53c0c, // onmousewheel
+ 0x7a: 0x5c006, // srcdoc
+ 0x7d: 0x1ba05, // track
+ 0x7f: 0x31f08, // itemtype
+ 0x82: 0xa402, // mo
+ 0x83: 0x41b08, // onchange
+ 0x84: 0x33107, // headers
+ 0x85: 0x5cc0c, // onratechange
+ 0x86: 0x60819, // onsecuritypolicyviolation
+ 0x88: 0x4a508, // datalist
+ 0x89: 0x4e80b, // onmousedown
+ 0x8a: 0x1ef04, // slot
+ 0x8b: 0x4b010, // onloadedmetadata
+ 0x8c: 0x1a06, // accept
+ 0x8d: 0x26806, // object
+ 0x91: 0x6b30e, // onvolumechange
+ 0x92: 0x2107, // charset
+ 0x93: 0x27613, // onautocompleteerror
+ 0x94: 0xc113, // allowpaymentrequest
+ 0x95: 0x2804, // body
+ 0x96: 0x10a07, // default
+ 0x97: 0x63c08, // selected
+ 0x98: 0x21e04, // face
+ 0x99: 0x1e505, // shape
+ 0x9b: 0x68408, // ontoggle
+ 0x9e: 0x64b02, // dt
+ 0x9f: 0xb604, // mark
+ 0xa1: 0xb01, // u
+ 0xa4: 0x6ab08, // onunload
+ 0xa5: 0x5d04, // loop
+ 0xa6: 0x16408, // disabled
+ 0xaa: 0x42307, // onended
+ 0xab: 0xb00a, // malignmark
+ 0xad: 0x67b09, // onsuspend
+ 0xae: 0x35105, // mtext
+ 0xaf: 0x64f06, // onsort
+ 0xb0: 0x19d08, // itemprop
+ 0xb3: 0x67109, // itemscope
+ 0xb4: 0x17305, // blink
+ 0xb6: 0x3b106, // ondrag
+ 0xb7: 0xa702, // ul
+ 0xb8: 0x26e04, // form
+ 0xb9: 0x12907, // sandbox
+ 0xba: 0x8b05, // frame
+ 0xbb: 0x1505, // value
+ 0xbc: 0x66209, // onstorage
+ 0xbf: 0xaa07, // acronym
+ 0xc0: 0x19a02, // rt
+ 0xc2: 0x202, // br
+ 0xc3: 0x22608, // fieldset
+ 0xc4: 0x2900d, // typemustmatch
+ 0xc5: 0xa208, // nomodule
+ 0xc6: 0x6c07, // noembed
+ 0xc7: 0x69e0d, // onbeforeprint
+ 0xc8: 0x19106, // button
+ 0xc9: 0x2f507, // onclick
+ 0xca: 0x70407, // summary
+ 0xcd: 0xfb04, // ruby
+ 0xce: 0x56405, // class
+ 0xcf: 0x3f40b, // ondragstart
+ 0xd0: 0x23107, // caption
+ 0xd4: 0xdd0e, // allowusermedia
+ 0xd5: 0x4cf0b, // onloadstart
+ 0xd9: 0x16b03, // div
+ 0xda: 0x4a904, // list
+ 0xdb: 0x32e04, // math
+ 0xdc: 0x44b05, // input
+ 0xdf: 0x3ea0a, // ondragover
+ 0xe0: 0x2de02, // h2
+ 0xe2: 0x1b209, // plaintext
+ 0xe4: 0x4f30c, // onmouseenter
+ 0xe7: 0x47907, // checked
+ 0xe8: 0x47003, // pre
+ 0xea: 0x35f08, // multiple
+ 0xeb: 0xba03, // bdi
+ 0xec: 0x33d09, // maxlength
+ 0xed: 0xcf01, // q
+ 0xee: 0x61f0a, // onauxclick
+ 0xf0: 0x57c03, // wbr
+ 0xf2: 0x3b04, // base
+ 0xf3: 0x6e306, // option
+ 0xf5: 0x41310, // ondurationchange
+ 0xf7: 0x8908, // noframes
+ 0xf9: 0x40508, // dropzone
+ 0xfb: 0x67505, // scope
+ 0xfc: 0x8008, // reversed
+ 0xfd: 0x3ba0b, // ondragenter
+ 0xfe: 0x3fa05, // start
+ 0xff: 0x12f03, // xmp
+ 0x100: 0x5f907, // srclang
+ 0x101: 0x30703, // img
+ 0x104: 0x101, // b
+ 0x105: 0x25403, // for
+ 0x106: 0x10705, // aside
+ 0x107: 0x44907, // oninput
+ 0x108: 0x35604, // area
+ 0x109: 0x2a40a, // formmethod
+ 0x10a: 0x72604, // wrap
+ 0x10c: 0x23c02, // rp
+ 0x10d: 0x46b0a, // onkeypress
+ 0x10e: 0x6802, // tt
+ 0x110: 0x34702, // mi
+ 0x111: 0x36705, // muted
+ 0x112: 0xf303, // alt
+ 0x113: 0x5c504, // code
+ 0x114: 0x6e02, // em
+ 0x115: 0x3c50a, // ondragexit
+ 0x117: 0x9f04, // span
+ 0x119: 0x6d708, // manifest
+ 0x11a: 0x38708, // menuitem
+ 0x11b: 0x58b07, // content
+ 0x11d: 0x6c109, // onwaiting
+ 0x11f: 0x4c609, // onloadend
+ 0x121: 0x37e0d, // oncontextmenu
+ 0x123: 0x56d06, // onblur
+ 0x124: 0x3fc07, // article
+ 0x125: 0x9303, // dir
+ 0x126: 0xef04, // ping
+ 0x127: 0x24c08, // required
+ 0x128: 0x45509, // oninvalid
+ 0x129: 0xb105, // align
+ 0x12b: 0x58a04, // icon
+ 0x12c: 0x64d02, // h6
+ 0x12d: 0x1c404, // cols
+ 0x12e: 0x22e0a, // figcaption
+ 0x12f: 0x45e09, // onkeydown
+ 0x130: 0x66b08, // onsubmit
+ 0x131: 0x14d09, // oncanplay
+ 0x132: 0x70b03, // sup
+ 0x133: 0xc01, // p
+ 0x135: 0x40a09, // onemptied
+ 0x136: 0x39106, // oncopy
+ 0x137: 0x19c04, // cite
+ 0x138: 0x3a70a, // ondblclick
+ 0x13a: 0x50b0b, // onmousemove
+ 0x13c: 0x66d03, // sub
+ 0x13d: 0x48703, // rel
+ 0x13e: 0x5f08, // optgroup
+ 0x142: 0x9c07, // rowspan
+ 0x143: 0x37806, // source
+ 0x144: 0x21608, // noscript
+ 0x145: 0x1a304, // open
+ 0x146: 0x20403, // ins
+ 0x147: 0x2540d, // foreignObject
+ 0x148: 0x5ad0a, // onpopstate
+ 0x14a: 0x28d07, // enctype
+ 0x14b: 0x2760e, // onautocomplete
+ 0x14c: 0x35208, // textarea
+ 0x14e: 0x2780c, // autocomplete
+ 0x14f: 0x15702, // hr
+ 0x150: 0x1de08, // controls
+ 0x151: 0x10902, // id
+ 0x153: 0x2360c, // onafterprint
+ 0x155: 0x2610d, // foreignobject
+ 0x156: 0x32707, // marquee
+ 0x157: 0x59a07, // onpause
+ 0x158: 0x5e602, // dl
+ 0x159: 0x5206, // height
+ 0x15a: 0x34703, // min
+ 0x15b: 0x9307, // dirname
+ 0x15c: 0x1f209, // translate
+ 0x15d: 0x5604, // html
+ 0x15e: 0x34709, // minlength
+ 0x15f: 0x48607, // preload
+ 0x160: 0x71408, // template
+ 0x161: 0x3df0b, // ondragleave
+ 0x162: 0x3a02, // rb
+ 0x164: 0x5c003, // src
+ 0x165: 0x6dd06, // strong
+ 0x167: 0x7804, // samp
+ 0x168: 0x6f307, // address
+ 0x169: 0x55108, // ononline
+ 0x16b: 0x1310b, // placeholder
+ 0x16c: 0x2c406, // target
+ 0x16d: 0x20605, // small
+ 0x16e: 0x6ca07, // onwheel
+ 0x16f: 0x1c90a, // annotation
+ 0x170: 0x4740a, // spellcheck
+ 0x171: 0x7207, // details
+ 0x172: 0x10306, // canvas
+ 0x173: 0x12109, // autofocus
+ 0x174: 0xc05, // param
+ 0x176: 0x46308, // download
+ 0x177: 0x45203, // del
+ 0x178: 0x36c07, // onclose
+ 0x179: 0xb903, // kbd
+ 0x17a: 0x31906, // applet
+ 0x17b: 0x2e004, // href
+ 0x17c: 0x5f108, // onresize
+ 0x17e: 0x49d0c, // onloadeddata
+ 0x180: 0xcc02, // tr
+ 0x181: 0x2c00a, // formtarget
+ 0x182: 0x11005, // title
+ 0x183: 0x6ff05, // style
+ 0x184: 0xd206, // strike
+ 0x185: 0x59e06, // usemap
+ 0x186: 0x2fc06, // iframe
+ 0x187: 0x1004, // main
+ 0x189: 0x7b07, // picture
+ 0x18c: 0x31605, // ismap
+ 0x18e: 0x4a504, // data
+ 0x18f: 0x5905, // label
+ 0x191: 0x3d10e, // referrerpolicy
+ 0x192: 0x15602, // th
+ 0x194: 0x53606, // prompt
+ 0x195: 0x56807, // section
+ 0x197: 0x6d107, // optimum
+ 0x198: 0x2db04, // high
+ 0x199: 0x15c02, // h1
+ 0x19a: 0x65909, // onstalled
+ 0x19b: 0x16d03, // var
+ 0x19c: 0x4204, // time
+ 0x19e: 0x67402, // ms
+ 0x19f: 0x33106, // header
+ 0x1a0: 0x4da09, // onmessage
+ 0x1a1: 0x1a605, // nonce
+ 0x1a2: 0x26e0a, // formaction
+ 0x1a3: 0x22006, // center
+ 0x1a4: 0x3704, // nobr
+ 0x1a5: 0x59505, // table
+ 0x1a6: 0x4a907, // listing
+ 0x1a7: 0x18106, // legend
+ 0x1a9: 0x29b09, // challenge
+ 0x1aa: 0x24806, // figure
+ 0x1ab: 0xe605, // media
+ 0x1ae: 0xd904, // type
+ 0x1af: 0x3f04, // font
+ 0x1b0: 0x4da0e, // onmessageerror
+ 0x1b1: 0x37108, // seamless
+ 0x1b2: 0x8703, // dfn
+ 0x1b3: 0x5c705, // defer
+ 0x1b4: 0xc303, // low
+ 0x1b5: 0x19a03, // rtc
+ 0x1b6: 0x5230b, // onmouseover
+ 0x1b7: 0x2b20a, // novalidate
+ 0x1b8: 0x71c0a, // workertype
+ 0x1ba: 0x3cd07, // itemref
+ 0x1bd: 0x1, // a
+ 0x1be: 0x31803, // map
+ 0x1bf: 0x400c, // ontimeupdate
+ 0x1c0: 0x15e07, // bgsound
+ 0x1c1: 0x3206, // keygen
+ 0x1c2: 0x2705, // tbody
+ 0x1c5: 0x64406, // onshow
+ 0x1c7: 0x2501, // s
+ 0x1c8: 0x6607, // pattern
+ 0x1cc: 0x14d10, // oncanplaythrough
+ 0x1ce: 0x2d702, // dd
+ 0x1cf: 0x6f906, // srcset
+ 0x1d0: 0x17003, // big
+ 0x1d2: 0x65108, // sortable
+ 0x1d3: 0x48007, // onkeyup
+ 0x1d5: 0x5a406, // onplay
+ 0x1d7: 0x4b804, // meta
+ 0x1d8: 0x40306, // ondrop
+ 0x1da: 0x60008, // onscroll
+ 0x1db: 0x1fb0b, // crossorigin
+ 0x1dc: 0x5730a, // onpageshow
+ 0x1dd: 0x4, // abbr
+ 0x1de: 0x9202, // td
+ 0x1df: 0x58b0f, // contenteditable
+ 0x1e0: 0x27206, // action
+ 0x1e1: 0x1400b, // playsinline
+ 0x1e2: 0x43107, // onfocus
+ 0x1e3: 0x2e008, // hreflang
+ 0x1e5: 0x5160a, // onmouseout
+ 0x1e6: 0x5ea07, // onreset
+ 0x1e7: 0x13c08, // autoplay
+ 0x1e8: 0x63109, // onseeking
+ 0x1ea: 0x67506, // scoped
+ 0x1ec: 0x30a, // radiogroup
+ 0x1ee: 0x3800b, // contextmenu
+ 0x1ef: 0x52e09, // onmouseup
+ 0x1f1: 0x2ca06, // hgroup
+ 0x1f2: 0x2080f, // allowfullscreen
+ 0x1f3: 0x4be08, // tabindex
+ 0x1f6: 0x30f07, // isindex
+ 0x1f7: 0x1a0e, // accept-charset
+ 0x1f8: 0x2ae0e, // formnovalidate
+ 0x1fb: 0x1c90e, // annotation-xml
+ 0x1fc: 0x6e05, // embed
+ 0x1fd: 0x21806, // script
+ 0x1fe: 0xbb06, // dialog
+ 0x1ff: 0x1d707, // command
+}
+
+const atomText = "abbradiogrouparamainavalueaccept-charsetbodyaccesskeygenobrb" +
+ "asefontimeupdateviacacheightmlabelooptgroupatternoembedetail" +
+ "sampictureversedfnoframesetdirnameterowspanomoduleacronymali" +
+ "gnmarkbdialogallowpaymentrequestrikeytypeallowusermediagroup" +
+ "ingaltfooterubyasyncanvasidefaultitleaudioncancelautofocusan" +
+ "dboxmplaceholderautoplaysinlinebdoncanplaythrough1bgsoundisa" +
+ "bledivarbigblinkindraggablegendblockquotebuttonabortcitempro" +
+ "penoncecolgrouplaintextrackcolorcolspannotation-xmlcommandco" +
+ "ntrolshapecoordslotranslatecrossoriginsmallowfullscreenoscri" +
+ "ptfacenterfieldsetfigcaptionafterprintegrityfigurequiredfore" +
+ "ignObjectforeignobjectformactionautocompleteerrorformenctype" +
+ "mustmatchallengeformmethodformnovalidatetimeformtargethgroup" +
+ "osterhiddenhigh2hreflanghttp-equivideonclickiframeimageimgly" +
+ "ph3isindexismappletitemtypemarqueematheadersortedmaxlength4m" +
+ "inlength5mtextareadonlymultiplemutedoncloseamlessourceoncont" +
+ "extmenuitemidoncopyoncuechangeoncutondblclickondragendondrag" +
+ "enterondragexitemreferrerpolicyondragleaveondragoverondragst" +
+ "articleondropzonemptiedondurationchangeonendedonerroronfocus" +
+ "paceronhashchangeoninputmodeloninvalidonkeydownloadonkeypres" +
+ "spellcheckedonkeyupreloadonlanguagechangeonloadeddatalisting" +
+ "onloadedmetadatabindexonloadendonloadstartonmessageerroronmo" +
+ "usedownonmouseenteronmouseleaveonmousemoveonmouseoutputonmou" +
+ "seoveronmouseupromptonmousewheelonofflineononlineonpagehides" +
+ "classectionbluronpageshowbronpastepublicontenteditableonpaus" +
+ "emaponplayingonpopstateonprogressrcdocodeferonratechangeonre" +
+ "jectionhandledonresetonresizesrclangonscrollonsecuritypolicy" +
+ "violationauxclickonseekedonseekingonselectedonshowidth6onsor" +
+ "tableonstalledonstorageonsubmitemscopedonsuspendontoggleonun" +
+ "handledrejectionbeforeprintonunloadonvolumechangeonwaitingon" +
+ "wheeloptimumanifestrongoptionbeforeunloaddressrcsetstylesumm" +
+ "arysupsvgsystemplateworkertypewrap"
diff --git a/vendor/golang.org/x/net/html/const.go b/vendor/golang.org/x/net/html/const.go
new file mode 100644
index 0000000..ff7acf2
--- /dev/null
+++ b/vendor/golang.org/x/net/html/const.go
@@ -0,0 +1,111 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package html
+
+// Section 12.2.4.2 of the HTML5 specification says "The following elements
+// have varying levels of special parsing rules".
+// https://html.spec.whatwg.org/multipage/syntax.html#the-stack-of-open-elements
+var isSpecialElementMap = map[string]bool{
+ "address": true,
+ "applet": true,
+ "area": true,
+ "article": true,
+ "aside": true,
+ "base": true,
+ "basefont": true,
+ "bgsound": true,
+ "blockquote": true,
+ "body": true,
+ "br": true,
+ "button": true,
+ "caption": true,
+ "center": true,
+ "col": true,
+ "colgroup": true,
+ "dd": true,
+ "details": true,
+ "dir": true,
+ "div": true,
+ "dl": true,
+ "dt": true,
+ "embed": true,
+ "fieldset": true,
+ "figcaption": true,
+ "figure": true,
+ "footer": true,
+ "form": true,
+ "frame": true,
+ "frameset": true,
+ "h1": true,
+ "h2": true,
+ "h3": true,
+ "h4": true,
+ "h5": true,
+ "h6": true,
+ "head": true,
+ "header": true,
+ "hgroup": true,
+ "hr": true,
+ "html": true,
+ "iframe": true,
+ "img": true,
+ "input": true,
+ "keygen": true, // "keygen" has been removed from the spec, but are kept here for backwards compatibility.
+ "li": true,
+ "link": true,
+ "listing": true,
+ "main": true,
+ "marquee": true,
+ "menu": true,
+ "meta": true,
+ "nav": true,
+ "noembed": true,
+ "noframes": true,
+ "noscript": true,
+ "object": true,
+ "ol": true,
+ "p": true,
+ "param": true,
+ "plaintext": true,
+ "pre": true,
+ "script": true,
+ "section": true,
+ "select": true,
+ "source": true,
+ "style": true,
+ "summary": true,
+ "table": true,
+ "tbody": true,
+ "td": true,
+ "template": true,
+ "textarea": true,
+ "tfoot": true,
+ "th": true,
+ "thead": true,
+ "title": true,
+ "tr": true,
+ "track": true,
+ "ul": true,
+ "wbr": true,
+ "xmp": true,
+}
+
+func isSpecialElement(element *Node) bool {
+ switch element.Namespace {
+ case "", "html":
+ return isSpecialElementMap[element.Data]
+ case "math":
+ switch element.Data {
+ case "mi", "mo", "mn", "ms", "mtext", "annotation-xml":
+ return true
+ }
+ case "svg":
+ switch element.Data {
+ case "foreignObject", "desc", "title":
+ return true
+ }
+ }
+ return false
+}
diff --git a/vendor/golang.org/x/net/html/doc.go b/vendor/golang.org/x/net/html/doc.go
new file mode 100644
index 0000000..822ed42
--- /dev/null
+++ b/vendor/golang.org/x/net/html/doc.go
@@ -0,0 +1,106 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+/*
+Package html implements an HTML5-compliant tokenizer and parser.
+
+Tokenization is done by creating a Tokenizer for an io.Reader r. It is the
+caller's responsibility to ensure that r provides UTF-8 encoded HTML.
+
+ z := html.NewTokenizer(r)
+
+Given a Tokenizer z, the HTML is tokenized by repeatedly calling z.Next(),
+which parses the next token and returns its type, or an error:
+
+ for {
+ tt := z.Next()
+ if tt == html.ErrorToken {
+ // ...
+ return ...
+ }
+ // Process the current token.
+ }
+
+There are two APIs for retrieving the current token. The high-level API is to
+call Token; the low-level API is to call Text or TagName / TagAttr. Both APIs
+allow optionally calling Raw after Next but before Token, Text, TagName, or
+TagAttr. In EBNF notation, the valid call sequence per token is:
+
+ Next {Raw} [ Token | Text | TagName {TagAttr} ]
+
+Token returns an independent data structure that completely describes a token.
+Entities (such as "&lt;") are unescaped, tag names and attribute keys are
+lower-cased, and attributes are collected into a []Attribute. For example:
+
+ for {
+ if z.Next() == html.ErrorToken {
+ // Returning io.EOF indicates success.
+ return z.Err()
+ }
+ emitToken(z.Token())
+ }
+
+The low-level API performs fewer allocations and copies, but the contents of
+the []byte values returned by Text, TagName and TagAttr may change on the next
+call to Next. For example, to extract an HTML page's anchor text:
+
+ depth := 0
+ for {
+ tt := z.Next()
+ switch tt {
+ case html.ErrorToken:
+ return z.Err()
+ case html.TextToken:
+ if depth > 0 {
+ // emitBytes should copy the []byte it receives,
+ // if it doesn't process it immediately.
+ emitBytes(z.Text())
+ }
+ case html.StartTagToken, html.EndTagToken:
+ tn, _ := z.TagName()
+ if len(tn) == 1 && tn[0] == 'a' {
+ if tt == html.StartTagToken {
+ depth++
+ } else {
+ depth--
+ }
+ }
+ }
+ }
+
+Parsing is done by calling Parse with an io.Reader, which returns the root of
+the parse tree (the document element) as a *Node. It is the caller's
+responsibility to ensure that the Reader provides UTF-8 encoded HTML. For
+example, to process each anchor node in depth-first order:
+
+ doc, err := html.Parse(r)
+ if err != nil {
+ // ...
+ }
+ var f func(*html.Node)
+ f = func(n *html.Node) {
+ if n.Type == html.ElementNode && n.Data == "a" {
+ // Do something with n...
+ }
+ for c := n.FirstChild; c != nil; c = c.NextSibling {
+ f(c)
+ }
+ }
+ f(doc)
+
+The relevant specifications include:
+https://html.spec.whatwg.org/multipage/syntax.html and
+https://html.spec.whatwg.org/multipage/syntax.html#tokenization
+*/
+package html // import "golang.org/x/net/html"
+
+// The tokenization algorithm implemented by this package is not a line-by-line
+// transliteration of the relatively verbose state-machine in the WHATWG
+// specification. A more direct approach is used instead, where the program
+// counter implies the state, such as whether it is tokenizing a tag or a text
+// node. Specification compliance is verified by checking expected and actual
+// outputs over a test suite rather than aiming for algorithmic fidelity.
+
+// TODO(nigeltao): Does a DOM API belong in this package or a separate one?
+// TODO(nigeltao): How does parsing interact with a JavaScript engine?
diff --git a/vendor/golang.org/x/net/html/doctype.go b/vendor/golang.org/x/net/html/doctype.go
new file mode 100644
index 0000000..c484e5a
--- /dev/null
+++ b/vendor/golang.org/x/net/html/doctype.go
@@ -0,0 +1,156 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package html
+
+import (
+ "strings"
+)
+
+// parseDoctype parses the data from a DoctypeToken into a name,
+// public identifier, and system identifier. It returns a Node whose Type
+// is DoctypeNode, whose Data is the name, and which has attributes
+// named "system" and "public" for the two identifiers if they were present.
+// quirks is whether the document should be parsed in "quirks mode".
+func parseDoctype(s string) (n *Node, quirks bool) {
+ n = &Node{Type: DoctypeNode}
+
+ // Find the name.
+ space := strings.IndexAny(s, whitespace)
+ if space == -1 {
+ space = len(s)
+ }
+ n.Data = s[:space]
+ // The comparison to "html" is case-sensitive.
+ if n.Data != "html" {
+ quirks = true
+ }
+ n.Data = strings.ToLower(n.Data)
+ s = strings.TrimLeft(s[space:], whitespace)
+
+ if len(s) < 6 {
+ // It can't start with "PUBLIC" or "SYSTEM".
+ // Ignore the rest of the string.
+ return n, quirks || s != ""
+ }
+
+ key := strings.ToLower(s[:6])
+ s = s[6:]
+ for key == "public" || key == "system" {
+ s = strings.TrimLeft(s, whitespace)
+ if s == "" {
+ break
+ }
+ quote := s[0]
+ if quote != '"' && quote != '\'' {
+ break
+ }
+ s = s[1:]
+ q := strings.IndexRune(s, rune(quote))
+ var id string
+ if q == -1 {
+ id = s
+ s = ""
+ } else {
+ id = s[:q]
+ s = s[q+1:]
+ }
+ n.Attr = append(n.Attr, Attribute{Key: key, Val: id})
+ if key == "public" {
+ key = "system"
+ } else {
+ key = ""
+ }
+ }
+
+ if key != "" || s != "" {
+ quirks = true
+ } else if len(n.Attr) > 0 {
+ if n.Attr[0].Key == "public" {
+ public := strings.ToLower(n.Attr[0].Val)
+ switch public {
+ case "-//w3o//dtd w3 html strict 3.0//en//", "-/w3d/dtd html 4.0 transitional/en", "html":
+ quirks = true
+ default:
+ for _, q := range quirkyIDs {
+ if strings.HasPrefix(public, q) {
+ quirks = true
+ break
+ }
+ }
+ }
+ // The following two public IDs only cause quirks mode if there is no system ID.
+ if len(n.Attr) == 1 && (strings.HasPrefix(public, "-//w3c//dtd html 4.01 frameset//") ||
+ strings.HasPrefix(public, "-//w3c//dtd html 4.01 transitional//")) {
+ quirks = true
+ }
+ }
+ if lastAttr := n.Attr[len(n.Attr)-1]; lastAttr.Key == "system" &&
+ strings.ToLower(lastAttr.Val) == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd" {
+ quirks = true
+ }
+ }
+
+ return n, quirks
+}
+
+// quirkyIDs is a list of public doctype identifiers that cause a document
+// to be interpreted in quirks mode. The identifiers should be in lower case.
+var quirkyIDs = []string{
+ "+//silmaril//dtd html pro v0r11 19970101//",
+ "-//advasoft ltd//dtd html 3.0 aswedit + extensions//",
+ "-//as//dtd html 3.0 aswedit + extensions//",
+ "-//ietf//dtd html 2.0 level 1//",
+ "-//ietf//dtd html 2.0 level 2//",
+ "-//ietf//dtd html 2.0 strict level 1//",
+ "-//ietf//dtd html 2.0 strict level 2//",
+ "-//ietf//dtd html 2.0 strict//",
+ "-//ietf//dtd html 2.0//",
+ "-//ietf//dtd html 2.1e//",
+ "-//ietf//dtd html 3.0//",
+ "-//ietf//dtd html 3.2 final//",
+ "-//ietf//dtd html 3.2//",
+ "-//ietf//dtd html 3//",
+ "-//ietf//dtd html level 0//",
+ "-//ietf//dtd html level 1//",
+ "-//ietf//dtd html level 2//",
+ "-//ietf//dtd html level 3//",
+ "-//ietf//dtd html strict level 0//",
+ "-//ietf//dtd html strict level 1//",
+ "-//ietf//dtd html strict level 2//",
+ "-//ietf//dtd html strict level 3//",
+ "-//ietf//dtd html strict//",
+ "-//ietf//dtd html//",
+ "-//metrius//dtd metrius presentational//",
+ "-//microsoft//dtd internet explorer 2.0 html strict//",
+ "-//microsoft//dtd internet explorer 2.0 html//",
+ "-//microsoft//dtd internet explorer 2.0 tables//",
+ "-//microsoft//dtd internet explorer 3.0 html strict//",
+ "-//microsoft//dtd internet explorer 3.0 html//",
+ "-//microsoft//dtd internet explorer 3.0 tables//",
+ "-//netscape comm. corp.//dtd html//",
+ "-//netscape comm. corp.//dtd strict html//",
+ "-//o'reilly and associates//dtd html 2.0//",
+ "-//o'reilly and associates//dtd html extended 1.0//",
+ "-//o'reilly and associates//dtd html extended relaxed 1.0//",
+ "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//",
+ "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//",
+ "-//spyglass//dtd html 2.0 extended//",
+ "-//sq//dtd html 2.0 hotmetal + extensions//",
+ "-//sun microsystems corp.//dtd hotjava html//",
+ "-//sun microsystems corp.//dtd hotjava strict html//",
+ "-//w3c//dtd html 3 1995-03-24//",
+ "-//w3c//dtd html 3.2 draft//",
+ "-//w3c//dtd html 3.2 final//",
+ "-//w3c//dtd html 3.2//",
+ "-//w3c//dtd html 3.2s draft//",
+ "-//w3c//dtd html 4.0 frameset//",
+ "-//w3c//dtd html 4.0 transitional//",
+ "-//w3c//dtd html experimental 19960712//",
+ "-//w3c//dtd html experimental 970421//",
+ "-//w3c//dtd w3 html//",
+ "-//w3o//dtd w3 html 3.0//",
+ "-//webtechs//dtd mozilla html 2.0//",
+ "-//webtechs//dtd mozilla html//",
+}
diff --git a/vendor/golang.org/x/net/html/entity.go b/vendor/golang.org/x/net/html/entity.go
new file mode 100644
index 0000000..b628880
--- /dev/null
+++ b/vendor/golang.org/x/net/html/entity.go
@@ -0,0 +1,2253 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package html
+
+// All entities that do not end with ';' are 6 or fewer bytes long.
+const longestEntityWithoutSemicolon = 6
+
+// entity is a map from HTML entity names to their values. The semicolon matters:
+// https://html.spec.whatwg.org/multipage/syntax.html#named-character-references
+// lists both "amp" and "amp;" as two separate entries.
+//
+// Note that the HTML5 list is larger than the HTML4 list at
+// http://www.w3.org/TR/html4/sgml/entities.html
+var entity = map[string]rune{
+ "AElig;": '\U000000C6',
+ "AMP;": '\U00000026',
+ "Aacute;": '\U000000C1',
+ "Abreve;": '\U00000102',
+ "Acirc;": '\U000000C2',
+ "Acy;": '\U00000410',
+ "Afr;": '\U0001D504',
+ "Agrave;": '\U000000C0',
+ "Alpha;": '\U00000391',
+ "Amacr;": '\U00000100',
+ "And;": '\U00002A53',
+ "Aogon;": '\U00000104',
+ "Aopf;": '\U0001D538',
+ "ApplyFunction;": '\U00002061',
+ "Aring;": '\U000000C5',
+ "Ascr;": '\U0001D49C',
+ "Assign;": '\U00002254',
+ "Atilde;": '\U000000C3',
+ "Auml;": '\U000000C4',
+ "Backslash;": '\U00002216',
+ "Barv;": '\U00002AE7',
+ "Barwed;": '\U00002306',
+ "Bcy;": '\U00000411',
+ "Because;": '\U00002235',
+ "Bernoullis;": '\U0000212C',
+ "Beta;": '\U00000392',
+ "Bfr;": '\U0001D505',
+ "Bopf;": '\U0001D539',
+ "Breve;": '\U000002D8',
+ "Bscr;": '\U0000212C',
+ "Bumpeq;": '\U0000224E',
+ "CHcy;": '\U00000427',
+ "COPY;": '\U000000A9',
+ "Cacute;": '\U00000106',
+ "Cap;": '\U000022D2',
+ "CapitalDifferentialD;": '\U00002145',
+ "Cayleys;": '\U0000212D',
+ "Ccaron;": '\U0000010C',
+ "Ccedil;": '\U000000C7',
+ "Ccirc;": '\U00000108',
+ "Cconint;": '\U00002230',
+ "Cdot;": '\U0000010A',
+ "Cedilla;": '\U000000B8',
+ "CenterDot;": '\U000000B7',
+ "Cfr;": '\U0000212D',
+ "Chi;": '\U000003A7',
+ "CircleDot;": '\U00002299',
+ "CircleMinus;": '\U00002296',
+ "CirclePlus;": '\U00002295',
+ "CircleTimes;": '\U00002297',
+ "ClockwiseContourIntegral;": '\U00002232',
+ "CloseCurlyDoubleQuote;": '\U0000201D',
+ "CloseCurlyQuote;": '\U00002019',
+ "Colon;": '\U00002237',
+ "Colone;": '\U00002A74',
+ "Congruent;": '\U00002261',
+ "Conint;": '\U0000222F',
+ "ContourIntegral;": '\U0000222E',
+ "Copf;": '\U00002102',
+ "Coproduct;": '\U00002210',
+ "CounterClockwiseContourIntegral;": '\U00002233',
+ "Cross;": '\U00002A2F',
+ "Cscr;": '\U0001D49E',
+ "Cup;": '\U000022D3',
+ "CupCap;": '\U0000224D',
+ "DD;": '\U00002145',
+ "DDotrahd;": '\U00002911',
+ "DJcy;": '\U00000402',
+ "DScy;": '\U00000405',
+ "DZcy;": '\U0000040F',
+ "Dagger;": '\U00002021',
+ "Darr;": '\U000021A1',
+ "Dashv;": '\U00002AE4',
+ "Dcaron;": '\U0000010E',
+ "Dcy;": '\U00000414',
+ "Del;": '\U00002207',
+ "Delta;": '\U00000394',
+ "Dfr;": '\U0001D507',
+ "DiacriticalAcute;": '\U000000B4',
+ "DiacriticalDot;": '\U000002D9',
+ "DiacriticalDoubleAcute;": '\U000002DD',
+ "DiacriticalGrave;": '\U00000060',
+ "DiacriticalTilde;": '\U000002DC',
+ "Diamond;": '\U000022C4',
+ "DifferentialD;": '\U00002146',
+ "Dopf;": '\U0001D53B',
+ "Dot;": '\U000000A8',
+ "DotDot;": '\U000020DC',
+ "DotEqual;": '\U00002250',
+ "DoubleContourIntegral;": '\U0000222F',
+ "DoubleDot;": '\U000000A8',
+ "DoubleDownArrow;": '\U000021D3',
+ "DoubleLeftArrow;": '\U000021D0',
+ "DoubleLeftRightArrow;": '\U000021D4',
+ "DoubleLeftTee;": '\U00002AE4',
+ "DoubleLongLeftArrow;": '\U000027F8',
+ "DoubleLongLeftRightArrow;": '\U000027FA',
+ "DoubleLongRightArrow;": '\U000027F9',
+ "DoubleRightArrow;": '\U000021D2',
+ "DoubleRightTee;": '\U000022A8',
+ "DoubleUpArrow;": '\U000021D1',
+ "DoubleUpDownArrow;": '\U000021D5',
+ "DoubleVerticalBar;": '\U00002225',
+ "DownArrow;": '\U00002193',
+ "DownArrowBar;": '\U00002913',
+ "DownArrowUpArrow;": '\U000021F5',
+ "DownBreve;": '\U00000311',
+ "DownLeftRightVector;": '\U00002950',
+ "DownLeftTeeVector;": '\U0000295E',
+ "DownLeftVector;": '\U000021BD',
+ "DownLeftVectorBar;": '\U00002956',
+ "DownRightTeeVector;": '\U0000295F',
+ "DownRightVector;": '\U000021C1',
+ "DownRightVectorBar;": '\U00002957',
+ "DownTee;": '\U000022A4',
+ "DownTeeArrow;": '\U000021A7',
+ "Downarrow;": '\U000021D3',
+ "Dscr;": '\U0001D49F',
+ "Dstrok;": '\U00000110',
+ "ENG;": '\U0000014A',
+ "ETH;": '\U000000D0',
+ "Eacute;": '\U000000C9',
+ "Ecaron;": '\U0000011A',
+ "Ecirc;": '\U000000CA',
+ "Ecy;": '\U0000042D',
+ "Edot;": '\U00000116',
+ "Efr;": '\U0001D508',
+ "Egrave;": '\U000000C8',
+ "Element;": '\U00002208',
+ "Emacr;": '\U00000112',
+ "EmptySmallSquare;": '\U000025FB',
+ "EmptyVerySmallSquare;": '\U000025AB',
+ "Eogon;": '\U00000118',
+ "Eopf;": '\U0001D53C',
+ "Epsilon;": '\U00000395',
+ "Equal;": '\U00002A75',
+ "EqualTilde;": '\U00002242',
+ "Equilibrium;": '\U000021CC',
+ "Escr;": '\U00002130',
+ "Esim;": '\U00002A73',
+ "Eta;": '\U00000397',
+ "Euml;": '\U000000CB',
+ "Exists;": '\U00002203',
+ "ExponentialE;": '\U00002147',
+ "Fcy;": '\U00000424',
+ "Ffr;": '\U0001D509',
+ "FilledSmallSquare;": '\U000025FC',
+ "FilledVerySmallSquare;": '\U000025AA',
+ "Fopf;": '\U0001D53D',
+ "ForAll;": '\U00002200',
+ "Fouriertrf;": '\U00002131',
+ "Fscr;": '\U00002131',
+ "GJcy;": '\U00000403',
+ "GT;": '\U0000003E',
+ "Gamma;": '\U00000393',
+ "Gammad;": '\U000003DC',
+ "Gbreve;": '\U0000011E',
+ "Gcedil;": '\U00000122',
+ "Gcirc;": '\U0000011C',
+ "Gcy;": '\U00000413',
+ "Gdot;": '\U00000120',
+ "Gfr;": '\U0001D50A',
+ "Gg;": '\U000022D9',
+ "Gopf;": '\U0001D53E',
+ "GreaterEqual;": '\U00002265',
+ "GreaterEqualLess;": '\U000022DB',
+ "GreaterFullEqual;": '\U00002267',
+ "GreaterGreater;": '\U00002AA2',
+ "GreaterLess;": '\U00002277',
+ "GreaterSlantEqual;": '\U00002A7E',
+ "GreaterTilde;": '\U00002273',
+ "Gscr;": '\U0001D4A2',
+ "Gt;": '\U0000226B',
+ "HARDcy;": '\U0000042A',
+ "Hacek;": '\U000002C7',
+ "Hat;": '\U0000005E',
+ "Hcirc;": '\U00000124',
+ "Hfr;": '\U0000210C',
+ "HilbertSpace;": '\U0000210B',
+ "Hopf;": '\U0000210D',
+ "HorizontalLine;": '\U00002500',
+ "Hscr;": '\U0000210B',
+ "Hstrok;": '\U00000126',
+ "HumpDownHump;": '\U0000224E',
+ "HumpEqual;": '\U0000224F',
+ "IEcy;": '\U00000415',
+ "IJlig;": '\U00000132',
+ "IOcy;": '\U00000401',
+ "Iacute;": '\U000000CD',
+ "Icirc;": '\U000000CE',
+ "Icy;": '\U00000418',
+ "Idot;": '\U00000130',
+ "Ifr;": '\U00002111',
+ "Igrave;": '\U000000CC',
+ "Im;": '\U00002111',
+ "Imacr;": '\U0000012A',
+ "ImaginaryI;": '\U00002148',
+ "Implies;": '\U000021D2',
+ "Int;": '\U0000222C',
+ "Integral;": '\U0000222B',
+ "Intersection;": '\U000022C2',
+ "InvisibleComma;": '\U00002063',
+ "InvisibleTimes;": '\U00002062',
+ "Iogon;": '\U0000012E',
+ "Iopf;": '\U0001D540',
+ "Iota;": '\U00000399',
+ "Iscr;": '\U00002110',
+ "Itilde;": '\U00000128',
+ "Iukcy;": '\U00000406',
+ "Iuml;": '\U000000CF',
+ "Jcirc;": '\U00000134',
+ "Jcy;": '\U00000419',
+ "Jfr;": '\U0001D50D',
+ "Jopf;": '\U0001D541',
+ "Jscr;": '\U0001D4A5',
+ "Jsercy;": '\U00000408',
+ "Jukcy;": '\U00000404',
+ "KHcy;": '\U00000425',
+ "KJcy;": '\U0000040C',
+ "Kappa;": '\U0000039A',
+ "Kcedil;": '\U00000136',
+ "Kcy;": '\U0000041A',
+ "Kfr;": '\U0001D50E',
+ "Kopf;": '\U0001D542',
+ "Kscr;": '\U0001D4A6',
+ "LJcy;": '\U00000409',
+ "LT;": '\U0000003C',
+ "Lacute;": '\U00000139',
+ "Lambda;": '\U0000039B',
+ "Lang;": '\U000027EA',
+ "Laplacetrf;": '\U00002112',
+ "Larr;": '\U0000219E',
+ "Lcaron;": '\U0000013D',
+ "Lcedil;": '\U0000013B',
+ "Lcy;": '\U0000041B',
+ "LeftAngleBracket;": '\U000027E8',
+ "LeftArrow;": '\U00002190',
+ "LeftArrowBar;": '\U000021E4',
+ "LeftArrowRightArrow;": '\U000021C6',
+ "LeftCeiling;": '\U00002308',
+ "LeftDoubleBracket;": '\U000027E6',
+ "LeftDownTeeVector;": '\U00002961',
+ "LeftDownVector;": '\U000021C3',
+ "LeftDownVectorBar;": '\U00002959',
+ "LeftFloor;": '\U0000230A',
+ "LeftRightArrow;": '\U00002194',
+ "LeftRightVector;": '\U0000294E',
+ "LeftTee;": '\U000022A3',
+ "LeftTeeArrow;": '\U000021A4',
+ "LeftTeeVector;": '\U0000295A',
+ "LeftTriangle;": '\U000022B2',
+ "LeftTriangleBar;": '\U000029CF',
+ "LeftTriangleEqual;": '\U000022B4',
+ "LeftUpDownVector;": '\U00002951',
+ "LeftUpTeeVector;": '\U00002960',
+ "LeftUpVector;": '\U000021BF',
+ "LeftUpVectorBar;": '\U00002958',
+ "LeftVector;": '\U000021BC',
+ "LeftVectorBar;": '\U00002952',
+ "Leftarrow;": '\U000021D0',
+ "Leftrightarrow;": '\U000021D4',
+ "LessEqualGreater;": '\U000022DA',
+ "LessFullEqual;": '\U00002266',
+ "LessGreater;": '\U00002276',
+ "LessLess;": '\U00002AA1',
+ "LessSlantEqual;": '\U00002A7D',
+ "LessTilde;": '\U00002272',
+ "Lfr;": '\U0001D50F',
+ "Ll;": '\U000022D8',
+ "Lleftarrow;": '\U000021DA',
+ "Lmidot;": '\U0000013F',
+ "LongLeftArrow;": '\U000027F5',
+ "LongLeftRightArrow;": '\U000027F7',
+ "LongRightArrow;": '\U000027F6',
+ "Longleftarrow;": '\U000027F8',
+ "Longleftrightarrow;": '\U000027FA',
+ "Longrightarrow;": '\U000027F9',
+ "Lopf;": '\U0001D543',
+ "LowerLeftArrow;": '\U00002199',
+ "LowerRightArrow;": '\U00002198',
+ "Lscr;": '\U00002112',
+ "Lsh;": '\U000021B0',
+ "Lstrok;": '\U00000141',
+ "Lt;": '\U0000226A',
+ "Map;": '\U00002905',
+ "Mcy;": '\U0000041C',
+ "MediumSpace;": '\U0000205F',
+ "Mellintrf;": '\U00002133',
+ "Mfr;": '\U0001D510',
+ "MinusPlus;": '\U00002213',
+ "Mopf;": '\U0001D544',
+ "Mscr;": '\U00002133',
+ "Mu;": '\U0000039C',
+ "NJcy;": '\U0000040A',
+ "Nacute;": '\U00000143',
+ "Ncaron;": '\U00000147',
+ "Ncedil;": '\U00000145',
+ "Ncy;": '\U0000041D',
+ "NegativeMediumSpace;": '\U0000200B',
+ "NegativeThickSpace;": '\U0000200B',
+ "NegativeThinSpace;": '\U0000200B',
+ "NegativeVeryThinSpace;": '\U0000200B',
+ "NestedGreaterGreater;": '\U0000226B',
+ "NestedLessLess;": '\U0000226A',
+ "NewLine;": '\U0000000A',
+ "Nfr;": '\U0001D511',
+ "NoBreak;": '\U00002060',
+ "NonBreakingSpace;": '\U000000A0',
+ "Nopf;": '\U00002115',
+ "Not;": '\U00002AEC',
+ "NotCongruent;": '\U00002262',
+ "NotCupCap;": '\U0000226D',
+ "NotDoubleVerticalBar;": '\U00002226',
+ "NotElement;": '\U00002209',
+ "NotEqual;": '\U00002260',
+ "NotExists;": '\U00002204',
+ "NotGreater;": '\U0000226F',
+ "NotGreaterEqual;": '\U00002271',
+ "NotGreaterLess;": '\U00002279',
+ "NotGreaterTilde;": '\U00002275',
+ "NotLeftTriangle;": '\U000022EA',
+ "NotLeftTriangleEqual;": '\U000022EC',
+ "NotLess;": '\U0000226E',
+ "NotLessEqual;": '\U00002270',
+ "NotLessGreater;": '\U00002278',
+ "NotLessTilde;": '\U00002274',
+ "NotPrecedes;": '\U00002280',
+ "NotPrecedesSlantEqual;": '\U000022E0',
+ "NotReverseElement;": '\U0000220C',
+ "NotRightTriangle;": '\U000022EB',
+ "NotRightTriangleEqual;": '\U000022ED',
+ "NotSquareSubsetEqual;": '\U000022E2',
+ "NotSquareSupersetEqual;": '\U000022E3',
+ "NotSubsetEqual;": '\U00002288',
+ "NotSucceeds;": '\U00002281',
+ "NotSucceedsSlantEqual;": '\U000022E1',
+ "NotSupersetEqual;": '\U00002289',
+ "NotTilde;": '\U00002241',
+ "NotTildeEqual;": '\U00002244',
+ "NotTildeFullEqual;": '\U00002247',
+ "NotTildeTilde;": '\U00002249',
+ "NotVerticalBar;": '\U00002224',
+ "Nscr;": '\U0001D4A9',
+ "Ntilde;": '\U000000D1',
+ "Nu;": '\U0000039D',
+ "OElig;": '\U00000152',
+ "Oacute;": '\U000000D3',
+ "Ocirc;": '\U000000D4',
+ "Ocy;": '\U0000041E',
+ "Odblac;": '\U00000150',
+ "Ofr;": '\U0001D512',
+ "Ograve;": '\U000000D2',
+ "Omacr;": '\U0000014C',
+ "Omega;": '\U000003A9',
+ "Omicron;": '\U0000039F',
+ "Oopf;": '\U0001D546',
+ "OpenCurlyDoubleQuote;": '\U0000201C',
+ "OpenCurlyQuote;": '\U00002018',
+ "Or;": '\U00002A54',
+ "Oscr;": '\U0001D4AA',
+ "Oslash;": '\U000000D8',
+ "Otilde;": '\U000000D5',
+ "Otimes;": '\U00002A37',
+ "Ouml;": '\U000000D6',
+ "OverBar;": '\U0000203E',
+ "OverBrace;": '\U000023DE',
+ "OverBracket;": '\U000023B4',
+ "OverParenthesis;": '\U000023DC',
+ "PartialD;": '\U00002202',
+ "Pcy;": '\U0000041F',
+ "Pfr;": '\U0001D513',
+ "Phi;": '\U000003A6',
+ "Pi;": '\U000003A0',
+ "PlusMinus;": '\U000000B1',
+ "Poincareplane;": '\U0000210C',
+ "Popf;": '\U00002119',
+ "Pr;": '\U00002ABB',
+ "Precedes;": '\U0000227A',
+ "PrecedesEqual;": '\U00002AAF',
+ "PrecedesSlantEqual;": '\U0000227C',
+ "PrecedesTilde;": '\U0000227E',
+ "Prime;": '\U00002033',
+ "Product;": '\U0000220F',
+ "Proportion;": '\U00002237',
+ "Proportional;": '\U0000221D',
+ "Pscr;": '\U0001D4AB',
+ "Psi;": '\U000003A8',
+ "QUOT;": '\U00000022',
+ "Qfr;": '\U0001D514',
+ "Qopf;": '\U0000211A',
+ "Qscr;": '\U0001D4AC',
+ "RBarr;": '\U00002910',
+ "REG;": '\U000000AE',
+ "Racute;": '\U00000154',
+ "Rang;": '\U000027EB',
+ "Rarr;": '\U000021A0',
+ "Rarrtl;": '\U00002916',
+ "Rcaron;": '\U00000158',
+ "Rcedil;": '\U00000156',
+ "Rcy;": '\U00000420',
+ "Re;": '\U0000211C',
+ "ReverseElement;": '\U0000220B',
+ "ReverseEquilibrium;": '\U000021CB',
+ "ReverseUpEquilibrium;": '\U0000296F',
+ "Rfr;": '\U0000211C',
+ "Rho;": '\U000003A1',
+ "RightAngleBracket;": '\U000027E9',
+ "RightArrow;": '\U00002192',
+ "RightArrowBar;": '\U000021E5',
+ "RightArrowLeftArrow;": '\U000021C4',
+ "RightCeiling;": '\U00002309',
+ "RightDoubleBracket;": '\U000027E7',
+ "RightDownTeeVector;": '\U0000295D',
+ "RightDownVector;": '\U000021C2',
+ "RightDownVectorBar;": '\U00002955',
+ "RightFloor;": '\U0000230B',
+ "RightTee;": '\U000022A2',
+ "RightTeeArrow;": '\U000021A6',
+ "RightTeeVector;": '\U0000295B',
+ "RightTriangle;": '\U000022B3',
+ "RightTriangleBar;": '\U000029D0',
+ "RightTriangleEqual;": '\U000022B5',
+ "RightUpDownVector;": '\U0000294F',
+ "RightUpTeeVector;": '\U0000295C',
+ "RightUpVector;": '\U000021BE',
+ "RightUpVectorBar;": '\U00002954',
+ "RightVector;": '\U000021C0',
+ "RightVectorBar;": '\U00002953',
+ "Rightarrow;": '\U000021D2',
+ "Ropf;": '\U0000211D',
+ "RoundImplies;": '\U00002970',
+ "Rrightarrow;": '\U000021DB',
+ "Rscr;": '\U0000211B',
+ "Rsh;": '\U000021B1',
+ "RuleDelayed;": '\U000029F4',
+ "SHCHcy;": '\U00000429',
+ "SHcy;": '\U00000428',
+ "SOFTcy;": '\U0000042C',
+ "Sacute;": '\U0000015A',
+ "Sc;": '\U00002ABC',
+ "Scaron;": '\U00000160',
+ "Scedil;": '\U0000015E',
+ "Scirc;": '\U0000015C',
+ "Scy;": '\U00000421',
+ "Sfr;": '\U0001D516',
+ "ShortDownArrow;": '\U00002193',
+ "ShortLeftArrow;": '\U00002190',
+ "ShortRightArrow;": '\U00002192',
+ "ShortUpArrow;": '\U00002191',
+ "Sigma;": '\U000003A3',
+ "SmallCircle;": '\U00002218',
+ "Sopf;": '\U0001D54A',
+ "Sqrt;": '\U0000221A',
+ "Square;": '\U000025A1',
+ "SquareIntersection;": '\U00002293',
+ "SquareSubset;": '\U0000228F',
+ "SquareSubsetEqual;": '\U00002291',
+ "SquareSuperset;": '\U00002290',
+ "SquareSupersetEqual;": '\U00002292',
+ "SquareUnion;": '\U00002294',
+ "Sscr;": '\U0001D4AE',
+ "Star;": '\U000022C6',
+ "Sub;": '\U000022D0',
+ "Subset;": '\U000022D0',
+ "SubsetEqual;": '\U00002286',
+ "Succeeds;": '\U0000227B',
+ "SucceedsEqual;": '\U00002AB0',
+ "SucceedsSlantEqual;": '\U0000227D',
+ "SucceedsTilde;": '\U0000227F',
+ "SuchThat;": '\U0000220B',
+ "Sum;": '\U00002211',
+ "Sup;": '\U000022D1',
+ "Superset;": '\U00002283',
+ "SupersetEqual;": '\U00002287',
+ "Supset;": '\U000022D1',
+ "THORN;": '\U000000DE',
+ "TRADE;": '\U00002122',
+ "TSHcy;": '\U0000040B',
+ "TScy;": '\U00000426',
+ "Tab;": '\U00000009',
+ "Tau;": '\U000003A4',
+ "Tcaron;": '\U00000164',
+ "Tcedil;": '\U00000162',
+ "Tcy;": '\U00000422',
+ "Tfr;": '\U0001D517',
+ "Therefore;": '\U00002234',
+ "Theta;": '\U00000398',
+ "ThinSpace;": '\U00002009',
+ "Tilde;": '\U0000223C',
+ "TildeEqual;": '\U00002243',
+ "TildeFullEqual;": '\U00002245',
+ "TildeTilde;": '\U00002248',
+ "Topf;": '\U0001D54B',
+ "TripleDot;": '\U000020DB',
+ "Tscr;": '\U0001D4AF',
+ "Tstrok;": '\U00000166',
+ "Uacute;": '\U000000DA',
+ "Uarr;": '\U0000219F',
+ "Uarrocir;": '\U00002949',
+ "Ubrcy;": '\U0000040E',
+ "Ubreve;": '\U0000016C',
+ "Ucirc;": '\U000000DB',
+ "Ucy;": '\U00000423',
+ "Udblac;": '\U00000170',
+ "Ufr;": '\U0001D518',
+ "Ugrave;": '\U000000D9',
+ "Umacr;": '\U0000016A',
+ "UnderBar;": '\U0000005F',
+ "UnderBrace;": '\U000023DF',
+ "UnderBracket;": '\U000023B5',
+ "UnderParenthesis;": '\U000023DD',
+ "Union;": '\U000022C3',
+ "UnionPlus;": '\U0000228E',
+ "Uogon;": '\U00000172',
+ "Uopf;": '\U0001D54C',
+ "UpArrow;": '\U00002191',
+ "UpArrowBar;": '\U00002912',
+ "UpArrowDownArrow;": '\U000021C5',
+ "UpDownArrow;": '\U00002195',
+ "UpEquilibrium;": '\U0000296E',
+ "UpTee;": '\U000022A5',
+ "UpTeeArrow;": '\U000021A5',
+ "Uparrow;": '\U000021D1',
+ "Updownarrow;": '\U000021D5',
+ "UpperLeftArrow;": '\U00002196',
+ "UpperRightArrow;": '\U00002197',
+ "Upsi;": '\U000003D2',
+ "Upsilon;": '\U000003A5',
+ "Uring;": '\U0000016E',
+ "Uscr;": '\U0001D4B0',
+ "Utilde;": '\U00000168',
+ "Uuml;": '\U000000DC',
+ "VDash;": '\U000022AB',
+ "Vbar;": '\U00002AEB',
+ "Vcy;": '\U00000412',
+ "Vdash;": '\U000022A9',
+ "Vdashl;": '\U00002AE6',
+ "Vee;": '\U000022C1',
+ "Verbar;": '\U00002016',
+ "Vert;": '\U00002016',
+ "VerticalBar;": '\U00002223',
+ "VerticalLine;": '\U0000007C',
+ "VerticalSeparator;": '\U00002758',
+ "VerticalTilde;": '\U00002240',
+ "VeryThinSpace;": '\U0000200A',
+ "Vfr;": '\U0001D519',
+ "Vopf;": '\U0001D54D',
+ "Vscr;": '\U0001D4B1',
+ "Vvdash;": '\U000022AA',
+ "Wcirc;": '\U00000174',
+ "Wedge;": '\U000022C0',
+ "Wfr;": '\U0001D51A',
+ "Wopf;": '\U0001D54E',
+ "Wscr;": '\U0001D4B2',
+ "Xfr;": '\U0001D51B',
+ "Xi;": '\U0000039E',
+ "Xopf;": '\U0001D54F',
+ "Xscr;": '\U0001D4B3',
+ "YAcy;": '\U0000042F',
+ "YIcy;": '\U00000407',
+ "YUcy;": '\U0000042E',
+ "Yacute;": '\U000000DD',
+ "Ycirc;": '\U00000176',
+ "Ycy;": '\U0000042B',
+ "Yfr;": '\U0001D51C',
+ "Yopf;": '\U0001D550',
+ "Yscr;": '\U0001D4B4',
+ "Yuml;": '\U00000178',
+ "ZHcy;": '\U00000416',
+ "Zacute;": '\U00000179',
+ "Zcaron;": '\U0000017D',
+ "Zcy;": '\U00000417',
+ "Zdot;": '\U0000017B',
+ "ZeroWidthSpace;": '\U0000200B',
+ "Zeta;": '\U00000396',
+ "Zfr;": '\U00002128',
+ "Zopf;": '\U00002124',
+ "Zscr;": '\U0001D4B5',
+ "aacute;": '\U000000E1',
+ "abreve;": '\U00000103',
+ "ac;": '\U0000223E',
+ "acd;": '\U0000223F',
+ "acirc;": '\U000000E2',
+ "acute;": '\U000000B4',
+ "acy;": '\U00000430',
+ "aelig;": '\U000000E6',
+ "af;": '\U00002061',
+ "afr;": '\U0001D51E',
+ "agrave;": '\U000000E0',
+ "alefsym;": '\U00002135',
+ "aleph;": '\U00002135',
+ "alpha;": '\U000003B1',
+ "amacr;": '\U00000101',
+ "amalg;": '\U00002A3F',
+ "amp;": '\U00000026',
+ "and;": '\U00002227',
+ "andand;": '\U00002A55',
+ "andd;": '\U00002A5C',
+ "andslope;": '\U00002A58',
+ "andv;": '\U00002A5A',
+ "ang;": '\U00002220',
+ "ange;": '\U000029A4',
+ "angle;": '\U00002220',
+ "angmsd;": '\U00002221',
+ "angmsdaa;": '\U000029A8',
+ "angmsdab;": '\U000029A9',
+ "angmsdac;": '\U000029AA',
+ "angmsdad;": '\U000029AB',
+ "angmsdae;": '\U000029AC',
+ "angmsdaf;": '\U000029AD',
+ "angmsdag;": '\U000029AE',
+ "angmsdah;": '\U000029AF',
+ "angrt;": '\U0000221F',
+ "angrtvb;": '\U000022BE',
+ "angrtvbd;": '\U0000299D',
+ "angsph;": '\U00002222',
+ "angst;": '\U000000C5',
+ "angzarr;": '\U0000237C',
+ "aogon;": '\U00000105',
+ "aopf;": '\U0001D552',
+ "ap;": '\U00002248',
+ "apE;": '\U00002A70',
+ "apacir;": '\U00002A6F',
+ "ape;": '\U0000224A',
+ "apid;": '\U0000224B',
+ "apos;": '\U00000027',
+ "approx;": '\U00002248',
+ "approxeq;": '\U0000224A',
+ "aring;": '\U000000E5',
+ "ascr;": '\U0001D4B6',
+ "ast;": '\U0000002A',
+ "asymp;": '\U00002248',
+ "asympeq;": '\U0000224D',
+ "atilde;": '\U000000E3',
+ "auml;": '\U000000E4',
+ "awconint;": '\U00002233',
+ "awint;": '\U00002A11',
+ "bNot;": '\U00002AED',
+ "backcong;": '\U0000224C',
+ "backepsilon;": '\U000003F6',
+ "backprime;": '\U00002035',
+ "backsim;": '\U0000223D',
+ "backsimeq;": '\U000022CD',
+ "barvee;": '\U000022BD',
+ "barwed;": '\U00002305',
+ "barwedge;": '\U00002305',
+ "bbrk;": '\U000023B5',
+ "bbrktbrk;": '\U000023B6',
+ "bcong;": '\U0000224C',
+ "bcy;": '\U00000431',
+ "bdquo;": '\U0000201E',
+ "becaus;": '\U00002235',
+ "because;": '\U00002235',
+ "bemptyv;": '\U000029B0',
+ "bepsi;": '\U000003F6',
+ "bernou;": '\U0000212C',
+ "beta;": '\U000003B2',
+ "beth;": '\U00002136',
+ "between;": '\U0000226C',
+ "bfr;": '\U0001D51F',
+ "bigcap;": '\U000022C2',
+ "bigcirc;": '\U000025EF',
+ "bigcup;": '\U000022C3',
+ "bigodot;": '\U00002A00',
+ "bigoplus;": '\U00002A01',
+ "bigotimes;": '\U00002A02',
+ "bigsqcup;": '\U00002A06',
+ "bigstar;": '\U00002605',
+ "bigtriangledown;": '\U000025BD',
+ "bigtriangleup;": '\U000025B3',
+ "biguplus;": '\U00002A04',
+ "bigvee;": '\U000022C1',
+ "bigwedge;": '\U000022C0',
+ "bkarow;": '\U0000290D',
+ "blacklozenge;": '\U000029EB',
+ "blacksquare;": '\U000025AA',
+ "blacktriangle;": '\U000025B4',
+ "blacktriangledown;": '\U000025BE',
+ "blacktriangleleft;": '\U000025C2',
+ "blacktriangleright;": '\U000025B8',
+ "blank;": '\U00002423',
+ "blk12;": '\U00002592',
+ "blk14;": '\U00002591',
+ "blk34;": '\U00002593',
+ "block;": '\U00002588',
+ "bnot;": '\U00002310',
+ "bopf;": '\U0001D553',
+ "bot;": '\U000022A5',
+ "bottom;": '\U000022A5',
+ "bowtie;": '\U000022C8',
+ "boxDL;": '\U00002557',
+ "boxDR;": '\U00002554',
+ "boxDl;": '\U00002556',
+ "boxDr;": '\U00002553',
+ "boxH;": '\U00002550',
+ "boxHD;": '\U00002566',
+ "boxHU;": '\U00002569',
+ "boxHd;": '\U00002564',
+ "boxHu;": '\U00002567',
+ "boxUL;": '\U0000255D',
+ "boxUR;": '\U0000255A',
+ "boxUl;": '\U0000255C',
+ "boxUr;": '\U00002559',
+ "boxV;": '\U00002551',
+ "boxVH;": '\U0000256C',
+ "boxVL;": '\U00002563',
+ "boxVR;": '\U00002560',
+ "boxVh;": '\U0000256B',
+ "boxVl;": '\U00002562',
+ "boxVr;": '\U0000255F',
+ "boxbox;": '\U000029C9',
+ "boxdL;": '\U00002555',
+ "boxdR;": '\U00002552',
+ "boxdl;": '\U00002510',
+ "boxdr;": '\U0000250C',
+ "boxh;": '\U00002500',
+ "boxhD;": '\U00002565',
+ "boxhU;": '\U00002568',
+ "boxhd;": '\U0000252C',
+ "boxhu;": '\U00002534',
+ "boxminus;": '\U0000229F',
+ "boxplus;": '\U0000229E',
+ "boxtimes;": '\U000022A0',
+ "boxuL;": '\U0000255B',
+ "boxuR;": '\U00002558',
+ "boxul;": '\U00002518',
+ "boxur;": '\U00002514',
+ "boxv;": '\U00002502',
+ "boxvH;": '\U0000256A',
+ "boxvL;": '\U00002561',
+ "boxvR;": '\U0000255E',
+ "boxvh;": '\U0000253C',
+ "boxvl;": '\U00002524',
+ "boxvr;": '\U0000251C',
+ "bprime;": '\U00002035',
+ "breve;": '\U000002D8',
+ "brvbar;": '\U000000A6',
+ "bscr;": '\U0001D4B7',
+ "bsemi;": '\U0000204F',
+ "bsim;": '\U0000223D',
+ "bsime;": '\U000022CD',
+ "bsol;": '\U0000005C',
+ "bsolb;": '\U000029C5',
+ "bsolhsub;": '\U000027C8',
+ "bull;": '\U00002022',
+ "bullet;": '\U00002022',
+ "bump;": '\U0000224E',
+ "bumpE;": '\U00002AAE',
+ "bumpe;": '\U0000224F',
+ "bumpeq;": '\U0000224F',
+ "cacute;": '\U00000107',
+ "cap;": '\U00002229',
+ "capand;": '\U00002A44',
+ "capbrcup;": '\U00002A49',
+ "capcap;": '\U00002A4B',
+ "capcup;": '\U00002A47',
+ "capdot;": '\U00002A40',
+ "caret;": '\U00002041',
+ "caron;": '\U000002C7',
+ "ccaps;": '\U00002A4D',
+ "ccaron;": '\U0000010D',
+ "ccedil;": '\U000000E7',
+ "ccirc;": '\U00000109',
+ "ccups;": '\U00002A4C',
+ "ccupssm;": '\U00002A50',
+ "cdot;": '\U0000010B',
+ "cedil;": '\U000000B8',
+ "cemptyv;": '\U000029B2',
+ "cent;": '\U000000A2',
+ "centerdot;": '\U000000B7',
+ "cfr;": '\U0001D520',
+ "chcy;": '\U00000447',
+ "check;": '\U00002713',
+ "checkmark;": '\U00002713',
+ "chi;": '\U000003C7',
+ "cir;": '\U000025CB',
+ "cirE;": '\U000029C3',
+ "circ;": '\U000002C6',
+ "circeq;": '\U00002257',
+ "circlearrowleft;": '\U000021BA',
+ "circlearrowright;": '\U000021BB',
+ "circledR;": '\U000000AE',
+ "circledS;": '\U000024C8',
+ "circledast;": '\U0000229B',
+ "circledcirc;": '\U0000229A',
+ "circleddash;": '\U0000229D',
+ "cire;": '\U00002257',
+ "cirfnint;": '\U00002A10',
+ "cirmid;": '\U00002AEF',
+ "cirscir;": '\U000029C2',
+ "clubs;": '\U00002663',
+ "clubsuit;": '\U00002663',
+ "colon;": '\U0000003A',
+ "colone;": '\U00002254',
+ "coloneq;": '\U00002254',
+ "comma;": '\U0000002C',
+ "commat;": '\U00000040',
+ "comp;": '\U00002201',
+ "compfn;": '\U00002218',
+ "complement;": '\U00002201',
+ "complexes;": '\U00002102',
+ "cong;": '\U00002245',
+ "congdot;": '\U00002A6D',
+ "conint;": '\U0000222E',
+ "copf;": '\U0001D554',
+ "coprod;": '\U00002210',
+ "copy;": '\U000000A9',
+ "copysr;": '\U00002117',
+ "crarr;": '\U000021B5',
+ "cross;": '\U00002717',
+ "cscr;": '\U0001D4B8',
+ "csub;": '\U00002ACF',
+ "csube;": '\U00002AD1',
+ "csup;": '\U00002AD0',
+ "csupe;": '\U00002AD2',
+ "ctdot;": '\U000022EF',
+ "cudarrl;": '\U00002938',
+ "cudarrr;": '\U00002935',
+ "cuepr;": '\U000022DE',
+ "cuesc;": '\U000022DF',
+ "cularr;": '\U000021B6',
+ "cularrp;": '\U0000293D',
+ "cup;": '\U0000222A',
+ "cupbrcap;": '\U00002A48',
+ "cupcap;": '\U00002A46',
+ "cupcup;": '\U00002A4A',
+ "cupdot;": '\U0000228D',
+ "cupor;": '\U00002A45',
+ "curarr;": '\U000021B7',
+ "curarrm;": '\U0000293C',
+ "curlyeqprec;": '\U000022DE',
+ "curlyeqsucc;": '\U000022DF',
+ "curlyvee;": '\U000022CE',
+ "curlywedge;": '\U000022CF',
+ "curren;": '\U000000A4',
+ "curvearrowleft;": '\U000021B6',
+ "curvearrowright;": '\U000021B7',
+ "cuvee;": '\U000022CE',
+ "cuwed;": '\U000022CF',
+ "cwconint;": '\U00002232',
+ "cwint;": '\U00002231',
+ "cylcty;": '\U0000232D',
+ "dArr;": '\U000021D3',
+ "dHar;": '\U00002965',
+ "dagger;": '\U00002020',
+ "daleth;": '\U00002138',
+ "darr;": '\U00002193',
+ "dash;": '\U00002010',
+ "dashv;": '\U000022A3',
+ "dbkarow;": '\U0000290F',
+ "dblac;": '\U000002DD',
+ "dcaron;": '\U0000010F',
+ "dcy;": '\U00000434',
+ "dd;": '\U00002146',
+ "ddagger;": '\U00002021',
+ "ddarr;": '\U000021CA',
+ "ddotseq;": '\U00002A77',
+ "deg;": '\U000000B0',
+ "delta;": '\U000003B4',
+ "demptyv;": '\U000029B1',
+ "dfisht;": '\U0000297F',
+ "dfr;": '\U0001D521',
+ "dharl;": '\U000021C3',
+ "dharr;": '\U000021C2',
+ "diam;": '\U000022C4',
+ "diamond;": '\U000022C4',
+ "diamondsuit;": '\U00002666',
+ "diams;": '\U00002666',
+ "die;": '\U000000A8',
+ "digamma;": '\U000003DD',
+ "disin;": '\U000022F2',
+ "div;": '\U000000F7',
+ "divide;": '\U000000F7',
+ "divideontimes;": '\U000022C7',
+ "divonx;": '\U000022C7',
+ "djcy;": '\U00000452',
+ "dlcorn;": '\U0000231E',
+ "dlcrop;": '\U0000230D',
+ "dollar;": '\U00000024',
+ "dopf;": '\U0001D555',
+ "dot;": '\U000002D9',
+ "doteq;": '\U00002250',
+ "doteqdot;": '\U00002251',
+ "dotminus;": '\U00002238',
+ "dotplus;": '\U00002214',
+ "dotsquare;": '\U000022A1',
+ "doublebarwedge;": '\U00002306',
+ "downarrow;": '\U00002193',
+ "downdownarrows;": '\U000021CA',
+ "downharpoonleft;": '\U000021C3',
+ "downharpoonright;": '\U000021C2',
+ "drbkarow;": '\U00002910',
+ "drcorn;": '\U0000231F',
+ "drcrop;": '\U0000230C',
+ "dscr;": '\U0001D4B9',
+ "dscy;": '\U00000455',
+ "dsol;": '\U000029F6',
+ "dstrok;": '\U00000111',
+ "dtdot;": '\U000022F1',
+ "dtri;": '\U000025BF',
+ "dtrif;": '\U000025BE',
+ "duarr;": '\U000021F5',
+ "duhar;": '\U0000296F',
+ "dwangle;": '\U000029A6',
+ "dzcy;": '\U0000045F',
+ "dzigrarr;": '\U000027FF',
+ "eDDot;": '\U00002A77',
+ "eDot;": '\U00002251',
+ "eacute;": '\U000000E9',
+ "easter;": '\U00002A6E',
+ "ecaron;": '\U0000011B',
+ "ecir;": '\U00002256',
+ "ecirc;": '\U000000EA',
+ "ecolon;": '\U00002255',
+ "ecy;": '\U0000044D',
+ "edot;": '\U00000117',
+ "ee;": '\U00002147',
+ "efDot;": '\U00002252',
+ "efr;": '\U0001D522',
+ "eg;": '\U00002A9A',
+ "egrave;": '\U000000E8',
+ "egs;": '\U00002A96',
+ "egsdot;": '\U00002A98',
+ "el;": '\U00002A99',
+ "elinters;": '\U000023E7',
+ "ell;": '\U00002113',
+ "els;": '\U00002A95',
+ "elsdot;": '\U00002A97',
+ "emacr;": '\U00000113',
+ "empty;": '\U00002205',
+ "emptyset;": '\U00002205',
+ "emptyv;": '\U00002205',
+ "emsp;": '\U00002003',
+ "emsp13;": '\U00002004',
+ "emsp14;": '\U00002005',
+ "eng;": '\U0000014B',
+ "ensp;": '\U00002002',
+ "eogon;": '\U00000119',
+ "eopf;": '\U0001D556',
+ "epar;": '\U000022D5',
+ "eparsl;": '\U000029E3',
+ "eplus;": '\U00002A71',
+ "epsi;": '\U000003B5',
+ "epsilon;": '\U000003B5',
+ "epsiv;": '\U000003F5',
+ "eqcirc;": '\U00002256',
+ "eqcolon;": '\U00002255',
+ "eqsim;": '\U00002242',
+ "eqslantgtr;": '\U00002A96',
+ "eqslantless;": '\U00002A95',
+ "equals;": '\U0000003D',
+ "equest;": '\U0000225F',
+ "equiv;": '\U00002261',
+ "equivDD;": '\U00002A78',
+ "eqvparsl;": '\U000029E5',
+ "erDot;": '\U00002253',
+ "erarr;": '\U00002971',
+ "escr;": '\U0000212F',
+ "esdot;": '\U00002250',
+ "esim;": '\U00002242',
+ "eta;": '\U000003B7',
+ "eth;": '\U000000F0',
+ "euml;": '\U000000EB',
+ "euro;": '\U000020AC',
+ "excl;": '\U00000021',
+ "exist;": '\U00002203',
+ "expectation;": '\U00002130',
+ "exponentiale;": '\U00002147',
+ "fallingdotseq;": '\U00002252',
+ "fcy;": '\U00000444',
+ "female;": '\U00002640',
+ "ffilig;": '\U0000FB03',
+ "fflig;": '\U0000FB00',
+ "ffllig;": '\U0000FB04',
+ "ffr;": '\U0001D523',
+ "filig;": '\U0000FB01',
+ "flat;": '\U0000266D',
+ "fllig;": '\U0000FB02',
+ "fltns;": '\U000025B1',
+ "fnof;": '\U00000192',
+ "fopf;": '\U0001D557',
+ "forall;": '\U00002200',
+ "fork;": '\U000022D4',
+ "forkv;": '\U00002AD9',
+ "fpartint;": '\U00002A0D',
+ "frac12;": '\U000000BD',
+ "frac13;": '\U00002153',
+ "frac14;": '\U000000BC',
+ "frac15;": '\U00002155',
+ "frac16;": '\U00002159',
+ "frac18;": '\U0000215B',
+ "frac23;": '\U00002154',
+ "frac25;": '\U00002156',
+ "frac34;": '\U000000BE',
+ "frac35;": '\U00002157',
+ "frac38;": '\U0000215C',
+ "frac45;": '\U00002158',
+ "frac56;": '\U0000215A',
+ "frac58;": '\U0000215D',
+ "frac78;": '\U0000215E',
+ "frasl;": '\U00002044',
+ "frown;": '\U00002322',
+ "fscr;": '\U0001D4BB',
+ "gE;": '\U00002267',
+ "gEl;": '\U00002A8C',
+ "gacute;": '\U000001F5',
+ "gamma;": '\U000003B3',
+ "gammad;": '\U000003DD',
+ "gap;": '\U00002A86',
+ "gbreve;": '\U0000011F',
+ "gcirc;": '\U0000011D',
+ "gcy;": '\U00000433',
+ "gdot;": '\U00000121',
+ "ge;": '\U00002265',
+ "gel;": '\U000022DB',
+ "geq;": '\U00002265',
+ "geqq;": '\U00002267',
+ "geqslant;": '\U00002A7E',
+ "ges;": '\U00002A7E',
+ "gescc;": '\U00002AA9',
+ "gesdot;": '\U00002A80',
+ "gesdoto;": '\U00002A82',
+ "gesdotol;": '\U00002A84',
+ "gesles;": '\U00002A94',
+ "gfr;": '\U0001D524',
+ "gg;": '\U0000226B',
+ "ggg;": '\U000022D9',
+ "gimel;": '\U00002137',
+ "gjcy;": '\U00000453',
+ "gl;": '\U00002277',
+ "glE;": '\U00002A92',
+ "gla;": '\U00002AA5',
+ "glj;": '\U00002AA4',
+ "gnE;": '\U00002269',
+ "gnap;": '\U00002A8A',
+ "gnapprox;": '\U00002A8A',
+ "gne;": '\U00002A88',
+ "gneq;": '\U00002A88',
+ "gneqq;": '\U00002269',
+ "gnsim;": '\U000022E7',
+ "gopf;": '\U0001D558',
+ "grave;": '\U00000060',
+ "gscr;": '\U0000210A',
+ "gsim;": '\U00002273',
+ "gsime;": '\U00002A8E',
+ "gsiml;": '\U00002A90',
+ "gt;": '\U0000003E',
+ "gtcc;": '\U00002AA7',
+ "gtcir;": '\U00002A7A',
+ "gtdot;": '\U000022D7',
+ "gtlPar;": '\U00002995',
+ "gtquest;": '\U00002A7C',
+ "gtrapprox;": '\U00002A86',
+ "gtrarr;": '\U00002978',
+ "gtrdot;": '\U000022D7',
+ "gtreqless;": '\U000022DB',
+ "gtreqqless;": '\U00002A8C',
+ "gtrless;": '\U00002277',
+ "gtrsim;": '\U00002273',
+ "hArr;": '\U000021D4',
+ "hairsp;": '\U0000200A',
+ "half;": '\U000000BD',
+ "hamilt;": '\U0000210B',
+ "hardcy;": '\U0000044A',
+ "harr;": '\U00002194',
+ "harrcir;": '\U00002948',
+ "harrw;": '\U000021AD',
+ "hbar;": '\U0000210F',
+ "hcirc;": '\U00000125',
+ "hearts;": '\U00002665',
+ "heartsuit;": '\U00002665',
+ "hellip;": '\U00002026',
+ "hercon;": '\U000022B9',
+ "hfr;": '\U0001D525',
+ "hksearow;": '\U00002925',
+ "hkswarow;": '\U00002926',
+ "hoarr;": '\U000021FF',
+ "homtht;": '\U0000223B',
+ "hookleftarrow;": '\U000021A9',
+ "hookrightarrow;": '\U000021AA',
+ "hopf;": '\U0001D559',
+ "horbar;": '\U00002015',
+ "hscr;": '\U0001D4BD',
+ "hslash;": '\U0000210F',
+ "hstrok;": '\U00000127',
+ "hybull;": '\U00002043',
+ "hyphen;": '\U00002010',
+ "iacute;": '\U000000ED',
+ "ic;": '\U00002063',
+ "icirc;": '\U000000EE',
+ "icy;": '\U00000438',
+ "iecy;": '\U00000435',
+ "iexcl;": '\U000000A1',
+ "iff;": '\U000021D4',
+ "ifr;": '\U0001D526',
+ "igrave;": '\U000000EC',
+ "ii;": '\U00002148',
+ "iiiint;": '\U00002A0C',
+ "iiint;": '\U0000222D',
+ "iinfin;": '\U000029DC',
+ "iiota;": '\U00002129',
+ "ijlig;": '\U00000133',
+ "imacr;": '\U0000012B',
+ "image;": '\U00002111',
+ "imagline;": '\U00002110',
+ "imagpart;": '\U00002111',
+ "imath;": '\U00000131',
+ "imof;": '\U000022B7',
+ "imped;": '\U000001B5',
+ "in;": '\U00002208',
+ "incare;": '\U00002105',
+ "infin;": '\U0000221E',
+ "infintie;": '\U000029DD',
+ "inodot;": '\U00000131',
+ "int;": '\U0000222B',
+ "intcal;": '\U000022BA',
+ "integers;": '\U00002124',
+ "intercal;": '\U000022BA',
+ "intlarhk;": '\U00002A17',
+ "intprod;": '\U00002A3C',
+ "iocy;": '\U00000451',
+ "iogon;": '\U0000012F',
+ "iopf;": '\U0001D55A',
+ "iota;": '\U000003B9',
+ "iprod;": '\U00002A3C',
+ "iquest;": '\U000000BF',
+ "iscr;": '\U0001D4BE',
+ "isin;": '\U00002208',
+ "isinE;": '\U000022F9',
+ "isindot;": '\U000022F5',
+ "isins;": '\U000022F4',
+ "isinsv;": '\U000022F3',
+ "isinv;": '\U00002208',
+ "it;": '\U00002062',
+ "itilde;": '\U00000129',
+ "iukcy;": '\U00000456',
+ "iuml;": '\U000000EF',
+ "jcirc;": '\U00000135',
+ "jcy;": '\U00000439',
+ "jfr;": '\U0001D527',
+ "jmath;": '\U00000237',
+ "jopf;": '\U0001D55B',
+ "jscr;": '\U0001D4BF',
+ "jsercy;": '\U00000458',
+ "jukcy;": '\U00000454',
+ "kappa;": '\U000003BA',
+ "kappav;": '\U000003F0',
+ "kcedil;": '\U00000137',
+ "kcy;": '\U0000043A',
+ "kfr;": '\U0001D528',
+ "kgreen;": '\U00000138',
+ "khcy;": '\U00000445',
+ "kjcy;": '\U0000045C',
+ "kopf;": '\U0001D55C',
+ "kscr;": '\U0001D4C0',
+ "lAarr;": '\U000021DA',
+ "lArr;": '\U000021D0',
+ "lAtail;": '\U0000291B',
+ "lBarr;": '\U0000290E',
+ "lE;": '\U00002266',
+ "lEg;": '\U00002A8B',
+ "lHar;": '\U00002962',
+ "lacute;": '\U0000013A',
+ "laemptyv;": '\U000029B4',
+ "lagran;": '\U00002112',
+ "lambda;": '\U000003BB',
+ "lang;": '\U000027E8',
+ "langd;": '\U00002991',
+ "langle;": '\U000027E8',
+ "lap;": '\U00002A85',
+ "laquo;": '\U000000AB',
+ "larr;": '\U00002190',
+ "larrb;": '\U000021E4',
+ "larrbfs;": '\U0000291F',
+ "larrfs;": '\U0000291D',
+ "larrhk;": '\U000021A9',
+ "larrlp;": '\U000021AB',
+ "larrpl;": '\U00002939',
+ "larrsim;": '\U00002973',
+ "larrtl;": '\U000021A2',
+ "lat;": '\U00002AAB',
+ "latail;": '\U00002919',
+ "late;": '\U00002AAD',
+ "lbarr;": '\U0000290C',
+ "lbbrk;": '\U00002772',
+ "lbrace;": '\U0000007B',
+ "lbrack;": '\U0000005B',
+ "lbrke;": '\U0000298B',
+ "lbrksld;": '\U0000298F',
+ "lbrkslu;": '\U0000298D',
+ "lcaron;": '\U0000013E',
+ "lcedil;": '\U0000013C',
+ "lceil;": '\U00002308',
+ "lcub;": '\U0000007B',
+ "lcy;": '\U0000043B',
+ "ldca;": '\U00002936',
+ "ldquo;": '\U0000201C',
+ "ldquor;": '\U0000201E',
+ "ldrdhar;": '\U00002967',
+ "ldrushar;": '\U0000294B',
+ "ldsh;": '\U000021B2',
+ "le;": '\U00002264',
+ "leftarrow;": '\U00002190',
+ "leftarrowtail;": '\U000021A2',
+ "leftharpoondown;": '\U000021BD',
+ "leftharpoonup;": '\U000021BC',
+ "leftleftarrows;": '\U000021C7',
+ "leftrightarrow;": '\U00002194',
+ "leftrightarrows;": '\U000021C6',
+ "leftrightharpoons;": '\U000021CB',
+ "leftrightsquigarrow;": '\U000021AD',
+ "leftthreetimes;": '\U000022CB',
+ "leg;": '\U000022DA',
+ "leq;": '\U00002264',
+ "leqq;": '\U00002266',
+ "leqslant;": '\U00002A7D',
+ "les;": '\U00002A7D',
+ "lescc;": '\U00002AA8',
+ "lesdot;": '\U00002A7F',
+ "lesdoto;": '\U00002A81',
+ "lesdotor;": '\U00002A83',
+ "lesges;": '\U00002A93',
+ "lessapprox;": '\U00002A85',
+ "lessdot;": '\U000022D6',
+ "lesseqgtr;": '\U000022DA',
+ "lesseqqgtr;": '\U00002A8B',
+ "lessgtr;": '\U00002276',
+ "lesssim;": '\U00002272',
+ "lfisht;": '\U0000297C',
+ "lfloor;": '\U0000230A',
+ "lfr;": '\U0001D529',
+ "lg;": '\U00002276',
+ "lgE;": '\U00002A91',
+ "lhard;": '\U000021BD',
+ "lharu;": '\U000021BC',
+ "lharul;": '\U0000296A',
+ "lhblk;": '\U00002584',
+ "ljcy;": '\U00000459',
+ "ll;": '\U0000226A',
+ "llarr;": '\U000021C7',
+ "llcorner;": '\U0000231E',
+ "llhard;": '\U0000296B',
+ "lltri;": '\U000025FA',
+ "lmidot;": '\U00000140',
+ "lmoust;": '\U000023B0',
+ "lmoustache;": '\U000023B0',
+ "lnE;": '\U00002268',
+ "lnap;": '\U00002A89',
+ "lnapprox;": '\U00002A89',
+ "lne;": '\U00002A87',
+ "lneq;": '\U00002A87',
+ "lneqq;": '\U00002268',
+ "lnsim;": '\U000022E6',
+ "loang;": '\U000027EC',
+ "loarr;": '\U000021FD',
+ "lobrk;": '\U000027E6',
+ "longleftarrow;": '\U000027F5',
+ "longleftrightarrow;": '\U000027F7',
+ "longmapsto;": '\U000027FC',
+ "longrightarrow;": '\U000027F6',
+ "looparrowleft;": '\U000021AB',
+ "looparrowright;": '\U000021AC',
+ "lopar;": '\U00002985',
+ "lopf;": '\U0001D55D',
+ "loplus;": '\U00002A2D',
+ "lotimes;": '\U00002A34',
+ "lowast;": '\U00002217',
+ "lowbar;": '\U0000005F',
+ "loz;": '\U000025CA',
+ "lozenge;": '\U000025CA',
+ "lozf;": '\U000029EB',
+ "lpar;": '\U00000028',
+ "lparlt;": '\U00002993',
+ "lrarr;": '\U000021C6',
+ "lrcorner;": '\U0000231F',
+ "lrhar;": '\U000021CB',
+ "lrhard;": '\U0000296D',
+ "lrm;": '\U0000200E',
+ "lrtri;": '\U000022BF',
+ "lsaquo;": '\U00002039',
+ "lscr;": '\U0001D4C1',
+ "lsh;": '\U000021B0',
+ "lsim;": '\U00002272',
+ "lsime;": '\U00002A8D',
+ "lsimg;": '\U00002A8F',
+ "lsqb;": '\U0000005B',
+ "lsquo;": '\U00002018',
+ "lsquor;": '\U0000201A',
+ "lstrok;": '\U00000142',
+ "lt;": '\U0000003C',
+ "ltcc;": '\U00002AA6',
+ "ltcir;": '\U00002A79',
+ "ltdot;": '\U000022D6',
+ "lthree;": '\U000022CB',
+ "ltimes;": '\U000022C9',
+ "ltlarr;": '\U00002976',
+ "ltquest;": '\U00002A7B',
+ "ltrPar;": '\U00002996',
+ "ltri;": '\U000025C3',
+ "ltrie;": '\U000022B4',
+ "ltrif;": '\U000025C2',
+ "lurdshar;": '\U0000294A',
+ "luruhar;": '\U00002966',
+ "mDDot;": '\U0000223A',
+ "macr;": '\U000000AF',
+ "male;": '\U00002642',
+ "malt;": '\U00002720',
+ "maltese;": '\U00002720',
+ "map;": '\U000021A6',
+ "mapsto;": '\U000021A6',
+ "mapstodown;": '\U000021A7',
+ "mapstoleft;": '\U000021A4',
+ "mapstoup;": '\U000021A5',
+ "marker;": '\U000025AE',
+ "mcomma;": '\U00002A29',
+ "mcy;": '\U0000043C',
+ "mdash;": '\U00002014',
+ "measuredangle;": '\U00002221',
+ "mfr;": '\U0001D52A',
+ "mho;": '\U00002127',
+ "micro;": '\U000000B5',
+ "mid;": '\U00002223',
+ "midast;": '\U0000002A',
+ "midcir;": '\U00002AF0',
+ "middot;": '\U000000B7',
+ "minus;": '\U00002212',
+ "minusb;": '\U0000229F',
+ "minusd;": '\U00002238',
+ "minusdu;": '\U00002A2A',
+ "mlcp;": '\U00002ADB',
+ "mldr;": '\U00002026',
+ "mnplus;": '\U00002213',
+ "models;": '\U000022A7',
+ "mopf;": '\U0001D55E',
+ "mp;": '\U00002213',
+ "mscr;": '\U0001D4C2',
+ "mstpos;": '\U0000223E',
+ "mu;": '\U000003BC',
+ "multimap;": '\U000022B8',
+ "mumap;": '\U000022B8',
+ "nLeftarrow;": '\U000021CD',
+ "nLeftrightarrow;": '\U000021CE',
+ "nRightarrow;": '\U000021CF',
+ "nVDash;": '\U000022AF',
+ "nVdash;": '\U000022AE',
+ "nabla;": '\U00002207',
+ "nacute;": '\U00000144',
+ "nap;": '\U00002249',
+ "napos;": '\U00000149',
+ "napprox;": '\U00002249',
+ "natur;": '\U0000266E',
+ "natural;": '\U0000266E',
+ "naturals;": '\U00002115',
+ "nbsp;": '\U000000A0',
+ "ncap;": '\U00002A43',
+ "ncaron;": '\U00000148',
+ "ncedil;": '\U00000146',
+ "ncong;": '\U00002247',
+ "ncup;": '\U00002A42',
+ "ncy;": '\U0000043D',
+ "ndash;": '\U00002013',
+ "ne;": '\U00002260',
+ "neArr;": '\U000021D7',
+ "nearhk;": '\U00002924',
+ "nearr;": '\U00002197',
+ "nearrow;": '\U00002197',
+ "nequiv;": '\U00002262',
+ "nesear;": '\U00002928',
+ "nexist;": '\U00002204',
+ "nexists;": '\U00002204',
+ "nfr;": '\U0001D52B',
+ "nge;": '\U00002271',
+ "ngeq;": '\U00002271',
+ "ngsim;": '\U00002275',
+ "ngt;": '\U0000226F',
+ "ngtr;": '\U0000226F',
+ "nhArr;": '\U000021CE',
+ "nharr;": '\U000021AE',
+ "nhpar;": '\U00002AF2',
+ "ni;": '\U0000220B',
+ "nis;": '\U000022FC',
+ "nisd;": '\U000022FA',
+ "niv;": '\U0000220B',
+ "njcy;": '\U0000045A',
+ "nlArr;": '\U000021CD',
+ "nlarr;": '\U0000219A',
+ "nldr;": '\U00002025',
+ "nle;": '\U00002270',
+ "nleftarrow;": '\U0000219A',
+ "nleftrightarrow;": '\U000021AE',
+ "nleq;": '\U00002270',
+ "nless;": '\U0000226E',
+ "nlsim;": '\U00002274',
+ "nlt;": '\U0000226E',
+ "nltri;": '\U000022EA',
+ "nltrie;": '\U000022EC',
+ "nmid;": '\U00002224',
+ "nopf;": '\U0001D55F',
+ "not;": '\U000000AC',
+ "notin;": '\U00002209',
+ "notinva;": '\U00002209',
+ "notinvb;": '\U000022F7',
+ "notinvc;": '\U000022F6',
+ "notni;": '\U0000220C',
+ "notniva;": '\U0000220C',
+ "notnivb;": '\U000022FE',
+ "notnivc;": '\U000022FD',
+ "npar;": '\U00002226',
+ "nparallel;": '\U00002226',
+ "npolint;": '\U00002A14',
+ "npr;": '\U00002280',
+ "nprcue;": '\U000022E0',
+ "nprec;": '\U00002280',
+ "nrArr;": '\U000021CF',
+ "nrarr;": '\U0000219B',
+ "nrightarrow;": '\U0000219B',
+ "nrtri;": '\U000022EB',
+ "nrtrie;": '\U000022ED',
+ "nsc;": '\U00002281',
+ "nsccue;": '\U000022E1',
+ "nscr;": '\U0001D4C3',
+ "nshortmid;": '\U00002224',
+ "nshortparallel;": '\U00002226',
+ "nsim;": '\U00002241',
+ "nsime;": '\U00002244',
+ "nsimeq;": '\U00002244',
+ "nsmid;": '\U00002224',
+ "nspar;": '\U00002226',
+ "nsqsube;": '\U000022E2',
+ "nsqsupe;": '\U000022E3',
+ "nsub;": '\U00002284',
+ "nsube;": '\U00002288',
+ "nsubseteq;": '\U00002288',
+ "nsucc;": '\U00002281',
+ "nsup;": '\U00002285',
+ "nsupe;": '\U00002289',
+ "nsupseteq;": '\U00002289',
+ "ntgl;": '\U00002279',
+ "ntilde;": '\U000000F1',
+ "ntlg;": '\U00002278',
+ "ntriangleleft;": '\U000022EA',
+ "ntrianglelefteq;": '\U000022EC',
+ "ntriangleright;": '\U000022EB',
+ "ntrianglerighteq;": '\U000022ED',
+ "nu;": '\U000003BD',
+ "num;": '\U00000023',
+ "numero;": '\U00002116',
+ "numsp;": '\U00002007',
+ "nvDash;": '\U000022AD',
+ "nvHarr;": '\U00002904',
+ "nvdash;": '\U000022AC',
+ "nvinfin;": '\U000029DE',
+ "nvlArr;": '\U00002902',
+ "nvrArr;": '\U00002903',
+ "nwArr;": '\U000021D6',
+ "nwarhk;": '\U00002923',
+ "nwarr;": '\U00002196',
+ "nwarrow;": '\U00002196',
+ "nwnear;": '\U00002927',
+ "oS;": '\U000024C8',
+ "oacute;": '\U000000F3',
+ "oast;": '\U0000229B',
+ "ocir;": '\U0000229A',
+ "ocirc;": '\U000000F4',
+ "ocy;": '\U0000043E',
+ "odash;": '\U0000229D',
+ "odblac;": '\U00000151',
+ "odiv;": '\U00002A38',
+ "odot;": '\U00002299',
+ "odsold;": '\U000029BC',
+ "oelig;": '\U00000153',
+ "ofcir;": '\U000029BF',
+ "ofr;": '\U0001D52C',
+ "ogon;": '\U000002DB',
+ "ograve;": '\U000000F2',
+ "ogt;": '\U000029C1',
+ "ohbar;": '\U000029B5',
+ "ohm;": '\U000003A9',
+ "oint;": '\U0000222E',
+ "olarr;": '\U000021BA',
+ "olcir;": '\U000029BE',
+ "olcross;": '\U000029BB',
+ "oline;": '\U0000203E',
+ "olt;": '\U000029C0',
+ "omacr;": '\U0000014D',
+ "omega;": '\U000003C9',
+ "omicron;": '\U000003BF',
+ "omid;": '\U000029B6',
+ "ominus;": '\U00002296',
+ "oopf;": '\U0001D560',
+ "opar;": '\U000029B7',
+ "operp;": '\U000029B9',
+ "oplus;": '\U00002295',
+ "or;": '\U00002228',
+ "orarr;": '\U000021BB',
+ "ord;": '\U00002A5D',
+ "order;": '\U00002134',
+ "orderof;": '\U00002134',
+ "ordf;": '\U000000AA',
+ "ordm;": '\U000000BA',
+ "origof;": '\U000022B6',
+ "oror;": '\U00002A56',
+ "orslope;": '\U00002A57',
+ "orv;": '\U00002A5B',
+ "oscr;": '\U00002134',
+ "oslash;": '\U000000F8',
+ "osol;": '\U00002298',
+ "otilde;": '\U000000F5',
+ "otimes;": '\U00002297',
+ "otimesas;": '\U00002A36',
+ "ouml;": '\U000000F6',
+ "ovbar;": '\U0000233D',
+ "par;": '\U00002225',
+ "para;": '\U000000B6',
+ "parallel;": '\U00002225',
+ "parsim;": '\U00002AF3',
+ "parsl;": '\U00002AFD',
+ "part;": '\U00002202',
+ "pcy;": '\U0000043F',
+ "percnt;": '\U00000025',
+ "period;": '\U0000002E',
+ "permil;": '\U00002030',
+ "perp;": '\U000022A5',
+ "pertenk;": '\U00002031',
+ "pfr;": '\U0001D52D',
+ "phi;": '\U000003C6',
+ "phiv;": '\U000003D5',
+ "phmmat;": '\U00002133',
+ "phone;": '\U0000260E',
+ "pi;": '\U000003C0',
+ "pitchfork;": '\U000022D4',
+ "piv;": '\U000003D6',
+ "planck;": '\U0000210F',
+ "planckh;": '\U0000210E',
+ "plankv;": '\U0000210F',
+ "plus;": '\U0000002B',
+ "plusacir;": '\U00002A23',
+ "plusb;": '\U0000229E',
+ "pluscir;": '\U00002A22',
+ "plusdo;": '\U00002214',
+ "plusdu;": '\U00002A25',
+ "pluse;": '\U00002A72',
+ "plusmn;": '\U000000B1',
+ "plussim;": '\U00002A26',
+ "plustwo;": '\U00002A27',
+ "pm;": '\U000000B1',
+ "pointint;": '\U00002A15',
+ "popf;": '\U0001D561',
+ "pound;": '\U000000A3',
+ "pr;": '\U0000227A',
+ "prE;": '\U00002AB3',
+ "prap;": '\U00002AB7',
+ "prcue;": '\U0000227C',
+ "pre;": '\U00002AAF',
+ "prec;": '\U0000227A',
+ "precapprox;": '\U00002AB7',
+ "preccurlyeq;": '\U0000227C',
+ "preceq;": '\U00002AAF',
+ "precnapprox;": '\U00002AB9',
+ "precneqq;": '\U00002AB5',
+ "precnsim;": '\U000022E8',
+ "precsim;": '\U0000227E',
+ "prime;": '\U00002032',
+ "primes;": '\U00002119',
+ "prnE;": '\U00002AB5',
+ "prnap;": '\U00002AB9',
+ "prnsim;": '\U000022E8',
+ "prod;": '\U0000220F',
+ "profalar;": '\U0000232E',
+ "profline;": '\U00002312',
+ "profsurf;": '\U00002313',
+ "prop;": '\U0000221D',
+ "propto;": '\U0000221D',
+ "prsim;": '\U0000227E',
+ "prurel;": '\U000022B0',
+ "pscr;": '\U0001D4C5',
+ "psi;": '\U000003C8',
+ "puncsp;": '\U00002008',
+ "qfr;": '\U0001D52E',
+ "qint;": '\U00002A0C',
+ "qopf;": '\U0001D562',
+ "qprime;": '\U00002057',
+ "qscr;": '\U0001D4C6',
+ "quaternions;": '\U0000210D',
+ "quatint;": '\U00002A16',
+ "quest;": '\U0000003F',
+ "questeq;": '\U0000225F',
+ "quot;": '\U00000022',
+ "rAarr;": '\U000021DB',
+ "rArr;": '\U000021D2',
+ "rAtail;": '\U0000291C',
+ "rBarr;": '\U0000290F',
+ "rHar;": '\U00002964',
+ "racute;": '\U00000155',
+ "radic;": '\U0000221A',
+ "raemptyv;": '\U000029B3',
+ "rang;": '\U000027E9',
+ "rangd;": '\U00002992',
+ "range;": '\U000029A5',
+ "rangle;": '\U000027E9',
+ "raquo;": '\U000000BB',
+ "rarr;": '\U00002192',
+ "rarrap;": '\U00002975',
+ "rarrb;": '\U000021E5',
+ "rarrbfs;": '\U00002920',
+ "rarrc;": '\U00002933',
+ "rarrfs;": '\U0000291E',
+ "rarrhk;": '\U000021AA',
+ "rarrlp;": '\U000021AC',
+ "rarrpl;": '\U00002945',
+ "rarrsim;": '\U00002974',
+ "rarrtl;": '\U000021A3',
+ "rarrw;": '\U0000219D',
+ "ratail;": '\U0000291A',
+ "ratio;": '\U00002236',
+ "rationals;": '\U0000211A',
+ "rbarr;": '\U0000290D',
+ "rbbrk;": '\U00002773',
+ "rbrace;": '\U0000007D',
+ "rbrack;": '\U0000005D',
+ "rbrke;": '\U0000298C',
+ "rbrksld;": '\U0000298E',
+ "rbrkslu;": '\U00002990',
+ "rcaron;": '\U00000159',
+ "rcedil;": '\U00000157',
+ "rceil;": '\U00002309',
+ "rcub;": '\U0000007D',
+ "rcy;": '\U00000440',
+ "rdca;": '\U00002937',
+ "rdldhar;": '\U00002969',
+ "rdquo;": '\U0000201D',
+ "rdquor;": '\U0000201D',
+ "rdsh;": '\U000021B3',
+ "real;": '\U0000211C',
+ "realine;": '\U0000211B',
+ "realpart;": '\U0000211C',
+ "reals;": '\U0000211D',
+ "rect;": '\U000025AD',
+ "reg;": '\U000000AE',
+ "rfisht;": '\U0000297D',
+ "rfloor;": '\U0000230B',
+ "rfr;": '\U0001D52F',
+ "rhard;": '\U000021C1',
+ "rharu;": '\U000021C0',
+ "rharul;": '\U0000296C',
+ "rho;": '\U000003C1',
+ "rhov;": '\U000003F1',
+ "rightarrow;": '\U00002192',
+ "rightarrowtail;": '\U000021A3',
+ "rightharpoondown;": '\U000021C1',
+ "rightharpoonup;": '\U000021C0',
+ "rightleftarrows;": '\U000021C4',
+ "rightleftharpoons;": '\U000021CC',
+ "rightrightarrows;": '\U000021C9',
+ "rightsquigarrow;": '\U0000219D',
+ "rightthreetimes;": '\U000022CC',
+ "ring;": '\U000002DA',
+ "risingdotseq;": '\U00002253',
+ "rlarr;": '\U000021C4',
+ "rlhar;": '\U000021CC',
+ "rlm;": '\U0000200F',
+ "rmoust;": '\U000023B1',
+ "rmoustache;": '\U000023B1',
+ "rnmid;": '\U00002AEE',
+ "roang;": '\U000027ED',
+ "roarr;": '\U000021FE',
+ "robrk;": '\U000027E7',
+ "ropar;": '\U00002986',
+ "ropf;": '\U0001D563',
+ "roplus;": '\U00002A2E',
+ "rotimes;": '\U00002A35',
+ "rpar;": '\U00000029',
+ "rpargt;": '\U00002994',
+ "rppolint;": '\U00002A12',
+ "rrarr;": '\U000021C9',
+ "rsaquo;": '\U0000203A',
+ "rscr;": '\U0001D4C7',
+ "rsh;": '\U000021B1',
+ "rsqb;": '\U0000005D',
+ "rsquo;": '\U00002019',
+ "rsquor;": '\U00002019',
+ "rthree;": '\U000022CC',
+ "rtimes;": '\U000022CA',
+ "rtri;": '\U000025B9',
+ "rtrie;": '\U000022B5',
+ "rtrif;": '\U000025B8',
+ "rtriltri;": '\U000029CE',
+ "ruluhar;": '\U00002968',
+ "rx;": '\U0000211E',
+ "sacute;": '\U0000015B',
+ "sbquo;": '\U0000201A',
+ "sc;": '\U0000227B',
+ "scE;": '\U00002AB4',
+ "scap;": '\U00002AB8',
+ "scaron;": '\U00000161',
+ "sccue;": '\U0000227D',
+ "sce;": '\U00002AB0',
+ "scedil;": '\U0000015F',
+ "scirc;": '\U0000015D',
+ "scnE;": '\U00002AB6',
+ "scnap;": '\U00002ABA',
+ "scnsim;": '\U000022E9',
+ "scpolint;": '\U00002A13',
+ "scsim;": '\U0000227F',
+ "scy;": '\U00000441',
+ "sdot;": '\U000022C5',
+ "sdotb;": '\U000022A1',
+ "sdote;": '\U00002A66',
+ "seArr;": '\U000021D8',
+ "searhk;": '\U00002925',
+ "searr;": '\U00002198',
+ "searrow;": '\U00002198',
+ "sect;": '\U000000A7',
+ "semi;": '\U0000003B',
+ "seswar;": '\U00002929',
+ "setminus;": '\U00002216',
+ "setmn;": '\U00002216',
+ "sext;": '\U00002736',
+ "sfr;": '\U0001D530',
+ "sfrown;": '\U00002322',
+ "sharp;": '\U0000266F',
+ "shchcy;": '\U00000449',
+ "shcy;": '\U00000448',
+ "shortmid;": '\U00002223',
+ "shortparallel;": '\U00002225',
+ "shy;": '\U000000AD',
+ "sigma;": '\U000003C3',
+ "sigmaf;": '\U000003C2',
+ "sigmav;": '\U000003C2',
+ "sim;": '\U0000223C',
+ "simdot;": '\U00002A6A',
+ "sime;": '\U00002243',
+ "simeq;": '\U00002243',
+ "simg;": '\U00002A9E',
+ "simgE;": '\U00002AA0',
+ "siml;": '\U00002A9D',
+ "simlE;": '\U00002A9F',
+ "simne;": '\U00002246',
+ "simplus;": '\U00002A24',
+ "simrarr;": '\U00002972',
+ "slarr;": '\U00002190',
+ "smallsetminus;": '\U00002216',
+ "smashp;": '\U00002A33',
+ "smeparsl;": '\U000029E4',
+ "smid;": '\U00002223',
+ "smile;": '\U00002323',
+ "smt;": '\U00002AAA',
+ "smte;": '\U00002AAC',
+ "softcy;": '\U0000044C',
+ "sol;": '\U0000002F',
+ "solb;": '\U000029C4',
+ "solbar;": '\U0000233F',
+ "sopf;": '\U0001D564',
+ "spades;": '\U00002660',
+ "spadesuit;": '\U00002660',
+ "spar;": '\U00002225',
+ "sqcap;": '\U00002293',
+ "sqcup;": '\U00002294',
+ "sqsub;": '\U0000228F',
+ "sqsube;": '\U00002291',
+ "sqsubset;": '\U0000228F',
+ "sqsubseteq;": '\U00002291',
+ "sqsup;": '\U00002290',
+ "sqsupe;": '\U00002292',
+ "sqsupset;": '\U00002290',
+ "sqsupseteq;": '\U00002292',
+ "squ;": '\U000025A1',
+ "square;": '\U000025A1',
+ "squarf;": '\U000025AA',
+ "squf;": '\U000025AA',
+ "srarr;": '\U00002192',
+ "sscr;": '\U0001D4C8',
+ "ssetmn;": '\U00002216',
+ "ssmile;": '\U00002323',
+ "sstarf;": '\U000022C6',
+ "star;": '\U00002606',
+ "starf;": '\U00002605',
+ "straightepsilon;": '\U000003F5',
+ "straightphi;": '\U000003D5',
+ "strns;": '\U000000AF',
+ "sub;": '\U00002282',
+ "subE;": '\U00002AC5',
+ "subdot;": '\U00002ABD',
+ "sube;": '\U00002286',
+ "subedot;": '\U00002AC3',
+ "submult;": '\U00002AC1',
+ "subnE;": '\U00002ACB',
+ "subne;": '\U0000228A',
+ "subplus;": '\U00002ABF',
+ "subrarr;": '\U00002979',
+ "subset;": '\U00002282',
+ "subseteq;": '\U00002286',
+ "subseteqq;": '\U00002AC5',
+ "subsetneq;": '\U0000228A',
+ "subsetneqq;": '\U00002ACB',
+ "subsim;": '\U00002AC7',
+ "subsub;": '\U00002AD5',
+ "subsup;": '\U00002AD3',
+ "succ;": '\U0000227B',
+ "succapprox;": '\U00002AB8',
+ "succcurlyeq;": '\U0000227D',
+ "succeq;": '\U00002AB0',
+ "succnapprox;": '\U00002ABA',
+ "succneqq;": '\U00002AB6',
+ "succnsim;": '\U000022E9',
+ "succsim;": '\U0000227F',
+ "sum;": '\U00002211',
+ "sung;": '\U0000266A',
+ "sup;": '\U00002283',
+ "sup1;": '\U000000B9',
+ "sup2;": '\U000000B2',
+ "sup3;": '\U000000B3',
+ "supE;": '\U00002AC6',
+ "supdot;": '\U00002ABE',
+ "supdsub;": '\U00002AD8',
+ "supe;": '\U00002287',
+ "supedot;": '\U00002AC4',
+ "suphsol;": '\U000027C9',
+ "suphsub;": '\U00002AD7',
+ "suplarr;": '\U0000297B',
+ "supmult;": '\U00002AC2',
+ "supnE;": '\U00002ACC',
+ "supne;": '\U0000228B',
+ "supplus;": '\U00002AC0',
+ "supset;": '\U00002283',
+ "supseteq;": '\U00002287',
+ "supseteqq;": '\U00002AC6',
+ "supsetneq;": '\U0000228B',
+ "supsetneqq;": '\U00002ACC',
+ "supsim;": '\U00002AC8',
+ "supsub;": '\U00002AD4',
+ "supsup;": '\U00002AD6',
+ "swArr;": '\U000021D9',
+ "swarhk;": '\U00002926',
+ "swarr;": '\U00002199',
+ "swarrow;": '\U00002199',
+ "swnwar;": '\U0000292A',
+ "szlig;": '\U000000DF',
+ "target;": '\U00002316',
+ "tau;": '\U000003C4',
+ "tbrk;": '\U000023B4',
+ "tcaron;": '\U00000165',
+ "tcedil;": '\U00000163',
+ "tcy;": '\U00000442',
+ "tdot;": '\U000020DB',
+ "telrec;": '\U00002315',
+ "tfr;": '\U0001D531',
+ "there4;": '\U00002234',
+ "therefore;": '\U00002234',
+ "theta;": '\U000003B8',
+ "thetasym;": '\U000003D1',
+ "thetav;": '\U000003D1',
+ "thickapprox;": '\U00002248',
+ "thicksim;": '\U0000223C',
+ "thinsp;": '\U00002009',
+ "thkap;": '\U00002248',
+ "thksim;": '\U0000223C',
+ "thorn;": '\U000000FE',
+ "tilde;": '\U000002DC',
+ "times;": '\U000000D7',
+ "timesb;": '\U000022A0',
+ "timesbar;": '\U00002A31',
+ "timesd;": '\U00002A30',
+ "tint;": '\U0000222D',
+ "toea;": '\U00002928',
+ "top;": '\U000022A4',
+ "topbot;": '\U00002336',
+ "topcir;": '\U00002AF1',
+ "topf;": '\U0001D565',
+ "topfork;": '\U00002ADA',
+ "tosa;": '\U00002929',
+ "tprime;": '\U00002034',
+ "trade;": '\U00002122',
+ "triangle;": '\U000025B5',
+ "triangledown;": '\U000025BF',
+ "triangleleft;": '\U000025C3',
+ "trianglelefteq;": '\U000022B4',
+ "triangleq;": '\U0000225C',
+ "triangleright;": '\U000025B9',
+ "trianglerighteq;": '\U000022B5',
+ "tridot;": '\U000025EC',
+ "trie;": '\U0000225C',
+ "triminus;": '\U00002A3A',
+ "triplus;": '\U00002A39',
+ "trisb;": '\U000029CD',
+ "tritime;": '\U00002A3B',
+ "trpezium;": '\U000023E2',
+ "tscr;": '\U0001D4C9',
+ "tscy;": '\U00000446',
+ "tshcy;": '\U0000045B',
+ "tstrok;": '\U00000167',
+ "twixt;": '\U0000226C',
+ "twoheadleftarrow;": '\U0000219E',
+ "twoheadrightarrow;": '\U000021A0',
+ "uArr;": '\U000021D1',
+ "uHar;": '\U00002963',
+ "uacute;": '\U000000FA',
+ "uarr;": '\U00002191',
+ "ubrcy;": '\U0000045E',
+ "ubreve;": '\U0000016D',
+ "ucirc;": '\U000000FB',
+ "ucy;": '\U00000443',
+ "udarr;": '\U000021C5',
+ "udblac;": '\U00000171',
+ "udhar;": '\U0000296E',
+ "ufisht;": '\U0000297E',
+ "ufr;": '\U0001D532',
+ "ugrave;": '\U000000F9',
+ "uharl;": '\U000021BF',
+ "uharr;": '\U000021BE',
+ "uhblk;": '\U00002580',
+ "ulcorn;": '\U0000231C',
+ "ulcorner;": '\U0000231C',
+ "ulcrop;": '\U0000230F',
+ "ultri;": '\U000025F8',
+ "umacr;": '\U0000016B',
+ "uml;": '\U000000A8',
+ "uogon;": '\U00000173',
+ "uopf;": '\U0001D566',
+ "uparrow;": '\U00002191',
+ "updownarrow;": '\U00002195',
+ "upharpoonleft;": '\U000021BF',
+ "upharpoonright;": '\U000021BE',
+ "uplus;": '\U0000228E',
+ "upsi;": '\U000003C5',
+ "upsih;": '\U000003D2',
+ "upsilon;": '\U000003C5',
+ "upuparrows;": '\U000021C8',
+ "urcorn;": '\U0000231D',
+ "urcorner;": '\U0000231D',
+ "urcrop;": '\U0000230E',
+ "uring;": '\U0000016F',
+ "urtri;": '\U000025F9',
+ "uscr;": '\U0001D4CA',
+ "utdot;": '\U000022F0',
+ "utilde;": '\U00000169',
+ "utri;": '\U000025B5',
+ "utrif;": '\U000025B4',
+ "uuarr;": '\U000021C8',
+ "uuml;": '\U000000FC',
+ "uwangle;": '\U000029A7',
+ "vArr;": '\U000021D5',
+ "vBar;": '\U00002AE8',
+ "vBarv;": '\U00002AE9',
+ "vDash;": '\U000022A8',
+ "vangrt;": '\U0000299C',
+ "varepsilon;": '\U000003F5',
+ "varkappa;": '\U000003F0',
+ "varnothing;": '\U00002205',
+ "varphi;": '\U000003D5',
+ "varpi;": '\U000003D6',
+ "varpropto;": '\U0000221D',
+ "varr;": '\U00002195',
+ "varrho;": '\U000003F1',
+ "varsigma;": '\U000003C2',
+ "vartheta;": '\U000003D1',
+ "vartriangleleft;": '\U000022B2',
+ "vartriangleright;": '\U000022B3',
+ "vcy;": '\U00000432',
+ "vdash;": '\U000022A2',
+ "vee;": '\U00002228',
+ "veebar;": '\U000022BB',
+ "veeeq;": '\U0000225A',
+ "vellip;": '\U000022EE',
+ "verbar;": '\U0000007C',
+ "vert;": '\U0000007C',
+ "vfr;": '\U0001D533',
+ "vltri;": '\U000022B2',
+ "vopf;": '\U0001D567',
+ "vprop;": '\U0000221D',
+ "vrtri;": '\U000022B3',
+ "vscr;": '\U0001D4CB',
+ "vzigzag;": '\U0000299A',
+ "wcirc;": '\U00000175',
+ "wedbar;": '\U00002A5F',
+ "wedge;": '\U00002227',
+ "wedgeq;": '\U00002259',
+ "weierp;": '\U00002118',
+ "wfr;": '\U0001D534',
+ "wopf;": '\U0001D568',
+ "wp;": '\U00002118',
+ "wr;": '\U00002240',
+ "wreath;": '\U00002240',
+ "wscr;": '\U0001D4CC',
+ "xcap;": '\U000022C2',
+ "xcirc;": '\U000025EF',
+ "xcup;": '\U000022C3',
+ "xdtri;": '\U000025BD',
+ "xfr;": '\U0001D535',
+ "xhArr;": '\U000027FA',
+ "xharr;": '\U000027F7',
+ "xi;": '\U000003BE',
+ "xlArr;": '\U000027F8',
+ "xlarr;": '\U000027F5',
+ "xmap;": '\U000027FC',
+ "xnis;": '\U000022FB',
+ "xodot;": '\U00002A00',
+ "xopf;": '\U0001D569',
+ "xoplus;": '\U00002A01',
+ "xotime;": '\U00002A02',
+ "xrArr;": '\U000027F9',
+ "xrarr;": '\U000027F6',
+ "xscr;": '\U0001D4CD',
+ "xsqcup;": '\U00002A06',
+ "xuplus;": '\U00002A04',
+ "xutri;": '\U000025B3',
+ "xvee;": '\U000022C1',
+ "xwedge;": '\U000022C0',
+ "yacute;": '\U000000FD',
+ "yacy;": '\U0000044F',
+ "ycirc;": '\U00000177',
+ "ycy;": '\U0000044B',
+ "yen;": '\U000000A5',
+ "yfr;": '\U0001D536',
+ "yicy;": '\U00000457',
+ "yopf;": '\U0001D56A',
+ "yscr;": '\U0001D4CE',
+ "yucy;": '\U0000044E',
+ "yuml;": '\U000000FF',
+ "zacute;": '\U0000017A',
+ "zcaron;": '\U0000017E',
+ "zcy;": '\U00000437',
+ "zdot;": '\U0000017C',
+ "zeetrf;": '\U00002128',
+ "zeta;": '\U000003B6',
+ "zfr;": '\U0001D537',
+ "zhcy;": '\U00000436',
+ "zigrarr;": '\U000021DD',
+ "zopf;": '\U0001D56B',
+ "zscr;": '\U0001D4CF',
+ "zwj;": '\U0000200D',
+ "zwnj;": '\U0000200C',
+ "AElig": '\U000000C6',
+ "AMP": '\U00000026',
+ "Aacute": '\U000000C1',
+ "Acirc": '\U000000C2',
+ "Agrave": '\U000000C0',
+ "Aring": '\U000000C5',
+ "Atilde": '\U000000C3',
+ "Auml": '\U000000C4',
+ "COPY": '\U000000A9',
+ "Ccedil": '\U000000C7',
+ "ETH": '\U000000D0',
+ "Eacute": '\U000000C9',
+ "Ecirc": '\U000000CA',
+ "Egrave": '\U000000C8',
+ "Euml": '\U000000CB',
+ "GT": '\U0000003E',
+ "Iacute": '\U000000CD',
+ "Icirc": '\U000000CE',
+ "Igrave": '\U000000CC',
+ "Iuml": '\U000000CF',
+ "LT": '\U0000003C',
+ "Ntilde": '\U000000D1',
+ "Oacute": '\U000000D3',
+ "Ocirc": '\U000000D4',
+ "Ograve": '\U000000D2',
+ "Oslash": '\U000000D8',
+ "Otilde": '\U000000D5',
+ "Ouml": '\U000000D6',
+ "QUOT": '\U00000022',
+ "REG": '\U000000AE',
+ "THORN": '\U000000DE',
+ "Uacute": '\U000000DA',
+ "Ucirc": '\U000000DB',
+ "Ugrave": '\U000000D9',
+ "Uuml": '\U000000DC',
+ "Yacute": '\U000000DD',
+ "aacute": '\U000000E1',
+ "acirc": '\U000000E2',
+ "acute": '\U000000B4',
+ "aelig": '\U000000E6',
+ "agrave": '\U000000E0',
+ "amp": '\U00000026',
+ "aring": '\U000000E5',
+ "atilde": '\U000000E3',
+ "auml": '\U000000E4',
+ "brvbar": '\U000000A6',
+ "ccedil": '\U000000E7',
+ "cedil": '\U000000B8',
+ "cent": '\U000000A2',
+ "copy": '\U000000A9',
+ "curren": '\U000000A4',
+ "deg": '\U000000B0',
+ "divide": '\U000000F7',
+ "eacute": '\U000000E9',
+ "ecirc": '\U000000EA',
+ "egrave": '\U000000E8',
+ "eth": '\U000000F0',
+ "euml": '\U000000EB',
+ "frac12": '\U000000BD',
+ "frac14": '\U000000BC',
+ "frac34": '\U000000BE',
+ "gt": '\U0000003E',
+ "iacute": '\U000000ED',
+ "icirc": '\U000000EE',
+ "iexcl": '\U000000A1',
+ "igrave": '\U000000EC',
+ "iquest": '\U000000BF',
+ "iuml": '\U000000EF',
+ "laquo": '\U000000AB',
+ "lt": '\U0000003C',
+ "macr": '\U000000AF',
+ "micro": '\U000000B5',
+ "middot": '\U000000B7',
+ "nbsp": '\U000000A0',
+ "not": '\U000000AC',
+ "ntilde": '\U000000F1',
+ "oacute": '\U000000F3',
+ "ocirc": '\U000000F4',
+ "ograve": '\U000000F2',
+ "ordf": '\U000000AA',
+ "ordm": '\U000000BA',
+ "oslash": '\U000000F8',
+ "otilde": '\U000000F5',
+ "ouml": '\U000000F6',
+ "para": '\U000000B6',
+ "plusmn": '\U000000B1',
+ "pound": '\U000000A3',
+ "quot": '\U00000022',
+ "raquo": '\U000000BB',
+ "reg": '\U000000AE',
+ "sect": '\U000000A7',
+ "shy": '\U000000AD',
+ "sup1": '\U000000B9',
+ "sup2": '\U000000B2',
+ "sup3": '\U000000B3',
+ "szlig": '\U000000DF',
+ "thorn": '\U000000FE',
+ "times": '\U000000D7',
+ "uacute": '\U000000FA',
+ "ucirc": '\U000000FB',
+ "ugrave": '\U000000F9',
+ "uml": '\U000000A8',
+ "uuml": '\U000000FC',
+ "yacute": '\U000000FD',
+ "yen": '\U000000A5',
+ "yuml": '\U000000FF',
+}
+
+// HTML entities that are two unicode codepoints.
+var entity2 = map[string][2]rune{
+ // TODO(nigeltao): Handle replacements that are wider than their names.
+ // "nLt;": {'\u226A', '\u20D2'},
+ // "nGt;": {'\u226B', '\u20D2'},
+ "NotEqualTilde;": {'\u2242', '\u0338'},
+ "NotGreaterFullEqual;": {'\u2267', '\u0338'},
+ "NotGreaterGreater;": {'\u226B', '\u0338'},
+ "NotGreaterSlantEqual;": {'\u2A7E', '\u0338'},
+ "NotHumpDownHump;": {'\u224E', '\u0338'},
+ "NotHumpEqual;": {'\u224F', '\u0338'},
+ "NotLeftTriangleBar;": {'\u29CF', '\u0338'},
+ "NotLessLess;": {'\u226A', '\u0338'},
+ "NotLessSlantEqual;": {'\u2A7D', '\u0338'},
+ "NotNestedGreaterGreater;": {'\u2AA2', '\u0338'},
+ "NotNestedLessLess;": {'\u2AA1', '\u0338'},
+ "NotPrecedesEqual;": {'\u2AAF', '\u0338'},
+ "NotRightTriangleBar;": {'\u29D0', '\u0338'},
+ "NotSquareSubset;": {'\u228F', '\u0338'},
+ "NotSquareSuperset;": {'\u2290', '\u0338'},
+ "NotSubset;": {'\u2282', '\u20D2'},
+ "NotSucceedsEqual;": {'\u2AB0', '\u0338'},
+ "NotSucceedsTilde;": {'\u227F', '\u0338'},
+ "NotSuperset;": {'\u2283', '\u20D2'},
+ "ThickSpace;": {'\u205F', '\u200A'},
+ "acE;": {'\u223E', '\u0333'},
+ "bne;": {'\u003D', '\u20E5'},
+ "bnequiv;": {'\u2261', '\u20E5'},
+ "caps;": {'\u2229', '\uFE00'},
+ "cups;": {'\u222A', '\uFE00'},
+ "fjlig;": {'\u0066', '\u006A'},
+ "gesl;": {'\u22DB', '\uFE00'},
+ "gvertneqq;": {'\u2269', '\uFE00'},
+ "gvnE;": {'\u2269', '\uFE00'},
+ "lates;": {'\u2AAD', '\uFE00'},
+ "lesg;": {'\u22DA', '\uFE00'},
+ "lvertneqq;": {'\u2268', '\uFE00'},
+ "lvnE;": {'\u2268', '\uFE00'},
+ "nGg;": {'\u22D9', '\u0338'},
+ "nGtv;": {'\u226B', '\u0338'},
+ "nLl;": {'\u22D8', '\u0338'},
+ "nLtv;": {'\u226A', '\u0338'},
+ "nang;": {'\u2220', '\u20D2'},
+ "napE;": {'\u2A70', '\u0338'},
+ "napid;": {'\u224B', '\u0338'},
+ "nbump;": {'\u224E', '\u0338'},
+ "nbumpe;": {'\u224F', '\u0338'},
+ "ncongdot;": {'\u2A6D', '\u0338'},
+ "nedot;": {'\u2250', '\u0338'},
+ "nesim;": {'\u2242', '\u0338'},
+ "ngE;": {'\u2267', '\u0338'},
+ "ngeqq;": {'\u2267', '\u0338'},
+ "ngeqslant;": {'\u2A7E', '\u0338'},
+ "nges;": {'\u2A7E', '\u0338'},
+ "nlE;": {'\u2266', '\u0338'},
+ "nleqq;": {'\u2266', '\u0338'},
+ "nleqslant;": {'\u2A7D', '\u0338'},
+ "nles;": {'\u2A7D', '\u0338'},
+ "notinE;": {'\u22F9', '\u0338'},
+ "notindot;": {'\u22F5', '\u0338'},
+ "nparsl;": {'\u2AFD', '\u20E5'},
+ "npart;": {'\u2202', '\u0338'},
+ "npre;": {'\u2AAF', '\u0338'},
+ "npreceq;": {'\u2AAF', '\u0338'},
+ "nrarrc;": {'\u2933', '\u0338'},
+ "nrarrw;": {'\u219D', '\u0338'},
+ "nsce;": {'\u2AB0', '\u0338'},
+ "nsubE;": {'\u2AC5', '\u0338'},
+ "nsubset;": {'\u2282', '\u20D2'},
+ "nsubseteqq;": {'\u2AC5', '\u0338'},
+ "nsucceq;": {'\u2AB0', '\u0338'},
+ "nsupE;": {'\u2AC6', '\u0338'},
+ "nsupset;": {'\u2283', '\u20D2'},
+ "nsupseteqq;": {'\u2AC6', '\u0338'},
+ "nvap;": {'\u224D', '\u20D2'},
+ "nvge;": {'\u2265', '\u20D2'},
+ "nvgt;": {'\u003E', '\u20D2'},
+ "nvle;": {'\u2264', '\u20D2'},
+ "nvlt;": {'\u003C', '\u20D2'},
+ "nvltrie;": {'\u22B4', '\u20D2'},
+ "nvrtrie;": {'\u22B5', '\u20D2'},
+ "nvsim;": {'\u223C', '\u20D2'},
+ "race;": {'\u223D', '\u0331'},
+ "smtes;": {'\u2AAC', '\uFE00'},
+ "sqcaps;": {'\u2293', '\uFE00'},
+ "sqcups;": {'\u2294', '\uFE00'},
+ "varsubsetneq;": {'\u228A', '\uFE00'},
+ "varsubsetneqq;": {'\u2ACB', '\uFE00'},
+ "varsupsetneq;": {'\u228B', '\uFE00'},
+ "varsupsetneqq;": {'\u2ACC', '\uFE00'},
+ "vnsub;": {'\u2282', '\u20D2'},
+ "vnsup;": {'\u2283', '\u20D2'},
+ "vsubnE;": {'\u2ACB', '\uFE00'},
+ "vsubne;": {'\u228A', '\uFE00'},
+ "vsupnE;": {'\u2ACC', '\uFE00'},
+ "vsupne;": {'\u228B', '\uFE00'},
+}
diff --git a/vendor/golang.org/x/net/html/escape.go b/vendor/golang.org/x/net/html/escape.go
new file mode 100644
index 0000000..d856139
--- /dev/null
+++ b/vendor/golang.org/x/net/html/escape.go
@@ -0,0 +1,258 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package html
+
+import (
+ "bytes"
+ "strings"
+ "unicode/utf8"
+)
+
+// These replacements permit compatibility with old numeric entities that
+// assumed Windows-1252 encoding.
+// https://html.spec.whatwg.org/multipage/syntax.html#consume-a-character-reference
+var replacementTable = [...]rune{
+ '\u20AC', // First entry is what 0x80 should be replaced with.
+ '\u0081',
+ '\u201A',
+ '\u0192',
+ '\u201E',
+ '\u2026',
+ '\u2020',
+ '\u2021',
+ '\u02C6',
+ '\u2030',
+ '\u0160',
+ '\u2039',
+ '\u0152',
+ '\u008D',
+ '\u017D',
+ '\u008F',
+ '\u0090',
+ '\u2018',
+ '\u2019',
+ '\u201C',
+ '\u201D',
+ '\u2022',
+ '\u2013',
+ '\u2014',
+ '\u02DC',
+ '\u2122',
+ '\u0161',
+ '\u203A',
+ '\u0153',
+ '\u009D',
+ '\u017E',
+ '\u0178', // Last entry is 0x9F.
+ // 0x00->'\uFFFD' is handled programmatically.
+ // 0x0D->'\u000D' is a no-op.
+}
+
+// unescapeEntity reads an entity like "&lt;" from b[src:] and writes the
+// corresponding "<" to b[dst:], returning the incremented dst and src cursors.
+// Precondition: b[src] == '&' && dst <= src.
+// attribute should be true if parsing an attribute value.
+func unescapeEntity(b []byte, dst, src int, attribute bool) (dst1, src1 int) {
+ // https://html.spec.whatwg.org/multipage/syntax.html#consume-a-character-reference
+
+ // i starts at 1 because we already know that s[0] == '&'.
+ i, s := 1, b[src:]
+
+ if len(s) <= 1 {
+ b[dst] = b[src]
+ return dst + 1, src + 1
+ }
+
+ if s[i] == '#' {
+ if len(s) <= 3 { // We need to have at least "&#.".
+ b[dst] = b[src]
+ return dst + 1, src + 1
+ }
+ i++
+ c := s[i]
+ hex := false
+ if c == 'x' || c == 'X' {
+ hex = true
+ i++
+ }
+
+ x := '\x00'
+ for i < len(s) {
+ c = s[i]
+ i++
+ if hex {
+ if '0' <= c && c <= '9' {
+ x = 16*x + rune(c) - '0'
+ continue
+ } else if 'a' <= c && c <= 'f' {
+ x = 16*x + rune(c) - 'a' + 10
+ continue
+ } else if 'A' <= c && c <= 'F' {
+ x = 16*x + rune(c) - 'A' + 10
+ continue
+ }
+ } else if '0' <= c && c <= '9' {
+ x = 10*x + rune(c) - '0'
+ continue
+ }
+ if c != ';' {
+ i--
+ }
+ break
+ }
+
+ if i <= 3 { // No characters matched.
+ b[dst] = b[src]
+ return dst + 1, src + 1
+ }
+
+ if 0x80 <= x && x <= 0x9F {
+ // Replace characters from Windows-1252 with UTF-8 equivalents.
+ x = replacementTable[x-0x80]
+ } else if x == 0 || (0xD800 <= x && x <= 0xDFFF) || x > 0x10FFFF {
+ // Replace invalid characters with the replacement character.
+ x = '\uFFFD'
+ }
+
+ return dst + utf8.EncodeRune(b[dst:], x), src + i
+ }
+
+ // Consume the maximum number of characters possible, with the
+ // consumed characters matching one of the named references.
+
+ for i < len(s) {
+ c := s[i]
+ i++
+ // Lower-cased characters are more common in entities, so we check for them first.
+ if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9' {
+ continue
+ }
+ if c != ';' {
+ i--
+ }
+ break
+ }
+
+ entityName := string(s[1:i])
+ if entityName == "" {
+ // No-op.
+ } else if attribute && entityName[len(entityName)-1] != ';' && len(s) > i && s[i] == '=' {
+ // No-op.
+ } else if x := entity[entityName]; x != 0 {
+ return dst + utf8.EncodeRune(b[dst:], x), src + i
+ } else if x := entity2[entityName]; x[0] != 0 {
+ dst1 := dst + utf8.EncodeRune(b[dst:], x[0])
+ return dst1 + utf8.EncodeRune(b[dst1:], x[1]), src + i
+ } else if !attribute {
+ maxLen := len(entityName) - 1
+ if maxLen > longestEntityWithoutSemicolon {
+ maxLen = longestEntityWithoutSemicolon
+ }
+ for j := maxLen; j > 1; j-- {
+ if x := entity[entityName[:j]]; x != 0 {
+ return dst + utf8.EncodeRune(b[dst:], x), src + j + 1
+ }
+ }
+ }
+
+ dst1, src1 = dst+i, src+i
+ copy(b[dst:dst1], b[src:src1])
+ return dst1, src1
+}
+
+// unescape unescapes b's entities in-place, so that "a&lt;b" becomes "a<b".
+// attribute should be true if parsing an attribute value.
+func unescape(b []byte, attribute bool) []byte {
+ for i, c := range b {
+ if c == '&' {
+ dst, src := unescapeEntity(b, i, i, attribute)
+ for src < len(b) {
+ c := b[src]
+ if c == '&' {
+ dst, src = unescapeEntity(b, dst, src, attribute)
+ } else {
+ b[dst] = c
+ dst, src = dst+1, src+1
+ }
+ }
+ return b[0:dst]
+ }
+ }
+ return b
+}
+
+// lower lower-cases the A-Z bytes in b in-place, so that "aBc" becomes "abc".
+func lower(b []byte) []byte {
+ for i, c := range b {
+ if 'A' <= c && c <= 'Z' {
+ b[i] = c + 'a' - 'A'
+ }
+ }
+ return b
+}
+
+const escapedChars = "&'<>\"\r"
+
+func escape(w writer, s string) error {
+ i := strings.IndexAny(s, escapedChars)
+ for i != -1 {
+ if _, err := w.WriteString(s[:i]); err != nil {
+ return err
+ }
+ var esc string
+ switch s[i] {
+ case '&':
+ esc = "&amp;"
+ case '\'':
+ // "&#39;" is shorter than "&apos;" and apos was not in HTML until HTML5.
+ esc = "&#39;"
+ case '<':
+ esc = "&lt;"
+ case '>':
+ esc = "&gt;"
+ case '"':
+ // "&#34;" is shorter than "&quot;".
+ esc = "&#34;"
+ case '\r':
+ esc = "&#13;"
+ default:
+ panic("unrecognized escape character")
+ }
+ s = s[i+1:]
+ if _, err := w.WriteString(esc); err != nil {
+ return err
+ }
+ i = strings.IndexAny(s, escapedChars)
+ }
+ _, err := w.WriteString(s)
+ return err
+}
+
+// EscapeString escapes special characters like "<" to become "&lt;". It
+// escapes only five such characters: <, >, &, ' and ".
+// UnescapeString(EscapeString(s)) == s always holds, but the converse isn't
+// always true.
+func EscapeString(s string) string {
+ if strings.IndexAny(s, escapedChars) == -1 {
+ return s
+ }
+ var buf bytes.Buffer
+ escape(&buf, s)
+ return buf.String()
+}
+
+// UnescapeString unescapes entities like "&lt;" to become "<". It unescapes a
+// larger range of entities than EscapeString escapes. For example, "&aacute;"
+// unescapes to "á", as does "&#225;" and "&xE1;".
+// UnescapeString(EscapeString(s)) == s always holds, but the converse isn't
+// always true.
+func UnescapeString(s string) string {
+ for _, c := range s {
+ if c == '&' {
+ return string(unescape([]byte(s), false))
+ }
+ }
+ return s
+}
diff --git a/vendor/golang.org/x/net/html/foreign.go b/vendor/golang.org/x/net/html/foreign.go
new file mode 100644
index 0000000..9da9e9d
--- /dev/null
+++ b/vendor/golang.org/x/net/html/foreign.go
@@ -0,0 +1,222 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package html
+
+import (
+ "strings"
+)
+
+func adjustAttributeNames(aa []Attribute, nameMap map[string]string) {
+ for i := range aa {
+ if newName, ok := nameMap[aa[i].Key]; ok {
+ aa[i].Key = newName
+ }
+ }
+}
+
+func adjustForeignAttributes(aa []Attribute) {
+ for i, a := range aa {
+ if a.Key == "" || a.Key[0] != 'x' {
+ continue
+ }
+ switch a.Key {
+ case "xlink:actuate", "xlink:arcrole", "xlink:href", "xlink:role", "xlink:show",
+ "xlink:title", "xlink:type", "xml:base", "xml:lang", "xml:space", "xmlns:xlink":
+ j := strings.Index(a.Key, ":")
+ aa[i].Namespace = a.Key[:j]
+ aa[i].Key = a.Key[j+1:]
+ }
+ }
+}
+
+func htmlIntegrationPoint(n *Node) bool {
+ if n.Type != ElementNode {
+ return false
+ }
+ switch n.Namespace {
+ case "math":
+ if n.Data == "annotation-xml" {
+ for _, a := range n.Attr {
+ if a.Key == "encoding" {
+ val := strings.ToLower(a.Val)
+ if val == "text/html" || val == "application/xhtml+xml" {
+ return true
+ }
+ }
+ }
+ }
+ case "svg":
+ switch n.Data {
+ case "desc", "foreignObject", "title":
+ return true
+ }
+ }
+ return false
+}
+
+func mathMLTextIntegrationPoint(n *Node) bool {
+ if n.Namespace != "math" {
+ return false
+ }
+ switch n.Data {
+ case "mi", "mo", "mn", "ms", "mtext":
+ return true
+ }
+ return false
+}
+
+// Section 12.2.6.5.
+var breakout = map[string]bool{
+ "b": true,
+ "big": true,
+ "blockquote": true,
+ "body": true,
+ "br": true,
+ "center": true,
+ "code": true,
+ "dd": true,
+ "div": true,
+ "dl": true,
+ "dt": true,
+ "em": true,
+ "embed": true,
+ "h1": true,
+ "h2": true,
+ "h3": true,
+ "h4": true,
+ "h5": true,
+ "h6": true,
+ "head": true,
+ "hr": true,
+ "i": true,
+ "img": true,
+ "li": true,
+ "listing": true,
+ "menu": true,
+ "meta": true,
+ "nobr": true,
+ "ol": true,
+ "p": true,
+ "pre": true,
+ "ruby": true,
+ "s": true,
+ "small": true,
+ "span": true,
+ "strong": true,
+ "strike": true,
+ "sub": true,
+ "sup": true,
+ "table": true,
+ "tt": true,
+ "u": true,
+ "ul": true,
+ "var": true,
+}
+
+// Section 12.2.6.5.
+var svgTagNameAdjustments = map[string]string{
+ "altglyph": "altGlyph",
+ "altglyphdef": "altGlyphDef",
+ "altglyphitem": "altGlyphItem",
+ "animatecolor": "animateColor",
+ "animatemotion": "animateMotion",
+ "animatetransform": "animateTransform",
+ "clippath": "clipPath",
+ "feblend": "feBlend",
+ "fecolormatrix": "feColorMatrix",
+ "fecomponenttransfer": "feComponentTransfer",
+ "fecomposite": "feComposite",
+ "feconvolvematrix": "feConvolveMatrix",
+ "fediffuselighting": "feDiffuseLighting",
+ "fedisplacementmap": "feDisplacementMap",
+ "fedistantlight": "feDistantLight",
+ "feflood": "feFlood",
+ "fefunca": "feFuncA",
+ "fefuncb": "feFuncB",
+ "fefuncg": "feFuncG",
+ "fefuncr": "feFuncR",
+ "fegaussianblur": "feGaussianBlur",
+ "feimage": "feImage",
+ "femerge": "feMerge",
+ "femergenode": "feMergeNode",
+ "femorphology": "feMorphology",
+ "feoffset": "feOffset",
+ "fepointlight": "fePointLight",
+ "fespecularlighting": "feSpecularLighting",
+ "fespotlight": "feSpotLight",
+ "fetile": "feTile",
+ "feturbulence": "feTurbulence",
+ "foreignobject": "foreignObject",
+ "glyphref": "glyphRef",
+ "lineargradient": "linearGradient",
+ "radialgradient": "radialGradient",
+ "textpath": "textPath",
+}
+
+// Section 12.2.6.1
+var mathMLAttributeAdjustments = map[string]string{
+ "definitionurl": "definitionURL",
+}
+
+var svgAttributeAdjustments = map[string]string{
+ "attributename": "attributeName",
+ "attributetype": "attributeType",
+ "basefrequency": "baseFrequency",
+ "baseprofile": "baseProfile",
+ "calcmode": "calcMode",
+ "clippathunits": "clipPathUnits",
+ "diffuseconstant": "diffuseConstant",
+ "edgemode": "edgeMode",
+ "filterunits": "filterUnits",
+ "glyphref": "glyphRef",
+ "gradienttransform": "gradientTransform",
+ "gradientunits": "gradientUnits",
+ "kernelmatrix": "kernelMatrix",
+ "kernelunitlength": "kernelUnitLength",
+ "keypoints": "keyPoints",
+ "keysplines": "keySplines",
+ "keytimes": "keyTimes",
+ "lengthadjust": "lengthAdjust",
+ "limitingconeangle": "limitingConeAngle",
+ "markerheight": "markerHeight",
+ "markerunits": "markerUnits",
+ "markerwidth": "markerWidth",
+ "maskcontentunits": "maskContentUnits",
+ "maskunits": "maskUnits",
+ "numoctaves": "numOctaves",
+ "pathlength": "pathLength",
+ "patterncontentunits": "patternContentUnits",
+ "patterntransform": "patternTransform",
+ "patternunits": "patternUnits",
+ "pointsatx": "pointsAtX",
+ "pointsaty": "pointsAtY",
+ "pointsatz": "pointsAtZ",
+ "preservealpha": "preserveAlpha",
+ "preserveaspectratio": "preserveAspectRatio",
+ "primitiveunits": "primitiveUnits",
+ "refx": "refX",
+ "refy": "refY",
+ "repeatcount": "repeatCount",
+ "repeatdur": "repeatDur",
+ "requiredextensions": "requiredExtensions",
+ "requiredfeatures": "requiredFeatures",
+ "specularconstant": "specularConstant",
+ "specularexponent": "specularExponent",
+ "spreadmethod": "spreadMethod",
+ "startoffset": "startOffset",
+ "stddeviation": "stdDeviation",
+ "stitchtiles": "stitchTiles",
+ "surfacescale": "surfaceScale",
+ "systemlanguage": "systemLanguage",
+ "tablevalues": "tableValues",
+ "targetx": "targetX",
+ "targety": "targetY",
+ "textlength": "textLength",
+ "viewbox": "viewBox",
+ "viewtarget": "viewTarget",
+ "xchannelselector": "xChannelSelector",
+ "ychannelselector": "yChannelSelector",
+ "zoomandpan": "zoomAndPan",
+}
diff --git a/vendor/golang.org/x/net/html/node.go b/vendor/golang.org/x/net/html/node.go
new file mode 100644
index 0000000..1350eef
--- /dev/null
+++ b/vendor/golang.org/x/net/html/node.go
@@ -0,0 +1,225 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package html
+
+import (
+ "golang.org/x/net/html/atom"
+)
+
+// A NodeType is the type of a Node.
+type NodeType uint32
+
+const (
+ ErrorNode NodeType = iota
+ TextNode
+ DocumentNode
+ ElementNode
+ CommentNode
+ DoctypeNode
+ // RawNode nodes are not returned by the parser, but can be part of the
+ // Node tree passed to func Render to insert raw HTML (without escaping).
+ // If so, this package makes no guarantee that the rendered HTML is secure
+ // (from e.g. Cross Site Scripting attacks) or well-formed.
+ RawNode
+ scopeMarkerNode
+)
+
+// Section 12.2.4.3 says "The markers are inserted when entering applet,
+// object, marquee, template, td, th, and caption elements, and are used
+// to prevent formatting from "leaking" into applet, object, marquee,
+// template, td, th, and caption elements".
+var scopeMarker = Node{Type: scopeMarkerNode}
+
+// A Node consists of a NodeType and some Data (tag name for element nodes,
+// content for text) and are part of a tree of Nodes. Element nodes may also
+// have a Namespace and contain a slice of Attributes. Data is unescaped, so
+// that it looks like "a<b" rather than "a&lt;b". For element nodes, DataAtom
+// is the atom for Data, or zero if Data is not a known tag name.
+//
+// An empty Namespace implies a "http://www.w3.org/1999/xhtml" namespace.
+// Similarly, "math" is short for "http://www.w3.org/1998/Math/MathML", and
+// "svg" is short for "http://www.w3.org/2000/svg".
+type Node struct {
+ Parent, FirstChild, LastChild, PrevSibling, NextSibling *Node
+
+ Type NodeType
+ DataAtom atom.Atom
+ Data string
+ Namespace string
+ Attr []Attribute
+}
+
+// InsertBefore inserts newChild as a child of n, immediately before oldChild
+// in the sequence of n's children. oldChild may be nil, in which case newChild
+// is appended to the end of n's children.
+//
+// It will panic if newChild already has a parent or siblings.
+func (n *Node) InsertBefore(newChild, oldChild *Node) {
+ if newChild.Parent != nil || newChild.PrevSibling != nil || newChild.NextSibling != nil {
+ panic("html: InsertBefore called for an attached child Node")
+ }
+ var prev, next *Node
+ if oldChild != nil {
+ prev, next = oldChild.PrevSibling, oldChild
+ } else {
+ prev = n.LastChild
+ }
+ if prev != nil {
+ prev.NextSibling = newChild
+ } else {
+ n.FirstChild = newChild
+ }
+ if next != nil {
+ next.PrevSibling = newChild
+ } else {
+ n.LastChild = newChild
+ }
+ newChild.Parent = n
+ newChild.PrevSibling = prev
+ newChild.NextSibling = next
+}
+
+// AppendChild adds a node c as a child of n.
+//
+// It will panic if c already has a parent or siblings.
+func (n *Node) AppendChild(c *Node) {
+ if c.Parent != nil || c.PrevSibling != nil || c.NextSibling != nil {
+ panic("html: AppendChild called for an attached child Node")
+ }
+ last := n.LastChild
+ if last != nil {
+ last.NextSibling = c
+ } else {
+ n.FirstChild = c
+ }
+ n.LastChild = c
+ c.Parent = n
+ c.PrevSibling = last
+}
+
+// RemoveChild removes a node c that is a child of n. Afterwards, c will have
+// no parent and no siblings.
+//
+// It will panic if c's parent is not n.
+func (n *Node) RemoveChild(c *Node) {
+ if c.Parent != n {
+ panic("html: RemoveChild called for a non-child Node")
+ }
+ if n.FirstChild == c {
+ n.FirstChild = c.NextSibling
+ }
+ if c.NextSibling != nil {
+ c.NextSibling.PrevSibling = c.PrevSibling
+ }
+ if n.LastChild == c {
+ n.LastChild = c.PrevSibling
+ }
+ if c.PrevSibling != nil {
+ c.PrevSibling.NextSibling = c.NextSibling
+ }
+ c.Parent = nil
+ c.PrevSibling = nil
+ c.NextSibling = nil
+}
+
+// reparentChildren reparents all of src's child nodes to dst.
+func reparentChildren(dst, src *Node) {
+ for {
+ child := src.FirstChild
+ if child == nil {
+ break
+ }
+ src.RemoveChild(child)
+ dst.AppendChild(child)
+ }
+}
+
+// clone returns a new node with the same type, data and attributes.
+// The clone has no parent, no siblings and no children.
+func (n *Node) clone() *Node {
+ m := &Node{
+ Type: n.Type,
+ DataAtom: n.DataAtom,
+ Data: n.Data,
+ Attr: make([]Attribute, len(n.Attr)),
+ }
+ copy(m.Attr, n.Attr)
+ return m
+}
+
+// nodeStack is a stack of nodes.
+type nodeStack []*Node
+
+// pop pops the stack. It will panic if s is empty.
+func (s *nodeStack) pop() *Node {
+ i := len(*s)
+ n := (*s)[i-1]
+ *s = (*s)[:i-1]
+ return n
+}
+
+// top returns the most recently pushed node, or nil if s is empty.
+func (s *nodeStack) top() *Node {
+ if i := len(*s); i > 0 {
+ return (*s)[i-1]
+ }
+ return nil
+}
+
+// index returns the index of the top-most occurrence of n in the stack, or -1
+// if n is not present.
+func (s *nodeStack) index(n *Node) int {
+ for i := len(*s) - 1; i >= 0; i-- {
+ if (*s)[i] == n {
+ return i
+ }
+ }
+ return -1
+}
+
+// contains returns whether a is within s.
+func (s *nodeStack) contains(a atom.Atom) bool {
+ for _, n := range *s {
+ if n.DataAtom == a && n.Namespace == "" {
+ return true
+ }
+ }
+ return false
+}
+
+// insert inserts a node at the given index.
+func (s *nodeStack) insert(i int, n *Node) {
+ (*s) = append(*s, nil)
+ copy((*s)[i+1:], (*s)[i:])
+ (*s)[i] = n
+}
+
+// remove removes a node from the stack. It is a no-op if n is not present.
+func (s *nodeStack) remove(n *Node) {
+ i := s.index(n)
+ if i == -1 {
+ return
+ }
+ copy((*s)[i:], (*s)[i+1:])
+ j := len(*s) - 1
+ (*s)[j] = nil
+ *s = (*s)[:j]
+}
+
+type insertionModeStack []insertionMode
+
+func (s *insertionModeStack) pop() (im insertionMode) {
+ i := len(*s)
+ im = (*s)[i-1]
+ *s = (*s)[:i-1]
+ return im
+}
+
+func (s *insertionModeStack) top() insertionMode {
+ if i := len(*s); i > 0 {
+ return (*s)[i-1]
+ }
+ return nil
+}
diff --git a/vendor/golang.org/x/net/html/parse.go b/vendor/golang.org/x/net/html/parse.go
new file mode 100644
index 0000000..f91466f
--- /dev/null
+++ b/vendor/golang.org/x/net/html/parse.go
@@ -0,0 +1,2438 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package html
+
+import (
+ "errors"
+ "fmt"
+ "io"
+ "strings"
+
+ a "golang.org/x/net/html/atom"
+)
+
+// A parser implements the HTML5 parsing algorithm:
+// https://html.spec.whatwg.org/multipage/syntax.html#tree-construction
+type parser struct {
+ // tokenizer provides the tokens for the parser.
+ tokenizer *Tokenizer
+ // tok is the most recently read token.
+ tok Token
+ // Self-closing tags like <hr/> are treated as start tags, except that
+ // hasSelfClosingToken is set while they are being processed.
+ hasSelfClosingToken bool
+ // doc is the document root element.
+ doc *Node
+ // The stack of open elements (section 12.2.4.2) and active formatting
+ // elements (section 12.2.4.3).
+ oe, afe nodeStack
+ // Element pointers (section 12.2.4.4).
+ head, form *Node
+ // Other parsing state flags (section 12.2.4.5).
+ scripting, framesetOK bool
+ // The stack of template insertion modes
+ templateStack insertionModeStack
+ // im is the current insertion mode.
+ im insertionMode
+ // originalIM is the insertion mode to go back to after completing a text
+ // or inTableText insertion mode.
+ originalIM insertionMode
+ // fosterParenting is whether new elements should be inserted according to
+ // the foster parenting rules (section 12.2.6.1).
+ fosterParenting bool
+ // quirks is whether the parser is operating in "quirks mode."
+ quirks bool
+ // fragment is whether the parser is parsing an HTML fragment.
+ fragment bool
+ // context is the context element when parsing an HTML fragment
+ // (section 12.4).
+ context *Node
+}
+
+func (p *parser) top() *Node {
+ if n := p.oe.top(); n != nil {
+ return n
+ }
+ return p.doc
+}
+
+// Stop tags for use in popUntil. These come from section 12.2.4.2.
+var (
+ defaultScopeStopTags = map[string][]a.Atom{
+ "": {a.Applet, a.Caption, a.Html, a.Table, a.Td, a.Th, a.Marquee, a.Object, a.Template},
+ "math": {a.AnnotationXml, a.Mi, a.Mn, a.Mo, a.Ms, a.Mtext},
+ "svg": {a.Desc, a.ForeignObject, a.Title},
+ }
+)
+
+type scope int
+
+const (
+ defaultScope scope = iota
+ listItemScope
+ buttonScope
+ tableScope
+ tableRowScope
+ tableBodyScope
+ selectScope
+)
+
+// popUntil pops the stack of open elements at the highest element whose tag
+// is in matchTags, provided there is no higher element in the scope's stop
+// tags (as defined in section 12.2.4.2). It returns whether or not there was
+// such an element. If there was not, popUntil leaves the stack unchanged.
+//
+// For example, the set of stop tags for table scope is: "html", "table". If
+// the stack was:
+// ["html", "body", "font", "table", "b", "i", "u"]
+// then popUntil(tableScope, "font") would return false, but
+// popUntil(tableScope, "i") would return true and the stack would become:
+// ["html", "body", "font", "table", "b"]
+//
+// If an element's tag is in both the stop tags and matchTags, then the stack
+// will be popped and the function returns true (provided, of course, there was
+// no higher element in the stack that was also in the stop tags). For example,
+// popUntil(tableScope, "table") returns true and leaves:
+// ["html", "body", "font"]
+func (p *parser) popUntil(s scope, matchTags ...a.Atom) bool {
+ if i := p.indexOfElementInScope(s, matchTags...); i != -1 {
+ p.oe = p.oe[:i]
+ return true
+ }
+ return false
+}
+
+// indexOfElementInScope returns the index in p.oe of the highest element whose
+// tag is in matchTags that is in scope. If no matching element is in scope, it
+// returns -1.
+func (p *parser) indexOfElementInScope(s scope, matchTags ...a.Atom) int {
+ for i := len(p.oe) - 1; i >= 0; i-- {
+ tagAtom := p.oe[i].DataAtom
+ if p.oe[i].Namespace == "" {
+ for _, t := range matchTags {
+ if t == tagAtom {
+ return i
+ }
+ }
+ switch s {
+ case defaultScope:
+ // No-op.
+ case listItemScope:
+ if tagAtom == a.Ol || tagAtom == a.Ul {
+ return -1
+ }
+ case buttonScope:
+ if tagAtom == a.Button {
+ return -1
+ }
+ case tableScope:
+ if tagAtom == a.Html || tagAtom == a.Table || tagAtom == a.Template {
+ return -1
+ }
+ case selectScope:
+ if tagAtom != a.Optgroup && tagAtom != a.Option {
+ return -1
+ }
+ default:
+ panic("unreachable")
+ }
+ }
+ switch s {
+ case defaultScope, listItemScope, buttonScope:
+ for _, t := range defaultScopeStopTags[p.oe[i].Namespace] {
+ if t == tagAtom {
+ return -1
+ }
+ }
+ }
+ }
+ return -1
+}
+
+// elementInScope is like popUntil, except that it doesn't modify the stack of
+// open elements.
+func (p *parser) elementInScope(s scope, matchTags ...a.Atom) bool {
+ return p.indexOfElementInScope(s, matchTags...) != -1
+}
+
+// clearStackToContext pops elements off the stack of open elements until a
+// scope-defined element is found.
+func (p *parser) clearStackToContext(s scope) {
+ for i := len(p.oe) - 1; i >= 0; i-- {
+ tagAtom := p.oe[i].DataAtom
+ switch s {
+ case tableScope:
+ if tagAtom == a.Html || tagAtom == a.Table || tagAtom == a.Template {
+ p.oe = p.oe[:i+1]
+ return
+ }
+ case tableRowScope:
+ if tagAtom == a.Html || tagAtom == a.Tr || tagAtom == a.Template {
+ p.oe = p.oe[:i+1]
+ return
+ }
+ case tableBodyScope:
+ if tagAtom == a.Html || tagAtom == a.Tbody || tagAtom == a.Tfoot || tagAtom == a.Thead || tagAtom == a.Template {
+ p.oe = p.oe[:i+1]
+ return
+ }
+ default:
+ panic("unreachable")
+ }
+ }
+}
+
+// parseGenericRawTextElements implements the generic raw text element parsing
+// algorithm defined in 12.2.6.2.
+// https://html.spec.whatwg.org/multipage/parsing.html#parsing-elements-that-contain-only-text
+// TODO: Since both RAWTEXT and RCDATA states are treated as tokenizer's part
+// officially, need to make tokenizer consider both states.
+func (p *parser) parseGenericRawTextElement() {
+ p.addElement()
+ p.originalIM = p.im
+ p.im = textIM
+}
+
+// generateImpliedEndTags pops nodes off the stack of open elements as long as
+// the top node has a tag name of dd, dt, li, optgroup, option, p, rb, rp, rt or rtc.
+// If exceptions are specified, nodes with that name will not be popped off.
+func (p *parser) generateImpliedEndTags(exceptions ...string) {
+ var i int
+loop:
+ for i = len(p.oe) - 1; i >= 0; i-- {
+ n := p.oe[i]
+ if n.Type != ElementNode {
+ break
+ }
+ switch n.DataAtom {
+ case a.Dd, a.Dt, a.Li, a.Optgroup, a.Option, a.P, a.Rb, a.Rp, a.Rt, a.Rtc:
+ for _, except := range exceptions {
+ if n.Data == except {
+ break loop
+ }
+ }
+ continue
+ }
+ break
+ }
+
+ p.oe = p.oe[:i+1]
+}
+
+// addChild adds a child node n to the top element, and pushes n onto the stack
+// of open elements if it is an element node.
+func (p *parser) addChild(n *Node) {
+ if p.shouldFosterParent() {
+ p.fosterParent(n)
+ } else {
+ p.top().AppendChild(n)
+ }
+
+ if n.Type == ElementNode {
+ p.oe = append(p.oe, n)
+ }
+}
+
+// shouldFosterParent returns whether the next node to be added should be
+// foster parented.
+func (p *parser) shouldFosterParent() bool {
+ if p.fosterParenting {
+ switch p.top().DataAtom {
+ case a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr:
+ return true
+ }
+ }
+ return false
+}
+
+// fosterParent adds a child node according to the foster parenting rules.
+// Section 12.2.6.1, "foster parenting".
+func (p *parser) fosterParent(n *Node) {
+ var table, parent, prev, template *Node
+ var i int
+ for i = len(p.oe) - 1; i >= 0; i-- {
+ if p.oe[i].DataAtom == a.Table {
+ table = p.oe[i]
+ break
+ }
+ }
+
+ var j int
+ for j = len(p.oe) - 1; j >= 0; j-- {
+ if p.oe[j].DataAtom == a.Template {
+ template = p.oe[j]
+ break
+ }
+ }
+
+ if template != nil && (table == nil || j > i) {
+ template.AppendChild(n)
+ return
+ }
+
+ if table == nil {
+ // The foster parent is the html element.
+ parent = p.oe[0]
+ } else {
+ parent = table.Parent
+ }
+ if parent == nil {
+ parent = p.oe[i-1]
+ }
+
+ if table != nil {
+ prev = table.PrevSibling
+ } else {
+ prev = parent.LastChild
+ }
+ if prev != nil && prev.Type == TextNode && n.Type == TextNode {
+ prev.Data += n.Data
+ return
+ }
+
+ parent.InsertBefore(n, table)
+}
+
+// addText adds text to the preceding node if it is a text node, or else it
+// calls addChild with a new text node.
+func (p *parser) addText(text string) {
+ if text == "" {
+ return
+ }
+
+ if p.shouldFosterParent() {
+ p.fosterParent(&Node{
+ Type: TextNode,
+ Data: text,
+ })
+ return
+ }
+
+ t := p.top()
+ if n := t.LastChild; n != nil && n.Type == TextNode {
+ n.Data += text
+ return
+ }
+ p.addChild(&Node{
+ Type: TextNode,
+ Data: text,
+ })
+}
+
+// addElement adds a child element based on the current token.
+func (p *parser) addElement() {
+ p.addChild(&Node{
+ Type: ElementNode,
+ DataAtom: p.tok.DataAtom,
+ Data: p.tok.Data,
+ Attr: p.tok.Attr,
+ })
+}
+
+// Section 12.2.4.3.
+func (p *parser) addFormattingElement() {
+ tagAtom, attr := p.tok.DataAtom, p.tok.Attr
+ p.addElement()
+
+ // Implement the Noah's Ark clause, but with three per family instead of two.
+ identicalElements := 0
+findIdenticalElements:
+ for i := len(p.afe) - 1; i >= 0; i-- {
+ n := p.afe[i]
+ if n.Type == scopeMarkerNode {
+ break
+ }
+ if n.Type != ElementNode {
+ continue
+ }
+ if n.Namespace != "" {
+ continue
+ }
+ if n.DataAtom != tagAtom {
+ continue
+ }
+ if len(n.Attr) != len(attr) {
+ continue
+ }
+ compareAttributes:
+ for _, t0 := range n.Attr {
+ for _, t1 := range attr {
+ if t0.Key == t1.Key && t0.Namespace == t1.Namespace && t0.Val == t1.Val {
+ // Found a match for this attribute, continue with the next attribute.
+ continue compareAttributes
+ }
+ }
+ // If we get here, there is no attribute that matches a.
+ // Therefore the element is not identical to the new one.
+ continue findIdenticalElements
+ }
+
+ identicalElements++
+ if identicalElements >= 3 {
+ p.afe.remove(n)
+ }
+ }
+
+ p.afe = append(p.afe, p.top())
+}
+
+// Section 12.2.4.3.
+func (p *parser) clearActiveFormattingElements() {
+ for {
+ if n := p.afe.pop(); len(p.afe) == 0 || n.Type == scopeMarkerNode {
+ return
+ }
+ }
+}
+
+// Section 12.2.4.3.
+func (p *parser) reconstructActiveFormattingElements() {
+ n := p.afe.top()
+ if n == nil {
+ return
+ }
+ if n.Type == scopeMarkerNode || p.oe.index(n) != -1 {
+ return
+ }
+ i := len(p.afe) - 1
+ for n.Type != scopeMarkerNode && p.oe.index(n) == -1 {
+ if i == 0 {
+ i = -1
+ break
+ }
+ i--
+ n = p.afe[i]
+ }
+ for {
+ i++
+ clone := p.afe[i].clone()
+ p.addChild(clone)
+ p.afe[i] = clone
+ if i == len(p.afe)-1 {
+ break
+ }
+ }
+}
+
+// Section 12.2.5.
+func (p *parser) acknowledgeSelfClosingTag() {
+ p.hasSelfClosingToken = false
+}
+
+// An insertion mode (section 12.2.4.1) is the state transition function from
+// a particular state in the HTML5 parser's state machine. It updates the
+// parser's fields depending on parser.tok (where ErrorToken means EOF).
+// It returns whether the token was consumed.
+type insertionMode func(*parser) bool
+
+// setOriginalIM sets the insertion mode to return to after completing a text or
+// inTableText insertion mode.
+// Section 12.2.4.1, "using the rules for".
+func (p *parser) setOriginalIM() {
+ if p.originalIM != nil {
+ panic("html: bad parser state: originalIM was set twice")
+ }
+ p.originalIM = p.im
+}
+
+// Section 12.2.4.1, "reset the insertion mode".
+func (p *parser) resetInsertionMode() {
+ for i := len(p.oe) - 1; i >= 0; i-- {
+ n := p.oe[i]
+ last := i == 0
+ if last && p.context != nil {
+ n = p.context
+ }
+
+ switch n.DataAtom {
+ case a.Select:
+ if !last {
+ for ancestor, first := n, p.oe[0]; ancestor != first; {
+ ancestor = p.oe[p.oe.index(ancestor)-1]
+ switch ancestor.DataAtom {
+ case a.Template:
+ p.im = inSelectIM
+ return
+ case a.Table:
+ p.im = inSelectInTableIM
+ return
+ }
+ }
+ }
+ p.im = inSelectIM
+ case a.Td, a.Th:
+ // TODO: remove this divergence from the HTML5 spec.
+ //
+ // See https://bugs.chromium.org/p/chromium/issues/detail?id=829668
+ p.im = inCellIM
+ case a.Tr:
+ p.im = inRowIM
+ case a.Tbody, a.Thead, a.Tfoot:
+ p.im = inTableBodyIM
+ case a.Caption:
+ p.im = inCaptionIM
+ case a.Colgroup:
+ p.im = inColumnGroupIM
+ case a.Table:
+ p.im = inTableIM
+ case a.Template:
+ // TODO: remove this divergence from the HTML5 spec.
+ if n.Namespace != "" {
+ continue
+ }
+ p.im = p.templateStack.top()
+ case a.Head:
+ // TODO: remove this divergence from the HTML5 spec.
+ //
+ // See https://bugs.chromium.org/p/chromium/issues/detail?id=829668
+ p.im = inHeadIM
+ case a.Body:
+ p.im = inBodyIM
+ case a.Frameset:
+ p.im = inFramesetIM
+ case a.Html:
+ if p.head == nil {
+ p.im = beforeHeadIM
+ } else {
+ p.im = afterHeadIM
+ }
+ default:
+ if last {
+ p.im = inBodyIM
+ return
+ }
+ continue
+ }
+ return
+ }
+}
+
+const whitespace = " \t\r\n\f"
+
+// Section 12.2.6.4.1.
+func initialIM(p *parser) bool {
+ switch p.tok.Type {
+ case TextToken:
+ p.tok.Data = strings.TrimLeft(p.tok.Data, whitespace)
+ if len(p.tok.Data) == 0 {
+ // It was all whitespace, so ignore it.
+ return true
+ }
+ case CommentToken:
+ p.doc.AppendChild(&Node{
+ Type: CommentNode,
+ Data: p.tok.Data,
+ })
+ return true
+ case DoctypeToken:
+ n, quirks := parseDoctype(p.tok.Data)
+ p.doc.AppendChild(n)
+ p.quirks = quirks
+ p.im = beforeHTMLIM
+ return true
+ }
+ p.quirks = true
+ p.im = beforeHTMLIM
+ return false
+}
+
+// Section 12.2.6.4.2.
+func beforeHTMLIM(p *parser) bool {
+ switch p.tok.Type {
+ case DoctypeToken:
+ // Ignore the token.
+ return true
+ case TextToken:
+ p.tok.Data = strings.TrimLeft(p.tok.Data, whitespace)
+ if len(p.tok.Data) == 0 {
+ // It was all whitespace, so ignore it.
+ return true
+ }
+ case StartTagToken:
+ if p.tok.DataAtom == a.Html {
+ p.addElement()
+ p.im = beforeHeadIM
+ return true
+ }
+ case EndTagToken:
+ switch p.tok.DataAtom {
+ case a.Head, a.Body, a.Html, a.Br:
+ p.parseImpliedToken(StartTagToken, a.Html, a.Html.String())
+ return false
+ default:
+ // Ignore the token.
+ return true
+ }
+ case CommentToken:
+ p.doc.AppendChild(&Node{
+ Type: CommentNode,
+ Data: p.tok.Data,
+ })
+ return true
+ }
+ p.parseImpliedToken(StartTagToken, a.Html, a.Html.String())
+ return false
+}
+
+// Section 12.2.6.4.3.
+func beforeHeadIM(p *parser) bool {
+ switch p.tok.Type {
+ case TextToken:
+ p.tok.Data = strings.TrimLeft(p.tok.Data, whitespace)
+ if len(p.tok.Data) == 0 {
+ // It was all whitespace, so ignore it.
+ return true
+ }
+ case StartTagToken:
+ switch p.tok.DataAtom {
+ case a.Head:
+ p.addElement()
+ p.head = p.top()
+ p.im = inHeadIM
+ return true
+ case a.Html:
+ return inBodyIM(p)
+ }
+ case EndTagToken:
+ switch p.tok.DataAtom {
+ case a.Head, a.Body, a.Html, a.Br:
+ p.parseImpliedToken(StartTagToken, a.Head, a.Head.String())
+ return false
+ default:
+ // Ignore the token.
+ return true
+ }
+ case CommentToken:
+ p.addChild(&Node{
+ Type: CommentNode,
+ Data: p.tok.Data,
+ })
+ return true
+ case DoctypeToken:
+ // Ignore the token.
+ return true
+ }
+
+ p.parseImpliedToken(StartTagToken, a.Head, a.Head.String())
+ return false
+}
+
+// Section 12.2.6.4.4.
+func inHeadIM(p *parser) bool {
+ switch p.tok.Type {
+ case TextToken:
+ s := strings.TrimLeft(p.tok.Data, whitespace)
+ if len(s) < len(p.tok.Data) {
+ // Add the initial whitespace to the current node.
+ p.addText(p.tok.Data[:len(p.tok.Data)-len(s)])
+ if s == "" {
+ return true
+ }
+ p.tok.Data = s
+ }
+ case StartTagToken:
+ switch p.tok.DataAtom {
+ case a.Html:
+ return inBodyIM(p)
+ case a.Base, a.Basefont, a.Bgsound, a.Link, a.Meta:
+ p.addElement()
+ p.oe.pop()
+ p.acknowledgeSelfClosingTag()
+ return true
+ case a.Noscript:
+ if p.scripting {
+ p.parseGenericRawTextElement()
+ return true
+ }
+ p.addElement()
+ p.im = inHeadNoscriptIM
+ // Don't let the tokenizer go into raw text mode when scripting is disabled.
+ p.tokenizer.NextIsNotRawText()
+ return true
+ case a.Script, a.Title:
+ p.addElement()
+ p.setOriginalIM()
+ p.im = textIM
+ return true
+ case a.Noframes, a.Style:
+ p.parseGenericRawTextElement()
+ return true
+ case a.Head:
+ // Ignore the token.
+ return true
+ case a.Template:
+ p.addElement()
+ p.afe = append(p.afe, &scopeMarker)
+ p.framesetOK = false
+ p.im = inTemplateIM
+ p.templateStack = append(p.templateStack, inTemplateIM)
+ return true
+ }
+ case EndTagToken:
+ switch p.tok.DataAtom {
+ case a.Head:
+ p.oe.pop()
+ p.im = afterHeadIM
+ return true
+ case a.Body, a.Html, a.Br:
+ p.parseImpliedToken(EndTagToken, a.Head, a.Head.String())
+ return false
+ case a.Template:
+ if !p.oe.contains(a.Template) {
+ return true
+ }
+ // TODO: remove this divergence from the HTML5 spec.
+ //
+ // See https://bugs.chromium.org/p/chromium/issues/detail?id=829668
+ p.generateImpliedEndTags()
+ for i := len(p.oe) - 1; i >= 0; i-- {
+ if n := p.oe[i]; n.Namespace == "" && n.DataAtom == a.Template {
+ p.oe = p.oe[:i]
+ break
+ }
+ }
+ p.clearActiveFormattingElements()
+ p.templateStack.pop()
+ p.resetInsertionMode()
+ return true
+ default:
+ // Ignore the token.
+ return true
+ }
+ case CommentToken:
+ p.addChild(&Node{
+ Type: CommentNode,
+ Data: p.tok.Data,
+ })
+ return true
+ case DoctypeToken:
+ // Ignore the token.
+ return true
+ }
+
+ p.parseImpliedToken(EndTagToken, a.Head, a.Head.String())
+ return false
+}
+
+// 12.2.6.4.5.
+func inHeadNoscriptIM(p *parser) bool {
+ switch p.tok.Type {
+ case DoctypeToken:
+ // Ignore the token.
+ return true
+ case StartTagToken:
+ switch p.tok.DataAtom {
+ case a.Html:
+ return inBodyIM(p)
+ case a.Basefont, a.Bgsound, a.Link, a.Meta, a.Noframes, a.Style:
+ return inHeadIM(p)
+ case a.Head:
+ // Ignore the token.
+ return true
+ case a.Noscript:
+ // Don't let the tokenizer go into raw text mode even when a <noscript>
+ // tag is in "in head noscript" insertion mode.
+ p.tokenizer.NextIsNotRawText()
+ // Ignore the token.
+ return true
+ }
+ case EndTagToken:
+ switch p.tok.DataAtom {
+ case a.Noscript, a.Br:
+ default:
+ // Ignore the token.
+ return true
+ }
+ case TextToken:
+ s := strings.TrimLeft(p.tok.Data, whitespace)
+ if len(s) == 0 {
+ // It was all whitespace.
+ return inHeadIM(p)
+ }
+ case CommentToken:
+ return inHeadIM(p)
+ }
+ p.oe.pop()
+ if p.top().DataAtom != a.Head {
+ panic("html: the new current node will be a head element.")
+ }
+ p.im = inHeadIM
+ if p.tok.DataAtom == a.Noscript {
+ return true
+ }
+ return false
+}
+
+// Section 12.2.6.4.6.
+func afterHeadIM(p *parser) bool {
+ switch p.tok.Type {
+ case TextToken:
+ s := strings.TrimLeft(p.tok.Data, whitespace)
+ if len(s) < len(p.tok.Data) {
+ // Add the initial whitespace to the current node.
+ p.addText(p.tok.Data[:len(p.tok.Data)-len(s)])
+ if s == "" {
+ return true
+ }
+ p.tok.Data = s
+ }
+ case StartTagToken:
+ switch p.tok.DataAtom {
+ case a.Html:
+ return inBodyIM(p)
+ case a.Body:
+ p.addElement()
+ p.framesetOK = false
+ p.im = inBodyIM
+ return true
+ case a.Frameset:
+ p.addElement()
+ p.im = inFramesetIM
+ return true
+ case a.Base, a.Basefont, a.Bgsound, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Template, a.Title:
+ p.oe = append(p.oe, p.head)
+ defer p.oe.remove(p.head)
+ return inHeadIM(p)
+ case a.Head:
+ // Ignore the token.
+ return true
+ }
+ case EndTagToken:
+ switch p.tok.DataAtom {
+ case a.Body, a.Html, a.Br:
+ // Drop down to creating an implied <body> tag.
+ case a.Template:
+ return inHeadIM(p)
+ default:
+ // Ignore the token.
+ return true
+ }
+ case CommentToken:
+ p.addChild(&Node{
+ Type: CommentNode,
+ Data: p.tok.Data,
+ })
+ return true
+ case DoctypeToken:
+ // Ignore the token.
+ return true
+ }
+
+ p.parseImpliedToken(StartTagToken, a.Body, a.Body.String())
+ p.framesetOK = true
+ return false
+}
+
+// copyAttributes copies attributes of src not found on dst to dst.
+func copyAttributes(dst *Node, src Token) {
+ if len(src.Attr) == 0 {
+ return
+ }
+ attr := map[string]string{}
+ for _, t := range dst.Attr {
+ attr[t.Key] = t.Val
+ }
+ for _, t := range src.Attr {
+ if _, ok := attr[t.Key]; !ok {
+ dst.Attr = append(dst.Attr, t)
+ attr[t.Key] = t.Val
+ }
+ }
+}
+
+// Section 12.2.6.4.7.
+func inBodyIM(p *parser) bool {
+ switch p.tok.Type {
+ case TextToken:
+ d := p.tok.Data
+ switch n := p.oe.top(); n.DataAtom {
+ case a.Pre, a.Listing:
+ if n.FirstChild == nil {
+ // Ignore a newline at the start of a <pre> block.
+ if d != "" && d[0] == '\r' {
+ d = d[1:]
+ }
+ if d != "" && d[0] == '\n' {
+ d = d[1:]
+ }
+ }
+ }
+ d = strings.Replace(d, "\x00", "", -1)
+ if d == "" {
+ return true
+ }
+ p.reconstructActiveFormattingElements()
+ p.addText(d)
+ if p.framesetOK && strings.TrimLeft(d, whitespace) != "" {
+ // There were non-whitespace characters inserted.
+ p.framesetOK = false
+ }
+ case StartTagToken:
+ switch p.tok.DataAtom {
+ case a.Html:
+ if p.oe.contains(a.Template) {
+ return true
+ }
+ copyAttributes(p.oe[0], p.tok)
+ case a.Base, a.Basefont, a.Bgsound, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Template, a.Title:
+ return inHeadIM(p)
+ case a.Body:
+ if p.oe.contains(a.Template) {
+ return true
+ }
+ if len(p.oe) >= 2 {
+ body := p.oe[1]
+ if body.Type == ElementNode && body.DataAtom == a.Body {
+ p.framesetOK = false
+ copyAttributes(body, p.tok)
+ }
+ }
+ case a.Frameset:
+ if !p.framesetOK || len(p.oe) < 2 || p.oe[1].DataAtom != a.Body {
+ // Ignore the token.
+ return true
+ }
+ body := p.oe[1]
+ if body.Parent != nil {
+ body.Parent.RemoveChild(body)
+ }
+ p.oe = p.oe[:1]
+ p.addElement()
+ p.im = inFramesetIM
+ return true
+ case a.Address, a.Article, a.Aside, a.Blockquote, a.Center, a.Details, a.Dialog, a.Dir, a.Div, a.Dl, a.Fieldset, a.Figcaption, a.Figure, a.Footer, a.Header, a.Hgroup, a.Main, a.Menu, a.Nav, a.Ol, a.P, a.Section, a.Summary, a.Ul:
+ p.popUntil(buttonScope, a.P)
+ p.addElement()
+ case a.H1, a.H2, a.H3, a.H4, a.H5, a.H6:
+ p.popUntil(buttonScope, a.P)
+ switch n := p.top(); n.DataAtom {
+ case a.H1, a.H2, a.H3, a.H4, a.H5, a.H6:
+ p.oe.pop()
+ }
+ p.addElement()
+ case a.Pre, a.Listing:
+ p.popUntil(buttonScope, a.P)
+ p.addElement()
+ // The newline, if any, will be dealt with by the TextToken case.
+ p.framesetOK = false
+ case a.Form:
+ if p.form != nil && !p.oe.contains(a.Template) {
+ // Ignore the token
+ return true
+ }
+ p.popUntil(buttonScope, a.P)
+ p.addElement()
+ if !p.oe.contains(a.Template) {
+ p.form = p.top()
+ }
+ case a.Li:
+ p.framesetOK = false
+ for i := len(p.oe) - 1; i >= 0; i-- {
+ node := p.oe[i]
+ switch node.DataAtom {
+ case a.Li:
+ p.oe = p.oe[:i]
+ case a.Address, a.Div, a.P:
+ continue
+ default:
+ if !isSpecialElement(node) {
+ continue
+ }
+ }
+ break
+ }
+ p.popUntil(buttonScope, a.P)
+ p.addElement()
+ case a.Dd, a.Dt:
+ p.framesetOK = false
+ for i := len(p.oe) - 1; i >= 0; i-- {
+ node := p.oe[i]
+ switch node.DataAtom {
+ case a.Dd, a.Dt:
+ p.oe = p.oe[:i]
+ case a.Address, a.Div, a.P:
+ continue
+ default:
+ if !isSpecialElement(node) {
+ continue
+ }
+ }
+ break
+ }
+ p.popUntil(buttonScope, a.P)
+ p.addElement()
+ case a.Plaintext:
+ p.popUntil(buttonScope, a.P)
+ p.addElement()
+ case a.Button:
+ p.popUntil(defaultScope, a.Button)
+ p.reconstructActiveFormattingElements()
+ p.addElement()
+ p.framesetOK = false
+ case a.A:
+ for i := len(p.afe) - 1; i >= 0 && p.afe[i].Type != scopeMarkerNode; i-- {
+ if n := p.afe[i]; n.Type == ElementNode && n.DataAtom == a.A {
+ p.inBodyEndTagFormatting(a.A, "a")
+ p.oe.remove(n)
+ p.afe.remove(n)
+ break
+ }
+ }
+ p.reconstructActiveFormattingElements()
+ p.addFormattingElement()
+ case a.B, a.Big, a.Code, a.Em, a.Font, a.I, a.S, a.Small, a.Strike, a.Strong, a.Tt, a.U:
+ p.reconstructActiveFormattingElements()
+ p.addFormattingElement()
+ case a.Nobr:
+ p.reconstructActiveFormattingElements()
+ if p.elementInScope(defaultScope, a.Nobr) {
+ p.inBodyEndTagFormatting(a.Nobr, "nobr")
+ p.reconstructActiveFormattingElements()
+ }
+ p.addFormattingElement()
+ case a.Applet, a.Marquee, a.Object:
+ p.reconstructActiveFormattingElements()
+ p.addElement()
+ p.afe = append(p.afe, &scopeMarker)
+ p.framesetOK = false
+ case a.Table:
+ if !p.quirks {
+ p.popUntil(buttonScope, a.P)
+ }
+ p.addElement()
+ p.framesetOK = false
+ p.im = inTableIM
+ return true
+ case a.Area, a.Br, a.Embed, a.Img, a.Input, a.Keygen, a.Wbr:
+ p.reconstructActiveFormattingElements()
+ p.addElement()
+ p.oe.pop()
+ p.acknowledgeSelfClosingTag()
+ if p.tok.DataAtom == a.Input {
+ for _, t := range p.tok.Attr {
+ if t.Key == "type" {
+ if strings.ToLower(t.Val) == "hidden" {
+ // Skip setting framesetOK = false
+ return true
+ }
+ }
+ }
+ }
+ p.framesetOK = false
+ case a.Param, a.Source, a.Track:
+ p.addElement()
+ p.oe.pop()
+ p.acknowledgeSelfClosingTag()
+ case a.Hr:
+ p.popUntil(buttonScope, a.P)
+ p.addElement()
+ p.oe.pop()
+ p.acknowledgeSelfClosingTag()
+ p.framesetOK = false
+ case a.Image:
+ p.tok.DataAtom = a.Img
+ p.tok.Data = a.Img.String()
+ return false
+ case a.Textarea:
+ p.addElement()
+ p.setOriginalIM()
+ p.framesetOK = false
+ p.im = textIM
+ case a.Xmp:
+ p.popUntil(buttonScope, a.P)
+ p.reconstructActiveFormattingElements()
+ p.framesetOK = false
+ p.parseGenericRawTextElement()
+ case a.Iframe:
+ p.framesetOK = false
+ p.parseGenericRawTextElement()
+ case a.Noembed:
+ p.parseGenericRawTextElement()
+ case a.Noscript:
+ if p.scripting {
+ p.parseGenericRawTextElement()
+ return true
+ }
+ p.reconstructActiveFormattingElements()
+ p.addElement()
+ // Don't let the tokenizer go into raw text mode when scripting is disabled.
+ p.tokenizer.NextIsNotRawText()
+ case a.Select:
+ p.reconstructActiveFormattingElements()
+ p.addElement()
+ p.framesetOK = false
+ p.im = inSelectIM
+ return true
+ case a.Optgroup, a.Option:
+ if p.top().DataAtom == a.Option {
+ p.oe.pop()
+ }
+ p.reconstructActiveFormattingElements()
+ p.addElement()
+ case a.Rb, a.Rtc:
+ if p.elementInScope(defaultScope, a.Ruby) {
+ p.generateImpliedEndTags()
+ }
+ p.addElement()
+ case a.Rp, a.Rt:
+ if p.elementInScope(defaultScope, a.Ruby) {
+ p.generateImpliedEndTags("rtc")
+ }
+ p.addElement()
+ case a.Math, a.Svg:
+ p.reconstructActiveFormattingElements()
+ if p.tok.DataAtom == a.Math {
+ adjustAttributeNames(p.tok.Attr, mathMLAttributeAdjustments)
+ } else {
+ adjustAttributeNames(p.tok.Attr, svgAttributeAdjustments)
+ }
+ adjustForeignAttributes(p.tok.Attr)
+ p.addElement()
+ p.top().Namespace = p.tok.Data
+ if p.hasSelfClosingToken {
+ p.oe.pop()
+ p.acknowledgeSelfClosingTag()
+ }
+ return true
+ case a.Caption, a.Col, a.Colgroup, a.Frame, a.Head, a.Tbody, a.Td, a.Tfoot, a.Th, a.Thead, a.Tr:
+ // Ignore the token.
+ default:
+ p.reconstructActiveFormattingElements()
+ p.addElement()
+ }
+ case EndTagToken:
+ switch p.tok.DataAtom {
+ case a.Body:
+ if p.elementInScope(defaultScope, a.Body) {
+ p.im = afterBodyIM
+ }
+ case a.Html:
+ if p.elementInScope(defaultScope, a.Body) {
+ p.parseImpliedToken(EndTagToken, a.Body, a.Body.String())
+ return false
+ }
+ return true
+ case a.Address, a.Article, a.Aside, a.Blockquote, a.Button, a.Center, a.Details, a.Dialog, a.Dir, a.Div, a.Dl, a.Fieldset, a.Figcaption, a.Figure, a.Footer, a.Header, a.Hgroup, a.Listing, a.Main, a.Menu, a.Nav, a.Ol, a.Pre, a.Section, a.Summary, a.Ul:
+ p.popUntil(defaultScope, p.tok.DataAtom)
+ case a.Form:
+ if p.oe.contains(a.Template) {
+ i := p.indexOfElementInScope(defaultScope, a.Form)
+ if i == -1 {
+ // Ignore the token.
+ return true
+ }
+ p.generateImpliedEndTags()
+ if p.oe[i].DataAtom != a.Form {
+ // Ignore the token.
+ return true
+ }
+ p.popUntil(defaultScope, a.Form)
+ } else {
+ node := p.form
+ p.form = nil
+ i := p.indexOfElementInScope(defaultScope, a.Form)
+ if node == nil || i == -1 || p.oe[i] != node {
+ // Ignore the token.
+ return true
+ }
+ p.generateImpliedEndTags()
+ p.oe.remove(node)
+ }
+ case a.P:
+ if !p.elementInScope(buttonScope, a.P) {
+ p.parseImpliedToken(StartTagToken, a.P, a.P.String())
+ }
+ p.popUntil(buttonScope, a.P)
+ case a.Li:
+ p.popUntil(listItemScope, a.Li)
+ case a.Dd, a.Dt:
+ p.popUntil(defaultScope, p.tok.DataAtom)
+ case a.H1, a.H2, a.H3, a.H4, a.H5, a.H6:
+ p.popUntil(defaultScope, a.H1, a.H2, a.H3, a.H4, a.H5, a.H6)
+ case a.A, a.B, a.Big, a.Code, a.Em, a.Font, a.I, a.Nobr, a.S, a.Small, a.Strike, a.Strong, a.Tt, a.U:
+ p.inBodyEndTagFormatting(p.tok.DataAtom, p.tok.Data)
+ case a.Applet, a.Marquee, a.Object:
+ if p.popUntil(defaultScope, p.tok.DataAtom) {
+ p.clearActiveFormattingElements()
+ }
+ case a.Br:
+ p.tok.Type = StartTagToken
+ return false
+ case a.Template:
+ return inHeadIM(p)
+ default:
+ p.inBodyEndTagOther(p.tok.DataAtom, p.tok.Data)
+ }
+ case CommentToken:
+ p.addChild(&Node{
+ Type: CommentNode,
+ Data: p.tok.Data,
+ })
+ case ErrorToken:
+ // TODO: remove this divergence from the HTML5 spec.
+ if len(p.templateStack) > 0 {
+ p.im = inTemplateIM
+ return false
+ }
+ for _, e := range p.oe {
+ switch e.DataAtom {
+ case a.Dd, a.Dt, a.Li, a.Optgroup, a.Option, a.P, a.Rb, a.Rp, a.Rt, a.Rtc, a.Tbody, a.Td, a.Tfoot, a.Th,
+ a.Thead, a.Tr, a.Body, a.Html:
+ default:
+ return true
+ }
+ }
+ }
+
+ return true
+}
+
+func (p *parser) inBodyEndTagFormatting(tagAtom a.Atom, tagName string) {
+ // This is the "adoption agency" algorithm, described at
+ // https://html.spec.whatwg.org/multipage/syntax.html#adoptionAgency
+
+ // TODO: this is a fairly literal line-by-line translation of that algorithm.
+ // Once the code successfully parses the comprehensive test suite, we should
+ // refactor this code to be more idiomatic.
+
+ // Steps 1-2
+ if current := p.oe.top(); current.Data == tagName && p.afe.index(current) == -1 {
+ p.oe.pop()
+ return
+ }
+
+ // Steps 3-5. The outer loop.
+ for i := 0; i < 8; i++ {
+ // Step 6. Find the formatting element.
+ var formattingElement *Node
+ for j := len(p.afe) - 1; j >= 0; j-- {
+ if p.afe[j].Type == scopeMarkerNode {
+ break
+ }
+ if p.afe[j].DataAtom == tagAtom {
+ formattingElement = p.afe[j]
+ break
+ }
+ }
+ if formattingElement == nil {
+ p.inBodyEndTagOther(tagAtom, tagName)
+ return
+ }
+
+ // Step 7. Ignore the tag if formatting element is not in the stack of open elements.
+ feIndex := p.oe.index(formattingElement)
+ if feIndex == -1 {
+ p.afe.remove(formattingElement)
+ return
+ }
+ // Step 8. Ignore the tag if formatting element is not in the scope.
+ if !p.elementInScope(defaultScope, tagAtom) {
+ // Ignore the tag.
+ return
+ }
+
+ // Step 9. This step is omitted because it's just a parse error but no need to return.
+
+ // Steps 10-11. Find the furthest block.
+ var furthestBlock *Node
+ for _, e := range p.oe[feIndex:] {
+ if isSpecialElement(e) {
+ furthestBlock = e
+ break
+ }
+ }
+ if furthestBlock == nil {
+ e := p.oe.pop()
+ for e != formattingElement {
+ e = p.oe.pop()
+ }
+ p.afe.remove(e)
+ return
+ }
+
+ // Steps 12-13. Find the common ancestor and bookmark node.
+ commonAncestor := p.oe[feIndex-1]
+ bookmark := p.afe.index(formattingElement)
+
+ // Step 14. The inner loop. Find the lastNode to reparent.
+ lastNode := furthestBlock
+ node := furthestBlock
+ x := p.oe.index(node)
+ // Step 14.1.
+ j := 0
+ for {
+ // Step 14.2.
+ j++
+ // Step. 14.3.
+ x--
+ node = p.oe[x]
+ // Step 14.4. Go to the next step if node is formatting element.
+ if node == formattingElement {
+ break
+ }
+ // Step 14.5. Remove node from the list of active formatting elements if
+ // inner loop counter is greater than three and node is in the list of
+ // active formatting elements.
+ if ni := p.afe.index(node); j > 3 && ni > -1 {
+ p.afe.remove(node)
+ // If any element of the list of active formatting elements is removed,
+ // we need to take care whether bookmark should be decremented or not.
+ // This is because the value of bookmark may exceed the size of the
+ // list by removing elements from the list.
+ if ni <= bookmark {
+ bookmark--
+ }
+ continue
+ }
+ // Step 14.6. Continue the next inner loop if node is not in the list of
+ // active formatting elements.
+ if p.afe.index(node) == -1 {
+ p.oe.remove(node)
+ continue
+ }
+ // Step 14.7.
+ clone := node.clone()
+ p.afe[p.afe.index(node)] = clone
+ p.oe[p.oe.index(node)] = clone
+ node = clone
+ // Step 14.8.
+ if lastNode == furthestBlock {
+ bookmark = p.afe.index(node) + 1
+ }
+ // Step 14.9.
+ if lastNode.Parent != nil {
+ lastNode.Parent.RemoveChild(lastNode)
+ }
+ node.AppendChild(lastNode)
+ // Step 14.10.
+ lastNode = node
+ }
+
+ // Step 15. Reparent lastNode to the common ancestor,
+ // or for misnested table nodes, to the foster parent.
+ if lastNode.Parent != nil {
+ lastNode.Parent.RemoveChild(lastNode)
+ }
+ switch commonAncestor.DataAtom {
+ case a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr:
+ p.fosterParent(lastNode)
+ default:
+ commonAncestor.AppendChild(lastNode)
+ }
+
+ // Steps 16-18. Reparent nodes from the furthest block's children
+ // to a clone of the formatting element.
+ clone := formattingElement.clone()
+ reparentChildren(clone, furthestBlock)
+ furthestBlock.AppendChild(clone)
+
+ // Step 19. Fix up the list of active formatting elements.
+ if oldLoc := p.afe.index(formattingElement); oldLoc != -1 && oldLoc < bookmark {
+ // Move the bookmark with the rest of the list.
+ bookmark--
+ }
+ p.afe.remove(formattingElement)
+ p.afe.insert(bookmark, clone)
+
+ // Step 20. Fix up the stack of open elements.
+ p.oe.remove(formattingElement)
+ p.oe.insert(p.oe.index(furthestBlock)+1, clone)
+ }
+}
+
+// inBodyEndTagOther performs the "any other end tag" algorithm for inBodyIM.
+// "Any other end tag" handling from 12.2.6.5 The rules for parsing tokens in foreign content
+// https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inforeign
+func (p *parser) inBodyEndTagOther(tagAtom a.Atom, tagName string) {
+ for i := len(p.oe) - 1; i >= 0; i-- {
+ // Two element nodes have the same tag if they have the same Data (a
+ // string-typed field). As an optimization, for common HTML tags, each
+ // Data string is assigned a unique, non-zero DataAtom (a uint32-typed
+ // field), since integer comparison is faster than string comparison.
+ // Uncommon (custom) tags get a zero DataAtom.
+ //
+ // The if condition here is equivalent to (p.oe[i].Data == tagName).
+ if (p.oe[i].DataAtom == tagAtom) &&
+ ((tagAtom != 0) || (p.oe[i].Data == tagName)) {
+ p.oe = p.oe[:i]
+ break
+ }
+ if isSpecialElement(p.oe[i]) {
+ break
+ }
+ }
+}
+
+// Section 12.2.6.4.8.
+func textIM(p *parser) bool {
+ switch p.tok.Type {
+ case ErrorToken:
+ p.oe.pop()
+ case TextToken:
+ d := p.tok.Data
+ if n := p.oe.top(); n.DataAtom == a.Textarea && n.FirstChild == nil {
+ // Ignore a newline at the start of a <textarea> block.
+ if d != "" && d[0] == '\r' {
+ d = d[1:]
+ }
+ if d != "" && d[0] == '\n' {
+ d = d[1:]
+ }
+ }
+ if d == "" {
+ return true
+ }
+ p.addText(d)
+ return true
+ case EndTagToken:
+ p.oe.pop()
+ }
+ p.im = p.originalIM
+ p.originalIM = nil
+ return p.tok.Type == EndTagToken
+}
+
+// Section 12.2.6.4.9.
+func inTableIM(p *parser) bool {
+ switch p.tok.Type {
+ case TextToken:
+ p.tok.Data = strings.Replace(p.tok.Data, "\x00", "", -1)
+ switch p.oe.top().DataAtom {
+ case a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr:
+ if strings.Trim(p.tok.Data, whitespace) == "" {
+ p.addText(p.tok.Data)
+ return true
+ }
+ }
+ case StartTagToken:
+ switch p.tok.DataAtom {
+ case a.Caption:
+ p.clearStackToContext(tableScope)
+ p.afe = append(p.afe, &scopeMarker)
+ p.addElement()
+ p.im = inCaptionIM
+ return true
+ case a.Colgroup:
+ p.clearStackToContext(tableScope)
+ p.addElement()
+ p.im = inColumnGroupIM
+ return true
+ case a.Col:
+ p.parseImpliedToken(StartTagToken, a.Colgroup, a.Colgroup.String())
+ return false
+ case a.Tbody, a.Tfoot, a.Thead:
+ p.clearStackToContext(tableScope)
+ p.addElement()
+ p.im = inTableBodyIM
+ return true
+ case a.Td, a.Th, a.Tr:
+ p.parseImpliedToken(StartTagToken, a.Tbody, a.Tbody.String())
+ return false
+ case a.Table:
+ if p.popUntil(tableScope, a.Table) {
+ p.resetInsertionMode()
+ return false
+ }
+ // Ignore the token.
+ return true
+ case a.Style, a.Script, a.Template:
+ return inHeadIM(p)
+ case a.Input:
+ for _, t := range p.tok.Attr {
+ if t.Key == "type" && strings.ToLower(t.Val) == "hidden" {
+ p.addElement()
+ p.oe.pop()
+ return true
+ }
+ }
+ // Otherwise drop down to the default action.
+ case a.Form:
+ if p.oe.contains(a.Template) || p.form != nil {
+ // Ignore the token.
+ return true
+ }
+ p.addElement()
+ p.form = p.oe.pop()
+ case a.Select:
+ p.reconstructActiveFormattingElements()
+ switch p.top().DataAtom {
+ case a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr:
+ p.fosterParenting = true
+ }
+ p.addElement()
+ p.fosterParenting = false
+ p.framesetOK = false
+ p.im = inSelectInTableIM
+ return true
+ }
+ case EndTagToken:
+ switch p.tok.DataAtom {
+ case a.Table:
+ if p.popUntil(tableScope, a.Table) {
+ p.resetInsertionMode()
+ return true
+ }
+ // Ignore the token.
+ return true
+ case a.Body, a.Caption, a.Col, a.Colgroup, a.Html, a.Tbody, a.Td, a.Tfoot, a.Th, a.Thead, a.Tr:
+ // Ignore the token.
+ return true
+ case a.Template:
+ return inHeadIM(p)
+ }
+ case CommentToken:
+ p.addChild(&Node{
+ Type: CommentNode,
+ Data: p.tok.Data,
+ })
+ return true
+ case DoctypeToken:
+ // Ignore the token.
+ return true
+ case ErrorToken:
+ return inBodyIM(p)
+ }
+
+ p.fosterParenting = true
+ defer func() { p.fosterParenting = false }()
+
+ return inBodyIM(p)
+}
+
+// Section 12.2.6.4.11.
+func inCaptionIM(p *parser) bool {
+ switch p.tok.Type {
+ case StartTagToken:
+ switch p.tok.DataAtom {
+ case a.Caption, a.Col, a.Colgroup, a.Tbody, a.Td, a.Tfoot, a.Thead, a.Tr:
+ if !p.popUntil(tableScope, a.Caption) {
+ // Ignore the token.
+ return true
+ }
+ p.clearActiveFormattingElements()
+ p.im = inTableIM
+ return false
+ case a.Select:
+ p.reconstructActiveFormattingElements()
+ p.addElement()
+ p.framesetOK = false
+ p.im = inSelectInTableIM
+ return true
+ }
+ case EndTagToken:
+ switch p.tok.DataAtom {
+ case a.Caption:
+ if p.popUntil(tableScope, a.Caption) {
+ p.clearActiveFormattingElements()
+ p.im = inTableIM
+ }
+ return true
+ case a.Table:
+ if !p.popUntil(tableScope, a.Caption) {
+ // Ignore the token.
+ return true
+ }
+ p.clearActiveFormattingElements()
+ p.im = inTableIM
+ return false
+ case a.Body, a.Col, a.Colgroup, a.Html, a.Tbody, a.Td, a.Tfoot, a.Th, a.Thead, a.Tr:
+ // Ignore the token.
+ return true
+ }
+ }
+ return inBodyIM(p)
+}
+
+// Section 12.2.6.4.12.
+func inColumnGroupIM(p *parser) bool {
+ switch p.tok.Type {
+ case TextToken:
+ s := strings.TrimLeft(p.tok.Data, whitespace)
+ if len(s) < len(p.tok.Data) {
+ // Add the initial whitespace to the current node.
+ p.addText(p.tok.Data[:len(p.tok.Data)-len(s)])
+ if s == "" {
+ return true
+ }
+ p.tok.Data = s
+ }
+ case CommentToken:
+ p.addChild(&Node{
+ Type: CommentNode,
+ Data: p.tok.Data,
+ })
+ return true
+ case DoctypeToken:
+ // Ignore the token.
+ return true
+ case StartTagToken:
+ switch p.tok.DataAtom {
+ case a.Html:
+ return inBodyIM(p)
+ case a.Col:
+ p.addElement()
+ p.oe.pop()
+ p.acknowledgeSelfClosingTag()
+ return true
+ case a.Template:
+ return inHeadIM(p)
+ }
+ case EndTagToken:
+ switch p.tok.DataAtom {
+ case a.Colgroup:
+ if p.oe.top().DataAtom == a.Colgroup {
+ p.oe.pop()
+ p.im = inTableIM
+ }
+ return true
+ case a.Col:
+ // Ignore the token.
+ return true
+ case a.Template:
+ return inHeadIM(p)
+ }
+ case ErrorToken:
+ return inBodyIM(p)
+ }
+ if p.oe.top().DataAtom != a.Colgroup {
+ return true
+ }
+ p.oe.pop()
+ p.im = inTableIM
+ return false
+}
+
+// Section 12.2.6.4.13.
+func inTableBodyIM(p *parser) bool {
+ switch p.tok.Type {
+ case StartTagToken:
+ switch p.tok.DataAtom {
+ case a.Tr:
+ p.clearStackToContext(tableBodyScope)
+ p.addElement()
+ p.im = inRowIM
+ return true
+ case a.Td, a.Th:
+ p.parseImpliedToken(StartTagToken, a.Tr, a.Tr.String())
+ return false
+ case a.Caption, a.Col, a.Colgroup, a.Tbody, a.Tfoot, a.Thead:
+ if p.popUntil(tableScope, a.Tbody, a.Thead, a.Tfoot) {
+ p.im = inTableIM
+ return false
+ }
+ // Ignore the token.
+ return true
+ }
+ case EndTagToken:
+ switch p.tok.DataAtom {
+ case a.Tbody, a.Tfoot, a.Thead:
+ if p.elementInScope(tableScope, p.tok.DataAtom) {
+ p.clearStackToContext(tableBodyScope)
+ p.oe.pop()
+ p.im = inTableIM
+ }
+ return true
+ case a.Table:
+ if p.popUntil(tableScope, a.Tbody, a.Thead, a.Tfoot) {
+ p.im = inTableIM
+ return false
+ }
+ // Ignore the token.
+ return true
+ case a.Body, a.Caption, a.Col, a.Colgroup, a.Html, a.Td, a.Th, a.Tr:
+ // Ignore the token.
+ return true
+ }
+ case CommentToken:
+ p.addChild(&Node{
+ Type: CommentNode,
+ Data: p.tok.Data,
+ })
+ return true
+ }
+
+ return inTableIM(p)
+}
+
+// Section 12.2.6.4.14.
+func inRowIM(p *parser) bool {
+ switch p.tok.Type {
+ case StartTagToken:
+ switch p.tok.DataAtom {
+ case a.Td, a.Th:
+ p.clearStackToContext(tableRowScope)
+ p.addElement()
+ p.afe = append(p.afe, &scopeMarker)
+ p.im = inCellIM
+ return true
+ case a.Caption, a.Col, a.Colgroup, a.Tbody, a.Tfoot, a.Thead, a.Tr:
+ if p.popUntil(tableScope, a.Tr) {
+ p.im = inTableBodyIM
+ return false
+ }
+ // Ignore the token.
+ return true
+ }
+ case EndTagToken:
+ switch p.tok.DataAtom {
+ case a.Tr:
+ if p.popUntil(tableScope, a.Tr) {
+ p.im = inTableBodyIM
+ return true
+ }
+ // Ignore the token.
+ return true
+ case a.Table:
+ if p.popUntil(tableScope, a.Tr) {
+ p.im = inTableBodyIM
+ return false
+ }
+ // Ignore the token.
+ return true
+ case a.Tbody, a.Tfoot, a.Thead:
+ if p.elementInScope(tableScope, p.tok.DataAtom) {
+ p.parseImpliedToken(EndTagToken, a.Tr, a.Tr.String())
+ return false
+ }
+ // Ignore the token.
+ return true
+ case a.Body, a.Caption, a.Col, a.Colgroup, a.Html, a.Td, a.Th:
+ // Ignore the token.
+ return true
+ }
+ }
+
+ return inTableIM(p)
+}
+
+// Section 12.2.6.4.15.
+func inCellIM(p *parser) bool {
+ switch p.tok.Type {
+ case StartTagToken:
+ switch p.tok.DataAtom {
+ case a.Caption, a.Col, a.Colgroup, a.Tbody, a.Td, a.Tfoot, a.Th, a.Thead, a.Tr:
+ if p.popUntil(tableScope, a.Td, a.Th) {
+ // Close the cell and reprocess.
+ p.clearActiveFormattingElements()
+ p.im = inRowIM
+ return false
+ }
+ // Ignore the token.
+ return true
+ case a.Select:
+ p.reconstructActiveFormattingElements()
+ p.addElement()
+ p.framesetOK = false
+ p.im = inSelectInTableIM
+ return true
+ }
+ case EndTagToken:
+ switch p.tok.DataAtom {
+ case a.Td, a.Th:
+ if !p.popUntil(tableScope, p.tok.DataAtom) {
+ // Ignore the token.
+ return true
+ }
+ p.clearActiveFormattingElements()
+ p.im = inRowIM
+ return true
+ case a.Body, a.Caption, a.Col, a.Colgroup, a.Html:
+ // Ignore the token.
+ return true
+ case a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr:
+ if !p.elementInScope(tableScope, p.tok.DataAtom) {
+ // Ignore the token.
+ return true
+ }
+ // Close the cell and reprocess.
+ if p.popUntil(tableScope, a.Td, a.Th) {
+ p.clearActiveFormattingElements()
+ }
+ p.im = inRowIM
+ return false
+ }
+ }
+ return inBodyIM(p)
+}
+
+// Section 12.2.6.4.16.
+func inSelectIM(p *parser) bool {
+ switch p.tok.Type {
+ case TextToken:
+ p.addText(strings.Replace(p.tok.Data, "\x00", "", -1))
+ case StartTagToken:
+ switch p.tok.DataAtom {
+ case a.Html:
+ return inBodyIM(p)
+ case a.Option:
+ if p.top().DataAtom == a.Option {
+ p.oe.pop()
+ }
+ p.addElement()
+ case a.Optgroup:
+ if p.top().DataAtom == a.Option {
+ p.oe.pop()
+ }
+ if p.top().DataAtom == a.Optgroup {
+ p.oe.pop()
+ }
+ p.addElement()
+ case a.Select:
+ if !p.popUntil(selectScope, a.Select) {
+ // Ignore the token.
+ return true
+ }
+ p.resetInsertionMode()
+ case a.Input, a.Keygen, a.Textarea:
+ if p.elementInScope(selectScope, a.Select) {
+ p.parseImpliedToken(EndTagToken, a.Select, a.Select.String())
+ return false
+ }
+ // In order to properly ignore <textarea>, we need to change the tokenizer mode.
+ p.tokenizer.NextIsNotRawText()
+ // Ignore the token.
+ return true
+ case a.Script, a.Template:
+ return inHeadIM(p)
+ case a.Iframe, a.Noembed, a.Noframes, a.Noscript, a.Plaintext, a.Style, a.Title, a.Xmp:
+ // Don't let the tokenizer go into raw text mode when there are raw tags
+ // to be ignored. These tags should be ignored from the tokenizer
+ // properly.
+ p.tokenizer.NextIsNotRawText()
+ // Ignore the token.
+ return true
+ }
+ case EndTagToken:
+ switch p.tok.DataAtom {
+ case a.Option:
+ if p.top().DataAtom == a.Option {
+ p.oe.pop()
+ }
+ case a.Optgroup:
+ i := len(p.oe) - 1
+ if p.oe[i].DataAtom == a.Option {
+ i--
+ }
+ if p.oe[i].DataAtom == a.Optgroup {
+ p.oe = p.oe[:i]
+ }
+ case a.Select:
+ if !p.popUntil(selectScope, a.Select) {
+ // Ignore the token.
+ return true
+ }
+ p.resetInsertionMode()
+ case a.Template:
+ return inHeadIM(p)
+ }
+ case CommentToken:
+ p.addChild(&Node{
+ Type: CommentNode,
+ Data: p.tok.Data,
+ })
+ case DoctypeToken:
+ // Ignore the token.
+ return true
+ case ErrorToken:
+ return inBodyIM(p)
+ }
+
+ return true
+}
+
+// Section 12.2.6.4.17.
+func inSelectInTableIM(p *parser) bool {
+ switch p.tok.Type {
+ case StartTagToken, EndTagToken:
+ switch p.tok.DataAtom {
+ case a.Caption, a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr, a.Td, a.Th:
+ if p.tok.Type == EndTagToken && !p.elementInScope(tableScope, p.tok.DataAtom) {
+ // Ignore the token.
+ return true
+ }
+ // This is like p.popUntil(selectScope, a.Select), but it also
+ // matches <math select>, not just <select>. Matching the MathML
+ // tag is arguably incorrect (conceptually), but it mimics what
+ // Chromium does.
+ for i := len(p.oe) - 1; i >= 0; i-- {
+ if n := p.oe[i]; n.DataAtom == a.Select {
+ p.oe = p.oe[:i]
+ break
+ }
+ }
+ p.resetInsertionMode()
+ return false
+ }
+ }
+ return inSelectIM(p)
+}
+
+// Section 12.2.6.4.18.
+func inTemplateIM(p *parser) bool {
+ switch p.tok.Type {
+ case TextToken, CommentToken, DoctypeToken:
+ return inBodyIM(p)
+ case StartTagToken:
+ switch p.tok.DataAtom {
+ case a.Base, a.Basefont, a.Bgsound, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Template, a.Title:
+ return inHeadIM(p)
+ case a.Caption, a.Colgroup, a.Tbody, a.Tfoot, a.Thead:
+ p.templateStack.pop()
+ p.templateStack = append(p.templateStack, inTableIM)
+ p.im = inTableIM
+ return false
+ case a.Col:
+ p.templateStack.pop()
+ p.templateStack = append(p.templateStack, inColumnGroupIM)
+ p.im = inColumnGroupIM
+ return false
+ case a.Tr:
+ p.templateStack.pop()
+ p.templateStack = append(p.templateStack, inTableBodyIM)
+ p.im = inTableBodyIM
+ return false
+ case a.Td, a.Th:
+ p.templateStack.pop()
+ p.templateStack = append(p.templateStack, inRowIM)
+ p.im = inRowIM
+ return false
+ default:
+ p.templateStack.pop()
+ p.templateStack = append(p.templateStack, inBodyIM)
+ p.im = inBodyIM
+ return false
+ }
+ case EndTagToken:
+ switch p.tok.DataAtom {
+ case a.Template:
+ return inHeadIM(p)
+ default:
+ // Ignore the token.
+ return true
+ }
+ case ErrorToken:
+ if !p.oe.contains(a.Template) {
+ // Ignore the token.
+ return true
+ }
+ // TODO: remove this divergence from the HTML5 spec.
+ //
+ // See https://bugs.chromium.org/p/chromium/issues/detail?id=829668
+ p.generateImpliedEndTags()
+ for i := len(p.oe) - 1; i >= 0; i-- {
+ if n := p.oe[i]; n.Namespace == "" && n.DataAtom == a.Template {
+ p.oe = p.oe[:i]
+ break
+ }
+ }
+ p.clearActiveFormattingElements()
+ p.templateStack.pop()
+ p.resetInsertionMode()
+ return false
+ }
+ return false
+}
+
+// Section 12.2.6.4.19.
+func afterBodyIM(p *parser) bool {
+ switch p.tok.Type {
+ case ErrorToken:
+ // Stop parsing.
+ return true
+ case TextToken:
+ s := strings.TrimLeft(p.tok.Data, whitespace)
+ if len(s) == 0 {
+ // It was all whitespace.
+ return inBodyIM(p)
+ }
+ case StartTagToken:
+ if p.tok.DataAtom == a.Html {
+ return inBodyIM(p)
+ }
+ case EndTagToken:
+ if p.tok.DataAtom == a.Html {
+ if !p.fragment {
+ p.im = afterAfterBodyIM
+ }
+ return true
+ }
+ case CommentToken:
+ // The comment is attached to the <html> element.
+ if len(p.oe) < 1 || p.oe[0].DataAtom != a.Html {
+ panic("html: bad parser state: <html> element not found, in the after-body insertion mode")
+ }
+ p.oe[0].AppendChild(&Node{
+ Type: CommentNode,
+ Data: p.tok.Data,
+ })
+ return true
+ }
+ p.im = inBodyIM
+ return false
+}
+
+// Section 12.2.6.4.20.
+func inFramesetIM(p *parser) bool {
+ switch p.tok.Type {
+ case CommentToken:
+ p.addChild(&Node{
+ Type: CommentNode,
+ Data: p.tok.Data,
+ })
+ case TextToken:
+ // Ignore all text but whitespace.
+ s := strings.Map(func(c rune) rune {
+ switch c {
+ case ' ', '\t', '\n', '\f', '\r':
+ return c
+ }
+ return -1
+ }, p.tok.Data)
+ if s != "" {
+ p.addText(s)
+ }
+ case StartTagToken:
+ switch p.tok.DataAtom {
+ case a.Html:
+ return inBodyIM(p)
+ case a.Frameset:
+ p.addElement()
+ case a.Frame:
+ p.addElement()
+ p.oe.pop()
+ p.acknowledgeSelfClosingTag()
+ case a.Noframes:
+ return inHeadIM(p)
+ }
+ case EndTagToken:
+ switch p.tok.DataAtom {
+ case a.Frameset:
+ if p.oe.top().DataAtom != a.Html {
+ p.oe.pop()
+ if p.oe.top().DataAtom != a.Frameset {
+ p.im = afterFramesetIM
+ return true
+ }
+ }
+ }
+ default:
+ // Ignore the token.
+ }
+ return true
+}
+
+// Section 12.2.6.4.21.
+func afterFramesetIM(p *parser) bool {
+ switch p.tok.Type {
+ case CommentToken:
+ p.addChild(&Node{
+ Type: CommentNode,
+ Data: p.tok.Data,
+ })
+ case TextToken:
+ // Ignore all text but whitespace.
+ s := strings.Map(func(c rune) rune {
+ switch c {
+ case ' ', '\t', '\n', '\f', '\r':
+ return c
+ }
+ return -1
+ }, p.tok.Data)
+ if s != "" {
+ p.addText(s)
+ }
+ case StartTagToken:
+ switch p.tok.DataAtom {
+ case a.Html:
+ return inBodyIM(p)
+ case a.Noframes:
+ return inHeadIM(p)
+ }
+ case EndTagToken:
+ switch p.tok.DataAtom {
+ case a.Html:
+ p.im = afterAfterFramesetIM
+ return true
+ }
+ default:
+ // Ignore the token.
+ }
+ return true
+}
+
+// Section 12.2.6.4.22.
+func afterAfterBodyIM(p *parser) bool {
+ switch p.tok.Type {
+ case ErrorToken:
+ // Stop parsing.
+ return true
+ case TextToken:
+ s := strings.TrimLeft(p.tok.Data, whitespace)
+ if len(s) == 0 {
+ // It was all whitespace.
+ return inBodyIM(p)
+ }
+ case StartTagToken:
+ if p.tok.DataAtom == a.Html {
+ return inBodyIM(p)
+ }
+ case CommentToken:
+ p.doc.AppendChild(&Node{
+ Type: CommentNode,
+ Data: p.tok.Data,
+ })
+ return true
+ case DoctypeToken:
+ return inBodyIM(p)
+ }
+ p.im = inBodyIM
+ return false
+}
+
+// Section 12.2.6.4.23.
+func afterAfterFramesetIM(p *parser) bool {
+ switch p.tok.Type {
+ case CommentToken:
+ p.doc.AppendChild(&Node{
+ Type: CommentNode,
+ Data: p.tok.Data,
+ })
+ case TextToken:
+ // Ignore all text but whitespace.
+ s := strings.Map(func(c rune) rune {
+ switch c {
+ case ' ', '\t', '\n', '\f', '\r':
+ return c
+ }
+ return -1
+ }, p.tok.Data)
+ if s != "" {
+ p.tok.Data = s
+ return inBodyIM(p)
+ }
+ case StartTagToken:
+ switch p.tok.DataAtom {
+ case a.Html:
+ return inBodyIM(p)
+ case a.Noframes:
+ return inHeadIM(p)
+ }
+ case DoctypeToken:
+ return inBodyIM(p)
+ default:
+ // Ignore the token.
+ }
+ return true
+}
+
+const whitespaceOrNUL = whitespace + "\x00"
+
+// Section 12.2.6.5
+func parseForeignContent(p *parser) bool {
+ switch p.tok.Type {
+ case TextToken:
+ if p.framesetOK {
+ p.framesetOK = strings.TrimLeft(p.tok.Data, whitespaceOrNUL) == ""
+ }
+ p.tok.Data = strings.Replace(p.tok.Data, "\x00", "\ufffd", -1)
+ p.addText(p.tok.Data)
+ case CommentToken:
+ p.addChild(&Node{
+ Type: CommentNode,
+ Data: p.tok.Data,
+ })
+ case StartTagToken:
+ if !p.fragment {
+ b := breakout[p.tok.Data]
+ if p.tok.DataAtom == a.Font {
+ loop:
+ for _, attr := range p.tok.Attr {
+ switch attr.Key {
+ case "color", "face", "size":
+ b = true
+ break loop
+ }
+ }
+ }
+ if b {
+ for i := len(p.oe) - 1; i >= 0; i-- {
+ n := p.oe[i]
+ if n.Namespace == "" || htmlIntegrationPoint(n) || mathMLTextIntegrationPoint(n) {
+ p.oe = p.oe[:i+1]
+ break
+ }
+ }
+ return false
+ }
+ }
+ current := p.adjustedCurrentNode()
+ switch current.Namespace {
+ case "math":
+ adjustAttributeNames(p.tok.Attr, mathMLAttributeAdjustments)
+ case "svg":
+ // Adjust SVG tag names. The tokenizer lower-cases tag names, but
+ // SVG wants e.g. "foreignObject" with a capital second "O".
+ if x := svgTagNameAdjustments[p.tok.Data]; x != "" {
+ p.tok.DataAtom = a.Lookup([]byte(x))
+ p.tok.Data = x
+ }
+ adjustAttributeNames(p.tok.Attr, svgAttributeAdjustments)
+ default:
+ panic("html: bad parser state: unexpected namespace")
+ }
+ adjustForeignAttributes(p.tok.Attr)
+ namespace := current.Namespace
+ p.addElement()
+ p.top().Namespace = namespace
+ if namespace != "" {
+ // Don't let the tokenizer go into raw text mode in foreign content
+ // (e.g. in an SVG <title> tag).
+ p.tokenizer.NextIsNotRawText()
+ }
+ if p.hasSelfClosingToken {
+ p.oe.pop()
+ p.acknowledgeSelfClosingTag()
+ }
+ case EndTagToken:
+ for i := len(p.oe) - 1; i >= 0; i-- {
+ if p.oe[i].Namespace == "" {
+ return p.im(p)
+ }
+ if strings.EqualFold(p.oe[i].Data, p.tok.Data) {
+ p.oe = p.oe[:i]
+ break
+ }
+ }
+ return true
+ default:
+ // Ignore the token.
+ }
+ return true
+}
+
+// Section 12.2.4.2.
+func (p *parser) adjustedCurrentNode() *Node {
+ if len(p.oe) == 1 && p.fragment && p.context != nil {
+ return p.context
+ }
+ return p.oe.top()
+}
+
+// Section 12.2.6.
+func (p *parser) inForeignContent() bool {
+ if len(p.oe) == 0 {
+ return false
+ }
+ n := p.adjustedCurrentNode()
+ if n.Namespace == "" {
+ return false
+ }
+ if mathMLTextIntegrationPoint(n) {
+ if p.tok.Type == StartTagToken && p.tok.DataAtom != a.Mglyph && p.tok.DataAtom != a.Malignmark {
+ return false
+ }
+ if p.tok.Type == TextToken {
+ return false
+ }
+ }
+ if n.Namespace == "math" && n.DataAtom == a.AnnotationXml && p.tok.Type == StartTagToken && p.tok.DataAtom == a.Svg {
+ return false
+ }
+ if htmlIntegrationPoint(n) && (p.tok.Type == StartTagToken || p.tok.Type == TextToken) {
+ return false
+ }
+ if p.tok.Type == ErrorToken {
+ return false
+ }
+ return true
+}
+
+// parseImpliedToken parses a token as though it had appeared in the parser's
+// input.
+func (p *parser) parseImpliedToken(t TokenType, dataAtom a.Atom, data string) {
+ realToken, selfClosing := p.tok, p.hasSelfClosingToken
+ p.tok = Token{
+ Type: t,
+ DataAtom: dataAtom,
+ Data: data,
+ }
+ p.hasSelfClosingToken = false
+ p.parseCurrentToken()
+ p.tok, p.hasSelfClosingToken = realToken, selfClosing
+}
+
+// parseCurrentToken runs the current token through the parsing routines
+// until it is consumed.
+func (p *parser) parseCurrentToken() {
+ if p.tok.Type == SelfClosingTagToken {
+ p.hasSelfClosingToken = true
+ p.tok.Type = StartTagToken
+ }
+
+ consumed := false
+ for !consumed {
+ if p.inForeignContent() {
+ consumed = parseForeignContent(p)
+ } else {
+ consumed = p.im(p)
+ }
+ }
+
+ if p.hasSelfClosingToken {
+ // This is a parse error, but ignore it.
+ p.hasSelfClosingToken = false
+ }
+}
+
+func (p *parser) parse() error {
+ // Iterate until EOF. Any other error will cause an early return.
+ var err error
+ for err != io.EOF {
+ // CDATA sections are allowed only in foreign content.
+ n := p.oe.top()
+ p.tokenizer.AllowCDATA(n != nil && n.Namespace != "")
+ // Read and parse the next token.
+ p.tokenizer.Next()
+ p.tok = p.tokenizer.Token()
+ if p.tok.Type == ErrorToken {
+ err = p.tokenizer.Err()
+ if err != nil && err != io.EOF {
+ return err
+ }
+ }
+ p.parseCurrentToken()
+ }
+ return nil
+}
+
+// Parse returns the parse tree for the HTML from the given Reader.
+//
+// It implements the HTML5 parsing algorithm
+// (https://html.spec.whatwg.org/multipage/syntax.html#tree-construction),
+// which is very complicated. The resultant tree can contain implicitly created
+// nodes that have no explicit <tag> listed in r's data, and nodes' parents can
+// differ from the nesting implied by a naive processing of start and end
+// <tag>s. Conversely, explicit <tag>s in r's data can be silently dropped,
+// with no corresponding node in the resulting tree.
+//
+// The input is assumed to be UTF-8 encoded.
+func Parse(r io.Reader) (*Node, error) {
+ return ParseWithOptions(r)
+}
+
+// ParseFragment parses a fragment of HTML and returns the nodes that were
+// found. If the fragment is the InnerHTML for an existing element, pass that
+// element in context.
+//
+// It has the same intricacies as Parse.
+func ParseFragment(r io.Reader, context *Node) ([]*Node, error) {
+ return ParseFragmentWithOptions(r, context)
+}
+
+// ParseOption configures a parser.
+type ParseOption func(p *parser)
+
+// ParseOptionEnableScripting configures the scripting flag.
+// https://html.spec.whatwg.org/multipage/webappapis.html#enabling-and-disabling-scripting
+//
+// By default, scripting is enabled.
+func ParseOptionEnableScripting(enable bool) ParseOption {
+ return func(p *parser) {
+ p.scripting = enable
+ }
+}
+
+// ParseWithOptions is like Parse, with options.
+func ParseWithOptions(r io.Reader, opts ...ParseOption) (*Node, error) {
+ p := &parser{
+ tokenizer: NewTokenizer(r),
+ doc: &Node{
+ Type: DocumentNode,
+ },
+ scripting: true,
+ framesetOK: true,
+ im: initialIM,
+ }
+
+ for _, f := range opts {
+ f(p)
+ }
+
+ if err := p.parse(); err != nil {
+ return nil, err
+ }
+ return p.doc, nil
+}
+
+// ParseFragmentWithOptions is like ParseFragment, with options.
+func ParseFragmentWithOptions(r io.Reader, context *Node, opts ...ParseOption) ([]*Node, error) {
+ contextTag := ""
+ if context != nil {
+ if context.Type != ElementNode {
+ return nil, errors.New("html: ParseFragment of non-element Node")
+ }
+ // The next check isn't just context.DataAtom.String() == context.Data because
+ // it is valid to pass an element whose tag isn't a known atom. For example,
+ // DataAtom == 0 and Data = "tagfromthefuture" is perfectly consistent.
+ if context.DataAtom != a.Lookup([]byte(context.Data)) {
+ return nil, fmt.Errorf("html: inconsistent Node: DataAtom=%q, Data=%q", context.DataAtom, context.Data)
+ }
+ contextTag = context.DataAtom.String()
+ }
+ p := &parser{
+ doc: &Node{
+ Type: DocumentNode,
+ },
+ scripting: true,
+ fragment: true,
+ context: context,
+ }
+ if context != nil && context.Namespace != "" {
+ p.tokenizer = NewTokenizer(r)
+ } else {
+ p.tokenizer = NewTokenizerFragment(r, contextTag)
+ }
+
+ for _, f := range opts {
+ f(p)
+ }
+
+ root := &Node{
+ Type: ElementNode,
+ DataAtom: a.Html,
+ Data: a.Html.String(),
+ }
+ p.doc.AppendChild(root)
+ p.oe = nodeStack{root}
+ if context != nil && context.DataAtom == a.Template {
+ p.templateStack = append(p.templateStack, inTemplateIM)
+ }
+ p.resetInsertionMode()
+
+ for n := context; n != nil; n = n.Parent {
+ if n.Type == ElementNode && n.DataAtom == a.Form {
+ p.form = n
+ break
+ }
+ }
+
+ if err := p.parse(); err != nil {
+ return nil, err
+ }
+
+ parent := p.doc
+ if context != nil {
+ parent = root
+ }
+
+ var result []*Node
+ for c := parent.FirstChild; c != nil; {
+ next := c.NextSibling
+ parent.RemoveChild(c)
+ result = append(result, c)
+ c = next
+ }
+ return result, nil
+}
diff --git a/vendor/golang.org/x/net/html/render.go b/vendor/golang.org/x/net/html/render.go
new file mode 100644
index 0000000..b46d81c
--- /dev/null
+++ b/vendor/golang.org/x/net/html/render.go
@@ -0,0 +1,273 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package html
+
+import (
+ "bufio"
+ "errors"
+ "fmt"
+ "io"
+ "strings"
+)
+
+type writer interface {
+ io.Writer
+ io.ByteWriter
+ WriteString(string) (int, error)
+}
+
+// Render renders the parse tree n to the given writer.
+//
+// Rendering is done on a 'best effort' basis: calling Parse on the output of
+// Render will always result in something similar to the original tree, but it
+// is not necessarily an exact clone unless the original tree was 'well-formed'.
+// 'Well-formed' is not easily specified; the HTML5 specification is
+// complicated.
+//
+// Calling Parse on arbitrary input typically results in a 'well-formed' parse
+// tree. However, it is possible for Parse to yield a 'badly-formed' parse tree.
+// For example, in a 'well-formed' parse tree, no <a> element is a child of
+// another <a> element: parsing "<a><a>" results in two sibling elements.
+// Similarly, in a 'well-formed' parse tree, no <a> element is a child of a
+// <table> element: parsing "<p><table><a>" results in a <p> with two sibling
+// children; the <a> is reparented to the <table>'s parent. However, calling
+// Parse on "<a><table><a>" does not return an error, but the result has an <a>
+// element with an <a> child, and is therefore not 'well-formed'.
+//
+// Programmatically constructed trees are typically also 'well-formed', but it
+// is possible to construct a tree that looks innocuous but, when rendered and
+// re-parsed, results in a different tree. A simple example is that a solitary
+// text node would become a tree containing <html>, <head> and <body> elements.
+// Another example is that the programmatic equivalent of "a<head>b</head>c"
+// becomes "<html><head><head/><body>abc</body></html>".
+func Render(w io.Writer, n *Node) error {
+ if x, ok := w.(writer); ok {
+ return render(x, n)
+ }
+ buf := bufio.NewWriter(w)
+ if err := render(buf, n); err != nil {
+ return err
+ }
+ return buf.Flush()
+}
+
+// plaintextAbort is returned from render1 when a <plaintext> element
+// has been rendered. No more end tags should be rendered after that.
+var plaintextAbort = errors.New("html: internal error (plaintext abort)")
+
+func render(w writer, n *Node) error {
+ err := render1(w, n)
+ if err == plaintextAbort {
+ err = nil
+ }
+ return err
+}
+
+func render1(w writer, n *Node) error {
+ // Render non-element nodes; these are the easy cases.
+ switch n.Type {
+ case ErrorNode:
+ return errors.New("html: cannot render an ErrorNode node")
+ case TextNode:
+ return escape(w, n.Data)
+ case DocumentNode:
+ for c := n.FirstChild; c != nil; c = c.NextSibling {
+ if err := render1(w, c); err != nil {
+ return err
+ }
+ }
+ return nil
+ case ElementNode:
+ // No-op.
+ case CommentNode:
+ if _, err := w.WriteString("<!--"); err != nil {
+ return err
+ }
+ if _, err := w.WriteString(n.Data); err != nil {
+ return err
+ }
+ if _, err := w.WriteString("-->"); err != nil {
+ return err
+ }
+ return nil
+ case DoctypeNode:
+ if _, err := w.WriteString("<!DOCTYPE "); err != nil {
+ return err
+ }
+ if _, err := w.WriteString(n.Data); err != nil {
+ return err
+ }
+ if n.Attr != nil {
+ var p, s string
+ for _, a := range n.Attr {
+ switch a.Key {
+ case "public":
+ p = a.Val
+ case "system":
+ s = a.Val
+ }
+ }
+ if p != "" {
+ if _, err := w.WriteString(" PUBLIC "); err != nil {
+ return err
+ }
+ if err := writeQuoted(w, p); err != nil {
+ return err
+ }
+ if s != "" {
+ if err := w.WriteByte(' '); err != nil {
+ return err
+ }
+ if err := writeQuoted(w, s); err != nil {
+ return err
+ }
+ }
+ } else if s != "" {
+ if _, err := w.WriteString(" SYSTEM "); err != nil {
+ return err
+ }
+ if err := writeQuoted(w, s); err != nil {
+ return err
+ }
+ }
+ }
+ return w.WriteByte('>')
+ case RawNode:
+ _, err := w.WriteString(n.Data)
+ return err
+ default:
+ return errors.New("html: unknown node type")
+ }
+
+ // Render the <xxx> opening tag.
+ if err := w.WriteByte('<'); err != nil {
+ return err
+ }
+ if _, err := w.WriteString(n.Data); err != nil {
+ return err
+ }
+ for _, a := range n.Attr {
+ if err := w.WriteByte(' '); err != nil {
+ return err
+ }
+ if a.Namespace != "" {
+ if _, err := w.WriteString(a.Namespace); err != nil {
+ return err
+ }
+ if err := w.WriteByte(':'); err != nil {
+ return err
+ }
+ }
+ if _, err := w.WriteString(a.Key); err != nil {
+ return err
+ }
+ if _, err := w.WriteString(`="`); err != nil {
+ return err
+ }
+ if err := escape(w, a.Val); err != nil {
+ return err
+ }
+ if err := w.WriteByte('"'); err != nil {
+ return err
+ }
+ }
+ if voidElements[n.Data] {
+ if n.FirstChild != nil {
+ return fmt.Errorf("html: void element <%s> has child nodes", n.Data)
+ }
+ _, err := w.WriteString("/>")
+ return err
+ }
+ if err := w.WriteByte('>'); err != nil {
+ return err
+ }
+
+ // Add initial newline where there is danger of a newline beging ignored.
+ if c := n.FirstChild; c != nil && c.Type == TextNode && strings.HasPrefix(c.Data, "\n") {
+ switch n.Data {
+ case "pre", "listing", "textarea":
+ if err := w.WriteByte('\n'); err != nil {
+ return err
+ }
+ }
+ }
+
+ // Render any child nodes.
+ switch n.Data {
+ case "iframe", "noembed", "noframes", "noscript", "plaintext", "script", "style", "xmp":
+ for c := n.FirstChild; c != nil; c = c.NextSibling {
+ if c.Type == TextNode {
+ if _, err := w.WriteString(c.Data); err != nil {
+ return err
+ }
+ } else {
+ if err := render1(w, c); err != nil {
+ return err
+ }
+ }
+ }
+ if n.Data == "plaintext" {
+ // Don't render anything else. <plaintext> must be the
+ // last element in the file, with no closing tag.
+ return plaintextAbort
+ }
+ default:
+ for c := n.FirstChild; c != nil; c = c.NextSibling {
+ if err := render1(w, c); err != nil {
+ return err
+ }
+ }
+ }
+
+ // Render the </xxx> closing tag.
+ if _, err := w.WriteString("</"); err != nil {
+ return err
+ }
+ if _, err := w.WriteString(n.Data); err != nil {
+ return err
+ }
+ return w.WriteByte('>')
+}
+
+// writeQuoted writes s to w surrounded by quotes. Normally it will use double
+// quotes, but if s contains a double quote, it will use single quotes.
+// It is used for writing the identifiers in a doctype declaration.
+// In valid HTML, they can't contain both types of quotes.
+func writeQuoted(w writer, s string) error {
+ var q byte = '"'
+ if strings.Contains(s, `"`) {
+ q = '\''
+ }
+ if err := w.WriteByte(q); err != nil {
+ return err
+ }
+ if _, err := w.WriteString(s); err != nil {
+ return err
+ }
+ if err := w.WriteByte(q); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Section 12.1.2, "Elements", gives this list of void elements. Void elements
+// are those that can't have any contents.
+var voidElements = map[string]bool{
+ "area": true,
+ "base": true,
+ "br": true,
+ "col": true,
+ "embed": true,
+ "hr": true,
+ "img": true,
+ "input": true,
+ "keygen": true, // "keygen" has been removed from the spec, but are kept here for backwards compatibility.
+ "link": true,
+ "meta": true,
+ "param": true,
+ "source": true,
+ "track": true,
+ "wbr": true,
+}
diff --git a/vendor/golang.org/x/net/html/token.go b/vendor/golang.org/x/net/html/token.go
new file mode 100644
index 0000000..877709f
--- /dev/null
+++ b/vendor/golang.org/x/net/html/token.go
@@ -0,0 +1,1224 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package html
+
+import (
+ "bytes"
+ "errors"
+ "io"
+ "strconv"
+ "strings"
+
+ "golang.org/x/net/html/atom"
+)
+
+// A TokenType is the type of a Token.
+type TokenType uint32
+
+const (
+ // ErrorToken means that an error occurred during tokenization.
+ ErrorToken TokenType = iota
+ // TextToken means a text node.
+ TextToken
+ // A StartTagToken looks like <a>.
+ StartTagToken
+ // An EndTagToken looks like </a>.
+ EndTagToken
+ // A SelfClosingTagToken tag looks like <br/>.
+ SelfClosingTagToken
+ // A CommentToken looks like <!--x-->.
+ CommentToken
+ // A DoctypeToken looks like <!DOCTYPE x>
+ DoctypeToken
+)
+
+// ErrBufferExceeded means that the buffering limit was exceeded.
+var ErrBufferExceeded = errors.New("max buffer exceeded")
+
+// String returns a string representation of the TokenType.
+func (t TokenType) String() string {
+ switch t {
+ case ErrorToken:
+ return "Error"
+ case TextToken:
+ return "Text"
+ case StartTagToken:
+ return "StartTag"
+ case EndTagToken:
+ return "EndTag"
+ case SelfClosingTagToken:
+ return "SelfClosingTag"
+ case CommentToken:
+ return "Comment"
+ case DoctypeToken:
+ return "Doctype"
+ }
+ return "Invalid(" + strconv.Itoa(int(t)) + ")"
+}
+
+// An Attribute is an attribute namespace-key-value triple. Namespace is
+// non-empty for foreign attributes like xlink, Key is alphabetic (and hence
+// does not contain escapable characters like '&', '<' or '>'), and Val is
+// unescaped (it looks like "a<b" rather than "a&lt;b").
+//
+// Namespace is only used by the parser, not the tokenizer.
+type Attribute struct {
+ Namespace, Key, Val string
+}
+
+// A Token consists of a TokenType and some Data (tag name for start and end
+// tags, content for text, comments and doctypes). A tag Token may also contain
+// a slice of Attributes. Data is unescaped for all Tokens (it looks like "a<b"
+// rather than "a&lt;b"). For tag Tokens, DataAtom is the atom for Data, or
+// zero if Data is not a known tag name.
+type Token struct {
+ Type TokenType
+ DataAtom atom.Atom
+ Data string
+ Attr []Attribute
+}
+
+// tagString returns a string representation of a tag Token's Data and Attr.
+func (t Token) tagString() string {
+ if len(t.Attr) == 0 {
+ return t.Data
+ }
+ buf := bytes.NewBufferString(t.Data)
+ for _, a := range t.Attr {
+ buf.WriteByte(' ')
+ buf.WriteString(a.Key)
+ buf.WriteString(`="`)
+ escape(buf, a.Val)
+ buf.WriteByte('"')
+ }
+ return buf.String()
+}
+
+// String returns a string representation of the Token.
+func (t Token) String() string {
+ switch t.Type {
+ case ErrorToken:
+ return ""
+ case TextToken:
+ return EscapeString(t.Data)
+ case StartTagToken:
+ return "<" + t.tagString() + ">"
+ case EndTagToken:
+ return "</" + t.tagString() + ">"
+ case SelfClosingTagToken:
+ return "<" + t.tagString() + "/>"
+ case CommentToken:
+ return "<!--" + t.Data + "-->"
+ case DoctypeToken:
+ return "<!DOCTYPE " + t.Data + ">"
+ }
+ return "Invalid(" + strconv.Itoa(int(t.Type)) + ")"
+}
+
+// span is a range of bytes in a Tokenizer's buffer. The start is inclusive,
+// the end is exclusive.
+type span struct {
+ start, end int
+}
+
+// A Tokenizer returns a stream of HTML Tokens.
+type Tokenizer struct {
+ // r is the source of the HTML text.
+ r io.Reader
+ // tt is the TokenType of the current token.
+ tt TokenType
+ // err is the first error encountered during tokenization. It is possible
+ // for tt != Error && err != nil to hold: this means that Next returned a
+ // valid token but the subsequent Next call will return an error token.
+ // For example, if the HTML text input was just "plain", then the first
+ // Next call would set z.err to io.EOF but return a TextToken, and all
+ // subsequent Next calls would return an ErrorToken.
+ // err is never reset. Once it becomes non-nil, it stays non-nil.
+ err error
+ // readErr is the error returned by the io.Reader r. It is separate from
+ // err because it is valid for an io.Reader to return (n int, err1 error)
+ // such that n > 0 && err1 != nil, and callers should always process the
+ // n > 0 bytes before considering the error err1.
+ readErr error
+ // buf[raw.start:raw.end] holds the raw bytes of the current token.
+ // buf[raw.end:] is buffered input that will yield future tokens.
+ raw span
+ buf []byte
+ // maxBuf limits the data buffered in buf. A value of 0 means unlimited.
+ maxBuf int
+ // buf[data.start:data.end] holds the raw bytes of the current token's data:
+ // a text token's text, a tag token's tag name, etc.
+ data span
+ // pendingAttr is the attribute key and value currently being tokenized.
+ // When complete, pendingAttr is pushed onto attr. nAttrReturned is
+ // incremented on each call to TagAttr.
+ pendingAttr [2]span
+ attr [][2]span
+ nAttrReturned int
+ // rawTag is the "script" in "</script>" that closes the next token. If
+ // non-empty, the subsequent call to Next will return a raw or RCDATA text
+ // token: one that treats "<p>" as text instead of an element.
+ // rawTag's contents are lower-cased.
+ rawTag string
+ // textIsRaw is whether the current text token's data is not escaped.
+ textIsRaw bool
+ // convertNUL is whether NUL bytes in the current token's data should
+ // be converted into \ufffd replacement characters.
+ convertNUL bool
+ // allowCDATA is whether CDATA sections are allowed in the current context.
+ allowCDATA bool
+}
+
+// AllowCDATA sets whether or not the tokenizer recognizes <![CDATA[foo]]> as
+// the text "foo". The default value is false, which means to recognize it as
+// a bogus comment "<!-- [CDATA[foo]] -->" instead.
+//
+// Strictly speaking, an HTML5 compliant tokenizer should allow CDATA if and
+// only if tokenizing foreign content, such as MathML and SVG. However,
+// tracking foreign-contentness is difficult to do purely in the tokenizer,
+// as opposed to the parser, due to HTML integration points: an <svg> element
+// can contain a <foreignObject> that is foreign-to-SVG but not foreign-to-
+// HTML. For strict compliance with the HTML5 tokenization algorithm, it is the
+// responsibility of the user of a tokenizer to call AllowCDATA as appropriate.
+// In practice, if using the tokenizer without caring whether MathML or SVG
+// CDATA is text or comments, such as tokenizing HTML to find all the anchor
+// text, it is acceptable to ignore this responsibility.
+func (z *Tokenizer) AllowCDATA(allowCDATA bool) {
+ z.allowCDATA = allowCDATA
+}
+
+// NextIsNotRawText instructs the tokenizer that the next token should not be
+// considered as 'raw text'. Some elements, such as script and title elements,
+// normally require the next token after the opening tag to be 'raw text' that
+// has no child elements. For example, tokenizing "<title>a<b>c</b>d</title>"
+// yields a start tag token for "<title>", a text token for "a<b>c</b>d", and
+// an end tag token for "</title>". There are no distinct start tag or end tag
+// tokens for the "<b>" and "</b>".
+//
+// This tokenizer implementation will generally look for raw text at the right
+// times. Strictly speaking, an HTML5 compliant tokenizer should not look for
+// raw text if in foreign content: <title> generally needs raw text, but a
+// <title> inside an <svg> does not. Another example is that a <textarea>
+// generally needs raw text, but a <textarea> is not allowed as an immediate
+// child of a <select>; in normal parsing, a <textarea> implies </select>, but
+// one cannot close the implicit element when parsing a <select>'s InnerHTML.
+// Similarly to AllowCDATA, tracking the correct moment to override raw-text-
+// ness is difficult to do purely in the tokenizer, as opposed to the parser.
+// For strict compliance with the HTML5 tokenization algorithm, it is the
+// responsibility of the user of a tokenizer to call NextIsNotRawText as
+// appropriate. In practice, like AllowCDATA, it is acceptable to ignore this
+// responsibility for basic usage.
+//
+// Note that this 'raw text' concept is different from the one offered by the
+// Tokenizer.Raw method.
+func (z *Tokenizer) NextIsNotRawText() {
+ z.rawTag = ""
+}
+
+// Err returns the error associated with the most recent ErrorToken token.
+// This is typically io.EOF, meaning the end of tokenization.
+func (z *Tokenizer) Err() error {
+ if z.tt != ErrorToken {
+ return nil
+ }
+ return z.err
+}
+
+// readByte returns the next byte from the input stream, doing a buffered read
+// from z.r into z.buf if necessary. z.buf[z.raw.start:z.raw.end] remains a contiguous byte
+// slice that holds all the bytes read so far for the current token.
+// It sets z.err if the underlying reader returns an error.
+// Pre-condition: z.err == nil.
+func (z *Tokenizer) readByte() byte {
+ if z.raw.end >= len(z.buf) {
+ // Our buffer is exhausted and we have to read from z.r. Check if the
+ // previous read resulted in an error.
+ if z.readErr != nil {
+ z.err = z.readErr
+ return 0
+ }
+ // We copy z.buf[z.raw.start:z.raw.end] to the beginning of z.buf. If the length
+ // z.raw.end - z.raw.start is more than half the capacity of z.buf, then we
+ // allocate a new buffer before the copy.
+ c := cap(z.buf)
+ d := z.raw.end - z.raw.start
+ var buf1 []byte
+ if 2*d > c {
+ buf1 = make([]byte, d, 2*c)
+ } else {
+ buf1 = z.buf[:d]
+ }
+ copy(buf1, z.buf[z.raw.start:z.raw.end])
+ if x := z.raw.start; x != 0 {
+ // Adjust the data/attr spans to refer to the same contents after the copy.
+ z.data.start -= x
+ z.data.end -= x
+ z.pendingAttr[0].start -= x
+ z.pendingAttr[0].end -= x
+ z.pendingAttr[1].start -= x
+ z.pendingAttr[1].end -= x
+ for i := range z.attr {
+ z.attr[i][0].start -= x
+ z.attr[i][0].end -= x
+ z.attr[i][1].start -= x
+ z.attr[i][1].end -= x
+ }
+ }
+ z.raw.start, z.raw.end, z.buf = 0, d, buf1[:d]
+ // Now that we have copied the live bytes to the start of the buffer,
+ // we read from z.r into the remainder.
+ var n int
+ n, z.readErr = readAtLeastOneByte(z.r, buf1[d:cap(buf1)])
+ if n == 0 {
+ z.err = z.readErr
+ return 0
+ }
+ z.buf = buf1[:d+n]
+ }
+ x := z.buf[z.raw.end]
+ z.raw.end++
+ if z.maxBuf > 0 && z.raw.end-z.raw.start >= z.maxBuf {
+ z.err = ErrBufferExceeded
+ return 0
+ }
+ return x
+}
+
+// Buffered returns a slice containing data buffered but not yet tokenized.
+func (z *Tokenizer) Buffered() []byte {
+ return z.buf[z.raw.end:]
+}
+
+// readAtLeastOneByte wraps an io.Reader so that reading cannot return (0, nil).
+// It returns io.ErrNoProgress if the underlying r.Read method returns (0, nil)
+// too many times in succession.
+func readAtLeastOneByte(r io.Reader, b []byte) (int, error) {
+ for i := 0; i < 100; i++ {
+ if n, err := r.Read(b); n != 0 || err != nil {
+ return n, err
+ }
+ }
+ return 0, io.ErrNoProgress
+}
+
+// skipWhiteSpace skips past any white space.
+func (z *Tokenizer) skipWhiteSpace() {
+ if z.err != nil {
+ return
+ }
+ for {
+ c := z.readByte()
+ if z.err != nil {
+ return
+ }
+ switch c {
+ case ' ', '\n', '\r', '\t', '\f':
+ // No-op.
+ default:
+ z.raw.end--
+ return
+ }
+ }
+}
+
+// readRawOrRCDATA reads until the next "</foo>", where "foo" is z.rawTag and
+// is typically something like "script" or "textarea".
+func (z *Tokenizer) readRawOrRCDATA() {
+ if z.rawTag == "script" {
+ z.readScript()
+ z.textIsRaw = true
+ z.rawTag = ""
+ return
+ }
+loop:
+ for {
+ c := z.readByte()
+ if z.err != nil {
+ break loop
+ }
+ if c != '<' {
+ continue loop
+ }
+ c = z.readByte()
+ if z.err != nil {
+ break loop
+ }
+ if c != '/' {
+ z.raw.end--
+ continue loop
+ }
+ if z.readRawEndTag() || z.err != nil {
+ break loop
+ }
+ }
+ z.data.end = z.raw.end
+ // A textarea's or title's RCDATA can contain escaped entities.
+ z.textIsRaw = z.rawTag != "textarea" && z.rawTag != "title"
+ z.rawTag = ""
+}
+
+// readRawEndTag attempts to read a tag like "</foo>", where "foo" is z.rawTag.
+// If it succeeds, it backs up the input position to reconsume the tag and
+// returns true. Otherwise it returns false. The opening "</" has already been
+// consumed.
+func (z *Tokenizer) readRawEndTag() bool {
+ for i := 0; i < len(z.rawTag); i++ {
+ c := z.readByte()
+ if z.err != nil {
+ return false
+ }
+ if c != z.rawTag[i] && c != z.rawTag[i]-('a'-'A') {
+ z.raw.end--
+ return false
+ }
+ }
+ c := z.readByte()
+ if z.err != nil {
+ return false
+ }
+ switch c {
+ case ' ', '\n', '\r', '\t', '\f', '/', '>':
+ // The 3 is 2 for the leading "</" plus 1 for the trailing character c.
+ z.raw.end -= 3 + len(z.rawTag)
+ return true
+ }
+ z.raw.end--
+ return false
+}
+
+// readScript reads until the next </script> tag, following the byzantine
+// rules for escaping/hiding the closing tag.
+func (z *Tokenizer) readScript() {
+ defer func() {
+ z.data.end = z.raw.end
+ }()
+ var c byte
+
+scriptData:
+ c = z.readByte()
+ if z.err != nil {
+ return
+ }
+ if c == '<' {
+ goto scriptDataLessThanSign
+ }
+ goto scriptData
+
+scriptDataLessThanSign:
+ c = z.readByte()
+ if z.err != nil {
+ return
+ }
+ switch c {
+ case '/':
+ goto scriptDataEndTagOpen
+ case '!':
+ goto scriptDataEscapeStart
+ }
+ z.raw.end--
+ goto scriptData
+
+scriptDataEndTagOpen:
+ if z.readRawEndTag() || z.err != nil {
+ return
+ }
+ goto scriptData
+
+scriptDataEscapeStart:
+ c = z.readByte()
+ if z.err != nil {
+ return
+ }
+ if c == '-' {
+ goto scriptDataEscapeStartDash
+ }
+ z.raw.end--
+ goto scriptData
+
+scriptDataEscapeStartDash:
+ c = z.readByte()
+ if z.err != nil {
+ return
+ }
+ if c == '-' {
+ goto scriptDataEscapedDashDash
+ }
+ z.raw.end--
+ goto scriptData
+
+scriptDataEscaped:
+ c = z.readByte()
+ if z.err != nil {
+ return
+ }
+ switch c {
+ case '-':
+ goto scriptDataEscapedDash
+ case '<':
+ goto scriptDataEscapedLessThanSign
+ }
+ goto scriptDataEscaped
+
+scriptDataEscapedDash:
+ c = z.readByte()
+ if z.err != nil {
+ return
+ }
+ switch c {
+ case '-':
+ goto scriptDataEscapedDashDash
+ case '<':
+ goto scriptDataEscapedLessThanSign
+ }
+ goto scriptDataEscaped
+
+scriptDataEscapedDashDash:
+ c = z.readByte()
+ if z.err != nil {
+ return
+ }
+ switch c {
+ case '-':
+ goto scriptDataEscapedDashDash
+ case '<':
+ goto scriptDataEscapedLessThanSign
+ case '>':
+ goto scriptData
+ }
+ goto scriptDataEscaped
+
+scriptDataEscapedLessThanSign:
+ c = z.readByte()
+ if z.err != nil {
+ return
+ }
+ if c == '/' {
+ goto scriptDataEscapedEndTagOpen
+ }
+ if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' {
+ goto scriptDataDoubleEscapeStart
+ }
+ z.raw.end--
+ goto scriptData
+
+scriptDataEscapedEndTagOpen:
+ if z.readRawEndTag() || z.err != nil {
+ return
+ }
+ goto scriptDataEscaped
+
+scriptDataDoubleEscapeStart:
+ z.raw.end--
+ for i := 0; i < len("script"); i++ {
+ c = z.readByte()
+ if z.err != nil {
+ return
+ }
+ if c != "script"[i] && c != "SCRIPT"[i] {
+ z.raw.end--
+ goto scriptDataEscaped
+ }
+ }
+ c = z.readByte()
+ if z.err != nil {
+ return
+ }
+ switch c {
+ case ' ', '\n', '\r', '\t', '\f', '/', '>':
+ goto scriptDataDoubleEscaped
+ }
+ z.raw.end--
+ goto scriptDataEscaped
+
+scriptDataDoubleEscaped:
+ c = z.readByte()
+ if z.err != nil {
+ return
+ }
+ switch c {
+ case '-':
+ goto scriptDataDoubleEscapedDash
+ case '<':
+ goto scriptDataDoubleEscapedLessThanSign
+ }
+ goto scriptDataDoubleEscaped
+
+scriptDataDoubleEscapedDash:
+ c = z.readByte()
+ if z.err != nil {
+ return
+ }
+ switch c {
+ case '-':
+ goto scriptDataDoubleEscapedDashDash
+ case '<':
+ goto scriptDataDoubleEscapedLessThanSign
+ }
+ goto scriptDataDoubleEscaped
+
+scriptDataDoubleEscapedDashDash:
+ c = z.readByte()
+ if z.err != nil {
+ return
+ }
+ switch c {
+ case '-':
+ goto scriptDataDoubleEscapedDashDash
+ case '<':
+ goto scriptDataDoubleEscapedLessThanSign
+ case '>':
+ goto scriptData
+ }
+ goto scriptDataDoubleEscaped
+
+scriptDataDoubleEscapedLessThanSign:
+ c = z.readByte()
+ if z.err != nil {
+ return
+ }
+ if c == '/' {
+ goto scriptDataDoubleEscapeEnd
+ }
+ z.raw.end--
+ goto scriptDataDoubleEscaped
+
+scriptDataDoubleEscapeEnd:
+ if z.readRawEndTag() {
+ z.raw.end += len("</script>")
+ goto scriptDataEscaped
+ }
+ if z.err != nil {
+ return
+ }
+ goto scriptDataDoubleEscaped
+}
+
+// readComment reads the next comment token starting with "<!--". The opening
+// "<!--" has already been consumed.
+func (z *Tokenizer) readComment() {
+ z.data.start = z.raw.end
+ defer func() {
+ if z.data.end < z.data.start {
+ // It's a comment with no data, like <!-->.
+ z.data.end = z.data.start
+ }
+ }()
+ for dashCount := 2; ; {
+ c := z.readByte()
+ if z.err != nil {
+ // Ignore up to two dashes at EOF.
+ if dashCount > 2 {
+ dashCount = 2
+ }
+ z.data.end = z.raw.end - dashCount
+ return
+ }
+ switch c {
+ case '-':
+ dashCount++
+ continue
+ case '>':
+ if dashCount >= 2 {
+ z.data.end = z.raw.end - len("-->")
+ return
+ }
+ case '!':
+ if dashCount >= 2 {
+ c = z.readByte()
+ if z.err != nil {
+ z.data.end = z.raw.end
+ return
+ }
+ if c == '>' {
+ z.data.end = z.raw.end - len("--!>")
+ return
+ }
+ }
+ }
+ dashCount = 0
+ }
+}
+
+// readUntilCloseAngle reads until the next ">".
+func (z *Tokenizer) readUntilCloseAngle() {
+ z.data.start = z.raw.end
+ for {
+ c := z.readByte()
+ if z.err != nil {
+ z.data.end = z.raw.end
+ return
+ }
+ if c == '>' {
+ z.data.end = z.raw.end - len(">")
+ return
+ }
+ }
+}
+
+// readMarkupDeclaration reads the next token starting with "<!". It might be
+// a "<!--comment-->", a "<!DOCTYPE foo>", a "<![CDATA[section]]>" or
+// "<!a bogus comment". The opening "<!" has already been consumed.
+func (z *Tokenizer) readMarkupDeclaration() TokenType {
+ z.data.start = z.raw.end
+ var c [2]byte
+ for i := 0; i < 2; i++ {
+ c[i] = z.readByte()
+ if z.err != nil {
+ z.data.end = z.raw.end
+ return CommentToken
+ }
+ }
+ if c[0] == '-' && c[1] == '-' {
+ z.readComment()
+ return CommentToken
+ }
+ z.raw.end -= 2
+ if z.readDoctype() {
+ return DoctypeToken
+ }
+ if z.allowCDATA && z.readCDATA() {
+ z.convertNUL = true
+ return TextToken
+ }
+ // It's a bogus comment.
+ z.readUntilCloseAngle()
+ return CommentToken
+}
+
+// readDoctype attempts to read a doctype declaration and returns true if
+// successful. The opening "<!" has already been consumed.
+func (z *Tokenizer) readDoctype() bool {
+ const s = "DOCTYPE"
+ for i := 0; i < len(s); i++ {
+ c := z.readByte()
+ if z.err != nil {
+ z.data.end = z.raw.end
+ return false
+ }
+ if c != s[i] && c != s[i]+('a'-'A') {
+ // Back up to read the fragment of "DOCTYPE" again.
+ z.raw.end = z.data.start
+ return false
+ }
+ }
+ if z.skipWhiteSpace(); z.err != nil {
+ z.data.start = z.raw.end
+ z.data.end = z.raw.end
+ return true
+ }
+ z.readUntilCloseAngle()
+ return true
+}
+
+// readCDATA attempts to read a CDATA section and returns true if
+// successful. The opening "<!" has already been consumed.
+func (z *Tokenizer) readCDATA() bool {
+ const s = "[CDATA["
+ for i := 0; i < len(s); i++ {
+ c := z.readByte()
+ if z.err != nil {
+ z.data.end = z.raw.end
+ return false
+ }
+ if c != s[i] {
+ // Back up to read the fragment of "[CDATA[" again.
+ z.raw.end = z.data.start
+ return false
+ }
+ }
+ z.data.start = z.raw.end
+ brackets := 0
+ for {
+ c := z.readByte()
+ if z.err != nil {
+ z.data.end = z.raw.end
+ return true
+ }
+ switch c {
+ case ']':
+ brackets++
+ case '>':
+ if brackets >= 2 {
+ z.data.end = z.raw.end - len("]]>")
+ return true
+ }
+ brackets = 0
+ default:
+ brackets = 0
+ }
+ }
+}
+
+// startTagIn returns whether the start tag in z.buf[z.data.start:z.data.end]
+// case-insensitively matches any element of ss.
+func (z *Tokenizer) startTagIn(ss ...string) bool {
+loop:
+ for _, s := range ss {
+ if z.data.end-z.data.start != len(s) {
+ continue loop
+ }
+ for i := 0; i < len(s); i++ {
+ c := z.buf[z.data.start+i]
+ if 'A' <= c && c <= 'Z' {
+ c += 'a' - 'A'
+ }
+ if c != s[i] {
+ continue loop
+ }
+ }
+ return true
+ }
+ return false
+}
+
+// readStartTag reads the next start tag token. The opening "<a" has already
+// been consumed, where 'a' means anything in [A-Za-z].
+func (z *Tokenizer) readStartTag() TokenType {
+ z.readTag(true)
+ if z.err != nil {
+ return ErrorToken
+ }
+ // Several tags flag the tokenizer's next token as raw.
+ c, raw := z.buf[z.data.start], false
+ if 'A' <= c && c <= 'Z' {
+ c += 'a' - 'A'
+ }
+ switch c {
+ case 'i':
+ raw = z.startTagIn("iframe")
+ case 'n':
+ raw = z.startTagIn("noembed", "noframes", "noscript")
+ case 'p':
+ raw = z.startTagIn("plaintext")
+ case 's':
+ raw = z.startTagIn("script", "style")
+ case 't':
+ raw = z.startTagIn("textarea", "title")
+ case 'x':
+ raw = z.startTagIn("xmp")
+ }
+ if raw {
+ z.rawTag = strings.ToLower(string(z.buf[z.data.start:z.data.end]))
+ }
+ // Look for a self-closing token like "<br/>".
+ if z.err == nil && z.buf[z.raw.end-2] == '/' {
+ return SelfClosingTagToken
+ }
+ return StartTagToken
+}
+
+// readTag reads the next tag token and its attributes. If saveAttr, those
+// attributes are saved in z.attr, otherwise z.attr is set to an empty slice.
+// The opening "<a" or "</a" has already been consumed, where 'a' means anything
+// in [A-Za-z].
+func (z *Tokenizer) readTag(saveAttr bool) {
+ z.attr = z.attr[:0]
+ z.nAttrReturned = 0
+ // Read the tag name and attribute key/value pairs.
+ z.readTagName()
+ if z.skipWhiteSpace(); z.err != nil {
+ return
+ }
+ for {
+ c := z.readByte()
+ if z.err != nil || c == '>' {
+ break
+ }
+ z.raw.end--
+ z.readTagAttrKey()
+ z.readTagAttrVal()
+ // Save pendingAttr if saveAttr and that attribute has a non-empty key.
+ if saveAttr && z.pendingAttr[0].start != z.pendingAttr[0].end {
+ z.attr = append(z.attr, z.pendingAttr)
+ }
+ if z.skipWhiteSpace(); z.err != nil {
+ break
+ }
+ }
+}
+
+// readTagName sets z.data to the "div" in "<div k=v>". The reader (z.raw.end)
+// is positioned such that the first byte of the tag name (the "d" in "<div")
+// has already been consumed.
+func (z *Tokenizer) readTagName() {
+ z.data.start = z.raw.end - 1
+ for {
+ c := z.readByte()
+ if z.err != nil {
+ z.data.end = z.raw.end
+ return
+ }
+ switch c {
+ case ' ', '\n', '\r', '\t', '\f':
+ z.data.end = z.raw.end - 1
+ return
+ case '/', '>':
+ z.raw.end--
+ z.data.end = z.raw.end
+ return
+ }
+ }
+}
+
+// readTagAttrKey sets z.pendingAttr[0] to the "k" in "<div k=v>".
+// Precondition: z.err == nil.
+func (z *Tokenizer) readTagAttrKey() {
+ z.pendingAttr[0].start = z.raw.end
+ for {
+ c := z.readByte()
+ if z.err != nil {
+ z.pendingAttr[0].end = z.raw.end
+ return
+ }
+ switch c {
+ case ' ', '\n', '\r', '\t', '\f', '/':
+ z.pendingAttr[0].end = z.raw.end - 1
+ return
+ case '=', '>':
+ z.raw.end--
+ z.pendingAttr[0].end = z.raw.end
+ return
+ }
+ }
+}
+
+// readTagAttrVal sets z.pendingAttr[1] to the "v" in "<div k=v>".
+func (z *Tokenizer) readTagAttrVal() {
+ z.pendingAttr[1].start = z.raw.end
+ z.pendingAttr[1].end = z.raw.end
+ if z.skipWhiteSpace(); z.err != nil {
+ return
+ }
+ c := z.readByte()
+ if z.err != nil {
+ return
+ }
+ if c != '=' {
+ z.raw.end--
+ return
+ }
+ if z.skipWhiteSpace(); z.err != nil {
+ return
+ }
+ quote := z.readByte()
+ if z.err != nil {
+ return
+ }
+ switch quote {
+ case '>':
+ z.raw.end--
+ return
+
+ case '\'', '"':
+ z.pendingAttr[1].start = z.raw.end
+ for {
+ c := z.readByte()
+ if z.err != nil {
+ z.pendingAttr[1].end = z.raw.end
+ return
+ }
+ if c == quote {
+ z.pendingAttr[1].end = z.raw.end - 1
+ return
+ }
+ }
+
+ default:
+ z.pendingAttr[1].start = z.raw.end - 1
+ for {
+ c := z.readByte()
+ if z.err != nil {
+ z.pendingAttr[1].end = z.raw.end
+ return
+ }
+ switch c {
+ case ' ', '\n', '\r', '\t', '\f':
+ z.pendingAttr[1].end = z.raw.end - 1
+ return
+ case '>':
+ z.raw.end--
+ z.pendingAttr[1].end = z.raw.end
+ return
+ }
+ }
+ }
+}
+
+// Next scans the next token and returns its type.
+func (z *Tokenizer) Next() TokenType {
+ z.raw.start = z.raw.end
+ z.data.start = z.raw.end
+ z.data.end = z.raw.end
+ if z.err != nil {
+ z.tt = ErrorToken
+ return z.tt
+ }
+ if z.rawTag != "" {
+ if z.rawTag == "plaintext" {
+ // Read everything up to EOF.
+ for z.err == nil {
+ z.readByte()
+ }
+ z.data.end = z.raw.end
+ z.textIsRaw = true
+ } else {
+ z.readRawOrRCDATA()
+ }
+ if z.data.end > z.data.start {
+ z.tt = TextToken
+ z.convertNUL = true
+ return z.tt
+ }
+ }
+ z.textIsRaw = false
+ z.convertNUL = false
+
+loop:
+ for {
+ c := z.readByte()
+ if z.err != nil {
+ break loop
+ }
+ if c != '<' {
+ continue loop
+ }
+
+ // Check if the '<' we have just read is part of a tag, comment
+ // or doctype. If not, it's part of the accumulated text token.
+ c = z.readByte()
+ if z.err != nil {
+ break loop
+ }
+ var tokenType TokenType
+ switch {
+ case 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z':
+ tokenType = StartTagToken
+ case c == '/':
+ tokenType = EndTagToken
+ case c == '!' || c == '?':
+ // We use CommentToken to mean any of "<!--actual comments-->",
+ // "<!DOCTYPE declarations>" and "<?xml processing instructions?>".
+ tokenType = CommentToken
+ default:
+ // Reconsume the current character.
+ z.raw.end--
+ continue
+ }
+
+ // We have a non-text token, but we might have accumulated some text
+ // before that. If so, we return the text first, and return the non-
+ // text token on the subsequent call to Next.
+ if x := z.raw.end - len("<a"); z.raw.start < x {
+ z.raw.end = x
+ z.data.end = x
+ z.tt = TextToken
+ return z.tt
+ }
+ switch tokenType {
+ case StartTagToken:
+ z.tt = z.readStartTag()
+ return z.tt
+ case EndTagToken:
+ c = z.readByte()
+ if z.err != nil {
+ break loop
+ }
+ if c == '>' {
+ // "</>" does not generate a token at all. Generate an empty comment
+ // to allow passthrough clients to pick up the data using Raw.
+ // Reset the tokenizer state and start again.
+ z.tt = CommentToken
+ return z.tt
+ }
+ if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' {
+ z.readTag(false)
+ if z.err != nil {
+ z.tt = ErrorToken
+ } else {
+ z.tt = EndTagToken
+ }
+ return z.tt
+ }
+ z.raw.end--
+ z.readUntilCloseAngle()
+ z.tt = CommentToken
+ return z.tt
+ case CommentToken:
+ if c == '!' {
+ z.tt = z.readMarkupDeclaration()
+ return z.tt
+ }
+ z.raw.end--
+ z.readUntilCloseAngle()
+ z.tt = CommentToken
+ return z.tt
+ }
+ }
+ if z.raw.start < z.raw.end {
+ z.data.end = z.raw.end
+ z.tt = TextToken
+ return z.tt
+ }
+ z.tt = ErrorToken
+ return z.tt
+}
+
+// Raw returns the unmodified text of the current token. Calling Next, Token,
+// Text, TagName or TagAttr may change the contents of the returned slice.
+//
+// The token stream's raw bytes partition the byte stream (up until an
+// ErrorToken). There are no overlaps or gaps between two consecutive token's
+// raw bytes. One implication is that the byte offset of the current token is
+// the sum of the lengths of all previous tokens' raw bytes.
+func (z *Tokenizer) Raw() []byte {
+ return z.buf[z.raw.start:z.raw.end]
+}
+
+// convertNewlines converts "\r" and "\r\n" in s to "\n".
+// The conversion happens in place, but the resulting slice may be shorter.
+func convertNewlines(s []byte) []byte {
+ for i, c := range s {
+ if c != '\r' {
+ continue
+ }
+
+ src := i + 1
+ if src >= len(s) || s[src] != '\n' {
+ s[i] = '\n'
+ continue
+ }
+
+ dst := i
+ for src < len(s) {
+ if s[src] == '\r' {
+ if src+1 < len(s) && s[src+1] == '\n' {
+ src++
+ }
+ s[dst] = '\n'
+ } else {
+ s[dst] = s[src]
+ }
+ src++
+ dst++
+ }
+ return s[:dst]
+ }
+ return s
+}
+
+var (
+ nul = []byte("\x00")
+ replacement = []byte("\ufffd")
+)
+
+// Text returns the unescaped text of a text, comment or doctype token. The
+// contents of the returned slice may change on the next call to Next.
+func (z *Tokenizer) Text() []byte {
+ switch z.tt {
+ case TextToken, CommentToken, DoctypeToken:
+ s := z.buf[z.data.start:z.data.end]
+ z.data.start = z.raw.end
+ z.data.end = z.raw.end
+ s = convertNewlines(s)
+ if (z.convertNUL || z.tt == CommentToken) && bytes.Contains(s, nul) {
+ s = bytes.Replace(s, nul, replacement, -1)
+ }
+ if !z.textIsRaw {
+ s = unescape(s, false)
+ }
+ return s
+ }
+ return nil
+}
+
+// TagName returns the lower-cased name of a tag token (the `img` out of
+// `<IMG SRC="foo">`) and whether the tag has attributes.
+// The contents of the returned slice may change on the next call to Next.
+func (z *Tokenizer) TagName() (name []byte, hasAttr bool) {
+ if z.data.start < z.data.end {
+ switch z.tt {
+ case StartTagToken, EndTagToken, SelfClosingTagToken:
+ s := z.buf[z.data.start:z.data.end]
+ z.data.start = z.raw.end
+ z.data.end = z.raw.end
+ return lower(s), z.nAttrReturned < len(z.attr)
+ }
+ }
+ return nil, false
+}
+
+// TagAttr returns the lower-cased key and unescaped value of the next unparsed
+// attribute for the current tag token and whether there are more attributes.
+// The contents of the returned slices may change on the next call to Next.
+func (z *Tokenizer) TagAttr() (key, val []byte, moreAttr bool) {
+ if z.nAttrReturned < len(z.attr) {
+ switch z.tt {
+ case StartTagToken, SelfClosingTagToken:
+ x := z.attr[z.nAttrReturned]
+ z.nAttrReturned++
+ key = z.buf[x[0].start:x[0].end]
+ val = z.buf[x[1].start:x[1].end]
+ return lower(key), unescape(convertNewlines(val), true), z.nAttrReturned < len(z.attr)
+ }
+ }
+ return nil, nil, false
+}
+
+// Token returns the current Token. The result's Data and Attr values remain
+// valid after subsequent Next calls.
+func (z *Tokenizer) Token() Token {
+ t := Token{Type: z.tt}
+ switch z.tt {
+ case TextToken, CommentToken, DoctypeToken:
+ t.Data = string(z.Text())
+ case StartTagToken, SelfClosingTagToken, EndTagToken:
+ name, moreAttr := z.TagName()
+ for moreAttr {
+ var key, val []byte
+ key, val, moreAttr = z.TagAttr()
+ t.Attr = append(t.Attr, Attribute{"", atom.String(key), string(val)})
+ }
+ if a := atom.Lookup(name); a != 0 {
+ t.DataAtom, t.Data = a, a.String()
+ } else {
+ t.DataAtom, t.Data = 0, string(name)
+ }
+ }
+ return t
+}
+
+// SetMaxBuf sets a limit on the amount of data buffered during tokenization.
+// A value of 0 means unlimited.
+func (z *Tokenizer) SetMaxBuf(n int) {
+ z.maxBuf = n
+}
+
+// NewTokenizer returns a new HTML Tokenizer for the given Reader.
+// The input is assumed to be UTF-8 encoded.
+func NewTokenizer(r io.Reader) *Tokenizer {
+ return NewTokenizerFragment(r, "")
+}
+
+// NewTokenizerFragment returns a new HTML Tokenizer for the given Reader, for
+// tokenizing an existing element's InnerHTML fragment. contextTag is that
+// element's tag, such as "div" or "iframe".
+//
+// For example, how the InnerHTML "a<b" is tokenized depends on whether it is
+// for a <p> tag or a <script> tag.
+//
+// The input is assumed to be UTF-8 encoded.
+func NewTokenizerFragment(r io.Reader, contextTag string) *Tokenizer {
+ z := &Tokenizer{
+ r: r,
+ buf: make([]byte, 0, 4096),
+ }
+ if contextTag != "" {
+ switch s := strings.ToLower(contextTag); s {
+ case "iframe", "noembed", "noframes", "noscript", "plaintext", "script", "style", "title", "textarea", "xmp":
+ z.rawTag = s
+ }
+ }
+ return z
+}
diff --git a/vendor/golang.org/x/net/publicsuffix/list.go b/vendor/golang.org/x/net/publicsuffix/list.go
new file mode 100644
index 0000000..200617e
--- /dev/null
+++ b/vendor/golang.org/x/net/publicsuffix/list.go
@@ -0,0 +1,181 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//go:generate go run gen.go
+
+// Package publicsuffix provides a public suffix list based on data from
+// https://publicsuffix.org/
+//
+// A public suffix is one under which Internet users can directly register
+// names. It is related to, but different from, a TLD (top level domain).
+//
+// "com" is a TLD (top level domain). Top level means it has no dots.
+//
+// "com" is also a public suffix. Amazon and Google have registered different
+// siblings under that domain: "amazon.com" and "google.com".
+//
+// "au" is another TLD, again because it has no dots. But it's not "amazon.au".
+// Instead, it's "amazon.com.au".
+//
+// "com.au" isn't an actual TLD, because it's not at the top level (it has
+// dots). But it is an eTLD (effective TLD), because that's the branching point
+// for domain name registrars.
+//
+// Another name for "an eTLD" is "a public suffix". Often, what's more of
+// interest is the eTLD+1, or one more label than the public suffix. For
+// example, browsers partition read/write access to HTTP cookies according to
+// the eTLD+1. Web pages served from "amazon.com.au" can't read cookies from
+// "google.com.au", but web pages served from "maps.google.com" can share
+// cookies from "www.google.com", so you don't have to sign into Google Maps
+// separately from signing into Google Web Search. Note that all four of those
+// domains have 3 labels and 2 dots. The first two domains are each an eTLD+1,
+// the last two are not (but share the same eTLD+1: "google.com").
+//
+// All of these domains have the same eTLD+1:
+// - "www.books.amazon.co.uk"
+// - "books.amazon.co.uk"
+// - "amazon.co.uk"
+// Specifically, the eTLD+1 is "amazon.co.uk", because the eTLD is "co.uk".
+//
+// There is no closed form algorithm to calculate the eTLD of a domain.
+// Instead, the calculation is data driven. This package provides a
+// pre-compiled snapshot of Mozilla's PSL (Public Suffix List) data at
+// https://publicsuffix.org/
+package publicsuffix // import "golang.org/x/net/publicsuffix"
+
+// TODO: specify case sensitivity and leading/trailing dot behavior for
+// func PublicSuffix and func EffectiveTLDPlusOne.
+
+import (
+ "fmt"
+ "net/http/cookiejar"
+ "strings"
+)
+
+// List implements the cookiejar.PublicSuffixList interface by calling the
+// PublicSuffix function.
+var List cookiejar.PublicSuffixList = list{}
+
+type list struct{}
+
+func (list) PublicSuffix(domain string) string {
+ ps, _ := PublicSuffix(domain)
+ return ps
+}
+
+func (list) String() string {
+ return version
+}
+
+// PublicSuffix returns the public suffix of the domain using a copy of the
+// publicsuffix.org database compiled into the library.
+//
+// icann is whether the public suffix is managed by the Internet Corporation
+// for Assigned Names and Numbers. If not, the public suffix is either a
+// privately managed domain (and in practice, not a top level domain) or an
+// unmanaged top level domain (and not explicitly mentioned in the
+// publicsuffix.org list). For example, "foo.org" and "foo.co.uk" are ICANN
+// domains, "foo.dyndns.org" and "foo.blogspot.co.uk" are private domains and
+// "cromulent" is an unmanaged top level domain.
+//
+// Use cases for distinguishing ICANN domains like "foo.com" from private
+// domains like "foo.appspot.com" can be found at
+// https://wiki.mozilla.org/Public_Suffix_List/Use_Cases
+func PublicSuffix(domain string) (publicSuffix string, icann bool) {
+ lo, hi := uint32(0), uint32(numTLD)
+ s, suffix, icannNode, wildcard := domain, len(domain), false, false
+loop:
+ for {
+ dot := strings.LastIndex(s, ".")
+ if wildcard {
+ icann = icannNode
+ suffix = 1 + dot
+ }
+ if lo == hi {
+ break
+ }
+ f := find(s[1+dot:], lo, hi)
+ if f == notFound {
+ break
+ }
+
+ u := nodes[f] >> (nodesBitsTextOffset + nodesBitsTextLength)
+ icannNode = u&(1<<nodesBitsICANN-1) != 0
+ u >>= nodesBitsICANN
+ u = children[u&(1<<nodesBitsChildren-1)]
+ lo = u & (1<<childrenBitsLo - 1)
+ u >>= childrenBitsLo
+ hi = u & (1<<childrenBitsHi - 1)
+ u >>= childrenBitsHi
+ switch u & (1<<childrenBitsNodeType - 1) {
+ case nodeTypeNormal:
+ suffix = 1 + dot
+ case nodeTypeException:
+ suffix = 1 + len(s)
+ break loop
+ }
+ u >>= childrenBitsNodeType
+ wildcard = u&(1<<childrenBitsWildcard-1) != 0
+ if !wildcard {
+ icann = icannNode
+ }
+
+ if dot == -1 {
+ break
+ }
+ s = s[:dot]
+ }
+ if suffix == len(domain) {
+ // If no rules match, the prevailing rule is "*".
+ return domain[1+strings.LastIndex(domain, "."):], icann
+ }
+ return domain[suffix:], icann
+}
+
+const notFound uint32 = 1<<32 - 1
+
+// find returns the index of the node in the range [lo, hi) whose label equals
+// label, or notFound if there is no such node. The range is assumed to be in
+// strictly increasing node label order.
+func find(label string, lo, hi uint32) uint32 {
+ for lo < hi {
+ mid := lo + (hi-lo)/2
+ s := nodeLabel(mid)
+ if s < label {
+ lo = mid + 1
+ } else if s == label {
+ return mid
+ } else {
+ hi = mid
+ }
+ }
+ return notFound
+}
+
+// nodeLabel returns the label for the i'th node.
+func nodeLabel(i uint32) string {
+ x := nodes[i]
+ length := x & (1<<nodesBitsTextLength - 1)
+ x >>= nodesBitsTextLength
+ offset := x & (1<<nodesBitsTextOffset - 1)
+ return text[offset : offset+length]
+}
+
+// EffectiveTLDPlusOne returns the effective top level domain plus one more
+// label. For example, the eTLD+1 for "foo.bar.golang.org" is "golang.org".
+func EffectiveTLDPlusOne(domain string) (string, error) {
+ if strings.HasPrefix(domain, ".") || strings.HasSuffix(domain, ".") || strings.Contains(domain, "..") {
+ return "", fmt.Errorf("publicsuffix: empty label in domain %q", domain)
+ }
+
+ suffix, _ := PublicSuffix(domain)
+ if len(domain) <= len(suffix) {
+ return "", fmt.Errorf("publicsuffix: cannot derive eTLD+1 for domain %q", domain)
+ }
+ i := len(domain) - len(suffix) - 1
+ if domain[i] != '.' {
+ return "", fmt.Errorf("publicsuffix: invalid public suffix %q for domain %q", suffix, domain)
+ }
+ return domain[1+strings.LastIndex(domain[:i], "."):], nil
+}
diff --git a/vendor/golang.org/x/net/publicsuffix/table.go b/vendor/golang.org/x/net/publicsuffix/table.go
new file mode 100644
index 0000000..31a034c
--- /dev/null
+++ b/vendor/golang.org/x/net/publicsuffix/table.go
@@ -0,0 +1,10435 @@
+// generated by go run gen.go; DO NOT EDIT
+
+package publicsuffix
+
+const version = "publicsuffix.org's public_suffix_list.dat, git revision f9f612a3386dd9a1e4a1892722e3418549520b49 (2020-11-30T21:55:23Z)"
+
+const (
+ nodesBitsChildren = 10
+ nodesBitsICANN = 1
+ nodesBitsTextOffset = 15
+ nodesBitsTextLength = 6
+
+ childrenBitsWildcard = 1
+ childrenBitsNodeType = 2
+ childrenBitsHi = 14
+ childrenBitsLo = 14
+)
+
+const (
+ nodeTypeNormal = 0
+ nodeTypeException = 1
+ nodeTypeParentOnly = 2
+)
+
+// numTLD is the number of top level domains.
+const numTLD = 1513
+
+// Text is the combined text of all labels.
+const text = "9guacuiababia-goracleaningroks-theatree12hpalermomahachijolstere" +
+ "trosnubalsfjordd-dnshome-webserverdal-o-g-i-n4tatsunobihirosakik" +
+ "amijimatsuuragrocerybnikeisenbahnaturhistorisches3-ap-south-1bip" +
+ "almasfjordenikonanporovnocpalmspringsakerbirdartcenterprisecloud" +
+ "accesscambridgeiseiyoichippubetsubetsugarussiabirkenesoddtangeno" +
+ "varahkkeravjuegoshikilatironrenderbirthplacevje-og-hornnes3-webs" +
+ "ite-us-west-1bjarkoyukuhashimojin-the-bandain-vpncateringebuildi" +
+ "ngladegreextraspace-to-rentalstomakomaibarabjerkreimbamblebesbyg" +
+ "landroverhalla-speziaustevollaziobiramswatch-and-clockereviewsai" +
+ "toshimattelekommunikationatuurwetenschappengine164-baltimore-og-" +
+ "romsdalp1bjugnieznord-odalwaysdatabaseballangenkainanaejrietisal" +
+ "atinabenonicatholicaxiaskimitsubatamibugattiffanyaaarborteaches-" +
+ "yogasawara-rugbydgoszczecinemaceratabuseating-organicbcieszynino" +
+ "hekinannestadiyurihonjournalistjohninomiyakonojorpelandnpanamats" +
+ "uzakincheonirasakindianapolis-a-bloggerblackfridayusuharabloombe" +
+ "rgbauernishiazaindianmarketinglassassinationalheritagebloxcms3-w" +
+ "ebsite-us-west-2bluedagestangemologicallyngenishigoddabmoattachm" +
+ "ents5yusuisservehttpanasonichernivtsiciliabmsakyotanabellunord-f" +
+ "rontierbmwedeployuulmemsettlersalangenishiharabnrwegroweibologna" +
+ "gareyamakeupowiatmallorcafederation-webhopencraftrainingleezebom" +
+ "loabathsbchernovtsyncloudrangedalondrinamsskoganeindielddanuorri" +
+ "ndigenaklodzkodairabondigitaloceanographicsxboxenishiizunazukind" +
+ "owapblogsiteleafamilycompany-2bonnishikataketomisatomobellevuelo" +
+ "sangelesjabbottjeldsundray-dnstracebookinghosted-by-previderboom" +
+ "lair-traffic-controlleyuzawaboschaefflerdalorenskoglitcheltenham" +
+ "-radio-opensocialottebostikariyameiwamarugame-hostedpictetjmaxxx" +
+ "finitybostonakijinsekikogentappsalon-1botanicalgardenishikatsura" +
+ "git-reposaltdalottokonamegatakayamassa-carrara-massacarraramassa" +
+ "businessebykleclerchirurgiens-dentistes-en-francebotanicgardenis" +
+ "hikawazukamishihoronobeauxartsandcraftsaludrayddnsfreebox-osasco" +
+ "li-picenordlandraydnsupdaterbotanychiryukyuragifuchungbukharauma" +
+ "lborkarlsoybouncemerckmsdnipropetrovskjervoyageorgeorgiabounty-f" +
+ "ullensakerrypropertiesalvadordalibabalena-devicesalzburgliwicebo" +
+ "utiquebechitachinakagawatchandclockarmoybozen-sudtirolouvrehabme" +
+ "rbozen-suedtirolowiczest-le-patronishimerabplaceducatorahimeshim" +
+ "amateraholtalenishinomiyashironohtawaramotoineppueblockbusternii" +
+ "minamiawajikindustriabrandywinevalleybrasiliabrindisibenikimobet" +
+ "suitaipeigersundrivefsnillfjordrobaknoluoktachikawafflecellcube-" +
+ "serverbristoloseyouriparachutinglobalashovhachinohedmarkarpaczel" +
+ "adzlgloboavistanbulsan-sudtirolpusercontentjomeloyalistoragebrit" +
+ "ishcolumbialowiezaganishinoomotegomniweatherchannelubindalublind" +
+ "esnesamegawabroadcastlebtimnetzparaglidinglogoweirbroadwaybroke-" +
+ "itvedestrandrudupontariobranconakaniikawatanagurabrokerbronnoysu" +
+ "ndurbanamexhibitionishinoshimatsushigebrothermesaverdeatnulvikar" +
+ "uizawabrowsersafetymarketsamnangerbrumunddalucaniabrunelastxjava" +
+ "ld-aostarnbergloppenzaolbia-tempio-olbiatempioolbialystokkembuch" +
+ "ikumagayagawakayamagentositecnologiabrusselsampalacebruxellesams" +
+ "clubartowellbeingzonebryansklepparisor-fronishiokoppegardurhambu" +
+ "rglugsjcbnpparibaselburgmbhartipsselfiparliamentjxn--0trq7p7nnis" +
+ "hitosashimizunaminamibosogndaluccargodaddyn-o-saurlandesamsungmi" +
+ "nakamichiharabrynewhollandynathomebuiltwithdarkarumaifarmsteadyn" +
+ "dns-at-homedepotenzamamidsundyndns-at-workisboringmodellingmxn--" +
+ "11b4c3dyndns-blogdnsandnessjoenishiwakindustriesteamfamberkeleyb" +
+ "uskerudyndns-freeboxoslocus-4buzentsujiiebuzzwesteuropenairbusan" +
+ "tiquest-a-la-maisondre-landroidyndns-homednsandoybwestfalenissan" +
+ "diegomurabzhitomirumalatvuopmicrolightingretakamoriokakudamatsue" +
+ "bzzcompute-1computerhistoryofscience-fictioncomsecaaskoyabearalv" +
+ "ahkijobservableusercontentoyotsukaidocondoshichinohealth-careref" +
+ "ormitakeharaconferenceconstructionconsuladoesntexisteingeekashiw" +
+ "araconsultanthropologyconsultingrongausdalcontactoyouracontagema" +
+ "tsubaracontemporaryarteducationalchikugodogadollsapporocontracto" +
+ "rskenconventureshinodeartheworkpccwhoswhokksundyndns1cookingchan" +
+ "nelsdvrdnsdojoburgrossetouchihayaakasakawaharacoolcooperativano-" +
+ "frankivskolefrakkestadynnsardegnaroycopenhagencyclopedichonanbul" +
+ "san-suedtirolukowestus2coproductionsardiniacorporationcorsicanon" +
+ "oichinomiyakecorvettemp-dnsarlcosenzakopanelastycoffeedbackplane" +
+ "applinzinzais-a-candidatecosidnsfor-better-thanawatchesarpsborgr" +
+ "oundhandlingroznynysaintlouis-a-anarchistoireggio-emilia-romagna" +
+ "katombetsumitakagiizecostumedicinagatorodoycouchpotatofriesarufu" +
+ "tsunomiyawakasaikaitabashikaoizumizakis-a-caterercoukashiwazakiy" +
+ "okawaracouncilcouponsasayamayfirstockholmestrandynservebbsasebof" +
+ "ageologycozoracqcxn--12co0c3b4evalleaostavangercranbrookuwanalyt" +
+ "icsaskatchewancrdynuniversitycreditcardynv6creditunioncremonashg" +
+ "abadaddjaguarqhachiojiyaizuwakamatsubushikusakadogawacrewiencric" +
+ "ketrzyncrimeast-kazakhstanangercrotonexus-3crownipartsassaris-a-" +
+ "celticsfancrsvps-hostrolekagoshimalopolskanlandynvpnpluscountrye" +
+ "stateofdelawareclaimsaudacruisesauheradyroyrvikingrpartycryptono" +
+ "michigangwoncuisinellajollamericanexpressexyculturalcentertainme" +
+ "ntoystre-slidrettozawacuneocupcakecuritibaghdadcurvalled-aostave" +
+ "rncymrunjargacyonabarumetacentrumeteorappasadenarashinocyouthruh" +
+ "erecifedexeterferrarivneferrerotikakamigaharafetsundfguidell-ogl" +
+ "iastraderfhskydivinguitarsavonarusawafhvalerfidontexistmein-iser" +
+ "vebeerfieldfigueresinstagingujoinvilleirvikasserversaillesaxofil" +
+ "ateliafilegear-audnedalnfilegear-debianfilegear-gbizfilegear-ief" +
+ "ilegear-jpmorganfilegear-sg-1filminamifuranofinalfinancefinearts" +
+ "choenbrunnfinlandfinnoyfirebaseappassagenschokokekschokoladenfir" +
+ "enetrani-andria-barletta-trani-andriafirenzefirestonefirmdalegni" +
+ "capetownnews-stagingulenfishingoldpoint2thisamitsukefitjarvodkaf" +
+ "jordvagsoygardenflfanquanpachigasakievennodesabaerobaticketschol" +
+ "arshipschoolsztynsettsurgeonshalloffameldalfitnessettlementrania" +
+ "ndriabarlettatraniandriafjalerflesbergunmansionschulezajskasukab" +
+ "edzin-berlindasdaburflickragerogerschulserverflightschwarzgwangj" +
+ "uifminamiiserniaflirfloginlinefloraflorencefloridatsunanjoetsuwa" +
+ "nouchikujogaszkolancashirecipescaravantaarpassenger-associationf" +
+ "loripaderbornfloristanohatajiris-a-chefashionflorokunohealthcare" +
+ "erschweizflowersciencecentersciencehistoryfltranoyflynnhosting-c" +
+ "lusterfndfnwkasumigaurayasudafoodnetworkdalfor-ourfor-somedizinh" +
+ "istorischescientistordalfor-theaterforexrothachirogatakanabeauty" +
+ "sfjordforgotdnscjohnsonforli-cesena-forlicesenaforlikescandyn53f" +
+ "orsalegolffanscrapper-siteforsandasuoloftranslatefortalfortextil" +
+ "eikangerfortmissoulancasterfortworthadanorth-kazakhstanfosnescra" +
+ "ppinguovdageaidnunusualpersonfotaruis-a-conservativegarsheis-a-c" +
+ "padualstackasuyanaizuerichardlillesandefjordfoxafozfrancaisehara" +
+ "franziskanerimaringatlantakahamalvikaszubyfredrikstadtvscrysecur" +
+ "itytacticservehumourfreeddnsgeekgalaxyfreedesktopocznordreisa-ho" +
+ "ckeynutazurestaticappspotagerfreemasonryfreesitefreetlserveircho" +
+ "shibuyahabackyardsangomutashinainfinitintelligencefreiburgushika" +
+ "mifuranorfolkebibleitungsenfreseniusculturecreationfribourgwiddl" +
+ "eksvikatowicefriuli-v-giuliafriuli-ve-giuliafriuli-vegiuliafriul" +
+ "i-venezia-giuliafriuli-veneziagiuliafriuli-vgiuliafriuliv-giulia" +
+ "friulive-giuliafriulivegiuliafriulivenezia-giuliafriuliveneziagi" +
+ "uliafriulivgiuliafrlfroganserveminecraftransportefrognfrolandfro" +
+ "m-akrehamnfrom-alfrom-arfrom-azurewebsiteshikagamiishibukawalbrz" +
+ "ycharternopilawalesundfrom-capitalonewjerseyfrom-cogxn--1ctwolom" +
+ "inamatargitlaborfrom-ctransurlfrom-dchoyodobashichikashukujitawa" +
+ "ravennagasakinderoyfrom-dedyn-berlincolnfrom-flanderservemp3from" +
+ "-gaulardalfrom-hichisochildrensgardenfrom-iafrom-idfrom-ilfrom-i" +
+ "n-brbar1from-kservep2patriafrom-kyowariasahikawafrom-lanciafrom-" +
+ "mamurogawafrom-mdfrom-meeresistancefrom-mifunefrom-mnfrom-modale" +
+ "nfrom-mservepicservequakefrom-mtnfrom-nctulangevagrigentomologye" +
+ "onggiehtavuoatnabudapest-a-la-masion-rancherkasydneyfrom-ndfrom-" +
+ "nefrom-nh-serveblogspotrapaniizafrom-njservesarcasmatartanddesig" +
+ "nfrom-nminamiizukaminoyamaxunispacefrom-nvalledaostaobaomoriguch" +
+ "iharag-cloud-charitychyattorneyagawakepnogatagajobojis-a-cubicle" +
+ "-slavellinodeobjectservicesevastopolefrom-nyminamimakis-a-democr" +
+ "atravelchannelfrom-ohdattorelayfrom-oketogurafrom-orfrom-padovak" +
+ "sdalfrom-pratohmandalfrom-ris-a-designerfrom-schmidtre-gauldalfr" +
+ "om-sdfrom-tnfrom-txn--1lqs03nfrom-utsiracusagamiharafrom-val-dao" +
+ "stavalleyfrom-vtravelersinsurancefrom-wafrom-wiardwebredirectmee" +
+ "trdfrom-wvallee-aosteroyfrom-wyfrosinonefrostalowa-wolawafroyait" +
+ "akaharunzenfstcgroupaviancarrierfujiiderafujikawaguchikonefujimi" +
+ "nokamoenairguardiannakadomarinebraskaunicommbankatsushikabeelden" +
+ "geluidvallee-d-aosteigenfujinomiyadattowebcampinashikiminohostfo" +
+ "ldnavyfujiokayamangonohejis-a-doctorayfujisatoshonairlinedre-eik" +
+ "erfujisawafujishiroishidakabiratoridefenseljordfujitsurugashiman" +
+ "gyshlakasamatsudoomdnsiskinkyotobetsumidatlantichristiansburgrim" +
+ "stadyndns-mailutskashibatakatorinternationalfirearmsanjotlon-2fu" +
+ "jixeroxfordefinimakanegasakinkobierzycefujiyoshidavvenjargap-nor" +
+ "theast-3fukayabeatsevenassisicilyfukuchiyamadavvesiidappnodebala" +
+ "ncertificationfukudomigawafukuis-a-financialadvisor-aurdalfukumi" +
+ "tsubishigakirovogradoyfukuokazakiryuohkurafukuroishikarikaturind" +
+ "alfukusakisarazure-mobileirfjordfukuyamagatakahashimamakishiwada" +
+ "zaifudaigojomedio-campidano-mediocampidanomediofunabashiriuchina" +
+ "dafunagatakahatakaishimoichinosekigaharafunahashikamiamakusatsum" +
+ "asendaisennangooglecodespotrendhostingfundaciofunkfeuerfuoiskuju" +
+ "kuriyamaniwakuratefuosskoczowiiheyakumoduminamiminowafurnituregg" +
+ "io-calabriafurubirafurudonostiaafurukawairportland-4-salernobori" +
+ "betsucksharis-a-geekatsuyamarumorimachidafusodegaurafussaikisofu" +
+ "kushimannore-og-uvdalfutabayamaguchinomihachimanagementrentin-su" +
+ "d-tirolfutboldlygoingnowhere-for-morenakasatsunairtelebitbridges" +
+ "toneendoftheinternethnologyfuttsurugimperiafuturecmsharpfizerfut" +
+ "urehostingfuturemailingfvgfyresdalhangglidinghangoutsystemscloud" +
+ "hannanmokuizumodenakayamanxn--1lqs71dhannortonhanyuzenhapmirclou" +
+ "dplatform0harstadharvestcelebrationhasamaoris-a-hunterhasaminami" +
+ "-alpshimokawahashbanghasudahasura-appgfoggiahasvikautokeinotogaw" +
+ "ahatoyamazakitahiroshimapartmentshimokitayamahatsukaichikaiseihe" +
+ "ijis-a-knightpointtohobby-sitehattfjelldalhayashimamotobungotaka" +
+ "dancehazuminobusells-for-ustkanmakiwakunigamiharutwentehelsinkit" +
+ "akamiizumisanofidelitysvardonnakamuratajimidorittogliattis-a-lan" +
+ "dscaperugiahembygdsforbundhemneshimonitayanagitappharmacienshimo" +
+ "nosekikawahemsedalhepforgeherokussldheroyhgtvalleeaosteinkjerusa" +
+ "lembroideryhidorahigashiagatsumagoianiahigashichichibunkyonanaos" +
+ "himageandsoundandvisionthewifiatrentin-sued-tirolhigashihiroshim" +
+ "anehigashiizumozakitakatakaokaluganskygearappharmacyshimosuwalki" +
+ "s-a-lawyerhigashikagawahigashikagurasoedahigashikawakitaaikitaky" +
+ "ushuaiahigashikurumegurownproviderhigashimatsushimarburghigashim" +
+ "atsuyamakitaakitadaitoigawahigashimurayamamotorcycleshimotsukehi" +
+ "gashinarusells-itrentin-suedtirolhigashinehigashiomitamamurausuk" +
+ "itamihamadahigashiosakasayamanakakogawahigashishirakawamatakaraz" +
+ "ukamakurazakitamotosumy-gatewayhigashisumiyoshikawaminamiaikitan" +
+ "akagusukumodernhigashitsunosegawahigashiurawa-mazowszexnetrentin" +
+ "o-a-adigehigashiyamatokoriyamanashiibahccavuotnagaragusadocktera" +
+ "mo-siemenscaledogawarabikomaezakirunoipirangalsacentralus-2higas" +
+ "hiyodogawahigashiyoshinogaris-a-liberalhiraizumisatohnoshoooshik" +
+ "amaishimofusartshimotsumahirakatashinagawahiranairtrafficplexus-" +
+ "1hirarahiratsukaeruhirayakagehistorichouseshinichinanhitachiomiy" +
+ "agildeskaliszhitachiotagoppdalhitraeumtgeradeloittenrissagaerocl" +
+ "ubmedecincinnationwidealstahaugesunderseaportsinfolionetworkange" +
+ "rhjartdalhjelmelandholeckochikushinonsenergyholidayhomegoodshinj" +
+ "ournalismailillehammerfeste-iphdfcbankazoologyhomeiphiladelphiaa" +
+ "readmyblogsytehomelinkyard-cloudnshinjukumanowruzhgorodeohomelin" +
+ "uxn--1qqw23ahomeofficehomesecuritymacaparecidahomesecuritypchris" +
+ "tmaseratiresannanisshingucciprianidyndns-office-on-the-weberhome" +
+ "senseeringhomeunixn--2m4a15ehondahongotembaixadahonjyoitakasagot" +
+ "pantheonsitehornindalhorsellsyourhomeftphilatelyhortendofinterne" +
+ "t-dnshinkamigototalhospitalhoteleshinshinotsurgeryhotmailhoyange" +
+ "rhoylandetroitskypehumanitieshinshirohurdalhurumajis-a-libertari" +
+ "anhyllestadhyogoris-a-linux-usershintokushimahyugawarahyundaiwaf" +
+ "uneis-very-badajozis-a-nursembokukitchenis-very-evillageis-very-" +
+ "goodyearis-very-niceis-very-sweetpepperis-with-thebandovre-eiker" +
+ "isleofmanaustdaljenv-arubabizjeonnamerikawauejetztrentino-stirol" +
+ "jevnakershusdecorativeartshiranukamitondabayashiogamagoriziajewe" +
+ "lryjewishartgalleryjfkddiamondshiraois-a-painterhostsolutionshin" +
+ "tomikasaharajgorajlljls-sto1jls-sto2jls-sto3jmphonefosshiraokami" +
+ "tsuejnjaworznotairestaurantrentino-s-tiroljoyentrentino-sud-tiro" +
+ "ljoyokaichibajddarchitecturealtorlandjpnjprshiratakahagithubuser" +
+ "contentrentino-sudtiroljurkosaigawakosakaerodromegallupinbarclay" +
+ "cards3-sa-east-1koseis-a-photographerokuapphilipsynology-disksta" +
+ "tionkosherbrookegawakoshimizumakiyosemitekoshunantankhakassiakos" +
+ "ugekotohiradomainsureggioemiliaromagnamsosnowiechurchaseljedugit" +
+ "-pagespeedmobilizeroticahcesuoloansanokashiharakotourakouhokutam" +
+ "akiyosunndalkounosupplieshitaramakouyamashikekouzushimashikizuno" +
+ "kunimilitarykozagawakozakis-a-playershifteditchyouriphoenixn--2s" +
+ "crj9chromedicaltanissettaishinomakindlecznagasukekozowildlifesty" +
+ "lekpnkppspdnshizukuishimogosenkrasnikahokutokashikis-a-republica" +
+ "ncerresearchaeologicaliforniakrasnodarkredstonekristiansandcatsh" +
+ "izuokamogawakristiansundkrodsheradkrokstadelvaldaostarostwodzisl" +
+ "awilliamhillkryminamioguni5kumatorinowtvaporcloudkumejimasoykume" +
+ "nantokigawakunisakis-a-rockstarachowicekunitachiarailwaykunitomi" +
+ "gusukumamotoyamashikokuchuokunneppubtlshoppingkunstsammlungkunst" +
+ "unddesignkuokgrouphxn--32vp30haebaruericssongdalenviknakatsugawa" +
+ "kuregruhostingkurgankurobelaudibleasingleshopwarendalenugkurogim" +
+ "imatakatsukis-a-socialistdlibestadkuroisoftwarezzokuromatsunais-" +
+ "a-soxfankurotakikawasakis-a-studentalkushirogawakustanais-a-teac" +
+ "herkassyno-dshinyoshitomiokamisunagawakusupplynxn--3bst00minamis" +
+ "anrikubetsupportrentino-sued-tirolkutchanelveruminamitanekutnoku" +
+ "zumakis-a-techietis-a-llamarnardalkvafjordkvalsundkvamlidlugolek" +
+ "adenagahamaroyerkvanangenkvinesdalkvinnheradkviteseidatingkvitso" +
+ "ykwpspectruminamiuonumassivegridkzmisconfusedmishimasudamissilel" +
+ "uxembourgmisugitokorozawamitourismilevangermitoyoakemiuramiyazur" +
+ "econtainerdpolicemiyotamanomjondalenmlbfanmontrealestatefarmequi" +
+ "pmentrentino-suedtirolmonza-brianzapposhoujis-an-actresshioyande" +
+ "xcloudmonza-e-della-brianzaptokuyamatsumaebashimodatemonzabrianz" +
+ "aramonzaebrianzamonzaedellabrianzamoonscaleforcemordoviamoriyama" +
+ "tsumotofukemoriyoshiminamiashigaramormonstermoroyamatsunomortgag" +
+ "emoscowinbarclays3-us-east-2moseushistorymosjoenmoskeneshowamoss" +
+ "howtimelhusgardenmosvikharkovanylvenicemoteginowaniigatakamatsuk" +
+ "awamoviemovimientokyotangotsukisosakitagawamozilla-iotrentinoa-a" +
+ "digemtranbymuginozawaonsenmuikamiokameokameyamatotakadamukoebenh" +
+ "avnmulhouseoullensvanguardmunakatanemuncienciamuosattemupiemonte" +
+ "murmanskhersonmurotorcraftrentinoaadigemusashimurayamatsusakahog" +
+ "inankokubunjis-an-anarchistoricalsocietymusashinoharamuseetrenti" +
+ "noalto-adigemuseumverenigingmusicarrdmutsuzawamy-vigorgemy-wangg" +
+ "ouvicircustomer-ocimdbananarepublic66myactivedirectorymyasustor-" +
+ "elvdalmycdn77-sslattuminamiyamashirokawanabelembetsukubankharkiv" +
+ "alleedaostemycloudswitcheshwindmillmydattolocalhistorymyddnsking" +
+ "mydissentrentinoaltoadigemydobisshikis-an-artistgorymydroboehrin" +
+ "gerikemydsienarutolgamyeffectrentinos-tirolmyfastblogermyfirewal" +
+ "lonieruchomoscienceandindustrynmyforuminanomyfritzmyftpaccessigd" +
+ "almyhome-servermyjinomykolaivareservegame-servermymailermymediap" +
+ "cistrondheimmobilieniyodogawamyokohamamatsudamypepilotsilkhmelni" +
+ "tskiyamarylandmypetsimple-urlmyphotoshibalatinombresciamypicture" +
+ "sirdalmypsxn--3ds443gmysecuritycamerakermyshopblockslupskhmelnyt" +
+ "skyivaomythic-beastslzmytis-a-bookkeeperspectakashimaritimoldelt" +
+ "aiwanairforcebetsuikidsmynasushiobarackmazerbaijan-mayen-rootari" +
+ "beiraogashimadachicagoboatsmolapymntrentinostirolmytuleaprendema" +
+ "sakihokumakogenebakkeshibechambagriculturennebudejjuedischesapea" +
+ "kebayernrtrentinosud-tirolmyvncitadeliverydyndns-remotewdyndns-s" +
+ "erverisignmywireitrentinosudtirolpklabudhabikinokawabarthadselec" +
+ "trentin-sudtirolplantsnoasakakinokiaplatformshangrilanxessokanag" +
+ "awaplatter-appimientakinoueplatterpinkhplaystation-cloudplazaplc" +
+ "itichocolatelevisionissayokkaichiropractichitosetogakushimotogan" +
+ "ewportkmaxxn--12c1fe0bradescotlandyndns-iparmatta-varjjatksatxn-" +
+ "-12cfi8ixb8lucerneplumbingoplurinacionalpodhaleviracloudletsoknd" +
+ "alpodlasiellaktyubinskiptveterinaireadthedocscappgafannefrankfur" +
+ "trentinosued-tirolpodzonepohlpoivronpokerpokrovskmpspbar2politic" +
+ "artoonartdecologiapolitiendapolkowicepoltavalle-aostathellewismi" +
+ "llerpomorzeszowindowskrakowinnersolarssonponpesaro-urbino-pesaro" +
+ "urbinopesaromasvuotnaritakoelnponypordenonepornporsangerporsangu" +
+ "geporsgrunnanyokoshibahikariwanumatakkofuefukihaboromskogpoznanp" +
+ "raxis-a-bruinsfanprdpreservationpresidioprgmrprimetelemarknx-ser" +
+ "versicherungprincipeprivatizehealthinsuranceprofesionalprogressi" +
+ "venneslaskerrylogisticsolognepromombetsurfastvps-serveronakanoto" +
+ "ddenpropertyprotectionprotonetrentinosuedtirolprudentialpruszkow" +
+ "iosolundbeckomaganeprvcyberlevagangaviikanonjis-an-engineeringpr" +
+ "zeworskogpulawypupioneerpvhagakhanamigawapvtrentinsud-tirolpwciv" +
+ "ilaviationpzqldqotoyohashimotoolsomaqponiatowadaqslingqualifioap" +
+ "pippugliaquickconnectrentinsudtirolquicksytestingquipelementsomn" +
+ "arviikamisatokaizukamikitayamatsuris-an-entertainerqvcivilisatio" +
+ "nsveiosvelvikomforbarcelonagawalmartattoolforgebinagisoccertmgra" +
+ "zimuthatogayachimataiji234lima-cityeatselinogradultateshinanomac" +
+ "himkentateyamaetnaamesjevuemielno-ipifony-1svizzerasvn-reposor-v" +
+ "arangerswidnicasadelamonedapliernewmexicodyn-vpndnsorfoldswidnik" +
+ "kokonoeswiebodzin-butterswiftcoverswinoujscienceandhistoryswissm" +
+ "arterthanyousynology-dsorocabalestrandabergamoareketunkommunalfo" +
+ "rbundturystykaniepcetuscanytushuissier-justicetuvalle-daostatics" +
+ "oundcastronomy-routertuxfamilytwmailvestre-slidreplantationvestr" +
+ "e-totennishiawakuravestvagoyvevelstadvibo-valentiavibovalentiavi" +
+ "deovillasouthwest1-uslivinghistoryvinnicaseihicampobassociatest-" +
+ "iservecounterstrikevinnytsiavipsinaappittsburghofficialvirginiav" +
+ "irtual-userveexchangevirtualcloudvirtualservervirtualuserveftpiw" +
+ "atevirtueeldomein-vigorlicevirtuelvisakegawaviterboknowsitallviv" +
+ "olkenkundenvixn--3hcrj9clanbibaidarmeniavlaanderenvladikavkazimi" +
+ "erz-dolnyvladimirvlogintoyonezawavminiservervologdanskommunevolv" +
+ "olkswagentsowavolyngdalvoorloperauniterois-gonevossevangenvotevo" +
+ "tingvotoyonowiwatsukiyonoshiroomgwloclawekomorotsukagawawmcloudw" +
+ "mflabspeedpartnersoownextdirectrevisohughesorreisahayakawakamiic" +
+ "hikawamisatottoris-bytomaritimekeepingworldworse-thandawowitdkom" +
+ "onow-dnshisognewpdevcloudwpenginepoweredwritesthisblogwroclawith" +
+ "googleapiszwtcircleverappsphinxn--3e0b707ewtfauskedsmokorsetagay" +
+ "aseralingenoamishirasatogokasells-for-lessavannahgawuozuwzmiuwaj" +
+ "imaxn--45q11clic20001wwwfarsundyndns-webhareidsbergentingripexn-" +
+ "-4gbriminingxn--4it168dxn--4it797kongsbergxn--4pvxs4allxn--54b7f" +
+ "ta0cclicketcloudcontrolapplicationcloud66xn--55qw42gxn--55qx5dxn" +
+ "--5js045dxn--5rtp49clinichofunatoriginstitutemasekasaokamiminers" +
+ "andvikcoromantovalle-d-aostatic-accessanfranciscofreakunemuroran" +
+ "gecloudyclusterxn--5rtq34kongsvingerxn--5su34j936bgsgxn--5tzm5gx" +
+ "n--6btw5axn--6frz82gxn--6orx2rxn--6qq986b3xlxn--7t0a264cliniquen" +
+ "oharaxn--80adxhkspjelkavikomatsushimarylhurstjordalshalsenxn--80" +
+ "ao21axn--80aqecdr1axn--80asehdbarefootballooningjerdrumckinseyol" +
+ "asitebinordre-landiscoveryggeebizenakanojohanamakinoharaustinnau" +
+ "mburggfarmerseineastasiamuneues3-ap-southeast-2ix4432-balsan-sue" +
+ "dtirolkuszczytnord-aurdalipayboltatarantours3-ap-northeast-2xn--" +
+ "80aswgxn--80augustowithyoutuberspacekitagatargetmyiphosteurxn--8" +
+ "ltr62koninjambylxn--8pvr4uxn--8y0a063axn--90a3academiamicable-mo" +
+ "democraciaxn--90aeroportalabamagasakishimabaraogakibichuoxn--90a" +
+ "ishobarakawagoexn--90azhytomyravendbargainstantcloudfunctionsncf" +
+ "dishakotanavigationavoirmcpehimejibigawaustraliamusementdllpages" +
+ "3-ca-central-1xn--9dbhblg6dietritonxn--9dbq2axn--9et52uxn--9krt0" +
+ "0axn--andy-iraxn--aroport-byaotsurreyxn--asky-iraxn--aurskog-hla" +
+ "nd-jnbarreauctionfabricagliaricoharuhrxn--avery-yuasakuhokkaidop" +
+ "aaskvollxn--b-5gaxn--b4w605ferdxn--balsan-sdtirol-nsbspreadbetti" +
+ "ngxn--bck1b9a5dre4clintonoshoesantabarbaraxn--bdddj-mrabdxn--bea" +
+ "ralvhki-y4axn--berlevg-jxaxn--bhcavuotna-s4axn--bhccavuotna-k7ax" +
+ "n--bidr-5nachikatsuuraxn--bievt-0qa2xn--bjarky-fyasakaiminatoyoo" +
+ "kaneyamazoexn--bjddar-ptarnobrzegyptianxn--blt-elabourxn--bmlo-g" +
+ "raingerxn--bod-2natalxn--bozen-sdtirol-2obanazawaxn--brnny-wuaca" +
+ "demy-firewall-gatewayxn--brnnysund-m8accident-investigation-apti" +
+ "bleadpagesquare7xn--brum-voagatroandinosaurepaircraftingvollomba" +
+ "rdiademonmouthagebostadxn--btsfjord-9zaxn--bulsan-sdtirol-nsbarr" +
+ "el-of-knowledgeappleborkaracoldwarszawaustrheimatunduhrennesoyok" +
+ "osukanraukraanghkeymachineustargardds3-eu-central-1xn--c1avgxn--" +
+ "c2br7gxn--c3s14minnesotaketakazakis-a-therapistoiaxn--cck2b3barr" +
+ "ell-of-knowledgehirnufcfanavuotnapleskns3-us-gov-west-1xn--cckwc" +
+ "xetdxn--cesena-forl-mcbremangerxn--cesenaforl-i8axn--cg4bkis-int" +
+ "o-animeinforumzxn--ciqpnxn--clchc0ea0b2g2a9gcdxn--comunicaes-v6a" +
+ "2oxn--correios-e-telecomunicaes-ghc29axn--czr694barsycenterprise" +
+ "sakikuchikuseikarugamvik-serverrankoshigayachiyodaejeonbukcoalph" +
+ "a-myqnapcloud-fr1xn--czrs0trogstadxn--czru2dxn--czrw28barsyonlin" +
+ "ewhampshirealtydalvdalaskanittedallasalleangaviikaascolipicenodu" +
+ "members3-us-west-1xn--d1acj3bashkiriauthordalandgcapebretonamicr" +
+ "osoftbank12xn--d1alfaromeoxn--d1atromsakatamayufuelblagrarchaeol" +
+ "ogyeongbuk0xn--d5qv7z876clothingdustdataitogitsuldalvivanovoldax" +
+ "n--davvenjrga-y4axn--djrs72d6uyxn--djty4konskowolayangrouphotogr" +
+ "aphysioxn--dnna-grajewolterskluwerxn--drbak-wuaxn--dyry-iraxn--e" +
+ "1a4cn-northwest-1xn--eckvdtc9dxn--efvn9spydebergxn--efvy88haibar" +
+ "akitahatakanezawaxn--ehqz56nxn--elqq16hair-surveillancexn--eveni" +
+ "-0qa01gaxn--f6qx53axn--fct429konsulatrobeepilepsykkylvenetodayxn" +
+ "--fhbeiarnxn--finny-yuaxn--fiq228c5hsrlxn--fiq64basicservercelli" +
+ "guriautomotiveconomiasakuchinotsuchiurakawakuyabukikonaikawachin" +
+ "aganoharamcoachampionshiphoptobamadridnbloggerevistaples3-eu-wes" +
+ "t-1xn--fiqs8srvarggatrentinsuedtirolxn--fiqz9storegontrailroadxn" +
+ "--fjord-lraxn--fjq720axn--fl-ziaxn--flor-jraxn--flw351exn--forl-" +
+ "cesena-fcbsstorfjordxn--forlcesena-c8axn--fpcrj9c3dxn--frde-gran" +
+ "drapidstorjcloud-ver-jpchungnamdalseidfjordyndns-picsannohelplfi" +
+ "nancialuxuryxn--frna-woaraisaijosoyrorostpetersburgxn--frya-hrax" +
+ "n--fzc2c9e2cngriwataraidyndns-wikiraxn--fzys8d69uvgmailxn--g2xx4" +
+ "8cnpyatigorskodjeepsondriodejaneirockartuzyxn--gckr3f0fbsbxn--1c" +
+ "k2e1bar0emmafann-arboretumbriamallamaceiobbcg12038xn--gecrj9cnsa" +
+ "ntacruzsewhalingroks-thisayamanobeokalmykiaxn--ggaviika-8ya47hak" +
+ "atanorthwesternmutualxn--gildeskl-g0axn--givuotna-8yasugitpagefr" +
+ "ontappixolinoxn--gjvik-wuaxn--gk3at1exn--gls-elacaixaxn--gmq050i" +
+ "s-into-carshirahamatonbetsurnadalxn--gmqw5axn--h-2failxn--h1aegh" +
+ "akodatexn--h2breg3evenestreams1xn--h2brj9c8cntoyotaparsantafedje" +
+ "ffersonxn--h3cuzk1discountysnestudioxn--hbmer-xqaxn--hcesuolo-7y" +
+ "a35basilicataniautoscanadaeguambulancechirealmpmnaval-d-aosta-va" +
+ "lleyokoteastcoastaldefenceastus2xn--hery-iraxn--hgebostad-g3axn-" +
+ "-hkkinen-5waxn--hmmrfeasta-s4accident-prevention-k3studynamische" +
+ "s-dnsopotrentinsued-tirolxn--hnefoss-q1axn--hobl-iraxn--holtlen-" +
+ "hxaxn--hpmir-xqaxn--hxt814exn--hyanger-q1axn--hylandet-54axn--i1" +
+ "b6b1a6a2exn--imr513nxn--indery-fyasuokannamihoboleslawiecolognew" +
+ "spaperxn--io0a7is-into-cartoonshirakokaminokawanishiaizubangexn-" +
+ "-j1aefbx-ostrowiechoseiroumuenchenissedaluroyxn--j1amhakonexn--j" +
+ "6w193gxn--jlq480n2rgxn--jlq61u9w7basketballfinanzgorzeleccollect" +
+ "ionayorovigovtaxihuanfshostyhostingjerstadotsuruokakegawaveroyke" +
+ "ngerdalces3-eu-west-2xn--jlster-byatominamidaitomanchesterxn--jr" +
+ "peland-54axn--jvr189mintereisenxn--k7yn95exn--karmy-yuaxn--kbrq7" +
+ "oxn--kcrx77d1x4axn--kfjord-iuaxn--klbu-woaxn--klt787dxn--kltp7dx" +
+ "n--kltx9axn--klty5xn--3oq18vl8pn36axn--koluokta-7ya57hakubahcavu" +
+ "otnagaivuotnagaokakyotambabyenglandxn--kprw13dxn--kpry57dxn--kpu" +
+ "t3is-into-gamessinazawaxn--krager-gyatsukanoyaltakasugais-leetre" +
+ "ntino-aadigexn--kranghke-b0axn--krdsherad-m8axn--krehamn-dxaxn--" +
+ "krjohka-hwab49jdevcloudjiffylkesbiblackbaudcdn-edgestackhero-net" +
+ "workinggroupaashorokanaiexn--ksnes-uuaxn--kvfjord-nxaxn--kvitsy-" +
+ "fyatsushiroxn--kvnangen-k0axn--l-1fairwindstuff-4-salexn--l1acce" +
+ "ntureklamborghinikolaeventstufftoread-booksnesor-odalxn--laheadj" +
+ "u-7yawaraxn--langevg-jxaxn--lcvr32dxn--ldingen-q1axn--leagaviika" +
+ "-52batochiokinoshimaintenanceobninskaragandavocatanzarowbq-aursk" +
+ "og-holandingdyniajudaicadaquest-mon-blogueurovision-riopretobish" +
+ "imagazinekobayashikshacknetnedalaheadjudygarlanddnslivelanddnss3" +
+ "-ap-southeast-1xn--lesund-huaxn--lgbbat1ad8jdfastlylbanzaiclouda" +
+ "ppscbgivingjemnes3-fips-us-gov-west-1xn--lgrd-poacctromsojamison" +
+ "xn--lhppi-xqaxn--linds-pramericanartrusteexn--lns-qlaquilanstutt" +
+ "gartrentoyonakagyokutoyakolobrzegersundxn--loabt-0qaxn--lrdal-sr" +
+ "axn--lrenskog-54axn--lt-liacolonialwilliamsburgrondarxn--lten-gr" +
+ "anexn--lury-iraxn--m3ch0j3axn--mely-iraxn--merker-kuaxn--mgb2dde" +
+ "susakis-certifiedunetlifyis-a-musicianxn--mgb9awbfbxostrowwlkpmg" +
+ "ruexn--mgba3a3ejtrvaroyxn--mgba3a4f16axn--mgba3a4fra1-dexn--mgba" +
+ "7c0bbn0axn--mgbaakc7dvfedorainfracloudfrontdoorxn--mgbaam7a8haku" +
+ "is-a-greenxn--mgbab2bdxn--mgbah1a3hjkrdxn--mgbai9a5eva00batsfjor" +
+ "diskussionsbereichattanooganordeste-idcasertairanzanhktcmemergen" +
+ "cyahikobeardubaiduckdns3-us-west-2xn--mgbai9azgqp6jejuniperxn--m" +
+ "gbayh7gpaleoxn--mgbbh1a71exn--mgbc0a9azcgxn--mgbca7dzdoxn--mgber" +
+ "p4a5d4a87gxn--mgberp4a5d4arxn--mgbgu82axn--mgbi4ecexposedxn--mgb" +
+ "pl2fhappouxn--mgbqly7c0a67fbcoloradoplateaudiopsysantamariakexn-" +
+ "-mgbqly7cvafr-1xn--mgbt3dhdxn--mgbtf8flatangerxn--mgbtx2bauhausp" +
+ "osts-and-telecommunicationswedeniwaizumiotsukumiyamazonawsmpplan" +
+ "etariumemorialillyombolzano-altoadigeometre-experts-comptables3-" +
+ "website-ap-northeast-1xn--mgbx4cd0abbvieeexn--mix082fedorapeople" +
+ "gallodingenxn--mix891fedoraprojectozsdeportevadsobetsulikes-pied" +
+ "monticellocalzonexn--mjndalen-64axn--mk0axin-dslgbtrycloudflarep" +
+ "bodynamic-dnsortlandxn--mk1bu44columbusheyxn--mkru45is-lostre-to" +
+ "teneis-a-nascarfanxn--mlatvuopmi-s4axn--mli-tlarvikonyvelolipopu" +
+ "sinteractivegashisuifuettertdasnetzxn--mlselv-iuaxn--moreke-juax" +
+ "n--mori-qsakuragawaxn--mosjen-eyawatahamaxn--mot-tlavagiskexn--m" +
+ "re-og-romsdal-qqbuseranishiaritakurashikis-not-certifiedxn--msy-" +
+ "ula0hakusanagochijiwadellogliastradingxn--mtta-vrjjat-k7aflaksta" +
+ "daokagakicks-assnasaarlandxn--muost-0qaxn--mxtq1misakis-an-accou" +
+ "ntantshiojirishirifujiedaxn--ngbc5azdxn--ngbe9e0axn--ngbrxn--3px" +
+ "u8komvuxn--30rr7yxn--nit225kooris-a-personaltrainerxn--nmesjevue" +
+ "mie-tcbalsan-sudtirollagdenesnaaseinet-freaksusonoxn--nnx388axn-" +
+ "-nodessakurais-savedxn--nqv7fs00emaxn--nry-yla5gxn--ntso0iqx3axn" +
+ "--ntsq17gxn--nttery-byaeservehalflifeinsurancexn--nvuotna-hwaxn-" +
+ "-nyqy26axn--o1achernihivgubsuzakananiikappuboliviajessheimpertri" +
+ "xcdn77-secureggiocalabriaxn--o3cw4haldenxn--o3cyx2axn--od0algxn-" +
+ "-od0aq3beneventoeidskoguchikuzenvironmentalconservationionjukudo" +
+ "yamaizuruovat-band-campaniavoues3-eu-west-3utilities-1kappchizip" +
+ "6116-b-datacentermezgorabogadobeaemcloud-dealerimo-i-rana4u2-loc" +
+ "alhostrodawarabruzzoologicalvinklein-addrammenuorochestereport3l" +
+ "3p0rtashkentatamotors3-ap-northeast-1337xn--ogbpf8flekkefjordxn-" +
+ "-oppegrd-ixaxn--ostery-fyaxn--osyro-wuaxn--otu796dxn--p1acfeiraq" +
+ "uarelleaseeklogesaveincloudxn--p1ais-slickazteleportlligatrentin" +
+ "o-alto-adigexn--pgbs0dhlxn--porsgu-sta26fermochizukirkenesaves-t" +
+ "he-whalessandria-trani-barletta-andriatranibarlettaandriaxn--pss" +
+ "u33lxn--pssy2uxn--q9jyb4communewyorkshirebungoonordkappartintuit" +
+ "oyotomiyazakinuyamashinatsukigatakasakitauraxn--qcka1pmcdirxn--q" +
+ "qqt11misasaguris-an-actorxn--qxa6axn--qxamsterdamnserverbaniaxn-" +
+ "-rady-iraxn--rdal-poaxn--rde-ulavangenxn--rdy-0nabaris-uberleetr" +
+ "entino-altoadigexn--rennesy-v1axn--rhkkervju-01aferraraxn--rholt" +
+ "-mragowoodsidevelopmentrysiljanxn--rhqv96gxn--rht27zxn--rht3dxn-" +
+ "-rht61exn--risa-5nativeamericanantiquesuzukanazawaxn--risr-iraxn" +
+ "--rland-uuaxn--rlingen-mxaxn--rmskog-byaxn--rny31halsaitamatsuku" +
+ "ris-a-gurusrcfastly-terrariuminamiechizenxn--rovu88bentleyomitan" +
+ "observerxn--rros-granvindafjordxn--rskog-uuaxn--rst-0naturalhist" +
+ "orymuseumcenterxn--rsta-franamizuholdingsmall-webhostingxn--rvc1" +
+ "e0am3exn--ryken-vuaxn--ryrvik-byaxn--s-1faithammarfeastafricarbo" +
+ "nia-iglesias-carboniaiglesiascarboniaxn--s9brj9community-prochow" +
+ "icexn--sandnessjen-ogbeppublishproxyzjampagexlimanowarudaxarnetf" +
+ "lixilovecollegefantasyleaguernseyokozeatonsbergivestbytemarkanza" +
+ "kiwielunnerhcloudiscourses3-external-1xn--sandy-yuaxn--sdtirol-n" +
+ "2axn--seral-lraxn--ses554gxn--sgne-graphoxn--42c2d9axn--skierv-u" +
+ "tazasuzukis-foundationxn--skjervy-v1axn--skjk-soaxn--sknit-yqaxn" +
+ "--sknland-fxaxn--slat-5naturalsciencesnaturellesvalbardunloppaci" +
+ "ficivilizationxn--slt-elabcn-north-1xn--smla-hraxn--smna-gratang" +
+ "entlentapisa-geekopervikfh-muensterxn--snase-nraxn--sndre-land-0" +
+ "cbeskidyn-ip24xn--snes-poaxn--snsa-roaxn--sr-aurdal-l8axn--sr-fr" +
+ "on-q1axn--sr-odal-q1axn--sr-varanger-ggbestbuyshouses3-website-a" +
+ "p-southeast-1xn--srfold-byaxn--srreisa-q1axn--srum-gratis-a-bull" +
+ "s-fanxn--stfold-9xaxn--stjrdal-s1axn--stjrdalshalsen-sqbetainabo" +
+ "xfusejnyanagawaltervistaikikugawashingtondclk3xn--stre-toten-zcb" +
+ "hzcasinorddalimitedisrechtranaharimalselvendrellimoliseminempres" +
+ "ashibetsukuibmdivtasvuodnakaiwamizawaweddingjesdalivornoceanogra" +
+ "phiquemrxn--t60b56axn--tckwebspacexn--tiq49xqyjelasticbeanstalka" +
+ "zunotteroyxn--tjme-hraxn--tn0agrinetbankoryokamikawanehonbetsuru" +
+ "taharaxn--tnsberg-q1axn--tor131oxn--trany-yuaxn--trentin-sd-tiro" +
+ "l-rzbieidsvollombardynaliasnesoddenmarkhangelskjakdnepropetrovsk" +
+ "iervaapsteiermarkarasjohkamikoaniihamatamakawajimarriottcp4xn--t" +
+ "rentin-sdtirol-7vbrplsbxn--45br5cylxn--trentino-sd-tirol-c3biela" +
+ "washtenawdev-myqnapcloudcontrolledekagaminogifts3-website-ap-sou" +
+ "theast-2xn--trentino-sdtirol-szbiellaakesvuemielecceu-1xn--trent" +
+ "inosd-tirol-rzbieszczadygeyachts3-website-eu-west-1xn--trentinos" +
+ "dtirol-7vbievathletajimabaridagawakkanaibetsubamericanfamilydscl" +
+ "ouderacingjovikarasjokarasuyamarshallstatebankarateu-2xn--trenti" +
+ "nsd-tirol-6vbifukagawassamukawatarikuzentakatainaioirasebastopol" +
+ "ogyeongnamegawafaicloudineat-urlomzaporizhzheguriitatebayashijon" +
+ "awateu-3xn--trentinsdtirol-nsbigv-infolldalondonetskaratsuginami" +
+ "katagamilanoticias3-website-sa-east-1xn--trgstad-r1axn--trna-woa" +
+ "xn--troms-zuaxn--tysvr-vraxn--uc0atvestfoldxn--uc0ay4axn--uist22" +
+ "hamurakamigoris-a-hard-workershawaiijimarcheapigeelvinckaufenxn-" +
+ "-uisz3gxn--unjrga-rtarumizusawaxn--unup4yxn--uuwu58axn--vads-jra" +
+ "xn--valle-aoste-ebbtunesorumincomcastresindevicenzaporizhzhiaxn-" +
+ "-valle-d-aoste-ehbodoes-it1-eurxn--valleaoste-e7axn--valledaoste" +
+ "-ebbvacationsvcivilwarmiastagets-itmparochernigovernmentoyosatoy" +
+ "okawaxn--vard-jraxn--vegrshei-c0axn--vermgensberater-ctbihorolog" +
+ "yonagoyaxn--vermgensberatung-pwblogoipizzaxn--vestvgy-ixa6oxn--v" +
+ "g-yiabkhaziaxn--vgan-qoaxn--vgsy-qoa0jelenia-goraxn--vgu402comob" +
+ "araxn--vhquvestnesouthcarolinarvikomakiyosatokamachintaifun-dnsa" +
+ "liashishikuis-a-patsfanxn--vler-qoaxn--vre-eiker-k8axn--vrggt-xq" +
+ "adxn--vry-yla5gxn--vuq861bikedaemoneyonagunicloudivttasvuotnakam" +
+ "agayahooguyoriikarelianceu-4xn--w4r85el8fhu5dnraxn--w4rs40lxn--w" +
+ "cvs22dxn--wgbh1comparemarkerryhotelsantoandreamhostersanukinvest" +
+ "mentsaobernardownloadyndns-workshopitsitexasaogoncasacamdvrcampi" +
+ "nagrandebuilderschlesischesaotomelbournexn--wgbl6axn--xhq521bilb" +
+ "aokinawashirosatochigiessensiositechnologyoshiokanumazuryukiiyam" +
+ "anouchikuhokuryugasakitashiobaraxn--xkc2al3hye2axn--xkc2dl3a5ee0" +
+ "handsonyoursidelmenhorstalbanshellaspeziaxn--y9a3aquariumisawaxn" +
+ "--yer-znaturbruksgymnxn--yfro4i67oxn--ygarden-p1axn--ygbi2ammxn-" +
+ "-45brj9cldmailuzernxn--ystre-slidre-ujbillustrationredumbrellahp" +
+ "piacenzachpomorskienhlfanhs3-website-us-east-1xn--zbx025dxn--zf0" +
+ "ao64axn--zf0avxlxn--zfr164biocelotenkawaxnbayxz"
+
+// nodes is the list of nodes. Each node is represented as a uint32, which
+// encodes the node's children, wildcard bit and node type (as an index into
+// the children array), ICANN bit and text.
+//
+// If the table was generated with the -comments flag, there is a //-comment
+// after each node's data. In it is the nodes-array indexes of the children,
+// formatted as (n0x1234-n0x1256), with * denoting the wildcard bit. The
+// nodeType is printed as + for normal, ! for exception, and o for parent-only
+// nodes that have children but don't match a domain label in their own right.
+// An I denotes an ICANN domain.
+//
+// The layout within the uint32, from MSB to LSB, is:
+// [ 0 bits] unused
+// [10 bits] children index
+// [ 1 bits] ICANN bit
+// [15 bits] text index
+// [ 6 bits] text length
+var nodes = [...]uint32{
+ 0x20bc43,
+ 0x25d9c4,
+ 0x2f8cc6,
+ 0x217243,
+ 0x217246,
+ 0x38e886,
+ 0x3bb603,
+ 0x2392c4,
+ 0x3a15c7,
+ 0x2f8908,
+ 0x1a000c2,
+ 0x1f3cf47,
+ 0x376f09,
+ 0x397eca,
+ 0x397ecb,
+ 0x23a2c3,
+ 0x23cf05,
+ 0x22070c2,
+ 0x2f5304,
+ 0x2f8e43,
+ 0x30eb85,
+ 0x260ad42,
+ 0x360f03,
+ 0x2a58bc4,
+ 0x30f345,
+ 0x2e13602,
+ 0x21638e,
+ 0x25c3c3,
+ 0x3b3dc6,
+ 0x3202302,
+ 0x3096c7,
+ 0x23fa86,
+ 0x3606a82,
+ 0x28e183,
+ 0x235e06,
+ 0x2f4148,
+ 0x295bc6,
+ 0x3c7c04,
+ 0x3a00ac2,
+ 0x34b449,
+ 0x220787,
+ 0x32e5c6,
+ 0x36ba09,
+ 0x3ce888,
+ 0x210944,
+ 0x2acb06,
+ 0x2076c6,
+ 0x3e02002,
+ 0x38cc46,
+ 0x24d68f,
+ 0x3cdb8e,
+ 0x22b1c4,
+ 0x234c85,
+ 0x330d45,
+ 0x3aaa09,
+ 0x247e89,
+ 0x236607,
+ 0x2584c6,
+ 0x267083,
+ 0x422d0c2,
+ 0x22d543,
+ 0x29b5ca,
+ 0x4609983,
+ 0x3403c5,
+ 0x30a8c2,
+ 0x3a4f89,
+ 0x4e03b42,
+ 0x207a04,
+ 0x354186,
+ 0x243885,
+ 0x36ebc4,
+ 0x5626e04,
+ 0x203b43,
+ 0x23c4c4,
+ 0x5a030c2,
+ 0x25b344,
+ 0x5f2d504,
+ 0x316d0a,
+ 0x6200882,
+ 0x3cd347,
+ 0x27b5c8,
+ 0x7a08502,
+ 0x336287,
+ 0x2d36c4,
+ 0x2d36c7,
+ 0x38aa45,
+ 0x38bf07,
+ 0x34a906,
+ 0x29ac84,
+ 0x3633c5,
+ 0x282507,
+ 0x920c142,
+ 0x38cdc3,
+ 0x960b4c2,
+ 0x3b5e03,
+ 0x9a08742,
+ 0x2691c5,
+ 0x9e00202,
+ 0x371604,
+ 0x387345,
+ 0x22b107,
+ 0x2e954e,
+ 0x206984,
+ 0x283b04,
+ 0x2079c3,
+ 0x30d489,
+ 0x2c4e4b,
+ 0x2e1248,
+ 0x32b788,
+ 0x3328c8,
+ 0x20a888,
+ 0xa36b84a,
+ 0x38be07,
+ 0x2f7086,
+ 0xa617282,
+ 0x35ca43,
+ 0x3d6443,
+ 0x3d8084,
+ 0x35ca83,
+ 0x3bb643,
+ 0x1738b82,
+ 0xaa04702,
+ 0x28a385,
+ 0x261e86,
+ 0x252084,
+ 0x3b0cc7,
+ 0x25b186,
+ 0x2d4704,
+ 0x3be9c7,
+ 0x204703,
+ 0xb2dc982,
+ 0xb728c42,
+ 0xba13982,
+ 0x230646,
+ 0xbe00282,
+ 0x26b385,
+ 0x33a0c3,
+ 0x3de644,
+ 0x2fd584,
+ 0x2fd585,
+ 0x3e9683,
+ 0xc253c43,
+ 0xc606342,
+ 0x20e9c5,
+ 0x20e9cb,
+ 0x223c8b,
+ 0x20e804,
+ 0x20ee49,
+ 0x210404,
+ 0xca10d82,
+ 0x211a83,
+ 0x2121c3,
+ 0xce02502,
+ 0x23020a,
+ 0xd20bd42,
+ 0x2f5585,
+ 0x2ece4a,
+ 0x246f44,
+ 0x213f43,
+ 0x2154c4,
+ 0x2178c3,
+ 0x2178c4,
+ 0x2178c7,
+ 0x218705,
+ 0x219546,
+ 0x21a186,
+ 0x2172c3,
+ 0x220f88,
+ 0x215b03,
+ 0xd604242,
+ 0x2fc548,
+ 0x295e4b,
+ 0x229c88,
+ 0x22ac46,
+ 0x22b987,
+ 0x22e908,
+ 0xee016c2,
+ 0xf2295c2,
+ 0x278408,
+ 0x20b947,
+ 0x206e85,
+ 0x3e2208,
+ 0xf61c008,
+ 0x26a0c3,
+ 0x235a44,
+ 0x38e902,
+ 0xfa36c42,
+ 0xfe07f42,
+ 0x10637242,
+ 0x237243,
+ 0x10a04182,
+ 0x312683,
+ 0x2135c4,
+ 0x210903,
+ 0x210904,
+ 0x3a264b,
+ 0x204183,
+ 0x2f27c6,
+ 0x284a84,
+ 0x2ccf8e,
+ 0x240ec5,
+ 0x257008,
+ 0x2716c7,
+ 0x2716ca,
+ 0x21b9c3,
+ 0x25d7c7,
+ 0x2c5005,
+ 0x239e44,
+ 0x25ef06,
+ 0x25ef07,
+ 0x3601c4,
+ 0x10f10344,
+ 0x3169c4,
+ 0x3169c6,
+ 0x25d4c4,
+ 0x3c2086,
+ 0x206c43,
+ 0x206c48,
+ 0x20b2c8,
+ 0x2b3843,
+ 0x2301c3,
+ 0x344544,
+ 0x357203,
+ 0x11604042,
+ 0x11aea202,
+ 0x217843,
+ 0x203c06,
+ 0x3796c3,
+ 0x2fd344,
+ 0x11efd0c2,
+ 0x343583,
+ 0x332f83,
+ 0x21cdc2,
+ 0x12200d42,
+ 0x2d7946,
+ 0x228b07,
+ 0x27b347,
+ 0x2c7cc5,
+ 0x386404,
+ 0x3d4a45,
+ 0x3dcc47,
+ 0x2b5ec9,
+ 0x2cb106,
+ 0x2c7bc6,
+ 0x1320c602,
+ 0x2b6688,
+ 0x321346,
+ 0x327b05,
+ 0x2f7787,
+ 0x2fafc4,
+ 0x2fafc5,
+ 0x1370e7c4,
+ 0x30e7c8,
+ 0x13a08d02,
+ 0x13e00482,
+ 0x24c3c6,
+ 0x200488,
+ 0x325105,
+ 0x3264c6,
+ 0x329dc8,
+ 0x34c608,
+ 0x14203ec5,
+ 0x16e2f004,
+ 0x2b0f87,
+ 0x1720fe82,
+ 0x1762e702,
+ 0x18a16542,
+ 0x354285,
+ 0x192904c5,
+ 0x241c06,
+ 0x3b6207,
+ 0x368e07,
+ 0x19616543,
+ 0x3d6787,
+ 0x283a08,
+ 0x273b4bc9,
+ 0x216547,
+ 0x3e03c7,
+ 0x238308,
+ 0x238b06,
+ 0x239946,
+ 0x23a58c,
+ 0x23b58a,
+ 0x23ba87,
+ 0x23cdcb,
+ 0x23dd47,
+ 0x23dd4e,
+ 0x2763eb84,
+ 0x23ec84,
+ 0x240d87,
+ 0x24be07,
+ 0x246386,
+ 0x246387,
+ 0x3b74c7,
+ 0x203643,
+ 0x27a13b02,
+ 0x248746,
+ 0x24874a,
+ 0x248acb,
+ 0x249f07,
+ 0x24aac5,
+ 0x24b283,
+ 0x24c646,
+ 0x24c647,
+ 0x2feac3,
+ 0x27e00102,
+ 0x24d30a,
+ 0x28378742,
+ 0x2863d842,
+ 0x28a47402,
+ 0x28e3fb82,
+ 0x24f085,
+ 0x24fdc4,
+ 0x29a0c542,
+ 0x25b3c5,
+ 0x231943,
+ 0x29d005,
+ 0x20a784,
+ 0x21e5c4,
+ 0x2d9d06,
+ 0x25cc06,
+ 0x20ebc3,
+ 0x3c1a44,
+ 0x341883,
+ 0x2aa03242,
+ 0x2b1504,
+ 0x3a1a46,
+ 0x2b1505,
+ 0x207106,
+ 0x2f7888,
+ 0x233d04,
+ 0x2b0ac8,
+ 0x2f3f05,
+ 0x27ce88,
+ 0x2d57c6,
+ 0x21c787,
+ 0x279ec4,
+ 0x2be79ec6,
+ 0x2c220a83,
+ 0x3a6543,
+ 0x2c05c8,
+ 0x334684,
+ 0x2c615587,
+ 0x280dc6,
+ 0x2e9b49,
+ 0x362488,
+ 0x32c448,
+ 0x333004,
+ 0x20d303,
+ 0x249182,
+ 0x2ce57f02,
+ 0x2d226cc2,
+ 0x20dd83,
+ 0x2d615fc2,
+ 0x2fea44,
+ 0x285786,
+ 0x23ca03,
+ 0x2c72c7,
+ 0x36ca43,
+ 0x3e1348,
+ 0x2253c5,
+ 0x267d03,
+ 0x3872c5,
+ 0x387404,
+ 0x3bad86,
+ 0x22a386,
+ 0x22b046,
+ 0x2580c4,
+ 0x23e103,
+ 0x2da15282,
+ 0x2de3d545,
+ 0x200843,
+ 0x2e603e82,
+ 0x23a543,
+ 0x3ca805,
+ 0x2ea22bc3,
+ 0x2f23c589,
+ 0x2f600942,
+ 0x2fe05342,
+ 0x2973c5,
+ 0x21f406,
+ 0x2b2986,
+ 0x308cc8,
+ 0x308ccb,
+ 0x346d8b,
+ 0x35b445,
+ 0x2dcf09,
+ 0x1600b42,
+ 0x2d2908,
+ 0x20f144,
+ 0x30602bc2,
+ 0x33e203,
+ 0x30e4bfc6,
+ 0x31200fc2,
+ 0x20ae88,
+ 0x31613242,
+ 0x37aa4a,
+ 0x32239383,
+ 0x32b77546,
+ 0x318348,
+ 0x38db06,
+ 0x389c87,
+ 0x24d887,
+ 0x20724a,
+ 0x246fc4,
+ 0x360c84,
+ 0x376889,
+ 0x32fb3a05,
+ 0x2163c6,
+ 0x20bb43,
+ 0x263284,
+ 0x33232d44,
+ 0x32d187,
+ 0x3365e987,
+ 0x2edb44,
+ 0x250145,
+ 0x241cc8,
+ 0x250387,
+ 0x250607,
+ 0x33a18242,
+ 0x2a2704,
+ 0x29e388,
+ 0x251b04,
+ 0x254744,
+ 0x254b05,
+ 0x254c47,
+ 0x3468b8c9,
+ 0x2555c4,
+ 0x256b09,
+ 0x256d48,
+ 0x257604,
+ 0x257607,
+ 0x257d03,
+ 0x259ac7,
+ 0x34a01282,
+ 0x16c0502,
+ 0x25b506,
+ 0x25bb47,
+ 0x25c404,
+ 0x25e347,
+ 0x25f247,
+ 0x25fc83,
+ 0x34e5c082,
+ 0x239fc2,
+ 0x260743,
+ 0x260744,
+ 0x26074b,
+ 0x32b888,
+ 0x2891c4,
+ 0x2618c5,
+ 0x262fc7,
+ 0x2ee845,
+ 0x3b930a,
+ 0x266b03,
+ 0x3520eb02,
+ 0x21dc84,
+ 0x26b6c9,
+ 0x26f443,
+ 0x26f507,
+ 0x384989,
+ 0x211fc8,
+ 0x213bc3,
+ 0x286bc7,
+ 0x288f89,
+ 0x276a83,
+ 0x290984,
+ 0x291d49,
+ 0x2951c6,
+ 0x3825c3,
+ 0x204982,
+ 0x268803,
+ 0x2c0307,
+ 0x38f005,
+ 0x2c4c46,
+ 0x219a44,
+ 0x372285,
+ 0x289e43,
+ 0x21abc6,
+ 0x22e143,
+ 0x20c342,
+ 0x253c04,
+ 0x35634402,
+ 0x35a34403,
+ 0x35e04342,
+ 0x253283,
+ 0x21a604,
+ 0x323c87,
+ 0x21fb46,
+ 0x290942,
+ 0x3620e8c2,
+ 0x32c684,
+ 0x36a17a42,
+ 0x36e09ac2,
+ 0x3caac4,
+ 0x3caac5,
+ 0x3b6b85,
+ 0x37d146,
+ 0x37207042,
+ 0x207045,
+ 0x20f745,
+ 0x213dc3,
+ 0x2267c6,
+ 0x227105,
+ 0x2305c2,
+ 0x35ac85,
+ 0x2305c4,
+ 0x233c43,
+ 0x233e83,
+ 0x3760a302,
+ 0x2318c7,
+ 0x257784,
+ 0x257789,
+ 0x263184,
+ 0x290343,
+ 0x2bd008,
+ 0x37a90344,
+ 0x290346,
+ 0x2b05c3,
+ 0x262243,
+ 0x343b43,
+ 0x37f03e02,
+ 0x30ad42,
+ 0x38200642,
+ 0x33bfc8,
+ 0x2158c8,
+ 0x3bfcc6,
+ 0x385145,
+ 0x323e05,
+ 0x202347,
+ 0x386823c5,
+ 0x2038c2,
+ 0x38aa0a82,
+ 0x38e00042,
+ 0x2832c8,
+ 0x2b65c5,
+ 0x302f84,
+ 0x250d45,
+ 0x2514c7,
+ 0x3b0184,
+ 0x24d202,
+ 0x3923b502,
+ 0x350984,
+ 0x22fec7,
+ 0x297b47,
+ 0x38bec4,
+ 0x3d7403,
+ 0x2b3784,
+ 0x2b3788,
+ 0x239c86,
+ 0x25ed8a,
+ 0x358e44,
+ 0x29ddc8,
+ 0x24ffc4,
+ 0x22ba86,
+ 0x2a0a44,
+ 0x354586,
+ 0x257a49,
+ 0x221247,
+ 0x39d543,
+ 0x39605102,
+ 0x386d03,
+ 0x210f82,
+ 0x39a027c2,
+ 0x268f86,
+ 0x3b2848,
+ 0x2b2b07,
+ 0x2331c9,
+ 0x2b2cc9,
+ 0x2b5585,
+ 0x2b6f09,
+ 0x2b7705,
+ 0x2b8545,
+ 0x2b94c8,
+ 0x39e17a84,
+ 0x3a25fdc7,
+ 0x2b96c3,
+ 0x2b96c7,
+ 0x3e0786,
+ 0x2b9c87,
+ 0x2af945,
+ 0x2d0843,
+ 0x3a63b342,
+ 0x214184,
+ 0x3aa11402,
+ 0x3ae1ec82,
+ 0x31e946,
+ 0x27b545,
+ 0x2bbd87,
+ 0x3c32c3,
+ 0x20ccc4,
+ 0x21e103,
+ 0x2f6883,
+ 0x3b2042c2,
+ 0x3ba08e82,
+ 0x38e984,
+ 0x25c043,
+ 0x308985,
+ 0x3be05502,
+ 0x3c602102,
+ 0x222f86,
+ 0x2e9484,
+ 0x2f0284,
+ 0x2f028a,
+ 0x3ce005c2,
+ 0x20e103,
+ 0x23498a,
+ 0x26a7c8,
+ 0x3d2b1b84,
+ 0x2005c3,
+ 0x3d687643,
+ 0x326909,
+ 0x280609,
+ 0x2c73c6,
+ 0x3da43543,
+ 0x2887cd,
+ 0x3a8e86,
+ 0x3e0e8b,
+ 0x3de087c2,
+ 0x2ac948,
+ 0x42221082,
+ 0x42601e02,
+ 0x398285,
+ 0x42a02642,
+ 0x2b3187,
+ 0x202983,
+ 0x2272c8,
+ 0x42e06002,
+ 0x3a9984,
+ 0x22a003,
+ 0x3532c5,
+ 0x2491c6,
+ 0x22cf04,
+ 0x230183,
+ 0x44205b42,
+ 0x35b3c4,
+ 0x2beb45,
+ 0x2bff07,
+ 0x285203,
+ 0x2c1443,
+ 0x1619e82,
+ 0x2c1b03,
+ 0x2c2103,
+ 0x44600e02,
+ 0x239104,
+ 0x23e306,
+ 0x288d83,
+ 0x2c2a83,
+ 0x44a54202,
+ 0x254208,
+ 0x2c3a04,
+ 0x2052c6,
+ 0x387d07,
+ 0x3d4dc6,
+ 0x2c0544,
+ 0x52e025c2,
+ 0x3e064b,
+ 0x30624e,
+ 0x2201cf,
+ 0x3bc5c3,
+ 0x536687c2,
+ 0x161ee02,
+ 0x53a01f42,
+ 0x2f9843,
+ 0x20b603,
+ 0x2732c6,
+ 0x2cb846,
+ 0x2bc847,
+ 0x3b7004,
+ 0x53e1f542,
+ 0x542258c2,
+ 0x302645,
+ 0x32a647,
+ 0x2c6106,
+ 0x5463d782,
+ 0x382f04,
+ 0x2cc083,
+ 0x54a07bc2,
+ 0x54f73803,
+ 0x2cd984,
+ 0x2d2249,
+ 0x552da042,
+ 0x55611b82,
+ 0x2876c5,
+ 0x55ada802,
+ 0x56205542,
+ 0x35fb87,
+ 0x37718b,
+ 0x24d645,
+ 0x264489,
+ 0x275d46,
+ 0x56608004,
+ 0x208009,
+ 0x2f9cc7,
+ 0x349887,
+ 0x205543,
+ 0x2f1a46,
+ 0x351887,
+ 0x24c243,
+ 0x2a4106,
+ 0x56e1f002,
+ 0x57225e82,
+ 0x217443,
+ 0x3a5145,
+ 0x21c307,
+ 0x23f286,
+ 0x38ef85,
+ 0x263104,
+ 0x2aee85,
+ 0x390bc4,
+ 0x5760b402,
+ 0x2d8d84,
+ 0x2cbe44,
+ 0x39c84d,
+ 0x2cbe49,
+ 0x237848,
+ 0x262c84,
+ 0x38d345,
+ 0x3c2307,
+ 0x3c2bc4,
+ 0x273847,
+ 0x228f05,
+ 0x57ab4484,
+ 0x2c5b45,
+ 0x26e104,
+ 0x316546,
+ 0x3b6005,
+ 0x57e6b2c2,
+ 0x225e43,
+ 0x333e43,
+ 0x2c8784,
+ 0x2c8785,
+ 0x208c86,
+ 0x235585,
+ 0x263944,
+ 0x58392e03,
+ 0x587d1a86,
+ 0x219405,
+ 0x21b385,
+ 0x3b6104,
+ 0x2f93c3,
+ 0x358ecc,
+ 0x58ac0002,
+ 0x58e00e82,
+ 0x59209d42,
+ 0x21b283,
+ 0x21b284,
+ 0x59610442,
+ 0x308108,
+ 0x2c4d05,
+ 0x2dafc4,
+ 0x359186,
+ 0x59a205c2,
+ 0x59e109c2,
+ 0x5a200c42,
+ 0x2a3c05,
+ 0x354806,
+ 0x232c84,
+ 0x236346,
+ 0x213186,
+ 0x25aa03,
+ 0x5a694b4a,
+ 0x2853c5,
+ 0x29b583,
+ 0x20f546,
+ 0x5aa0f549,
+ 0x22c4c7,
+ 0x3c8c08,
+ 0x3ce749,
+ 0x2b6048,
+ 0x209146,
+ 0x207cc3,
+ 0x5af1de42,
+ 0x32bd88,
+ 0x5b256e02,
+ 0x5b601582,
+ 0x233243,
+ 0x2efe85,
+ 0x280f44,
+ 0x3e27c9,
+ 0x386e04,
+ 0x38d188,
+ 0x5be10fc3,
+ 0x5c3a2ac4,
+ 0x21f448,
+ 0x5c70df02,
+ 0x2cf1c2,
+ 0x330cc5,
+ 0x34af09,
+ 0x216443,
+ 0x31b884,
+ 0x36e504,
+ 0x20b683,
+ 0x28bf8a,
+ 0x5cb0f082,
+ 0x5ce13fc2,
+ 0x2dc903,
+ 0x3939c3,
+ 0x1609382,
+ 0x35c243,
+ 0x5d228882,
+ 0x5d600bc2,
+ 0x5da8d4c4,
+ 0x28d4c6,
+ 0x276e84,
+ 0x283103,
+ 0x28f583,
+ 0x5de00bc3,
+ 0x248e46,
+ 0x3de805,
+ 0x2e0947,
+ 0x2e0886,
+ 0x2e0e48,
+ 0x2e1046,
+ 0x2239c4,
+ 0x2a6a8b,
+ 0x2e30c3,
+ 0x2e30c5,
+ 0x2165c2,
+ 0x35fe82,
+ 0x5e24f102,
+ 0x5e603742,
+ 0x20a083,
+ 0x5ea77782,
+ 0x277783,
+ 0x2e4103,
+ 0x5f2093c2,
+ 0x5f6e8306,
+ 0x35e3c6,
+ 0x5fae8442,
+ 0x5fe12202,
+ 0x60233ec2,
+ 0x60ea9542,
+ 0x61345342,
+ 0x61602802,
+ 0x20b0c3,
+ 0x3da086,
+ 0x61a1b544,
+ 0x2b130a,
+ 0x3b1d46,
+ 0x285084,
+ 0x202703,
+ 0x62606c02,
+ 0x204cc2,
+ 0x26f843,
+ 0x62a296c3,
+ 0x3c5847,
+ 0x3b5f07,
+ 0x67e60847,
+ 0x341607,
+ 0x232403,
+ 0x23240a,
+ 0x257204,
+ 0x31e544,
+ 0x31e54a,
+ 0x24a905,
+ 0x6823a382,
+ 0x2583c3,
+ 0x68600602,
+ 0x257743,
+ 0x386cc3,
+ 0x68e00582,
+ 0x283984,
+ 0x202544,
+ 0x2032c5,
+ 0x3301c5,
+ 0x236e86,
+ 0x2fb4c6,
+ 0x6924ba82,
+ 0x69601cc2,
+ 0x2f97c5,
+ 0x35e0d2,
+ 0x298a06,
+ 0x291c43,
+ 0x2b4ac6,
+ 0x2cf8c5,
+ 0x1603442,
+ 0x71a056c2,
+ 0x341143,
+ 0x212bc3,
+ 0x29c403,
+ 0x71e01102,
+ 0x21e803,
+ 0x7222d4c2,
+ 0x201d03,
+ 0x3b1008,
+ 0x241c43,
+ 0x2b5406,
+ 0x3e3047,
+ 0x34dbc6,
+ 0x34dbcb,
+ 0x284fc7,
+ 0x33ee44,
+ 0x72a00c02,
+ 0x2c4b85,
+ 0x72e2f483,
+ 0x23b843,
+ 0x39fd45,
+ 0x348ec3,
+ 0x73748ec6,
+ 0x3e514a,
+ 0x2ade43,
+ 0x213a04,
+ 0x2003c6,
+ 0x327f06,
+ 0x73a0cb83,
+ 0x20cb87,
+ 0x326807,
+ 0x2a8485,
+ 0x239706,
+ 0x217303,
+ 0x76626a03,
+ 0x76a00a82,
+ 0x76ec8044,
+ 0x2114c9,
+ 0x22f7c5,
+ 0x361cc4,
+ 0x31e288,
+ 0x24ac45,
+ 0x7724ccc5,
+ 0x255849,
+ 0x32e683,
+ 0x23d7c4,
+ 0x77608402,
+ 0x21f783,
+ 0x77a96dc2,
+ 0x296dc6,
+ 0x169a902,
+ 0x77e15982,
+ 0x2a3b08,
+ 0x2b3743,
+ 0x2c5a87,
+ 0x2c1b85,
+ 0x2c5645,
+ 0x34de4b,
+ 0x2f17c6,
+ 0x34e046,
+ 0x277304,
+ 0x219d06,
+ 0x782f1e48,
+ 0x28e543,
+ 0x265043,
+ 0x265044,
+ 0x2fa884,
+ 0x309447,
+ 0x3da945,
+ 0x786f8842,
+ 0x78a059c2,
+ 0x792059c5,
+ 0x2ca784,
+ 0x2fa9cb,
+ 0x2fd488,
+ 0x24bd04,
+ 0x796376c2,
+ 0x79a06bc2,
+ 0x206bc3,
+ 0x2ff644,
+ 0x2ff905,
+ 0x300487,
+ 0x79f02ac4,
+ 0x38bfc4,
+ 0x7a2037c2,
+ 0x37e5c9,
+ 0x303fc5,
+ 0x24d905,
+ 0x304b45,
+ 0x7a61f6c3,
+ 0x240644,
+ 0x24064b,
+ 0x305b04,
+ 0x305dcb,
+ 0x306745,
+ 0x22030a,
+ 0x307108,
+ 0x30730a,
+ 0x307b83,
+ 0x307b8a,
+ 0x7ae1a782,
+ 0x7b24cec2,
+ 0x7b604683,
+ 0x7bad3b02,
+ 0x309ec3,
+ 0x7bef57c2,
+ 0x7c33a842,
+ 0x30a904,
+ 0x2210c6,
+ 0x236085,
+ 0x30ccc3,
+ 0x3ce106,
+ 0x219045,
+ 0x35a504,
+ 0x7c600902,
+ 0x2b4004,
+ 0x2dcb8a,
+ 0x2c3687,
+ 0x349246,
+ 0x25d607,
+ 0x248783,
+ 0x2cd9c8,
+ 0x3e7ccb,
+ 0x221e45,
+ 0x36e645,
+ 0x36e646,
+ 0x2f8384,
+ 0x3df448,
+ 0x205703,
+ 0x2075c4,
+ 0x2075c7,
+ 0x33ea86,
+ 0x3a2e06,
+ 0x2ccdca,
+ 0x256b84,
+ 0x2c244a,
+ 0x7ca08dc6,
+ 0x208dc7,
+ 0x261947,
+ 0x266584,
+ 0x266589,
+ 0x336705,
+ 0x2f9c43,
+ 0x22a543,
+ 0x7ce264c3,
+ 0x23a044,
+ 0x7d200682,
+ 0x3d8986,
+ 0x7d6d05c5,
+ 0x2b4d05,
+ 0x25b746,
+ 0x31d704,
+ 0x7da12742,
+ 0x24b2c4,
+ 0x7de04a02,
+ 0x20c2c5,
+ 0x336884,
+ 0x7f22ccc3,
+ 0x7f609742,
+ 0x209743,
+ 0x21e946,
+ 0x7fa01ec2,
+ 0x397488,
+ 0x22c344,
+ 0x22c346,
+ 0x394246,
+ 0x7fe63084,
+ 0x21a7c5,
+ 0x22ef08,
+ 0x231dc7,
+ 0x326fc7,
+ 0x326fcf,
+ 0x29e286,
+ 0x23cc03,
+ 0x241684,
+ 0x20f843,
+ 0x22bbc4,
+ 0x252e44,
+ 0x80207f02,
+ 0x3747c3,
+ 0x337cc3,
+ 0x80602b02,
+ 0x204143,
+ 0x37d083,
+ 0x21878a,
+ 0x27eb47,
+ 0x258ecc,
+ 0x80a59186,
+ 0x25abc6,
+ 0x25bcc7,
+ 0x80e38747,
+ 0x262389,
+ 0x812fc684,
+ 0x8160a0c2,
+ 0x81a01702,
+ 0x2cd186,
+ 0x20c984,
+ 0x39e1c6,
+ 0x267ec8,
+ 0x3a5204,
+ 0x2f8ec6,
+ 0x2b2945,
+ 0x81e7c4c8,
+ 0x24c743,
+ 0x28a485,
+ 0x35d1c3,
+ 0x24da03,
+ 0x24da04,
+ 0x21dc43,
+ 0x82254642,
+ 0x826014c2,
+ 0x2f9b09,
+ 0x296cc5,
+ 0x3d4744,
+ 0x3e5745,
+ 0x20f244,
+ 0x37b3c7,
+ 0x338685,
+ 0x82ed1984,
+ 0x2d1988,
+ 0x2dd986,
+ 0x2e1dc4,
+ 0x2e1fc8,
+ 0x83204ac2,
+ 0x2f0d84,
+ 0x20f904,
+ 0x2d38c7,
+ 0x83605fc4,
+ 0x2171c2,
+ 0x83a0b5c2,
+ 0x20b5c3,
+ 0x2875c4,
+ 0x2512c3,
+ 0x2ba385,
+ 0x83e35542,
+ 0x30ac45,
+ 0x279c42,
+ 0x311f85,
+ 0x2db805,
+ 0x842010c2,
+ 0x332f04,
+ 0x84602d82,
+ 0x30dd46,
+ 0x2192c6,
+ 0x34b048,
+ 0x2d49c8,
+ 0x31e8c4,
+ 0x301805,
+ 0x2c0d09,
+ 0x2d2a44,
+ 0x3e5104,
+ 0x21f203,
+ 0x207383,
+ 0x84a07385,
+ 0x26fac5,
+ 0x269544,
+ 0x337d4d,
+ 0x352902,
+ 0x352903,
+ 0x84e04102,
+ 0x85200ec2,
+ 0x396f45,
+ 0x354c47,
+ 0x22d144,
+ 0x3ce949,
+ 0x2dccc9,
+ 0x282303,
+ 0x282308,
+ 0x246809,
+ 0x227d47,
+ 0x85755b45,
+ 0x3615c6,
+ 0x362786,
+ 0x365cc5,
+ 0x2cbf45,
+ 0x85a01c42,
+ 0x2930c5,
+ 0x2c9448,
+ 0x2d6a06,
+ 0x85ed7247,
+ 0x306984,
+ 0x2b9ac7,
+ 0x3b9106,
+ 0x8624b302,
+ 0x208986,
+ 0x31160a,
+ 0x311e85,
+ 0x86615a82,
+ 0x86a14442,
+ 0x278b86,
+ 0x86e97d07,
+ 0x8720c4c2,
+ 0x20a803,
+ 0x2250c6,
+ 0x2d5884,
+ 0x27ac86,
+ 0x32fa86,
+ 0x3a32ca,
+ 0x32e805,
+ 0x30d8c6,
+ 0x36c343,
+ 0x36c344,
+ 0x87603bc2,
+ 0x321303,
+ 0x87a1b2c2,
+ 0x31fec3,
+ 0x87e34c04,
+ 0x2d8284,
+ 0x883e380a,
+ 0x209203,
+ 0x326ac7,
+ 0x315106,
+ 0x38fa84,
+ 0x236d42,
+ 0x2b0982,
+ 0x886007c2,
+ 0x232a43,
+ 0x261707,
+ 0x2007c7,
+ 0x292704,
+ 0x258d47,
+ 0x300586,
+ 0x20ba87,
+ 0x230744,
+ 0x2b61c5,
+ 0x221c45,
+ 0x88a0d782,
+ 0x219e46,
+ 0x230bc3,
+ 0x29d6c2,
+ 0x2fc146,
+ 0x88e12682,
+ 0x89213402,
+ 0x213405,
+ 0x8962bdc2,
+ 0x89a02a02,
+ 0x351e45,
+ 0x2e3405,
+ 0x30a705,
+ 0x8a268b83,
+ 0x285845,
+ 0x2f1887,
+ 0x2b9385,
+ 0x32e9c5,
+ 0x257104,
+ 0x361b46,
+ 0x24e044,
+ 0x8a6008c2,
+ 0x8b2510c5,
+ 0x3967c7,
+ 0x213c08,
+ 0x27d046,
+ 0x27d04d,
+ 0x2803c9,
+ 0x2803d2,
+ 0x37e8c5,
+ 0x383403,
+ 0x8b6091c2,
+ 0x32f684,
+ 0x3a8f03,
+ 0x3d64c5,
+ 0x3136c5,
+ 0x8ba2a042,
+ 0x267d43,
+ 0x8be32982,
+ 0x8c629742,
+ 0x8ca00082,
+ 0x2ead45,
+ 0x39d643,
+ 0x8ce04942,
+ 0x8d206502,
+ 0x283946,
+ 0x2484ca,
+ 0x201c83,
+ 0x2638c3,
+ 0x2f2d43,
+ 0x8ee04a42,
+ 0x9d666342,
+ 0x9de0e002,
+ 0x205002,
+ 0x3d8109,
+ 0x2d9444,
+ 0x2e5488,
+ 0x9e308542,
+ 0x9ea017c2,
+ 0x393285,
+ 0x23d208,
+ 0x2f8088,
+ 0x30500c,
+ 0x241403,
+ 0x9ee6dac2,
+ 0x9f208e42,
+ 0x39dbc6,
+ 0x315f85,
+ 0x2e8c43,
+ 0x24cb06,
+ 0x3160c6,
+ 0x251403,
+ 0x317703,
+ 0x317dc6,
+ 0x319884,
+ 0x2a2446,
+ 0x34cd04,
+ 0x319f44,
+ 0x31aa0a,
+ 0x9f603582,
+ 0x257e85,
+ 0x31bfca,
+ 0x31bf05,
+ 0x31ce84,
+ 0x31cf86,
+ 0x31d104,
+ 0x21fa46,
+ 0x9fa16ec2,
+ 0x216ec6,
+ 0x271385,
+ 0x30d747,
+ 0x3c1346,
+ 0x25bec4,
+ 0x2e8ec7,
+ 0x2089c5,
+ 0x242c07,
+ 0x228947,
+ 0x22894e,
+ 0x2849c6,
+ 0x2b6dc5,
+ 0x205f07,
+ 0x3c3947,
+ 0x212d85,
+ 0x229b84,
+ 0x3235c2,
+ 0x23d887,
+ 0x249e04,
+ 0x35a784,
+ 0x2cf04b,
+ 0x9fe246c3,
+ 0x301387,
+ 0x2246c4,
+ 0x301687,
+ 0x310883,
+ 0x34e54d,
+ 0x3ad188,
+ 0xa0233984,
+ 0x3e16c5,
+ 0x31f985,
+ 0x31fdc3,
+ 0xa0608f02,
+ 0x3212c3,
+ 0x321a83,
+ 0x215ac4,
+ 0x289085,
+ 0x219fc7,
+ 0x36c3c6,
+ 0x390a43,
+ 0x233f0b,
+ 0x35be8b,
+ 0x2b504b,
+ 0x2cae8b,
+ 0x3991ca,
+ 0x2d6bcb,
+ 0x2f228b,
+ 0x32178c,
+ 0x31a34b,
+ 0x370491,
+ 0x398e4a,
+ 0x3b8a4b,
+ 0x3c95cc,
+ 0x3e6f4b,
+ 0x3230ca,
+ 0x323f4a,
+ 0x324dce,
+ 0x325a4b,
+ 0x325d0a,
+ 0x328911,
+ 0x328d4a,
+ 0x32924b,
+ 0x32978e,
+ 0x32a14c,
+ 0x32ae8b,
+ 0x32b14e,
+ 0x32b4cc,
+ 0x32ef0a,
+ 0x33068c,
+ 0xa0b3098a,
+ 0x331288,
+ 0x331e49,
+ 0x3348ca,
+ 0x334b4a,
+ 0x334dcb,
+ 0x33744e,
+ 0x338091,
+ 0x341cc9,
+ 0x341f0a,
+ 0x342c8b,
+ 0x343dcd,
+ 0x344c4a,
+ 0x345616,
+ 0x34698b,
+ 0x34844a,
+ 0x34888a,
+ 0x34a48b,
+ 0x34b2c9,
+ 0x34eec9,
+ 0x34f44d,
+ 0x34fc0b,
+ 0x3514cb,
+ 0x351f89,
+ 0x3525ce,
+ 0x3529ca,
+ 0x3550ca,
+ 0x35590a,
+ 0x3562cb,
+ 0x356b0b,
+ 0x35798d,
+ 0x359fcd,
+ 0x35a910,
+ 0x35adcb,
+ 0x35bacc,
+ 0x35cc8b,
+ 0x35f68b,
+ 0x3611ce,
+ 0x3617cb,
+ 0x3617cd,
+ 0x36740b,
+ 0x367e8f,
+ 0x36824b,
+ 0x36918a,
+ 0x369f49,
+ 0x36ab49,
+ 0xa0f6aecb,
+ 0x36b18e,
+ 0x36b50e,
+ 0x36e28b,
+ 0x36f04f,
+ 0x3718cb,
+ 0x371b8b,
+ 0x371e4a,
+ 0x376d89,
+ 0x37c74f,
+ 0x381d4c,
+ 0x38298c,
+ 0x3830ce,
+ 0x3835cf,
+ 0x38398e,
+ 0x383e10,
+ 0x38420f,
+ 0x384bce,
+ 0x38528c,
+ 0x385591,
+ 0x3859d2,
+ 0x387891,
+ 0x387ece,
+ 0x38830b,
+ 0x38830e,
+ 0x38868f,
+ 0x388a4e,
+ 0x388dd3,
+ 0x389291,
+ 0x3896cc,
+ 0x3899ce,
+ 0x389e4c,
+ 0x38a293,
+ 0x38af50,
+ 0x38b3cc,
+ 0x38b6cc,
+ 0x38bb8b,
+ 0x38e58e,
+ 0x38ea8b,
+ 0x38f2cb,
+ 0x39150c,
+ 0x3979ca,
+ 0x39864c,
+ 0x39894c,
+ 0x398c49,
+ 0x39ac8b,
+ 0x39af48,
+ 0x39b509,
+ 0x39b50f,
+ 0x39cf4b,
+ 0xa139e64a,
+ 0x3a3a0c,
+ 0x3a49cb,
+ 0x3a4c89,
+ 0x3a56c8,
+ 0x3a630b,
+ 0x3a810a,
+ 0x3a838b,
+ 0x3a9b0c,
+ 0x3aa649,
+ 0x3aa888,
+ 0x3ad7cb,
+ 0x3b0a4b,
+ 0x3b2e0e,
+ 0x3b494b,
+ 0x3b83cb,
+ 0x3c420b,
+ 0x3c44c9,
+ 0x3c488d,
+ 0x3d57ca,
+ 0x3d9857,
+ 0x3da218,
+ 0x3dc0c9,
+ 0x3de3cb,
+ 0x3df714,
+ 0x3dfc0b,
+ 0x3e018a,
+ 0x3e2a0a,
+ 0x3e2c8b,
+ 0x3e4810,
+ 0x3e4c11,
+ 0x3e5a4a,
+ 0x3e654d,
+ 0x3e6c4d,
+ 0x3e940b,
+ 0x219f43,
+ 0xa17b5883,
+ 0x3cc686,
+ 0x3df0c5,
+ 0x27a587,
+ 0x2ddec6,
+ 0x164bf82,
+ 0x2729c9,
+ 0x20c004,
+ 0x2f0788,
+ 0x226403,
+ 0x32f5c7,
+ 0x247f82,
+ 0x2bbdc3,
+ 0xa1a0e042,
+ 0x2dd846,
+ 0x2defc4,
+ 0x2c8404,
+ 0x3a0f43,
+ 0xa22da842,
+ 0xa262f444,
+ 0x2664c7,
+ 0xa2a35b02,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x216443,
+ 0x2296c3,
+ 0x20cb83,
+ 0x117bc8,
+ 0x20d903,
+ 0x2000c2,
+ 0x793c8,
+ 0x216542,
+ 0x343b43,
+ 0x216443,
+ 0x2296c3,
+ 0xd903,
+ 0x20cb83,
+ 0x202b03,
+ 0x33d956,
+ 0x365753,
+ 0x258bc9,
+ 0x2b0e88,
+ 0x2c4a09,
+ 0x31c146,
+ 0x3509d0,
+ 0x218053,
+ 0x33eb48,
+ 0x285c87,
+ 0x2929c7,
+ 0x2aebca,
+ 0x363749,
+ 0x333bc9,
+ 0x25dd0b,
+ 0x34a906,
+ 0x32b98a,
+ 0x22ac46,
+ 0x238c43,
+ 0x231805,
+ 0x206c48,
+ 0x28b04d,
+ 0x35434c,
+ 0x271047,
+ 0x309f4d,
+ 0x22f004,
+ 0x23a30a,
+ 0x23b0ca,
+ 0x23b58a,
+ 0x218347,
+ 0x2461c7,
+ 0x249d44,
+ 0x279ec6,
+ 0x34abc4,
+ 0x222bc8,
+ 0x386e49,
+ 0x209a46,
+ 0x308cc8,
+ 0x24dd4d,
+ 0x2dcf09,
+ 0x318348,
+ 0x24d887,
+ 0x21364a,
+ 0x25bb46,
+ 0x34bbc4,
+ 0x2298c7,
+ 0x3d8b8a,
+ 0x242f8e,
+ 0x2823c5,
+ 0x29788b,
+ 0x232789,
+ 0x280609,
+ 0x20d547,
+ 0x20d54a,
+ 0x2d3807,
+ 0x306389,
+ 0x37b048,
+ 0x37948b,
+ 0x2efe85,
+ 0x23770a,
+ 0x233c89,
+ 0x33324a,
+ 0x22654b,
+ 0x2297cb,
+ 0x25da95,
+ 0x2f0c45,
+ 0x24d905,
+ 0x24064a,
+ 0x26ba4a,
+ 0x390f47,
+ 0x23d343,
+ 0x2cd108,
+ 0x2e640a,
+ 0x22c346,
+ 0x261289,
+ 0x27c4c8,
+ 0x2e1dc4,
+ 0x2512c9,
+ 0x2d49c8,
+ 0x2d5707,
+ 0x2510c6,
+ 0x3967c7,
+ 0x399b07,
+ 0x248c45,
+ 0x37500c,
+ 0x3e16c5,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2296c3,
+ 0xd903,
+ 0x20cb83,
+ 0x216542,
+ 0x216543,
+ 0x2296c3,
+ 0x20d903,
+ 0x20cb83,
+ 0x216543,
+ 0x2296c3,
+ 0xd903,
+ 0x241c43,
+ 0x20cb83,
+ 0x1d5b83,
+ 0x793c8,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x216443,
+ 0x2296c3,
+ 0xd903,
+ 0x20cb83,
+ 0x793c8,
+ 0x216542,
+ 0x216543,
+ 0x3a8607,
+ 0x17b1c4,
+ 0x2296c3,
+ 0xbbc4,
+ 0x20cb83,
+ 0x19045,
+ 0x216542,
+ 0x2104c2,
+ 0x31d0c2,
+ 0x206002,
+ 0x205c02,
+ 0x2160c2,
+ 0x9a6c6,
+ 0x5c549,
+ 0x182487,
+ 0x1550e,
+ 0x99049,
+ 0x482ccc3,
+ 0x95c87,
+ 0x152e06,
+ 0x1643,
+ 0x11e505,
+ 0xc1,
+ 0x5216543,
+ 0x222bc3,
+ 0x2f5503,
+ 0x343b43,
+ 0x243543,
+ 0x216443,
+ 0x2e8706,
+ 0x2296c3,
+ 0x20cb83,
+ 0x202883,
+ 0x793c8,
+ 0x209b84,
+ 0x3a2887,
+ 0x3a0f83,
+ 0x25e704,
+ 0x20d3c3,
+ 0x20d5c3,
+ 0x343b43,
+ 0xb46c7,
+ 0x9c4,
+ 0x12db83,
+ 0x10e645,
+ 0x66000c2,
+ 0x53c43,
+ 0x6a16542,
+ 0x6e90b89,
+ 0x7096ac9,
+ 0x96f4d,
+ 0x9728d,
+ 0x31d0c2,
+ 0xb1b84,
+ 0x10e689,
+ 0x2003c2,
+ 0x76b1a88,
+ 0x105504,
+ 0x320b43,
+ 0x793c8,
+ 0x49e04,
+ 0x1407242,
+ 0x14005c2,
+ 0x1407242,
+ 0x151a146,
+ 0x23bb83,
+ 0x2cc803,
+ 0x7e16543,
+ 0x23a304,
+ 0x8622bc3,
+ 0x8f43b43,
+ 0x2042c2,
+ 0x2b1b84,
+ 0x2296c3,
+ 0x38c643,
+ 0x203c82,
+ 0x20cb83,
+ 0x221a42,
+ 0x30a303,
+ 0x201ec2,
+ 0x26a603,
+ 0x220b03,
+ 0x2089c2,
+ 0x793c8,
+ 0x82fdcc9,
+ 0x27b43,
+ 0x23bb83,
+ 0x20b2c8,
+ 0x8b8c643,
+ 0x203c82,
+ 0x30a303,
+ 0x201ec2,
+ 0x26a603,
+ 0x220b03,
+ 0x2089c2,
+ 0x259187,
+ 0x30a303,
+ 0x201ec2,
+ 0x26a603,
+ 0x220b03,
+ 0x2089c2,
+ 0x216543,
+ 0x4702,
+ 0x6c43,
+ 0x2bc2,
+ 0x13242,
+ 0xe8c2,
+ 0x11de42,
+ 0x4a42,
+ 0x4da82,
+ 0x253c43,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2b1b84,
+ 0x243543,
+ 0x216443,
+ 0x21b544,
+ 0x2296c3,
+ 0x20cb83,
+ 0x204642,
+ 0x21f6c3,
+ 0x793c8,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x216443,
+ 0x2296c3,
+ 0x20cb83,
+ 0x8503,
+ 0x2d4c2,
+ 0x253c43,
+ 0x216542,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2b1b84,
+ 0x2296c3,
+ 0x20cb83,
+ 0x355b45,
+ 0x22a042,
+ 0x2000c2,
+ 0x793c8,
+ 0xaec0ad2,
+ 0x1472588,
+ 0x1b2b8a,
+ 0x3ec5,
+ 0x343b43,
+ 0x230d41,
+ 0x2009c1,
+ 0x200a01,
+ 0x202c41,
+ 0x201b41,
+ 0x211101,
+ 0x209c01,
+ 0x230e41,
+ 0x2fd181,
+ 0x200001,
+ 0x2000c1,
+ 0x200201,
+ 0x146c05,
+ 0x793c8,
+ 0x200101,
+ 0x201381,
+ 0x200501,
+ 0x201281,
+ 0x200041,
+ 0x200801,
+ 0x200181,
+ 0x200e01,
+ 0x200701,
+ 0x2004c1,
+ 0x200bc1,
+ 0x200581,
+ 0x2003c1,
+ 0x200a81,
+ 0x2210c1,
+ 0x200401,
+ 0x200741,
+ 0x2007c1,
+ 0x200081,
+ 0x2017c1,
+ 0x201641,
+ 0x207281,
+ 0x2024c1,
+ 0x208481,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2296c3,
+ 0x20cb83,
+ 0x216542,
+ 0x216543,
+ 0x222bc3,
+ 0x2003c2,
+ 0x20cb83,
+ 0x22a83,
+ 0xb46c7,
+ 0x1cdf07,
+ 0x32f46,
+ 0x4280a,
+ 0x95748,
+ 0x60c88,
+ 0x61607,
+ 0xbc3c4,
+ 0x15c246,
+ 0xeec85,
+ 0x10f7c5,
+ 0x129643,
+ 0x30846,
+ 0x13906,
+ 0x25dd04,
+ 0x336147,
+ 0x793c8,
+ 0x2e8fc4,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2296c3,
+ 0x20cb83,
+ 0x16542,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2296c3,
+ 0x20cb83,
+ 0x330b88,
+ 0x202304,
+ 0x23c4c4,
+ 0x20e804,
+ 0x39dac7,
+ 0x2e59c7,
+ 0x216543,
+ 0x23ec8b,
+ 0x33100a,
+ 0x38f947,
+ 0x300288,
+ 0x353348,
+ 0x222bc3,
+ 0x3c2e87,
+ 0x2f5503,
+ 0x214fc8,
+ 0x224309,
+ 0x2b1b84,
+ 0x243543,
+ 0x244688,
+ 0x216443,
+ 0x2e320a,
+ 0x2e8706,
+ 0x3b1d47,
+ 0x2296c3,
+ 0x2f1b46,
+ 0x3d2288,
+ 0x20cb83,
+ 0x275546,
+ 0x2fd6cd,
+ 0x2ffe48,
+ 0x305b0b,
+ 0x223bc6,
+ 0x354b47,
+ 0x21d985,
+ 0x22e68a,
+ 0x2fce05,
+ 0x26f9ca,
+ 0x22a042,
+ 0x201643,
+ 0x35a784,
+ 0x200006,
+ 0x3bb603,
+ 0x2b4083,
+ 0x28bb03,
+ 0x202303,
+ 0x37a403,
+ 0x202002,
+ 0x39d805,
+ 0x2b5949,
+ 0x209983,
+ 0x2492c3,
+ 0x203b43,
+ 0x216c43,
+ 0x200201,
+ 0x2d2807,
+ 0x2eaa85,
+ 0x3c1fc3,
+ 0x26b383,
+ 0x3e9683,
+ 0x20e804,
+ 0x3c3303,
+ 0x2271c8,
+ 0x35bdc3,
+ 0x3e1ecd,
+ 0x284a88,
+ 0x20b486,
+ 0x2e9443,
+ 0x35a2c3,
+ 0x361ac3,
+ 0xda16543,
+ 0x23bdc8,
+ 0x23ec84,
+ 0x247203,
+ 0x249f03,
+ 0x200106,
+ 0x24e888,
+ 0x266943,
+ 0x228fc3,
+ 0x2ba1c3,
+ 0x220a83,
+ 0x22e6c3,
+ 0x23a543,
+ 0x222bc3,
+ 0x22d743,
+ 0x255ec3,
+ 0x209a43,
+ 0x290583,
+ 0x325243,
+ 0x20ae83,
+ 0x232d43,
+ 0x3a4e85,
+ 0x25c504,
+ 0x25dfc7,
+ 0x25c082,
+ 0x260183,
+ 0x263c46,
+ 0x265743,
+ 0x266c03,
+ 0x2822c3,
+ 0x35cb03,
+ 0x21fb43,
+ 0x32d103,
+ 0x2a1807,
+ 0xe743b43,
+ 0x2d3103,
+ 0x207c83,
+ 0x20e443,
+ 0x26a7c3,
+ 0x217203,
+ 0x3b5945,
+ 0x37cac3,
+ 0x252749,
+ 0x2012c3,
+ 0x3139c3,
+ 0xea53203,
+ 0x2daf43,
+ 0x20e843,
+ 0x214808,
+ 0x2b5886,
+ 0x35c8c6,
+ 0x2be186,
+ 0x267347,
+ 0x202143,
+ 0x233243,
+ 0x216443,
+ 0x295846,
+ 0x2165c2,
+ 0x2e69c3,
+ 0x33c405,
+ 0x2296c3,
+ 0x31c887,
+ 0x160d903,
+ 0x29ae43,
+ 0x2183c3,
+ 0x23c9c3,
+ 0x23b843,
+ 0x20cb83,
+ 0x21de86,
+ 0x202fc6,
+ 0x37db83,
+ 0x29a8c3,
+ 0x21f6c3,
+ 0x259143,
+ 0x317783,
+ 0x309603,
+ 0x30ac03,
+ 0x219045,
+ 0x24c343,
+ 0x250046,
+ 0x21b103,
+ 0x2f4f88,
+ 0x22a543,
+ 0x22a549,
+ 0x37ad08,
+ 0x220548,
+ 0x22eac5,
+ 0x38ac4a,
+ 0x3e08ca,
+ 0x3e110b,
+ 0x3e1ac8,
+ 0x2aa6c3,
+ 0x230143,
+ 0x390b83,
+ 0x2f34c3,
+ 0x312588,
+ 0x355303,
+ 0x36c344,
+ 0x203bc2,
+ 0x22e683,
+ 0x24c0c3,
+ 0x2007c3,
+ 0x3d8883,
+ 0x281003,
+ 0x202883,
+ 0x22a042,
+ 0x2d3703,
+ 0x241403,
+ 0x31a2c3,
+ 0x31b444,
+ 0x35a784,
+ 0x227083,
+ 0x793c8,
+ 0xdf1854c,
+ 0xe2ac245,
+ 0xbb705,
+ 0x2000c2,
+ 0x200ac2,
+ 0x202002,
+ 0x202cc2,
+ 0x200202,
+ 0x202402,
+ 0x250cc2,
+ 0x202bc2,
+ 0x200382,
+ 0x200c42,
+ 0x30df02,
+ 0x203742,
+ 0x277782,
+ 0x200a82,
+ 0x2160c2,
+ 0x208402,
+ 0x219d02,
+ 0x2037c2,
+ 0x2cb042,
+ 0x205d42,
+ 0x200682,
+ 0x214f42,
+ 0x212742,
+ 0x202b02,
+ 0x201702,
+ 0x203782,
+ 0x202a02,
+ 0xc2,
+ 0xac2,
+ 0x2002,
+ 0x2cc2,
+ 0x202,
+ 0x2402,
+ 0x50cc2,
+ 0x2bc2,
+ 0x382,
+ 0xc42,
+ 0x10df02,
+ 0x3742,
+ 0x77782,
+ 0xa82,
+ 0x160c2,
+ 0x8402,
+ 0x19d02,
+ 0x37c2,
+ 0xcb042,
+ 0x5d42,
+ 0x682,
+ 0x14f42,
+ 0x12742,
+ 0x2b02,
+ 0x1702,
+ 0x3782,
+ 0x2a02,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2296c3,
+ 0x20cb83,
+ 0x1642,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2296c3,
+ 0x20cb83,
+ 0x16542,
+ 0x216542,
+ 0x20cb83,
+ 0x10216543,
+ 0x343b43,
+ 0x216443,
+ 0xeb2c7,
+ 0x7ca83,
+ 0x2386c2,
+ 0x793c8,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x30103,
+ 0x2296c3,
+ 0xd903,
+ 0x7ca83,
+ 0x20cb83,
+ 0xe042,
+ 0x2001c2,
+ 0x15ca1c5,
+ 0x146c05,
+ 0x20cd42,
+ 0x793c8,
+ 0x16542,
+ 0x23dec2,
+ 0x204202,
+ 0x202702,
+ 0x23a382,
+ 0x24ba82,
+ 0x10f7c5,
+ 0x201482,
+ 0x203c82,
+ 0x201102,
+ 0x203382,
+ 0x208402,
+ 0x2473c2,
+ 0x20b5c2,
+ 0x21c282,
+ 0x11278384,
+ 0x142,
+ 0xb46c7,
+ 0x15a43,
+ 0x1b63cd,
+ 0xeed09,
+ 0xef94b,
+ 0xf1748,
+ 0x64f09,
+ 0x114786,
+ 0x343b43,
+ 0x793c8,
+ 0x9c4,
+ 0x12db83,
+ 0x10e645,
+ 0x793c8,
+ 0xebe47,
+ 0x12455f47,
+ 0x12a5f244,
+ 0x62246,
+ 0x10e689,
+ 0xb448e,
+ 0x13e247,
+ 0x15d8303,
+ 0x12e0ad42,
+ 0x9989,
+ 0xa144,
+ 0x2000c2,
+ 0x25dd04,
+ 0x216542,
+ 0x216543,
+ 0x2104c2,
+ 0x222bc3,
+ 0x1a003,
+ 0x200382,
+ 0x2e8fc4,
+ 0x243543,
+ 0x256e02,
+ 0x2296c3,
+ 0x4ba82,
+ 0x2003c2,
+ 0x20cb83,
+ 0x24d906,
+ 0x33538f,
+ 0x602,
+ 0x723543,
+ 0x2f5dca,
+ 0x793c8,
+ 0x216542,
+ 0x2f5503,
+ 0x343b43,
+ 0x216443,
+ 0xd903,
+ 0x147b5e07,
+ 0x157cd06,
+ 0x13f046,
+ 0x14bc4b88,
+ 0x1db944,
+ 0x14ebe40a,
+ 0x15abe40d,
+ 0xb4488,
+ 0x142e44b,
+ 0x147888a,
+ 0x15c66b43,
+ 0xf3949,
+ 0x16104b48,
+ 0x1664c347,
+ 0x15e360a,
+ 0x1513e47,
+ 0xaec8b,
+ 0x16a9068c,
+ 0xa5545,
+ 0xcf9c5,
+ 0x11c5c9,
+ 0x1a0c84,
+ 0x117703,
+ 0x152be545,
+ 0x124443,
+ 0x15635c43,
+ 0x124443,
+ 0x1d7607,
+ 0x2bdc2,
+ 0x6502,
+ 0x6502,
+ 0x4182,
+ 0x6502,
+ 0x4a42,
+ 0xd42,
+ 0x3242,
+ 0x146c05,
+ 0xb46c7,
+ 0x1db944,
+ 0x102784,
+ 0x216542,
+ 0x216543,
+ 0x343b43,
+ 0x2296c3,
+ 0x2000c2,
+ 0x200c82,
+ 0x206342,
+ 0x17a16543,
+ 0x247382,
+ 0x222bc3,
+ 0x201282,
+ 0x234402,
+ 0x343b43,
+ 0x2038c2,
+ 0x271cc2,
+ 0x22f402,
+ 0x200cc2,
+ 0x29a402,
+ 0x200802,
+ 0x200d82,
+ 0x205102,
+ 0x2870c2,
+ 0x2027c2,
+ 0x132a0c,
+ 0x2c1442,
+ 0x25adc2,
+ 0x230c02,
+ 0x253582,
+ 0x216443,
+ 0x200bc2,
+ 0x2296c3,
+ 0x20f502,
+ 0x298642,
+ 0x20cb83,
+ 0x249342,
+ 0x202b02,
+ 0x20a0c2,
+ 0x2014c2,
+ 0x2010c2,
+ 0x215a82,
+ 0x20d782,
+ 0x232982,
+ 0x22cec2,
+ 0x325d0a,
+ 0x36918a,
+ 0x39ecca,
+ 0x3e9b42,
+ 0x20cec2,
+ 0x2be702,
+ 0x17f8cc49,
+ 0x183bb68a,
+ 0x14380c7,
+ 0x18601682,
+ 0x1430483,
+ 0x2c02,
+ 0x1bb68a,
+ 0x14f0ce,
+ 0x21d684,
+ 0xe8805,
+ 0x18e16543,
+ 0x48383,
+ 0x222bc3,
+ 0x256d44,
+ 0x343b43,
+ 0x2b1b84,
+ 0x243543,
+ 0x13e049,
+ 0x133e86,
+ 0x216443,
+ 0xf1dc4,
+ 0x1b03,
+ 0x2296c3,
+ 0x149f05,
+ 0x20d903,
+ 0x20cb83,
+ 0x1561c04,
+ 0x24c343,
+ 0x114bc4,
+ 0x201643,
+ 0x793c8,
+ 0x154db43,
+ 0x123486,
+ 0x155c1c4,
+ 0x1a0d45,
+ 0x1a0a8a,
+ 0x130602,
+ 0x199a16cd,
+ 0x1b3dc6,
+ 0x147f11,
+ 0x19f8cc49,
+ 0x1a0dc8,
+ 0x42008,
+ 0x20869487,
+ 0x3b42,
+ 0x18cdc7,
+ 0x208ce,
+ 0x146c0b,
+ 0x148d8b,
+ 0x1c0dca,
+ 0x34347,
+ 0x793c8,
+ 0xb4188,
+ 0xfd87,
+ 0x20c1fe0b,
+ 0x22a87,
+ 0x4242,
+ 0x3288d,
+ 0x163907,
+ 0x127b0a,
+ 0x12510c,
+ 0x1252cf,
+ 0x1ca4cf,
+ 0x212eb34d,
+ 0x2e702,
+ 0x16542,
+ 0x904c8,
+ 0x214e91cc,
+ 0x1aab8a,
+ 0xeb94a,
+ 0x7d54a,
+ 0x84888,
+ 0x1db88,
+ 0x68608,
+ 0xebe08,
+ 0x17bbc8,
+ 0x3242,
+ 0x1ca24f,
+ 0xcaa8b,
+ 0x1dcf08,
+ 0x3e1c7,
+ 0x874ca,
+ 0x3aa4b,
+ 0x51b89,
+ 0x873c7,
+ 0x136f46,
+ 0x1da88,
+ 0x1e0a8c,
+ 0xf4547,
+ 0x31a0a,
+ 0x1c74c8,
+ 0x32f4e,
+ 0x3370e,
+ 0x3418b,
+ 0x3518b,
+ 0x3678b,
+ 0xfc849,
+ 0x880cb,
+ 0xb688d,
+ 0x158a8b,
+ 0xf7a8d,
+ 0xf7e0d,
+ 0x12378a,
+ 0x15a5cb,
+ 0x1e150b,
+ 0x3f545,
+ 0x219c4bd0,
+ 0x21c41a88,
+ 0x3610f,
+ 0x7854f,
+ 0x2254d,
+ 0x17a710,
+ 0x13242,
+ 0x22258908,
+ 0x1cdd88,
+ 0x1b0350,
+ 0x106a4e,
+ 0x2275bd85,
+ 0x555cb,
+ 0x13d150,
+ 0x1dc8a,
+ 0x35349,
+ 0x6ff47,
+ 0x70287,
+ 0x70447,
+ 0x71587,
+ 0x72407,
+ 0x72787,
+ 0x734c7,
+ 0x73a07,
+ 0x73f07,
+ 0x74287,
+ 0x74947,
+ 0x74b07,
+ 0x74cc7,
+ 0x74e87,
+ 0x75207,
+ 0x756c7,
+ 0x75ec7,
+ 0x76287,
+ 0x768c7,
+ 0x76b87,
+ 0x76d47,
+ 0x77047,
+ 0x77647,
+ 0x77847,
+ 0x78d07,
+ 0x78ec7,
+ 0x79087,
+ 0x79807,
+ 0x7a047,
+ 0x7a8c7,
+ 0x7d387,
+ 0x7d7c7,
+ 0x7db47,
+ 0x7dd07,
+ 0x7e107,
+ 0x7e547,
+ 0x7ea07,
+ 0x7ef87,
+ 0x7f147,
+ 0x7f307,
+ 0x7f747,
+ 0x7fd07,
+ 0x80247,
+ 0x80847,
+ 0x80a07,
+ 0x810c7,
+ 0x81607,
+ 0xc342,
+ 0x6870a,
+ 0x1a608,
+ 0x1bbfcc,
+ 0x12fb47,
+ 0x44405,
+ 0xc3d91,
+ 0x13dc6,
+ 0x12100a,
+ 0x9034a,
+ 0x62246,
+ 0xb7f4b,
+ 0x642,
+ 0x39c91,
+ 0xc5889,
+ 0xa0689,
+ 0xa12c6,
+ 0x5102,
+ 0x9c50a,
+ 0xb4e49,
+ 0xb558f,
+ 0xb5b8e,
+ 0xb7288,
+ 0x22a17a92,
+ 0x19b88,
+ 0x22f2fd07,
+ 0x1ec82,
+ 0x15c709,
+ 0x15490a,
+ 0x23347589,
+ 0x19de09,
+ 0x19de0c,
+ 0x15f4b,
+ 0x436ce,
+ 0xe6cc,
+ 0xf364f,
+ 0x1bfdce,
+ 0x4594c,
+ 0x5e789,
+ 0x658d1,
+ 0x65e88,
+ 0x7bd12,
+ 0x7cd4d,
+ 0x7e6cd,
+ 0x8564b,
+ 0x8b795,
+ 0x932c9,
+ 0x18500a,
+ 0x1b0049,
+ 0x1d4350,
+ 0x99acb,
+ 0x9ee0f,
+ 0xa3fcb,
+ 0xad6cc,
+ 0xbac90,
+ 0xd844a,
+ 0x18264d,
+ 0x19210e,
+ 0xbc48a,
+ 0xc090c,
+ 0x1997d4,
+ 0xc5511,
+ 0xca64b,
+ 0xccc8f,
+ 0xd048d,
+ 0xd42ce,
+ 0xd55cc,
+ 0xd5dcc,
+ 0xd814b,
+ 0x14284e,
+ 0x197d50,
+ 0x1aa38b,
+ 0xddacd,
+ 0xe730f,
+ 0xec90c,
+ 0x108b4e,
+ 0x10c891,
+ 0x18214c,
+ 0x11ca07,
+ 0x144e8d,
+ 0x15ffcc,
+ 0x1693d0,
+ 0x17208d,
+ 0x172dc7,
+ 0x195a10,
+ 0x1a5888,
+ 0x1abd0b,
+ 0xbd9cf,
+ 0x1bc248,
+ 0x68e8d,
+ 0x111f10,
+ 0x174389,
+ 0x237c4b88,
+ 0x23ac2a86,
+ 0xc3943,
+ 0x52a89,
+ 0x54c9,
+ 0xcbc45,
+ 0x7bc2,
+ 0x18fd89,
+ 0x62c8a,
+ 0x23e7c1c6,
+ 0x147c1cd,
+ 0x24363b04,
+ 0x1da806,
+ 0x2630a,
+ 0x2778d,
+ 0x246da54b,
+ 0x2484f809,
+ 0x2b203,
+ 0x11b88a,
+ 0xe9951,
+ 0xe9d89,
+ 0xeb8c7,
+ 0xec648,
+ 0xecd07,
+ 0x12fc08,
+ 0x14808b,
+ 0x1326c9,
+ 0xf2550,
+ 0xf2a0c,
+ 0x24ef31cd,
+ 0xf5c48,
+ 0xf7685,
+ 0x1d0608,
+ 0x19a8ca,
+ 0x16c507,
+ 0x1cc2,
+ 0x25239155,
+ 0x13de4a,
+ 0x1363c9,
+ 0x5688,
+ 0xa2549,
+ 0x1df185,
+ 0x11c70a,
+ 0x97c4f,
+ 0xa55cb,
+ 0x15ee8c,
+ 0xc8052,
+ 0x1b5a06,
+ 0x9a905,
+ 0x15f148,
+ 0xfa0cb,
+ 0xfa9d1,
+ 0x143847,
+ 0x5788a,
+ 0x25704a05,
+ 0x1b560c,
+ 0x13a843,
+ 0x1953c6,
+ 0x473c2,
+ 0x10ad8b,
+ 0x10b8ca,
+ 0x150bc4c,
+ 0xf48c8,
+ 0xf7c48,
+ 0x25a05706,
+ 0x1b7287,
+ 0x4a02,
+ 0x1ec2,
+ 0x1a6e50,
+ 0x67dc7,
+ 0x67ecf,
+ 0x30846,
+ 0x12270e,
+ 0x9d3cb,
+ 0x46c88,
+ 0x51f49,
+ 0x117052,
+ 0x11820d,
+ 0x118d88,
+ 0xef809,
+ 0x19c60d,
+ 0x112c9,
+ 0x6824b,
+ 0x69d88,
+ 0x73d08,
+ 0x75388,
+ 0x771c9,
+ 0x773ca,
+ 0x799cc,
+ 0x1e17ca,
+ 0xf14ca,
+ 0x1177c7,
+ 0xa38ca,
+ 0x738d,
+ 0x174cd1,
+ 0x25ed45c6,
+ 0x17768b,
+ 0xbe0c,
+ 0x414c8,
+ 0x3d609,
+ 0x14c6cd,
+ 0x57110,
+ 0x190c8d,
+ 0x6502,
+ 0x6540d,
+ 0x4a42,
+ 0x66342,
+ 0x11770a,
+ 0x263d034a,
+ 0x25c4a,
+ 0x26680b48,
+ 0x120f0a,
+ 0x12f4cb,
+ 0x3398c,
+ 0x1203ca,
+ 0x2692064f,
+ 0x120a0e,
+ 0x26de9a05,
+ 0x12bf48,
+ 0xe042,
+ 0x1420a83,
+ 0x1a38e20e,
+ 0x1ab2eb8e,
+ 0x1b202cca,
+ 0x1bb7c04e,
+ 0x1c32d84e,
+ 0x1cb3408c,
+ 0x14380c7,
+ 0x14380c9,
+ 0x1430483,
+ 0x1d3419cc,
+ 0x1db54e89,
+ 0x1e36d309,
+ 0x1eba0889,
+ 0x2c02,
+ 0x1a3511,
+ 0x12ead1,
+ 0x2c0d,
+ 0x17bf91,
+ 0x12d791,
+ 0x133fcf,
+ 0x14190f,
+ 0x154dcc,
+ 0x16d24c,
+ 0x1a07cc,
+ 0x1b764d,
+ 0x17d415,
+ 0xc510c,
+ 0xe140c,
+ 0x1439d0,
+ 0x14a18c,
+ 0x18758c,
+ 0x18df59,
+ 0x1bed19,
+ 0x1cabd9,
+ 0x1cc7d4,
+ 0x1d2454,
+ 0x1e8694,
+ 0x5e54,
+ 0xff14,
+ 0x1f2c51c9,
+ 0x1f9e8949,
+ 0x202e14c9,
+ 0x1a666089,
+ 0x2c02,
+ 0x1ae66089,
+ 0x2c02,
+ 0x5e4a,
+ 0x2c02,
+ 0x1b666089,
+ 0x2c02,
+ 0x5e4a,
+ 0x2c02,
+ 0x1be66089,
+ 0x2c02,
+ 0x1c666089,
+ 0x2c02,
+ 0x1ce66089,
+ 0x2c02,
+ 0x5e4a,
+ 0x2c02,
+ 0x1d666089,
+ 0x2c02,
+ 0x5e4a,
+ 0x2c02,
+ 0x1de66089,
+ 0x2c02,
+ 0x1e666089,
+ 0x2c02,
+ 0x5e4a,
+ 0x2c02,
+ 0x1ee66089,
+ 0x2c02,
+ 0x5e4a,
+ 0x2c02,
+ 0x1f666089,
+ 0x2c02,
+ 0x1fe66089,
+ 0x2c02,
+ 0x20666089,
+ 0x2c02,
+ 0x5e4a,
+ 0x2c02,
+ 0x1400401,
+ 0x147f05,
+ 0x1c0dc4,
+ 0x8903,
+ 0x8502,
+ 0x54642,
+ 0x1419303,
+ 0x1403603,
+ 0x14fea83,
+ 0x18e20e,
+ 0x12eb8e,
+ 0x89e8e,
+ 0x2cca,
+ 0x17c04e,
+ 0x12d84e,
+ 0x13408c,
+ 0x1419cc,
+ 0x154e89,
+ 0x16d309,
+ 0x1a0889,
+ 0xc51c9,
+ 0x1e8949,
+ 0xe14c9,
+ 0x143a8d,
+ 0x6109,
+ 0x101c9,
+ 0x3d1c2,
+ 0x1cbcc4,
+ 0x1cec84,
+ 0x1d1104,
+ 0x1df604,
+ 0xaef44,
+ 0xacdc4,
+ 0x4a9c4,
+ 0x35644,
+ 0x1a704,
+ 0x136fc4,
+ 0x7b0c9,
+ 0x7b0cc,
+ 0x158286,
+ 0x15828e,
+ 0x7ce84,
+ 0x155cf03,
+ 0x14a007,
+ 0x148ae0c,
+ 0x9983,
+ 0x136fc4,
+ 0x13242,
+ 0xe91c8,
+ 0xd6b04,
+ 0x1e9706,
+ 0xdd5c4,
+ 0x121646,
+ 0x1f8c2,
+ 0x7281,
+ 0x27c44,
+ 0x69306,
+ 0x15b83,
+ 0x9983,
+ 0x71703,
+ 0xc7e43,
+ 0x14803,
+ 0xf7a03,
+ 0xc8045,
+ 0x5adc2,
+ 0x148a42,
+ 0x1a1e88,
+ 0xee7c7,
+ 0x132747,
+ 0x3242,
+ 0x2000c2,
+ 0x216542,
+ 0x2104c2,
+ 0x218242,
+ 0x200382,
+ 0x2003c2,
+ 0x201ec2,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x26a7c3,
+ 0x2296c3,
+ 0x20cb83,
+ 0x793c8,
+ 0x216543,
+ 0x222bc3,
+ 0x2296c3,
+ 0x20cb83,
+ 0xb303,
+ 0x343b43,
+ 0xb1b84,
+ 0x2000c2,
+ 0x253c43,
+ 0x29216543,
+ 0x3a5287,
+ 0x343b43,
+ 0x21b283,
+ 0x21b544,
+ 0x2296c3,
+ 0x20cb83,
+ 0x23098a,
+ 0x24d905,
+ 0x21f6c3,
+ 0x213402,
+ 0x793c8,
+ 0x296df98a,
+ 0xe01,
+ 0x793c8,
+ 0x16542,
+ 0x138402,
+ 0x29e4f58b,
+ 0x2a2093c4,
+ 0x163a45,
+ 0x1403ec5,
+ 0xe91c6,
+ 0x2a603ec5,
+ 0x5fa83,
+ 0x1b0243,
+ 0x9c4,
+ 0x12db83,
+ 0x10e645,
+ 0x146c05,
+ 0x793c8,
+ 0x22a87,
+ 0x16543,
+ 0x1b4bcd,
+ 0x2ae42647,
+ 0x1386,
+ 0x2b17be85,
+ 0x186012,
+ 0x1447,
+ 0x1e48a,
+ 0x17588,
+ 0x1e387,
+ 0x7368a,
+ 0x1bd188,
+ 0x110a47,
+ 0x165d8f,
+ 0x3db87,
+ 0x4bb86,
+ 0x13d150,
+ 0x19350f,
+ 0x1b009,
+ 0x1da884,
+ 0x2b40150e,
+ 0x5b0c9,
+ 0x74fc6,
+ 0x1113c9,
+ 0x190a86,
+ 0x6ac6,
+ 0xb8e4c,
+ 0x3ac4a,
+ 0x51d07,
+ 0x14140a,
+ 0x1909,
+ 0x25e8c,
+ 0x2954a,
+ 0x6b44a,
+ 0x10e689,
+ 0x1da806,
+ 0x51dca,
+ 0x11934a,
+ 0xa954a,
+ 0x114309,
+ 0xe8b88,
+ 0xe8e06,
+ 0xef08d,
+ 0x5b88b,
+ 0xcc205,
+ 0x2bb1e14c,
+ 0x13e247,
+ 0x10fcc9,
+ 0xd6187,
+ 0xc5c14,
+ 0x11230b,
+ 0x1dcd4a,
+ 0x116eca,
+ 0xb080d,
+ 0x152f6c9,
+ 0x117fcc,
+ 0x118b8b,
+ 0x31a03,
+ 0x31a03,
+ 0x32f46,
+ 0x31a03,
+ 0xe91c8,
+ 0x157243,
+ 0x4ebc4,
+ 0x5fc83,
+ 0x14a9607,
+ 0x51f05,
+ 0x15186c3,
+ 0x5c549,
+ 0xc8045,
+ 0xfa0cb,
+ 0x14ecb83,
+ 0x152e06,
+ 0x1523947,
+ 0x1d45c7,
+ 0x2c97ce89,
+ 0x1d1a86,
+ 0x53c43,
+ 0x793c8,
+ 0x16542,
+ 0x56d44,
+ 0x43ac3,
+ 0x155b45,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2296c3,
+ 0x20cb83,
+ 0x203b43,
+ 0x216543,
+ 0x222bc3,
+ 0x2f5503,
+ 0x343b43,
+ 0x216443,
+ 0x2296c3,
+ 0x20cb83,
+ 0x2a0843,
+ 0x201643,
+ 0x203b43,
+ 0x25dd04,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2296c3,
+ 0x20cb83,
+ 0x20e603,
+ 0x2192c3,
+ 0x213402,
+ 0x2e17cf85,
+ 0x1438003,
+ 0x216543,
+ 0x222bc3,
+ 0x21a003,
+ 0x2f5503,
+ 0x343b43,
+ 0x2b1b84,
+ 0x34b203,
+ 0x233243,
+ 0x216443,
+ 0x2296c3,
+ 0x7ca83,
+ 0x20cb83,
+ 0x21f6c3,
+ 0x2ee0fc03,
+ 0xc7f49,
+ 0x16542,
+ 0x225103,
+ 0x2fa16543,
+ 0x222bc3,
+ 0x252183,
+ 0x343b43,
+ 0x2207c3,
+ 0x233243,
+ 0x20cb83,
+ 0x2037c3,
+ 0x3df304,
+ 0x793c8,
+ 0x30216543,
+ 0x222bc3,
+ 0x2b7343,
+ 0x343b43,
+ 0x216443,
+ 0x21b544,
+ 0x2296c3,
+ 0x20cb83,
+ 0x238743,
+ 0x793c8,
+ 0x30a16543,
+ 0x222bc3,
+ 0x2f5503,
+ 0x20d903,
+ 0x20cb83,
+ 0x793c8,
+ 0x14380c7,
+ 0x253c43,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2b1b84,
+ 0x21b544,
+ 0x2296c3,
+ 0x20cb83,
+ 0x146c05,
+ 0xb46c7,
+ 0xc5e4b,
+ 0x31a3ca06,
+ 0x31efdb4b,
+ 0xea184,
+ 0xcc205,
+ 0x1472588,
+ 0x2f20d,
+ 0x1c4b88,
+ 0x136fc4,
+ 0x3264ccc5,
+ 0x27804,
+ 0x16542,
+ 0x1a143,
+ 0x158185,
+ 0x386c2,
+ 0x34aac5,
+ 0x793c8,
+ 0x33e98f0d,
+ 0x343a11ca,
+ 0x24642,
+ 0x5483,
+ 0x164f4f,
+ 0x18242,
+ 0x7ce84,
+ 0x136fc4,
+ 0x16542,
+ 0x2000c2,
+ 0x253c43,
+ 0x216543,
+ 0x343b43,
+ 0x2b1b84,
+ 0x216443,
+ 0x21b544,
+ 0x2296c3,
+ 0x20cb83,
+ 0x21f6c3,
+ 0x216543,
+ 0x222bc3,
+ 0x2296c3,
+ 0x20cb83,
+ 0x19045,
+ 0x331408,
+ 0x25dd04,
+ 0x379ac6,
+ 0x3a0686,
+ 0x793c8,
+ 0x2b6643,
+ 0x2f6689,
+ 0x21c495,
+ 0x1c49f,
+ 0x216543,
+ 0xf4d87,
+ 0x38db12,
+ 0x16a146,
+ 0x182c45,
+ 0x1dc8a,
+ 0x35349,
+ 0x38d8cf,
+ 0x2e8fc4,
+ 0x237a05,
+ 0x313790,
+ 0x2b1087,
+ 0x20d903,
+ 0x2c2308,
+ 0x13846,
+ 0x29fc4a,
+ 0x26fb04,
+ 0x304443,
+ 0x213402,
+ 0x2fe64b,
+ 0x222bc3,
+ 0x343b43,
+ 0xd903,
+ 0x15b044,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x216443,
+ 0x2296c3,
+ 0xd903,
+ 0x20cb83,
+ 0x309a43,
+ 0x216542,
+ 0x187003,
+ 0x149c04,
+ 0x2296c3,
+ 0x20cb83,
+ 0x364419c5,
+ 0x1de746,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x216443,
+ 0x20cb83,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x21b283,
+ 0x233c83,
+ 0x20cb83,
+ 0x53c43,
+ 0x216542,
+ 0x216543,
+ 0x222bc3,
+ 0x2296c3,
+ 0xd903,
+ 0x20cb83,
+ 0x19f42,
+ 0x2000c2,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2296c3,
+ 0x20cb83,
+ 0x3ec5,
+ 0x63a09,
+ 0x9983,
+ 0x25dd04,
+ 0x216543,
+ 0x222bc3,
+ 0x28d4c4,
+ 0x2296c3,
+ 0x20cb83,
+ 0x793c8,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2296c3,
+ 0x7ca83,
+ 0x20cb83,
+ 0x1b7409,
+ 0xe804,
+ 0x216543,
+ 0x3242,
+ 0x222bc3,
+ 0x2f5503,
+ 0x20e443,
+ 0x216443,
+ 0x2296c3,
+ 0xd903,
+ 0x20cb83,
+ 0x2a02,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x3636c4,
+ 0x2b1b84,
+ 0x2296c3,
+ 0x20cb83,
+ 0x201643,
+ 0x4702,
+ 0x216542,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2296c3,
+ 0x7ca83,
+ 0x20cb83,
+ 0x793c8,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x284103,
+ 0xe103,
+ 0x1b283,
+ 0x2296c3,
+ 0x7ca83,
+ 0x20cb83,
+ 0x38bc6,
+ 0x325d0a,
+ 0x3453c9,
+ 0x35fd4b,
+ 0x36084a,
+ 0x36918a,
+ 0x37860b,
+ 0x39084a,
+ 0x3979ca,
+ 0x39ecca,
+ 0x39ef4b,
+ 0x3c5589,
+ 0x3d368a,
+ 0x3d3acb,
+ 0x3dfecb,
+ 0x3e914a,
+ 0x4042,
+ 0x216543,
+ 0x222bc3,
+ 0x2f5503,
+ 0x216443,
+ 0x2296c3,
+ 0xd903,
+ 0x20cb83,
+ 0x3ecb,
+ 0x106a47,
+ 0x69a08,
+ 0x19c744,
+ 0x1db944,
+ 0x98e48,
+ 0xedac6,
+ 0x1481c6,
+ 0x13a09,
+ 0x793c8,
+ 0x216543,
+ 0x1dc84,
+ 0x26ff44,
+ 0x215d42,
+ 0x21b544,
+ 0x30eb85,
+ 0x203b43,
+ 0x25dd04,
+ 0x216543,
+ 0x23ec84,
+ 0x222bc3,
+ 0x256d44,
+ 0x2e8fc4,
+ 0x2b1b84,
+ 0x233243,
+ 0x2296c3,
+ 0x20cb83,
+ 0x2655c5,
+ 0x20e603,
+ 0x21f6c3,
+ 0x27d683,
+ 0x2d1984,
+ 0x323404,
+ 0x34bd45,
+ 0x793c8,
+ 0x32e744,
+ 0x3c2086,
+ 0x30e7c4,
+ 0x216542,
+ 0x2c8447,
+ 0x250707,
+ 0x254744,
+ 0x2ee845,
+ 0x372285,
+ 0x2b96c5,
+ 0x2b1b84,
+ 0x267408,
+ 0x25d206,
+ 0x392c88,
+ 0x287105,
+ 0x2efe85,
+ 0x257204,
+ 0x20cb83,
+ 0x305504,
+ 0x3770c6,
+ 0x24da03,
+ 0x2d1984,
+ 0x26fac5,
+ 0x38fd04,
+ 0x2aacc4,
+ 0x213402,
+ 0x38f846,
+ 0x3b8fc6,
+ 0x315f85,
+ 0x2000c2,
+ 0x253c43,
+ 0xedc46,
+ 0x3b616542,
+ 0x231d44,
+ 0x63dc5,
+ 0x200382,
+ 0x216443,
+ 0x2a9542,
+ 0x2296c3,
+ 0x2003c2,
+ 0x301a46,
+ 0x202b03,
+ 0x1da785,
+ 0x201643,
+ 0x793c8,
+ 0x793c8,
+ 0x343b43,
+ 0x7ca83,
+ 0x2000c2,
+ 0x3c216542,
+ 0x343b43,
+ 0x274c43,
+ 0x34b203,
+ 0x2093c4,
+ 0x2296c3,
+ 0x20cb83,
+ 0x793c8,
+ 0x2000c2,
+ 0x3ca16542,
+ 0x216543,
+ 0x2296c3,
+ 0xd903,
+ 0x20cb83,
+ 0x682,
+ 0x2091c2,
+ 0x22a042,
+ 0x21b283,
+ 0x2faf43,
+ 0x2000c2,
+ 0x146c05,
+ 0x793c8,
+ 0xb46c7,
+ 0x216542,
+ 0x222bc3,
+ 0x256d44,
+ 0x204f03,
+ 0x343b43,
+ 0x20e443,
+ 0x216443,
+ 0x2296c3,
+ 0x20b243,
+ 0x20cb83,
+ 0x23d343,
+ 0x1643,
+ 0x13ff13,
+ 0x142f14,
+ 0x146c05,
+ 0xb46c7,
+ 0x1e489,
+ 0x1e1e06,
+ 0x19108b,
+ 0x32f46,
+ 0x60ac7,
+ 0x145246,
+ 0x649,
+ 0x15d3ca,
+ 0x9560d,
+ 0x1b60cc,
+ 0x119cca,
+ 0x46688,
+ 0x10f7c5,
+ 0x1e4c8,
+ 0x30846,
+ 0x1d1806,
+ 0x13906,
+ 0x602,
+ 0x213242,
+ 0x15cb84,
+ 0x1d4b06,
+ 0x1255d0,
+ 0x14dbf0e,
+ 0x1a1146,
+ 0x41dcc,
+ 0x3e37cd0b,
+ 0x146c05,
+ 0x152c0b,
+ 0x3e7d1744,
+ 0x1c0f87,
+ 0x2c191,
+ 0x12140a,
+ 0x216543,
+ 0x3ea8ad08,
+ 0x73605,
+ 0x89288,
+ 0x2a2c4,
+ 0x62e85,
+ 0x3ec0b186,
+ 0x1bc60b,
+ 0xc3d86,
+ 0x72206,
+ 0x9a6ca,
+ 0x16c5cc,
+ 0x1c2003,
+ 0x1db944,
+ 0x3f218004,
+ 0x5c549,
+ 0x192e07,
+ 0xac00a,
+ 0x14df889,
+ 0x605,
+ 0xb6803,
+ 0x3f63d487,
+ 0x149f05,
+ 0x1565b86,
+ 0x157ac46,
+ 0x3fb92f4f,
+ 0xb800c,
+ 0x107588,
+ 0x3fc473c3,
+ 0x10a3c4,
+ 0xfe88b,
+ 0x1d694b,
+ 0x4025240c,
+ 0x14110c3,
+ 0xcddc8,
+ 0xfeb05,
+ 0xca909,
+ 0xeb643,
+ 0x12f7c8,
+ 0x1426246,
+ 0x95c87,
+ 0x4074c6c9,
+ 0x41a7a6c8,
+ 0x9dc07,
+ 0xcf9ca,
+ 0x41fc9408,
+ 0x11884d,
+ 0x12248,
+ 0x9983,
+ 0x146a249,
+ 0x14c203,
+ 0x32f46,
+ 0xe91c8,
+ 0x1a704,
+ 0x1d8645,
+ 0xfea83,
+ 0x1497d03,
+ 0x20a87,
+ 0x40a20a83,
+ 0x40fc2486,
+ 0x41240644,
+ 0x4170ba87,
+ 0xe91c4,
+ 0xe91c4,
+ 0xe91c4,
+ 0xe91c4,
+ 0x3ec5,
+ 0x1a18c8,
+ 0x148209,
+ 0x41,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x216443,
+ 0x2296c3,
+ 0x20cb83,
+ 0x2000c2,
+ 0x216542,
+ 0x343b43,
+ 0x2042c2,
+ 0x2296c3,
+ 0x20cb83,
+ 0x202b03,
+ 0x3835cf,
+ 0x38398e,
+ 0x793c8,
+ 0x216543,
+ 0x4e6c7,
+ 0x222bc3,
+ 0x343b43,
+ 0x243543,
+ 0x2296c3,
+ 0x20cb83,
+ 0x1a1084,
+ 0x12dcc4,
+ 0x9c04,
+ 0x224503,
+ 0x3a2347,
+ 0x202302,
+ 0x277c09,
+ 0x200ac2,
+ 0x3a714b,
+ 0x2e808a,
+ 0x2ec409,
+ 0x200542,
+ 0x22a686,
+ 0x256255,
+ 0x3a7295,
+ 0x259fd3,
+ 0x3a7813,
+ 0x22d0c2,
+ 0x22d0c5,
+ 0x363e0c,
+ 0x27ff8b,
+ 0x281405,
+ 0x202cc2,
+ 0x30a8c2,
+ 0x37ed06,
+ 0x203b42,
+ 0x2d4b06,
+ 0x21df0d,
+ 0x349c8c,
+ 0x3c4c44,
+ 0x200882,
+ 0x205242,
+ 0x27c0c8,
+ 0x200202,
+ 0x32dd86,
+ 0x39a18f,
+ 0x32dd90,
+ 0x3abc44,
+ 0x256415,
+ 0x25a153,
+ 0x20a883,
+ 0x3630ca,
+ 0x211d47,
+ 0x39f1c9,
+ 0x3129c7,
+ 0x328c42,
+ 0x200282,
+ 0x3cb7c6,
+ 0x207dc2,
+ 0x793c8,
+ 0x202502,
+ 0x20bd42,
+ 0x212e47,
+ 0x38d507,
+ 0x38d511,
+ 0x221a05,
+ 0x221a0e,
+ 0x22204f,
+ 0x204242,
+ 0x2f1c07,
+ 0x224b48,
+ 0x2016c2,
+ 0x2295c2,
+ 0x227406,
+ 0x22740f,
+ 0x23ff50,
+ 0x237242,
+ 0x204182,
+ 0x336588,
+ 0x210903,
+ 0x2920c8,
+ 0x2cb30d,
+ 0x204183,
+ 0x3a04c8,
+ 0x28e48f,
+ 0x28e84e,
+ 0x316b8a,
+ 0x3b3ed1,
+ 0x3b4350,
+ 0x21b9cd,
+ 0x21bd0c,
+ 0x386987,
+ 0x363247,
+ 0x379b89,
+ 0x20cd02,
+ 0x202402,
+ 0x26274c,
+ 0x262a4b,
+ 0x200d42,
+ 0x2d8306,
+ 0x20c602,
+ 0x200482,
+ 0x22e702,
+ 0x216542,
+ 0x3dbec4,
+ 0x241787,
+ 0x213b02,
+ 0x248d87,
+ 0x24a7c7,
+ 0x215a42,
+ 0x219d82,
+ 0x24e585,
+ 0x20c542,
+ 0x250e0e,
+ 0x39654d,
+ 0x222bc3,
+ 0x243c8e,
+ 0x2c764d,
+ 0x3c4143,
+ 0x2026c2,
+ 0x2730c4,
+ 0x2b3802,
+ 0x213642,
+ 0x3a6a05,
+ 0x3acc07,
+ 0x250d02,
+ 0x218242,
+ 0x256947,
+ 0x25c8c8,
+ 0x25c082,
+ 0x29a986,
+ 0x2625cc,
+ 0x26290b,
+ 0x20eb02,
+ 0x26c34f,
+ 0x26c710,
+ 0x26cb0f,
+ 0x26ced5,
+ 0x26d414,
+ 0x26d90e,
+ 0x26dc8e,
+ 0x26e00f,
+ 0x26e3ce,
+ 0x26e754,
+ 0x26ec53,
+ 0x26f10d,
+ 0x2817c9,
+ 0x2975c3,
+ 0x204342,
+ 0x322205,
+ 0x204f06,
+ 0x200382,
+ 0x2bfd47,
+ 0x343b43,
+ 0x200642,
+ 0x23e448,
+ 0x3b4111,
+ 0x3b4550,
+ 0x202102,
+ 0x296907,
+ 0x202642,
+ 0x25c247,
+ 0x207bc2,
+ 0x208309,
+ 0x37ecc7,
+ 0x3e5848,
+ 0x20afc6,
+ 0x208703,
+ 0x208705,
+ 0x225e82,
+ 0x2004c2,
+ 0x3cbbc5,
+ 0x36bd85,
+ 0x20b402,
+ 0x237843,
+ 0x352f87,
+ 0x3c3c47,
+ 0x203f02,
+ 0x38f0c4,
+ 0x271f43,
+ 0x33eec9,
+ 0x3c7348,
+ 0x209d42,
+ 0x210442,
+ 0x22cac7,
+ 0x231745,
+ 0x20c708,
+ 0x327287,
+ 0x20f543,
+ 0x3d4986,
+ 0x21b84d,
+ 0x21bbcc,
+ 0x223046,
+ 0x204202,
+ 0x31de42,
+ 0x201582,
+ 0x28e30f,
+ 0x28e70e,
+ 0x372307,
+ 0x202042,
+ 0x3d2185,
+ 0x3d2186,
+ 0x228882,
+ 0x200bc2,
+ 0x298346,
+ 0x210783,
+ 0x3c2c46,
+ 0x2dd585,
+ 0x2dd58d,
+ 0x2de195,
+ 0x2ded4c,
+ 0x2df0cd,
+ 0x2df412,
+ 0x203742,
+ 0x277782,
+ 0x202802,
+ 0x3437c6,
+ 0x20e586,
+ 0x43296084,
+ 0x201cc2,
+ 0x204f86,
+ 0x201102,
+ 0x3a2b45,
+ 0x205c02,
+ 0x250f49,
+ 0x22d58c,
+ 0x22d8cb,
+ 0x2003c2,
+ 0x25e3c8,
+ 0x211c02,
+ 0x200a82,
+ 0x27de46,
+ 0x266005,
+ 0x200a87,
+ 0x2fca45,
+ 0x2824c5,
+ 0x23d7c2,
+ 0x21e582,
+ 0x208402,
+ 0x29f107,
+ 0x301b0d,
+ 0x301e8c,
+ 0x25d707,
+ 0x29a902,
+ 0x219d02,
+ 0x3e8008,
+ 0x38ff08,
+ 0x2e5e08,
+ 0x3bc204,
+ 0x342ac7,
+ 0x363b83,
+ 0x206bc2,
+ 0x203482,
+ 0x302889,
+ 0x233347,
+ 0x2037c2,
+ 0x27e245,
+ 0x24cec2,
+ 0x204682,
+ 0x30b0c3,
+ 0x30b0c6,
+ 0x309602,
+ 0x30a282,
+ 0x200402,
+ 0x2abc86,
+ 0x273007,
+ 0x213582,
+ 0x200902,
+ 0x291f0f,
+ 0x243acd,
+ 0x39e2ce,
+ 0x2c74cc,
+ 0x20cbc2,
+ 0x202a82,
+ 0x20ae05,
+ 0x324106,
+ 0x200b82,
+ 0x205d42,
+ 0x200682,
+ 0x243e44,
+ 0x2c4b44,
+ 0x36c186,
+ 0x201ec2,
+ 0x292d47,
+ 0x23f643,
+ 0x23f648,
+ 0x2408c8,
+ 0x24ad47,
+ 0x251646,
+ 0x204ac2,
+ 0x2118c3,
+ 0x2118c7,
+ 0x28a6c6,
+ 0x2ed245,
+ 0x27f908,
+ 0x202d82,
+ 0x35b4c7,
+ 0x203782,
+ 0x352902,
+ 0x204102,
+ 0x2221c9,
+ 0x24b302,
+ 0x14448,
+ 0x201b82,
+ 0x25d983,
+ 0x32e887,
+ 0x200f02,
+ 0x22d70c,
+ 0x22da0b,
+ 0x2abf06,
+ 0x223e85,
+ 0x43609d83,
+ 0x22bdc2,
+ 0x202a02,
+ 0x2cf7c6,
+ 0x209003,
+ 0x363447,
+ 0x211482,
+ 0x2008c2,
+ 0x2560d5,
+ 0x3a7455,
+ 0x259e93,
+ 0x3a7993,
+ 0x279587,
+ 0x294d91,
+ 0x2f9010,
+ 0x2a27d2,
+ 0x2a7411,
+ 0x2aae48,
+ 0x2aae50,
+ 0x372f4f,
+ 0x3a5e53,
+ 0x3abf92,
+ 0x2c2690,
+ 0x2bec4f,
+ 0x2c2bd2,
+ 0x2c4191,
+ 0x2d73d3,
+ 0x2dd112,
+ 0x2e3d4f,
+ 0x2e664e,
+ 0x2e7e92,
+ 0x2ec211,
+ 0x2ed70f,
+ 0x2f58ce,
+ 0x2f7251,
+ 0x2f8450,
+ 0x2ff012,
+ 0x307751,
+ 0x309ad0,
+ 0x30b50f,
+ 0x366211,
+ 0x355510,
+ 0x37f0c6,
+ 0x31e787,
+ 0x234ac7,
+ 0x201c02,
+ 0x28ce85,
+ 0x313507,
+ 0x22a042,
+ 0x203f82,
+ 0x3d0545,
+ 0x228183,
+ 0x35c606,
+ 0x301ccd,
+ 0x30200c,
+ 0x205002,
+ 0x363c8b,
+ 0x27fe4a,
+ 0x22cf8a,
+ 0x2ceb09,
+ 0x300a8b,
+ 0x3273cd,
+ 0x313c0c,
+ 0x2477ca,
+ 0x24ec8c,
+ 0x27aa4b,
+ 0x28124c,
+ 0x28418e,
+ 0x2a0b0b,
+ 0x2eafcc,
+ 0x2f3103,
+ 0x2ef706,
+ 0x3c9402,
+ 0x308542,
+ 0x2651c3,
+ 0x2017c2,
+ 0x23d203,
+ 0x351d46,
+ 0x26d087,
+ 0x2e2846,
+ 0x3aad48,
+ 0x352e08,
+ 0x306d06,
+ 0x208e42,
+ 0x31594d,
+ 0x315c8c,
+ 0x3d6b07,
+ 0x319b07,
+ 0x221e02,
+ 0x21f8c2,
+ 0x211842,
+ 0x289c82,
+ 0x3377d6,
+ 0x33c555,
+ 0x33f9d6,
+ 0x344113,
+ 0x3447d2,
+ 0x356dd3,
+ 0x357512,
+ 0x3b7ccf,
+ 0x3c6b58,
+ 0x3c8ed7,
+ 0x3c98d9,
+ 0x3cb218,
+ 0x3cbdd8,
+ 0x3cccd7,
+ 0x3ced97,
+ 0x3d1216,
+ 0x3d6013,
+ 0x3d6f55,
+ 0x3d77d2,
+ 0x3d7c53,
+ 0x30182,
+ 0x43a13a04,
+ 0x43fc4b88,
+ 0x3ec5,
+ 0x216542,
+ 0x2296c3,
+ 0x386c2,
+ 0x20cb83,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x216443,
+ 0x21b544,
+ 0x2296c3,
+ 0x20cb83,
+ 0x202b03,
+ 0x2000c2,
+ 0x2070c2,
+ 0x44e9bcc5,
+ 0x4529b285,
+ 0x4567ad86,
+ 0x793c8,
+ 0x45ac3205,
+ 0x216542,
+ 0x2104c2,
+ 0x45f336c5,
+ 0x4628b685,
+ 0x4668c587,
+ 0x46a93f89,
+ 0x46e1eb44,
+ 0x200382,
+ 0x200642,
+ 0x4725a945,
+ 0x4769b3c9,
+ 0x47b36dc8,
+ 0x47ebb2c5,
+ 0x4834ff07,
+ 0x4861cf88,
+ 0x48b18f85,
+ 0x48e21486,
+ 0x4924b649,
+ 0x496f9ec8,
+ 0x49ad5408,
+ 0x49ea4e8a,
+ 0x4a387144,
+ 0x4a6b2605,
+ 0x4aad1108,
+ 0x4ae876c5,
+ 0x21ab82,
+ 0x4b2e3303,
+ 0x4b6aff46,
+ 0x4bba9148,
+ 0x4bf53fc6,
+ 0x4c273148,
+ 0x4c7da086,
+ 0x4ca4fb84,
+ 0x4ce04cc2,
+ 0x4d6e2c47,
+ 0x4dab7d44,
+ 0x4de85287,
+ 0x4e3e3047,
+ 0x2003c2,
+ 0x4e6a8485,
+ 0x4ea7fa84,
+ 0x4efafd07,
+ 0x4f23cc07,
+ 0x4f690046,
+ 0x4fa8c145,
+ 0x4fea2f07,
+ 0x502cdf88,
+ 0x507e33c7,
+ 0x50abb909,
+ 0x50ee3405,
+ 0x5131f287,
+ 0x5169b0c6,
+ 0x2780b,
+ 0x51a2e2c8,
+ 0x230c4d,
+ 0x271d09,
+ 0x27f48b,
+ 0x29868b,
+ 0x2b744b,
+ 0x2d24cb,
+ 0x32430b,
+ 0x3245cb,
+ 0x324a89,
+ 0x325f8b,
+ 0x32624b,
+ 0x3283cb,
+ 0x328fca,
+ 0x32950a,
+ 0x329b0c,
+ 0x32fecb,
+ 0x33040a,
+ 0x34218a,
+ 0x34c2ce,
+ 0x34d44e,
+ 0x34d7ca,
+ 0x34f78a,
+ 0x35044b,
+ 0x35070b,
+ 0x35120b,
+ 0x36e7cb,
+ 0x36edca,
+ 0x36fa8b,
+ 0x36fd4a,
+ 0x36ffca,
+ 0x37024a,
+ 0x391a8b,
+ 0x39944b,
+ 0x39bc0e,
+ 0x39bf8b,
+ 0x3a7e4b,
+ 0x3a9ecb,
+ 0x3ada8a,
+ 0x3add09,
+ 0x3adf4a,
+ 0x3afa0a,
+ 0x3c654b,
+ 0x3d3d8b,
+ 0x3d4f4a,
+ 0x3d5a4b,
+ 0x3dbc4b,
+ 0x3e8b8b,
+ 0x51e8d908,
+ 0x522946c9,
+ 0x526ab689,
+ 0x52af0788,
+ 0x359645,
+ 0x20dec3,
+ 0x25cd84,
+ 0x2cbb05,
+ 0x21e886,
+ 0x221205,
+ 0x293a44,
+ 0x2bfc48,
+ 0x31fc85,
+ 0x29d144,
+ 0x20d007,
+ 0x2aa84a,
+ 0x24104a,
+ 0x372407,
+ 0x3a9307,
+ 0x2ec787,
+ 0x291247,
+ 0x313305,
+ 0x219686,
+ 0x372c47,
+ 0x35a804,
+ 0x2c9046,
+ 0x3dc846,
+ 0x203345,
+ 0x333144,
+ 0x2a80c6,
+ 0x2a9a07,
+ 0x22fa86,
+ 0x2b6407,
+ 0x23e343,
+ 0x39f546,
+ 0x3367c5,
+ 0x28c687,
+ 0x27588a,
+ 0x23e544,
+ 0x21ad88,
+ 0x2ba709,
+ 0x2c9607,
+ 0x3c6006,
+ 0x267608,
+ 0x37ae89,
+ 0x39f384,
+ 0x322584,
+ 0x30c2c5,
+ 0x21b448,
+ 0x2dbb47,
+ 0x30a449,
+ 0x3d8f48,
+ 0x31b5c6,
+ 0x361b46,
+ 0x2a5ac8,
+ 0x36d846,
+ 0x29b285,
+ 0x290106,
+ 0x285988,
+ 0x28e206,
+ 0x261acb,
+ 0x38a106,
+ 0x2a6f8d,
+ 0x20d485,
+ 0x2b7c06,
+ 0x21d045,
+ 0x3c8609,
+ 0x2e4747,
+ 0x3d2008,
+ 0x3c4f86,
+ 0x2a6209,
+ 0x2c48c6,
+ 0x275805,
+ 0x216b86,
+ 0x2d7cc6,
+ 0x2e02c9,
+ 0x2cc886,
+ 0x31d5c7,
+ 0x2dec05,
+ 0x20c043,
+ 0x261c45,
+ 0x2bc687,
+ 0x3640c6,
+ 0x20d389,
+ 0x27ad86,
+ 0x285486,
+ 0x226a89,
+ 0x28fb09,
+ 0x2aea87,
+ 0x201dc8,
+ 0x29f949,
+ 0x28cb08,
+ 0x3e5e06,
+ 0x2e8945,
+ 0x2834ca,
+ 0x285506,
+ 0x3cfc86,
+ 0x2e2b85,
+ 0x25ec08,
+ 0x358d07,
+ 0x239a8a,
+ 0x257686,
+ 0x303885,
+ 0x30aa86,
+ 0x2048c7,
+ 0x3c5ec7,
+ 0x2ac545,
+ 0x2759c5,
+ 0x23fdc6,
+ 0x36a446,
+ 0x269f46,
+ 0x2d15c4,
+ 0x28ebc9,
+ 0x2966c6,
+ 0x3097ca,
+ 0x232148,
+ 0x31ef88,
+ 0x24104a,
+ 0x2421c5,
+ 0x2a9945,
+ 0x3def48,
+ 0x2ce108,
+ 0x23ae87,
+ 0x288686,
+ 0x33a388,
+ 0x20b607,
+ 0x28d208,
+ 0x2ca506,
+ 0x290f08,
+ 0x2a1dc6,
+ 0x287287,
+ 0x29ea46,
+ 0x2a80c6,
+ 0x2313ca,
+ 0x3dbf46,
+ 0x2e8949,
+ 0x2abb86,
+ 0x212f8a,
+ 0x24fb89,
+ 0x3024c6,
+ 0x2cd844,
+ 0x3222cd,
+ 0x28b4c7,
+ 0x39fe06,
+ 0x2d52c5,
+ 0x2c4945,
+ 0x394246,
+ 0x2ae109,
+ 0x369787,
+ 0x286386,
+ 0x393386,
+ 0x293ac9,
+ 0x2e37c4,
+ 0x3025c4,
+ 0x30f188,
+ 0x2fbec6,
+ 0x2adc88,
+ 0x216b08,
+ 0x260507,
+ 0x30e2c9,
+ 0x347a47,
+ 0x2c30ca,
+ 0x30334f,
+ 0x2396ca,
+ 0x20ac05,
+ 0x285bc5,
+ 0x216945,
+ 0x3cd547,
+ 0x204483,
+ 0x201fc8,
+ 0x2f6086,
+ 0x2f6189,
+ 0x2f5f86,
+ 0x2e0c87,
+ 0x2a5fc9,
+ 0x3d1f08,
+ 0x3c87c7,
+ 0x322d43,
+ 0x3596c5,
+ 0x204405,
+ 0x2d140b,
+ 0x287784,
+ 0x300084,
+ 0x282c86,
+ 0x322f07,
+ 0x3947ca,
+ 0x3b0887,
+ 0x29bf07,
+ 0x28b685,
+ 0x3de685,
+ 0x2934c9,
+ 0x2a80c6,
+ 0x3b070d,
+ 0x354745,
+ 0x2c7183,
+ 0x20dac3,
+ 0x258b05,
+ 0x33ac85,
+ 0x267608,
+ 0x286cc7,
+ 0x245246,
+ 0x2ab306,
+ 0x235745,
+ 0x23c847,
+ 0x3e4107,
+ 0x25d0c7,
+ 0x2b268a,
+ 0x39f608,
+ 0x2d15c4,
+ 0x28df87,
+ 0x28a847,
+ 0x35df46,
+ 0x2a1447,
+ 0x2ea808,
+ 0x35d588,
+ 0x27a306,
+ 0x3a9548,
+ 0x2cc904,
+ 0x372c46,
+ 0x266286,
+ 0x246046,
+ 0x2025c6,
+ 0x214ac4,
+ 0x291306,
+ 0x2d3e46,
+ 0x2a5386,
+ 0x224006,
+ 0x20d986,
+ 0x2ea646,
+ 0x245148,
+ 0x2c6648,
+ 0x2e5688,
+ 0x221408,
+ 0x3deec6,
+ 0x20f1c5,
+ 0x27b9c6,
+ 0x2bb345,
+ 0x397087,
+ 0x246005,
+ 0x217943,
+ 0x26a545,
+ 0x23b844,
+ 0x20dac5,
+ 0x223a03,
+ 0x2c4707,
+ 0x3aa1c8,
+ 0x2b64c6,
+ 0x2d630d,
+ 0x285b86,
+ 0x2a4905,
+ 0x2221c3,
+ 0x2d0ac9,
+ 0x2e3946,
+ 0x2a34c6,
+ 0x29c484,
+ 0x239647,
+ 0x2f43c6,
+ 0x303ac5,
+ 0x244243,
+ 0x211184,
+ 0x28aa06,
+ 0x219784,
+ 0x3c11c8,
+ 0x2064c9,
+ 0x369d09,
+ 0x2ada8a,
+ 0x2495cd,
+ 0x23e8c7,
+ 0x206986,
+ 0x21e5c4,
+ 0x293f89,
+ 0x2924c8,
+ 0x294546,
+ 0x242b06,
+ 0x2a1447,
+ 0x2c3b06,
+ 0x223686,
+ 0x3d0c06,
+ 0x3e30ca,
+ 0x21cf88,
+ 0x234885,
+ 0x245749,
+ 0x270b0a,
+ 0x33b008,
+ 0x2a8cc8,
+ 0x2a3448,
+ 0x3e450c,
+ 0x3996c5,
+ 0x2ab588,
+ 0x2ca006,
+ 0x29dac6,
+ 0x2dab47,
+ 0x3b0785,
+ 0x290285,
+ 0x369bc9,
+ 0x210b07,
+ 0x2f6145,
+ 0x2286c7,
+ 0x20dac3,
+ 0x2dc505,
+ 0x229108,
+ 0x2cc507,
+ 0x2a8b89,
+ 0x2e1dc5,
+ 0x30a804,
+ 0x31dc08,
+ 0x2cb5c7,
+ 0x3c8988,
+ 0x22aa48,
+ 0x392005,
+ 0x353b46,
+ 0x2ab406,
+ 0x30c689,
+ 0x266387,
+ 0x2bbb86,
+ 0x2585c7,
+ 0x215103,
+ 0x21eb44,
+ 0x2e6fc5,
+ 0x23c984,
+ 0x2526c4,
+ 0x28db87,
+ 0x2743c7,
+ 0x286544,
+ 0x2a89d0,
+ 0x333847,
+ 0x3de685,
+ 0x25084c,
+ 0x22a804,
+ 0x2c1108,
+ 0x287189,
+ 0x2be9c6,
+ 0x32f908,
+ 0x27a484,
+ 0x282f88,
+ 0x23a086,
+ 0x231248,
+ 0x2a93c6,
+ 0x2d2d4b,
+ 0x331b85,
+ 0x2e6e48,
+ 0x21a484,
+ 0x28f78a,
+ 0x2a8b89,
+ 0x29e946,
+ 0x21b6c8,
+ 0x2657c5,
+ 0x2d00c4,
+ 0x2c1006,
+ 0x25cf88,
+ 0x28d908,
+ 0x3356c6,
+ 0x36c104,
+ 0x283446,
+ 0x347ac7,
+ 0x285187,
+ 0x2a144f,
+ 0x346f47,
+ 0x395747,
+ 0x368945,
+ 0x3410c5,
+ 0x2ae749,
+ 0x2f8c06,
+ 0x28c7c5,
+ 0x28fe07,
+ 0x2de9c8,
+ 0x219805,
+ 0x29ea46,
+ 0x231f88,
+ 0x353fca,
+ 0x32c888,
+ 0x2980c7,
+ 0x303786,
+ 0x245706,
+ 0x2003c3,
+ 0x211c03,
+ 0x270cc9,
+ 0x29f7c9,
+ 0x2bb806,
+ 0x2e1dc5,
+ 0x3a97c8,
+ 0x21b6c8,
+ 0x2a7d08,
+ 0x3d0c8b,
+ 0x2d6547,
+ 0x31d409,
+ 0x2a16c8,
+ 0x329f44,
+ 0x3e3a48,
+ 0x299dc9,
+ 0x2bbe85,
+ 0x3cd447,
+ 0x21ebc5,
+ 0x28d808,
+ 0x29bb4b,
+ 0x2a2c50,
+ 0x2b7845,
+ 0x21a3cc,
+ 0x245405,
+ 0x28b703,
+ 0x2b49c6,
+ 0x2d3004,
+ 0x27fb86,
+ 0x2a9a07,
+ 0x221404,
+ 0x24cf48,
+ 0x201e8d,
+ 0x342545,
+ 0x23e904,
+ 0x2b60c4,
+ 0x395489,
+ 0x2afa88,
+ 0x332047,
+ 0x23a108,
+ 0x28ec88,
+ 0x286685,
+ 0x3cd987,
+ 0x286607,
+ 0x2f6447,
+ 0x2759c9,
+ 0x3c3009,
+ 0x375346,
+ 0x21bf06,
+ 0x28fec6,
+ 0x31a6c5,
+ 0x3c7104,
+ 0x3cf306,
+ 0x3d9dc6,
+ 0x2866c8,
+ 0x20458b,
+ 0x2fba47,
+ 0x21e5c4,
+ 0x2f4306,
+ 0x2eab47,
+ 0x38c785,
+ 0x3a1b45,
+ 0x266844,
+ 0x3c2f86,
+ 0x3cf388,
+ 0x293f89,
+ 0x254986,
+ 0x2922c8,
+ 0x303b86,
+ 0x360fc8,
+ 0x3603cc,
+ 0x286546,
+ 0x2a45cd,
+ 0x2a4a4b,
+ 0x31d685,
+ 0x3e4247,
+ 0x2cc986,
+ 0x3c5d88,
+ 0x3753c9,
+ 0x21d3c8,
+ 0x3de685,
+ 0x2893c7,
+ 0x28cc08,
+ 0x3c3709,
+ 0x2f4046,
+ 0x26af8a,
+ 0x3c5b08,
+ 0x21d20b,
+ 0x2d668c,
+ 0x283088,
+ 0x28a286,
+ 0x22de48,
+ 0x353c47,
+ 0x224e49,
+ 0x29b2cd,
+ 0x2a7fc6,
+ 0x3dc948,
+ 0x2c6509,
+ 0x2d16c8,
+ 0x291008,
+ 0x2d4c8c,
+ 0x2d5947,
+ 0x2d7887,
+ 0x275805,
+ 0x2c9987,
+ 0x2de888,
+ 0x2c1086,
+ 0x25480c,
+ 0x306808,
+ 0x2e1708,
+ 0x3cf646,
+ 0x327e47,
+ 0x375544,
+ 0x221408,
+ 0x29594c,
+ 0x243f8c,
+ 0x20ac85,
+ 0x2033c7,
+ 0x36c086,
+ 0x327dc6,
+ 0x39d8c8,
+ 0x224dc4,
+ 0x22fa8b,
+ 0x292e8b,
+ 0x303786,
+ 0x201d07,
+ 0x208805,
+ 0x27d905,
+ 0x22fbc6,
+ 0x265785,
+ 0x287745,
+ 0x2e0107,
+ 0x223a09,
+ 0x36a604,
+ 0x247245,
+ 0x30b005,
+ 0x3477c8,
+ 0x3a89c5,
+ 0x2d7089,
+ 0x3982c7,
+ 0x3982cb,
+ 0x302206,
+ 0x244e89,
+ 0x333088,
+ 0x2931c5,
+ 0x2f6548,
+ 0x3c3048,
+ 0x283d07,
+ 0x2455c7,
+ 0x28dc09,
+ 0x231187,
+ 0x29a109,
+ 0x2b984c,
+ 0x2bb808,
+ 0x2bf649,
+ 0x2c0787,
+ 0x28ed49,
+ 0x38fbc7,
+ 0x2d6788,
+ 0x3c1585,
+ 0x372bc6,
+ 0x2d5308,
+ 0x2fa4c8,
+ 0x2709c9,
+ 0x287787,
+ 0x27e305,
+ 0x207789,
+ 0x31f546,
+ 0x29b0c4,
+ 0x37f506,
+ 0x3a8fc8,
+ 0x23bc07,
+ 0x204788,
+ 0x3a9609,
+ 0x353907,
+ 0x2a7e46,
+ 0x3e3d84,
+ 0x26a5c9,
+ 0x3cd808,
+ 0x3cf507,
+ 0x291846,
+ 0x2044c6,
+ 0x3cfc04,
+ 0x2f3b46,
+ 0x207843,
+ 0x331709,
+ 0x331b46,
+ 0x2b7e85,
+ 0x2ab306,
+ 0x224185,
+ 0x28d088,
+ 0x205387,
+ 0x3c2786,
+ 0x333706,
+ 0x31ef88,
+ 0x2ae8c7,
+ 0x2a8005,
+ 0x2a87c8,
+ 0x3d4188,
+ 0x3c5b08,
+ 0x2452c5,
+ 0x372c46,
+ 0x369ac9,
+ 0x30c504,
+ 0x22400b,
+ 0x22338b,
+ 0x234789,
+ 0x20dac3,
+ 0x263745,
+ 0x2b62c6,
+ 0x246508,
+ 0x2fb584,
+ 0x2b64c6,
+ 0x2b27c9,
+ 0x3201c5,
+ 0x2e0046,
+ 0x2cb5c6,
+ 0x21b6c4,
+ 0x2a8e4a,
+ 0x2b7dc8,
+ 0x2fa4c6,
+ 0x371545,
+ 0x201b87,
+ 0x33aec7,
+ 0x353b44,
+ 0x2235c7,
+ 0x245fc4,
+ 0x245fc6,
+ 0x202003,
+ 0x2759c5,
+ 0x2bdc85,
+ 0x347188,
+ 0x28e145,
+ 0x286289,
+ 0x221247,
+ 0x22124b,
+ 0x2afd4c,
+ 0x2b034a,
+ 0x34ff07,
+ 0x20ac43,
+ 0x284b88,
+ 0x302585,
+ 0x219885,
+ 0x359784,
+ 0x2d6686,
+ 0x287186,
+ 0x2f3b87,
+ 0x26030b,
+ 0x214ac4,
+ 0x368a84,
+ 0x2bf884,
+ 0x2dfe06,
+ 0x221404,
+ 0x21b548,
+ 0x359585,
+ 0x249c05,
+ 0x2a7c47,
+ 0x3e4349,
+ 0x33ac85,
+ 0x39424a,
+ 0x2deb09,
+ 0x2ae3ca,
+ 0x3e3209,
+ 0x31c284,
+ 0x393445,
+ 0x2c3c08,
+ 0x3afdcb,
+ 0x30c2c5,
+ 0x216c86,
+ 0x24a884,
+ 0x2867c6,
+ 0x353789,
+ 0x2eac47,
+ 0x27af48,
+ 0x249946,
+ 0x347a47,
+ 0x28d908,
+ 0x3780c6,
+ 0x3e3e04,
+ 0x3b2687,
+ 0x384f05,
+ 0x396107,
+ 0x221484,
+ 0x2cc906,
+ 0x3aea88,
+ 0x2a4c08,
+ 0x32a647,
+ 0x306e08,
+ 0x2a1e85,
+ 0x20d904,
+ 0x240f48,
+ 0x29ae44,
+ 0x2168c5,
+ 0x3ae984,
+ 0x20b707,
+ 0x296787,
+ 0x28ee88,
+ 0x322f46,
+ 0x28e0c5,
+ 0x286088,
+ 0x32ca88,
+ 0x2ad9c9,
+ 0x223686,
+ 0x239b08,
+ 0x28f60a,
+ 0x38c808,
+ 0x318f85,
+ 0x27bbc6,
+ 0x2adfc8,
+ 0x28948a,
+ 0x232b87,
+ 0x292905,
+ 0x29df48,
+ 0x272e04,
+ 0x25ec86,
+ 0x2d7f88,
+ 0x20d986,
+ 0x3d55c8,
+ 0x237bc7,
+ 0x20cf06,
+ 0x2cd844,
+ 0x326687,
+ 0x2c6a84,
+ 0x353747,
+ 0x3cf84d,
+ 0x234805,
+ 0x2cc30b,
+ 0x244206,
+ 0x25e4c8,
+ 0x24cf04,
+ 0x26a146,
+ 0x28aa06,
+ 0x22e187,
+ 0x2a428d,
+ 0x3089c7,
+ 0x2c70c8,
+ 0x294145,
+ 0x219948,
+ 0x2dbac6,
+ 0x2a1f08,
+ 0x3e0d46,
+ 0x36c9c7,
+ 0x2e2d89,
+ 0x338587,
+ 0x294808,
+ 0x269145,
+ 0x2357c8,
+ 0x327d05,
+ 0x2334c5,
+ 0x379205,
+ 0x20af03,
+ 0x202644,
+ 0x245745,
+ 0x24b649,
+ 0x372a06,
+ 0x2ea908,
+ 0x289685,
+ 0x2c9847,
+ 0x2a90ca,
+ 0x2dff89,
+ 0x2d7bca,
+ 0x2e5708,
+ 0x22850c,
+ 0x28fe8d,
+ 0x31e443,
+ 0x3d54c8,
+ 0x211145,
+ 0x353d86,
+ 0x3d1d86,
+ 0x321f85,
+ 0x2586c9,
+ 0x30db85,
+ 0x286088,
+ 0x2648c6,
+ 0x36ad46,
+ 0x2af1c9,
+ 0x266e47,
+ 0x29be06,
+ 0x2a9048,
+ 0x245f48,
+ 0x2f0987,
+ 0x2e050e,
+ 0x2dbd05,
+ 0x3c3605,
+ 0x20d888,
+ 0x3a21c7,
+ 0x204502,
+ 0x2d4944,
+ 0x27fa8a,
+ 0x3cf5c8,
+ 0x3c3186,
+ 0x2a6108,
+ 0x2ab406,
+ 0x340f48,
+ 0x2bbb88,
+ 0x233484,
+ 0x2c9c05,
+ 0x70e7c4,
+ 0x70e7c4,
+ 0x70e7c4,
+ 0x201f03,
+ 0x204346,
+ 0x286546,
+ 0x2aa3cc,
+ 0x20cf43,
+ 0x270b06,
+ 0x201fc4,
+ 0x2e38c8,
+ 0x2b2605,
+ 0x27fb86,
+ 0x2d1208,
+ 0x2e6386,
+ 0x3c2706,
+ 0x29e748,
+ 0x2e7047,
+ 0x230f49,
+ 0x2f04ca,
+ 0x274544,
+ 0x246005,
+ 0x30a405,
+ 0x2e3646,
+ 0x23e906,
+ 0x2aa146,
+ 0x382006,
+ 0x231084,
+ 0x23108b,
+ 0x239644,
+ 0x201c05,
+ 0x2bab85,
+ 0x2605c6,
+ 0x20ec48,
+ 0x28fd47,
+ 0x331ac4,
+ 0x211583,
+ 0x272905,
+ 0x37f3c7,
+ 0x28fc4b,
+ 0x347087,
+ 0x2d1108,
+ 0x2c9d47,
+ 0x276a06,
+ 0x271fc8,
+ 0x2cf3cb,
+ 0x2cba46,
+ 0x212949,
+ 0x2cf545,
+ 0x322d43,
+ 0x2e0046,
+ 0x237ac8,
+ 0x215ec3,
+ 0x29acc3,
+ 0x28d906,
+ 0x2ab406,
+ 0x37604a,
+ 0x28a2c5,
+ 0x28a84b,
+ 0x2ab24b,
+ 0x217e03,
+ 0x209b03,
+ 0x2c3044,
+ 0x2e4887,
+ 0x237b44,
+ 0x29b2c4,
+ 0x2c9e84,
+ 0x38cb08,
+ 0x371488,
+ 0x211b89,
+ 0x2e3488,
+ 0x3a0087,
+ 0x224006,
+ 0x2ea54f,
+ 0x2dbe46,
+ 0x2e4dc4,
+ 0x3712ca,
+ 0x37f2c7,
+ 0x2c6b86,
+ 0x29b109,
+ 0x211b05,
+ 0x3472c5,
+ 0x211c46,
+ 0x235903,
+ 0x272e49,
+ 0x21d106,
+ 0x3a93c9,
+ 0x3947c6,
+ 0x2759c5,
+ 0x20b085,
+ 0x202643,
+ 0x2e49c8,
+ 0x332207,
+ 0x2f6084,
+ 0x2e3748,
+ 0x29d844,
+ 0x31ff46,
+ 0x2b49c6,
+ 0x247dc6,
+ 0x2e6d09,
+ 0x219805,
+ 0x2a80c6,
+ 0x25c0c9,
+ 0x2db246,
+ 0x2ea646,
+ 0x3abbc6,
+ 0x209085,
+ 0x3ae986,
+ 0x36c9c4,
+ 0x3c1585,
+ 0x2d5304,
+ 0x2c8f46,
+ 0x354704,
+ 0x201c03,
+ 0x292585,
+ 0x23d308,
+ 0x35a407,
+ 0x2fb609,
+ 0x292808,
+ 0x2a5891,
+ 0x2cb64a,
+ 0x3036c7,
+ 0x237d06,
+ 0x201fc4,
+ 0x2d5408,
+ 0x293688,
+ 0x2a5a4a,
+ 0x2d6e4d,
+ 0x216b86,
+ 0x29e846,
+ 0x326746,
+ 0x2ac3c7,
+ 0x2c7185,
+ 0x30d607,
+ 0x201e85,
+ 0x398404,
+ 0x3c2d46,
+ 0x2884c7,
+ 0x272b4d,
+ 0x2adf07,
+ 0x2bfb48,
+ 0x286389,
+ 0x27bac6,
+ 0x2f3fc5,
+ 0x2e9284,
+ 0x3a90c6,
+ 0x353a46,
+ 0x3cf746,
+ 0x2a6988,
+ 0x22d503,
+ 0x21b783,
+ 0x32c105,
+ 0x322606,
+ 0x2bbb45,
+ 0x249b48,
+ 0x2a9bca,
+ 0x239084,
+ 0x2e38c8,
+ 0x2a3448,
+ 0x3a9947,
+ 0x37b249,
+ 0x2d0e08,
+ 0x294007,
+ 0x2d3fc6,
+ 0x20d98a,
+ 0x3a9148,
+ 0x31dac9,
+ 0x2afb48,
+ 0x222849,
+ 0x35d787,
+ 0x208f45,
+ 0x2ab806,
+ 0x2c0f08,
+ 0x281fc8,
+ 0x261d08,
+ 0x342688,
+ 0x201c05,
+ 0x200d04,
+ 0x23bec8,
+ 0x24a604,
+ 0x3e3004,
+ 0x2759c5,
+ 0x29d187,
+ 0x3e4109,
+ 0x22df87,
+ 0x226b05,
+ 0x282e86,
+ 0x370d46,
+ 0x20ed44,
+ 0x2af4c6,
+ 0x28ac84,
+ 0x3d4886,
+ 0x3e3ec6,
+ 0x215d06,
+ 0x3de685,
+ 0x249a07,
+ 0x20ac43,
+ 0x22bf49,
+ 0x31ed88,
+ 0x293e84,
+ 0x293e8d,
+ 0x2a4d08,
+ 0x3082c8,
+ 0x31da46,
+ 0x2e2e89,
+ 0x2dff89,
+ 0x353485,
+ 0x2a9cca,
+ 0x27cb0a,
+ 0x291a4c,
+ 0x291bc6,
+ 0x284786,
+ 0x2dc446,
+ 0x3a6ac9,
+ 0x353fc6,
+ 0x2ae906,
+ 0x30dc46,
+ 0x221408,
+ 0x306e06,
+ 0x2e43cb,
+ 0x29d305,
+ 0x249c05,
+ 0x285285,
+ 0x30ef06,
+ 0x20d943,
+ 0x247d46,
+ 0x2ade87,
+ 0x2d52c5,
+ 0x2f4ec5,
+ 0x2c4945,
+ 0x2f9646,
+ 0x336cc4,
+ 0x336cc6,
+ 0x2a3d09,
+ 0x30ed8c,
+ 0x398148,
+ 0x25cf04,
+ 0x39d6c6,
+ 0x244306,
+ 0x237ac8,
+ 0x21b6c8,
+ 0x30ec89,
+ 0x201b87,
+ 0x2fbc09,
+ 0x27d9c6,
+ 0x216b04,
+ 0x210484,
+ 0x28df04,
+ 0x28d908,
+ 0x3e3f4a,
+ 0x33ac06,
+ 0x368807,
+ 0x396387,
+ 0x244f85,
+ 0x2b9304,
+ 0x299d86,
+ 0x2c71c6,
+ 0x205483,
+ 0x31ebc7,
+ 0x22a948,
+ 0x3535ca,
+ 0x202148,
+ 0x273148,
+ 0x354745,
+ 0x237105,
+ 0x2fbb45,
+ 0x245346,
+ 0x246e46,
+ 0x316a45,
+ 0x331949,
+ 0x2b910c,
+ 0x34ca47,
+ 0x2a5ac8,
+ 0x282185,
+ 0x70e7c4,
+ 0x236b04,
+ 0x2cc644,
+ 0x3d0ac6,
+ 0x2ad28e,
+ 0x347347,
+ 0x2ac5c5,
+ 0x30c48c,
+ 0x29d707,
+ 0x288447,
+ 0x2c8989,
+ 0x21ae49,
+ 0x292905,
+ 0x31ed88,
+ 0x369ac9,
+ 0x3c59c5,
+ 0x2d5208,
+ 0x2c1f86,
+ 0x2411c6,
+ 0x24fb84,
+ 0x2aa648,
+ 0x206743,
+ 0x203f44,
+ 0x272985,
+ 0x39b187,
+ 0x26a445,
+ 0x28f4c9,
+ 0x29b80d,
+ 0x2b2ec6,
+ 0x2115c4,
+ 0x288608,
+ 0x22384a,
+ 0x3e9847,
+ 0x2b0c45,
+ 0x203f83,
+ 0x2ab40e,
+ 0x2e4acc,
+ 0x33b107,
+ 0x2ad447,
+ 0x4d39a7c7,
+ 0x143386,
+ 0x27804,
+ 0x212fc3,
+ 0x354005,
+ 0x2cc645,
+ 0x2a64c8,
+ 0x2a3289,
+ 0x25ce06,
+ 0x237b44,
+ 0x303606,
+ 0x245d0b,
+ 0x2da2cc,
+ 0x257b47,
+ 0x2e4685,
+ 0x3d4088,
+ 0x2f0745,
+ 0x3712c7,
+ 0x2e2c47,
+ 0x2494c5,
+ 0x20d943,
+ 0x2abd84,
+ 0x288cc5,
+ 0x36a505,
+ 0x36a506,
+ 0x2a0088,
+ 0x2884c7,
+ 0x3d2086,
+ 0x3cfb06,
+ 0x379146,
+ 0x3dcac9,
+ 0x3cda87,
+ 0x25cc86,
+ 0x2da446,
+ 0x387046,
+ 0x2b7d05,
+ 0x218586,
+ 0x3b5545,
+ 0x3a8a48,
+ 0x29cdcb,
+ 0x2998c6,
+ 0x3963c4,
+ 0x222e09,
+ 0x221244,
+ 0x2c1f08,
+ 0x311007,
+ 0x290f04,
+ 0x2d02c8,
+ 0x2d6984,
+ 0x2b7d44,
+ 0x293dc5,
+ 0x342586,
+ 0x38ca47,
+ 0x235f03,
+ 0x2a7f05,
+ 0x34bb44,
+ 0x3c3646,
+ 0x353508,
+ 0x32c785,
+ 0x29ca89,
+ 0x207985,
+ 0x3ca8c8,
+ 0x326c47,
+ 0x331c48,
+ 0x2cff07,
+ 0x395809,
+ 0x291186,
+ 0x397c06,
+ 0x29fa84,
+ 0x223f45,
+ 0x3151cc,
+ 0x285287,
+ 0x285a87,
+ 0x23e548,
+ 0x2b2ec6,
+ 0x2addc4,
+ 0x37ddc4,
+ 0x28da89,
+ 0x2dc546,
+ 0x293547,
+ 0x27b884,
+ 0x2af5c6,
+ 0x3de9c5,
+ 0x2e2ac7,
+ 0x2e4346,
+ 0x26ae49,
+ 0x2d2747,
+ 0x2a1447,
+ 0x2af046,
+ 0x291785,
+ 0x28c108,
+ 0x21cf88,
+ 0x36db46,
+ 0x32c7c5,
+ 0x2d8fc6,
+ 0x20d083,
+ 0x2a6349,
+ 0x2a9ece,
+ 0x2cfc48,
+ 0x29d948,
+ 0x36d94b,
+ 0x29ccc6,
+ 0x396284,
+ 0x28fa84,
+ 0x2a9fca,
+ 0x21a2c7,
+ 0x25cd45,
+ 0x212949,
+ 0x2d3f05,
+ 0x3e3047,
+ 0x29e6c4,
+ 0x206647,
+ 0x216a08,
+ 0x2c96c6,
+ 0x2cca89,
+ 0x2d0f0a,
+ 0x21a246,
+ 0x2a4846,
+ 0x2bab05,
+ 0x39c545,
+ 0x3b0e47,
+ 0x24f388,
+ 0x3de908,
+ 0x233486,
+ 0x20b105,
+ 0x23e68e,
+ 0x2d15c4,
+ 0x2a6445,
+ 0x282809,
+ 0x2f8a08,
+ 0x298006,
+ 0x2a82cc,
+ 0x2a97d0,
+ 0x2acecf,
+ 0x2ae648,
+ 0x34ff07,
+ 0x3de685,
+ 0x245745,
+ 0x38c8c9,
+ 0x29e149,
+ 0x283546,
+ 0x30c347,
+ 0x39d7c5,
+ 0x23ae89,
+ 0x35dfc6,
+ 0x353e0d,
+ 0x28ddc9,
+ 0x29b2c4,
+ 0x2cf6c8,
+ 0x23bf89,
+ 0x33adc6,
+ 0x284d85,
+ 0x397c06,
+ 0x27ae09,
+ 0x27b708,
+ 0x20f1c5,
+ 0x28f704,
+ 0x2a848b,
+ 0x33ac85,
+ 0x246586,
+ 0x2901c6,
+ 0x259446,
+ 0x3d0e8b,
+ 0x29cb89,
+ 0x225005,
+ 0x396f87,
+ 0x2cb5c6,
+ 0x25e646,
+ 0x28f388,
+ 0x2d40c9,
+ 0x2bf90c,
+ 0x37f1c8,
+ 0x31d186,
+ 0x3356c3,
+ 0x38adc6,
+ 0x302505,
+ 0x28b388,
+ 0x20ab06,
+ 0x3c8888,
+ 0x3b0905,
+ 0x267305,
+ 0x326d88,
+ 0x3b6ec7,
+ 0x3d1cc7,
+ 0x2f3b87,
+ 0x32f908,
+ 0x350048,
+ 0x2f1086,
+ 0x2c8d87,
+ 0x21ea07,
+ 0x39558a,
+ 0x210843,
+ 0x30ef06,
+ 0x23e605,
+ 0x27fa84,
+ 0x286389,
+ 0x395784,
+ 0x2c96c4,
+ 0x2a9444,
+ 0x2ad44b,
+ 0x332147,
+ 0x23e8c5,
+ 0x2a1b88,
+ 0x282e86,
+ 0x282e88,
+ 0x28a206,
+ 0x298945,
+ 0x298b85,
+ 0x29a546,
+ 0x30e148,
+ 0x29b048,
+ 0x286546,
+ 0x2a19cf,
+ 0x2a5e10,
+ 0x20d485,
+ 0x20ac43,
+ 0x237405,
+ 0x31d348,
+ 0x29e049,
+ 0x3c5b08,
+ 0x30c148,
+ 0x25ae48,
+ 0x332207,
+ 0x282b49,
+ 0x3c8a88,
+ 0x2b3944,
+ 0x2a92c8,
+ 0x347889,
+ 0x2c9307,
+ 0x2bc7c4,
+ 0x22e048,
+ 0x2497ca,
+ 0x2ee946,
+ 0x216b86,
+ 0x223549,
+ 0x2a9a07,
+ 0x2e0b08,
+ 0x244808,
+ 0x3d01c8,
+ 0x2796c5,
+ 0x386605,
+ 0x249c05,
+ 0x2cc605,
+ 0x2c6347,
+ 0x20d945,
+ 0x2d52c5,
+ 0x386b86,
+ 0x3c5a47,
+ 0x3afd07,
+ 0x249ac6,
+ 0x2e5c45,
+ 0x246586,
+ 0x205405,
+ 0x2c1d88,
+ 0x2f9e44,
+ 0x2db2c6,
+ 0x351e44,
+ 0x2d00c8,
+ 0x2db3ca,
+ 0x286ccc,
+ 0x2aaa05,
+ 0x2ac486,
+ 0x2bfac6,
+ 0x3b6806,
+ 0x31d204,
+ 0x3df285,
+ 0x289ac7,
+ 0x2a9a89,
+ 0x2e03c7,
+ 0x70e7c4,
+ 0x70e7c4,
+ 0x331fc5,
+ 0x312a84,
+ 0x2a7a8a,
+ 0x282d06,
+ 0x3698c4,
+ 0x203345,
+ 0x2c5405,
+ 0x2c70c4,
+ 0x28fe07,
+ 0x207907,
+ 0x2dfe08,
+ 0x2d90c8,
+ 0x20f1c9,
+ 0x29ae48,
+ 0x29494b,
+ 0x239704,
+ 0x29eb45,
+ 0x28c845,
+ 0x2f3b09,
+ 0x2d40c9,
+ 0x222d08,
+ 0x3d8dc8,
+ 0x2605c4,
+ 0x244345,
+ 0x20dec3,
+ 0x2e3605,
+ 0x2a8146,
+ 0x2a30cc,
+ 0x21d006,
+ 0x284c86,
+ 0x298285,
+ 0x2f96c8,
+ 0x2dac86,
+ 0x237e86,
+ 0x216b86,
+ 0x22b48c,
+ 0x27d4c4,
+ 0x37928a,
+ 0x2981c8,
+ 0x2a2f07,
+ 0x34ba46,
+ 0x25cec7,
+ 0x303205,
+ 0x291846,
+ 0x35ecc6,
+ 0x3728c7,
+ 0x2d0c04,
+ 0x20b805,
+ 0x282804,
+ 0x398487,
+ 0x282a48,
+ 0x28460a,
+ 0x28ca87,
+ 0x2b7907,
+ 0x34fe87,
+ 0x2f0889,
+ 0x2a30ca,
+ 0x208fc3,
+ 0x35a3c5,
+ 0x215d43,
+ 0x2c9ec9,
+ 0x36cc48,
+ 0x368947,
+ 0x3c5c09,
+ 0x21d086,
+ 0x3c1648,
+ 0x2c4685,
+ 0x32cb8a,
+ 0x20df09,
+ 0x27a1c9,
+ 0x2dab47,
+ 0x293789,
+ 0x215c08,
+ 0x3e3c46,
+ 0x2ac648,
+ 0x2f5207,
+ 0x231187,
+ 0x2deb07,
+ 0x2cdf88,
+ 0x39ab06,
+ 0x249585,
+ 0x289ac7,
+ 0x2a4348,
+ 0x3790c4,
+ 0x309684,
+ 0x29bd07,
+ 0x2bbf07,
+ 0x36994a,
+ 0x3e3bc6,
+ 0x3ce54a,
+ 0x2d4887,
+ 0x2d1387,
+ 0x20b8c4,
+ 0x29a1c4,
+ 0x2e29c6,
+ 0x2f4644,
+ 0x2f464c,
+ 0x310f45,
+ 0x216849,
+ 0x3caa44,
+ 0x2c7185,
+ 0x2237c8,
+ 0x27a545,
+ 0x394246,
+ 0x29e284,
+ 0x2a6d0a,
+ 0x2dddc6,
+ 0x3501ca,
+ 0x3e33c7,
+ 0x2048c5,
+ 0x235905,
+ 0x244fca,
+ 0x281f05,
+ 0x2ada86,
+ 0x24a604,
+ 0x2c31c6,
+ 0x3b0f05,
+ 0x20abc6,
+ 0x32a64c,
+ 0x22b70a,
+ 0x27cc04,
+ 0x224006,
+ 0x2a9a07,
+ 0x2e42c4,
+ 0x221408,
+ 0x2ed306,
+ 0x396209,
+ 0x3dd0c9,
+ 0x2bb909,
+ 0x2241c6,
+ 0x2f5306,
+ 0x2ac787,
+ 0x331888,
+ 0x2f5109,
+ 0x332147,
+ 0x2a1d06,
+ 0x347ac7,
+ 0x326605,
+ 0x2d15c4,
+ 0x2ac347,
+ 0x21ebc5,
+ 0x293d05,
+ 0x200cc7,
+ 0x249388,
+ 0x3d4006,
+ 0x2a51cd,
+ 0x2a66cf,
+ 0x2ab24d,
+ 0x223444,
+ 0x23d406,
+ 0x2e7b48,
+ 0x30dc05,
+ 0x245488,
+ 0x283bca,
+ 0x29b2c4,
+ 0x2c67c6,
+ 0x215307,
+ 0x214ac7,
+ 0x2e7109,
+ 0x2ac605,
+ 0x2c70c4,
+ 0x2c9b4a,
+ 0x2d09c9,
+ 0x293887,
+ 0x2a5486,
+ 0x33adc6,
+ 0x244286,
+ 0x3b2746,
+ 0x2e69cf,
+ 0x2e7a09,
+ 0x306e06,
+ 0x267246,
+ 0x20c049,
+ 0x2c8e87,
+ 0x201543,
+ 0x209046,
+ 0x211c03,
+ 0x321e48,
+ 0x26a007,
+ 0x2ae849,
+ 0x2b4848,
+ 0x3d1e08,
+ 0x2878c6,
+ 0x225a89,
+ 0x34c985,
+ 0x2a7d04,
+ 0x209007,
+ 0x3a6b45,
+ 0x223444,
+ 0x23e988,
+ 0x21a584,
+ 0x2c8bc7,
+ 0x3aa146,
+ 0x23fe85,
+ 0x2afb48,
+ 0x33ac8b,
+ 0x31f287,
+ 0x245246,
+ 0x2dbec4,
+ 0x3da006,
+ 0x2759c5,
+ 0x21ebc5,
+ 0x28be89,
+ 0x28fa09,
+ 0x2311c4,
+ 0x231205,
+ 0x224045,
+ 0x32ca06,
+ 0x31ee88,
+ 0x2d3506,
+ 0x22a78b,
+ 0x2be84a,
+ 0x2d0005,
+ 0x298c06,
+ 0x238d85,
+ 0x386ac5,
+ 0x2a35c7,
+ 0x30f188,
+ 0x29aec4,
+ 0x34ae06,
+ 0x29b0c6,
+ 0x215dc7,
+ 0x322d04,
+ 0x28aa06,
+ 0x3cd645,
+ 0x3cd649,
+ 0x2f5504,
+ 0x30a549,
+ 0x286546,
+ 0x2d5a08,
+ 0x224045,
+ 0x396485,
+ 0x20abc6,
+ 0x2bf809,
+ 0x21ae49,
+ 0x284d06,
+ 0x2f8b08,
+ 0x29b948,
+ 0x238d44,
+ 0x2ca304,
+ 0x2ca308,
+ 0x39ff08,
+ 0x2fbd09,
+ 0x2a80c6,
+ 0x216b86,
+ 0x33a24d,
+ 0x2b64c6,
+ 0x360289,
+ 0x30e485,
+ 0x211c46,
+ 0x22e2c8,
+ 0x336c05,
+ 0x21ea44,
+ 0x2759c5,
+ 0x28f088,
+ 0x2a7849,
+ 0x2828c4,
+ 0x2cc906,
+ 0x27a40a,
+ 0x33b008,
+ 0x369ac9,
+ 0x27600a,
+ 0x3c5b86,
+ 0x2a6888,
+ 0x371085,
+ 0x298448,
+ 0x303285,
+ 0x21cf49,
+ 0x33ca09,
+ 0x234702,
+ 0x2cf545,
+ 0x28c906,
+ 0x286487,
+ 0x2b0dc5,
+ 0x34b946,
+ 0x319908,
+ 0x2b2ec6,
+ 0x2c3ac9,
+ 0x285b86,
+ 0x28f208,
+ 0x2b8cc5,
+ 0x24e406,
+ 0x36cac8,
+ 0x28d908,
+ 0x35d688,
+ 0x31b648,
+ 0x218584,
+ 0x20c8c3,
+ 0x2c3d04,
+ 0x28cc86,
+ 0x326644,
+ 0x29d887,
+ 0x237d89,
+ 0x2db645,
+ 0x244806,
+ 0x209046,
+ 0x29fecb,
+ 0x2c6ac6,
+ 0x20c886,
+ 0x2de708,
+ 0x361b46,
+ 0x2046c3,
+ 0x212403,
+ 0x2d15c4,
+ 0x239a05,
+ 0x3039c7,
+ 0x282a48,
+ 0x282a4f,
+ 0x2899cb,
+ 0x31ec88,
+ 0x2cc986,
+ 0x31ef8e,
+ 0x20abc3,
+ 0x303944,
+ 0x2c6a45,
+ 0x2c6f46,
+ 0x299e8b,
+ 0x29d246,
+ 0x232009,
+ 0x23fe85,
+ 0x251748,
+ 0x20e288,
+ 0x21ad0c,
+ 0x2ad486,
+ 0x2e3646,
+ 0x2e1dc5,
+ 0x2945c8,
+ 0x286cc5,
+ 0x329f48,
+ 0x2a864a,
+ 0x2ab689,
+ 0x70e7c4,
+ 0x2000c2,
+ 0x53216542,
+ 0x200382,
+ 0x2b1b84,
+ 0x201582,
+ 0x28d4c4,
+ 0x204cc2,
+ 0xd903,
+ 0x2003c2,
+ 0x202b02,
+ 0x793c8,
+ 0xe804,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x87c2,
+ 0x54202,
+ 0x216443,
+ 0x2296c3,
+ 0x20cb83,
+ 0x2a042,
+ 0x6502,
+ 0x4a42,
+ 0x253c43,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2b1b84,
+ 0x2296c3,
+ 0x20cb83,
+ 0x20f7c3,
+ 0x25dd04,
+ 0x216543,
+ 0x23ec84,
+ 0x222bc3,
+ 0x2e8fc4,
+ 0x343b43,
+ 0x2b1087,
+ 0x216443,
+ 0x20d903,
+ 0x2c2308,
+ 0x20cb83,
+ 0x29fc4b,
+ 0x304443,
+ 0x24d906,
+ 0x213402,
+ 0x2fe64b,
+ 0x222bc3,
+ 0x343b43,
+ 0x2296c3,
+ 0x20cb83,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x20cb83,
+ 0x21b103,
+ 0x2072c3,
+ 0x2000c2,
+ 0x793c8,
+ 0x235ec5,
+ 0x21ec48,
+ 0x3585c8,
+ 0x216542,
+ 0x363605,
+ 0x347c07,
+ 0x202bc2,
+ 0x24d147,
+ 0x200382,
+ 0x25be87,
+ 0x34c049,
+ 0x277f48,
+ 0x3d0049,
+ 0x214182,
+ 0x20e107,
+ 0x387c84,
+ 0x347cc7,
+ 0x2be747,
+ 0x2687c2,
+ 0x216443,
+ 0x203742,
+ 0x204cc2,
+ 0x2003c2,
+ 0x208402,
+ 0x200902,
+ 0x202b02,
+ 0x2e5245,
+ 0x227445,
+ 0x16542,
+ 0x22bc3,
+ 0x216543,
+ 0x222bc3,
+ 0x22de83,
+ 0x343b43,
+ 0x20e443,
+ 0x2296c3,
+ 0x20cb83,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2296c3,
+ 0x20cb83,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x158286,
+ 0x55fa5a4b,
+ 0x216443,
+ 0x2296c3,
+ 0x7ca83,
+ 0x20cb83,
+ 0x175285,
+ 0x12b83,
+ 0x101,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2b1b84,
+ 0x243543,
+ 0x2296c3,
+ 0x7ca83,
+ 0x20cb83,
+ 0x2203c3,
+ 0x56869306,
+ 0x20a83,
+ 0x70945,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2296c3,
+ 0x20cb83,
+ 0x216542,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2296c3,
+ 0x7ca83,
+ 0x20cb83,
+ 0x6482,
+ 0x793c8,
+ 0x38c43,
+ 0xd903,
+ 0x7ca83,
+ 0x4f344,
+ 0x1480c44,
+ 0xf0b45,
+ 0x2000c2,
+ 0x397344,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x24cc43,
+ 0x2b96c5,
+ 0x243543,
+ 0x21b283,
+ 0x2296c3,
+ 0x257743,
+ 0x20cb83,
+ 0x202b03,
+ 0x2192c3,
+ 0x201643,
+ 0x11d783,
+ 0x5c2,
+ 0x386c2,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2296c3,
+ 0x20cb83,
+ 0x2000c2,
+ 0x253c43,
+ 0x216542,
+ 0x3242,
+ 0x222bc3,
+ 0x343b43,
+ 0x2b1b84,
+ 0x2296c3,
+ 0x20cb83,
+ 0x202b02,
+ 0x793c8,
+ 0x343b43,
+ 0x7ca83,
+ 0x793c8,
+ 0x7ca83,
+ 0x2cc803,
+ 0x216543,
+ 0x23a304,
+ 0x222bc3,
+ 0x343b43,
+ 0x2042c2,
+ 0x216443,
+ 0x2296c3,
+ 0xd903,
+ 0x20cb83,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2042c2,
+ 0x233243,
+ 0x2296c3,
+ 0x20cb83,
+ 0x2faf43,
+ 0x202b03,
+ 0x2000c2,
+ 0x216542,
+ 0x343b43,
+ 0x2296c3,
+ 0x20cb83,
+ 0x24d905,
+ 0x1143c6,
+ 0x6ff44,
+ 0x329c4,
+ 0x25dd04,
+ 0x213402,
+ 0x882,
+ 0x793c8,
+ 0x3242,
+ 0x54202,
+ 0x2a02,
+ 0x2000c2,
+ 0x146c05,
+ 0x24948,
+ 0xe9883,
+ 0x216542,
+ 0x45c44,
+ 0x5b910646,
+ 0x1db84,
+ 0xc5e4b,
+ 0x42746,
+ 0x1cdf07,
+ 0x174bc9,
+ 0x222bc3,
+ 0x53188,
+ 0x5318b,
+ 0x5360b,
+ 0x539cb,
+ 0x53d0b,
+ 0x53fcb,
+ 0x5440b,
+ 0x18c86,
+ 0x343b43,
+ 0x154645,
+ 0x10e584,
+ 0x20b6c3,
+ 0x11b487,
+ 0x133604,
+ 0xed184,
+ 0x77984,
+ 0x2296c3,
+ 0x84e06,
+ 0xac8c4,
+ 0x7ca83,
+ 0x20cb83,
+ 0x305504,
+ 0x132747,
+ 0x113fc9,
+ 0xc5c08,
+ 0x1c8dc4,
+ 0x147e04,
+ 0x179dc3,
+ 0x13906,
+ 0x12248,
+ 0x18d445,
+ 0x1a1f49,
+ 0x39fc3,
+ 0x13ea86,
+ 0x146c05,
+ 0x216542,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x216443,
+ 0x20d903,
+ 0x20cb83,
+ 0x304443,
+ 0x213402,
+ 0x793c8,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x26a7c3,
+ 0x21b544,
+ 0x2296c3,
+ 0xd903,
+ 0x20cb83,
+ 0x216543,
+ 0x222bc3,
+ 0x2e8fc4,
+ 0x343b43,
+ 0x2296c3,
+ 0x20cb83,
+ 0x24d906,
+ 0x222bc3,
+ 0x343b43,
+ 0x1e803,
+ 0x7ca83,
+ 0x20cb83,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2296c3,
+ 0x20cb83,
+ 0x146c05,
+ 0x1cdf07,
+ 0x69c3,
+ 0x39fc3,
+ 0x793c8,
+ 0x343b43,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x722c3,
+ 0x2296c3,
+ 0x20cb83,
+ 0x5ee16543,
+ 0x222bc3,
+ 0x2296c3,
+ 0x20cb83,
+ 0x793c8,
+ 0x2000c2,
+ 0x216542,
+ 0x216543,
+ 0x343b43,
+ 0x2296c3,
+ 0x2003c2,
+ 0x20cb83,
+ 0x33cf47,
+ 0x2f67cb,
+ 0x2153c3,
+ 0x283208,
+ 0x331607,
+ 0x349506,
+ 0x234d45,
+ 0x363749,
+ 0x24d688,
+ 0x37e649,
+ 0x3ae5d0,
+ 0x37e64b,
+ 0x3aaa09,
+ 0x2069c3,
+ 0x2fed09,
+ 0x23b286,
+ 0x23b28c,
+ 0x235f88,
+ 0x3e5c48,
+ 0x35c449,
+ 0x2cd20e,
+ 0x34be0b,
+ 0x2c340c,
+ 0x203b43,
+ 0x279d4c,
+ 0x203b49,
+ 0x300187,
+ 0x23c4cc,
+ 0x2c024a,
+ 0x21d684,
+ 0x21d68d,
+ 0x279c08,
+ 0x20f7cd,
+ 0x28a5c6,
+ 0x25dd0b,
+ 0x314149,
+ 0x2674c7,
+ 0x32cdc6,
+ 0x3339c9,
+ 0x35310a,
+ 0x30a088,
+ 0x304044,
+ 0x2bc2c7,
+ 0x24ea07,
+ 0x202744,
+ 0x2208c4,
+ 0x209cc9,
+ 0x30d489,
+ 0x20a888,
+ 0x2303c5,
+ 0x2140c5,
+ 0x20f086,
+ 0x21d549,
+ 0x283e4d,
+ 0x216d88,
+ 0x20ef87,
+ 0x234dc8,
+ 0x25b186,
+ 0x3e11c4,
+ 0x26b385,
+ 0x3e2f06,
+ 0x3e7984,
+ 0x203a47,
+ 0x20588a,
+ 0x216784,
+ 0x21a186,
+ 0x21a989,
+ 0x21a98f,
+ 0x21cc4d,
+ 0x21e706,
+ 0x224550,
+ 0x224946,
+ 0x226187,
+ 0x227f07,
+ 0x227f0f,
+ 0x229309,
+ 0x22cc86,
+ 0x22e907,
+ 0x22e908,
+ 0x22ed09,
+ 0x206e88,
+ 0x317a87,
+ 0x20c903,
+ 0x391906,
+ 0x37a588,
+ 0x2cd4ca,
+ 0x204189,
+ 0x22cb43,
+ 0x363506,
+ 0x34ac4a,
+ 0x282647,
+ 0x2fffca,
+ 0x31034e,
+ 0x229446,
+ 0x3d6847,
+ 0x24b006,
+ 0x203c06,
+ 0x38640b,
+ 0x218d8a,
+ 0x2f6e0d,
+ 0x2f53c7,
+ 0x274588,
+ 0x274589,
+ 0x27458f,
+ 0x2fb78c,
+ 0x2fb0c9,
+ 0x287bce,
+ 0x2b118a,
+ 0x20c606,
+ 0x2e9106,
+ 0x30cd4c,
+ 0x3bb08c,
+ 0x3d8388,
+ 0x338487,
+ 0x208c45,
+ 0x347e84,
+ 0x36430e,
+ 0x3109c4,
+ 0x3406c7,
+ 0x36be4a,
+ 0x3806d4,
+ 0x38a70f,
+ 0x2280c8,
+ 0x3917c8,
+ 0x38c34d,
+ 0x38c34e,
+ 0x3b4bc9,
+ 0x238308,
+ 0x23830f,
+ 0x23c1cc,
+ 0x23c1cf,
+ 0x23d147,
+ 0x23f90a,
+ 0x240acb,
+ 0x241348,
+ 0x244547,
+ 0x24be0d,
+ 0x362546,
+ 0x21d846,
+ 0x247bc9,
+ 0x26bac8,
+ 0x24db08,
+ 0x24db0e,
+ 0x26b907,
+ 0x308585,
+ 0x24f085,
+ 0x220744,
+ 0x3497c6,
+ 0x20a788,
+ 0x3a2983,
+ 0x2bf30e,
+ 0x24c1c8,
+ 0x3e534b,
+ 0x3c7807,
+ 0x2332c5,
+ 0x279ec6,
+ 0x2ba1c7,
+ 0x33e8c8,
+ 0x32c449,
+ 0x23cb05,
+ 0x2925c8,
+ 0x22fe06,
+ 0x3b3cca,
+ 0x364209,
+ 0x23c589,
+ 0x23c58b,
+ 0x33b7c8,
+ 0x202609,
+ 0x230486,
+ 0x3c298a,
+ 0x2a104a,
+ 0x23fb0c,
+ 0x371707,
+ 0x277d4a,
+ 0x39f78b,
+ 0x39f799,
+ 0x351a48,
+ 0x24d985,
+ 0x24bfc6,
+ 0x296489,
+ 0x250206,
+ 0x22b24a,
+ 0x2163c6,
+ 0x232d44,
+ 0x2dce0d,
+ 0x32d187,
+ 0x232d49,
+ 0x252185,
+ 0x2522c8,
+ 0x252f49,
+ 0x254744,
+ 0x254e07,
+ 0x254e08,
+ 0x255287,
+ 0x273b48,
+ 0x25cac7,
+ 0x2dfac5,
+ 0x26420c,
+ 0x2646c9,
+ 0x3b930a,
+ 0x266cc9,
+ 0x2fee09,
+ 0x26700c,
+ 0x26974b,
+ 0x26ac88,
+ 0x26bcc8,
+ 0x26f504,
+ 0x290988,
+ 0x291d49,
+ 0x2c0307,
+ 0x21abc6,
+ 0x2a9607,
+ 0x3d4bc9,
+ 0x21070b,
+ 0x247047,
+ 0x21fc47,
+ 0x3e3507,
+ 0x20f744,
+ 0x20f745,
+ 0x2e8cc5,
+ 0x357f0b,
+ 0x30df44,
+ 0x3b6648,
+ 0x25974a,
+ 0x22fec7,
+ 0x3e5007,
+ 0x299452,
+ 0x3d4786,
+ 0x239c86,
+ 0x340ace,
+ 0x3e5786,
+ 0x29ddc8,
+ 0x29f2cf,
+ 0x20fb88,
+ 0x243948,
+ 0x2e75ca,
+ 0x2e75d1,
+ 0x2af74e,
+ 0x20294a,
+ 0x20294c,
+ 0x238507,
+ 0x238510,
+ 0x3d9e48,
+ 0x2af945,
+ 0x2ba4ca,
+ 0x3e79cc,
+ 0x2a204d,
+ 0x20e446,
+ 0x20e447,
+ 0x20e44c,
+ 0x20f3cc,
+ 0x26a98c,
+ 0x39304b,
+ 0x3a4f04,
+ 0x205604,
+ 0x2be009,
+ 0x37de47,
+ 0x361f89,
+ 0x2a0e89,
+ 0x2bff07,
+ 0x2c00c6,
+ 0x2c00c9,
+ 0x2c04c3,
+ 0x2b2fca,
+ 0x37a447,
+ 0x37b94b,
+ 0x2f6c8a,
+ 0x25bfc4,
+ 0x3ceb46,
+ 0x28cd09,
+ 0x2f44c4,
+ 0x2e4e4a,
+ 0x302645,
+ 0x2d1b85,
+ 0x2d1b8d,
+ 0x2d1ece,
+ 0x2722c5,
+ 0x33bc06,
+ 0x24d507,
+ 0x25d40a,
+ 0x231c86,
+ 0x37ee04,
+ 0x301887,
+ 0x300e4b,
+ 0x273847,
+ 0x2420c4,
+ 0x316546,
+ 0x31654d,
+ 0x2eba8c,
+ 0x3d1a86,
+ 0x216f8a,
+ 0x221d46,
+ 0x227bc8,
+ 0x2fd2c7,
+ 0x2dafca,
+ 0x3e7346,
+ 0x28aa83,
+ 0x354806,
+ 0x213448,
+ 0x36dc0a,
+ 0x25aa07,
+ 0x25aa08,
+ 0x2985c4,
+ 0x2a5c47,
+ 0x31f5c8,
+ 0x2f3cc8,
+ 0x2f1188,
+ 0x32a8ca,
+ 0x2efe85,
+ 0x2cb207,
+ 0x260e13,
+ 0x276586,
+ 0x38d188,
+ 0x22bb49,
+ 0x24d008,
+ 0x28794b,
+ 0x2ca108,
+ 0x2eb7c4,
+ 0x326e86,
+ 0x324186,
+ 0x3423c9,
+ 0x2dae07,
+ 0x264308,
+ 0x2aa246,
+ 0x200bc4,
+ 0x3de805,
+ 0x33f188,
+ 0x39000a,
+ 0x2dca88,
+ 0x2e1046,
+ 0x2a6a8a,
+ 0x36a688,
+ 0x3bc6c8,
+ 0x2e50c8,
+ 0x2e5906,
+ 0x2e7d46,
+ 0x3b20cc,
+ 0x2e8310,
+ 0x2e8705,
+ 0x20f988,
+ 0x288910,
+ 0x20f990,
+ 0x3ae44e,
+ 0x3b1d4e,
+ 0x3b1d54,
+ 0x3ba5cf,
+ 0x3ba986,
+ 0x202811,
+ 0x209613,
+ 0x32cf48,
+ 0x363c05,
+ 0x283748,
+ 0x32d685,
+ 0x348fcc,
+ 0x2718c9,
+ 0x310809,
+ 0x2fbfc7,
+ 0x368f49,
+ 0x3a8747,
+ 0x313386,
+ 0x26b187,
+ 0x2649c5,
+ 0x212bc3,
+ 0x21e803,
+ 0x2433c4,
+ 0x21574d,
+ 0x3c3dcf,
+ 0x200c05,
+ 0x348ec6,
+ 0x22a447,
+ 0x235d07,
+ 0x355bc6,
+ 0x355bcb,
+ 0x2b0505,
+ 0x289146,
+ 0x3baf07,
+ 0x25e109,
+ 0x22eb86,
+ 0x3881c5,
+ 0x20368b,
+ 0x20de06,
+ 0x22f7c5,
+ 0x24fa08,
+ 0x2a3b08,
+ 0x2b3ccc,
+ 0x2b3cd0,
+ 0x2b89c9,
+ 0x2cad07,
+ 0x34de4b,
+ 0x2f0c46,
+ 0x31794a,
+ 0x38cf0b,
+ 0x314c4a,
+ 0x2f9406,
+ 0x2fae05,
+ 0x331506,
+ 0x292a88,
+ 0x3a5c0a,
+ 0x38bfdc,
+ 0x30450c,
+ 0x304808,
+ 0x24d905,
+ 0x38f6c7,
+ 0x2cce46,
+ 0x39da45,
+ 0x2210c6,
+ 0x355d88,
+ 0x2d0c47,
+ 0x2cd108,
+ 0x27664a,
+ 0x35b5cc,
+ 0x3a2c09,
+ 0x35b847,
+ 0x243e44,
+ 0x204a06,
+ 0x2434ca,
+ 0x2a0f85,
+ 0x22054c,
+ 0x220c08,
+ 0x236f48,
+ 0x32794c,
+ 0x33878c,
+ 0x35cf89,
+ 0x361d87,
+ 0x24808c,
+ 0x2fce84,
+ 0x322a4a,
+ 0x3e23cc,
+ 0x254fcb,
+ 0x255c8b,
+ 0x259186,
+ 0x25f087,
+ 0x238747,
+ 0x23874f,
+ 0x311a51,
+ 0x2ee312,
+ 0x25f3cd,
+ 0x25f3ce,
+ 0x25f70e,
+ 0x3ba788,
+ 0x3ba792,
+ 0x2fc688,
+ 0x2b1987,
+ 0x259c4a,
+ 0x2125c8,
+ 0x3e5745,
+ 0x2c618a,
+ 0x224cc7,
+ 0x2f0d84,
+ 0x20b5c3,
+ 0x23f1c5,
+ 0x2e7847,
+ 0x306587,
+ 0x2a224e,
+ 0x3dc44d,
+ 0x316209,
+ 0x207385,
+ 0x34f9c3,
+ 0x33e246,
+ 0x267c45,
+ 0x3e5588,
+ 0x22d149,
+ 0x24c005,
+ 0x24c00f,
+ 0x2c5f47,
+ 0x234bc5,
+ 0x3c81ca,
+ 0x20d746,
+ 0x246809,
+ 0x3599cc,
+ 0x37eec9,
+ 0x2111c6,
+ 0x25954c,
+ 0x3357c6,
+ 0x30fac8,
+ 0x38c686,
+ 0x278b86,
+ 0x2c6c44,
+ 0x386d83,
+ 0x3e380a,
+ 0x209211,
+ 0x2fb28a,
+ 0x3e19c5,
+ 0x263e87,
+ 0x261707,
+ 0x2e20c4,
+ 0x31f6cb,
+ 0x3cfec8,
+ 0x2cf7c6,
+ 0x23e5c5,
+ 0x257104,
+ 0x26f9c9,
+ 0x2008c4,
+ 0x218407,
+ 0x37e8c5,
+ 0x37e8c7,
+ 0x340d05,
+ 0x212483,
+ 0x2b1848,
+ 0x2484ca,
+ 0x235f03,
+ 0x235f0a,
+ 0x2ae286,
+ 0x24bd8f,
+ 0x26b889,
+ 0x2bf290,
+ 0x2e2248,
+ 0x2e1809,
+ 0x2a5007,
+ 0x3164cf,
+ 0x3c5fc4,
+ 0x2e9044,
+ 0x2247c6,
+ 0x25d8c6,
+ 0x252c0a,
+ 0x24cb06,
+ 0x2bcc47,
+ 0x317dc8,
+ 0x317fc7,
+ 0x3196c7,
+ 0x31aa0a,
+ 0x319fcb,
+ 0x271385,
+ 0x2edf48,
+ 0x20c183,
+ 0x3c17cc,
+ 0x2089cf,
+ 0x22158d,
+ 0x35e207,
+ 0x236c89,
+ 0x35d247,
+ 0x2cbd48,
+ 0x3808cc,
+ 0x2eb6c8,
+ 0x3e16c8,
+ 0x33438e,
+ 0x345b94,
+ 0x3460a4,
+ 0x360d8a,
+ 0x37ea8b,
+ 0x3a8804,
+ 0x3a8809,
+ 0x2c6848,
+ 0x24fe05,
+ 0x3a248a,
+ 0x2b39c7,
+ 0x258bc4,
+ 0x253c43,
+ 0x216543,
+ 0x23ec84,
+ 0x222bc3,
+ 0x343b43,
+ 0x2b1b84,
+ 0x243543,
+ 0x216443,
+ 0x2e8306,
+ 0x21b544,
+ 0x2296c3,
+ 0x20cb83,
+ 0x21f6c3,
+ 0x2000c2,
+ 0x253c43,
+ 0x216542,
+ 0x216543,
+ 0x23ec84,
+ 0x222bc3,
+ 0x343b43,
+ 0x243543,
+ 0x2e8306,
+ 0x2296c3,
+ 0x20cb83,
+ 0x793c8,
+ 0x216543,
+ 0x222bc3,
+ 0x2f5503,
+ 0x606296c3,
+ 0x7ca83,
+ 0x20cb83,
+ 0x60a01704,
+ 0xc1442,
+ 0x793c8,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x216443,
+ 0x21b544,
+ 0x2296c3,
+ 0x20cb83,
+ 0x2000c2,
+ 0x28bb03,
+ 0x216542,
+ 0x222bc3,
+ 0x343b43,
+ 0x216443,
+ 0x2296c3,
+ 0x20cb83,
+ 0x204182,
+ 0x204042,
+ 0x216542,
+ 0x216543,
+ 0x2080c2,
+ 0x2005c2,
+ 0x2b1b84,
+ 0x28d4c4,
+ 0x233ec2,
+ 0x21b544,
+ 0x2003c2,
+ 0x20cb83,
+ 0x21f6c3,
+ 0x259186,
+ 0x22a042,
+ 0x204a42,
+ 0x208f02,
+ 0x61e0fb83,
+ 0x62202943,
+ 0x62186,
+ 0x62186,
+ 0x25dd04,
+ 0x20d903,
+ 0x1a16cd,
+ 0xa60a,
+ 0x1a02cc,
+ 0x8d34c,
+ 0x62c691cf,
+ 0x7074d,
+ 0x15c104,
+ 0x75104,
+ 0xffd44,
+ 0x146c05,
+ 0x95d89,
+ 0x17488c,
+ 0x34347,
+ 0x17f06,
+ 0x1f2c8,
+ 0x22a87,
+ 0x29e88,
+ 0x1beaca,
+ 0x1e1c47,
+ 0x174ac9,
+ 0x632ea205,
+ 0xea209,
+ 0x6343df0b,
+ 0x123308,
+ 0x3ecb,
+ 0x17ce88,
+ 0x18484a,
+ 0x132bce,
+ 0x6397448a,
+ 0x12808d,
+ 0x1b4bcd,
+ 0x144ce0b,
+ 0xeb94a,
+ 0x1db84,
+ 0x53846,
+ 0x89288,
+ 0x1dcf08,
+ 0x3e1c7,
+ 0x1e485,
+ 0x63eabe08,
+ 0x1d74c7,
+ 0x51b89,
+ 0xf4547,
+ 0x1c74c8,
+ 0x32649,
+ 0x48404,
+ 0x48985,
+ 0xc9ce,
+ 0x1402c7,
+ 0x6462cd86,
+ 0xb8d0d,
+ 0x1cdd88,
+ 0xedb48,
+ 0x64b7cb46,
+ 0x6557cb48,
+ 0xb3588,
+ 0x13d150,
+ 0x5fc8c,
+ 0x70607,
+ 0x71b07,
+ 0x75c07,
+ 0x7c947,
+ 0xc342,
+ 0x1d8707,
+ 0x18f4c,
+ 0x116b05,
+ 0xb8847,
+ 0xb3b86,
+ 0xb4e49,
+ 0xb7288,
+ 0x1ec82,
+ 0x5c2,
+ 0x190a86,
+ 0x67cb,
+ 0x6ac6,
+ 0x15c9c4,
+ 0x10f887,
+ 0x5e789,
+ 0x932c9,
+ 0x1bc248,
+ 0x54202,
+ 0x1971c9,
+ 0x17988,
+ 0x104e4a,
+ 0x65ada54b,
+ 0x145149,
+ 0x12506,
+ 0xdf889,
+ 0xeb8c7,
+ 0xec009,
+ 0xed548,
+ 0xeeac7,
+ 0xefe09,
+ 0xf2185,
+ 0xf2550,
+ 0x1e84c6,
+ 0x10f7c5,
+ 0x120047,
+ 0xb6a4d,
+ 0x4ab45,
+ 0xfec06,
+ 0xff487,
+ 0x105518,
+ 0xf48c8,
+ 0x80d4a,
+ 0x4a02,
+ 0x663a540b,
+ 0x666df98a,
+ 0x55a4a,
+ 0x6334d,
+ 0x1702,
+ 0xd9c46,
+ 0x30846,
+ 0xa7248,
+ 0xb700a,
+ 0x46c88,
+ 0x79289,
+ 0x118d88,
+ 0x6f68e,
+ 0x16208,
+ 0x13e247,
+ 0x66bb0284,
+ 0x12764d,
+ 0x10ba05,
+ 0x1a2f48,
+ 0x4fec8,
+ 0x66eaf2c8,
+ 0x114786,
+ 0x6502,
+ 0xcf5c4,
+ 0x110b46,
+ 0x6724b348,
+ 0x13906,
+ 0x678ddecb,
+ 0xe042,
+ 0xacc09,
+ 0x12d408,
+ 0x164647,
+ 0x35b4a,
+ 0x40407,
+ 0x401,
+ 0x81,
+ 0x183c47,
+ 0x116348,
+ 0x642c1503,
+ 0x1616c4,
+ 0xc1508,
+ 0xc1708,
+ 0xc1908,
+ 0x69c07,
+ 0x9b583,
+ 0x64e40644,
+ 0x652a0803,
+ 0xc1,
+ 0x267c6,
+ 0xc1,
+ 0x201,
+ 0x267c6,
+ 0x9b583,
+ 0x65f36fc4,
+ 0x18b2c4,
+ 0x1a845,
+ 0x88e45,
+ 0x10f9c4,
+ 0x16684,
+ 0x54644,
+ 0x1c4b88,
+ 0x1866cc,
+ 0xe01,
+ 0x192c3,
+ 0x27804,
+ 0x1c4b88,
+ 0x677c4b88,
+ 0x674c3,
+ 0x79943,
+ 0x27d47,
+ 0x5f07,
+ 0x156d145,
+ 0x57e04,
+ 0x10dfc7,
+ 0x16542,
+ 0x88e04,
+ 0x21d684,
+ 0x216543,
+ 0x256d44,
+ 0x2b1b84,
+ 0x2296c3,
+ 0x22ba05,
+ 0x2203c3,
+ 0x24c343,
+ 0x355b45,
+ 0x201643,
+ 0x1df83,
+ 0x68a16543,
+ 0x222bc3,
+ 0x56d44,
+ 0x4f03,
+ 0x343b43,
+ 0x200181,
+ 0x1b283,
+ 0x216443,
+ 0x28d4c4,
+ 0x21b544,
+ 0x2296c3,
+ 0x57743,
+ 0x20cb83,
+ 0x202b03,
+ 0x793c8,
+ 0x2000c2,
+ 0x253c43,
+ 0x216542,
+ 0x216543,
+ 0x222bc3,
+ 0x2f5503,
+ 0x2005c2,
+ 0x2b1b84,
+ 0x243543,
+ 0x216443,
+ 0x2296c3,
+ 0x20d903,
+ 0x20cb83,
+ 0x201643,
+ 0x8904,
+ 0x793c8,
+ 0xf0007,
+ 0x16542,
+ 0x13f105,
+ 0x5fdcf,
+ 0xfa946,
+ 0x1472588,
+ 0x1190ce,
+ 0x69a0bc42,
+ 0x20bc88,
+ 0x20ad46,
+ 0x257f86,
+ 0x39a587,
+ 0x69e00c82,
+ 0x6a2bf108,
+ 0x22588a,
+ 0x270088,
+ 0x200ac2,
+ 0x37b789,
+ 0x2713c7,
+ 0x21ab46,
+ 0x2b1589,
+ 0x2cb344,
+ 0x349406,
+ 0x2d8d04,
+ 0x223984,
+ 0x263789,
+ 0x3e2106,
+ 0x236b05,
+ 0x274145,
+ 0x3e04c7,
+ 0x2d3b87,
+ 0x2d8684,
+ 0x322006,
+ 0x3061c5,
+ 0x20b585,
+ 0x238cc5,
+ 0x337047,
+ 0x3c7645,
+ 0x2533c9,
+ 0x3411c5,
+ 0x33ea04,
+ 0x231bc7,
+ 0x379ece,
+ 0x208509,
+ 0x340989,
+ 0x36ce06,
+ 0x249048,
+ 0x370e4b,
+ 0x2ab90c,
+ 0x31a746,
+ 0x2c32c7,
+ 0x2f19c5,
+ 0x31270a,
+ 0x20a989,
+ 0x201189,
+ 0x207d06,
+ 0x3bacc5,
+ 0x24f485,
+ 0x385e09,
+ 0x238e4b,
+ 0x3871c6,
+ 0x352106,
+ 0x20ef84,
+ 0x323bc6,
+ 0x308608,
+ 0x3cd246,
+ 0x228d06,
+ 0x204b88,
+ 0x206347,
+ 0x207ac9,
+ 0x20a245,
+ 0x793c8,
+ 0x3d7444,
+ 0x319c44,
+ 0x213f45,
+ 0x344589,
+ 0x22adc7,
+ 0x22adcb,
+ 0x22c88a,
+ 0x232345,
+ 0x6a606e82,
+ 0x2f6b47,
+ 0x6aa34fc8,
+ 0x207f47,
+ 0x21c245,
+ 0x2c858a,
+ 0x16542,
+ 0x289c0b,
+ 0x28ab0a,
+ 0x22bd06,
+ 0x2122c3,
+ 0x214ccd,
+ 0x3c338c,
+ 0x3dec0d,
+ 0x29e685,
+ 0x2bdd45,
+ 0x3a29c7,
+ 0x214609,
+ 0x225786,
+ 0x24c985,
+ 0x37f7c8,
+ 0x2d9c83,
+ 0x3588c8,
+ 0x323ac8,
+ 0x39f407,
+ 0x3c7188,
+ 0x2251c9,
+ 0x2d7a47,
+ 0x2f6347,
+ 0x36cfc8,
+ 0x37b644,
+ 0x37b647,
+ 0x28a4c8,
+ 0x361486,
+ 0x205acf,
+ 0x323607,
+ 0x321b06,
+ 0x361ec5,
+ 0x22c3c3,
+ 0x250b47,
+ 0x251243,
+ 0x255446,
+ 0x257d06,
+ 0x25a606,
+ 0x29c885,
+ 0x273b43,
+ 0x396e48,
+ 0x38b949,
+ 0x3a3c8b,
+ 0x25a788,
+ 0x25c785,
+ 0x25eb45,
+ 0x6ae5c082,
+ 0x26b249,
+ 0x3d1907,
+ 0x2891c5,
+ 0x263687,
+ 0x264dc6,
+ 0x3b2605,
+ 0x267a8b,
+ 0x26ac84,
+ 0x26fc45,
+ 0x26fd87,
+ 0x281a06,
+ 0x281e45,
+ 0x290dc7,
+ 0x291487,
+ 0x2ae244,
+ 0x37468a,
+ 0x297688,
+ 0x371109,
+ 0x2acac5,
+ 0x347486,
+ 0x3087ca,
+ 0x274046,
+ 0x23b8c7,
+ 0x2780cd,
+ 0x2b0049,
+ 0x394d85,
+ 0x37d287,
+ 0x32bbc8,
+ 0x36c888,
+ 0x3c3ac7,
+ 0x3ce246,
+ 0x22d347,
+ 0x257783,
+ 0x357f04,
+ 0x380f85,
+ 0x3b1447,
+ 0x3bbe49,
+ 0x287f08,
+ 0x23b7c5,
+ 0x382fc4,
+ 0x2574c5,
+ 0x26510d,
+ 0x200cc2,
+ 0x221ec6,
+ 0x2f8e06,
+ 0x33f34a,
+ 0x39e886,
+ 0x3afc45,
+ 0x2d91c5,
+ 0x2d91c7,
+ 0x3b3b0c,
+ 0x2b340a,
+ 0x298d86,
+ 0x2e7c45,
+ 0x323a06,
+ 0x299287,
+ 0x29ab06,
+ 0x29c78c,
+ 0x2b16c9,
+ 0x6b226c47,
+ 0x29f685,
+ 0x29f686,
+ 0x2a0288,
+ 0x24c885,
+ 0x2b0785,
+ 0x2b2048,
+ 0x2b224a,
+ 0x6b6870c2,
+ 0x6ba10f82,
+ 0x368b05,
+ 0x317b83,
+ 0x23d9c8,
+ 0x20b383,
+ 0x2b24c4,
+ 0x24694b,
+ 0x2231c8,
+ 0x2c1bc8,
+ 0x6bf4a9c9,
+ 0x2b8309,
+ 0x2b8c06,
+ 0x2b9e48,
+ 0x2ba049,
+ 0x2ba946,
+ 0x2baac5,
+ 0x251986,
+ 0x2bb089,
+ 0x2d46c7,
+ 0x24e2c6,
+ 0x273307,
+ 0x37bd07,
+ 0x39d584,
+ 0x6c2f4bc9,
+ 0x39dc88,
+ 0x2bf008,
+ 0x200e07,
+ 0x2dc706,
+ 0x20db89,
+ 0x257f47,
+ 0x3c840a,
+ 0x3ce388,
+ 0x21f107,
+ 0x221886,
+ 0x29ac4a,
+ 0x3a6c88,
+ 0x2f8885,
+ 0x22f6c5,
+ 0x31bd47,
+ 0x324849,
+ 0x32864b,
+ 0x3bc408,
+ 0x341249,
+ 0x25b607,
+ 0x2cdbcc,
+ 0x2ce30c,
+ 0x2ce60a,
+ 0x2ce88c,
+ 0x2d8888,
+ 0x2d8a88,
+ 0x2d8c84,
+ 0x2d9409,
+ 0x2d9649,
+ 0x2d988a,
+ 0x2d9b09,
+ 0x2d9e87,
+ 0x3cb8cc,
+ 0x3e7f06,
+ 0x277a88,
+ 0x274106,
+ 0x392b46,
+ 0x394c87,
+ 0x3ab788,
+ 0x3499cb,
+ 0x207e07,
+ 0x263fc9,
+ 0x28d5c9,
+ 0x252907,
+ 0x24b5c4,
+ 0x26bfc7,
+ 0x2d2bc6,
+ 0x218946,
+ 0x217145,
+ 0x2db8c8,
+ 0x310704,
+ 0x310706,
+ 0x2b32cb,
+ 0x266749,
+ 0x25b246,
+ 0x228f09,
+ 0x214006,
+ 0x38f0c8,
+ 0x271f43,
+ 0x3bae45,
+ 0x218a89,
+ 0x3e97c5,
+ 0x308104,
+ 0x3b7146,
+ 0x36aa05,
+ 0x260006,
+ 0x31c407,
+ 0x2109c6,
+ 0x2374cb,
+ 0x3c2887,
+ 0x267786,
+ 0x27e3c6,
+ 0x3e0586,
+ 0x2d8649,
+ 0x20308a,
+ 0x2cfdc5,
+ 0x2fcb0d,
+ 0x2b2346,
+ 0x259946,
+ 0x2e2146,
+ 0x227b45,
+ 0x2f2847,
+ 0x233587,
+ 0x27ec0e,
+ 0x216443,
+ 0x2dc6c9,
+ 0x3a1c09,
+ 0x312b07,
+ 0x276e87,
+ 0x291945,
+ 0x2f3e45,
+ 0x6c609e0f,
+ 0x2e1a47,
+ 0x2e1c08,
+ 0x2e1f04,
+ 0x2e2446,
+ 0x6ca4f102,
+ 0x2e5b86,
+ 0x2e8306,
+ 0x30f40e,
+ 0x35870a,
+ 0x2c7906,
+ 0x21498a,
+ 0x20d109,
+ 0x23f7c5,
+ 0x30bfc8,
+ 0x3dc706,
+ 0x2be208,
+ 0x343648,
+ 0x285dcb,
+ 0x39a685,
+ 0x3c76c8,
+ 0x204ccc,
+ 0x21c107,
+ 0x259b86,
+ 0x36a848,
+ 0x349688,
+ 0x6ce4ba82,
+ 0x32e38b,
+ 0x211e89,
+ 0x20a449,
+ 0x3c2187,
+ 0x3a8bc8,
+ 0x6d21e1c8,
+ 0x32c1cb,
+ 0x268d09,
+ 0x29420d,
+ 0x306f08,
+ 0x3c5088,
+ 0x6d603c82,
+ 0x210c84,
+ 0x6da386c2,
+ 0x377a06,
+ 0x6de00e42,
+ 0x3022ca,
+ 0x2b0606,
+ 0x22fc48,
+ 0x2b1e48,
+ 0x260946,
+ 0x2c37c6,
+ 0x3090c6,
+ 0x3e5505,
+ 0x2417c4,
+ 0x6e235504,
+ 0x3597c6,
+ 0x281447,
+ 0x6e684ec7,
+ 0x391e0b,
+ 0x208149,
+ 0x2bdd8a,
+ 0x2d9304,
+ 0x258208,
+ 0x24e08d,
+ 0x302bc9,
+ 0x302e08,
+ 0x303089,
+ 0x305504,
+ 0x251104,
+ 0x28c445,
+ 0x20508b,
+ 0x223146,
+ 0x359605,
+ 0x23f349,
+ 0x3220c8,
+ 0x2aeb04,
+ 0x312889,
+ 0x21eec5,
+ 0x2d3bc8,
+ 0x2f6a07,
+ 0x340d88,
+ 0x28cf06,
+ 0x206d47,
+ 0x2ecf49,
+ 0x203809,
+ 0x22f845,
+ 0x2b0d05,
+ 0x6ea1f182,
+ 0x33e7c4,
+ 0x244985,
+ 0x39a486,
+ 0x34b885,
+ 0x303c87,
+ 0x3598c5,
+ 0x281a44,
+ 0x36cec6,
+ 0x24ca07,
+ 0x3a01c6,
+ 0x32c605,
+ 0x212788,
+ 0x20af45,
+ 0x21b207,
+ 0x22c649,
+ 0x26688a,
+ 0x2344c7,
+ 0x2344cc,
+ 0x236ac6,
+ 0x242d89,
+ 0x24c505,
+ 0x24c7c8,
+ 0x22ea03,
+ 0x230445,
+ 0x2c7d85,
+ 0x286a07,
+ 0x6ee01242,
+ 0x2fe1c7,
+ 0x2eef06,
+ 0x3ad646,
+ 0x2f2006,
+ 0x3495c6,
+ 0x24b9c8,
+ 0x283885,
+ 0x321bc7,
+ 0x321bcd,
+ 0x20b5c3,
+ 0x3e83c5,
+ 0x3c7f87,
+ 0x2fe508,
+ 0x3c7b45,
+ 0x21f908,
+ 0x35b2c6,
+ 0x2ea3c7,
+ 0x2f5685,
+ 0x39a706,
+ 0x3973c5,
+ 0x22554a,
+ 0x2f9546,
+ 0x2315c7,
+ 0x320285,
+ 0x2fdec7,
+ 0x301804,
+ 0x308086,
+ 0x30bf05,
+ 0x23640b,
+ 0x2d2a49,
+ 0x28bc0a,
+ 0x22f8c8,
+ 0x377b48,
+ 0x30fecc,
+ 0x310c87,
+ 0x31ea88,
+ 0x391308,
+ 0x3d65c5,
+ 0x32a40a,
+ 0x34f9c9,
+ 0x6f200ec2,
+ 0x210606,
+ 0x24c004,
+ 0x300c89,
+ 0x247989,
+ 0x24eec7,
+ 0x284447,
+ 0x2a0d09,
+ 0x32aac8,
+ 0x32aacf,
+ 0x22dd46,
+ 0x2e9ecb,
+ 0x261445,
+ 0x261447,
+ 0x3572c9,
+ 0x22a186,
+ 0x312807,
+ 0x2ee685,
+ 0x23a944,
+ 0x34cb86,
+ 0x2174c4,
+ 0x2c9147,
+ 0x360648,
+ 0x6f7babc8,
+ 0x30d045,
+ 0x30d187,
+ 0x351bc9,
+ 0x211c44,
+ 0x24a5c8,
+ 0x6fb04c88,
+ 0x2e20c4,
+ 0x33ed08,
+ 0x32ce84,
+ 0x217389,
+ 0x227a85,
+ 0x6fe13402,
+ 0x22dd85,
+ 0x2ed405,
+ 0x3b69c8,
+ 0x23cf87,
+ 0x702008c2,
+ 0x3c2645,
+ 0x2e4146,
+ 0x25fb06,
+ 0x33e788,
+ 0x348688,
+ 0x34b846,
+ 0x37dcc6,
+ 0x2f00c9,
+ 0x3ad586,
+ 0x22a04b,
+ 0x349345,
+ 0x259386,
+ 0x261f88,
+ 0x362646,
+ 0x29e506,
+ 0x22000a,
+ 0x2e530a,
+ 0x22be45,
+ 0x24f187,
+ 0x27f886,
+ 0x70605002,
+ 0x3c80c7,
+ 0x38fb05,
+ 0x308744,
+ 0x308745,
+ 0x258106,
+ 0x27df47,
+ 0x2247c5,
+ 0x247a44,
+ 0x2e2708,
+ 0x29e5c5,
+ 0x355387,
+ 0x383485,
+ 0x225485,
+ 0x265c84,
+ 0x265c89,
+ 0x306008,
+ 0x2017c6,
+ 0x347706,
+ 0x3b6c06,
+ 0x70bd38c8,
+ 0x3dc2c7,
+ 0x31490d,
+ 0x314ecc,
+ 0x3154c9,
+ 0x315709,
+ 0x70f75ac2,
+ 0x3db703,
+ 0x22bec3,
+ 0x2d2c85,
+ 0x3b154a,
+ 0x33e646,
+ 0x34ce85,
+ 0x31cbc4,
+ 0x31cbcb,
+ 0x33508c,
+ 0x33594c,
+ 0x335c55,
+ 0x33698d,
+ 0x338a8f,
+ 0x338e52,
+ 0x3392cf,
+ 0x339692,
+ 0x339b13,
+ 0x339fcd,
+ 0x33a58d,
+ 0x33a90e,
+ 0x33b2ce,
+ 0x33b9cc,
+ 0x33bd8c,
+ 0x33c1cb,
+ 0x33cc4e,
+ 0x33d552,
+ 0x33e40c,
+ 0x33f5d0,
+ 0x34cfd2,
+ 0x34e1cc,
+ 0x34e88d,
+ 0x34ebcc,
+ 0x350dd1,
+ 0x35228d,
+ 0x355f8d,
+ 0x35658a,
+ 0x35680c,
+ 0x357ccc,
+ 0x35930c,
+ 0x359ccc,
+ 0x35dad3,
+ 0x35e550,
+ 0x35e950,
+ 0x35f34d,
+ 0x35f94c,
+ 0x360ac9,
+ 0x36290d,
+ 0x362c53,
+ 0x364b11,
+ 0x365313,
+ 0x36664f,
+ 0x366a0c,
+ 0x366d0f,
+ 0x3670cd,
+ 0x3676cf,
+ 0x367a90,
+ 0x36850e,
+ 0x36d54e,
+ 0x36de90,
+ 0x36ea8d,
+ 0x36f40e,
+ 0x36f78c,
+ 0x3708d3,
+ 0x3725ce,
+ 0x373310,
+ 0x373711,
+ 0x373b4f,
+ 0x373f13,
+ 0x37564d,
+ 0x37598f,
+ 0x375d4e,
+ 0x3762d0,
+ 0x3766c9,
+ 0x377d50,
+ 0x37824f,
+ 0x3788cf,
+ 0x378c92,
+ 0x37c3ce,
+ 0x37d94d,
+ 0x37e00d,
+ 0x37e34d,
+ 0x37f9cd,
+ 0x37fd0d,
+ 0x380050,
+ 0x38044b,
+ 0x380d4c,
+ 0x3810cc,
+ 0x3816cc,
+ 0x3819ce,
+ 0x390450,
+ 0x392492,
+ 0x39290b,
+ 0x3938ce,
+ 0x393c4e,
+ 0x3944ce,
+ 0x394a4b,
+ 0x71394ed6,
+ 0x395e0d,
+ 0x396994,
+ 0x39768d,
+ 0x399cd5,
+ 0x39b8cd,
+ 0x39c24f,
+ 0x39cb8f,
+ 0x3a3f4f,
+ 0x3a430e,
+ 0x3a468d,
+ 0x3a6611,
+ 0x3aaf4c,
+ 0x3ab24c,
+ 0x3ab54b,
+ 0x3ab98c,
+ 0x3ac40f,
+ 0x3ac7d2,
+ 0x3acdcd,
+ 0x3ae1cc,
+ 0x3aec8c,
+ 0x3aef8d,
+ 0x3af2cf,
+ 0x3af68e,
+ 0x3b120c,
+ 0x3b17cd,
+ 0x3b1b0b,
+ 0x3b23cc,
+ 0x3b318d,
+ 0x3b34ce,
+ 0x3b3849,
+ 0x3b50d3,
+ 0x3b798d,
+ 0x3b808d,
+ 0x3b868c,
+ 0x3b8d0e,
+ 0x3b958f,
+ 0x3b994c,
+ 0x3b9c4d,
+ 0x3b9f8f,
+ 0x3ba34c,
+ 0x3bb38c,
+ 0x3bb90c,
+ 0x3bbc0c,
+ 0x3bc8cd,
+ 0x3bcc12,
+ 0x3bd38c,
+ 0x3bd68c,
+ 0x3bd991,
+ 0x3bddcf,
+ 0x3be18f,
+ 0x3be553,
+ 0x3bf34e,
+ 0x3bf6cf,
+ 0x3bfa8c,
+ 0x717c014e,
+ 0x3c04cf,
+ 0x3c0896,
+ 0x3c1b92,
+ 0x3c528c,
+ 0x3c618f,
+ 0x3c680d,
+ 0x3d294f,
+ 0x3d2d0c,
+ 0x3d300d,
+ 0x3d334d,
+ 0x3d51ce,
+ 0x3d5d0c,
+ 0x3d914c,
+ 0x3d9450,
+ 0x3daa91,
+ 0x3daecb,
+ 0x3db30c,
+ 0x3db60e,
+ 0x3dd8d1,
+ 0x3ddd0e,
+ 0x3de08d,
+ 0x3e5f8b,
+ 0x3e688f,
+ 0x3e74d4,
+ 0x2038c2,
+ 0x2038c2,
+ 0x204cc3,
+ 0x2038c2,
+ 0x204cc3,
+ 0x2038c2,
+ 0x201082,
+ 0x2519c5,
+ 0x3dd5cc,
+ 0x2038c2,
+ 0x2038c2,
+ 0x201082,
+ 0x2038c2,
+ 0x2a0905,
+ 0x266885,
+ 0x2038c2,
+ 0x2038c2,
+ 0x20bd42,
+ 0x2a0905,
+ 0x337209,
+ 0x36480c,
+ 0x2038c2,
+ 0x2038c2,
+ 0x2038c2,
+ 0x2038c2,
+ 0x2519c5,
+ 0x2038c2,
+ 0x2038c2,
+ 0x2038c2,
+ 0x2038c2,
+ 0x20bd42,
+ 0x337209,
+ 0x2038c2,
+ 0x2038c2,
+ 0x2038c2,
+ 0x266885,
+ 0x2038c2,
+ 0x266885,
+ 0x36480c,
+ 0x3dd5cc,
+ 0x253c43,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2b1b84,
+ 0x2296c3,
+ 0x20cb83,
+ 0x3c4f,
+ 0x12d248,
+ 0x6f7c4,
+ 0xd903,
+ 0x17b4c8,
+ 0x1d5b83,
+ 0x2000c2,
+ 0x72616542,
+ 0x249f03,
+ 0x23adc4,
+ 0x204f03,
+ 0x36c284,
+ 0x239c86,
+ 0x220e43,
+ 0x3b7004,
+ 0x2999c5,
+ 0x216443,
+ 0x2296c3,
+ 0x7ca83,
+ 0x20cb83,
+ 0x23098a,
+ 0x259186,
+ 0x393fcc,
+ 0x793c8,
+ 0x216542,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x233243,
+ 0x2e8306,
+ 0x2296c3,
+ 0x20cb83,
+ 0x21f6c3,
+ 0x39fc3,
+ 0xb4388,
+ 0x731e7c45,
+ 0x7c4c7,
+ 0xb1845,
+ 0x52547,
+ 0x146c05,
+ 0x4009,
+ 0xad42,
+ 0x1c138a,
+ 0x73f2d5c5,
+ 0x146c05,
+ 0x34347,
+ 0x16108,
+ 0x10d8e,
+ 0x95292,
+ 0x130e0b,
+ 0x1e1d46,
+ 0x742ea205,
+ 0x7479e04c,
+ 0x10de07,
+ 0xb46c7,
+ 0x1b620a,
+ 0x44ad0,
+ 0x17be85,
+ 0xc5e4b,
+ 0x1dcf08,
+ 0x3e1c7,
+ 0x3aa4b,
+ 0x51b89,
+ 0x873c7,
+ 0xf4547,
+ 0x187407,
+ 0x3e106,
+ 0x1c74c8,
+ 0x74c32f46,
+ 0x46bc7,
+ 0xc7e86,
+ 0xb8d0d,
+ 0x96110,
+ 0x75013242,
+ 0x1cdd88,
+ 0x184590,
+ 0x18ed0c,
+ 0x7578f54d,
+ 0x68508,
+ 0x6898b,
+ 0x76447,
+ 0x19a49,
+ 0x62246,
+ 0xa0488,
+ 0x5102,
+ 0x9c50a,
+ 0x36947,
+ 0xb8847,
+ 0xb4e49,
+ 0xb7288,
+ 0x154645,
+ 0x190a86,
+ 0x6ac6,
+ 0x1040ce,
+ 0x422ce,
+ 0x4aecf,
+ 0x5e789,
+ 0x932c9,
+ 0x9c08b,
+ 0xbb44f,
+ 0x1dd2cc,
+ 0xd4f4b,
+ 0x1b9248,
+ 0x191d07,
+ 0x19b308,
+ 0xbc0cb,
+ 0xbca0c,
+ 0xbce0c,
+ 0xbd20c,
+ 0xbd50d,
+ 0x1bc248,
+ 0x5adc2,
+ 0x1971c9,
+ 0x46688,
+ 0xda88b,
+ 0xdc906,
+ 0xe3acb,
+ 0x13d08b,
+ 0xeddca,
+ 0xeec85,
+ 0xf2550,
+ 0xf8286,
+ 0x583c6,
+ 0x10f7c5,
+ 0x120047,
+ 0xfa348,
+ 0xff487,
+ 0xff747,
+ 0x69587,
+ 0xd1846,
+ 0x17784a,
+ 0xb400a,
+ 0x30846,
+ 0xb860d,
+ 0x46c88,
+ 0x118d88,
+ 0xef809,
+ 0x1b2a09,
+ 0xcc205,
+ 0x176a8c,
+ 0xbd70b,
+ 0x10d989,
+ 0x112cc4,
+ 0x114549,
+ 0x114786,
+ 0x143506,
+ 0x4a42,
+ 0x13906,
+ 0x80c8b,
+ 0x11de07,
+ 0x11dfc7,
+ 0xe042,
+ 0xde645,
+ 0x9204,
+ 0x101,
+ 0x5b843,
+ 0x74b26806,
+ 0xa0803,
+ 0x382,
+ 0x1504,
+ 0xac2,
+ 0x5dd04,
+ 0x882,
+ 0x8502,
+ 0x4702,
+ 0x128c42,
+ 0x4182,
+ 0xea202,
+ 0xd42,
+ 0x2e702,
+ 0x3fb82,
+ 0xc542,
+ 0x3242,
+ 0x57f02,
+ 0x22bc3,
+ 0x942,
+ 0x2bc2,
+ 0x18242,
+ 0xeb02,
+ 0x642,
+ 0x3b342,
+ 0x1ec82,
+ 0x8e82,
+ 0x5502,
+ 0x5c2,
+ 0x43543,
+ 0x2642,
+ 0x6002,
+ 0x54202,
+ 0x7bc2,
+ 0x9d42,
+ 0x10442,
+ 0x205c2,
+ 0x11de42,
+ 0x1582,
+ 0x10f082,
+ 0x77782,
+ 0xa9542,
+ 0x296c3,
+ 0x602,
+ 0x4ba82,
+ 0x1cc2,
+ 0x2d4c2,
+ 0x2f7c5,
+ 0x59c2,
+ 0x4cec2,
+ 0x179e43,
+ 0x682,
+ 0x4a02,
+ 0x1702,
+ 0x4ac2,
+ 0xb5c2,
+ 0x8c2,
+ 0x6502,
+ 0x4a42,
+ 0x3ec5,
+ 0x75a01082,
+ 0x75eecb83,
+ 0x9983,
+ 0x76201082,
+ 0x9983,
+ 0xdc1c7,
+ 0x215483,
+ 0x2000c2,
+ 0x216543,
+ 0x222bc3,
+ 0x2f5503,
+ 0x2005c3,
+ 0x233243,
+ 0x2296c3,
+ 0x20d903,
+ 0x20cb83,
+ 0x2a0843,
+ 0xcc244,
+ 0x143845,
+ 0x1084c5,
+ 0x1a143,
+ 0x793c8,
+ 0x216543,
+ 0x222bc3,
+ 0x2f5503,
+ 0x216443,
+ 0x2296c3,
+ 0x20d903,
+ 0x7ca83,
+ 0x20cb83,
+ 0x216543,
+ 0x222bc3,
+ 0x20cb83,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x200181,
+ 0x216443,
+ 0x2296c3,
+ 0x257743,
+ 0x20cb83,
+ 0x1a3904,
+ 0x253c43,
+ 0x216543,
+ 0x222bc3,
+ 0x2163c3,
+ 0x2f5503,
+ 0x322603,
+ 0x285483,
+ 0x2b05c3,
+ 0x205383,
+ 0x343b43,
+ 0x2b1b84,
+ 0x2296c3,
+ 0x20cb83,
+ 0x201643,
+ 0x202304,
+ 0x239843,
+ 0x3b43,
+ 0x2133c3,
+ 0x32f308,
+ 0x29ac84,
+ 0x20020a,
+ 0x25afc6,
+ 0x1519c4,
+ 0x3bd047,
+ 0x22820a,
+ 0x22dc09,
+ 0x3c9ec7,
+ 0x3cc38a,
+ 0x253c43,
+ 0x368b8b,
+ 0x20c389,
+ 0x31f4c5,
+ 0x20cd87,
+ 0x16542,
+ 0x216543,
+ 0x226f07,
+ 0x2224c5,
+ 0x2d8e09,
+ 0x222bc3,
+ 0x34bc46,
+ 0x32a4c3,
+ 0xd2b03,
+ 0x11bc06,
+ 0x17a2c6,
+ 0x20dc7,
+ 0x229a46,
+ 0x231f45,
+ 0x20a307,
+ 0x319507,
+ 0x78f43b43,
+ 0x34e407,
+ 0x3b29c3,
+ 0x2712c5,
+ 0x2b1b84,
+ 0x2c2188,
+ 0x3db94c,
+ 0x2c1305,
+ 0x2b01c6,
+ 0x226dc7,
+ 0x35b907,
+ 0x2678c7,
+ 0x26c148,
+ 0x31ae8f,
+ 0x27b905,
+ 0x24a007,
+ 0x2151c7,
+ 0x28974a,
+ 0x37f609,
+ 0x330145,
+ 0x34da0a,
+ 0x101546,
+ 0xcc787,
+ 0x2d7e45,
+ 0x2f5744,
+ 0x340486,
+ 0xcb946,
+ 0x256ec7,
+ 0x25acc7,
+ 0x3b5b48,
+ 0x3d07c5,
+ 0x2223c6,
+ 0x2f048,
+ 0x228c85,
+ 0x28e46,
+ 0x240305,
+ 0x288284,
+ 0x21ef87,
+ 0x24b80a,
+ 0x2aab88,
+ 0x3e3cc6,
+ 0x33243,
+ 0x2efe85,
+ 0x3d8586,
+ 0x3cbb06,
+ 0x30f6c6,
+ 0x216443,
+ 0x3ad047,
+ 0x215145,
+ 0x2296c3,
+ 0x2ee08d,
+ 0x20d903,
+ 0x3b5c48,
+ 0x243444,
+ 0x281d05,
+ 0x2b2506,
+ 0x32e106,
+ 0x259287,
+ 0x268bc7,
+ 0x27c805,
+ 0x20cb83,
+ 0x3a20c7,
+ 0x24b489,
+ 0x36a249,
+ 0x382d0a,
+ 0x23d7c2,
+ 0x271284,
+ 0x3211c4,
+ 0x2fda07,
+ 0x2fe088,
+ 0x300709,
+ 0x3e8289,
+ 0x301107,
+ 0x10a949,
+ 0x2132c6,
+ 0x103e46,
+ 0x305504,
+ 0x3b4e4a,
+ 0x307e08,
+ 0x308f89,
+ 0x309246,
+ 0x2c7245,
+ 0x2aaa48,
+ 0x2dcb8a,
+ 0x27d683,
+ 0x202486,
+ 0x301207,
+ 0x2c8885,
+ 0x3c10c5,
+ 0x24da03,
+ 0x2d1984,
+ 0x22f685,
+ 0x291587,
+ 0x306145,
+ 0x2f2cc6,
+ 0x166105,
+ 0x2c79c3,
+ 0x2c79c9,
+ 0x281acc,
+ 0x2d06cc,
+ 0x3416c8,
+ 0x2a3e47,
+ 0x3101c8,
+ 0x110e47,
+ 0x3111ca,
+ 0x31188b,
+ 0x20c4c8,
+ 0x32e208,
+ 0x25d306,
+ 0x272145,
+ 0x33b5ca,
+ 0x2ecbc5,
+ 0x213402,
+ 0x2db6c7,
+ 0x27d046,
+ 0x377045,
+ 0x313149,
+ 0x27b485,
+ 0x1dea48,
+ 0x29d645,
+ 0x270e89,
+ 0x3d84c6,
+ 0x3407c8,
+ 0x31dd83,
+ 0x212c46,
+ 0x3b7086,
+ 0x31d845,
+ 0x31d849,
+ 0x2cee49,
+ 0x271ec7,
+ 0x120d84,
+ 0x320d87,
+ 0x3e8189,
+ 0x228405,
+ 0x418c8,
+ 0x379cc5,
+ 0x3a14c5,
+ 0x36bc09,
+ 0x202cc2,
+ 0x35a344,
+ 0x204542,
+ 0x202642,
+ 0x2ffc05,
+ 0x351748,
+ 0x2cc145,
+ 0x2da043,
+ 0x2da045,
+ 0x2e5d83,
+ 0x212202,
+ 0x333544,
+ 0x36a603,
+ 0x200a82,
+ 0x2c4d84,
+ 0x318f43,
+ 0x203482,
+ 0x269503,
+ 0x2307c4,
+ 0x3093c3,
+ 0x25be04,
+ 0x201ec2,
+ 0x21f5c3,
+ 0x214a83,
+ 0x202d82,
+ 0x352902,
+ 0x2cec89,
+ 0x204942,
+ 0x296884,
+ 0x21ef42,
+ 0x2603c4,
+ 0x213284,
+ 0x2d7284,
+ 0x204a42,
+ 0x247e02,
+ 0x35d143,
+ 0x2a2683,
+ 0x291704,
+ 0x2e1184,
+ 0x307fc4,
+ 0x31fe44,
+ 0x31d303,
+ 0x208f03,
+ 0x3014c4,
+ 0x322cc4,
+ 0x322e06,
+ 0x229782,
+ 0x16542,
+ 0x4ab43,
+ 0x216542,
+ 0x222bc3,
+ 0x343b43,
+ 0x2296c3,
+ 0x20cb83,
+ 0x14c45,
+ 0x2000c2,
+ 0x253c43,
+ 0x216543,
+ 0x222bc3,
+ 0x206203,
+ 0x343b43,
+ 0x2b1b84,
+ 0x2cef44,
+ 0x21b544,
+ 0x2296c3,
+ 0x20cb83,
+ 0x21f6c3,
+ 0x305b04,
+ 0x20bc43,
+ 0x21bcc3,
+ 0x37dc04,
+ 0x379ac6,
+ 0x2079c3,
+ 0x146c05,
+ 0xb46c7,
+ 0x203643,
+ 0x7aa176c8,
+ 0x209a43,
+ 0x2c45c3,
+ 0x24c243,
+ 0x233243,
+ 0x3c2545,
+ 0xcd43,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2296c3,
+ 0x20cb83,
+ 0x212343,
+ 0x203e43,
+ 0x793c8,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x243543,
+ 0x2296c3,
+ 0x28ea04,
+ 0x7ca83,
+ 0x20cb83,
+ 0x2cce44,
+ 0x146c05,
+ 0x2d3605,
+ 0xb46c7,
+ 0x216542,
+ 0x2104c2,
+ 0x200382,
+ 0x204cc2,
+ 0xd903,
+ 0x2003c2,
+ 0x12dc04,
+ 0x216543,
+ 0x23ec84,
+ 0x222bc3,
+ 0x343b43,
+ 0x216443,
+ 0x2296c3,
+ 0x20cb83,
+ 0x793c8,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x216443,
+ 0x21b544,
+ 0x2296c3,
+ 0xd903,
+ 0x20cb83,
+ 0x202b03,
+ 0x25dd04,
+ 0x793c8,
+ 0x216543,
+ 0x20d903,
+ 0x1a143,
+ 0x11a5c4,
+ 0x21d684,
+ 0x793c8,
+ 0x16542,
+ 0x216543,
+ 0x256d44,
+ 0x2b1b84,
+ 0x20d903,
+ 0x203c82,
+ 0x7ca83,
+ 0x20cb83,
+ 0x24c343,
+ 0xd1984,
+ 0x355b45,
+ 0x213402,
+ 0x323543,
+ 0x10e689,
+ 0xebd86,
+ 0x1c4688,
+ 0x2000c2,
+ 0x793c8,
+ 0x216542,
+ 0x222bc3,
+ 0x343b43,
+ 0x2005c2,
+ 0xd903,
+ 0x20cb83,
+ 0xfe02,
+ 0x82,
+ 0xc2,
+ 0x1cc547,
+ 0x14a709,
+ 0x3a43,
+ 0x793c8,
+ 0x17d0c3,
+ 0x7e3e71c7,
+ 0x16543,
+ 0x10508,
+ 0x22bc3,
+ 0x143b43,
+ 0x432c6,
+ 0x43543,
+ 0x15d8c8,
+ 0xd5c08,
+ 0x1c1ac3,
+ 0x83646,
+ 0x7e5a9d85,
+ 0x16443,
+ 0x98e48,
+ 0xdfc08,
+ 0x103d03,
+ 0x7e8ef3c6,
+ 0xf3585,
+ 0x1a1dc4,
+ 0x3c787,
+ 0x296c3,
+ 0x4f83,
+ 0xcb83,
+ 0x4642,
+ 0x15b0ca,
+ 0xc205,
+ 0x7303,
+ 0x7eed308c,
+ 0xffcc3,
+ 0x10ba84,
+ 0x11ac8b,
+ 0x11b248,
+ 0x15d184,
+ 0x9a402,
+ 0x4b343,
+ 0x145fdc7,
+ 0x157a147,
+ 0x14da108,
+ 0x144b343,
+ 0x1c4b88,
+ 0x1ad30b,
+ 0x14182,
+ 0x132747,
+ 0x114bc4,
+ 0x2000c2,
+ 0x216542,
+ 0x23ec84,
+ 0x343b43,
+ 0x216443,
+ 0x2296c3,
+ 0x20cb83,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x233243,
+ 0x2296c3,
+ 0x20cb83,
+ 0x204683,
+ 0x202b03,
+ 0x39fc3,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2296c3,
+ 0x20cb83,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2296c3,
+ 0x20cb83,
+ 0x602,
+ 0x1a143,
+ 0x143b43,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2b1b84,
+ 0x233243,
+ 0x2296c3,
+ 0x20cb83,
+ 0x22a042,
+ 0x2000c1,
+ 0x2000c2,
+ 0x200201,
+ 0x338b82,
+ 0x793c8,
+ 0x224545,
+ 0x200101,
+ 0x16543,
+ 0x3a304,
+ 0x201381,
+ 0x200501,
+ 0x201281,
+ 0x251242,
+ 0x251244,
+ 0x251943,
+ 0x200041,
+ 0x200801,
+ 0x200181,
+ 0x18ab06,
+ 0x200701,
+ 0x30d307,
+ 0x312d8f,
+ 0x399086,
+ 0x2004c1,
+ 0x31a606,
+ 0x200bc1,
+ 0x200581,
+ 0x3e61ce,
+ 0x2003c1,
+ 0x20cb83,
+ 0x200a81,
+ 0x3a8d85,
+ 0x204642,
+ 0x24d905,
+ 0x200401,
+ 0x200741,
+ 0x2007c1,
+ 0x213402,
+ 0x200081,
+ 0x201641,
+ 0x207281,
+ 0x2024c1,
+ 0x208481,
+ 0x5c549,
+ 0x793c8,
+ 0x216543,
+ 0x222bc3,
+ 0xac1c8,
+ 0x343b43,
+ 0x2296c3,
+ 0x20cb83,
+ 0x2203c3,
+ 0x2f43,
+ 0x216543,
+ 0x343b43,
+ 0x9a348,
+ 0x216443,
+ 0x2296c3,
+ 0x91c43,
+ 0x20cb83,
+ 0x82a99048,
+ 0x1e9343,
+ 0x12248,
+ 0xcd42,
+ 0x3c43,
+ 0x13242,
+ 0x4a42,
+ 0x146c05,
+ 0x793c8,
+ 0x9fb06,
+ 0x15edc7,
+ 0xd903,
+ 0x146c05,
+ 0x171684,
+ 0x1cdf88,
+ 0x4f344,
+ 0x106a47,
+ 0x60244,
+ 0xb1c0c,
+ 0x1db944,
+ 0xdaf45,
+ 0x5c549,
+ 0x16e507,
+ 0x28846,
+ 0x191ca,
+ 0x14f990a,
+ 0x793c8,
+ 0x7ca83,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2296c3,
+ 0x20cb83,
+ 0x203b43,
+ 0x793c8,
+ 0x216543,
+ 0x222bc3,
+ 0x2e8fc4,
+ 0x20cb83,
+ 0x2655c5,
+ 0x2484c4,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x201582,
+ 0x2296c3,
+ 0x20cb83,
+ 0x2b03,
+ 0xedac6,
+ 0x12f6c4,
+ 0x124c46,
+ 0x253c43,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2296c3,
+ 0x20cb83,
+ 0x216542,
+ 0x216543,
+ 0x23a889,
+ 0x222bc3,
+ 0x2b79c9,
+ 0x343b43,
+ 0x216443,
+ 0x2296c3,
+ 0x84e04,
+ 0xd903,
+ 0x20cb83,
+ 0x305308,
+ 0x3e2687,
+ 0x355b45,
+ 0xd3a48,
+ 0x1db108,
+ 0x1cc547,
+ 0xfe30a,
+ 0x1c790b,
+ 0x11a847,
+ 0x48f08,
+ 0xf4a0a,
+ 0x26888,
+ 0x14a709,
+ 0x2f547,
+ 0x1ed87,
+ 0x10efc8,
+ 0x10508,
+ 0x4a2cf,
+ 0xaad45,
+ 0x1fc47,
+ 0x432c6,
+ 0x14cd47,
+ 0x130286,
+ 0x15d8c8,
+ 0xa3706,
+ 0x1405c7,
+ 0x1798c9,
+ 0x1df3c7,
+ 0xc6d09,
+ 0xcd749,
+ 0xd3386,
+ 0xd5c08,
+ 0xd3d05,
+ 0x86f4a,
+ 0xdfc08,
+ 0x103d03,
+ 0xe6008,
+ 0x3c787,
+ 0x133485,
+ 0x649d0,
+ 0x4f83,
+ 0x7ca83,
+ 0x179747,
+ 0x2d445,
+ 0xffa48,
+ 0x74505,
+ 0xffcc3,
+ 0x1a3108,
+ 0x1a1386,
+ 0x9ec09,
+ 0xba247,
+ 0x10e94b,
+ 0x77a04,
+ 0x113b84,
+ 0x11ac8b,
+ 0x11b248,
+ 0x11bb07,
+ 0x146c05,
+ 0x216543,
+ 0x222bc3,
+ 0x2f5503,
+ 0x20cb83,
+ 0x248783,
+ 0x343b43,
+ 0x7ca83,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x216443,
+ 0x2296c3,
+ 0x20cb83,
+ 0x9c1cb,
+ 0x2000c2,
+ 0x216542,
+ 0x20cb83,
+ 0xd42,
+ 0x1582,
+ 0x1642,
+ 0x793c8,
+ 0x1b7409,
+ 0x1c4b88,
+ 0x16542,
+ 0x2000c2,
+ 0x216542,
+ 0x200382,
+ 0x2005c2,
+ 0x202042,
+ 0x2296c3,
+ 0x148ec6,
+ 0x2003c2,
+ 0xd1984,
+ 0x2000c2,
+ 0x253c43,
+ 0x216542,
+ 0x216543,
+ 0x222bc3,
+ 0x200382,
+ 0x343b43,
+ 0x243543,
+ 0x216443,
+ 0x21b544,
+ 0x2296c3,
+ 0x20b243,
+ 0xd903,
+ 0x20cb83,
+ 0x30ba84,
+ 0x201643,
+ 0x343b43,
+ 0x216542,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x216443,
+ 0x2296c3,
+ 0x20d903,
+ 0x20cb83,
+ 0x3c5747,
+ 0x216543,
+ 0x2868c7,
+ 0x3823c6,
+ 0x209843,
+ 0x21a003,
+ 0x343b43,
+ 0x20e443,
+ 0x2b1b84,
+ 0x243544,
+ 0x3d66c6,
+ 0x202803,
+ 0x2296c3,
+ 0x127f0b,
+ 0x20cb83,
+ 0x2655c5,
+ 0x2f7184,
+ 0x3b6703,
+ 0x343483,
+ 0x2db6c7,
+ 0x2f6985,
+ 0x1a1003,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x216443,
+ 0x2296c3,
+ 0x1c1184,
+ 0x20cb83,
+ 0x1fa83,
+ 0x89f0b24c,
+ 0x58083,
+ 0x4bc47,
+ 0x80dc6,
+ 0x120047,
+ 0x133d85,
+ 0x205242,
+ 0x246dc3,
+ 0x211d43,
+ 0x253c43,
+ 0x8aa16543,
+ 0x2080c2,
+ 0x222bc3,
+ 0x204f03,
+ 0x343b43,
+ 0x2b1b84,
+ 0x34b203,
+ 0x27b903,
+ 0x216443,
+ 0x21b544,
+ 0x8ae06c02,
+ 0x2296c3,
+ 0x20cb83,
+ 0x20e603,
+ 0x209203,
+ 0x2883c3,
+ 0x22a042,
+ 0x201643,
+ 0x793c8,
+ 0x343b43,
+ 0x1a143,
+ 0x258bc4,
+ 0x253c43,
+ 0x216542,
+ 0x216543,
+ 0x23ec84,
+ 0x222bc3,
+ 0x343b43,
+ 0x2b1b84,
+ 0x243543,
+ 0x239104,
+ 0x28d4c4,
+ 0x2e8306,
+ 0x21b544,
+ 0x2296c3,
+ 0x20cb83,
+ 0x21f6c3,
+ 0x27d046,
+ 0x4290b,
+ 0x32f46,
+ 0xb6c0a,
+ 0x11faca,
+ 0x793c8,
+ 0x22f004,
+ 0x8c216543,
+ 0x32c744,
+ 0x222bc3,
+ 0x219a44,
+ 0x343b43,
+ 0x284103,
+ 0x216443,
+ 0x2296c3,
+ 0x7ca83,
+ 0x20cb83,
+ 0x31c03,
+ 0x348b0b,
+ 0x3d368a,
+ 0x3e8e4c,
+ 0xefc08,
+ 0x2000c2,
+ 0x216542,
+ 0x200382,
+ 0x2b96c5,
+ 0x2b1b84,
+ 0x201582,
+ 0x216443,
+ 0x28d4c4,
+ 0x204cc2,
+ 0x2003c2,
+ 0x202b02,
+ 0x22a042,
+ 0x53c43,
+ 0x4042,
+ 0x2d5fc9,
+ 0x278a08,
+ 0x3d8a09,
+ 0x39d3c9,
+ 0x2116ca,
+ 0x21424a,
+ 0x208d02,
+ 0x22e702,
+ 0x16542,
+ 0x216543,
+ 0x213b02,
+ 0x24a1c6,
+ 0x378742,
+ 0x47402,
+ 0x201442,
+ 0x3c7c8e,
+ 0x21f60e,
+ 0x3d1b47,
+ 0x219cc2,
+ 0x222bc3,
+ 0x343b43,
+ 0x20bac2,
+ 0x2005c2,
+ 0x6a7c3,
+ 0x23ee8f,
+ 0x21ee02,
+ 0x2eae47,
+ 0x2e2587,
+ 0x2e61c7,
+ 0x2f0e4c,
+ 0x2f2e0c,
+ 0x258884,
+ 0x28c28a,
+ 0x21f542,
+ 0x207bc2,
+ 0x2cf304,
+ 0x200702,
+ 0x2d8882,
+ 0x2f3044,
+ 0x21ab82,
+ 0x209d42,
+ 0x1b283,
+ 0x2a3787,
+ 0x288345,
+ 0x2205c2,
+ 0x319f04,
+ 0x30f082,
+ 0x2ef548,
+ 0x2296c3,
+ 0x3773c8,
+ 0x204d82,
+ 0x258a45,
+ 0x39b086,
+ 0x20cb83,
+ 0x2059c2,
+ 0x300947,
+ 0x4642,
+ 0x2504c5,
+ 0x203505,
+ 0x201782,
+ 0x207f02,
+ 0x3cfd8a,
+ 0x27c68a,
+ 0x279c42,
+ 0x2a94c4,
+ 0x200f02,
+ 0x271148,
+ 0x20e002,
+ 0x2b4bc8,
+ 0x17c1,
+ 0x316887,
+ 0x3174c9,
+ 0x203582,
+ 0x31c385,
+ 0x372b05,
+ 0x3d088b,
+ 0x3d6c4c,
+ 0x237288,
+ 0x332588,
+ 0x229782,
+ 0x259342,
+ 0x2000c2,
+ 0x793c8,
+ 0x216542,
+ 0x216543,
+ 0x200382,
+ 0x204cc2,
+ 0xd903,
+ 0x2003c2,
+ 0x20cb83,
+ 0x202b02,
+ 0x2000c2,
+ 0x146c05,
+ 0x8d616542,
+ 0x10b384,
+ 0x405c5,
+ 0x8e743b43,
+ 0x21b283,
+ 0x201582,
+ 0x2296c3,
+ 0x3e8603,
+ 0x8ea0cb83,
+ 0x2faf43,
+ 0x2dc2c6,
+ 0xf57c5,
+ 0x1602b03,
+ 0x146c05,
+ 0x148d8b,
+ 0x793c8,
+ 0x8dbb6d08,
+ 0x6be87,
+ 0x8deca7ca,
+ 0x791c7,
+ 0x10f7c5,
+ 0x8e200f89,
+ 0x2f20d,
+ 0x430c2,
+ 0x11b842,
+ 0xe01,
+ 0xe91c4,
+ 0xb530a,
+ 0x7c4c7,
+ 0x30044,
+ 0x30083,
+ 0x30084,
+ 0x8f201f02,
+ 0x8f600ac2,
+ 0x8fa03b42,
+ 0x8fe030c2,
+ 0x90208742,
+ 0x90604182,
+ 0xb46c7,
+ 0x90a16542,
+ 0x90e19d82,
+ 0x9121d802,
+ 0x91603242,
+ 0x21f603,
+ 0x2a2c4,
+ 0x91aac1c8,
+ 0x213643,
+ 0x91e18902,
+ 0x68508,
+ 0x92204982,
+ 0x63187,
+ 0x1b88c7,
+ 0x92600042,
+ 0x92a00d82,
+ 0x92e00182,
+ 0x932042c2,
+ 0x93605502,
+ 0x93a005c2,
+ 0x11f405,
+ 0x20af03,
+ 0x2f44c4,
+ 0x93e00702,
+ 0x94211b82,
+ 0x94605542,
+ 0x92b8b,
+ 0x94a00c42,
+ 0x95256e02,
+ 0x95601582,
+ 0x95a02042,
+ 0x98e48,
+ 0x95e28882,
+ 0x96200bc2,
+ 0x96603742,
+ 0x96a77782,
+ 0x96e06c02,
+ 0x97205782,
+ 0x97604cc2,
+ 0x97a18f02,
+ 0x97e0d502,
+ 0x9820f502,
+ 0xac8c4,
+ 0x332ec3,
+ 0x9863d1c2,
+ 0x98a0bbc2,
+ 0x98e0cfc2,
+ 0x992006c2,
+ 0x996003c2,
+ 0x99a00a82,
+ 0xfa6c8,
+ 0x9c347,
+ 0x99e037c2,
+ 0x9a202a82,
+ 0x9a602b02,
+ 0x9aa0a0c2,
+ 0x176a8c,
+ 0x9ae2bdc2,
+ 0x9b22ce82,
+ 0x9b602e02,
+ 0x9ba05002,
+ 0x9be08e42,
+ 0x9c211842,
+ 0x9c6089c2,
+ 0x9ca13342,
+ 0x9ce81202,
+ 0x9d281742,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x207c3,
+ 0xd2443,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x94f4b203,
+ 0x2207c3,
+ 0x3c25c4,
+ 0x3d8906,
+ 0x309a43,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x35c349,
+ 0x204042,
+ 0x271c43,
+ 0x2cda43,
+ 0x3b6945,
+ 0x204f03,
+ 0x34b203,
+ 0x2207c3,
+ 0x2e69c3,
+ 0x22e683,
+ 0x3ca009,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x204042,
+ 0x204042,
+ 0x34b203,
+ 0x2207c3,
+ 0x9da16543,
+ 0x222bc3,
+ 0x39d603,
+ 0x216443,
+ 0x2296c3,
+ 0xd903,
+ 0x20cb83,
+ 0x793c8,
+ 0x216542,
+ 0x216543,
+ 0x2296c3,
+ 0x20cb83,
+ 0x145842,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x9e51d0c2,
+ 0x216443,
+ 0x2296c3,
+ 0xd903,
+ 0x20cb83,
+ 0x1381,
+ 0x21d684,
+ 0x216542,
+ 0x216543,
+ 0x200983,
+ 0x222bc3,
+ 0x256d44,
+ 0x2f5503,
+ 0x343b43,
+ 0x2b1b84,
+ 0x243543,
+ 0x216443,
+ 0x2296c3,
+ 0x20cb83,
+ 0x24c343,
+ 0x355b45,
+ 0x22e683,
+ 0x201643,
+ 0x882,
+ 0xd903,
+ 0x216542,
+ 0x216543,
+ 0x34b203,
+ 0x2296c3,
+ 0x20cb83,
+ 0x2000c2,
+ 0x253c43,
+ 0x793c8,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x239c86,
+ 0x2b1b84,
+ 0x243543,
+ 0x21b544,
+ 0x2296c3,
+ 0x20cb83,
+ 0x21f6c3,
+ 0xe804,
+ 0x2e702,
+ 0x216543,
+ 0x20a83,
+ 0x222bc3,
+ 0x1582,
+ 0x2296c3,
+ 0x20cb83,
+ 0x10e104,
+ 0x6ff44,
+ 0x2a02,
+ 0x148bb07,
+ 0x125887,
+ 0x216543,
+ 0x32f46,
+ 0x222bc3,
+ 0x343b43,
+ 0xf1386,
+ 0x2296c3,
+ 0x20cb83,
+ 0x32f188,
+ 0x3323c9,
+ 0x341cc9,
+ 0x34b688,
+ 0x39d208,
+ 0x39d209,
+ 0x325d0a,
+ 0x36084a,
+ 0x3979ca,
+ 0x39ecca,
+ 0x3d368a,
+ 0x3dfecb,
+ 0x2fc28d,
+ 0x2fcf4f,
+ 0x247450,
+ 0x3621cd,
+ 0x3813cc,
+ 0x39ea0b,
+ 0x16108,
+ 0x13ec08,
+ 0x18a0c5,
+ 0x190209,
+ 0x1495c87,
+ 0xde645,
+ 0x2000c2,
+ 0x2f67c5,
+ 0x209d03,
+ 0xa1e16542,
+ 0x222bc3,
+ 0x343b43,
+ 0x380b87,
+ 0x24c243,
+ 0x216443,
+ 0x2296c3,
+ 0x257743,
+ 0x20b243,
+ 0x20f1c3,
+ 0x20d903,
+ 0x20cb83,
+ 0x259186,
+ 0x213402,
+ 0x201643,
+ 0x793c8,
+ 0x2000c2,
+ 0x253c43,
+ 0x216542,
+ 0x216543,
+ 0x222bc3,
+ 0x343b43,
+ 0x2b1b84,
+ 0x216443,
+ 0x2296c3,
+ 0x20cb83,
+ 0x202b03,
+ 0x125887,
+ 0x14182,
+ 0x10e684,
+ 0x1534746,
+ 0x2000c2,
+ 0x216542,
+ 0x343b43,
+ 0x216443,
+ 0x20cb83,
+}
+
+// children is the list of nodes' children, the parent's wildcard bit and the
+// parent's node type. If a node has no children then their children index
+// will be in the range [0, 6), depending on the wildcard bit and node type.
+//
+// The layout within the uint32, from MSB to LSB, is:
+// [ 1 bits] unused
+// [ 1 bits] wildcard bit
+// [ 2 bits] node type
+// [14 bits] high nodes index (exclusive) of children
+// [14 bits] low nodes index (inclusive) of children
+var children = [...]uint32{
+ 0x0,
+ 0x10000000,
+ 0x20000000,
+ 0x40000000,
+ 0x50000000,
+ 0x60000000,
+ 0x17bc5e9,
+ 0x17c05ef,
+ 0x17c45f0,
+ 0x17e85f1,
+ 0x19405fa,
+ 0x1958650,
+ 0x196c656,
+ 0x198465b,
+ 0x19a4661,
+ 0x19c8669,
+ 0x19e0672,
+ 0x1a08678,
+ 0x1a0c682,
+ 0x1a34683,
+ 0x1a3868d,
+ 0x1a5068e,
+ 0x1a54694,
+ 0x1a58695,
+ 0x1a98696,
+ 0x1a9c6a6,
+ 0x1aa06a7,
+ 0x21aa46a8,
+ 0x61aac6a9,
+ 0x21ab46ab,
+ 0x1afc6ad,
+ 0x1b046bf,
+ 0x21b086c1,
+ 0x1b2c6c2,
+ 0x1b306cb,
+ 0x1b446cc,
+ 0x1b486d1,
+ 0x1b686d2,
+ 0x1b986da,
+ 0x1bb46e6,
+ 0x1bbc6ed,
+ 0x1be46ef,
+ 0x1bf86f9,
+ 0x21bfc6fe,
+ 0x1c006ff,
+ 0x1c98700,
+ 0x1cac726,
+ 0x1cc072b,
+ 0x1cfc730,
+ 0x1d0c73f,
+ 0x1d20743,
+ 0x1d38748,
+ 0x1ddc74e,
+ 0x2010777,
+ 0x2018804,
+ 0x2201c806,
+ 0x22020807,
+ 0x208c808,
+ 0x20f8823,
+ 0x211083e,
+ 0x2124844,
+ 0x2128849,
+ 0x213084a,
+ 0x214884c,
+ 0x214c852,
+ 0x2170853,
+ 0x21c085c,
+ 0x21c4870,
+ 0x221c8871,
+ 0x21e8872,
+ 0x21ec87a,
+ 0x21f087b,
+ 0x221c87c,
+ 0x62220887,
+ 0x22228888,
+ 0x2222c88a,
+ 0x227088b,
+ 0x227489c,
+ 0x6227889d,
+ 0x229489e,
+ 0x22e88a5,
+ 0x222ec8ba,
+ 0x222f08bb,
+ 0x222f88bc,
+ 0x222fc8be,
+ 0x223008bf,
+ 0x223048c0,
+ 0x230c8c1,
+ 0x23108c3,
+ 0x2231c8c4,
+ 0x223248c7,
+ 0x23348c9,
+ 0x23448cd,
+ 0x23f88d1,
+ 0x23fc8fe,
+ 0x2240c8ff,
+ 0x22410903,
+ 0x22418904,
+ 0x2470906,
+ 0x247491c,
+ 0x247891d,
+ 0x29ec91e,
+ 0x29f0a7b,
+ 0x22a98a7c,
+ 0x22a9caa6,
+ 0x22aa0aa7,
+ 0x22aacaa8,
+ 0x22ab0aab,
+ 0x22abcaac,
+ 0x22ac0aaf,
+ 0x22ac4ab0,
+ 0x22ac8ab1,
+ 0x22accab2,
+ 0x22ad0ab3,
+ 0x22adcab4,
+ 0x22ae0ab7,
+ 0x22aecab8,
+ 0x22af0abb,
+ 0x22af4abc,
+ 0x22af8abd,
+ 0x22b04abe,
+ 0x22b08ac1,
+ 0x22b14ac2,
+ 0x22b18ac5,
+ 0x22b1cac6,
+ 0x22b20ac7,
+ 0x2b24ac8,
+ 0x22b28ac9,
+ 0x22b34aca,
+ 0x22b38acd,
+ 0x2b3cace,
+ 0x2b44acf,
+ 0x22b50ad1,
+ 0x62b5cad4,
+ 0x2ba0ad7,
+ 0x2ba4ae8,
+ 0x22bc4ae9,
+ 0x22bc8af1,
+ 0x22bccaf2,
+ 0x22bd4af3,
+ 0x22bdcaf5,
+ 0x22be0af7,
+ 0x22be4af8,
+ 0x22becaf9,
+ 0x22bf0afb,
+ 0x22bf4afc,
+ 0x2bf8afd,
+ 0x22c18afe,
+ 0x22c1cb06,
+ 0x22c20b07,
+ 0x22c24b08,
+ 0x22c28b09,
+ 0x22c34b0a,
+ 0x22c38b0d,
+ 0x2c3cb0e,
+ 0x2c44b0f,
+ 0x2c4cb11,
+ 0x2c50b13,
+ 0x2c6cb14,
+ 0x2c84b1b,
+ 0x2c88b21,
+ 0x2c98b22,
+ 0x2ca4b26,
+ 0x2cd8b29,
+ 0x2ce0b36,
+ 0x22ce4b38,
+ 0x2cfcb39,
+ 0x22d04b3f,
+ 0x22d08b41,
+ 0x22d10b42,
+ 0x2e0cb44,
+ 0x22e10b83,
+ 0x2e18b84,
+ 0x2e1cb86,
+ 0x22e20b87,
+ 0x2e24b88,
+ 0x2e54b89,
+ 0x2e58b95,
+ 0x2e5cb96,
+ 0x2e74b97,
+ 0x2e88b9d,
+ 0x2eb0ba2,
+ 0x2ed8bac,
+ 0x2edcbb6,
+ 0x62ee0bb7,
+ 0x2f14bb8,
+ 0x2f18bc5,
+ 0x22f1cbc6,
+ 0x2f20bc7,
+ 0x2f48bc8,
+ 0x2f4cbd2,
+ 0x2f70bd3,
+ 0x2f74bdc,
+ 0x2f88bdd,
+ 0x2f8cbe2,
+ 0x2f90be3,
+ 0x2fb0be4,
+ 0x2fd4bec,
+ 0x22fd8bf5,
+ 0x22fdcbf6,
+ 0x2fe0bf7,
+ 0x22fe4bf8,
+ 0x2fe8bf9,
+ 0x2fecbfa,
+ 0x2ff0bfb,
+ 0x2ff4bfc,
+ 0x3010bfd,
+ 0x23014c04,
+ 0x2301cc05,
+ 0x3020c07,
+ 0x3048c08,
+ 0x305cc12,
+ 0x30d0c17,
+ 0x30dcc34,
+ 0x30e0c37,
+ 0x3100c38,
+ 0x3118c40,
+ 0x311cc46,
+ 0x3130c47,
+ 0x3148c4c,
+ 0x3168c52,
+ 0x3180c5a,
+ 0x3188c60,
+ 0x31a4c62,
+ 0x31c0c69,
+ 0x31c4c70,
+ 0x31f0c71,
+ 0x3210c7c,
+ 0x3230c84,
+ 0x3298c8c,
+ 0x32b8ca6,
+ 0x32d8cae,
+ 0x32dccb6,
+ 0x32f4cb7,
+ 0x3338cbd,
+ 0x33b8cce,
+ 0x33f4cee,
+ 0x33f8cfd,
+ 0x3404cfe,
+ 0x3424d01,
+ 0x3428d09,
+ 0x344cd0a,
+ 0x3454d13,
+ 0x3494d15,
+ 0x34e8d25,
+ 0x34ecd3a,
+ 0x34f0d3b,
+ 0x35e4d3c,
+ 0x235ecd79,
+ 0x235f0d7b,
+ 0x235f4d7c,
+ 0x35f8d7d,
+ 0x235fcd7e,
+ 0x23600d7f,
+ 0x23604d80,
+ 0x3608d81,
+ 0x2360cd82,
+ 0x2361cd83,
+ 0x23620d87,
+ 0x23624d88,
+ 0x23628d89,
+ 0x2362cd8a,
+ 0x23638d8b,
+ 0x2363cd8e,
+ 0x3654d8f,
+ 0x3678d95,
+ 0x3698d9e,
+ 0x3d0cda6,
+ 0x23d10f43,
+ 0x23d14f44,
+ 0x23d18f45,
+ 0x23d1cf46,
+ 0x3d2cf47,
+ 0x3d4cf4b,
+ 0x3f0cf53,
+ 0x3fdcfc3,
+ 0x404cff7,
+ 0x40a5013,
+ 0x418d029,
+ 0x41e5063,
+ 0x4221079,
+ 0x431d088,
+ 0x43e90c7,
+ 0x44810fa,
+ 0x4511120,
+ 0x4575144,
+ 0x47ad15d,
+ 0x48651eb,
+ 0x4931219,
+ 0x497d24c,
+ 0x4a0525f,
+ 0x4a41281,
+ 0x4a91290,
+ 0x4b092a4,
+ 0x64b0d2c2,
+ 0x64b112c3,
+ 0x64b152c4,
+ 0x4b912c5,
+ 0x4bed2e4,
+ 0x4c692fb,
+ 0x4ce131a,
+ 0x4d61338,
+ 0x4dcd358,
+ 0x4ef9373,
+ 0x4f513be,
+ 0x64f553d4,
+ 0x4fed3d5,
+ 0x4ff53fb,
+ 0x24ff93fd,
+ 0x50813fe,
+ 0x50cd420,
+ 0x5135433,
+ 0x51dd44d,
+ 0x52a5477,
+ 0x530d4a9,
+ 0x54214c3,
+ 0x65425508,
+ 0x65429509,
+ 0x548550a,
+ 0x54e1521,
+ 0x5571538,
+ 0x55ed55c,
+ 0x563157b,
+ 0x571558c,
+ 0x57495c5,
+ 0x57a95d2,
+ 0x581d5ea,
+ 0x58a5607,
+ 0x58e5629,
+ 0x5955639,
+ 0x65959655,
+ 0x5981656,
+ 0x5985660,
+ 0x59b5661,
+ 0x59d166d,
+ 0x5a15674,
+ 0x5a25685,
+ 0x5a3d689,
+ 0x5ab568f,
+ 0x5abd6ad,
+ 0x5ad96af,
+ 0x5aed6b6,
+ 0x5b116bb,
+ 0x25b156c4,
+ 0x5b416c5,
+ 0x5b456d0,
+ 0x5b4d6d1,
+ 0x5b616d3,
+ 0x5b816d8,
+ 0x5b916e0,
+ 0x5b9d6e4,
+ 0x5bd96e7,
+ 0x5bdd6f6,
+ 0x5be56f7,
+ 0x5bf96f9,
+ 0x5c216fe,
+ 0x5c2d708,
+ 0x5c3570b,
+ 0x5c5d70d,
+ 0x5c81717,
+ 0x5c99720,
+ 0x5c9d726,
+ 0x5ca5727,
+ 0x5cad729,
+ 0x5cc172b,
+ 0x5d71730,
+ 0x5d7575c,
+ 0x5d7d75d,
+ 0x5d8175f,
+ 0x5da5760,
+ 0x5dc9769,
+ 0x5de5772,
+ 0x5df9779,
+ 0x5e0d77e,
+ 0x5e15783,
+ 0x5e1d785,
+ 0x5e25787,
+ 0x5e3d789,
+ 0x5e4d78f,
+ 0x5e51793,
+ 0x5e6d794,
+ 0x66f579b,
+ 0x672d9bd,
+ 0x67599cb,
+ 0x67759d6,
+ 0x67799dd,
+ 0x2677d9de,
+ 0x679d9df,
+ 0x67bd9e7,
+ 0x68019ef,
+ 0x6809a00,
+ 0x2680da02,
+ 0x26811a03,
+ 0x6819a04,
+ 0x6a35a06,
+ 0x6a49a8d,
+ 0x26a4da92,
+ 0x6a51a93,
+ 0x6a59a94,
+ 0x26a5da96,
+ 0x26a61a97,
+ 0x26a6da98,
+ 0x26a7da9b,
+ 0x26a85a9f,
+ 0x26a91aa1,
+ 0x6a95aa4,
+ 0x26a99aa5,
+ 0x26ab1aa6,
+ 0x26ab9aac,
+ 0x26abdaae,
+ 0x26ac5aaf,
+ 0x26ac9ab1,
+ 0x26acdab2,
+ 0x26ad5ab3,
+ 0x6addab5,
+ 0x6af1ab7,
+ 0x6b19abc,
+ 0x6b55ac6,
+ 0x6b59ad5,
+ 0x6b91ad6,
+ 0x6bb5ae4,
+ 0x770daed,
+ 0x7711dc3,
+ 0x7715dc4,
+ 0x27719dc5,
+ 0x771ddc6,
+ 0x27721dc7,
+ 0x7725dc8,
+ 0x27731dc9,
+ 0x7735dcc,
+ 0x7739dcd,
+ 0x2773ddce,
+ 0x7741dcf,
+ 0x27749dd0,
+ 0x774ddd2,
+ 0x7751dd3,
+ 0x27761dd4,
+ 0x7765dd8,
+ 0x7769dd9,
+ 0x776ddda,
+ 0x7771ddb,
+ 0x27775ddc,
+ 0x7779ddd,
+ 0x777ddde,
+ 0x7781ddf,
+ 0x7785de0,
+ 0x2778dde1,
+ 0x7791de3,
+ 0x7795de4,
+ 0x7799de5,
+ 0x2779dde6,
+ 0x77a1de7,
+ 0x277a9de8,
+ 0x277addea,
+ 0x77c9deb,
+ 0x77e1df2,
+ 0x7825df8,
+ 0x7829e09,
+ 0x784de0a,
+ 0x7861e13,
+ 0x7865e18,
+ 0x7869e19,
+ 0x7a2de1a,
+ 0x27a31e8b,
+ 0x27a39e8c,
+ 0x27a3de8e,
+ 0x27a41e8f,
+ 0x7a49e90,
+ 0x7b25e92,
+ 0x27b31ec9,
+ 0x27b35ecc,
+ 0x27b39ecd,
+ 0x27b3dece,
+ 0x7b41ecf,
+ 0x7b6ded0,
+ 0x7b79edb,
+ 0x7b7dede,
+ 0x7ba1edf,
+ 0x7badee8,
+ 0x7bcdeeb,
+ 0x7bd1ef3,
+ 0x7c09ef4,
+ 0x7ebdf02,
+ 0x7f79faf,
+ 0x7f7dfde,
+ 0x7f81fdf,
+ 0x7f95fe0,
+ 0x7f99fe5,
+ 0x7fcdfe6,
+ 0x8005ff3,
+ 0x2800a001,
+ 0x8026002,
+ 0x804e009,
+ 0x8052013,
+ 0x8076014,
+ 0x809201d,
+ 0x80ba024,
+ 0x80ca02e,
+ 0x80ce032,
+ 0x80d2033,
+ 0x810e034,
+ 0x811a043,
+ 0x8142046,
+ 0x81de050,
+ 0x281e2077,
+ 0x81e6078,
+ 0x81f6079,
+ 0x281fa07d,
+ 0x820a07e,
+ 0x8226082,
+ 0x8246089,
+ 0x824a091,
+ 0x825e092,
+ 0x8272097,
+ 0x827609c,
+ 0x827a09d,
+ 0x827e09e,
+ 0x829e09f,
+ 0x834a0a7,
+ 0x834e0d2,
+ 0x836e0d3,
+ 0x839a0db,
+ 0x283aa0e6,
+ 0x83ae0ea,
+ 0x83be0eb,
+ 0x83f60ef,
+ 0x83fe0fd,
+ 0x84120ff,
+ 0x8432104,
+ 0x844e10c,
+ 0x845a113,
+ 0x8472116,
+ 0x84aa11c,
+ 0x84ae12a,
+ 0x858212b,
+ 0x8586160,
+ 0x859a161,
+ 0x85a2166,
+ 0x85ba168,
+ 0x85be16e,
+ 0x85ca16f,
+ 0x85d6172,
+ 0x85da175,
+ 0x85e2176,
+ 0x85e6178,
+ 0x860a179,
+ 0x864a182,
+ 0x864e192,
+ 0x866e193,
+ 0x86c219b,
+ 0x86f21b0,
+ 0x286f61bc,
+ 0x86fe1bd,
+ 0x87561bf,
+ 0x875a1d5,
+ 0x875e1d6,
+ 0x87621d7,
+ 0x87a61d8,
+ 0x87b61e9,
+ 0x87f61ed,
+ 0x87fa1fd,
+ 0x882a1fe,
+ 0x897620a,
+ 0x899e25d,
+ 0x89da267,
+ 0x8a02276,
+ 0x28a0a280,
+ 0x28a0e282,
+ 0x28a12283,
+ 0x8a1a284,
+ 0x8a26286,
+ 0x8b4a289,
+ 0x8b562d2,
+ 0x8b622d5,
+ 0x8b6e2d8,
+ 0x8b7a2db,
+ 0x8b862de,
+ 0x8b922e1,
+ 0x8b9e2e4,
+ 0x8baa2e7,
+ 0x8bb62ea,
+ 0x8bc22ed,
+ 0x28bc62f0,
+ 0x8bd22f1,
+ 0x8bde2f4,
+ 0x8bea2f7,
+ 0x8bf22fa,
+ 0x8bfe2fc,
+ 0x8c0a2ff,
+ 0x8c16302,
+ 0x8c22305,
+ 0x8c2e308,
+ 0x8c3a30b,
+ 0x8c4630e,
+ 0x8c52311,
+ 0x8c5e314,
+ 0x8c6a317,
+ 0x8c7631a,
+ 0x8ca231d,
+ 0x8cae328,
+ 0x8cba32b,
+ 0x8cc632e,
+ 0x8cd2331,
+ 0x8cde334,
+ 0x8ce6337,
+ 0x8cf2339,
+ 0x8cfe33c,
+ 0x8d0a33f,
+ 0x8d16342,
+ 0x8d22345,
+ 0x8d2e348,
+ 0x8d3a34b,
+ 0x8d4634e,
+ 0x8d52351,
+ 0x8d5e354,
+ 0x8d6a357,
+ 0x8d7235a,
+ 0x8d7e35c,
+ 0x8d8635f,
+ 0x8d92361,
+ 0x8d9e364,
+ 0x8daa367,
+ 0x8db636a,
+ 0x8dc236d,
+ 0x8dce370,
+ 0x8dda373,
+ 0x8de6376,
+ 0x8dea379,
+ 0x8df637a,
+ 0x8e1237d,
+ 0x8e16384,
+ 0x8e26385,
+ 0x8e4a389,
+ 0x8e4e392,
+ 0x8e92393,
+ 0x8e9a3a4,
+ 0x8eae3a6,
+ 0x8ee23ab,
+ 0x8f023b8,
+ 0x8f063c0,
+ 0x8f0e3c1,
+ 0x8f323c3,
+ 0x8f4a3cc,
+ 0x8f623d2,
+ 0x8f7a3d8,
+ 0x8f923de,
+ 0x28fda3e4,
+ 0x8fde3f6,
+ 0x900a3f7,
+ 0x901a402,
+ 0x902e406,
+}
+
+// max children 650 (capacity 1023)
+// max text offset 31341 (capacity 32767)
+// max text length 36 (capacity 63)
+// max hi 9227 (capacity 16383)
+// max lo 9222 (capacity 16383)
diff --git a/vendor/modules.txt b/vendor/modules.txt
new file mode 100644
index 0000000..d8d1034
--- /dev/null
+++ b/vendor/modules.txt
@@ -0,0 +1,5 @@
+# golang.org/x/net v0.0.0-20210119194325-5f4716e94777
+## explicit
+golang.org/x/net/html
+golang.org/x/net/html/atom
+golang.org/x/net/publicsuffix